From 8092ffeb20e1dee156eb63de4a84e14c236883f2 Mon Sep 17 00:00:00 2001 From: hupei Date: Fri, 7 Jul 2017 17:31:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E7=94=B1=E8=AE=BE=E7=BD=AE=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +- preview/qrcode.png | Bin 0 -> 16297 bytes preview/sample-debug.apk | Bin 2011369 -> 440249 bytes .../scanner/sample/BasicScannerActivity.java | 14 +- .../zxing/scanner/sample/MainActivity.java | 4 +- .../zxing/scanner/sample/ScannerActivity.java | 19 +- .../sample/result/AddressBookActivity.java | 4 +- .../sample/result/BarcodeActivity.java | 4 +- .../scanner/sample/result/TextActivity.java | 4 +- .../scanner/sample/result/UriActivity.java | 4 +- settings.gradle | 2 +- zxing/.gitignore | 1 - zxing/build.gradle | 39 - zxing/src/main/AndroidManifest.xml | 5 - .../java/com/google/zxing/BarcodeFormat.java | 77 -- .../main/java/com/google/zxing/Binarizer.java | 87 -- .../java/com/google/zxing/BinaryBitmap.java | 150 ---- .../com/google/zxing/ChecksumException.java | 47 -- .../java/com/google/zxing/DecodeHintType.java | 122 --- .../main/java/com/google/zxing/Dimension.java | 62 -- .../java/com/google/zxing/EncodeHintType.java | 98 --- .../com/google/zxing/FormatException.java | 47 -- .../google/zxing/InvertedLuminanceSource.java | 88 -- .../com/google/zxing/LuminanceSource.java | 157 ---- .../com/google/zxing/MultiFormatReader.java | 180 ---- .../com/google/zxing/MultiFormatWriter.java | 105 --- .../com/google/zxing/NotFoundException.java | 40 - .../zxing/PlanarYUVLuminanceSource.java | 169 ---- .../com/google/zxing/RGBLuminanceSource.java | 137 --- .../main/java/com/google/zxing/Reader.java | 69 -- .../com/google/zxing/ReaderException.java | 49 -- .../main/java/com/google/zxing/Result.java | 133 --- .../com/google/zxing/ResultMetadataType.java | 97 --- .../java/com/google/zxing/ResultPoint.java | 138 --- .../com/google/zxing/ResultPointCallback.java | 29 - .../main/java/com/google/zxing/Writer.java | 59 -- .../com/google/zxing/WriterException.java | 38 - .../zxing/aztec/AztecDetectorResult.java | 58 -- .../com/google/zxing/aztec/AztecReader.java | 117 --- .../com/google/zxing/aztec/AztecWriter.java | 96 --- .../google/zxing/aztec/decoder/Decoder.java | 361 -------- .../google/zxing/aztec/detector/Detector.java | 600 -------------- .../google/zxing/aztec/encoder/AztecCode.java | 89 -- .../zxing/aztec/encoder/BinaryShiftToken.java | 60 -- .../google/zxing/aztec/encoder/Encoder.java | 346 -------- .../zxing/aztec/encoder/HighLevelEncoder.java | 307 ------- .../zxing/aztec/encoder/SimpleToken.java | 45 - .../com/google/zxing/aztec/encoder/State.java | 169 ---- .../com/google/zxing/aztec/encoder/Token.java | 46 - .../result/AbstractDoCoMoResultParser.java | 39 - .../result/AddressBookAUResultParser.java | 91 -- .../result/AddressBookDoCoMoResultParser.java | 92 -- .../result/AddressBookParsedResult.java | 211 ----- .../client/result/BizcardResultParser.java | 100 --- .../result/BookmarkDoCoMoResultParser.java | 41 - .../client/result/CalendarParsedResult.java | 249 ------ .../result/EmailAddressParsedResult.java | 99 --- .../result/EmailAddressResultParser.java | 85 -- .../result/EmailDoCoMoResultParser.java | 64 -- .../result/ExpandedProductParsedResult.java | 207 ----- .../result/ExpandedProductResultParser.java | 218 ----- .../zxing/client/result/GeoParsedResult.java | 104 --- .../zxing/client/result/GeoResultParser.java | 73 -- .../zxing/client/result/ISBNParsedResult.java | 42 - .../zxing/client/result/ISBNResultParser.java | 50 -- .../zxing/client/result/ParsedResult.java | 67 -- .../zxing/client/result/ParsedResultType.java | 40 - .../client/result/ProductParsedResult.java | 52 -- .../client/result/ProductResultParser.java | 55 -- .../zxing/client/result/ResultParser.java | 259 ------ .../client/result/SMSMMSResultParser.java | 109 --- .../zxing/client/result/SMSParsedResult.java | 114 --- .../client/result/SMSTOMMSTOResultParser.java | 52 -- .../zxing/client/result/SMTPResultParser.java | 54 -- .../zxing/client/result/TelParsedResult.java | 57 -- .../zxing/client/result/TelResultParser.java | 42 - .../zxing/client/result/TextParsedResult.java | 49 -- .../zxing/client/result/URIParsedResult.java | 92 -- .../zxing/client/result/URIResultParser.java | 63 -- .../client/result/URLTOResultParser.java | 45 - .../client/result/VCardResultParser.java | 357 -------- .../client/result/VEventResultParser.java | 119 --- .../zxing/client/result/VINParsedResult.java | 106 --- .../zxing/client/result/VINResultParser.java | 209 ----- .../zxing/client/result/WifiParsedResult.java | 69 -- .../zxing/client/result/WifiResultParser.java | 51 -- .../com/google/zxing/common/BitArray.java | 357 -------- .../com/google/zxing/common/BitMatrix.java | 449 ---------- .../com/google/zxing/common/BitSource.java | 111 --- .../google/zxing/common/CharacterSetECI.java | 118 --- .../google/zxing/common/DecoderResult.java | 113 --- .../zxing/common/DefaultGridSampler.java | 88 -- .../google/zxing/common/DetectorResult.java | 46 - .../common/GlobalHistogramBinarizer.java | 203 ----- .../com/google/zxing/common/GridSampler.java | 173 ---- .../google/zxing/common/HybridBinarizer.java | 237 ------ .../zxing/common/PerspectiveTransform.java | 156 ---- .../com/google/zxing/common/StringUtils.java | 210 ----- .../zxing/common/detector/MathUtils.java | 78 -- .../detector/MonochromeRectangleDetector.java | 215 ----- .../detector/WhiteRectangleDetector.java | 342 -------- .../zxing/common/reedsolomon/GenericGF.java | 166 ---- .../common/reedsolomon/GenericGFPoly.java | 264 ------ .../reedsolomon/ReedSolomonDecoder.java | 190 ----- .../reedsolomon/ReedSolomonEncoder.java | 74 -- .../reedsolomon/ReedSolomonException.java | 31 - .../zxing/datamatrix/DataMatrixReader.java | 161 ---- .../zxing/datamatrix/DataMatrixWriter.java | 180 ---- .../datamatrix/decoder/BitMatrixParser.java | 440 ---------- .../zxing/datamatrix/decoder/DataBlock.java | 118 --- .../decoder/DecodedBitStreamParser.java | 497 ----------- .../zxing/datamatrix/decoder/Decoder.java | 136 --- .../zxing/datamatrix/decoder/Version.java | 237 ------ .../zxing/datamatrix/detector/Detector.java | 440 ---------- .../datamatrix/encoder/ASCIIEncoder.java | 82 -- .../datamatrix/encoder/Base256Encoder.java | 74 -- .../zxing/datamatrix/encoder/C40Encoder.java | 180 ---- .../encoder/DataMatrixSymbolInfo144.java | 35 - .../datamatrix/encoder/DefaultPlacement.java | 198 ----- .../datamatrix/encoder/EdifactEncoder.java | 137 --- .../zxing/datamatrix/encoder/Encoder.java | 25 - .../datamatrix/encoder/EncoderContext.java | 134 --- .../datamatrix/encoder/ErrorCorrection.java | 184 ---- .../datamatrix/encoder/HighLevelEncoder.java | 448 ---------- .../zxing/datamatrix/encoder/SymbolInfo.java | 240 ------ .../datamatrix/encoder/SymbolShapeHint.java | 29 - .../zxing/datamatrix/encoder/TextEncoder.java | 85 -- .../zxing/datamatrix/encoder/X12Encoder.java | 84 -- .../google/zxing/maxicode/MaxiCodeReader.java | 126 --- .../maxicode/decoder/BitMatrixParser.java | 88 -- .../decoder/DecodedBitStreamParser.java | 207 ----- .../zxing/maxicode/decoder/Decoder.java | 114 --- .../google/zxing/multi/ByQuadrantReader.java | 115 --- .../multi/GenericMultipleBarcodeReader.java | 175 ---- .../zxing/multi/MultipleBarcodeReader.java | 39 - .../zxing/multi/qrcode/QRCodeMultiReader.java | 181 ---- .../multi/qrcode/detector/MultiDetector.java | 73 -- .../detector/MultiFinderPatternFinder.java | 311 ------- .../com/google/zxing/oned/CodaBarReader.java | 345 -------- .../com/google/zxing/oned/CodaBarWriter.java | 130 --- .../com/google/zxing/oned/Code128Reader.java | 539 ------------ .../com/google/zxing/oned/Code128Writer.java | 255 ------ .../com/google/zxing/oned/Code39Reader.java | 324 -------- .../com/google/zxing/oned/Code39Writer.java | 89 -- .../com/google/zxing/oned/Code93Reader.java | 287 ------- .../com/google/zxing/oned/Code93Writer.java | 115 --- .../com/google/zxing/oned/EAN13Reader.java | 138 --- .../com/google/zxing/oned/EAN13Writer.java | 94 --- .../com/google/zxing/oned/EAN8Reader.java | 75 -- .../com/google/zxing/oned/EAN8Writer.java | 84 -- .../zxing/oned/EANManufacturerOrgSupport.java | 171 ---- .../java/com/google/zxing/oned/ITFReader.java | 352 -------- .../java/com/google/zxing/oned/ITFWriter.java | 76 -- .../zxing/oned/MultiFormatOneDReader.java | 112 --- .../zxing/oned/MultiFormatUPCEANReader.java | 124 --- .../com/google/zxing/oned/OneDReader.java | 297 ------- .../zxing/oned/OneDimensionalCodeWriter.java | 129 --- .../com/google/zxing/oned/UPCAReader.java | 86 -- .../com/google/zxing/oned/UPCAWriter.java | 73 -- .../zxing/oned/UPCEANExtension2Support.java | 112 --- .../zxing/oned/UPCEANExtension5Support.java | 181 ---- .../zxing/oned/UPCEANExtensionSupport.java | 40 - .../com/google/zxing/oned/UPCEANReader.java | 398 --------- .../com/google/zxing/oned/UPCEANWriter.java | 34 - .../com/google/zxing/oned/UPCEReader.java | 180 ---- .../com/google/zxing/oned/UPCEWriter.java | 77 -- .../zxing/oned/rss/AbstractRSSReader.java | 140 ---- .../google/zxing/oned/rss/DataCharacter.java | 59 -- .../google/zxing/oned/rss/FinderPattern.java | 65 -- .../java/com/google/zxing/oned/rss/Pair.java | 41 - .../google/zxing/oned/rss/RSS14Reader.java | 474 ----------- .../com/google/zxing/oned/rss/RSSUtils.java | 159 ---- .../oned/rss/expanded/BitArrayBuilder.java | 85 -- .../zxing/oned/rss/expanded/ExpandedPair.java | 104 --- .../zxing/oned/rss/expanded/ExpandedRow.java | 76 -- .../oned/rss/expanded/RSSExpandedReader.java | 783 ------------------ .../expanded/decoders/AI013103decoder.java | 49 -- .../expanded/decoders/AI01320xDecoder.java | 57 -- .../expanded/decoders/AI01392xDecoder.java | 68 -- .../expanded/decoders/AI01393xDecoder.java | 78 -- .../expanded/decoders/AI013x0x1xDecoder.java | 109 --- .../expanded/decoders/AI013x0xDecoder.java | 57 -- .../expanded/decoders/AI01AndOtherAIs.java | 58 -- .../rss/expanded/decoders/AI01decoder.java | 81 -- .../expanded/decoders/AI01weightDecoder.java | 60 -- .../decoders/AbstractExpandedDecoder.java | 93 --- .../rss/expanded/decoders/AnyAIDecoder.java | 50 -- .../expanded/decoders/BlockParsedResult.java | 54 -- .../decoders/CurrentParsingState.java | 83 -- .../rss/expanded/decoders/DecodedChar.java | 52 -- .../expanded/decoders/DecodedInformation.java | 64 -- .../rss/expanded/decoders/DecodedNumeric.java | 77 -- .../rss/expanded/decoders/DecodedObject.java | 44 - .../rss/expanded/decoders/FieldParser.java | 291 ------- .../decoders/GeneralAppIdDecoder.java | 469 ----------- .../com/google/zxing/pdf417/PDF417Common.java | 463 ----------- .../com/google/zxing/pdf417/PDF417Reader.java | 135 --- .../zxing/pdf417/PDF417ResultMetadata.java | 61 -- .../com/google/zxing/pdf417/PDF417Writer.java | 176 ---- .../zxing/pdf417/decoder/BarcodeMetadata.java | 58 -- .../zxing/pdf417/decoder/BarcodeValue.java | 68 -- .../zxing/pdf417/decoder/BoundingBox.java | 176 ---- .../google/zxing/pdf417/decoder/Codeword.java | 84 -- .../decoder/DecodedBitStreamParser.java | 637 -------------- .../zxing/pdf417/decoder/DetectionResult.java | 296 ------- .../pdf417/decoder/DetectionResultColumn.java | 96 --- .../DetectionResultRowIndicatorColumn.java | 268 ------ .../pdf417/decoder/PDF417CodewordDecoder.java | 118 --- .../pdf417/decoder/PDF417ScanningDecoder.java | 631 -------------- .../pdf417/decoder/ec/ErrorCorrection.java | 187 ----- .../zxing/pdf417/decoder/ec/ModulusGF.java | 112 --- .../zxing/pdf417/decoder/ec/ModulusPoly.java | 260 ------ .../zxing/pdf417/detector/Detector.java | 344 -------- .../pdf417/detector/PDF417DetectorResult.java | 45 - .../zxing/pdf417/encoder/BarcodeMatrix.java | 82 -- .../zxing/pdf417/encoder/BarcodeRow.java | 85 -- .../zxing/pdf417/encoder/Compaction.java | 29 - .../zxing/pdf417/encoder/Dimensions.java | 54 -- .../google/zxing/pdf417/encoder/PDF417.java | 769 ----------------- .../pdf417/encoder/PDF417ErrorCorrection.java | 204 ----- .../encoder/PDF417HighLevelEncoder.java | 581 ------------- .../com/google/zxing/qrcode/QRCodeReader.java | 222 ----- .../com/google/zxing/qrcode/QRCodeWriter.java | 118 --- .../zxing/qrcode/decoder/BitMatrixParser.java | 245 ------ .../zxing/qrcode/decoder/DataBlock.java | 122 --- .../google/zxing/qrcode/decoder/DataMask.java | 142 ---- .../decoder/DecodedBitStreamParser.java | 350 -------- .../google/zxing/qrcode/decoder/Decoder.java | 203 ----- .../qrcode/decoder/ErrorCorrectionLevel.java | 60 -- .../qrcode/decoder/FormatInformation.java | 157 ---- .../com/google/zxing/qrcode/decoder/Mode.java | 102 --- .../qrcode/decoder/QRCodeDecoderMetaData.java | 57 -- .../google/zxing/qrcode/decoder/Version.java | 578 ------------- .../qrcode/detector/AlignmentPattern.java | 59 -- .../detector/AlignmentPatternFinder.java | 277 ------- .../zxing/qrcode/detector/Detector.java | 405 --------- .../zxing/qrcode/detector/FinderPattern.java | 82 -- .../qrcode/detector/FinderPatternFinder.java | 680 --------------- .../qrcode/detector/FinderPatternInfo.java | 49 -- .../zxing/qrcode/encoder/BlockPair.java | 37 - .../zxing/qrcode/encoder/ByteMatrix.java | 98 --- .../google/zxing/qrcode/encoder/Encoder.java | 578 ------------- .../google/zxing/qrcode/encoder/MaskUtil.java | 221 ----- .../zxing/qrcode/encoder/MatrixUtil.java | 480 ----------- .../google/zxing/qrcode/encoder/QRCode.java | 108 --- .../com/mylhyl/zxing/scanner/ScannerView.java | 31 +- .../zxing/scanner/ScannerViewHandler.java | 12 +- .../camera/CameraConfigurationManager.java | 28 +- .../zxing/scanner/camera/CameraManager.java | 6 +- .../mylhyl/zxing/scanner/common/Intents.java | 174 ---- .../mylhyl/zxing/scanner/common/Scanner.java | 32 +- .../scanner/decode/DecodeFormatManager.java | 77 ++ .../zxing/scanner/decode/DecodeThread.java | 39 +- 253 files changed, 205 insertions(+), 38049 deletions(-) create mode 100644 preview/qrcode.png delete mode 100644 zxing/.gitignore delete mode 100644 zxing/build.gradle delete mode 100644 zxing/src/main/AndroidManifest.xml delete mode 100644 zxing/src/main/java/com/google/zxing/BarcodeFormat.java delete mode 100644 zxing/src/main/java/com/google/zxing/Binarizer.java delete mode 100644 zxing/src/main/java/com/google/zxing/BinaryBitmap.java delete mode 100644 zxing/src/main/java/com/google/zxing/ChecksumException.java delete mode 100644 zxing/src/main/java/com/google/zxing/DecodeHintType.java delete mode 100644 zxing/src/main/java/com/google/zxing/Dimension.java delete mode 100644 zxing/src/main/java/com/google/zxing/EncodeHintType.java delete mode 100644 zxing/src/main/java/com/google/zxing/FormatException.java delete mode 100644 zxing/src/main/java/com/google/zxing/InvertedLuminanceSource.java delete mode 100644 zxing/src/main/java/com/google/zxing/LuminanceSource.java delete mode 100644 zxing/src/main/java/com/google/zxing/MultiFormatReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/MultiFormatWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/NotFoundException.java delete mode 100644 zxing/src/main/java/com/google/zxing/PlanarYUVLuminanceSource.java delete mode 100644 zxing/src/main/java/com/google/zxing/RGBLuminanceSource.java delete mode 100644 zxing/src/main/java/com/google/zxing/Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/ReaderException.java delete mode 100644 zxing/src/main/java/com/google/zxing/Result.java delete mode 100644 zxing/src/main/java/com/google/zxing/ResultMetadataType.java delete mode 100644 zxing/src/main/java/com/google/zxing/ResultPoint.java delete mode 100644 zxing/src/main/java/com/google/zxing/ResultPointCallback.java delete mode 100644 zxing/src/main/java/com/google/zxing/Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/WriterException.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/AztecDetectorResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/AztecReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/AztecWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/decoder/Decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/detector/Detector.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/AztecCode.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/BinaryShiftToken.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/SimpleToken.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/State.java delete mode 100644 zxing/src/main/java/com/google/zxing/aztec/encoder/Token.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/AbstractDoCoMoResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/AddressBookParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/BizcardResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/CalendarParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/EmailAddressParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/EmailAddressResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/EmailDoCoMoResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ExpandedProductParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ExpandedProductResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/GeoParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/GeoResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ISBNParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ISBNResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ParsedResultType.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ProductParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ProductResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/ResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/SMSParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/SMSTOMMSTOResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/SMTPResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/TelParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/TelResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/TextParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/URIParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/URIResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/URLTOResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/VCardResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/VEventResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/VINParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/VINResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/WifiParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/client/result/WifiResultParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/BitArray.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/BitMatrix.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/BitSource.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/CharacterSetECI.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/DecoderResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/DefaultGridSampler.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/DetectorResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/GridSampler.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/HybridBinarizer.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/PerspectiveTransform.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/StringUtils.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/detector/MathUtils.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/detector/MonochromeRectangleDetector.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGF.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGFPoly.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonException.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/decoder/BitMatrixParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/decoder/DataBlock.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/decoder/Decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/decoder/Version.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/detector/Detector.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/ASCIIEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/DataMatrixSymbolInfo144.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/DefaultPlacement.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/ErrorCorrection.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/HighLevelEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolInfo.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolShapeHint.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/TextEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/maxicode/decoder/BitMatrixParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/maxicode/decoder/DecodedBitStreamParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/maxicode/decoder/Decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/ByQuadrantReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/MultipleBarcodeReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java delete mode 100644 zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/CodaBarReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/CodaBarWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code128Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code128Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code39Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code39Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code93Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/Code93Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/EAN13Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/EAN13Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/EAN8Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/EAN8Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/EANManufacturerOrgSupport.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/ITFReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/ITFWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/OneDReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/OneDimensionalCodeWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCAReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCAWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEANExtension2Support.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEANExtensionSupport.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEANReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEANWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/UPCEWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/AbstractRSSReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/DataCharacter.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/FinderPattern.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/Pair.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/RSS14Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/RSSUtils.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedPair.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedRow.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/PDF417Common.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/PDF417Reader.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/PDF417ResultMetadata.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/PDF417Writer.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeMetadata.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeValue.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/BoundingBox.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/Codeword.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultRowIndicatorColumn.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417CodewordDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ErrorCorrection.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusGF.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusPoly.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/detector/Detector.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/detector/PDF417DetectorResult.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeMatrix.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeRow.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/Compaction.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/Dimensions.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417ErrorCorrection.java delete mode 100644 zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/QRCodeReader.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/BitMatrixParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/DataBlock.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/DataMask.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/Decoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/FormatInformation.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/Mode.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/QRCodeDecoderMetaData.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/decoder/Version.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPattern.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/Detector.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPattern.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternInfo.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/BlockPair.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/ByteMatrix.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/MaskUtil.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/MatrixUtil.java delete mode 100644 zxing/src/main/java/com/google/zxing/qrcode/encoder/QRCode.java delete mode 100644 zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Intents.java create mode 100644 zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeFormatManager.java diff --git a/README.md b/README.md index 8c68b9a..a1c8867 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -###一、概述 +### 一、概述 相信Adnroid开发都知道,有四款扫描器,[Zxing](https://github.com/zxing/zxing) 、[Zbar](https://github.com/zbar/zbar) ,[Barcode4J](https://sourceforge.net/projects/barcode4j/files/)、[OkapiBarcode](https://github.com/woo-j/OkapiBarcode) 前二者应用较广泛,至于介绍与区别就在此阐述,网上有很多。此文主要介绍在在使用过程中,官方客户端各种达不到需求。相信很多童鞋都有此体会,所以借此机会就在Zxing 官方客户端基础上修改,去除无用功能并二次封装达到可扩展。 - 官方客户端目前问题汇总 @@ -11,12 +11,12 @@ - 可定制扫描框与扫描线样式 - 加入创建二维码、识别图片中的二维码功能 -###二、效果图 +### 二、效果图 -###三、[下载APK体验](preview/sample-debug.apk) +### 三、[下载APK体验](preview/sample-debug.apk) -###四、引用 +### 四、引用 ## 1、在线 - 本库依赖使用Gradle构建时添加一下即可: @@ -191,7 +191,14 @@ Bitmap bitmap = new QREncode.Builder(this) -### 七、版本更新 +### 七、注意事项 +对于setLaserFrameTopMargin方法,扫描区域偏移的问题[issues-13](https://github.com/mylhyl/Android-Zxing/issues/13) + +QQ交流群:630413339 [点击链接加入群Android-Zxing](https://jq.qq.com/?_wv=1027&k=4BR729O) + + + +### 八、版本更新 > 1.3.1 优化代码 diff --git a/preview/qrcode.png b/preview/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..fcecfa99e546dcd298821d6adc6c6978af36e6ca GIT binary patch literal 16297 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

A39P^jN#@)ZtfV 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

f6 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

uT==MGmPwpc`V0Eiw7fF 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 BmNWnW literal 2011369 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 z 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

7`*k^Is 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

dMDJ|6gDp!&ADq3%HQ4yVTSl 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

    w*%S4-yk6iTNO z?}tl^NaFeaQdN4UOqKh~$_Ab(D=R))RwnN)DlL0PQ{`t|MY8TgyS+8O5#*UtU-8~z zU+KP5&DURAI@5ogW|k>sdxwPl zGlwWcykr@c*~!nBG0%B@OkXmm9YNhc^s7d70P!7f4dFZW zEaKS56M3^%URMjt>uzCrT`erHyM^WTT6u-dB3fBbxZ9Wxb zjNAOG@=yf7_BH+r4};$7BNTqCU-Dzjcm4YCg1V=i)b`;8wN5#y?O%}J(e^JW#nE>6 z$!-6RzruU!wqNVl=Tv@g15lYJ7t|1Ga>M`Anmq7-N|V>;FYzG{!1s9Jo85_Hut}dP z_HK)Pc{9>-2~gu&PlUj`-+tHeJz&4%UT$$vyw`c~2FOiF`#obk=~s5ej>;YxxkxN^ zmKRE@H(D-9_&xJHZmh`t6II(z71Vr8_o0u#ueb$v`SrPBD4WL)>^?-1^F%*s~roorQP9%!8PKh&kdJ@Q9ei zyTkbUsa-aKJdA6eYbf!0;OB!M@GE+0SVwB36EAQbt=g^_a@uLKD<;EQ5)S)l9CD{M z+FpWb!{LDe#*G6UnDu3FfiTHIZU6@eLx{pc`x9NHqQ?!BnVWohz8CFvnS35`rZ?}PLvcE(R zqh0(f2(aX2c=o>5iNiE%&*t!m87t(E~~96 z?TkTj9!FeUj8}b(?m6Ol#dE?N&`6ychA-pHg_4K!D~%Z>zwBb| zvKY={PDgcwL;oRHS(r?}1u(@aYuLtLSt*%*E0rKwnK-xI63%)o#q+tPcup$imO-U> zr3ybQ#dlIExAIbaUs{S^stB@D0-sw-;7fZHl)}17@l;7RguE1wz(>1vDg`!q@hOug zKRy-G6x74c(RLIf`@`W+?K+$z?P$SB+n^M;=XS-+haZ1@ z+UY*kH_aCyrM?v_R!pA&Z)ZYU-3N>-jYr5-pNHtft9@?xpLkFAB|g?qB#z_R9pkh{ z?qohCYlB0G-lJFUQ)Q)cR5a92zu5z52 zU$>Ll;96t?-NpM<=APJ5VB?^SKrwyOXH3!x;Khme#9KPPCk7P$lV>E!ivc(c-5&1?9!c3NdEC?|;p@+OBne^zFM1^jpk7_oXVOz>6GcVH}jlgoS+DvJ$Tu@Led zq_I1F6)qMFD~b0&Laa0_c9*Zh&0>qJ*dnXs-M)NMZ@EZ8`>22=55A#)u4?V$0SwP| zVfcL-KHrVuw+8f~iPs4k0b>Bq&d2X&dX(MdtqkfC^h%{I=y$F!Ri={qLk+m^oK|_2;YYhe=)wpQ^WV+#9xB%@YL}=0z3r1!?V;2 z-%gq+ohzLuZIU)iZPM0trN>dTUoMf0xjuLsZ>R3*HbX7P;0yJ=x?g1!C`f&_{4GuW z%ffqzQzXRk!`D7?_I}Arzh{V39t$peaToL-6(n=t&RAdFBf}qR#qW($Ti=vNPJ8Gg zd_$=XDg3p5=0#W^w$E3j^!t1R_g#C>o_j$aJ>sDqFx7tM9N)xQJc~fiYBAIvmHz7m=}+ty_B*eP37?;I zKa;~-r7L1Z4!C;{gD;k@EPxm75$UfgfDhdxY&3kW0B&08zaDei<{7((*?SFh?U&K? zD|V5qF%{5~IKM;U=0ES}{QUoyzu^D!C%)T+J%!)R&#f0s+{5f9RemcPf^n%`n*qw| z`nKZo)+9{=v{$OxF_e4@*7gHsIrHkwSE-dpSoO>HxxL7r4&1l=o(z?+U)NoUkLRf} zVfR=|WMTJU1JrRY9rrcu6=a_T9HQ(Zlj6h4K6vJm_hw4vy;exTMoN3F5H0^@9Lb62 zA>O@Dak*)Xf^WEP6hiO~XCH&?Ey%I=l<|8RWPm~N4iKX)H$&Sm!@YLmk!#)4(RbC_ znyRg&Um>6Fm7xT{$uMq<4PYN*{!vQ5B6%>T){b#uOpW|^MJhd2%qRt7MhuGinB}3p z|D!J98D34*Sv2NA_!(7lK?~GDEjVGdz(1%okJSR>R57##V+O^XaJ1k-afco8^8OyS zSBv9cm%5Xw7G}F>6t{i!3B-RN23Uo0mfuSZkclfu-kjQ^k#*9v7K7S0zBU6qo$)Qh zsC>pSmi7CMfPn3d82;LkIdbO6aUjENkUBa>!rD>m8%@FnawGUG&008y z^fdM+O{10dQv8hR zf&y-Jp>8N(B8s>#fPif!iYx8cwpPLFx8M4$RU?Q?T}s`TTJ0k9JLlf}W(iBbzyIg^ z|NP)HdH0@s?z#KD=iYnnIYbnJUTuB5Df)sg?s}`T0{8cQwGHimA-+(frySbNOZHX; z%X7$SC;5dH-5YW$GXPxV?rG?Ru+@Jm0l6US}P@}S8!KV`C6-_Dz|=d zY!wN6D@zfp1b#=LG}5KyLrOzcN@j1wD-KjuMd0T@EJgX~6e|hTYX$?2I;CEgRAlo|5*z<*)}QqucNN@z=sB@G$8rPJx1 zeQo<)Ce8%=Dors|r4W~1U+uTri-edw#ppGw+R-A{sP-EPv&!jE|LFF2=($smT|@n2 z+W$&|GNYpnqhon3-@Z!dchHkq-~3|+G57l`1$txXA4_w9CB$%A8b3n%4}s+4yg`QJ zyg{H2MCWBFX%Up(be?hVS8iH8fz;Fe$HpY=7>xC@;g4w-7=30Ob^$)4*RD@(CF?yt ze_!o{_I)0oI$(I@p4xb7k#VE$^T(t`P#4!EC1L@Wx;D8<*XBn>Ska>f?!^RzwfpJZ z{#8)Q=_&ehHP<`W5+jTPA&qh|84{EXYQSHcG+{+hGgg|pQL>260rYJ$#Y*I`@MVvS z=VbA4pW({mSl3RVck1J$@$~ksP%G|5d0KH_?wWWQO}J@txs5mXm)dx9f0>Op_dl}n z=Kc~Jb$$}TL)WAVF4r63-x&Xn;$MgIR&4Kg?6u7Pj8z(wSslo<9nj|EMpg3+iRwW- z^=c%R0yR2NO8QkI#3vc_i{oK2>^K@#oeZg-%!4HmM}2f5t?T!1QWdd&w3px)Yi0qS zmSqO}omUak1bea9RYk~!IA5SU>2W>@%I-b>`PUx(9^bt;{PDG}jiQ?(IsKb#e|+t= zOpis6*@icw0FXd$zx0cDe-D~P+4tu+Ud!ZvBVw}=k(!|&HMK`2b`NNBT`AiD=O3s` z;uPyl>sUOysy=YPzsyrJevU`?mU-q|@b#5>R(s*=x0=d~3##WBx~I%DXEZ>Hmgu)d zst@e)SN{e0XipfW`yd|kl{24@`C`lmG^*bRzu}-CD6!CQu~49Qb0nk_p~kNAuOmJ^ z?U_5S&-SEOgFB+{@-NXhMAGn^sq5a5$0lt)-4ha~laT&hGU@Un;)V@*gkQp5PHgk& zj063Yhxl@_x**nt`LTQu>#oDb^5q?{wu!ojp00cz0tTu2D!^9%#IP5~R|QF{u8Pxi z!_7@mt4Gbn`NUdmEy23nc-XqUGm<8EMxrw8mRr1JCQKsM*M0Ug>8lCd|Nbov7+9Na zUcHFBefjQ?r-DGKz368-&I|SDyF;ELis{~$D||0j0j?_eRl@H{=$mfX$AX83A1(}~ z0bk?c`{DcK)Ic^2aVuPW9^Va%z~6rX{2=_k;o%ro!SiDCJ)+3x6q)P2QMuk5oy!Ip zTvp3R-_#JQcdde^&1~-C9EI-=&!G0n3Hd(N-$Tg7XoDARmhyBXJY7FI^dIg)Q6~}V zIj-UJ+-MHNxo#}C3o;JRdT`FeeIn`;!ZS0pe}^&@_-+P%s88y6oJa6Y3;ZrZn;Lm~ zJH}jBD4%c_eUHTE_qywtKB}0q7iRU^ZiOr}PwUchT909#taY^>OE}9|ChA4bvp@hC zMXm(`IU>V6WPhieKu(mYOQBYJoqn=r0D8}mRguAjcaG{u-7P#%o~#Z;91F*-VQ)NR0_zI`?F&kQE~l(j7ZF#T-sa=mYf7BY`pj?R znVA%nTw3QGmX>@JT7AvU?TG?f2H(%#1GLV={j6@oik?>Qjr5tHrK$dClH71tBzjhS zehaMSL`dEYzLoJ6W|a1M#HR#-C6?)YFrJTR9LqsIr;N;-9paWqhqNiuA#aWZDBpzi#sOXm$JdqjMG`;W5=mUP zIg+?)OT?O0w?ZS-HKu+=DM_n0M`o(3WNEEXdto(`A>@(KZ)qa*wN(2;&8NJj0!K67 zk`h;KiXb0_-;fp|^(!g}%FxGP7C;!@k@iC?^qw}WJ=vX@iC9&7{R+x?3E1x!K+OeZ z7XRB2Um+-c?!1Ze=uH1H%li-3GMUH3yiE~2GY=}sxlju54G5}`NNkGq)SikvUFdO; zb^^*GC6b#Xy~$baLY-FZ9LSwlUa{6a$J|tKj=4Gu-&_D+mxXUBfUjTco|E1eac#xn zzm02|tXg9F=15w+Ig)7E5}7HAQlfoJq!qqziK2-*2{HH6gaF_{Ekb$mizS&HmGPX; zNX*+DnPf6Mjh5gXG`J1*``0pC3yI#%k>t5h3+HW#)Xj!=lOe6;kd`bft%9tFW!iG# zw-kZ4T#Mq9-jW4#u-U4?*~6NF(DkBE!uGNh;Eu)KQ)jg|oF0^|g!8$Fr?+=4x5Jc3 zc0p?0P`5SpEm2}Mr=>e1i3O0NB+0Fkq#-@J3xMzCBHF`)wm^J2v2b%_P=VP~=}paQ zw_1XtU^{OSs)-lt@SnU)F^SC=5{WLy{&6Z=$4TB7LF=;1?0=qX2IMt9XR9D+C|OzESR-n8DGcVa+Z-h1Z!e-aI4=E)6#8`M3R+e zjwFbdm1y4#b4@$d$xR`#MEj-!NT2-^Dp45B<0+=DW4t?#+vBNKjTSm;w?=X{P@2~j zuF2aXfvj%wlh(OkESU|P3SnbunA;!ET<7-3ZIOJvUERaddN-1@^L5TT z_THjVD1n-NlI>`d6i z^x2=cw-dI5&D}*jl+EM21$w|9Tj$zs|Fqqe!*<_#{sO|D9QM|;9p8E?y|sU9$G4t; zjxfk0J_?bSkiT%q38N`QSwcSKkTK&aL|sBY<&dezP>8mKe8M670{GSwVB!+;K8H;@ z2H(ds*vA~U(!uxf4E7O+)p^+acm_Sdp)C{G`*;TZoI_7H+530~{eVL=e{pZROkzwp6)8?{fVUV`2;V&vgCMV`3Nh=O(#- zUQC<`{vW&HT`@5Y{_nfteKGMQ@bBc|SX(jiy8t;RDP~^)#>6uK(vXFqRpQeCQj&#u z0n!1G(OC$rOyVg3c_&NR50JAkFIk)bK;{FaEek0E$oByJrGS25kdAfX0x}Lqk z=rNzAS~tstap&Rt6qDP~wt_wOFZt~4&WC4Q&+^|Wj3CoQv_kwRY7wDcG@;*q1)SWc z-Asb~gKjcRU#NRVxA=Odht(1qWtkkOq6XxCqNqpkprH zQ+r52Q>3;c{*tkR&U;?ISGWx5EvD-UT2Ohs3(vXGB1cc{!(HbKhAXB7 z)$eLeLd~veNbgr&rwcx{&kQHgc3-0byDamWE~anrQPiKHHbHFM?TM5I(0*o_*-mp+ zeb)W{W%jAvY2s5O>ivFaQ002B-@BgiuYJwlWL?t7bifKh;CW_3XK?=IwoT@G#t%0N z#$neaSKqI{pUH+aDq*6{WouFqU6VpGi#3zRn#9Wac_2^Tt+k(}(S+84pkG)fzOl6E zYf`k2?XF`d_cNWsA>djX1U%A(=X_lN^}_cofMWj??m~{v`62|nJ{B_5 z4f!PvdC&UPd576Fz%qQVpYf0(^?1nZgI$Y>Ay0+gWWgRHro2eo#NWLTc=az~pCb#{ zlh23UZjb#%_X^beAVH}oevp|d;!3P06MQAs`JU>wer|^k<^fhi0a`;nwwXK^xT{7P zcx;)yuZ+pxGjI%Pz>8UGZ*5~TsXCuCc|mNy*ZP@l*N}b&&Fg9inF^@{J=n)Q&|725 zrM@9m%HRvOg#`6Rd!QFsT2J$9T?;i!7Q}d6h`tvai#CIyoOPFbXiF6nOQt7XpITw( zUwFC<`%#bcqN`&!I>2=7!b(5B&%PjSalMi;q1)GMw*o&iM#$M|cy>g-e&f1<+`b8I z{dAZy8{50e-)Tl|#v>u#lmfgCD`xkZx8v+ZTs+o$P8i64Bhx8F?G7y&xyG)8)w8`djRM*sv(k`8?_VjV)i~ru@zUjP$C(#_seqR@s>xaZVxw3$K045 zAURtFmke+{`O{-|qAq3+T1d4TARfC z#jcg)6{B1$$%%)FyFhhpz&8?~Z;qz~3DSi;QG#)b24g&WBX_v3$L?*CquqrxW(Y z0hcemKI!tM?z%KIz-=-Jc4Co%+GvUd)LOI1NX&rRl45p!-Pak+O;U>5efF=@%o5PY zIJ-asW7<>{j{DaEZmZ2qP6TXGwo$Y9eo>BWgiJjW zZKT!$m`yXc-~4O9<+-D_+h6E8=nZV#CfZ|m!z6_y5;40-+(%S9*&YSD5^-~Z(id;Q z?~#dU_X}$kF{1VLwJetNt{cPobgx8Ue9Xa}gp4u}NPTkMOBssy-)`DtZ(uTrM@UY>yRV0|^Tt`~1~$$R4rysH*7SV6LEpWB z%?AlPW~08KWE5K0d@k+k3u3R?37HRgcrI&|SX#p`bTY-OlEgO1$r@N!Ri>3xC1ce3 zUqG9wLq1<-pWwCk$v#`KCe8RdGuavegE&581PMtIVmXgDZuF>RK+!$PZBSZW7auvj z(eER5r~8Po!g*sq@kX4#?3a8I=Y3(h^Cg`(UqiV^R<0)@KR07P_%qbq%Ifo=$Nw2h zsA-vfl4isF3@dKD>r5Kns%gUI=Ub(l4P7hsrQqMMp5xy&R_SjpzDGBF))*FA5C1Tf ze%DxIc<3w^S_J z$QoUzHeqS@8me8lwTA4~R6Fs0%pMRm!_rzcS-X{Jq7{q-uh6Q68+HQCadd9I)JNx1SnZ>b0=naN1=%kWtx42KNMtWG zqckmv&WXU$iKlZYrTbn;1PSZYS{> zSwHj+;3Pe64k!2NP@)Q2A}mi#T5MozcFUF+w<^diorow4e4{R^>pdcsI{Y!aN&SqK z`n^L+9h6*NW6g~&uTh=HYg8Y?YpC?y2qBwqWV-%h!eS$l7;PuoYwSdFl%1SgUBGwr z&b==gZOQQ*_uuI99NP}zIdUBDKLE@83Y}?XIz{zgnMJp2TxCc6|HE#L^Sbjk4q0T1oP`YCG{flsl4Vi&oj=OJFYFFnJ{W9oTE=c6-RciEK0!qsdTMpZFTX295X>m7uF%GUylP z^~mIt!i44+a5+BYnBh-8iQ~geGoSWL8!w&Qg+ ziD`>y|LwI`C&vK4HOjt$sIX$7D;^D_RvzHmsv)ODfcaJKsl6*XMq+DekGT$LIqwCv zTpoU%&BG|32L|5*@Fr&Wm-dACyhC~c>_%Bw{k(tQ7oaT^XbVMDcyEBVIBaj&pUc}n zvUwYA7v}s5HJ032tEPKfZfW zflI}=F7OqoTo}}I3!%3g;A)1|c}Nk2eTpK+6A{u=JD40T`6Pg49vp?fQ|bB39k7z( zU$n^eL~=B7!=Ff=D$yD4b=STj)e*koe=^P=&5rXT&NqB_1AhxKa*7Z7A4y~PJpDNjdC9RsG?$@QrM%|-7dUcz|WW}A2={uu$n4VRfJMY@S_IW+# zP0;^**ryUOg4?0A-8cvLB@c9&b%CtR^iMaiv*|MO+|aQ#F-Wy?6pP4h zd5G4H>sl@A=bvilI)6w1WrVig+gxXb6qMXH{CER9=Q?^D(tT659le~_5pSMA+A;1; zqiyVi1~Jt7g}|%bRAXabWPStuqrm?l_17(QTWjgbZfnIvm>Ylw^iCVO2kfy4V#!D+ zo~)tqZy>UQ{q!W!r(k<1#3xu1hQ!-}JG%*H4p>I8Wm|PYdMwwfpU_s_7s$KIntpTP zUDjATkUhIQ>1J+s)E;X`Nh0dl51Oz)(-YA#Hp!8VLBctQvKMOXcmUYPTk z&!M&50pDrf2GVfdNb;s4>B;+m##W%As@h9uWyl7YtK7vxc~+|uv8+H@(HZ8PB7eZeZ{Yann$|e$uL+ppJj{-<`IxO7^KB#K z4FYCy9_F#<=3^eqG2a193ouLaFeemXPT-jD0%iy>OY<|j`^N}8r?#^5qX%k z1(>xQ^X%~^}0lB-I!WE0)j@PsYhi zk;uvDiFUNalH%Pa!PPkp@lgInhg~?{-EJ4@O8r?HDD;@mQ-bY&@)=E+hl zEs&-7&ul)9fqF0FX9*Yi^X*;y_eO3r9!hCZjh01##q5Q=yphWmeyR1kwnBtcS7^Ua zx^}Udt&op4=Irkwzjcb;DJJYr=_II^HoHTeYj-H~?3{d$d5e43aFU(>cDOhTZ!3V8 zW#K0mz$01soC0`F7XF?m1Dz?* zLonWy0$Zi52hX_0eXD%3o&Q$(q%3?+0X&g~f5#5w*^%hHrSLAX9qK)qSI>*H`D`!9 z=Q&w;($4QM%WiS)GW`Hn=>18258Y|!Y|pQ}rBI&3$0=S6@HN;^Jl5BIpCIx50k!WO zeKek)MjC~wq*e8bS1%Y+MFCvu)e9T0(8;6*l{8!_lgUa}7nwRnwS@XB@U?(fw1V|l zh6u(1pK1kRrz1MA)HnPsgSW-2&T3N;$N9Kk`D+HThBT5{wX#h^T<3i&7=0Aq`b-i3 zS95UC8Ty~*Adr1?et_3|8frDj<)dA-61W8F}B3+@GOPcsPP%wu=G}D3uL8!5cd2&_-2w``UZ=n+_Q2IU?T1r zx3YNxaRho!@UJA{XNn_x$JmRg1Jn!$O_}1NtABh>J1fd^_3QH z4TMX!7L6#`M!ZGa1Yck)RK+&pN4L4h+^!J=LdtM`B#pwBJ>cj8&V{q0%yvm5tt_d;+dehawILHPDP z+zlAp6VE}c=OKL8p6zbUGA$2S#(hx6yRv13IDbgfGC~Pn?1pmf2KQocFW_##cyXay z-ai8Umfdw&1BpK_;%>nB<6>HNz<3GEyBpkq@zPT6hWxygru6`|^D?BeaCZ`GCh_tD z?gosP7t%Tbj8`C)6}!O=7_ThiZoqhj)em3{Vg2j|H((4c4Xroslm5sZ> zy%gLFxEnBDW%ULad$F!|gBvjRF5+&$*t?k4Az&u)irwrhEnr`HA^XCZrC)Us`)Z5XS6{-uForE}{P}UD)gST>6?ui$ zK&WV2k>uZIs)758ip=|rBG0xW0sJ!c@4oc6JKBmE?lx2OZwo4c`%E(kKYhDt8f|8% z2zK+Hi1l}`dU$@X9B?&F|D#kNGyliiYHb;jm(64U$NA_kHGGJd745O za_C}v_rl*QZHf-~-8AGZ9?hNLtyG)iOXM<|qo!~ZvE)Vw4uvnx zYLlOAo&o;5v;Mf5B$n7HRg!7?atLY8hBTN~LCiYS0RO-8D1Db$61@+65H<8UKN|`L zGtRU5d1ws(IltTjD12ESu2oPUEbb?HX+h2p%fGH z%iZSHqzGNdJO5;NulR4Tiz{mLqG5dhs*_eCNP}$m`FGR@=AJ2g?kGG{KG#O;RqSRn z1YuXew_h>5`-mb6V#B@1l187OB$uCS-0Z9gWz@4stIU~%#bACaHKRAhMe{^w+DQ*duRn4d0sJxhQ-pE1(O!4E4 z5FVmbFvZ9)Dwv`m#~;KLf0q%a6?!TStjBW65Bu!>1u}ZYJM5&aBGVo~% z@M)?K`Bh(&?{d=QDR%jDVT@qu+S|e(MFnuxVj^lK6c>11pYwi`*??9H!my(iJVN}l z80!_%SGDg>6+s?AePZ#FfI*&=8Yo#!B}uaN4hO_mI+ue_?2Q~eJP z4HrNk(tg`7is630A4cLCnOr>}Kf-v}ze9ar&H0fe^ibS`L5M%+--&)}pXwL)i5Bcx zUVITHf6wlkNDQA9#P)bm%0j%BF1%{V*b0_((Vl&VD53_B6-EGCB!Jr1fTs|y4i4!; z=AxaJw$D)WF^W)6TM@&Mg-kA7*vT=d_BfMaD1u-~ZW_WKjzRUx1sR41F=#&I{Crr` ztAi{3mNX}T?*`@+!QbjRCj70R6BH!0pQmuy+OzItvi?*q9O?pfCF~Of5$g#hRQJKo z5_My?m;tJH6vurZ#F@s&y+k@2&bK+X&@pkP?NaHOc(IKme?U-4$HWWle)_%89uPG6 zUIc#puCNo}o&xiY*m* zT-dE!Mx!zfI8fw6n=Bb-VTZ@M*cQtOoxMe&40s^mFUlAdQ79oIkQb#g(%WvO%<+cR zXlVpFJD@z$d9BH_FM~ekmBZ0$Fps0U(VIf&3ytauVZaOqLL>3sf$8oUO;){$_ygrW zzevhaUvxRFzZC&L>c;|K1tF_`g?g!2Zpt7x<&c{SSXU}ZZ!(-R>wF^{M_x~wMh>{6 zt!zx0Ro>)<5^6QPge!Tjpme@6D4oFRK`tSnH({mT{59IKfs*-rSh7;*%_i*)ss+i} zH=IU;Pobr9Zn7dxMUakOL8b)ChSeIQYkp`HH5O^eBWHl_2gZmh_-W^`={pBS`tan`H!FBYyhy9la_9sSO-D7&r??R=y)Q+M30cahP z;y^|4|2DdN5Nip!#AZ;B3{csH{)j_c zNJwlZF7#3kg&m=2W}%mJXr*9@6jrl@T)|<-3KY_?gsigD@LNJIvr$vi67pj^UsuJ= zkWaLw1bs`!wG!69MXT+O#n;*$ORlo3S5^5t(^vBE)wUG`&hN4yNdl}5xFyv2-Eg@| z9_t$t^~@ttI=_Bu5%i%|q$I>ic3(*)bK9Vlt33g`5=yi5b7!o9*+N3u_ z&>k^irGY6#iSva^`@OrFTxQaQ+(OsPzc={kZudUns)GB3FYb2F zOwIWycmEZ;huQARx7G7TAZM#*wcTgVqgujTSk7KDhF@#vZ1#*jjLjZb#>;_pPzR0` zV*OGf(Piw-A}gav#)zG#uC=4RlWQH)Dr$0*h+KSJ@Ssm<61hy_*YyCYuEX9Y%AJWd z(4z*R>Z)VVqrsQNU;7$6T94N3OJ_Krb)L4yc0TrU-ZOO%x3{e)H>|ajTh~JVujyJr zUqc#HqQ6Z0G=TCzE65n&mjXsAgxK!(#b0nqQ$ik z>|jf(7gYJ9CDF+PqN?HRu*}W}Revk~PL~KHpIw^5blX&!$vb`$Ggcay zE9}clW#?HRm;c%ddA^Y9+JPKD!E(Hj7Aax4& zAkCZbTWhB_iog-qj!$`2pGI+NN2GKWU(!~m8Xzb5T~2(8v)gj2ulW)1o^xd6GUq7B zkGe8&|G0YYv>yt#7Dd9REqCo_on+h_pE#C~6*#L&}JgOae8S7qEmasv)&W{1wHgF$sEE zlJzp!0mq&F0iMplz06K`@>z)g>c8)2J{qRep5Z4$cSa%|MlUb!nD{T`H~4%ZJA<`;?0FA^CeHE9L)Cj})|bN!O2R!=-) z?P*7@J?9OL&!fRj{M~nPOuE#E;{f*vdu3TidD0fbA>tIVo%Y_*^j&)mnJSDTW%3sK z#<_)D6hwQ2b@N~zUx4)=NrmY-d<6K8iF9^tA&sJk)F;LO!1}XQm|*2k4mR+!_fG!{6k0>+|<#yY+dvT6zIbknCepXA++ezo!$QigtRLg{L3o zEIj$Rg(uYt1+6fbcfWP>1hO9aIG7btn{YC)j^1SAJavHHeN_8lOq5s(Jt0-9Ne&CX zMXbjb5u<4E`#tu^)Inkdu%91*wu`=w``ri6Y?J)~)HPtKbOwG6xuO7x`En^@Y9IPt zpB1641hpS1@&%ZV;}Gn2>QZl3_`FtNrr`}(RWmhjfZ0HuFdsev*cHZtnGV5`MVDsGb4!Cjr+fVJW*r)SO{b z`74)C8?}Y$Y_motH(hU|E)AHErG}{|5cDTEGZ@Z!L$aJ%X3y+yp?c?FMakilNrT4{ zy2@$g#&CAqCXJG%^CjcvuaNX0|fBnA8MM5sqf6Y^M1G`5fXBZJKB z-buAXt~5}#JHYw#xm(!&)*5LUw8zr*zGjrW-bbGu5On`>f*WFILwfCo)ILbBy12^U zH}62#Pq)Nm$o=E}v^QL#;7I$U2l>33R1J)>nVRnDF~{I2BvE}pg^n%7yFI`I2vVEj z(0s)XoZq-KGbnvOvV%!##@f@^g`Hq2-DWX1Eha8D@XQ6v^f}&dKl5#JgQ{Sg?3_eykR{FX#8*!sL&dsyLvgW!mV5gH#h(7K z>amRYg;fxuVTeRS{KW=pw8wMN7XoLY(@eQXa;N7hAHhm%YB5m#G>8Sio zP|Wenm)z&_(l^;mc7~my{utozAbcORmw5s1KD^bBmH92*Ith5_eXNxLsxtRZbSsu% ziI!x^!s_~^qkx~P1}+;oaoq!J@~qT3is4=R^HaPU-Wnf7>ljwBVd+mu!`$r!>C`=b zx7%~PW4uFN^F!1 zCafMynlr*`XGqxSd;q^a?)kv?woV`mnB5*&^iX@0n&~;MEmfR0=sVQcfySGZ3*_+b zBfu97hieBBKC0^wc;;yE_z~bI41-$}heYj=oEFhD8Z6gUP_8u72L)x4zv)S}r9v}? z)0Ph&0iHQLT=^HmtEV3V|KDKfq!$jR&nW^@IPq9Tw4vf<@(=ktN(?%ryB9Mvn#4fPN^u@aJ@iW=Y5(s>{OlC z&l4_!dNRsG6(|vi`K%!IW(^6A6iDO9Y7)Y|7Ei%~6eHLmE{%LR1V-x zr1Lr~kHmT7h@~qMUcsEizls->WGqd6sNB$R^p=MjM@C4fT%$Rh>>WvlJX!{*d5=(1 zPc{#Gg`YTo5-!Lq@qgmYQk33RF@CKa_%)rx%G16T!nCe(GNwFOn&WdG+V1i>8w$=0 zAKUKUIoxa)Wp!>UI0xbP8T{UX-z)HYj_Kt0!X7P5zkd1--wV)V=vN_e z`h}7RAC8y~zZUqN0KZxAJ26j>?60AmONZ%^z04>RJ|5Lun@ph|*}H58xm2MLc?r3V zL&kY1L|H=a;E)-|P>8yO+|40r7E4<~Zsm|cAL@|>n7D-8$ze}vs7IE;Znv%8YI3PR zE!<@@&91lEOtb49Hq-2Sx6L%W-fFv=UGKDA&91lGOq1s=cAkFL?MKkhy4`(KbXne; zqRR^Pvu=0a6x{+XQ_kNMUFr|I@3K&a0&t$jJ4?YK)n>VWG?n~aLhi9c(66frLS|9O zy*3MzDCS`x$=` zQeka~SI?{RV;MAJ$n^{G#Hq*rO>z-xl$8&Xx*31ZaKGGF+m)Ijz|OV3h02dM;R%53 zrzhXDnH7~UtZ;oZo`)a9q0X094TF5!g?z|P%x%~IPDl=rc(aEL$z=SxRt|kNBs(s& zJ`4RXUN7<(+0FBD^1T`7KKE|odMMjNSZemzM6boxg{qcL9GSc|p7+L#-RuX(S}o5*7nb^+(fw zpb$ekPI@MTG@RE%(tDi79k%mINcuDP-EKQCgro!DgL;rEITh#4kn|T)SGyllcptv6 z!uJEfK^;NPA41ZH;P#U;>Ev%QeXV8E9N6#wscV+x{3axQ#6#yC8v1ZZ`k1GDtL>~0 zNuO}v-L|tPBz?+#ciPUCA?Y(n`F2S8bJ9?|5xxg$F5R*A@z`DN`-J&4$*=c_JV7gi&w0)AM3(=`k#BCXEj26=VLE`5@A8rw%&KEDt z(lUQo`47S==|h4@DLLTohuF@as%y*qmLgd3cvY5e{AMkWVm22%?ig^dU3rQ|Py@dp zSkBvM{liCM+K+r?`VY+B+IzY*9c%F-7z=(irgi&bI=j8sNttKeXbeLeLp}DZU5oJx z;~USnd+ixrSCcW?_p|onpB=F@@BDK4PbQE-UQbq|rJ|GwYAIv6uD{tGdyrcxq`}xb zmyJElJ&wI|MN5ufaS3S^M0uRDDmP0&DdU%GsO3grHm1|sJ$7_uye~}9bt2IOl%RV- zyNs+`iM{P2VyVst=<*Wh&p9fMs+YV_nvZ2E&MWImna}x0TDzChEhgwa#G(1y+nN{Pw<_-q;z;duzG&-c0FYdvE4+y~F52j3+r|*518`Y46_Q?VZ-PWGQbsGUWl6a^85(_JT8@ z7tGJ#ns=mrz~p##{glZ&y(!B2U}A`fnHPm-)e_qTRs4h1tUhS(6Nm%+Jov5HUZ~Ik znAqAR)Wz=Vntko3?A`nyX52*n7|Rf#A`A!;nSwfIg%^TEaK3S6e!lrBJF8|I5@Y0i zBQ315d+iA+lXTkmQ6A63=T7-&%$`W}-0E6-r#jI~W-FTTQYu66RX)AP{9APSfUM}r zh4Vq&78}X$v*ljDo^PB>EYt-XD5BJzUl+Ew0U68VUYzKcsP*?kdL1VTh>Ze$N zAlt#ylj}G7%(XjICxyDb+XF7wm@@W%GYO&ABQ z{0U9R4)(3 zNm^}Gfz>Q&k(n?E@MH!!V+~JakV77H9=dvP1zpQN>Dcffq*%o5(mey|O_cF%Llvpk zF85n{j9g_{L9`u$oLNYQo~EGg*eeaIBW7G-SmoAnmcO@oacb9VmbbV02dNFaR%pwh zG;@fiTO(-vXh`%yeE7*gLorzV3wZo9juPLY@h66$y+RWFWYmV`qw!JKD5F5NBpsPX zBc(ANWmQ8G{D2=0!3btFd|4X4qtTd6Y0L|W7SMnntaTy9 zfS(L>6pPcavNTGLMq@Fh(H9a+fCl_zpreF2jc}Gm)zN62k2LUZF(jhCXZXoLNh#q} zMr5hf9EA#MCu4LxK&K4oz)uER$_P%UB1>odQR#R%9fNA?4N3N}7OKh8`Swxi7@Uq5 z=+pq6nqjSUOqR~6N2TNCbfBk+4$yIiwN!1E&a$J@@o_qSpfeumj33rojafSVN2TNE zbf8YeTDmVPY_HZVod=FeC&1|x0i6b*(=e>Pc>RnE`OZ2jogz-hq%z?lsd-p?HD>9o zIVv5K(+L8d*+6IZu=e8Z-WKwmaa1}%P6ygZoC|d39=^TW{#|=noKA@9hYm@nAHKcX z{#|>8I30*9&Ida458qyG|E|5loK7*&SqyX*4{I-;pR+^0YmQ2%nA3qgi01>H^M}<> zYnINAqtYqibV`BF6+q{TVfFKEN{8u~+jLY)rJNF!M(hVl{ljV~pVIAFN-;0wa(u{t z8?gcidHy5I*Lz0KFxn$H?U4j+W8qwFEpYqP|767p=_5IXGETv!6x`nJ&5kzXsAVkU zRLTik`^xy*H{y^r!#paTa!#j$)2ZQf%>S!(1FZuyI+cX2gEf5AnupB#_EG6naynI< zPA#WXa>%Sd@hEgqN3W~v{(0az&>ro6SrM9K6~3y_C}+RT`F(?xm4t zSzuw=`1pPQJaf%lbDlHT)OBXgocm^!D6GWKeX=>_BVyTmoW~Elo_!Q} zroPy$y9C6Ot}@QBTNcq=mgve_7GA02%eh#z>c|p}y%r(@xBn9kkVr{cx|68uZHrhY z9P4S(PzzWI)Ur2BFayP((I+@uZSl*!3gtWR8Dw8ZQgujDoptyilly#uX8r-1RM;Kk z-t|kMtYz0;c16zmCDf?@G|Q&3zr`Xvi7c&7B-piHr^6p=WuY&5GIGj=KjR|rIy~aD zg!l5h`;3c%V^a@PNQ=+YO@(B1XPDIyyIr8^x{^&W?J7q~gJHMe7o_JxKWvsRq_w`& ztLsGMRu(`Cwt;ST4*v>R@yz##es#VvDU#%2tqJQPvT=A$ld~<^Z|D#*a{NxOiDmv5 znIXw;1uypA81x_DeO}c+iJY4mf8?3gl9+Ox|FFzg7e-*@XDvd)j%*&ejzJi{>&XAb zy}O|Ot4_P~v<;bSOG1IvX5xyioLzYL8exxd&U|7H|+k zcwh;~zAJ>#V!#J0(T)E^?k#Eks4~F**H2<%r`Ukr@Rh5}B`7b`;qpP)MOs=@1R z8+KPt0G%-G`yvZgT3$d3$GScg^pB|5UT#zR5PM@r<5D_To<*AcCj5C?s5M5|8kvwJ zQEaK$zhUrS!E9#?GMBE0+FEhs${d-d{|=J-t|oOS!Nf;yOudFYfx`!Fs+$>q{U}zw ztSw^A=}kLzf76R14cKD#i~bbMKfV86rMyxjLv3ldFeDaVW(w^rDuH=Kl>Wwm-cu(W z%32u+avek|>UR3%0WB5&vW_5y2*<+T$=J@#`LqmGiWE)GIw&aW=iWWS+xoB9@bA$x zJcr_?`fpu1V}AS1FU|Loezg!%6PXcBJ*y{VCd7%qaLl=-VoUk#V<2{Py<8DJc>C#m zHlQDFHu>sX@tYbp&bzxGB>Y@1SA|+CKgQKS@v*i^#pSPbbSe9d^=2taQk)+N*=~hA z&zS2G{z^Hd_p=Xrxy^-M>l+4+1A^t=wW0S}Fti?m* z&;#-c7|uj&VeRC{ojEF%r}Xx=%bb597GWe(Lvi3_*PxldZbyTfEDVP}lb33Oy^ffC z9!kP9-GUt^)nj3vL0*+=8U_=itO@k-wE0~e%N~1}tz5JPJ5pj7rfLM!?8No&Yp4q5 zUUZAseusZ#ebmuNnEcLYz-W-pl|n@Eb@0GDdZp?V8ajC;XB_~^4rH;HttF17c?$c; z$KE?J_rEQ^giI^@O=t{%nVjLnVoT`xYr%TkX+Ql`NcYPhqiLD}n~W;_5n#+4LESIR zpN$9zO}4EZetb?vMB%?##Q`tm+-sj0eM_W)3gmjG*l~_4QW0%5DHYWgmOkr8Ed-`{`6~S5~gMFeE;%XK1D|R8UvzV)dnLrWfV<4`ltpc)s^bW+F>Hy==Xw@elgEL=LDZ zKfeq=|1(=6(N0s{i=mP!EbB@X@v-W3f^P2Lx6Z0W7fN*I->f4JO4SA1GR@9Tf@8kA zOZ?VJ^c@JV91#$|eWoqY2iVG5?$FxntY8Y^t^gaoDwx+_VifN>Nj6ZdSa|mCS>0^- znqJ=&s%8qSyYlM9gKlzp>g^hp<<7QFqm&5lz?n;Mb`{%{*~x#b{rP;YMhL$bL5>Lc zc3v#r6RseP+8PJ#3t-jI|?Gf{g+>^nH}!NP(i&u;gU8azPYtzS@oo(Ha0NIxy82t z8|bqmw`H8-^>=t^7~b92L0~e4uWxPn$FAN1xmY0rTE2z6e*(?y1na2*Ao$(d6e9Z? zfd*n=KhXuL{pWlaPKbcMP*afmInC1O8Ews`@zMm>QMf1R!X}K>Ak&6I6=QPyJo#(Y zhb6%fFG{QcLABRXdha$$7dP^G zIg}{3lp8~T_Tu~PDIMpxLBn;k_SBXKS4D}12m)0F3q1?o6@3&rhYn|wQ2-MfUtgE= zPt=-^OO?supD(+Czs|hMRNRu9h^QPbf5Djk>V^|<-=%DJ8g2aq^!%`k*e(8w@mZ2& zQKtI0FU964_r<|b5yIk41x+v_GSUDbx%iV8HK51gZ3MNm5NXm~%C zenpJht%+g?PE{rqb^ebatH~%)6TqcU<%0xu3+E}L8xPq?-fK}o9aCq_Y$4$m}OoDXkK~i%Cw6#eIUmRN5 z;sRxRJgvjBHBbLa{}MPj*+TyuYPtDb!E4LO3V&W$KJuo+_fF`v`I5TJ_s&QHptPUW zX5vWlze4w8X!0JU5idwWjZ1EP(jfgt$YWqQ48VrUt6`)cs08P%=DY^mmQogWWkZid z!Ap$nke`U_S^bclQ@k{PHk2DZ)SeuPesIf5JxkUGn`U8!h=w*tNxSS%&HQ`U=YmMP zkW>2KcA4LH-uVaVP0WPIcI2)r>nEiZ9692-4ve$cr*9j8*eL9VEPba$9e7j^#=XeovR`BBHX}8(UEy2dmsMiti`D!Q& zSxe6{{%kh|&TySI&^lzp(yKE5$%YNkzNh*WqSo`ObPs6>76*J`6aXKgj;rh6C`vrO zZZn3(h9}&^Z`wPVSZ25*HA?LKcH}ku`0R8i?4qO>0%)`14YdN#`z{2>wuAlw{Qj2L zG)>2J|B}jrNORarBUgh}rZ7irg!~CS@|EJW>uz%)x$m87rQQ=pt_N_1|5|Tl`LKe%{Eq&$8SsfB6M)U)ztn0+38c2#hC|F7rM z{+8cm20^k)ezCWgyVh`ihsR$KoW`Q`z}>W%Uw)WXXISCvTe|ZLVTMx0-7T8vW^HLt z#a>Bet4Hmo+vd!}B7t-{3ltY!q~V}q2GK%bahTBwLTb?~be!vmsE5kK3nBMlCA5+$ zotlReD$XJQ$)J%g8h*==NzsWP9pa2bqX zO2k!PcXHZ>O^^ciGlEM9GU9!{4`h6^K?%%y;Oogpwx4D^4YUT29onr+Zpzx;7EB&r zGZez!^4_bAcyKE|f`Bh?I+FTd>ODn-ihxqo-*E|j(d05-9IX$MS(+5;JD;*#s7W|r zgj2yolS*XTa>BBt>iIGuDA^Ti7M(U!OSk@qp4upwcy}#m|N4_3Tz(@!c%5!TNN~@i zi~7K3ZZ*Om5EwqS{rchJK`+yM2UtJ^QBPCf^x*d?aI3u%_=lBftL-b2=!Ep34jmgXo3JtNKk3>=Te| zrhvsH0xdEH8}2Ru58v;qkI43u-fet0eiHw#;050;gGfB``aUS18POZ4Ahb%nan^Oq zkiK~>H*$#0pY6(993|`q=l_PHsp>8G)!B#P7owr#_a3Qj_e63NTFEg%!6{S!*8e)k zv(^uQcfd(D9H%Zja|aFv=mTv+iWa93`TPGWFo%yH6T4utb~e}ULYnUqd_H#Dw1>4t zA!D8?V28ZFIw8VScJ_jI?*gSE6ZeG4QK#KuBI}A54LzURFhYSS-0z(oOZaP023H`s zCw}qY{k=d1YPr$jX~X2UqD3>Y!h1wR7%8aY`YQC(gyMUy>-lC&4jLa6qZ=wm ze2K~qk|wI%)nfM2zoIZMUxe zt{;}X$i^#QZhZBUwl`UBvDNZd7#9aVVznaQomL1LwR96uR_x+sB+em8<0o#B}<)eNJISD%>Q+5S`n@UlU=@ zFEO80vvR>-Qy6?~5a5b|xWH_;OR;+Wf1g4WH*88k~UFTmnV5@oA5(}$L z({i!|Q?W1yEc5=Ef?yTzzi3>KSihXeFJW$4+R5U>+f=g8CE98#4nW6f(%QNNhjI_H zue8UFrUT?HYF9spTKWGpnXaa<;?bskqkRcYmro-jBQwaQg?85Eq7@D{d}C-+FOis? zd(>rcPlxZ6G;-}g7C9-6%>T54W3G{6FuVu1n%>)lY}^SiwhrgLbZknN57der&YW>G zlWV<`P(6>qf{!+QEL0rEI`_1y1*&k5^6V%eIywgVH}?V(A=T1VIDUi!$9#IR!%E+H zWozI}Zp+7xo5h}vWHnHEzwM}>C^4y+lT5*u`0B>JFC^WiP1d@*_C#&pVV|cNhKmy^ zAb{f}=eL2R6=$y0$Fu zS{jFu+%I&($T=J&3{v{op|e>EiYBtyh3b~=J072&l_p_;w;Bf{g$MNFgvPIB0a5F0 z!O4o|%ualO3I}w4wcqA})2n8>#`nC?(}Ts+WN?K84hU4s6Xvw#EvWpt1*iZpvWML1Xia}kYE+_4`u?-Z$914B*`f&Ys0QS==XFRT{`^n8v zj8$e*f+`jnVwqCMg9D&1J5Jmp3z$Snf$=>YJyAj?{*Db|XgO!ds;jSD%0rx9kV~a| zv_V@AEHwbDuMI{48g+b6dW9!5i`EefSNk+^!U(eH&hVYPlX&X7` zNvzd2;YwLcES9QY4(WzIczMjY9WSEQ=_pIc9nP&c5tO|R-@JkBCF!i3?QY4jh{9*C1S|CgU2F6Z<0IP%ZZ zCCq(mltpG_VJQhrLUnV&Kik>2*fLBejBAdF^Gpmpf>&H5Vnl}>7L#jbDFn%i2H>k? zKqH4!w%#^tf-BIE)TYHrO2_YNprAvqOxG`AX1HVgJ8bLy%u8FHwBn;hPm?&YFyLj* z-nn{K3O|*$_4edTO{#2Dz7Z~q5Ay&!Aja4OP>10R3(g>Ss++09Xl~a&X&reK?Y*za zgJ*lMq8MFH)3l*iO{J#CreirD8vnQd*DYhYQJp?BK$FfQ zc0PX)f+EBY86 zAs;W%u_zHIM&UY z#BU6hbQj7RG9nuu=jzRS-)C@j$xMdd*G}kL4=e!!@)GM!)6W1Sza)6wE6M7sYO#GL57N zydVe@6SL&`*lAT3s0^fV8u%wA8xsAMh#0H;vWJ z7l~b>hf_*8D8Vs-63x6runDJ_Duoah>qNH{)3mzJFBhG#%Lsi6^>&LK&MHQaj!OEbABgT?`1DVntWpE4 zTw^AD(-UnrJ2nC#ysyGPQ!&>LcfFkY!rCBq^$^&6Hu;O*l+|T&(RUj5h-lF@Gy{5D zOqq~mnTYJZl2lUi=@=Us6oBo~iGMT)y}pExyhhQp{&ul*FQJMp#e~TIT~&kM)zx?9OGS=U zg-LSzx_3{rigx;LkgRtpOiP8fBKr|Xzb+H5Qc}bHy@L0Q&z7KpsOtU6OFNUR-Ho#e zla(H~Od-7Un)u_zaX^nkPpxH`#(LeEA}&3csZEz&vEb;)0(H;sOJzolT3N#jo2*x* z7B9uWnbM+QSYvg5eQ#Jor=46todwHL6PFXXzv=H=+E&x(u!W){V%_6cp}{xztS;9- z+wQ4ffsYEpvGkZf`*U75Wl>J0!kA_5M6SOC6@l0e!)n=!-_QQQ{tLVz^CKK+N^w?Q zv%dk?IYS=D!nWy?uFX`W>w2+jxL4Vdn(K@l9n^LdN-UJ4W z$Z~U02#%@9jd%3RswORrh1YovRvHzQguRf|A6*gC=)~o4#ehsQHmp+&ICruj>kqJn zf_L=6#?vU>aGpR+?*+D>@#PO@uYGMb+K~Dhv+2WiCQ3#27Z95vFcUd=K^xUN<;y(1 z4O9SVy6e8{^u;^u%{aUv)#O?@d}JTe4z>#k1c!&vtg^{DheVDB@dKGk7~XVCOI@5z z_4!IM&sBes5(j_AZs_Nu>eyia7*acg*7Y2gDk33W+d2X@M$v# zS38cGK+;a@!)jX~t!jsau12R>*~zeSz@fHUo~y;@72{R%nR3A0|8nvr0gsl;0p2Rj zYm3|G`eo*)FYZOHuOw;{P5e~?jsGxD1ZFr>8@inf0GMsu6YsC!U5Rk9Yq(@0-1iC| zZjUw$3ys!HuAd&R7aLkU+R-2JHefd(bs>$Eav0HQBHPYn^~Gb|65U;R6RRD4LJ+Ak zl6sEEnkG5`5>YB~7^%l&^`vd&ctI|pjHM-jkG$yRcF;&9zEfp!h$J?rCZOd}ZpBx! z18S(V?7pJ)NuMX6BkGVoK_G1sU6aaM!kh*_ z!m~@Xf33#Iz5^rF+4{oj-^J9ZCe7W;7|0Z#y*Gm2Xz8B8e;|;xXAv-hda~EZ5S~!O zZomV*WXb}jS^#Oc#2Vd?rOo}jl(QldL>DA~s?YKKJwK;Tyu;~bwZsLJOYTUR3-TQO z@P z3!wSlX=BZqpm~Z)Cf^1Z)R8$ASTx_*eeP}koQ zU$r&rTxpwUp>z2mnD<$P374}-hr56#?kPv?=-XqVI$O9DZHZz!jS0GZBH$};-Pu}3 z-!l{I*WlE>SzH>h3pOf>tan&GJZLQJ=W1lQQ8ou{GnzmBfGWO5rd3dHxBZ1nF&YVz zXy)*s(ubFGk`SqJ30|y%gQ2l*=WJ-LmjQ$EKKMQjPpZ8cFIB9^!D`c}6b}A>DYk}b zbK)sqDbM-lMfs*CBhtRRI(3OsXWM?_J)+_rBS+Igy*W&`CEMxT(u5YArcnu*Z<3GWrBG?L@*c_Y#{c-#_DH(@S+$oy-S6x7TnjOGQ_lc6 zMGDhTA>O2C1CDFa5hfP=ia`3D<$&(bRf^^(;x>G7NjHP3!KuBf$8k;ifzle32&gdH}9C;u4!$Tv&1 zh2$PcT4G6N<&@%c#^AKxbDRxRttI)O$pU@^TQ%V~*5$oF`<;kon@aUlSs3eN1bxWl-Ez`k^SUyzthGR1DltU{3Aytp;?>A2heA z+Wnu|JFaB={i6SgkeMcNT}WZ0D@=NNXI;(fd9I!I1qQ}Y?-GDLY2egh|L#aYcYLrn zF)0A2PVle;{(K1@7OS!r+H*Bmw_hL}w~=~qCy@E&7jmT>T!{K_il0y}KHmp>PNTqT z@1H6RDRieGje81TiF(GVgy?yGPfR(CeJ?o`oi?46FAwD_{B zBWKeC9kE7J=)OSqh77d0J!sc_FWDOv*oJ`pHMtH>lx|dTS|Jov&aa8#J?e(Pt7D*o zv`?Nii`MJnM0sB#P)B6U9)C=leqeVI)mqio_UI(^1?jj^_-sF%KKPk#99E;o|HPLy-&b)s0@4OhF6$f2K!Q0DNL+on+&kUfxb!HYJautw59qGl&lbT*kB z_z2*_gB0_!RX{*qIb$lwvLa_i@F|3u6asaFt!6rWm=w%6K4f1Hs^J%umRMV7)ztGA zV)V(*)9hcVu{=v_|2U1Rc)_Xl0sP5a>gk~rvpH(EfK4k@sQ-~=GRLiW){a)q0LV*x zfsI+x4lg`KX)T^DjTB+?q8YoL>nk&y-vp*^6`ujF9Q6CU?+R3jqXyUV)6T35oe4Oc~*Rr2>k)8(Mf=JUHmD>4Xw)EBpdn})C=E7cbkNu zw}Pec3&IO;VJBcI*1}87Q#o!V;!fycWswrz|8ri9584svPF@duc^ydDa{IJ(2NX!R zor`|px_3q6lWyv_lLmYvZYwpe87{uY#r`zyPUyMi`g-x?=3$Z!K$kupz!|W~PCrR3 z-~>!VHU@F`4fp}24B!FA?OR){_U8qhec#PiSa%Hg+yBp1mW`i*_=!H z!x!94Dlf5#&(;z`ytpJ1>>qX+u+n>a1$C}oCDPvhf6-6FZvRy;{(7CKKwlFpoDeWJ zcrLc>;WMe7*he$4^ExpiklBGe%hu&VPOEU+EK_JY3UndfJNy<+9dp5++&A9LDfK}; z^RE%fc0e|n6u$Sx?*u}cl!rlu&^2R=a#du1hLV=h!|W8XN!Do6m_I4@1opv1eOr-# zXD5;}UL+Wa(AlT`7k9BktTR~OuvYVUw~ zL*0#Pd`}$n4t6Cf>@XvT#MSHm2SqkN+MBM(m0H4oE6fImVT4!Qvmn32Mtx$PNc1P) z?~M|q&^c*kK)MEVCpG85-U(vT3&)U_!Q6aQh41!~0qWe%I~4y2(u3YiBA#1Z#~C`y z4`|$Nm zK@7+|5IQ+G_bp=pq-KJpd-da%jh9aMlg$hAT8XQw^7YiGf)>4Pq5-u&35r7S-)j~O zg1(yid*@BNF`m8yqWZY^`Jj;&>Z&eVPLMm8`^ zKxE!eN6auJ%f}USnz-0|x)`i3Xm~BjKT&0xEek~L@>J-{v%{O=C|RuC3W@Ahr$aA( zM2HM^%i}O26;Qvgj_od06L-W;U%+w`p!V;|D|66A7x%Il8H{n4BV3(gxNxbJ%0NtR z+};qz)26OczII8^v51Y3gnE+Z?RdHPdGful8(lefwmSw;URRk`*Md2zwXR?H2w9aY zmRaxNQk=>p(AHMMec`DUSzW5Wqz#c*KZrEM3iXTJipmj{Rywl7XNIyTHwG(C`-@v% zfv&uthb&p`7d|!kG_9w7IB550m`*-^wwGld6lc<5(SOZele2fFSSv6kv1}2A;lJmJ zhnruq6dZVP70fF1d1rnvFx{e~T-B|C%u3Ohp2i;;4g?pJ5$}D0SgDL2>;W$&BQ@Wi zM-}2Ojqf(zp??nl*IGm|lq@TKmieb*XgHCEHe}{U>%VNu zwf0p=&EHko!Bq~vYB-6S4_T|pAm&BaKlTc#biSIITCB_cc9=z)eKtP*ktkX_K+n0e zW^2ZZ?yKj5@S#dl*m4!D`1FCnc@_M@5=McygHoWSSwv3$y4}QF9cSyGtQDon_$~;| zOzM2il6xQtJ=*)`Q3IoMwqHL=m>VOk1)$tCW!3MkV6+Oe;%e}~v%PcPV1=2j`^ba5>{xU4A8%NxJ+D796Kt#sCPmtWkfV#7U>~m6-AE+kvX;~V zqg!czB76wU#`?#TLuwt3%1v4}I*!Pzt%|UD1lnFir}i%~OBAO~MeNY5!43mtqk%+W zHVtIt2mObIK7TT^;%jB}e_}BD4rjgt$2qoMF5?u%g`)8PL^-~L$*q!I_9|CXF$pmN`!HyD6_ z?5{y;aeU3cQY=tkXjFc)aj}U8I={mrn$Z}6U<)kg-MEtmN$>$z_t~w7u-el;E}NTw5+I?N4-R!x}Yl(;DK@R#Wqy|A--0H8KGvWhY>_T;H=+ zcO4XRy0>k8L8vOe?x|(0n`IMAHvv}T{L z$Y&ox9mU5|HN|9q=ze{?r|FdMT9jVY{xOYPRS$m1Dp^n-m9xk_>oAg+(fk5R$6+3w zm^7!<+_w_my zbuIKi$GHGBh)b7BeUKZ!;UAd63!b7^R%Iq~6b@YJGhx49#+&vRaFP0!v8|k>9MEOc zaBBT3Z}Q`#$~9rX`Y7-^=-uD4o$`X>C{ER}cWneOTgsl9{PDHSU$LWS@Xbgx-(zO* zO-SsJaP=Cm72W5s_`6057+6z}iir-dj^b2#NNS@di-e`lNr4+69Xf_4{UNzyItD~T z;wXYR*(E~+6it$Rr!rJSE2`U-*x@y{nWGOJC;by)FXNzda{F7PXf&sn)uPvE=zYw1 zh4xVXYk#kCYEj3H)a%165oVHQq|I2)Hmf$~OT&4o5^|z_=S-xC3U!u>KIN3pK4TT} zq;0Yv$u9+t%O?L85fLr-8tE*0Wlt9~kk4ihcv`ETaEt%OgQ0Pc0*LBRzFE+rZCYad zI;+^6Ur5NDA6}@V7_6a3+O&ZG10o)Hnmiil-)GEB#KH( zN!hJ=y4*Vgfz{X#3!El1sQq5_+CkQD^vZ@*nyoig z^0}CZ-jJd>B@pAs^bCfd))z5- zoSN9-GTk=L<`Gw4NJ$r*ONF{gWq%DD0gvQ{Ml?*tSc0E9=q#j)uW{RRKJTzYTMx-S zJXFfb1CH}3-@s}`%Y&xP1&)pfD%(gpldoLASv-jfuZViy6B4w%1XgZ!>q+cT9nvud zB&&F3OTWD@SpQqJ;LN9zI1H6x7z+GagK$jLPxDhxg!`DM{GtJ+0#}CuGx)nChag$N z(V=$kS&WEtXfwat>mjGnMj`vqIDR*=Ay5`jYUtMAoXRe7aa5GuKD3B`R(L364}==J z-Fjmlt)O6t4F@GAG)5pIhEzN5zQ5h!y9)(Q-|{NhP`|bwKe&$=V%|p>z1`7A+yymZ z^VyCB5@h5nV&a_AvkTO~pJ?lK=8vocYYH>uZ$gnp)Np=9Wppq`JrCNtAg|wz=Q$a! zBxhmi9~DSWdHzI&7Z59X9G^j%4NT-vU=tg+)9)CsQLzX+(C<<-G&s;dxMRPEe+N{( z9|SVmV|t*tuyQ-^TU;&1^ezq_+I;sCgE7b4X~_K^ROk1z*`fbo)-xAYd*fb~ZN7FN zzu}k{Sie$p4KCQFs8x##@cU|2IzL-*w_)Gm$zj%GHx3AB{rhzB6+ky24-M;R*YWOcy7d?}u|XOibEEy*Lbb@VM5JEneS_ zG;SeqHD6DArfieaz`xDi?BmCt&;^CTo$(F7T7C3aRBU=SwqEsq%AdEf;sX?bluh7| z*VYx*^^UiR9j@yXVf!sHpX-w1<0wQU>*oyy?_jq;T5>H zwe+LM^FI)fZ`S9>%H5hgsJV+Az{~3;{w)1&ea+b0?~w1Dn#~i3xG9A*`q+nnxm$^* zQCeUt6wNn^dtO`b45vS|OK#_}l^hGtlxIhD*T?&O5pEb(?V@Fl$u)}?<@q!GA3CbpssB1OnvwYTP{Dh$dN;WYZk$!m(EU*z^326=7!{pjKJD16WMU1d1h40 z@qe0-=Yd}=XXot)?#@jxu!r|5;G=4z78(9!8_NSkyBry{YGj98>7G|SL;0byH`ez# zK)zJ0!1I9!t=-9dY<2caW_89F%j|G04kb`gIRW%(?X-*o>IOpv&g+&cmjthqE|&~F zcj!JCc!*QGf@ZM#R~eaWzr;UWsgrGGt+Y~aT#f4nTR@(m3!2O=@dkd1%UNDSTC6dl zs?FOUgTlYeQ9W3!6qau5%=|uHuWHO7uQmp6V@gh@zhqM7^NzV#KIOG0>3zQYv<~l_ zr1N>`6?jYL;;j0TL1(W1k;EzQ&jqLECgD+G8ThPmry zsU6n#EI#x?B?S(>aGw)J6|&(SZ7_;coag3x{cXXJtTnKAGoWwiN#FS;J|ue&=F*+5 zde$onOL%+!wxHJtvhdvUDfR8yC2bhVVCAZDDTqzvI~h}{9`Tj#>uF|#c6Sb$IJqz% zOn)YndVR;D^VYMdy}CQCOXUw(`%kTEN_;8HXh}BA%@+A2MxemvOl(DW5oNbh2_Y41 zT`ny4XpQmkCtW>c^2lo_z>58p4{w=uu5MkUUc2$|WI>;$UQ|C?Jugf>4W20W+G%@; z(N_k`wn2gGKaD_;zh}bL9z!G|@xhpN&gu!VK8o7?@e4JcRe{+lVk4}Gl3QDB{~-9U zXVZLn9Re(g(Wxdz;$8sb(jbUl-Ei>S7{glp)QR_!NpwTu&rH4!JCz@{;><4B9N1y; zc-fQ%4PUU<0ZGZ=)$K~9P-p?|p~Ux(wFYO&AKwGm+3(MjMe_iqCCRndlkY=yyrV0E zhq%QGDqP{Bb+~2wp^9Dmvo|^{b2$>1%b>I5SCN+T_KplYHBIt#zU@$T)H-6D>?{|*NVZf!G?PdR&o$E*Oiy%%0a)jZuW8tS0j3C8FY*c^XqrZjPX_ltb)RgLpv)x% zgjNw?hRo~8I1*7Yc-jwU~y%SBl-f$&#p~y67Eu!}m zc9-|dr;C`+eQi%RL?>=cMY3tm=;*WK15Fa@iF72rbg6j|YYi(h@f+V&e&DoKk1=of z7nk|XjGa5aAVD1^xVD(E>|wcW3yJMNzx*si3OO;AK8lj~rw5!ji2iYxNjrlSPyw== z?<#C*6(YQ208>JgTEdVCn7jF35?wMs!A#GWL5t!vi^uArzdiEmLDT0%jXk7@vfy6R zXRXsn?vSGlhMut66rV(SM}`B4hwuu>i7snQ_D9(D%r9){95uT4x_|^F?|gxk@xlBG z50Y|*p!FC#*YUzm#3OGSkTLA!6HIB^=5Em3ngM-K))ajx>cxNqF>X{D8h8IG2+eOVo4yJs2 z7$kKi;^2=FFY7+ZXnNb;BL-z0d{rrrTMUV>gQck864xDLk9|LPObj)+);06zl z2M?&p#|1(+SQHi?bZ#Ne2M)L>#zP9cvz&b`mqd)hQ4|@{EE)}T5{kP-Y`;;M(Yt_y64MrbJFe3rj$~xsrw)>p!^SNYpE?t=RyyR{R zAcVtAitY0EHKcm7Ni|b+1c`NG~M$kYA+H>8ZpUpxVyJ#L}NUPu-3@Dw|i%${)~{d zuyMiCwJ@7^9rwMdK1jl@L?5JNN8 zzTf3&UInt)d4vkZg_G>&p#bhUZ~JTDyKy@v(a9XhM3ZTep*S;0>oh4`VB@t;xAKt1 zBY0M7V1;O_#z2eMxp6LXxgy^$)H0y-G2+OWVn!z%knngrUvnVuVmCAc?k7trI zUHJ4^JZg0Avnez}(seBEnp_sSnSF-}%ZeISXn|reg$D45sUO1f1(<^w^XrevsUP1u zr2#kj{jrwT+x!a)+-Rr8STTV1Azh|uu!dIH2HAd5$LClvE2#H1p?gr*+NGNwORYD4 zJ3w33neeF_KxHyt03QUj1tPp(1gvq!fwg4_ViSK9NuMJ_lSi9ajq7*DAK1d;)E67u|7UBf8ZQ3WiN%M{nfLGLB;pM8_}S-LF=K81)D26Dm`n3 zg$gTML^mjQ5l7kS<)yR{vpJUd7(rSoAE1airVo7gz4yfgofXb@CJzDtp4zAsNiO*_ zr7%5#PuF4IBdF*uosN^$9f9FUoDEcDn=7lIH{1ThhTdJC+xS@};9kUzP&J{ONAhu& zu)9(Ymk$5Vo`e}o@0x2`&X4XgJzCq$C)5yH&%1>QaD@g1-&upHoSWXC9+E;z7fL>QaMp?8dD*qEm2YJQ#z7T2>2&-04+)d zMrqv>@C`n-n^yBQ%)4T~xqm7A?9pJoZ=2ju#y5JP#=~Q#LUZU*YuZGoac^+>(wzqy z%(1tYO4<4*UhNP2r*Zv)8f(!Dsv6*D)n;M7ibl7?m*6C4T5I>D+2&di>s306B|4FK z8#tJ;-}C~^(^>-IQ_HQnRh(_L?rObOSZKAbZoS?}v0c4G4sk=?p>gpBGn8PXM4zl} zu+f#u4veBSzxFm@&Ft!G;9UFBY$H0eIs0p-^W%WK{&f91Ys z%@;gA{5~qtEb4$u^L4PAU>cJWn{V;Me$j_oZNH&o>a9xex z@!~{k5$^jtdBvlz3KFKQUV1PwOg1dn4_Y0bUt5B9r(Go&vF}A<5^VEapHmyP08S(X zzOUlq;K^s$#iU>W69zkT+n_J4p z^GJ0M@u=LUsrhVZjnsr#x=Kfzj7?-kAbaKs@%G4aS?u-k@#5vtwaPsyO;8ehJ*}Gc z(R8<5ywltGfX~i5T>MfJ9EZk(8Nw6v-zQ4v863$Gf1nFp*LNS|a(tS4J%h)=C=9bG z68ZH1=z8yPINSC6J9_kp=q-qlh!(v^2x(d*h|cH)(HWhP=%RN*^xiw8M(;)+jNV2a zWemR|$+MsDe)s!FjvP5m#&w_9IzMZj!+l>9Ebd{-l7LCnNes@45(5{S^qesya zYh3YNYd`MkNSefQhnZ=J@>+G2|AOwvX>x>?Y)h`!e%Y7j^%cwLGmuoZNqVrR9v$U| zUtM`AomqjMos@$7)NJxI=KCSLOW}IZxn+@q#-`%$?XZdIX0DrMz0^%iK}^z7}NW@&4Va#b`rT3VRHAl7hIj;fMA!MLt9;c^%h}d#z7E z`lH9ljPo!;r-tJmC4V=40ZP5;?9QF25dZdO=Q3Z=5~ z4v$=78Ly06VW0dFU=>0l0w!J=2_9PAj*nS$_jlPeOJNR)Nfm}5DAO+|hRifqDj>%= z0o4g_eM47Yio<$+4li-ckid?$g^F|PAlF1y7tc$M8Kny1*yO@NsWC&ah{&1yZ-VUj2xE5FgUViFU!nASa+;lnTs#EWC zkdSjxC28L;`CaqDb1Rb4FCDB+86UJGh~gV3wu8$=yKVsdq?__Z1wua-xxWKw z`oWU8{YG-%$zf7q<)arVfjn%osy21m$MgZ`K@VvN@6(AI*W2Eg=k>KcwFE((sd33a z>;puehJO=|3tK_`(n<-*i=5~DnU#!^SuEe>=^!a>X#Iw;}W-QYWt;(gh2Z34z?G#Ic|`^d;xlFhYdP)97r+0H99f=nfVk;%cA_*2_pias#FK)Mp0J%!|ms)inv8Xh3{v0{p>7j3&M+ZOx4uKUh)RRvI( zy_7?Ht>jHTmO-k$4q{ZlJ8AtjfC5V>?tY-_`Q@HE^)p()~m#`q9j2lgx5=DDOt1lf_g;R>#n6Nmbp@xafQA)6M_h}{nj(8dHxY?dzS4k0I!Uj;!SwKF`LxQqV|TeuHUX?z>w;< zN_v#OY5Wzrw*&d8!M(dYG{S7{3beAzT$8dlQn+`s(jh-p+Gkwn3$LKAKA6G245Ja= ze|lWW&mbxTZ#<`so-dsYM^7XOO7TCM{CZQ``&Z*+|Fx69D>G**gFihSf~52mK#-RI zmQO*O>%E`l9;j`2vR1-r!%VM}$w-Ga8GPNC<5i7vu_diif#>FZg)k;m^gBGT!*Smlwle2x>^YKyytA-MFfogNAnh_I3{Q}Xg%uZeQe?sSXg*4=K` zr)@~8`Pt`0b@&1&)L^anYk<4(p+Chneri1W;nGYf!99KdgZ$7|h+NtK_1KT=RXfTQ z>4`FvolT-=+Y_~t?Z4Gv0~x&5c*iU(I4ohkCZ3t18@a|t?914<%^XL^u6P-n|;D!+Ymsm17 zG~M`CfBC78q?;lA*Xp-rnKgz&t+u^>_lt7NuqhK% zpZwQ%=Jp`%5;JDRw=2bTQAhRP&0hWWBc?FTIP5JFO_}+)8(5;${{BYSC>uO06w8KE zxp_?*9DwfiJts%`-&P4d%Z;!6#;hI^1A+gqW%B*2$SSRkq<0s(><#rKVgT0$`Crv| z+ZY19)mwrU1~uF608;Aq2(&yg)W0^_n{V&C3B4^l2eSV| zK)?}$@MUuxvIC#V zT^K?BF)oPZy0X8?R*_CBE`+%?x2^WTK;Tbz5&i*-kdN{SH{Bn`1E;e8i}9#n!niMS zAaf)2&wGl?^s6L9^7Mxu4{~yA^C8L%5)k53XWn0iH`fioj6Et#n&eR5^uif?< ztv_hTO`oGILbGE(@TL?X*MFiD%IdrirHZ~$dS4@%>R0>qlC*qr_6Vw=!iFDs6;aCi z^WqyD!Q7Ij-J<*=^LtpzACb3b?w~M)a>C#2FTs&F?La&FL7YL) z;`xUOpHaU$wJ&t|421;@Iek|jyIcPQ`q#l#JhFs~Pb$i4Ak7`3c7|XdjGl%h3g&7u1d7u$;UxG>~93PvD&6q z$4<82ntc7cQ>|#dvr{ba?s5}(7~UuSoo4@uJn6XZUxCq|!X7*T(8n-Ru$NL3Z!g#R zt=&1HHj4#i0Rrwg?uKpEdeNMtQycwFk1=s2LI=M zXq0Y@Cd5=qw62svj{Dpp6bI!N|6fM5@9MkoVExC4|54jbP#3c%^C%Va(Vz^VSK8pYbX(?U8Ce@3zEf#VOSZ!nx%Qn>h^VTtc1 zHIF%lYW}0Uo3MPdD#6hEa1}UK*8OWYL-~Z$0{v`2z&=}5;2u%yX9oJtjLATX65@fu z8n^-GwXFX-^7W8L-{L5SW5Vj9_xCHS*VaT<1iI!XDoamREWvHzchpmFUYz#+pL_fn zF~#-r`QIVzp9FZlpG?gwqUhJj=y!R@@`h2i!U(^GxTo@46~Ed<3gmDFGX67PwH(qR zDF1uaDIiC&0OFFB`;cB|YSBG%_>y?L$KZhh-hV<#4aVQe8gXal4Sk%?$6u{?m-Xo; zGB6XBuO}(0PuFm>xjo=nK991P(+Kake=NNn!x?*KpVk1OPX8A4uLSWsq5sV}C6@t! ze+R06Cl!~k4sEv|=+XXbM%MpNV7W$pK+Toy1@pg%a`Op;XbA;u(Ywv^4Qie~y`{^% z>$x2CFUb9lHZ7WyK__>d{KUfj{>91bS?8auWZ9V7O7oZx|jH)&)At< z_P_u%M`f!{u75QF8A|)e^3lKkGh~M2Cc%A2I5FV#F;9q_-zCV*U=&Tz6{-^|!lA zv*|cO!BZ8U=uspMt4GoX%zJjdDYLd4UISv8Rj0j#>q>g_2?k0?)4DR8;1V?|It*uD z6vnL&AzUcjlZs919BPPY3S1?beq6Z{o0U_i zc(lGm*F-g-PMTlUIQD>X0cvh37hHieVczSbTf}Uw$)~LP))~X;C#0x54GneIIsB0R zi{=*rZjRiScXiqiox@7rE@x0qyn#?gY@!c%8VJ^0%r}dbZjRYku-^FAu+SiDuNT$E#Mws}Al- z3_d*0+#}1O#aD@9u%UdIb;YiKLel(YQJX*zK$FSLr77r??eq+yDfQkzCa~74iCGl!7v#BU+*Zu?+L!ze zqhou4YsGk>>Mt0yVx;ch&(@_&=PG$n&D+qQexeMGK+Xqw?1H}nUemS--A9zbWay#p z1kG|BGs~8pgRM{cTIBu26_eJ>x6P8|CRP2Z2)3x2o@BKth&`J|EHV!SIR|&%Ew!fN zEZamLUeJ4V3O=PBwDFzHCV=Uw2TJPQg*x#xkP33o9jgb?MD%^Or|x8;b@T&;SY;sy zc22!35L6y4MQE13@5<*P3RLs=Er}g7q>{oi-J=&{m!`W)aIJ-pnt- zS104dPhtqO?>=AVl4r2V({lPt3~W>z$vvfz3@Hy;d}I-qpK;`;2+Nv#zl9|A~r%> z`qm`xI^n!l_Q7klCIc&d);4hFYI~fO-=0c&#oGp?y8N~{N6>rUHDe~QYmcIn!T8j~ z-_wNcycifFrqjVb>AkZgGH64QLIP&^Ea}y}FgWS+IG7BQO<>&#>o|V(gsbgc@Y5}K zrx!s8_D;``-WL*?AAjwU_&4j;oGF!EF*7C#IQ!&#Uta0^;M|I z0}-75%|>wpHUcBy5DEtsvF2OoM12hi1PQt z$4x{V$uS~f-2ACdgU+O$`0(rNar2O`6(8_w(tm_ZR92D|YFHHhd`UvWvl~(9buZ(c zjEs_HKLXi5`=Gt*>IB(v=H_uGz9ziYmn6ILg!I0`&U~mU7L6mS}|wY%Yyhp6Q?I z-7q~EE^(ZRw=u7tpD3O(SN6|V)3k84G-e7$iS7ER`G9`;whTtZdToKY#w0S{_z0P{ zBc=B+Y$B$u?PJ?w&9%OXkvDu3!=@*c^+A1XJooTtHg6xs?v$OyBF(}U$U%>AH?_qR zw+6Ct$y>l1=aC0%_HACeM1w7MEHDkFS!a7?4|_6r;HBVS(R;cHd`%cn7ijmiZRm$yZHyivtXq?@1TFe7AsEH)G&2Qs)>7CA_wMWxT-QdLq zab|gki-~L2c=8-PF4*rCdLiTk-?oTr?pZqLoi}Dz>9*2J9!Cm)G^b2KE1!`ght5hst}!5{O+w;8+zQTD_gKr$0TN+RpQ2c8_D2C?)KE} zp%!i!TE^StYN-_StHn}1^!>qG+1{`8!q3gPm5>$ZuXe2^PuY^Z!dmE;2=VI}_UZGu z&pX90jE`ODcan1x#x?yzLi9%pi?q{E7{6>O5lb^yzC(hISu62MNhUXc>&3gJ0VKKZ%%i`gn2t{ecaS!sgY!AByQ13 zgT*zlQeED=#B?igeL-^%P3n%4CQd8k3C8LUb)*-U6xOF0ie#*Zy(uy$rRRbx8Eami ziMx;7FfR$*sO<-%Xz@F}A{N-{%tM^Uxk%x3$MMvOzvgc-+84JkAV z4cNmtL`fQo*U}}h6k1u02P-jUXc*T^B|@VkKUYT0sGp<7LW+O?XLLYKRDn72PB;CPv|LdxyUv3D|3c!lWR`{EBJ=Zf6IJHB`{_;_5{ zhN_0>EshH4O@c0ymhgd1IJVIO)zQzr(LMFk_uM_u6lh)0o+r5B4(g<|9PB|Kh_@Vw zC?vmiH@>1xib@~3QIqO>b$gfjt@tj?*R`L&g`$n3<#6Fkg2@mqMh&J@N>svuB@_5px`Q!7SB`;bq4D@KgaB^pDJDsw`Mb_E@#3G{Qab*T| zYCh7>6CdJpW!qo7;XXR+J1sReR;JB2m|I@IXtBs%zIHmXm5fD!CV5g9-vCqfRIF+C z&5tO?#0Noan$zI7-Ef?+lQ6Qp6~8rqJ*DtUA^pqWH4 z;%NX-IipDnUe<|OlkNL-R2)MX>!Dq$Y|kYYbe{$z&zrcKNM5YRLeh^rU=dW(^nwga zDp^;)CPgBd=Cx*kC{gOIPSRbYHe?MLUxZy2E_s1ZG(&7*<{OZv2CLv!^R4EI+U7DK z|LPY{Tvcz;78qaA7nmAE;X)-O0#GX6+nd+Y!kg9Zr-;5z~E1=dh)dwT5x5l&RoMVQp39X4<2U9m6 z;oX3)gC=?V@>x=L3k+m_+_>PlIsR?zr^N>tAH5V2dg|)dhc&*gpS7$#(|Gfk3_jU> zCO;iz?O=N0t4%}VUXbFJ#s&H*FFpPmvgSl1HS_ropEylp#jz#SuJZP|E;yZO8W_bF zPjar>VOynx1IieunNe+Fl7mijjk zt3`>hFQ}*O4Tko}rDpHvt-3etRv)>7#9LlB$}LQIEhd>|E^f*E%(t^WQzPuenYD`? z^md>>;0uwo_XuAt`31mGC)T+olKm;9OI%YO0s`WkaqQJigoy1rUFrBM`Z?wFW5ayT zGRJRif;js>y@Qy%JK@R>HJLv+mmqy?aXOZOsef_SR;c%7ZaD2hr2CCAuqU z4C^9e)xL~++(KlT{GLpSvWHRB`52OQcRbJ*Fvuspo3!ENw&+)+Ai%muz6yPq&&6ODu-lHF*YsLIQ!MY3`?izlixOE0`LRqs9< zW@F_$%4w>t6#zdgOkOGw<5Z^7g5kyYR!BuA8Tb-R|YB41I3o{ z*ECK|^SB*gXFN+ZE^k6Tap#ZFXN}M@hL*vWunLc~O5x=xy@zo)0}-FH`FXh&0GfN+ z_9pA}zpNq~pHB^7Gg!%J4JbpP*YGxM{Qmh$WtY==XTkbNL^JthHp+ zFrc6K0>^bhVcy0mhaJ@UW=UwAtw`o0e2|fzH>EqX8}0>Z$W%-8f@{d)ZO`a=s-6=8 zBUfqU*9q2z`btg=55gF8iT94NtNi>#I22~u@`tf|&u!8>$Mwk7U%6I$W2K>8+)l#E z^5O*NXc$C-N6&e?b zQ~We`KkL#JZ;1?&riN%XA5Pyy(?r%p^#nr@&0TcY>Qo^l|7$bOHa5(cx5g6{$IaOd zw?J1DlM2VL9HS;!K`^8GHbhMkDhU;?EH)`aNlPfTia(3YX4+clXu%p*vG`ciMErJN zjWb`!?;@Lj{l!7XZ zv%5n%JXnK==-l`XcoW_fEg|QeMXT>oJI=p=-mjd;g-zkZu>M4eTMj9*+pWiRDxi+a z2@?2XUE)dK#kq9WIw3!6-yUUqdFy$tY9AMV2q8T}YV-qrKxtY4h1M%_f(fdUO_iga zAuq(v%o~2L4hLGSR12hnWASR7A#p2?*zSpqyN(G>KzdjYat7)_D%h3J)vWBqr-0o% zu8K7a+wl-xz~ooJuUT9F02(BLeVmF}c(l_vROfrnGcH~z?&ILaOPk0hU%9EMKo z2RTEC%+k^#O-SRIQ^GiSBiOco(TvvDll~W)zEaMmCe-rcGPBm^7@`3IpT#5y21t%j zCvIc)6Z@#O$nJ60QFNqnnH`~JtDGndixf}zR9gKkeR}?`Ch9zAhffZ)M&0EL=2OJ6 z_7^uVugEHJ;I#Mr&XIQPa*;AIefI)*>QPCRfRCXGlC1R)dq#8mWg?s3e?-e09%wo+ z1f~CR7QISlqllU93$|&-(?O#FsqSIAq`pPMuw1>Q6Lg1?zEAvo2_>4!U03s3S$J)O zrG8t2$%@^X=7O*QgUgFzJl2NTGeekXDu3ED!{e3Rg9Px%xfmsetT)LtF=ppu`m_Ywu!&T*Zh70!Hare0w1Veo?a)-IqP$?nC4 zb;z%n)+C3Z;?sR~{-)(PVRU$&^3*Map~5lqDXAm15Pqf1`=uZ_!e|V6BnueU;~+b;`2QlBi*Q-_m*~@mUkK7FN-akS4(8R5ke#0T(y{+YLh< zvuK>UXuvZdwntz!1%@fw0yLN86Ie_Dww$?2B$N+(-0i8B2R=2FH0Sb%2j&oBH)H0v z6th@JBmhfs8!$cc#a|~}-Rk8p_C{da;5!&%oigTtMT<*oXQOiI`=aPD25`z-s21!C z+e`^Nw^HOqaZ_$x%G3reW?H&6n&^FRLMw7qg<1+>DWF3z!}3zR!@8{{CvhY&VZd2f zCCpoKL=3}C1~|y4yZ(9b7yq{_vV*5fSLm~ts$P(E;JpiKG0feQnzfOhq$|<`2L8b; zaWnc8(UmYW&%h=QqT+E6mO@DQ04+Dom>CSC4%Ry`HXR3NHuXdoBWsUP96HB2P}=!4 zq(!~41OC`RZEn8%VrxR;#A{Y-iXlN7oRBhsG>qL8UCKoIY*L;Eoim0!x`*xY(L!^2 zFs+h)hha3Sag}q-#QbfMu-K^ZyUF$3Gs!*LT@(I*GzpEZ*>-njyZwa241)R!qGIG7 zt(jO2iy?ZpAtD{jEs#iwDpYxXtADR|!70=I+2LM${YNNIzqT2X+E!;;_C%pktd}4k z>LZv!;TPlb{UoiZOi3;0!;oH2EB1EM0yLhmg}LTKy~jxTqwyVeh8f+v9mxxv5*-1K zUAH~J6ikn?=KUe+6s9rfXH_w92QSqDHbK+O{o>|LDxad@ z01~S&@Le-l__TDPTu+fI;+ZS%smu`05jg2yT>wb3viVMhS#e^Qc)$YhX&U^axx2c> zFTLDOf^`oJdTe6nBo5+Eclr~t6-iUiOt`!`>88fWsf1{n8})<^c&VYk z{G)fg-Kd;{wp{5N@aD&z6Kkq{$jU4#tbJ?Le7-CYpQffExipGzF@!^OcB)5QF>0uv z4AZOI6Z`0T+kFO`7HVxRQ%jrD6JCaHek<}lBC?oEY)BdMpsCa}-+C6hnkg07fI)3x zQRpMY<$b(B7!rZhHh~>Y4k_lG45_1d=5nWi!XG0Tawx^e~^aK(u*cltsw zv2%@|94mKKa$InMvzi&K*M&qc+N?|h1RXX{97Z7}=}^mc&xZ%0!;qSEXu*D1nd?b! zM{oH#)oQ@pz|SV$e96I!oWx7DT6W&qdOSiHpC@g zz2y>$ikpXywmu)ygYqh^h1wkvG}RZmU{hg20~)cR0I*Sue_E;00`U9&Q6qPAre`GtT@G9IjuG zekBRe3gU<2TQ6aP4)hsWtL5z%liMFfVvRfsURmZf)#wh0~#Z6>hyXEH3vEY!_I`7EOfARV>T=tYyeIJOKS5(5A-tm)f`U$r%-w zyT;Pp7AnwH0yphc=Bq{N^V5m0`Gh>9g#^X`x{r+1&|_Y}x)pa;tlO)c;!s?NI>V)MH(NW0_|B|x2GcH^Vwtg-&y zv*%)Jq~*qUEuWcyuDM34%7MpDex#v!{M0RB3#wC^koFk2{p8`aU?zBHGxC z4@l+x#(rG6tv0XOBc(CWtq1;r=~!mrax92{tJaqWBQ^`}Q1OcO)3#|Zv6Drw;>H-m zMixU^X$B$UhvtkxgNkQGqKAF*$(WhgXeCthwU zG=hhLW#?N%`Sknftl1Ay2V($S6lg2Q-w4z}PSog+_nosWXcytuf=0!|5=xujzWaED zZ|__3$SZyfR>piZCA*nlbh$SXf_l{biWX3gYIkbAiAx1KzpVPUfx}r|p0c|zvqD5b zyl5!JGJY4bUKOEj5+N_2V{bk9-de?w8sGl0&vGuVb+!&GWlmwA(}7^^lH5yHXp%cW zH*=~C+znl~Oo1Dt`+V}2cB$D6X$@nMz}QcDN3%BV=@HIPnQugk-q381DC~^L)>k-; ztd68+HKC_^i7(KVkgT)5JL(osuB^BXw)@d0Jm9L^ep?v9z&r+e9Z>tuPIpm;o9Zo^ ziWH#`E3hbLw+k?fzcW*zSROFNIwhWy)hV~gWLHp}p6U5;HQogCdr{VeBj3D>EL;AW za%sjs>fZa0{h61cosxrJ4f!FCqqu#%J|Fv|F5&OxO!|3$ysEF7JpCBDd-gztdCn+V zB@dBjr|7`yP?WoyY$v<^(Lt4OBSm^+aDw?nEO1T0xGRVSY0_CRJK%bOejaXTH6yp! zdD_i8_qkhc(ai~%?i*XKzxlFU!g0y64fn7-$t|OI!kRI7!Xl_3B;|ZkH#zdn+Q*J= zrY+L^UU#wGLxYgg#7!+Hsj`+ps*Y|}+trVakq#~JF&7KP_~lBm#)20qou|SMKZBiV zQ+-}#t&~E)lXlxTw1mH3+eo%NrrsH+5382YQBhk+=`a(@W_6F6F~i@6Ou9GBCVt;) zqJ3W6NZH+TXFeX^979%W_qe?}q%0XsRaLAOWumLwkht$!GCng}5P0vX!u0@qO?8EQ zS!1l~XuwRJ-Gr*pBUPBu;LLS}^WeheurlAB000YI?G!N}OXEW3{Cd@Vl%ca{FzK%b zs zg7^Azklki?3OEIX>%dbQV;fCiMzDYW>Es4a`KeCb8Ll;_*ui_uduG3(c|96Q7N zUNyH_+V_~(k_7|UN?5AMZQcJ)RGo|fXH=fQ^S%nOUy~!hu{4vFQ8j12>K_XVVS)4|(cWL3-Zt|Gp@BGaCE)bTi#8=pl-zX{uV5!_Q>4y5 zguDXa*|IW;rb1)yaxkcbX}~(~NK_UX`oWG+L#~d!oY{ETmC}^La-~zO@IklUsGM+9LG3@T7<>+tFlPb;cIaWF-LC&@}JTB>rPCy zQ}D9ri({bA#GTT%4~s9IPnnZTpJP0Sw=6|h;GzNb&f#B`$pU3q{d~M9p0!wp$o7w! zz*{;`7y4ee3Uof)l9^C)zX-B}3DgbHjN5rmF@ze!o?Zs*tG&irtQRv13+9gcPWPPD z_2TD}(X#Qh1UOmegXR0vyR$)TFgl*+4NigqIc8bH-iu!G+^ks=A|0d6TbOU6&uY$3 zNe)ayT;=Oc%q;*HTn;>}YlFk9FXkFteCf~18rh$yWxQY>wNEKM?@)J);@ye{4Olnf zF?G>kEw0c<|G4k$qkM;L$qdVM5aZR%TiE$*&W|Jk>)^qSUUAt;-Ic>L#eK6Ax!OfL z1^XRt+D(oVMb-9OlG4?Amc;FZg zJVQHbQ>`f-N6#8f9gL7pc$uch`m(^#sRz(iIlLh-xdEHHeENd|7*>D9vdg!W5*;F% zE3TBJbLZFmjCW`CbZ-soojzRJ?ua??ae�xQcWP7mghdq4u{x~Ev1$vs6)XP58M_L& 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%0AJOw#?CWiIe`;%J$@&YoYGI_~TNwC_Dl$P& zfxk$UisnI-=PuEzy-~MBcJdvfw#nYjShdiXB5b6D2>QRpccVBiR&Tf8q<)%OcmvFB zuqImw^zoML!ZkWdVlVwtg;QZr(XYU%GJXNY#UPumyGc(jnWxJu!q*jVd;2(n4UMJl}-`u7)}yd+McHw0&TE z=~-jwe*1ol5s@V_$FnOT* z4istmyfpqYJ5P*lqp=h1H&I?XZWi5t^m*#KelYyra6daw?N!WE@MQaTJ@>BZ;rsbn z>+LWqK8oR4E05cg7xzhC+)H_J2lC=R$&33m#?EiqKi31yw@x3qu?O$-Tq^uc?;{=d z_cOXmx`m9M4EQS_Rk{VKl7IQKUq`aB-)FzR&3?&QJeU17mHb7o6h4@Fsqi$V{!4)W zkz)KR`?Wj!^{D+dl{~3C+c5M%ej9SXC?`C?+NcY1=`%Kt5$y9Z$=>%o8t5_}l6Eg_XkSllzpLyXk$w@TN(I&}VEL6Q*2x z?0tx<9$>PTp4y-dClPpb1CQaW$0prY=pbkSZ;utYJ@7WPUiL=_tCVAq@b8wo%K(n4 z&9AG-Y2IGt=`ra0Z^c;j7u6C-xl!kr-O4k_MWX*;p8q)de%3$T%B|=TNCMnA31>_{87CD%>Z464)qY47 z74$_i$Nh2lo8$Vnrb@cIj^){X)2Ksc-EZtY)Nd(|bH{5PJjm9R2b*k_Otx%BTmJ8U zQ-4&E?&DK+ z(|Yd-TziTXMh{YD5!5IP;2!~--s+>cm+E!$v8skn? z7!gAbxr8Dizpw_#K<%9%aT% z2a!G9iZ~YRF?jF5_u_fnqfNy`b|*pyH^1uEKau(s5d9HG!#ab8gNP&m4Z=D($Va6f zWm{aZXm}0AdyldeQqt@8m~}gG>^l*E;EkpYME_dq2VA{y4tH5+Kk8jviaYhNW_3a9 zr^|D=YE18kk!TW1iIEp1^EffykGKl4eysCbqDmuvR_VI0JK%^f$f*hMvtzZ@knzcG zMUEn_h_@-pBE|hZ8Zyr51;{x@4~!?0tBCkr=SaxwF2&wlV4NLY76yo=cF=Fgww;xPljr#6`<{f8?B$fB`W91Ipy7I32 zyQ6`bLGJ&guFwfl&YlR&jW!UCA2T!&crqHGkrE${f)w&@2W`+|2ex$PS3!Ysa=5E<8#i^t+yc_Xc^qn4BGeHrmUzE_gaAx1! zWcFdIKQ2h`5wou!wEEgASC!t^X1S-Au`?$q5mtYTY5koBWBTyDx{RH>hzR(dXJwO( zdCMzRq{FRpasCl)0*^QPt)@BpcV=B5EHmahtjomTlU_s0Hrc++w2Rll8u6(nj?a|k z@6&OaZ9Fp*msyryo-X&QfRdkH(yX&+xj7dduXTrhh?>4?4nt>DEoc5^IHo&zHk#|( za!2zp!p5zKq(-nv?I7&S61tm#_?nle=?Jj%Kt}-9xNW(Hn3dXmdIF_|&{!l?M{sWA zshT6Sjc!9nm~A?CIkOqMNkNpJW=m_A`3>r%1u9RyFtfWF3)F^oeT)p0Vt z|B|CNq6;%%p*hXh+wd+|^GsrLIkN+Cy~&Yw^(R;piJk21&s}c(Ygc|Q$6jHpZsnm6 zxr6R8#cunqylr5OrdHR@X#}dDYQ}HgUI*Sp{bF;Rurmrjmsg%Nvh!dPbhJo8k)4GS zi6*U|foGu>!JHnu0qaycq0N$+rb*j~`HW|!O7U0O)`@2kx&pT5xun|R#?yd+zX@iC zB8S>sH>V7!_ynksZC;U4(L-kpywx!*ew~b6_YG`=*y%*?0-Ly4yp0>fHO&)$XhtdRYTePi=w6R?XZb$?rqSqIJ83_* zL2I8@uf>*((<(<-jh^mqkBtJINZ&_|s4XJ+)WivVqF#!gR4S7g)z$CgAb zxJC*WrEp$?PY4$)epgEbzHT0a`*2Xkg8jFL45#a`V)8Z6GzuEz6PhInG)8T`1kdB> zb6vei=5UucgBBKwU_~AxG4frxREaxLm86Z-X#5aDaIMahAyB#io)wyhy;o0ELH`2Z zrg+LU3N3$G9PY+YDHKy8 zaC7r2u+!^^{-{^*7#M~^nL|lTsMn^99c$Q$5DI8Z|7 z+W(E%h5Xp{Mcx3&z%H*KQ~b5{^C*Svxf?k146F-r4?=;K=EqS(W+&CrX8Y!Fp8$k> z&>Zf`&Vv9lB6uNf4W#WGeoQhboCos#YNtRndut*Qc)c?QG|%ByA}+h}?vh9?2?+CL zj3KBAT|B0@KsiiL1YQH^pn&7(jZPdlDD5#)Ex7klZ#C`hHUV_tpt_g{^x^w7c=ysM z%E;wWT4g<718)PIpnWi|G1~4dP6|d)t|1uR(k$ClERK&*pQvOo=vSvYpG6Ny#|?tK z8m;uFwek&UWq~i%O3`YiepNc|MHIKb!3VOzumsYuyotMzr70|ug{6j^noP$tli_(V zE{sc~tku9dFb(Ic$bX?*`M5*aC+;INaF1ZP7vSue!rfuuu1v%II^x#y<5V+n7Eqiu zWGbC&Q&>;PgY`A!Wm$f#+cJ7;OCQ5Jgx!rRY|z5O5roOq&T_<@2)JU38wCPz|>vUn(!L%ry9!M+sV9} zgCw>JB)pD|o3yb)>#otfu-dAP-Anb4W`A;AO7}22R_)byZYNxPwv{US9nmbD`<>;UNX`hPUG-16^H|vgkJr6ymj;V|N#q9B+*)m14d2DR9WBopTZ))5eihdy){z@ERsNdaOUn0A` z2g6#`eULT2Vxy1Ku!inH(OA&i2hZbNV}}u04XYj!J{ZRuMvcOI$@+D&QBjpPHV-z( zrkio=V9G7D_uZB9KIh+ye`Rv}V3)~x_TG{(-y?N5^N|7n;H~+f?yr2%`L@hvzDBUo zx&rQ*V@brbk9nf%0xojMV0wpu#6dm}`8HUKPOF5qWQv0djH0i9%jD>Stof;iJp5av zZu&lE$ucsJo7`Dp_$$YRcQxD{#C6M9V(A&^`RFE&NO}SbBmy*XD;6h5mS?^xJ(VA0qU>?C@g#E`(Uyy77iW$u+#AK!1@@@HCBej<2n~)ZLJc`%AM^6y zH0r#>EK^tSwy3l7KIrd3(4V+JYj7|J|Ix|(9IeU1e@qU37Fn$-ihk!l&?+4=PZ;k7 zl3k0uj~Ow$mWg><0V}%tAZ^8tz92xNzhYO&--&uKvz8C~%oOyAr>Q{O`n;*D`y>HI zz8z#=gdAxYnd|tr8FY0p5?t7qDe;M4nGUHTNBx@0QDJO2Q~C?m?Z^L`Ed!GhDH(ur zVvW|VY-<+xqhqZROzm9UTdyK_yQM)e)A{k;Z&w`onuQBvtS4|1j4xT3 zAPn;N`u+5L0b8ZSMvn$wH<0vqi420VT!>#7>h`C@Bfq!{vs?J&;i(n^MiDU18?7aj zqIlj`qO=#9t;E`!ff_skl6psPK%gg78;3PUo&IEQosZ|Kvl;3iTaS+h>0genY%KezFmA zDWqQo3-5vO`w0C01@cGRF-D3=PPXH{(Hyx1e(#6(;SMa%k!Ky~ujU~iI`BILN9-c5 z!|4@y?m3aRF3`Y6fL%5y%sM; z{RicoFOY=tPIDnxuQ(Df@=RI&nue#F!lg%$*z#Acnj~%j^kOisc#hrOkCyP34JAC) z(PgAgIf=CGE~e?d?ow{r-eRq7_W=5iWrn-Q!P-ot&nE)Bw^X6e({|Tr^pw)AUhhz% z-y1AFnd<$nK(uoU)H{HB+2Sa7arzp!BUlQuQ+B>QmwU6bjA-Q_oivC45T4|+*m9VQ z$_X*wwer`GHlOEk+vqQAM;ZHKdR8?o1WIbgAUNX!mRcc zTJ6&p=dI^U^h_uu`a)mne3|uylS|bdOsl&YaI^PB-~)h>OH#dbYfdjoJbo?fA6NMN zJ@t&+^~~;%e8csSB?)tRTXQL?E@cu{Vn`U?g_Exa zjAox-Dux_@m&!h+0_?)Rysg>Etwu)gdH9oLEH*fPfF+Pv-g;D67#?R)pnx!%3;(s2go{tBFX z8B$$BigP3LXf}Ub5%P0wKm7adH{8j% zjL7};SG}bn24SxOhzNZ?%wCl_e-U0KM7$N&loF#E>EB7umCoUNnoFt2!Ld@T>u1`g zrhcWWesi||cyyepKN8AHY;Sq?Ok(PfyuAJU|GpQ`_-+5aIO8{8>1)O;at%q9OjJ zEq{~N=PhIM#^zwqD>hi`OsYL)rFq8w^vEs6a~ z*K;ZQ&-pLx6FFs{+`3=;l+KrByzyx<B~3zsE7k;d^UU>H>}1^Wz;gHD$q;wg?IGfrh`ri4caQV$H_d&D z>MC@Fo#iC%9yg@+Z3pqWTjjd9i->wKgMJQZN6)MKI^U;Q1i+$y-0Omw;U%x@aJrjz zj};Fe-K`RBmC+v*Rny;5jOb63pA3=P@%v$!>J03O$zj(p68o?LR!-%ecn@LNRYSzx zxVzR(zQ%8#u7t81zugG2o!^zW-KS~s0*BW2luLVTW!P0jxJ!ceaZ*>n**u$6U3#Z` z0+F2Ep`+p#*=4avTvb}yWN;G z!R=9SwS9v}UqhikdsU;qJ3&jOLEsAETDShN)uye`7pGOd3S1UPyi`P*><%$@B1*eT zaQ^`)^Gxs*h`pl7>ATZ85vIG6sdwy`XMwv#PB$0yK))2SekmlH^5o$-lL7|{DFmt4 zB*na6bu@jR!xhEBQdi7!*jMNNTZ*X(w~pLOvH;|>s1ADjwj;KvUYjznMGK1qFxJW<813^$ocTi%pPEF`7Mlkgn}>UR_jO)R zeGNnsy9Dwa4x9c7^%vf%3Jk877n6q#d_TEZ6!=f=B4^;RQykrhWu4`3mOauG(X3$7<-cEVdQ#_}rr;njK)lRGzImMqDzG zG!fB(JJJP2<^tvIQrKBaMAgr?OR*~Gi^v2GchWzg@tL+HaZh~Z+cJwL)2P2seegaO z+w={%@4@OmY-NaCh&po3cjd8l#<+Fbw6?#&xV<4F4I$YhZS$BsnD&M8t)$RFL{ zksbQ(hy#5HFK?ECFM-~ZB)nTqeA7=(f-?Q1TSUB*^t$HLF!IDVvFCS}hq<4Vh@H#8 z{_muL-R`%aEcMh6h`xKC{tco2H2C+=mCRp0NTy3&%FoS&{EyFYJB=WK zR{2Y_E(8XFe#g_gm3}TJ8?k@v-2o{+iPC(xTWs}{yWKs3sgP3yyqW^PGSPpaSrJ`a&d>Vw6K#w$eS~9k3USlqQEF^eFXl7)J{Jf`%@d!{3Wvdz7$p4&lam z6};a?A+-fTf;_-Fn?$96(oEVcjg<&oiZ*}}Q9Sg!D_v(;d9G*|y?Y1JoiL6TgUtka z-XgRc6?$h)tr8_cg{?Xiq7~KDqs~L!M@ttGf?x28D19s)S0C_e3m5y-AX$AMc7~vY zRPdil74*hlPU%@6*+G!i=_!iQ( zxR|!9*RF8WmVzy}cmRFJ{NeUPiC59+^NEWQjMOMBqjx3dt8pi5EBaBSxK)_Ots&%Cz{S#srlr4j z09ux3(V|$icxXH#fl3eaB*3qmQYp^YC13}965mZ_q>X%E&g$jT>U9#!TR*U%St0rR zcreM7qJs}Wt-4PsVv@VDFE97D|4(G$jo&Q`D-FqfJRbz!S84X4K+2^gBiD zV$cy&YBY>JSvOmTxjzxw+kCwp(-F>&aqMkV&N@a5+Z##H#?Hyvh&ViURvXOnzcx*# zKB=*@CTX!LU~|;p)Lb?#QU7c6q89w-Q$`r&ak!xS93gCYq;}ev$i%-juctxGQ_iceFCx@QYe* zBdL~SzwIn%R<Z9M3@33VICQa@G!JxJwV9<8!-Df9pm z>o--4&7MMQWHlj-*X<^?8^_W1YHsH7f~|1NjE-tqlP}>?c-%xRi(NTY3(IyAyL76i z?}=SJMbqC4%2OotAMuIkJMsomebavXzFdDLn~%(E7*@L40i3@EWLFz-O6^~_QDh@Iw6M95$0r;G0T-(gG{D9k zeGImSeBSp58modMt!VS$=?xmcoFgA#9A)_RfNYPaW8g~AtpYvS@ixf(D=70Xg3M0? ztS*rGd!ZdpXorin!v!m1ChIG~(rIgF?N~|I^xLS#jqSLXR6AoYdaHdy2S;+)fbvEI;B}s|K95iLe2;hd-=z5uPX>G{-}AWOBPaP zyw1Z(?c#TGC>w84hWn*<98K1HCUtHn_Tx}^@;c{3ZAAths&m@3L4cq2|5CzA6}i36 zYA7|8uy*V<+7WU3{|g#e`>OZZzFGeTZboOHMW>76(p=2f$E-aO*a&URt+_g<=85&G zJ`Y-bt`)TK76pN~*@`QRlI;Fv9M+ucg}Nojk+_qM!KHL<*qYtvV(jIe<*~mVr=g$J z_4LfiWjI=#b=Q=VR4*}Ug;9F%y1wkbt0BQ8VnO{{j{f^rzFITwThJH-?>?4IK-Q3NV1R3e=LR72y^7URYa9o4vxnOQXAmJh{JX|Qa1`X z0}hS0O@;E#Vp4mZ1L!U!b=S!jeH;1`q3fG>39_Vb_QLwI?z-6-b=8pP`!J5p1Q@O7 z7~>lE9^QlBKf-wJPe(Dv#No&adIkr_b&qkM3`ZV)Hbj=xT6a@|M?X6;X)U(bYf zZIR7qd)G*N7t%CH(|`2Y-ZRqPgR}}v+vT%um1{>j0LKm^ZwKUEjd`1Vwr`BQ-A3MS z$h#f$-t^fv8+mUVd2d6WjCn8kY`sQWFQf%A?Ma_)oW#=DIZjA>FmNWU1#PgJ?(y@u z8axtjn6@PXBzhS9>NksBxVMPAjdM!oz{ zN=K1uTSD>S&ZNx`^x`by=Kcd5A)$E`S8e-?c~*|wTy`Bt=(!d=6a545{{-Z}2yHv3 zfW+?pwmc$=AZ<(V3VI}#)W);D#FoWwjeawhI>euFJtfxD&u1dR&Pq^$`& z0UQx^A};sCI#sme>JYSns7g(|C|Pf1O%74=iSy;UY8UCQw?$jlq94o6%^KKC-6!zT zmbmr)Y$Eix<`&s{f81?6Rf|EwWUJZmUpdCQKk`_5@)GT*iO(5lNH~?QE)`eAX~xNiv}5R<%pF=-aM9n`>=UVl8IwHlegdRR^cPnh7s2?5&6=UL z&7KZr+Mo=+1x81uu&^^3n>j=CgH4=JzNF_4!(>acTM^?JX{v43bZulqFIWwmFi!{z zup%~|W3xNKuH9LVd!kW0SP@XRJLHPj^ZIk*1^O>3d$#vEcISGKTmX{!b0^xff6~(5 zPSw2VSE~GoJ0kG@M=d=D$mZuV?Olfv*XeUeA4ty~{t5K)9$3T20TW`e)7Tz+I#D8r zMjL4f)kwiI3FQ|YImAyU!x-G!!EPlIjlTNvId;A<&i{#)qz+FX9u*-XiS>%43gavS8i z1?MK*@x<66xUWX_!Nnrg1xsk05ua4yuDdEk>hAQImb`=ICY0wp9l%}v->P1BF~&7{ zIwSW=%$2Z|grz<*_bT!9teBp&zV1%6bss=zjzQ~d#0`EPb?n{_)V*o(QR=U5K5`4T z_*EOgE-#{^O&~u*o8HE8_1+>)-0640n(kIy(?vWbr0vu@wRpjETH8}==ocS}Xf9VM z5qK(k7mYf*HtHbyZuLx7tb{y< z_Yn*45Wsa>6wgPW4*#pdh$Y1Y$GF!u)PP_)O&}b2YV-j@qf301P&zFruWPzdwjJu# z9|A1H>q!$d5u=!Du9w>xT@>=W*oT*EVOJ@^-$cMS^LYC8s}L~!IXXS9UVVq#h4`vn zXwTpXtLp}f-=!Axv@ePF-l=~nmc~9@pkcHF4f-Z6XA{(I!>Fg4YrRo7VyYptlB{-b zR_z5=?Pg2#?YOsMLt8EMf6?hK{X0Tq%-6!m`IDjR7t^uDk;jcVu4rMHcfI`UdGoFp z99!*NLTl$whq2es@ELp-@}1@$tGq~yc%jeNL*EoapC_Sj`obRQQxEI&T}Ge72>A_n zZ33Pr++ojP;`ct`mIN>H3s1Pc9@fXZz}BjqIAVJdy*u3N8ET|9dju&Fcm|$W^a!tK zx{;%AU^q25ejW0AH3O#xE5TLK@nD6p{0hh~g8T}%WQTlvg*)h(FLwoQ?>rGOy@Z$^ zU?qJ}auSsE8JK+T$_c%qJE`{7Z8KYSAC_O5PW6bh`;##)LFx_!!CJ;|aBid3sa8~uzUkhVhT#Opv)H5kj`Wl%(slv{y=FPP}<+1w0|0<&NNDKEt^g2Xrxsc ziQjMcN2?M+Ti>E}G}3B8<)gJAnFV9eIsj;`23iLgv<^66pO2<}{z9HUuOYpC46EP3 z>Nl|Z4~TUPVhz0*-Bp;2^#KFx;|A8p4XlqJ5NpeRXuY6M@&FbOXvoj~!rjnEblf;V z%X!!-5RAnR^UaA}(T>WDe(If=RZkQ2TEqo<$+NDV@t5@zY8m7?`%0Y9>iRU}OX=wv z>H^UFg)CyS%Jy0(Es1*e=%2bN1?@mfHGPVCKqoO=g{YhQX!I5e?@H)uwIJ zZP_+mIkruh+BV&3woTUoY@6AuP1~kB%eLwIUA9dZ*fwY6v289`ZQ3^7Fv}i6ZJVAn z+h)<~T-yfQdDUw6Z5hwk#Ja2qWSly%t^vQ=zl0~bd7RN(iBGsyu8TTJ5PrJ?6XOGk z*jU5|g=D6V15Y1 zZT~2dj5&ctfYUd2D|@2!E9?6v zf6rON?r%Z@Gep$u*i@FT{?oO4}cbYu9*W%Hc zz@t%=M|0A6^k5c`n9a+PM+WM?$g{rW8C?qs8n}V z0m+Qahml>x_XB6gN~) z+p5VXxu_NUxmd5i7C0MAIEi0mI}Ld9Lw^%}4K!!RL8hmGPkKkjlX(|o9CfhKgTgyd zN6Acq=<9vb2U&R^K;EI4x5_8&%*xvdc}p?xVV|@nE6@72afeTOBQ39-uy&|K?Db2m zC6dt+zbz(rD+GNO1pQK40!()VPC-gt#P48qIt)4^w&o;KS3^c6A5Pmh zSqU;xO6^EHx$MOd`Ig2C^)frM`1jh8s>sT%u*!Mq8K!^-r~zw6a`#J@0hqg*L{Fgv zt2)1Z9X&&4&c7_O7d^>9=ih9+g~aCpSzuOtVO`%)pl4JKn|onxV$IeVX$?wvxXaMj z19Wy_xUh?Ql6ZjIy^@m)J7Fd-WHb41B;qPDTEktYZ}WL}rq%IoQuF*U#IT>%8}qT? zD?C}Q``%6bu9KncIJChE(dPIKF|73!o(j1^$UPNukB3|{g8GY5nQMCkTBWR@9))dW z4gDgyw6IVK7uEtz;|-bs&ux@9g=}SV43P_Z3#BAl0L+uhOL~r75-r#RC9g`i0KA3; z5K6i|=3BML?cr|Ff8j2xA@hi3??#&1^R*3}fSL1zn@cS{{b3*;Pl_R@2OGlr! z*3>_9Krb{?{c~2D{^?$usejx?l)`zCo}fNj5m_LjTqFn9z9vT;dy|2+-E!Db2pC_J z{c<;O>w-?16gbd7xkD6X{ma1G`B0*Th^zg!`LYoOhTbU$xf_H0G^s0aZ*whCVeP#E z^f$&7L%)v|7(a&i952arr{eD4!|)Ces}stHu>6;0mZCq!eiO>Y`27p!fE(k(AXi`J zcCegkhuhJuv_q{0LQsB9M#{$9^;d|+B8S&27_~If9Sx9WSn$HCA)|)2TQv=# z;>Ev}qkj(d#wZ3U^?HlL-sh7+iE(`$z;OoL2Aos8VQ)Xmd(e=MOj;bY4JAE(XkJnk{i^-t_{DrEqWOVoJ@C zCPr@&VJC|*_dFUqm%5Gl!`A2Kg%FRAw8d$5@K0u>XjWLyIMe?V4> z6UrCZt`hSd{eSS+ghbrbj|1bUWKcBKh{58e(lt%_zC5>O`Fmg((Y!0V4UQJ0UzL|e zk#v!4y7$!^7%ixDAFaQvFB^+lx`v$7CqCg9L6?Yj&;T`LabN6Ko%UbsR=*~J%+BLK zheh@8nACHQhae&&om}zTk z9Q>JJe9kf=d)dsTky_;pE6rE@nrzN!b&3x-^!MYLY(53J{bjGobGTpQWiZO^^xlXU zqi)XYtuf?gC6v)udA;YPy`yw{ij+W9>L<2}rdR~ru zUu8FYkc(+gr6POY5tlfYbA@J(OPB-WXuV$_KZUM`UyAOfcfLptpu+K*tUsSneg(Z! zprq({B44j@sr)DNnH8r~N?(LPmP{y8~ zCVIUE>F-Wc=Naz>I3Cj8JzlRT{oNIIT?oCpi=V?ikG(G}yw#5Jl)Pxw6%!ts*L=cKRxoE@q`;r2d73oRRM(>G0cIYfq|ttP}SSfsTL0$bJbl-70Xza;9{Mb**z9urc>FUJB}%Z)_;+O#bvziir;XM=4y zh1!<$(`?J*Ue2Ufp}y8UIT6zD#r3}n*8guadkQT?y1KoNea*R@etlAF>aL5BxO38w z+M8j;>I578W)Gc((YC|+H)ia-+)nfzxGRA12GQOYaX;mIH<#_F@z?Pwe~b@0_oVw{ zgoNgMxoW2xsk^RS7gg=bG!=F)l9$ZR^bf;D`4+U0p@$2f-UuHG~0JwTwjxNpmb!MgEc z`n}ywzv=FNnc4QSYZhtZ9e$x(jtH=FEJ3+gWyu9-a68*!nq;gTIox5o^He!(M@#5} zP64cbl+#X;!LG1icO-Gug*z@j`y{!p6=pSiqk&8RFrh5$q&NM6Ji+^?KKnUP2J4$_ zmRaYs1GidVOd9p@rH*7WdHygv?>N%FGFghpM;74Q;r2(8Shn_rWl67nya|5~XWT_` z)GNllEcI2S!abPAV*Vq!MpIkU->;(kq{PO)yU!s#=6z#4conikwLOPYWo`C%W6WT&<}x#?~+@c$7h6Ecfk`TU){Dr17T86+X zyct&EQNjz2q$_qkjl6|9O{84`>}k|T8r*>8Jy^3<%xoa3QkQF)Z8Yd=Otn{n3KO9L z^bTQz0!r!qc_=N;YR&z5I1%K$M{^{6H2j9!*>BNw1MYST*E^_z!}l2Zr^We7f;l`H z1oJ=x8L1QzR^mRRbv6pYa~Ox{(WpW);SJnCLu9nHU>z zo!3C*2x61Ch_TL7`-j~ViT5yA?F~H4sOfxzsxcYwXLBteeR2cd%FsYujp4=-^j3xj zdX}n7VtAW@l7S>qKQij7bPd#ZGHR}-Bd3PU?DHOtzgzme;d9t;(R}(lhkFdPfOil^ zl;o1${#feIN$+6<0O`Vk*~l%KQ}d8JfH_4w`(J z_YWLV%fbhLXb=D49eXC^!!-KfFd`q~4MES;975Z0aQ-$7^$)#3!dQL_)6!nLRVa z>KQCcVH#QQ9F^*wQQ=WXo4s?S|Hvz#caBVxheqg~&DcAKAgsPMlWMm`b$Si@8<}*U zCzy0+lzLi%Rd_fQAd$uaByzNm?ifuW=h88eGdGWV8bzbjxhadg!|! z-cgF?aOc5HgI3nNdox>a!nJ0>wHk1}9Sm;8-mrVhe{EMxBEQ3~0RDML4<)Um8%AZ? z7U}$cBoDvsh8-aR{TS1zR`Em6xrw)dGiGH!%!Listc4faTjXpac733m0%aLy?oOyRO#7X7^4kZV>dn9i*q*1 zi<)P98*pzQ($!!Cp6z9DG|F9Jb%Ps953%gf>W0YCZ6xej%XCS>dzu#(_m#`}0Lkc| z#e*6G|7rh>`JMg4)A+||_5L-1z=*}VK4M?x1C;i| zlx0bNP=MgM>rBbeFFaycC&4zJL-=}-p!8yW`iq~3s@OnOHS;Eot3!0$*7 zBi(29-N^s6?+(uDyNGsuA5yW9*bS@H#Ab&P&hyY$wg$G}SexE+_$7v~A4c>$dIt>P z^xJtdl2pkR?i4NtKa#<|;0278t9YXh-n4w{pNp=l^lC7Yp3c0B z9CYvD1xDH7bk7ybKEBsWR~4L@`zK(m? z9-{vu$>qc^e?(8#%QP;CD-Gg4EVGT$Z(o>3|FWE#BE=&~u=pa0-IIcv1=e@G2BV;a zbWOfK+FHp{%Zz=cGPYv`*djn$q9H%UG^Vr2 zb14oFCI4xS1NT|uP^-p>)DPrzU3*GSDd(R_D38Ij+F!rddivPt0l`;%GM)A61P}2` z%=1k$Xht3E!Skubry6DYLmB4(CXoU)TvSNEE8v{%;k?D;)3~dzPUYy&_=@Kn7zPt@ z0nT({K}uSm%p@~<@}P0*6e@U=jHqC^XXQfr=7u?|4MZ(Tc?&$A$6KJ71a93*{Zk@d4?Oo8&k_k1?2x+xi)a3eh%4D{ z+~vkDS{X@yXFe!p<`)L2Ria-QN{N1xYS*8qWjzZuuh)zs4Dft8XlXA=Ozw(qsm%1* zLA_Z@RC?Y+E!)38Q8kI!2N~2X&{F2rbOt(s3Kzd&y%Tk!WgZe9#yI_y*Dd80qH4tOzW;c1Jl%qsxmJRI{u!{ zGkzaV2D;`ObM;7qC(L2YJ0nu&+~Q8dl5fspEBR7@VdEdUbQAC*q8?*NBJQoZsfScM z^kKDke>FUiM^B`;5XA$E=k?Dn1e0W+N`V%aY>D*`+SiabcDxQA*zR2if z#qjP_VXXxkVe*ow(o;hMN%0szlmHoj9Nwd8;yOpN-+dPs-2Jx%u>2$mu z<+b>kS+-2eNSeOgo+vS(aM^!>Dg$ zIi7km$LELvEa>&MJIiAyu}B=V5yw?N$H$O!D70c|C=qzN6H@ug!FAW+DUFZiCI>Hd z1&*EBfwyBMA^k45mEI)s&aTjLGdo0#DVCnvB=N4U`e`#e7U9mU&v6&jAOYP8^ydRi zlOgRMNK*mVJ)l3&jJMLgU^mC;e(G>~uO^3dyW9-+-!mEP2!MUqz;~5_ZwRElYNY*Q zq*X%N^N>~ybv!S})_w==_G{<^*y>Y=@Q#s})N$xFgq}jN&#iOdV%_zk5q(G% zi$pWkE6Jo5_+-A<-d#n4Vv7`%n4gVAG-n%)7;^(X-%U$7jkrqARQfi0vnclWB2q1a zR6A5&wa2z$e3%cL=g_lV0jrj}mkOxY&>c|MxpLQ(n>)q9`r}sa-36qrS<~Xup7OR! zUD{)dBI3rRS7ecu<`7N1EsT;rlEyL}oWgp&8|^Ktju(=w4m{srq&*>;C*Fy^3)`tl zOn#ASOdZF&jBU0F( zs5aZiX(BlWDd>juh*+D#OmoSOHKEu04%Ap?wc_-8O?rqOk{ z#@0-*0*+L)ka+2YArk3N=Ns(InDnOjLwk|So;@+?R9e9R~hmZbyAJJ>lcM^5<~(vxHmlMRT0MCu0+{U!rNTRZxJ+(ztf-~dOm zA*UqgaNj|RT%1t@=ko^6bBR<6I7^=gocF{_>DnW`M^@zNk!jTXfZhLAN^e%FRgNLv z(sO8U^0c;yHQ&r`_DGk(8nVQI z_;U(E0SM*K60^*py}S=Bv;L%~{y4g)d5!_`rqMHhC#vhfeSv#h{n_3Yg@O^~g_XAV zM)_>+aP&woMZPt;O3NfC)bGR*1Z@;y&0>wl3Q7xaE2V3eu1Zz*mbPc{k$b&IvCm{T zghaq9bj-x~fW5Mt3%d*Q^jO3r5;hLG*Y(eErRM>y&-l9_Eq?#sqa8#p>@Ag(_$4=8 z7J80f5-l76&};DKgiP#Mrd`C9>z2LlQuD1Ej+kW-$4H}0I*xXg;gOAV&7+`^4yipJ>>&FIa^3N2#(DD&u!^cWc~ao$4h#Y-SLTcOxcwNTd`I5$VJPpicPoeE zsYhPlj$YA(6d3t&dz%4$4nRA}MT4%M(yiRY%5I3;#~ZnmjNGdrcS{G&U7hY-TS(G9 zZzU*+`yaI2GW33~#i#q!5p|PJ{102GU!B=P?*Uqfry$eM+Gn>BqiKwbGl-iEh!c~U zEu9J&nvF87wRlG(+V)O*THFp+44$~nYzf+|NjyK!qm7(NHRf?+SzdKAlOoJ>7ep3Y91 zkGy>nYf!2;g~I9;39>X4ZFC zcc3ym?H{pAmS_>j5Q0%#K)#4cOGg?lB#o9XObgrxu-UZC16oEKwA7HUBw|j4Zi)}K zfsMS))E}YuO#N{==#Pz5f4rQw&K>by<~r9-nC>|O(s6x~Q2tI&t`dlp|H3VG;T zE;jhN`Eo1-{l__s2m&5smeYS@`V4WO2IUXII_lSq9W^^nuI%3)+N#Am_G$@bMhohg z_R#0Xdx!DeN6|7i<$ zP!8-XdGlBsdabs-nbEdythVV^+e{d~*Mxa11E!?cggGduPY0VY$_D7WB8#@eOc-UT zMVkpT+JbpI114s{9Fo(XxJBDL8MK{a(KalnJy%*V?`FvSEmrz_8Mq#@aMk6=^$S+s z@SJ+yw(z~5QO{N@y*HztpDkP?bLw$^VCIE$WKa7bpX{BuU)ifM@xjl5&eWSFs*E5Y3SjQ+^1BbL(#Q>?tHIrX1p;oFsgZ-E6fEeGZr3+Af~+WwW5ZsK~@!quLpBiML) z<0ErC?J&mEb~g5Gsquu7z|gMR0c91OmxU!xJSQdICO#s*D846dn=7pzi#p?+u@aq+ zS-oW&^V=2&ZOm_59Jw*SZ8349N&la6css+&J1r-#%gQ@FXC7L((X=7vX4n?jSm{e? zx@hp}pO8KP$6CCq@(i~Mzas+0B*;JEj7|QU+IFBxZB2rMbcOo2)(R7Nj`Tux`mRLa zk+CIoC1|$uwT=1hh|ev0=j7<}A2z0R`AJllW38QOy8MwGT`qiV>hifcwt)I^wjFU@ zh8OnuF4t5Pgr?>$*E`Eru??lN1O87 zQeRoPuF0vV&&vC2&iE_boNxTa_dEUuY&LniG)L}+Zr-=X2+?NCM z+?M>d$y;0U+a^1=R1#LDv$7qvOA`h=aK?j}dKqL*v;q}^jb>XQX(eXJIL5FeLBg-9@Wp$)>3_M1v7 z+Hdw&wBJ%%K_jv*?pML$;ES}5_W@r&Tszk9)zWdc&Xwt&4L_=V5MUS#7^+Jv+I55$ zjrbe`J`Dj?I4&l(G}>hn1yf zIc67rYVK=)M|Dji^x@cmEo-jJE)&=|Hem2uf>Owz2cS$D@@Epz-BwZ&o9wNK#Y!u> zr|uq$H+;q>0k!;%66MvgNGbFfSHua%{?`Ye8hdPzuhgdOC&y=OuL|v_M4J8dPiK?O zL1MA;3bdivEfY^1lWsp1aVGu4J~QRy*BlvYwDNw-$(wBD?ah(bS)b*%QRjY^-$uRk zvrHS+oL6uB%(NSAE$Q~;eO7vqrkgaav}od5vT1ttvrPNYoKHS8VW18!YkvCXv+T7# zax{IPsj(${ej=Zn`0Op&HlFA6Z2RyZ8TMiS{lE^f@(NnA=e>xT7m!=B?X4CwFXV2? zwzp2S@;oi6If=Es=ko*GoELn4V4HKv=jk?QS;f9=&U-%Jx6NtR_q5ecC8vL1|2)5a z_=N?d=D_^;d8U16^4j@@$?M{lY+JANi~ROswFT2J2WG?jCf|Ou z_!i6=f3B_h#@~r~$Dc`C`Bsy*fjP7tv^BpCINE|4oC7muYo-lo%Ig^>Oh~uJj%fp4 zxHZ!TH0$}BRnL$dp5ABW4b7q9sjd0#!}VM9+lN~$T!-Y~`eti>8&KG0!h~{QO19;< z0d)(eHU}oMEx!#o&Vm`919QT*{5Iej7R+HeFblTjw*haoU?MrZ{+E?^cn-d&x8=7F z*Kf;jA8y;0-##SU%{u;&Q%BME{5Iea3#L8?=E&{&ZNRD94f`W-B!xlP?D-+F-!kl8 zj`O#(?|kjt!4>WNAr-dJE{ zMK5RL5}~CnAug*gwzD}gri=u;?7EgfTDuYdY72k3BK;d9!fvo&!vMP^2li_N*1T)v zgbI)4v#`f#Zp;RFb5ZwbJRHtMs1Mnelu=GuqNsAwP2SYIe+`;6kTX`+RuE2kzcbNS;qar_$KbOqjIk5>LrKJTFxV4uImj_TL5^s`+@a_n*g#_=f6)05e$5x&=gl-tn8T%> zml3P1vJENWx&nXbR7f?6-3z@%u9sqW%&3Un*-;U@YgR?CL#7mouko&a7vIkO_g30E3THiM>J zJJ?-pK5{ap3H=0Om4IE@IEkY@^jzMyd~3C3enwl&{GYA-w@AMHJ}dv89C*6NyOXU+ zyUDONCg};~%2sxNhxLtpC$no4$}25w-S;eA_odos>;+im*6z1lf2-WO{gxZNlle~I zSVn%C^zWN@VTNv(4ef%kA_Po;&Ux2OOFXZGd!JJ}q-dhv=@b56s& zORT&O$ZOA7V_vz_Tw`v@NWa!f-;}ZTyfGbDAkh*?tLOHeOsA#G(^ai3{-I!$`4^O_ zw8|iM8;RAN2 zxBSQTZb_?`T0Z2K|xPYFYo&Sb$%edCOoHp3MsroSny}! zt$$#gx(H@RdXDQ-^j;GpLIHgqMxX6a{*v(=5r^rU*t(n9hF^V|d1u>5UppW6dCVOT z!tYAmjVaLBjvP@Stv~W$Si~3MY>yW6^SiMGO6Qu*>wD3(2v{!+l+WSsm$i zd-pEW)?YC$`y14scV+t2nfC1YR{C4xOx=U&m+oToSwfkM_bP$T{HM(3Gxm4QE^}{X zgQS8DvtgV<{zw{qrVlUDf88!Nj^dEs6?z|N@>smOC5u;0z^gGn5A|U|*!v+rO6xx! zPeF0r%8q)D_A1^|+K!RE;kSe4E#$jHKTLuZGuPe_^~Ko3f0<_EDRu+66D#a z;fZEzEX2`JOKl)phb{HKjoy{j9k2tmSqtLUH+blI501PD^nHr^-_jbVI%Rk}jAQ$e zvgUYbNLS$Yj@hKz9+u1T%WE906g&RPG{XKF@!9l_&H|(SD#a}Cw#Sx^@%04W8Fwc@ zv@ad&!xO4*ct(AR6yPZ2D6~dLA=~fUB*(7DvNLd0+VP|vo>(RH^y+*$5jr-0tV91S z2KW+zS@DYrdpgB2qpq20!G<}{b!@Jo1FSnwb}9@4>nV1PW(1o zuf2fln!agV&7FYlCH058m|41Ws8t%?gAUe@4x)+wsK$PqOS$`AXA}Ht;;l9_4SADL zX3~3;ta8x54)`@O7Sfo(s1xokACxu@5BiFY4OKZoY4(|OFGq%b#pZyR67|stw(y%! z?&-jku|^8kIxWs_c+r0#6pyKQylM04QD2$s%_e|&cLGWC<-)Pt_!YBfWA&K7k>=C5 zx})&@y$R^e&^39}IH59g4czjTsS7raOW(i6I@=&mwtVYxO^GACT^Z+V_fAODSEqcH ztApo4nvd$>@jhHn;cp`FDQIA9smA>)n680;N@9w}FRnK<@W0df;7a4eH5MNxK)X&B zNS6Q0Enl&HyIAEo$S>zOYS%;A&==!W9G#WpK|hc8u{nnQd*Ul*|KVQWeQuT0_z@x8 zwqxn-Dq& zq4$tb!U0F`5JKnZ_24=!A%tF2fP_@i{d;f9YFBpd?)(4y^O1LV%A59PUYR#pguh|6F{3okG{GH-Bb(A+Q2CycBOLB@dO3=96x@EfQ85)4__W!vMCk)#Y#oopW3z z605nW!?Hcrq0?4}&-PG!A*vP=}^H))tVi+19uzoQk!KPZn!-7p&RGN3zPXkuJw?B3;hu zk*q5lDe$QKuN6812{-^Bl`%xzp=O+H#t9kj@U_f_r%nc`l|&B6sk0n1<;EXEpGKq( zY7r*myK?GrMd7egspV9%7qHT68PA1vka^ymIur8&w*IcKPjBui&MWSzKN|AlJ+v^} zW_3l3*~bI6ZJ2Vn(=WTLg6r!Pyq#NwuZM7-6x>wXID#bPe*xe4+LT%;Aj6z+>{T6{ zfOEp29F&)agq=qKSK@*&cU5wQyEgeF8!I=R8_y5dEIh&;YwbJ&^)|7V&j(K##9tA<+?O2aE!dZ1jRvnOI0-I2c39aEYm zkTE1DjQdkFBvOuJqHHe-j>j=+rrffZhJ+o5(=ll#b<)~?mO8n*R7tKZRSNk>D-iNU zsUx|Q>RqA6Ln-e1$q0G}fRF4$zg=V^eX7Lyhv$cf$3f@U5d41t{0+|VJzGWGkmBwua1Ur4Ap4*0APV8jV6ru z9S)G==DMR3^f-fkeFT(+_!V@z?{q)me#8Bt`#bkE_tEZS++A~h^)2i^Ngu_FV<7Fp zCjH0;FO4L~51zc9YDq!4mqqG5Zj$gY|LY!-9ezoq-VGt{^|1QPYH^e7uqz|=E(me4 zG%k`IdPSt(3nAX`L5kbA<;Wq~%F845J_zycfLvF$_((Q<6<}3QYmnB{$?3wAP?t*V zquNU$w!5_ndZZrbvJ{YXd84OJhBXebaHA)=H39#F!F=k(7D-O7C#KK%FV?a3#%R16 z@V63Vt81WMu*8xqg!Gbs(3z2tR(Xu3OF&+_8o1f)lqgcO=$-ec- zHBl|2QF{s0?1Y{sIvcL_*GXFdw;bJ!dxIJhJg0IJ^l)-DOZz)WoBWoT_qyu8Fq(@u zx*^QGeqf71aQ^M+XE}|=OCkw*HT2X$Ee_-e8YZ@6Qq(`aoLuFll%J4;eqpj*m>gbO zkROpN>OkG3yq&(Ioj|W%o|%hh+fpCRM7}yKk3Lq!p^o!Hi~h1#_cyAN#Fr>P_8B`W+c8G5Gl@{|a0lGGoN={8kB^vRR#>kwK+1Lkegdt0Dl20All9&9!x*(*1 z`Gg)o`}9Ny&=AMrrNJbw0vDSr^Pdt~2Y& zDJ%U0xNjH!C9mJJU{+P{;!1@%ddLn%X%h9urzuK*8&fTDH}aG_4h5P-(b3-i9Vql!n-j_=p6ga zdS?G4=*9!Ui#-(SQWgU*c7G)6yc>A2dm>r)W09=q-bmK_Xe8@tO7~VgCw2#5+`XQ0xh6COl?-Qx|xyE|wZ5o4eJw8!W zg{umt!FRMYDwOy*q`e2AJWHX#o8xH?TdFO5>AP!1F$MJ_ygZ;Q5Y&)6}=tv%O9u^&oI2 z=xOIyk5K~{RQnK6&kI`cjO2q6j18E2d2k$$C-^kS@xSK55j~vX(;U(Nng_;~qzFE7YzNB| zlFl>x6!|hL7r^M@2nHxE8$)LIv*$VVnY^C8iS?6m3UwJ6f5yysc?akD1Q^%6=GHz@ccVIC8W42y@?Fd&Vsb}ROj_cG;KzIJc2g4UGTK><=G8F-hUce zd2tIV+M_<%7Jo?#vFL2@?~Dy>Ut+4dBx2RqT(W`5JXr3*X5Gh`b+@;v)(j7-(;>#t zv9wED2>1WN=*KMpvzEg=$jm$8|Ii=z7WYR#_6JJIhW=EAY_2o#m;w6jT>$43)Pj)WVZJ~Z9 zub$PyYy$G?+4L>B!$tc~BHwP{dM3%p{2Az4tOd1N^)UO`cbt9)q*4-=J4%D&kk_uI z`=;yqF(jd|^;rSVdk$Tno2e$`lbKW_0_y=jaW|uuB$qNhlat?XuUhSlH;VDcQlln* zD17{#8@XJkzZ~h7o{fxCt@<{84r-&=vwjiQgFNMUMOTSk)Phi=|)*vCUGdxY7I_I`KClv8H0@mXQw_S?{>H&a{{{O(s9nVuiZ&(ypHeD0f(-qbCyzS#F+zuzeI z{P(n2ePXQHC~OXPdh+_!EmnKxbsL2}^THNkSLEci-o)o*PQ9sxX_R()at+tD=*@-v zzD)&sBtZ$gKoVZif;z%?BMG8-^Xg0V>zznJ2Cmq|_4BD)TZApLpl=C?OVYX)_`)Oi zEAVd1C{GfW7M*4dOVO|@3y=57%mxd;5-|I6zfBCsa_U%Fq5Hg}@Cm%eNEzjKtdr&Y^fw%0le z`)X9~HuK%qA{Xh)PuL{RzTL#*~~=WSwZsI~7ObelXmZSf~IKCp21W!@(H9+TK#xNK8lf5FM;!qpIl z<)OY&gxz8Z6FkBFW>`7L4niKWgbDkdCpTI5Fj&|No9y-w`2NPG!R-{@HN)R&5#jjv z{vdEa*;Kq=Lde$~Kg1mP2zqZw502xeZl*J+`jbn3y#f>V8i=_&2!Zws~JFFJxQY}?sE#Ay= z!O&S9Qzrj|ywd(Auf*an>PgWt=YN|S9(R-RM9r+QgEG{ovhP(@FSyum?uPq2axtY;G z0UzPUQw3i5fX&S2CQM#V1mj41*$$l(O8N+9U75wcwF%Pp@U+%(xu9J1Wv2GyNTHAK zk_+K0Ea8t?!aucypK1wTW(hye628fR@o^VWI>a9p@cmcB zcS-D%BR=$OX7r(u9`EWa2fDDm1$Vd-WH(TZMYuz;-NjE2oCSG)hc>2;OyknX{vA5V z{+|IK{~e`5^)Mb`2}Undum$kbkg(i4rdKb6FdR$Vr|E+Hngh7L#?Jvu{{s0DqR|A< z^sjKwR(>LmX>w``+L&ov7FjMykZW0lmSC~*(P;@*8=u}%VbfzYBfM|;9^qhiK6&*+ zs88~iQb}`+mL%H065ao7rfbN_CVt+xndxmQe%2K5(@R6b(yMg{QH4Imk(0T;n(b~b z-ppi!sGMu~q@~utT^t;poSu+XqR9aQ<;$#mA1${O=8A*PxW7W)t7)HO@6@@wiMzM2 z;melHQ0(#J$$#&UGpcR<(eQOk=iEK@N2YNF@97n+rxX7PvRwYZLH3(HtvLduTlyf9 zyd%^2F)!)k$lzmNzzv3@e!$V^`q47I26`>|L}ARjp~vvv@G9DOS4e_RZQsmfSDa7f zoMz(=Vn2kxhJEU+ca@Ta1ai8()Pr(*oQ#$Lu5&cZ(tVMJL%W9q-DY*03E!E_Cy|M9 zz}$|HBAmXk&0gzd_}OE@&#*F2F7)8OjE~Si<#89vg}i3@ z4lKXflFr`qL1<68WN8C$&$sYybYLI94R4u_PuY0DGt;p&vIO3i{tr0t!>Iq%nt?cg z>-kdn9}Fa)QRvxb<^yy#+8LovgpOee=e;B{dJD6Kib@%Ed1M}WSMOE(m~I$XNq{90 zO)4|@yK&@8X-?Io>$L!5!XR@uJb;3npD$4MWwsL=Y<7ppL1erG_ijI+do>~8iN`y3 z^=DF_L_URu8t1-3lA8*0Q1ceM9P|~XiHzrL+roXO>OTU#%%y&5!JVao?&bI`0)M}b zlymzq>gQ<-vk^e~snlC1S5Wz>)SGGg8f2!gK~4g>r|HW`z3d@|j87&vVVI$O36!W( zX1au5`?0PrCovri-rmlFLwE4k|+l9m=&^7+=vPeGQWBmp1w7)-6JQ`U=Y3 zO64c9rry1U@xB@T>xdEmGSaK>Xi5pq?jm-TJo zyyXj9gzU71%TA?U*7E_*@e=YcNQ1Z(3K#zsK?KZ~1pE|Nh3NlUufh$*qDfEd#2%kxFB$Y_i!(_+r))__aD>^{4wCZ-1}e zZ`#thc^lVp{K)Ha>nzF{iuwLIpV3tWtr|6^W6QTS-$YSew$*TXVP6kpeHaVocYwwmdQ^3<*0L@G|t|04g1Nx zM+Bs9$9TT)jcxkpuLI?37sr{Uzw$kCs9UqsNAb0t^P*zh*8IwNf6UKhe=74!m{#R! zJ-nZ`LfU4Y)=hX@A-x+duCdKd;I^@?AZJ&&d5i;bb27C^{<+24Vw@Sxd}b8IIqQK6 z1uM*yFdI4@=1g%ccQ_=R8^WHbdMmRZFq&3UIbP;+d>xDw))h}*A}ong#gWLlE7;G~ zuJab%n1v*ajivignSkEk!05)YoWHG z*72w{o3$>2HB@lj(68??=(-4$N{Z1rjw?a!_)7DAg;ViNG=M@;7!|D!_QqnJ2-Toa ze-^8(9Ft-80|$m{X5XT`KCE>p3CLp2oUm=rYvw`Qiq=d^+eH3$Gk>^MHvI&#u{#># z4z#Y3J*?eTsEO$LnXZi?x6y+=;BB>002pbp9)|qJP{rP`7x8B~0i$AJ|sViwZvY@uIx={=zolcVKHolqK5u+BRXMKi+S|Azq)u z&vvnWqqnySUkclRuihRh_(fne=O5eHIzjW-Y>ODRkS2Bd40f)O!FYe0b?>Q5-WkbC zJ1jc?&$o#)T_a!}ngDA|K6OB=q?B27<15WH5pO=Vf2*$0G!CmyZsRr~lNhx-fL7E~ ztgMIp0g$0CpMk4Fy^OeW_6&CZb8~-Ay^z1J>(A8e1pdFN73qC)B{6lDj_v$B4mp`P zqGjfJ7Vq}Lxk_CB!m!5G()G_7%?3%dDkevmRp|sAzUiGj27!p=8w6t21THxCP2g+sgzR;e_{b@Lni;#1x?S znxrM-8G&Dp!ZTGr!+(~4JmiP|aImn^j)C>`5?0USc|8mHlHZj&jM?n#bjVBS9wW+j zLpcss@xA4J`1!6{I%eo4Zf_X1nj`QKrI`OKwu?2y70t@-Xz?2I^>${9Yt*=+Alpci zu%*Wv1Z&*UI%!vbLW1?B7V@S}n<2?=HMy|>f3peS1Ms~A;O{iydjNh#5qz%&zSjod z^!2=huhV)Uqgu|YR_rotKAD~*w@Hva}EhXseCzM_QpQPA8Q#lJ^)Soa56*wbd)N}^Ue`tpu}wDs*B z18L?zci80vf3zSUEaT&DsQze%+*N6{Rr=HxcXwsE#b>}*JT6G`4Oh3ul`@O$y>bWJ zdk&NLM+Ilvb^Gs+3QM<-?oD|bRmJLqVErKQ%sT;guyy=Y{Tjf%1Ub{6*KY!zcCArLy`LsU%gnv;aXXo9f}u}}_NvnzR4Qz!Xj2WlEx}Pc z#atQh&o#W>iu=@7*=BZ8J;grYZ+8mbCFc)IH;>KhXVZO0F&1a;WH=BetE;W>&KuBf zmVVw&&d-vcx=E2wsmpfS?Poe+rO8Aseld3P^Rj9upU<7qKJ~>Z7?R;386IMle;yq) z-%A7Xy;PL%nVsCundbBId@oO7^=5h4S8|(|;+RZcf;_E=FQbBrF$eNFfJ22Ro|(HC zsEoTIMh^D7m7r|Q$?({WEp|0=%L&J1;89k$j+XC53G;dg)qw>Rt*XZXHvjT5_#$o8Gq zz2SOT73&?s4)Shy!47g-G+RA2T4vtM6W_)77~~zNMNwwLCt_>UY`=u3siyMKsUnor zOAdM_BOxCKJ@R!ctUq#4Mw>K-GhMsvIFkjO>57)ox*}elzKhu)<`v+3J)mzY13y}8uSuoBqMwa$n5QFI<23mjtHBF`A{Y}B;d zHf5Hs0b!yBO~3jYoOwfWJh{I?8L* z%#IrJ>?m53A)i<-1*PO}f$y*G5;Oo(a9eb18{g*RXO-2KS!6YYyMo(+k2YB~}S{2iyfJn96 z?e4Fg<0c{Z-n2Dy3DpdKftof6Q!~E<9@N_AJ;@iWW3lgUF&0zIv6up5aUzVxiBYuR zD;^7(H0|bkM)d^1ryxBaif?}CDY*@~E9@&~-Eu-yqp?DY!FgK_P==f9@i22uYuzoz z7)n;J95BY2-E6*C$M~obg)zqZe)1p3m8}s+?-ug#Nm1nKbc=tGlXnZBNabykg%`V; z=ZQ(JFvr|&RzB?B-E5xc)KS!}uwtsNZnG%9+#OlA0~Mn;~UC+R}mP-u@rcyiciSDJ|^s(#7@XdCM115Kq^;)A$v&j*HXnEGFtJ{vvTZgwvb_m>`(R=xH8LZ z-@*P|D$*v_YO!XX)-QM#V)OraX1{%%JuO_5xF zq^tG)B4zSN)Av%peICq#d2qU=9X?V+=XaPaZxFr}aDAb^7|d@Ue7`YnFy9M8=Nbe! zhtv5u%i*Rne6N~plj&YW7+Ua3tDC-KYhHzSSUY;=M02U?wuw}tXI~@RCc2^a+l-#m zqjk!b{;=|!DOhS1-G6{uD8Dto>y#h*FtH4y7@M%uvCP-UsNBOrs!2P!g z_t=4OQxn=6qypSe27&v<9^ig!!ks=yeGjnJ_vb<2ZrB6dUro5j1KdWhy}pOq>MKb# z7TqkvWfz2%ntW)2w0T3)Ca6)M4XqN-ik4Y;RzIX=a?DJx5kCuPQmd`rLoM*dTp0mj zT=s+1l1(OyOLqJ@oAbGtzE)y$EGWAhjGD8fb;#SoGuIGoYfPYypwU~8=ZrDT2tk;; zAt8O_$?MCepa*k-hnsGtY?{ z-RIKvq;HX5ara3VOE=DSZJ$DHa^hu@b>4IgpbfW3_OTRt+CTCBNRV0HygIFoSo-!s zX&_EKCJl}gPf7wOPT;tPYq-F*<85R1(jahO-vivgm~c-X2shPZ!?pJYfxC1Ma95ac zPZ^}XC)w)z-5_vR?*Z;w6YlT%+_2X7_qO_O9R%*KJ;0S^0r%8_aP`w{_4UhExa=2@ z#XQQxIG^5z{)Wzv7W`cfm1~N0Q|zxA!WC*;aeg#lu|*#P;l+06hx4?8K8v!anq~Jw z*=N(T|6nQm*gceel3Dg2qQX}e{{7x8yPzAptf*{ZyKp0ftAm{Td#$7(?_Ow;%a(9B zhI(Pt>c{vMQKnjM_VYgm>E{(@Tj!uZY1-C#mbQMmhqnGK*KphKdC?f;wU)hMK-;(_ zl)}mv_b_1nG=;5U#qDMGli1#Z%>RR@&<9t5%ztIH%=8nuFTg>*3FY`8wKqN!r7KC4%|`>9vEv}6r?mWBhV{S-s5 zhOcws>tXtJ4SbykUyJG2by4g3^sZvZUk|5h|Ag=3nrR~@P^*)sDb3yOu&$pqEaTzeS>%9X>_JadRX6b<> zIJ9=QhlHFVGQ-tNCe9uS{rEbh#Bqs{i?(3;i#-3jv{#=Eqh8{=a+VA@e35HFcu!x$ zLoIDperK=#THA4?H}!1W-%HVMPVBQeNye4U^(=80oW0ucr-=URkNhw~I@Axwy2aOJ$aJH1++((sojLVQW8r zhaD_!GfA%NmM4(p<-_SXIqA7(#5uH~K>wxF>9>#c3Ey5Y#$!OXJfIg|W)S>8*FkaE zNlu6U#rzTZd~a0lR^~^eO1CsW+NYkut*~an8p=;B1D21Macy}OW&%G4pim2Rc{D$( zp>UsoUVtv{f{O6@5~WXEsYXy=RwdlG^?axU`g|JVAQy}~Y6OwyjXN?-q|-uT!kr4uk%3<^{PivyPxFG zVl9=(rw+E3V*O?GkQl|?bZDzSw@0^FWsCabxdta++gCweUD()?Y}3JHdc*$kJBV~O z!^~(p0N(3JS3?8*4uS7OVMdkElK>M{7kp17)0^x09TE7q6X1F2yc4M$Ky@baa~KlE zeV?<2oQh={c;aP-0;y_&`UJ~mf#)MlJkJ28xzebG>6RBn(ZW7RPxdXI;Uvjb1&m@R zgug1rsE-HYx|c8vt@af#*$Jyx^7R5PH<`QUHe6m?%1gH5a`PT=nXN@AwMID}kE8mK zGHN%8czmn{kK=&HwO#OX1i}Bu$Dy~pkmg9}EA(){bu8)}>6Z?b_yhbI>?MB&ob~$> z-mASHz)1A4l}}Zqy&&%^8K6N!62pQ%4;cnALx5Up8I=rC+6j7`%IQ)jMMA^T((!UH zhG385O&3o1?;Acx@??fU$^gmUc`!Uj0E}TEb-d7~KI9)7R1R|vRf3_zTtk&Jq*Qu1 zV5~k=J+Ne!5Cqh1w;R%#qxXqgQ>U&4+0!u-Ah}<2al~$Khc%4(@s% z`pd$xIE^Il7?`evuyj?HbgaF}%Lk_Z!yr({kU9NON1BJ$#0`0l!915yEjM5fgoHhX zJeQH=PoYXe3f{+}!0!)-xQS_?-IXk?l5l?tO1)AJ>7vx<80U{5%n9{O!Myozy%VTR za$f`cQN5Cv9KhEx^dEQ-gkMd0Yl+-RpF_!$93P+K;s2oDmE_-eE|6NhoCR2Vm4yHA zkp3>g<5}q}LSNp47eA!HHD(_dll$Gh=z-Eb!#z)0DBbIRW{&IWHe%YyF)qIm(hlM4 z&-BykD6O3Bo(>!YTKsFJncfBhLbsghJp`YM*yo})rI5GUqF-Qlr{`12bd7`EnV!`b zM)AJ&eCn@lDMwbn5x&jBaHN$U;TK(zHaWNSWd0EB6%XUkt2-Z}V3VQW(U3=hrAsy=1#Xk6@t{QF|#%`9! z+XesDCe@Z%e0$D!)tGxZ$Q$1r&B}|SS>=`}`j=!ni8~+-?j0KWo1;eGqNs8DEm8M{ zIDT_n4QcdjZR8hGp44U2tv=-vdWqGrLj2vL&*OSBmym5vFSFiR_cycN^I*OIuq_2G z`>ZX_`8X!)EQK@&(0WfvJAg8r18+|P_m*wCD_ZXY3NC|`qx?dpoLX3$vy<W945Uo{=;pql z{q7oShdZ_X&S)L

    7sCG9C9tGnuenD`VjSsGWKNJzo@(`^khjQ04c_rQmwD?}dN+y9dhT z2U)^|eAftJ!>CW4d!qGF)~V`rq~c_pUPi~-h~FE{>mN}~;Js1wMsrUT?+-M6XuE5; z-Oh38IQ2YoXViNBx)b85%|P5%Z&I7`(JSt#z}SPhi2C6G_GP1TJNI;+Y@SVWMRi1);zKq`z zK5@3?Q$Mw$hq=E1ul)i~`6i^i0#d%jQ@+Gg`qG&4ZOhv0^$2`_(}wS5X82pS@Q@k) zwk>?P8UB~3m1aaCJYk_38CWexP-^f2)R9pSq!jPjD8>6xq%KDMy{Moo|F+b5tXbB- zZFNYQ;qTkRCz#>y*}@Mn!#{}H?(*^MN%t{2Em?eL9=@k^&?dGQ%ji#sr-t7Rf%GPs zj*|i%=`!Q4j^-Q2q>+LM`qAUD(~o6<+aCe_SZbjkeI7wSmI3|v273SqbH!ItCW zC_*gwYro4Q^m_AQ^y|{78Cel6Gks&-&+FL@p~3a})FEl4)&<)BDDNYT?^O>)K3Wo~ zME^hI;rkZ9U`*V$e!SwbuOFX9yX4QK1zYuhKs?%$9Vm<2YZi|d9!kq`HRpHNE%Pwm z$Y}ZuT3?@L_|WfgQaj-%6rE(6K93$CtMqwcBA0qx(G}{sP(h8}ZU@ucELL!DCb?Pg zcCxp?+pQ*6-i~qyw)JGFSF9(0+sCS_9pN2ZSF3podde>>c4ecyLeDrUU3}l&Sg)8f zU)blKm+7xCJWdL_+zH+q%e@NRU+f<0bF{xupD!)-nd)U@V5nb0-)@kZZ^-ZDVxMk3 zX1$M07vCY<>$U6G#2tupy<(r{Cg_cPTDQ!Ri@h}#8^PZXSif)b4z8EK)hlrNX29uQ ziqqd%bij9d#hm{pnopgcw%!%Deo?a@d_HSG z%pK4VBYnmF!1{cguVzqN&pI>wthCj(vcV_%?Rdb3kM_;$V<|R>dbIhhYt}gf>M^6J z9^(F<**?MZ{*iiVIXjK__k16<+BW_c(pddQ-3TN1yELAl_#tYcTIxy*9qRLmx$uK+ zE}Y@3;WnM~+KT7sxjwP?^1Ut3g(j?(QR}|^r9QiUeU)Wj{yLw~`LBwi22^jh--~ja zkMGN4Jjk;;)%PPdq-5mMD&QN}&if!8^Rslj7kzzufHQYL<^E3EEW1?Ve#gDs;|-Cy zzROU`(XUPWsD7HAQ2aaO9nED0r0+~tKpMW8a+%ws!C$)cozZO7rf9Z$OBBn%F}R#k z_1)3z=v_b&;OSb!p3b#VaXtduy%ylNa`-MQ{23Jf3<`h7&SSx<7LN)!x$u9Mww%FTDlU!M~+(rMoRH+3eesB{ke0 zrAytx=@`9xp@i?j2Mm1^7K=}(K;FZMNIA67)5_~A^8k|_{X%HdI`G)pN^b* zeHv|7jJcbmz0b7plA`xSH{Jwv+UBS+XIC_593c;{O@3tbL9fNv zMw1&w`%fwn^Juqie&tGp%m+Eh&$hTZW}Z#9@Uv`r*4p;s&My&juh5%Tx$t6J-gUOT zSDNF<;NlJyDY`Re{(v-N<>E4KD&cbAR|VPdwvxhrstCKAw{NQYt4(%&&9;5;7jj%Bc&|?Btsl-XDYaym}ACD~3T6gh?znx#(;;y7|Vh?yt36o_CJH022HFtkaF6Klt zjIL+OI<~Gk*0Nazt47LlzCrP`F_4({z|dNag;ZPC1XFT_q&w?~DU zu)%Ma3m*eXa3z%liN<6&Odo`>P=~s7tkiaINhP4U4ZU1P6ucWk4r$zY7_t%UfydKK|Q&JD*Xim6`V1@A+%E zz4ra4z4rZH1JW3^rCLtEsb`?={P$*GKnitH4>8Z8F_=I41+RB8VD#jXdA*;Xqha;g zR8*g#TH##RF8@H?kX%|bzz?FkRLBiOp$^S-hV-iM%p{ik-KkwqsTl8}n(gl4QZ7&E z%hJVnOh!rvmnRaXLY{aK?I3OPM5|q*8^}RbRR3JJmaK0k3a`Y**JFtv~DS^p6AClrnna;Mgf>bA2%S9#FIN9l4KylyCSc zz5O}Ax6Zqxzn5HzJh>x5V7A<)X~x}g&A2D3NpDNb+|SSTT@7tbNOyX1{=i!JjW`Sb zndpDu5o>{GX_z9@u_*W;kmyLQfploo9CDI|kVG01qz0tg6K1s2kg80$6m7#t1K$(e zTx(R2pflHypP^4mZZ1{APQ5(rI;j-*u4dz{E;I0!%YZYdo&;~nttI>%>?qUU@=L=j zE&9fhWmfrUjXCzr{!t?Pm$5$URo5cNB^fhxn7!Y^8tZo$Gh&+29f$9)0B8M9_Y7&C zv~aHLN2+Box-sQ<=_YuK!Q0m$bK>cW!NNzAA)46vsObJTPJPzx4a+4IWD|KC_gROUP~>o z^9?F}OYRW1_ewdZ*OF1YkA|89JY7almPt#zK{=n=m6qgyBxu)OM!gGB4(Hs{) zgxd59O3!3Y&vNR`Y4ofS9J0Rwu#_cUgw!Jk6r^fM;n1Iwar(ZLx-~dO3dNONSHi6z zPld8-==tM#JXgZ@MNxNue>u~u@O^(g+m284nch*}Zp=k39`5+! zd4z=W1gsBIdld;Nr3woltppXkf6!~<{%~_%zE^JD2PkbX*0p{E@$9TzN-I7q2R+Si zg(&D(_ZbjY(66R6gi<&w_fxr@rcBfd=MQ(4Gu@(*ny6tf;i#`}ZIp3r)!Fv*vL&i@ zZK-Ux(iJQxs){)_Q4=?jSb3*}YUiEy2VAbx3cB=zRiUG~3-IB&bPDPcX|J*0wPu#F zzm2~VXD~V;zMJz`Zpu?F@#1`T(mUC#Vf~cPszV-q_WoL(vx+_`m$e8jur8mOqMX%G zIvWPb>qMNbaVFdh6NZt1yH4)!H)huXv>o(`&_*s|wuVg<+PeOM&~}^9IvfRP$xl4I zO-rCn<9WY1pm(13^4%P|tK*_Ke3i7TeFcI>;;^2oMap8wQR$IFt*Ql zaTm!+@1uVab1C^$MSEPyHXfkyeIzN{c#vhCU8ah4w%*1Ye`#2v!eUvi*^`wIrT ztInRmu))c_zZp#jYnkRlv|K|}jw`s5J7I(ucsZ?=^LjJ%oAvI_5dndhFGJssYuBM~ z_iDGFeW(i9=h&eZnP8uQz}Z7#Et}A8q8Qgghkm1fCji!-XdTc3fzJwWHC} z53iW@sx7zr@_IACY+VxMBCk=~r1APuOvtA`ZPTTMbTPy<0xeqGhSaV=(?1Ca`Q$aA z;)hTwK1nOsn|~1)+}`}BfY9$wvdx3_ftmql?C`HYP_Q)@I5R9*WAoqs6JYYK)PMUr ze!}$#&8p9c2ANL8fN=DDt%H<4SwmmTed_dfs@qc!=ikS{cXDf=dOSWYK2Y}o7-&lw z3{J0|407EOTCZA{q5d${qk3ezg2sB7*CIbXPfTb}{>_VJ0H?gZ%!GBg1=ivJM_9)d z!I~*x$^Um)$8%U>%+3i8z8`S`4`-zp(q9oAd>&jI6#D(2yGhY}T^Ow4=X}#z!S5B5 zH2)~z={@Z#^7pBiV9OkNeP~Z3!E@b&`YVi~KSD>H zV<>H}LQio23ufEzVNB6)J*N+YoXM4V>p836hi3g|4yfM>vwjO~_4~oB-%P0A zE&reD_Yu_ZHcS0(8&E%1RwyLa+t*>sfF#j zl+|Zz1yAu=y<5vx_1Nahn2^x#b!%9<&TVP2Z)!qp9_7?q+nG!|&BJ)r%#kX6H*;KQj&-`}tOsfRw!cr}ptQ{-=IysS5qfJ>o0LcLXk<9TN1p$F^Sm z!3>{e3%}S5pRHNtxGO@8?w+cj;i<))FMfmHqIP;~x%!QV@vE1#tCUYY0r=Dtv|1fc zpPZoO^_$yu8?Sd0$AeSV3m_-fE~g&WZaYmxG$&|v^uB0>cV9dDq|d^8 zffhdyV*Ku@>SZ+jERFd(nFX*{9A(!XEiuc#&MbdYyFJbGW}5kCn#t{UKR>VW{>nOP{Ge0sSEiCEd)BHbQGVZ7U>Tg zG`(X$dT|eRX9YWZQ18&0?4*AH{CikBl*>nTP9J?Sl&!r|=c)+)wrR}TW zG*!PuLwmZ6eyMga-mk0A(~xh$R%YUt!W@4_Vi zrnSPj!GtlN!?=DB7}r~1%-1k2!iWGDh`4eez<366aMG1pcJeh^_VAlDv}4XTT&B@8 zISo(;H6VGY6fjTA9=Slv9(AkMHRWb4+cID4YQ0{|wq2rir7zX+JWsaa1`TbevkeP1 zw6)GQT&$rrd$!?rcn*cZs{B? z+jxss=QAS!%F+q_j!uzcnZ8D zaUqoRArHTnhbRA0SR;-cG6*iK&JIHN;tRMecCoJ+0_Otl}35y}bYLz+fhQ>62?!g-x9y?8b-0nfbp8LUqp zX*lu7mBgcjiN`U5c$^X9aYgC*1CJ+0WUo#{^i@eJFS%pLwiJL8K>`MDqe&>Em3xW24u_kr}>P0rM^ zciy69AGuL8?z}-m|I+w0?!HDd?zvT)dhgYm`}H$jI`7$Xh`msode_xjU+Rbs)#-N` zcisx`Z*;uo%B$zgD71C@neX?Rb@NAt`SCiM*w)<@RlC49}LEx0d(s>AMlfK6tI8h9rLgtoym($NO@CdkQgc zrzgiYEYgeyfC@N3PdfnDR|Zt)JT2RBi5P2(PBO>?#_jp(zX!-Q^qRl8(4S4?fchFR-< zuBG1R*xkqr!YYi(;D5fO9=a@M$!{TyMg@T!T2I z^mWEM+T+ZoDX(vBHwe3H5%IYN%6S-h0_P~8^}q33y&PR_xhd&3jr)X$^;?pPJrd>h zePDe>?8h5%xjqGIi#IqyPW1}PKjieGGub^jGYO8qK@#$BtT(4A*U%DcaMk7|;(J(m zhwyL(?_1;W=K3j(a@)df4ARJ?|`u|*No*0w5gw5p&2VK(xh*sjqXq9_z$MH z$7SEU3R2@*vp3IMT$dAUE9Pnchq{a*NA$x?T~=5t|23?J`xyHM=6yFgo35Az+vqQc z)o}lX**I{PK!dVz;2wd-WaIPUcM1G1gWnDCTL{0~;dh~i79v-}+f`aONEGbMY(ZAo zIjrDgrnyGg3o%Gujdc{M;SvMG`(Zc^jP)~TY5iB&-u8)(uX1a z2%7#;NJltV;^yDm+A-#lqL@c`jFl&-8qRdNd9|j4-6I^NDREbU(HFcoWDJe7@{=O} zSjZoy`D=Op3S0hq+IB3tzrC0z6>S+eT-Z@y-M5={-(DmSA23|(<&NX^!JYVhdAS4O z9y(m;z7g7v_F@~jNyGWs1{%MU*U!i6!M+EBdz20Ct^sh{ZSlJY#80)A+h0^}{~pWD z+TgO0wc6Fq7|zaqBb>tcQT~l$m78NBa_81I){|fQ3w@tlEz0XP#|6uiI>ZR!n{`~y zw55~HbaF@GEEWD;FuaD}3I2$dl^@ltbMG44-0PAa)5=WV@uuNo|9gWwC=HP>I5eL+ z{V-L|G(M(X7|f;S9;PeSJ3#K?utH>S^q18kkusCNeR8<)$FtF!kXCy0`u@PJ=JjKt zPx7gQJ7lHI^w0n1aG@*Q=*_2&=|KPd2X_en{H#^Wt!ebG4xK`g6zds~ABWrb7arHT zSWXzraPF<8GXX%)k8bz{p#ED zY6E-QRA|?~DyZ@KoZxFWAspmB2Zwk|m470VRPo31^ zq`GC4A+|S4#Hf7^=43|))jaEOG)aIj<+6a8DT4XDW&bN17CPDI&AMUCj4-n^5jwhn z#C*xVpml}*Y@y@73v;<%fy;=)_p|hQ&PE0CQ~`&NY~ml8shfY^GTc zbIriHW~LGCxUr}mFKPw*+6Tf+*M)bw*E_7ZZs;#*cn3>@{Ngp@FM^Df=|IcSmo$vQ zJ9Y&8*NWi3Z0Y+C!c6w#ea~dGnwK^HE%)iuJMiAfa;X4sa}m5(E%kMe*mHef;q~1N z^?eoUdmOFrD;maNeVzRLpFTpYcd{?1cBB=$|9NAF>Ih2thTA*jP{Fov?-9&S1kXaC zt=z|2y`qsiM>*+LZ{~ROz1%>xH#c~*>T;;78N<&@iJ0WZYzY4UV)~C7A@(hngIv>+ zw)%oP(i*3?rgh6*Pni*d=3&0JbTKVG+7_Qq7oXXhZi{bE7u&ec93gP~W1GF#iMD*1 z0dRk3#(%8!s*5^`>(%>T;^*4nPaV*%b8PX`2E<=ri$6MD%nMvqYsm8zJ@< zy3!Jd(v`N;^_y*F96O*6x7*^g>0+N?_l#hA^QrnWz*fz2W_&ncFy@(_HgN{N5l4;q z$AHZ@QEdKLLo57c8ro3_U!aePdN&-Ot~DqWcuN`9b>c-EKK+K`lZ)H2y)E)joso_= z(-iQgH{0y@MH+o(I?kcYOzXC_=qp)ABwB?(Xww?{xX^Wd} zi*rP*aVOZ~N^Nl`+UhbaVi}{!#2%E_msh`{)bj_+9#lhQaN0RJB52_cn$?zJN~BbK{~_S{;lnJ`Kkz4L#>JQ=cyH^+WtW4F%)>)}P$Y z?02!g^CFx_?}a!iLZ9gS9c7pm5{Y&8LAi5QY9W_S-k$YF)5VGTM3ONk)3;i~cPbP7 zDD+SZBg~IQNJ2Z8bLfrbolPrYtS{>Z-cialt%iDC+RZc%=VCmp;tRW-z-6w|!t$iO zbNXZaX5NL}Lu}`0?~e>_JDVL-u$^6FvEzR-!fYwVHM2czylnw{m)YK2fj6PawdjLF zf?jTjkrJO#vqm%IHJb2`pZr1K-d|0;U84==8~CK~r6~{@3`_yk$m-iPaZfqD+aV%!pxZPfzDO_St*L=oqyqHp{_#Vn@dC zY?6=#7Y>$IpPf-{Y1!|OX1(J8?`&G{Ca5?3q-Lo1AByUI*By`{EqC5GF_2T3oujHWtyCRC&I+K0t^*k$WF2}0Wjcq zO(G3n9EMZyYhg|BYm;JDek`Vm^#bd=AXCh%RNLYg4)9+(Ml0$U^@a@7(z1RL>GmCv z?nYZW^K80ipU-Z7A6uQq{q`6~#_AkHh|zvzjNSHJPH%fQj3Z)wsTVUn4!!= z_S))^bgmBu%f;KbP~-l3XggF(JAAYqed4g72W^`vCa%TfS@IyUg;v7krmnz7z0WYWWVscgXS`gzsUNZy$UQH^1v(E=cXD z$E8%$@f^(EN2kppefrnkShJy)lo-Do)`2gNahUOHQT#a&UpKW7Us4o54&qm43h_gV z;=hIXAC4}>R}{tH0`Z<{A|C5qH%Ptv)bG1xn&*%~+g03-;(8a?v$$RZ>M>{?R?<3D z9X6-5PhSlocv^8zX?E6;u*ylw81n7zZbvGHcYPmDUMmhxp{fBuO4C&B2vH>bC6$R*f`w z{q#>}&a>_Q9YXDb667gp_rhuDg+=&ZIn(u7hTTn@Aa6qK4v0;zPmm|z{YrfQF+pB} z_rKx$_X*OEJ$Vegf0-bU!FvwFKS_|s;r%>(|1d!wf%oI_{htZ)EWAI6@9!kY_wc^` zXn21;K^}zn4h(-WLC%HuL#D#}GYK*t-hYA`B_Bs(R?5yOqW&Lw5cDI4{ep5n%JcL- z2$1_wcZ4!F%G0<;S$t+Z9}~28G(f(G(%LCNYvCug0Ij{hh}OOuv(s83E4&>Ovci-Y zI}7V&e&}M{jsa-kJnwws@=R=Sk@>{!-M?L&b6(>U=bW=unOIkKI@UF^E!H)vJ=Qh4 zBUa~gLhdIZcNraf#y_nCxOhLLaZ@H1bY^buh-DU~V^3a|S=1hzFS$Jvp3%vtZl4UC zx?2j(cT2wI4tM_qr5tFROF6>ra-`iZB`v!gc&qPnhoe8aVY$;OWo}N#mh>jS7CuIC zEk9Hj_T@>RaeXG1S&)up7PiGQH?+r=+?%s^&xypnFrIcahG^W=E1huxC=oFxF-_}C<};Fs#3zGnFpag4?%ktWgdd| z$R4jqZ#)R?_4c-}nweafTxC1}U#W5+~YAxt%25HzDXCRl}gh z8R&)XOefU2Hq!}pCbD8=pms`c$Eum~{sDJ^2Y69uJOI{1-1TVX5near7Y~TXzjyS4 z?}JjF=N~$=ZNfZ$;`4s$^vVdIzDr(tffsuA2CdY17sl_e(7S(wnm&~I8}_c(7j#b; zR!tTtZYT8Sv|(h0*Cj6*bA;F9T{^#?%=ap;AwJSyQ37O?JX!MW3sZa!FYVzqnZKrE zE4*HL$%5r>x0L)mK<~z3TH{2#hWZE%x)A#p`MRz!VqI5u#=0(@3csUc3!GkG)wFPF z_R?vwpgbWnf*hul$X~k@b?K~r0#EnSnY*Q>seWQWiurDbw8Z_X+wHjK48UEygB;{E zcHYoK%lmzt$$kIpT$=`S4QezJYBUOJH2UaR8TDX{yva3jroT>*F+StMX|c>aBbK?S zGnTn{YHZ03nM;n2ExAv6R(fZy=P8Qu0^je53w(bb@!XYDpW*m!#Kv8U_}{fLz(xV|LywV}$>m0YaLacZo~nU59p{UZ~? z=j5p|EB^0ghUabJ`z3^*k6g^U|1v&dr?Wz)tWPk#67ZL))ts{o)Bcl5Bg8GnxbmPs z;i>n{k-9R&iN6BvK=Zn<(?deA%mv+{3M{_@I8;A``Mo*yd-RSRNL1|an=5V2R1go1 z-I1A3{O)>pB?(nX|A!oPmB1lZ>>KltO5%|!2=WskNrz&g{d{$yYT|JQNc{L<>4cv( zGFf$&GGD(cq+0=$Yk6rYNG+v4_v6Vo;s2w_*Gelqz6w%Tu8`5?b$7>NVZWa=SNXrPYzDV*bia$30%f?A*Ggl34AK5d%1-on9-alo^Cm%IS+| zUW|6AsoKu#eSXrL`Xw{Nja*WQ&%b6UqZ57ZNbyeeU4XW@iLxFjqj6>#8C{lBpE4xs z9q4g<(mMmtKYNP!d@{XD;FOsCZ`+Dha>8Uf^Ycqv= z+Nkcjny)#!(HSS#rGBGc7rUDZQ;k%UK?8y z2dMobMMyei5bYx|`)T5Ue!7eH)19$`Uz^F*Ool&3zbkf3{LUEGSdj{6fI1+4f9ikx zm_|s^bZ2altRT(qzmZ7tF^%voDbllQ!DcNaA4F?~I$)9hS-Dqjr!z07zshGMvtA3y zhnT5_B^x`}$mag>)ne{D4Px;_+EdMVs}NA>-iB;vJXO$5V0^DF{x~yU!2LrJT(9t< zSk3sapd3^u&WMu&jl~*wa{7vNHRL#e*4%o}NXStNrOoU-?P6RhT%=wOkf0J!>SZ^f z+6Vp7?rvDq5A6vuP1L{n{iI6OxQ9XhoYqrIZ-sfdH2DLew|-)s{{eM68~yZ2zv&zb zYkOE4RmEt_1Ly}{s*?~~4ky+ydS4IpWLSEkIwY6E_)#zOP&cX89|}t^4h(gKrHOk5 zYem=$>@#OrdM{BF<_=4vt7vY;lG_)Ss+t)fmIcd0DxoxZZXnkwk>mrxK-GwcOM_BtutZ9JCv-`%k;1o4Pp8lwh3J_eLPn2d zHoD!?%2-}s2QxiewIr6Uej=6~`D`pZ>giZ^^fR$+^08QU%%idFUXRDJW1oy=_kK8* z-RGfLcHgIB+5H}g(Gw>6b1{0Kf&M(Dc3FKf%#})d#{nTHjTC1)p$$bXz!d0b-{Szf z?F1_50$S@HN<2Qi*&);+V%GCEH;!cf25~*1 z=hF4}Vf>Bw5?GVwL4O+YC(O5J;q5~D_MG|ll==3sneJ)x?J@K1aWmcXX4oTU*kUv6 zNgl@6BT1YSrgv(YZFtnywr9=o$86y*nc<6V;cuAXkK4lEHN%(K!vAT8KVb|1zzl!V z7QWmJf65mAg&F>|E&N+E{25#LYBT&37gtaKFBdz?&OjD<X|3&CHuOStb);mH>II zW}7f!(Eu^B6oq603Bi_3L~W~Mf)VUj{i;+;t*r&zZNJvm6@y(uiet_C92eY_2bbdH4SU^ zt?fSI<;#HOsFirv3~3f{9Nkwx9EIIR4|+xl!M>$_)e@qYuDJS%Xi7a1cT_#9jcKKr zN21*~J{s-*&0}m7Zg`N5!VM2aB^ZUvH*AGx2|WLfJ3A5mab>mNWkiQZt%UTfn!e_7 z`0m#k7xB9OHomXsP-c~EY(bh;O7p`}<1fWi>ymLd{2nB9%|MxS4}GF<^{o~2;deT* z{QMBoKAy>{6Xa3YiGFx?hF>+QujZDF#z(lf{r%b%z3lGjuQHlxJAwT&<7-VHw3zOI zBVGQ?@bvMfzl%6(>EH~W;=NGM*O@1+*Jf&{z2*Mc^_d`^#C<_*Kid~U+AOtsuHlZx z6#%a8ufR`y+LlU${8oouYY-iqjZ^&Fl zN3a#6{*or3;MSh+)7Z-)Hr{!02w=DhdNcqWr5Be`6Yf?i27 z(iU3QTk~a=QqpI+GO96{k^UBqcO=^n#w%xd)Qt#s9k&$-X7Z;)g0xi zu;V{k5I<_i|9e6Fad!O23hHH&4S&15y5hwCUVlK<6qO{$v6C2R8hvg7x{VYNk)Y`oS1`eSQYo>~6YZK4rgcx8I(I zw?X>$r1|D-TdPejt~SroW6wm{ZLVjcagsl^eCOODUy=G;!!T`q0iFGpp- z%Xxes-oqk&NfYmix&ZIW<5!|@Lh{!$O}rQtFM!f2jb>PiN*AaJGGAf+HAs9OofwDv zwFlc(>uv)dY&XDmJ760C zwhLgp9I&4NY#3m}4%qoQJvf2fbX;6FBHJvvEeTkz(2I%y9(g{vf;Z6;9uJCmkQuVZ1_+CT%2IRUoLUsncl!ja~hqLtQ)K;k_+tP*A+8Zl@6LTedN8^e6$_D7gA=d;_pOLLKO)_2&xoSv5 z=G9!t)kGRIdvYjOi4n?!?XzS3!_xVDI`ELAGGSxo5J(|b&YW*joVB;wgugz%JK*aF{rT0r^l<82j0Ey)Ps zD9ShLYD6m8S5_27MA9ytAE&BHuC zk+x={hMGc{ukqpl_drhw;y@kn8%j$B7H0_Klp(GRa0u5w9pDBrX8Gju-$La~5+)1G zi!FKubn|6obS%lPZ5N2VZ+9QvPuf+;C108AFls{}jPJ zm(#0^rz7P@ir^l}>Gj5gk#gL7j>O%a)8`t0jFfXla5v}lcH^c{ ze0dRk6W~?ACjlQWf}a3*yvsTc@D)Yy6@d2xz7+70B6ttr1AvzRUs(kI)e-a+Jb`?6 zBvM{g1pgl3gMfb<@MDYMUk1Dm_+5Y>R|NkQ;6s3a0`TLD;QtEv62Sij@YO}|n*m=6 z_*(&Q6v1B)_%gs>4fqK~@RtF;9PpO{eqyoq2YeXYAMlfkwLjo1u>Ao)xmf!HK7#EJ z_>+sZKj15|{Q>{oV(kz3QP}=~|6Z~72mEMkf55LS*8YGWgY6IaOtJO{d=%Rs@V&*_ z|8Pi%Vf!DBl%Gj9c>e(JgrU3#_h;yz31zEzmke$9BCm$_ND14hY4D4|uLge2@LLSOmGJ9> z-$n4-0Kc2yHweG2@Y?~ueenC3V~SN8{9?H1a#fW7nF8;%@Jqt434XKSHyeJ(!*Blo z@wfE<`0E|<%Z~V2`;QwZT6>>8_TI-sB?W}sHj(KvXUO~JzJIyCFS@+s_2}}l*P`9w zH==%fKmE6fmW<;yD&vq%x!P8MA8+sBOUyldduCshStiKa>T1utZo=9#uSLs%k2r?o z#aUdCIODu##tCs}n&)@vo;RW?8tW?41`k5mTZo%r#&XI4+$L>96B$nya!oEcQ+#fY z`L)#+m6*p$2-_5{c2cMi3vW@E?nj#Nl<_!=%6^NcJSA4$9klCiUsQ9*js9)JUoVgw zeKpbIqu+=+eP11!$Yi7u@{c)aC*mM#Ns#Z8H>3G`KEkA<QqQ2LaJ>!eTJ2)$*T~QnkTpul{N0Yc=B~$ z9&6_5DuWzqye@Ty_dw3L%}0z|@LqQl)WXST|KzxTh0k!_*`H*Mg?H?+VBt=mWZ5wO zz?Ol%<&b%;o@BMjTLpWbwIkqGJDfkF9c1%67f)j6ap=SJ@iz41h`Q8u%~0<`zxH9f zi)vy#fYMeDPfY7)f0m1g*9$1~nPX}{N5mWKa7uhTmk<^!eX;%RRm6DJD$kvESr6D{ z<*j@97Hu_Ow`-=qWO|oxlI4H#L%RZpgO?DGD*pdS8V!#^#6zc3=cRX;-` z>c^t{6`O7$ZP6{8biX~x++#WFt^(>VK=sq>n!QvHy{=g zNVLADgqS!XB)UocT-37o_foX)ln~Mi)=?E_?3LrjR~GFhlSj5K(-)|i%xv98r7AYfMk;`do8W<}vO# zV!W>NC=asg>*UE+eMRj03YzwrRsrrddNv+T!%X3hs8i0syq_eB+N6#m5%pXnA1;CL zn_c-Z(4zi#RXz-RFEyz4Yn5rd$p@7@9#W4Z`l4*jJv~qQ6xVc@NSfpcME?$!@=2J9^nWF!$5nk4Y6Cn$5?<^5 z84^+_lOZ3^VcMsB3O6ktB10;MxAr{6sbYUkdHOFRryCzaZUB4IrFx8)X$;8wDWa-0 zhMMqqDyUf?0nJs@P1d#*HQW|;rroecjJGe-O~<5^S)AIQ>?Z3fIZf}hOq{5 zOCWCPA;*|YPO-+&p#u5&^eN0P&B*iZucQ63acPv0{|Da2(ziqATd{MH1$O>lM;U*> z@;_+`JLl9(byq@U>!(N}GWMc9Jp)A7bRoU|>u7v!^6W_@MXFH31L0O#7Fdk*`oqzb zTtc4+P04;p|BM5hk4q&QFNfsGbVVH?#&CN5AxNDh+>-SA|G--v;o49(n&QWkki=Hr zG@%+ElD83aNt5)YhobB)#fJ!b&In24&6p8s%b8ZJ|Cq6`K1Ax7h3he%<1)sMe7)Rc z*UNtj=CoUF_~C*%?anF1=d?dfvBu~GdyKlxF?v7XTCtABeytic3WbPNLq};l^)pZj zRG)9;!!X9Ax4QCSFN80w%7)PKmVDi*tL`V;b#Li_O_^%?ZXqApWAF%!!5oZ163g4vIBu%t zQ`5=grsGFoOx4rTMPlqNKe}u`W>ak+h6R17-G=81;GH&{#GHNWm&hG`oC? z=|ABIfLl!amVQFNmP~u_L`J$Vi*3?o_nv7J^I_~gPDn}u&RJq3Um_6~rrp!C3flnM zVl`1+b{I-7p_UhpOPHbCWL*0K#Eb{IbSr($Q`6F1=wbhmtBen^6<5R9H9ocYk6Wi& z{KrANJ@{C6h>PXt!h7xd;bYEvd%%Ws1@MPP#JA4q{yx<@qq|GUpV0|1zvB+y_Nmq! z{jo_;zcx3`?5;>aml*Tg{t0$XWx5GNoXCavV`v>z!P-BAxQHopB^!aL{u(76;uRkK zOSe7ro&9pADf*Ps4iP6aoWG@S!mn2vn&TPEkPkDSbbMK z#@ToCXRIRh*cRG%CG+j*z8gBmsynfuPQx}_iaFP#(Z{f}t_;*8=8L-vrhmEL_8Di@ zf8rQ+J{uvvntc7su?QLOI5Ty{oM)!SF@@>dx;~ZMp6Z8;Xp!2QIyie#cf2w)6jp{*=^y#ur;^85;JD0qul!V+f zXrH-M#y;bt^2c*{)xF5gZmmfpx~8r7Dz|Z))0XxnHOvnt+U&|e56jP0AM}!=Y|}IS=U>#Y zxwOA|X&ODSp|1RDZGJBslT0H`=dcbm>c3%FHNK3P_rx|s+PCm7wpSNXRttQOntXg3 zNt9fuuHkk7pA#v4h#TPdz#F@P4 zlv$!k@V;X<_FnG-qLeh1z=-wc@A16bi+wbIOXq#mxbW*fJdX=OwWR!~kxYp%#8>TVx~blw=!hG}_Nv9dM)?){ikHPn%a z6CP*?m9kWbou(xS($(tHN-($9kX8~Yc~WIxzO!c~P@gIRuD9gN@vM{~3fCwcxO>>h z;2jU+-bl$(PhqOha&A3Dj8C}vp%T15R}Nn+q5V%26>++FIx$PhhZH5n31p~5 z>DWYIdW!w2;<;5-5{z$D(tek zloa)q-nUK1lm4e_L+}+YiPgqlL7w2Ue<4)zUo>SaATSep7nDX(Mp!ISXgpWsR2AHOKb)1f*=3822*T#vZYF#D{B{ zZ|7FR@n~-mpQvTUY<=obTW?a{Zx(^RN@8>;DzI3Rad!)T+Qc87c4U31U_{d_4`Tx`&6S)=XTt$pM5&5}^x*NyOCAcEN z+_awN?IA-lp}f)n?4peKsP&GW7DZKSS*gyUdUa5$I}+x7mw!T;5**6(+L4bNo#EWj zhey*s3@uYW!0qoXH+jSX?tuAj-FJ!lbzK)RKCWTh95vh&4gfcL@7R&>wOm^|449`J zm=45LG*vtfoD97WQ!DOA1ZBa~%KSRpruJ)TykSUh_CN%nyK~}*lw%^?90xjd-1?Uc|#wMR+AqefWgl<;Uk3q6RQtl&BiJ2{eI3av9ze!4y|p*!N{{r7{a}3|zw0vZkUd(@cp=#1Kpo8;SDYKd@5bnN zVZQjvW2Su>(oUedQrHe_I#s&U!nA@lb6{FF*7&OUoz&{lmpRPM$!Vs|(YMI5fAmp) z9t$)u`D_ZfB1?ys8=*tX<~G^Xp=G!0!jKx*z)DE}4=OufnJy>LKZR#xH?`7pFUsai zW|S};r--n}Kz;^sxN7#-^rQt&6(hof-Xd_RNuoMTZ$*T^6~ntC!b8R2azt3H7lFGY z!iI50;IP|Sg{!hBBK%A$#Agt%q?8hZ8d&k0QI{)O<0GwtqM50LMeshPX`Jy%M7W?B zJ>G~g>@Nc6@m61j`sIZc{x2^~2=kORzD-nz;EbFvi24Yp=d9C_I--PTgqW7X$vIu% zQ3CjXRp#{-rMHJjw!GRM)bU zN=Ev%|4QR6Biy-olAe&9|;XtTQFT=FOgn7;|Z7`vn)i5BL*9prJ@_%uWooBi!6+4wL-+RS)qE8ZV>kf&wiwGdFwFkKer z&K=}A*?2w#G%`$+h56?WvQsvm2$9()rp3ZMvV-iAjRy+*wN;Mip&Th%4lCV!I~}gQ z&T_QbT zqb`w`3Gab#1D8{$AI^m!uX>%{4Eel)_t0C=jXaGNG7c2x%hrd_lh*ohuDw3sEP#86 zBY;CIW4agh4Sc9?Ao!!G-7F6VVFrB?VO$1g7)yE-5iq9@aW_d!sV(3ukCHCo?G<^@ zc(q>}NOSq{Zk_1$xCU~9$|p##qSuE+4_y^&MZ7@|C6am@z#XhnPK8;|xWT8u*RP#IZHlq` zGyUc{8P-irqwU9K@%icaT)%by6VJvPtuvB;S!-x07VFl>z#1BjttcJsI7jPfWNpaS z!^QSlL@d@HTSw0##@KIB^Q|L3I@YfZuVfza))hUcIJMDQ55^R%6F;=!(E@m%4UZMT z&uO&o(~XWfb^iaWvA9hA!bYp_tatDh>|A#};Etm_F3LQ0Xo*YkjFgYKTBaiJnIVd+ z$%VHABCbQ#{mqxA$DfOQ@K@Gu7qFk^BGUeGh#PmV%0;BeMDrbX!Xk-?KkAN1?Ew=8 ztI3{~u$qvBv`WEtIzD7PpD)8!y9@_t8OmTLL!GlH8reD6TJ13E$&l>geJI>w+M*DPEa`&+$K6l+|xAC$^ zmy*c<8I~n}-P&!}E|f)SNS3&TyeJPz5^ww~8{;}oB>k~h(+dg49Yb0m&ib`OZi#Dg zi|+M5Me8o-xpCJl(|ocu_ow?^H1&Hv2PM>6*JDAhfzA`ykDm)KaQJ;VZJK2Zsft8= z-zOchd|RF|&Gdm9Tih0h-rN!E)|SUmVuQAOyS1(u>e87yUl149i1-(}i{6)0ljrNC z#TQVgp~A;wEn+~Wp)*C&;tHrkDxQ1L+Yb;^BO7^DK>R&ZHo1NLv^zw?J;nWu#`>?n>^j8+{(&v1P6CfL+_ZYTpp?o2Wob4i2vm?H42v--?wkG(R*>M=pGN?+{lbPRgFX3AW~0&XRhVZEOYP|d;(Z62a1XeSq* zTtZ~MgY=&M5ulp(#I3*1|a17|Zj; zQ=6FWB+H-uI;BtR?I5IE+eGo!edwb&xMq>Y3Z(JNRU8nErN zz1Ebs&o;e-ts*|tzSg^D9j4S~l96kvb*S^H^e_eW+SLaA5!RI%9e7@wzI_vL8LRM} z&qy0%2^X_>2K<4H_Riqx&UmzFU)Q5;YdX=k8Baad$dGeS6s?x6;n1cT^XiV!41@oVt&uv7hB)49&e`NmjwD%?G2O}xbf@jsix(d7?zAjEZb)Dr#o$%G3bfY3+!lkmP=ObE5yVm#u`v#^+9)Aqv z@+RaWK`t_(ao1toY|R}V-7fgDo!W}m_Vk-Em??7gx2y0KSMjgBXnn<^vF+(M%v2>K zXjL3vrD;FKbaeH+qF+0%16NbDZD`p``+9mYdug*ftb4O1lpBQjGiu3QwC(Qe2@u7b z@&Y&F&8QLeWqg8>9YXu3{xq}DE1On#Ta<@slq$*d-$|+ zm=4W3L!WR|>bt6~)F>%Oi3p|&`Oc+hE)1^Q@R7M@JnzL|B^Oem2_)m49%T~dQ+o%Y zXGh)FC@Hr<n9xirp>&O+s05{S;;Kki}`+zU> z%rT$E>;w{e2NuWfE%5DUv7e03Y7cjymT=o8j{+b6V#i$gdPC26;)LUVWG)@y6ehM^ z`e+P$Bf`^EQ+rbf#mAoQNRhT516C0DE_kAst%o|?bcJ{1r(Fqik|OojywNdNQg|~g z)YY9tCh_MWzasRi4n0=sw;Iy{MH?!+d&bgLifV(3eX%(}TeT1p-X-k&dV4nZ6g-W; zhlF=5SjdDu5E1}jK%c)pvS9Tl?2jSgpb10B>BP7-Bz$benrp`T73^&~n0`?i2?-yV z_#uH@gxVli)EAVV!_pfU1GXq;0vX5=j`?aCZ{CZlG3`W;a_n>7nvwT&X7#7{M)W6( zSNv!OI}dz*&ei0_L=Lz?p4-3)B*f=PV_YOx=mCC*PI6ZyjQ?n6Kagj#c_8Hb3V0FS zZC~U2H64B!71*|0 zRGgh@SgE^xIEOWPAw6e>dQ^r4C8w8WwJr1ugVQ(gij<8#({T*Mc$DUs)%N2EQ|_KP zOPNf#pIFp1DI!7p6pb%bktrenqahljf?t*mQ_oaecPt^`477#y=Bo z=#?H;Lmm=Q`o?0f+>E?4^vWj6L%)k&b3E89uOroNzoRYJ%rx6_alS3jn>liAWgbZ` zn#uIVu}nB0Y~(pPTk~4aIIe9D)H~1Ty5?YAKZG*}tfRl`5O6)xo`7&bW_w$zw>6W= zI8m;+8Db8(6soE8eaI8udGnor-qq~dBXh>!n!)iyl8bv`DfHXk7xC{Y3D*UxUR|}e z(x@9I>U+UAWn$&E7xL04)^ApcKA~ZQ1b?S(aFM=_ z>pS-L=f6l}Md~*n1KfV&)ex(q9^*DmyL!AG*LdHIE$sCOLX+p39F7g7rfmCdr+7$^F7h*ja;-^Eb5X5SRSb==3ZO~H#j+nQH_--@i_X=a) z3NgzZF*k+yl@Jqlx%`C?(@z+^5c8&dtO?}8T!_1fG?eNj!bzrPg&u=aUIZnC9#aDS zeGuaPFgJ45yis$mn#ER2YupaZ%G--pOy9Gv-DCWB0X}s3Nhl{40NxcYLX`jupw8r*? z*sDgQQzqjKmnPLB)8Rn5)SqXu^(Q1k8*m}M%oP&O;6tvlME@e>K98{;iL;ojFGLFcm~NkSv>k2C^;v*NY5W*z;1q(^ zmKr%1tyvx7g-A2NeenD)z&$9*-g*Va^2GS0UwgTOBgO$j?_<(?ZnKzfiatf3$t;23 zdbUwk0!=b-%?i|qcgF;*k1eEH!5Q@kP}=a)31mnK(AoBn$Wv{fjbYvl^ZJ5@+uaBe zOo*^gA^JWqrw(q}=jC04TQ+zU;dRBM?Yc8ZuDAu>-1P0%T{pnr+Y)Z3wfZEbd>(vH zqHmp~VLN*}oyuQ<=Td?SS8HtL>WpnZS|*9iKbFnE`b51`pr`GryZ?aMwuj?mF>kq(83w7gpL&3VamQ>3= znc=JDA&JZBa)0d49p}@L_Za2^yR2D+>rDwWN#m{4;b#!@Tk_yC95?5ED=qr8hQ0vN zT~->Ci}ws(%hIM?sN?kn;M(qgG@SpI1WwT zg>P8*UJh%ek8--tbu1vbcJ{e(6~XzU?N*HY7hKm|xQe7*$d%KuSU2~X9Gel)QZ)8} zW*E))LAv}o_$SAjb6Io1mbHF>thRLNWWJ4w92I@Lpn%hNC8t8z#Ugh zPNaNfoP^Xd==UM*r*_6|S&CAv=t_&kDSD*E1%D^D$nbZ13(qN*6lkkY_atAQOg1SV ze%Q103?=DJ4lV5|iUBr?+dSP&p3pc2d9QU5Z+9 z=}Qj+S2AX)q^Mj*_$ZbTnH-0scWidy)0L4+qJ7IAZA&+z#D=4`8fD0tNo>-5P&8{t zs+KGn%pZ@-%U~>jxc44c=nq$p=WT>PcpRJWQm!#jrg$b9i;z|r$q9Zc(6bADb_nYR zw$06IyYXFIcj>ltU(L?8I&l&2Vlv}*oWAYea@0@UtRFwEACY_rxHBnVx}uHAUb^uq z4D&KS%n5w@0XdG+^X!t&wqH+FJ?OLRI-lwax_oYiL(Jp}c}!N@j`xGzx~IP;vDEMw zA2?(FI{r;Duj7o}EGEsdNIaS!XFTR}4@*2hEOI=?Trn0}4pL!k_lVe?qVb2kPJM)~ zArc+?A*k&ZdSBNEEA{Oq74Vx1zq#;R>NtCCZ?=4c!WXm$ZU1+O>uN4+LnV&h0%fX? zkOACe)H$EalQ@}HBhbA-B}ofP+zmTIH#eFf#R8|6>B_m>g5EJi^`riypYBM@ss5v% z-i^gx_$0K7DhzN>ww2MDgn8gh3Hx(;q)7>yRz;$O2cELO##pNHs^BJLs8(+c8Q`{K zy7E-{!&Ij@4k`bd8{k&7jUq~Tfa}Jmk0)WWj_@Hu*6pCW;-*Hr+Y2cMc@0YAry5KC z$)vT^>u)NR2}*>G&wT-7;{dm-t&}Jg1Ke(WMy3iCp&0_~B|;Tsst_rm?m{tM?8%*NHEC5G^29l}P)Xd< zXyS&^!OKu$cZ{r&tCtFdr7wZ>W6bm=W_q3jo~Q%zDEZ&=7!tz2UROU=2nsWVDysLn zp5_EkX`>V_poU>L$Wh^_JRSM@Xns26N2sQiPS%U`FXZPtiaLrBHn?L#F*;eE=;h00 z_G$Ewced%b3Fo_WX4jHAbUbgzxsBZy^2Cp?YFq1rx#ald;!&g(YCk2El7z(O6Fl); zcl)+AIG><~?YalHt;hLfmApve*?jU=f@8hVL+8RL@ae*nd3ee=A1)c6)wVHg?CG{8 zM6NKNu;!mfXXodi@#g%a00!*x_32 zGAj|x2#ez`olj=`q!l`THrBLs0mQ?xc`ZA+_!P@1)7`Q}G9F(%=)v+Kr0V+fY5A_D zIiK${KJ|Hwcc$8QHhy1nqT`(P%sKfoUkhc{9A#cT$13x=w9JCJ-kfK_Ykt(F@qU;! zn9jg@fIr5ejk%Vkqv`C_jWtHI2s4@Lzpj$TU1#Qafd5NFq{bA zs=x$9*6=fyhGCWr0|)gfv_m4m+6MSbc_^$M!CaDZ4b__cZ=!mm-g0k~S0dE!(Z@q> znS)q48q56!)rP%-&dm@@m56nQcxD&ysbPG=8d`CCI9y@EDoj{pEuZbFfbiy!jVp-1 zmRs2qCQ3f4HToRrY_K=eBbI*Qf))c7S8R5U?@LZA3!k%rEjvJ|+1fatQbRcK+ zFEc-yug^h;YSQ6z(ot&T3gVk|lrcKW3g{>WI)0ifXvZLH!$sa;7~5-+icg*_@&&_d zxuLco?5ak2QG2^Dw!RBx$Ctrh6~6dWd{(UGUuc7`!M@>V#o%H-{?D9n;kGa@ST$T4 zAB5}Kt(?jsr|CH?F^+Py zgjb)#F&=<=ZVH#t*$dz8(Ge!Jcj8D7(4PFDZvy%4k^I;~o8nB?cHvy$&0$=oN-rlF zy*`Rs=IG-Ad0P!ilhQAwce7HZ{|)%sBKXxrA2YzsU0OnSUVp-~RmD7G^{%^#hc&-6 zbjsY#x*jSGH8MkH->bHLQqq~4IILd=*lH;d7SbMcpG40 zNYg_)=XmEG?}Fo9wBON-Me>17^n7={i1dykujm373UTyXJQrd&qy&L$(KTU6*SUrG zq`L#;T8tm-eq#fsY0^(4m^Y@Y7dpvWZq8Cx2a^fA)25N^caLAHU4pO#@D2ZeC^sHq zsd>^8(n9$h1VW%A1me1Hw5V|a17EfVW{yccf1afR{4cCe-?90z} z^7HWtx|F=SjI^pe?0bfQt4!!PGIcsKw^E&Q)??}ES&Rq-*h@ZuVTAH`f@q zPRvxa=ju`YTAy*ilIfh)QYh1@p!X1XG5~NtU0YVPmBX5XJZL$d1A9+XaCSp|4lj9K z7PwTn+3e-v5xuy9=uxb@RG=2x*iEiS#b4kVd5-zFf>^#(U_9X(u}>hkmRwm%hV&rb zGT~o=XA|(9dTC0kAe(fbe}gLP(^Zi)%nVs;nqIBz0plOo%Z;7rxxg6KC1d}29~t}E z-Mr;(TfM4R=doR}Mw0yh5NvbW-}s3z)BO*WBNZM8Wtdu|3>75d{)akBAEU4~IFfOj z^S}>#-DVn$e+GoyVK?RT-N-LC|7GdcN>#~!>w6IU6sV6s1iDjafz zFn0onv4D=wL})6l>2>D4Py#%?r_|))OK&eJDJ?C%=s0}lag?(!T_fyl3z0=35AEF} z^WnZFAMP9S2`WBuC>Z1>kf}MJjvUbh(wRHi)a$wbiaUgNWM%Qq`7 z#TfFM_i7#jI_8=7dg8bAH*d@Q;1twRa-*cM!sd~rYT%ErN?%81W95Wv*9o^NsiQsM ztI`HQ@1K^EeWXQJDCe;dpU58`ChM1U1bX6>-f)e=*f#(c-M@BcmsQSUgE=7 z^FzGI_18SGv`WhRIjnEZ^Y?!?`TKx*uW|<9&Y`^JeM|THsoX$F`Og3zm-)iJk@CE! z5Ivl7_rhrTZW}u@IvL)-hdRD8raa$|yNzwQujfOepG)x-ki#i7hfOqo&uH?o)deofXi>{5zjh-`6P`0b_3yjI6I<5Rj8f0LLNQ&HhnEstKi5S| zcQeFWZtAMIsP%Y-`VEZ;OjiZHf=+jfWQJ$lQT{}8W1ap)e@uOwotyV}2CyrO`WW51 zlxkrpVUpoz(tb0Mepxfar$QLz)<35wMyAgdy#KUx6MzX~}o7eLLq_d+lE@(;PZN zJ@c5~6&+d{Eo>+2O2`I*mr%a}?dA+|!j4x2p2Jyu5620E8lC??fIgtSOauk*wbj=M zrZ$yG=Mu?WgD#uL&g&xFebg#Z$i4v|;+kly1El%tWpyI#;>|kwHKdtD`(X`gs?ABp zt02`i%W$UMBXG*#k3%BrBkY1y3K{0fDNQ^(jar5wB_Be1WI|`cSNdaDF1waE>*Mhe z^&y()4A0H8{G;d3SAMq)dLyT|WovdU<9N%r3_D?b*=obslaSAM`5lfnd}p3@S8fMw zL(A6d2lLpOKw{j74nb^qac3b(!&o6q#cah_q{oDMTVqu?Ub zMUhMsacw@|l!$eOb^$HB3+Sk~zqhO4dnp^fyP&RS&1be)+hV)odk9h5;=AL6TENE7 zna_0fL!3h6)M+kw?v6X_)QWq;d{*xm591e$^Bp_R?xW&ZYvhvog==KclpQVw_*vL@ zd~AQ?BWr~lJN?x9%x#@+YUf}9-aPc6T-`$@h>NIP-9sfjYkgVmRvJ&A-O72P$F=fa zUhi!cyn;T^Dtgh5(K0W+E%+fmU2EktI#EM2q1qmeiRsZ8=AP1MU)!T?>fITViJCr& zIpj5P&Uz6;N>q7ENhvbScBj(wB2~e?)^o%d#9fuoAw#;WX*HXMlIZoy?XIC53{iiZzZoAg6t)$jC))V8Cd^xrk zEyuwk!@=4(;Q!{94^>J=W@9V|M#+3yzk!mdER&b zGRFH_Joj7k?R)w)?=4I7cu(I$;#`VzkyfY*$5|>@%^?KsR`0ydrrWtU=-X*W-Pmel52QS883? z0upm^~e6R>~pFY zt;@zUz-8}*{mq*Q{RE)KXNp;8HvqkOzZ6gFPghz+w;XTTBYF72bo|miE_kj&j<#7s zEp}`blzgETl)JAQ62x5mlH{CGum-Yp$=N{yZ~QzFdRl2cjNT0*=fP9xW`VA82dLh* zAmogjTuNbN8s<> z;t(h1be^S1&hf#Q1-@01$vjEoPm)BA@&KQ(lii@rW91eUFq(7D_3%qpMIhfIBu@lkuqe4N2dI9C-YXhji#9GNHN+B(-f|# z>k!Pv_je)(oz?z|PoVz+d;)j61)uJ0=k`u*Zibub$OUtqS>(GXqPCxu;bx48JL8+; z@)@paM0uKu#Qg<&%9OLQCp-Iy{9EoZ?!~pPub1V0=P^Fy^o16G(+cHY!B0u}=~)?$ z(}9J|&YkXped;C2*&Q%{y0O1AiwDCaYEAJM?p*6ZJ`^&5_6= zmm9drj)5r&yvGRrir*{p!Xy#zQyZ`C5d{G?ShAXgDWtme?i@|={4ij$8c(71X?jB* z!lD`LF&66)*sVZX&V)X|pns)gN%aBYZ_5ZXbeBv3}3(%WI~DCv}l8Z3l=2jG5$izsUfn$pVkgr~B~GAbd= z#yX&e6%}{*;+= z0fO4p#+O;Glu~H?DXRr2O~!q#ZjXYkXy5a-M^_1=fIK7MYDeuyV@gdB*2jKSw&gpiZn=E?tO5^93#Uy}Nl>nfm^nf(7{->D^6(>8AFETQdKLOKFd5~;xPRvY^Bux7jcuytSr1lH%6 zwXlxPkLg(jZL>nCcVob-tjl4IloCZVWs(}UPe8-Ig{K|RPNQ@WcSrJpR?-@f-A#c2 zJH4~o$!|Plx6|KST{7^JiB1=-Z@4{^C z>f}kn#ok;bA+a}!Bn0*bJo3hPrLH8m%p$P*DowIv_sB#i>PnA>zlv|K>Z3CSyt`3i z+~I?{!6#y^@Oyo3VUiEq&3JQ3o6gHQ#m-W5`;9k{L?TkYI*tiIqA+Ov`BEJ4)eK%(P}~GcEO#))EM4CVd*7BeZB*ke*O1CY>)H zp;CLCp+sYsbB;ruqjHBm_nQ_mz96eD!5s&+mZeKU*!M5)M15TWRy#$mI%f>*N!sb2 zBrc-O(vNekFiEC(5AA`#k-Fl`8rDe6Ug;+-vgBfNV##HEVf*)9WbGxVBm$PLIn;Sr z#O$iz7exGmp!3N(mGYt~)V79x!7+KWdFPnX9zHQ|JHYbea!506+K`U;lteZ*Oy5JM zzZQHyOIw8X%USVE+W{o6pE2gdLOsRv5_vtvsuK(4XsWkQEAK)%+W85jt<;nsOn`Vf zIyUY>8(*#g?k;@#Q|R5mFFVe0aHi;wy@jLBgR^W)z(vn5S_Hq2vs#PfVo&ID$z398 zIL?`Rqb>wChJ2DW&(>);V+w%{J_+XFd*PdG1!?dVrt(R6UYB1zHtV`)Ew{QyhtY=V zzY#0Xa*Jf9?98ohy)#s*ljhAZU(s`}B#-zqMYb)01t5?&0pmr_dsL zX36vz@z2ewf&6|=@cFe+2S@ULNsjg+D`0eAe{|~p1v)apPW{q(a zK))Z&YA<2fjprz6+n2_2XXMiXv%3feZ!ed5^S76mcddunVP)5LdV3klW!+we@~u}L zx0kQT%c;&g$&#a;p9nh6QZ72_=zZ*^Cl&5v%gwWopPj_?{Rg<6T_LpR$-7A+*sHGL zX7>b1brA16^K`ec37^8AU>Uz5AO`8vF9dlybNsLec?{<7@`pY9fD5@Y=nY({EB>|o zS&)z7-V_ww8-w29upHz!1qFClg2S*_Bs^@K{8iCiybpSR<7k-sx$~39m(u&wZ7wCq z_`aaY_rYA;`9S)qUtnJw{JHTV-VYx91?)6E*50plak0JM{!XWS9qVG;VsOI4DQQh!Ow-_d*-ZD<}P?Vs)u$qZ%OQ7P}LcHZv13Z5b9 zT+gWXajw+we>LZ6fJP9+(E?Y?GEiZwHQDui)w`g6KB?bpV3p`17)%p4JSW|6oj zq8yy>ui4yH?#1(*_c}LB#1jwEl%4l3w(aaRySw6o<%@v&P+!bslp6>yyaL^=i4@9@ zG5tB;lK%X~Os4t@v~IDq>%S%K6=vGKL=cLlz5ZL$-sGTrFHB9v(*M3lddW%LR*+fL?6&R{}VTv4#Qw}H?;B?NJ&+c!@=at3m zte`NTS76^;JgZi#h%w6jg)yM%iac&|^S zbC0&fvf~fjRTuWP+j)scnIX(5{8XM7XY%7<6tY#;`4oN7N39Pa^&;Fuy;M7jq>?bPP<2; zHp_4P`BmB2g0|QQIx3y`nt5$8p%6d006*WxOD29=8}mn$j-6jc?Rdw2gO)lWCrwmI z{;tspZT6f}b1$@nlg8z3Y`)EEPc6qf?2Em)9POHJtjg=k^qSwvYKMDhoSI$BIX**v zUe&E(Jd55l?7W=uxPP3cS^a2ZmE~g)|6O3hySa^3eur+tPwYC_ScNo_5q=mi zx4*f+fc|S7^k4lA^#2Cvzs5n^jW%u96wr3FP1`jEwEe-R?V2k5e*Wy9rM$b%xNRZTJlZW!h<%>AEWCzIhM8M-}Xw)A8%7OurHi&#S=Y$8WIV&V4ego7dV3`C5-T zF5hZnHtSRJWD?;Ag>3A>o@(HT;vwAECro?z%zsT*`#bd^ACW$vhBolh^ai63(m|Nr ztK`u#A&e_`&`o6kuQj>~G?1U)IiS1nHrwy1)2zAt9z=Xa3o8kt`B< zAtH27?AN~RrRVp6yC2GZO-3Zy=0m-;bF$i3XeS-GvCn!1I-_N^TA&Ks2g@0wI#aKO z6AqjB)7ve3XC2|WGWwZ(-TlcC-!V{I#9xMy6+n|HnN-`VZ?{YISb z<9y`509FZv=;{FXVRw{jv3>w))sjT{9RS-4Fg1dDqHZn%J?-p_Mk0|PEF9p@$&?ed za)9656Cp|@6}g4rU9B{^tI8cAq$zSC>^y~T+_9{|nBJ(@?_)9kKx3pL7ZYdLO(MWu zf8OgQ@?Sy`tT_y?%1HFa1q=PKAaojp2DpDA)e#0cokHGrKu)2M{j?OR$a4GrT<(OB&TTmbJY@x3xyd4Y=5y17c2 zU6*BWFYSw@RFpp5u~H?~k)z9em!phd^rBb$^KxrAv3m@yU905AkIj@)RQjztfn1Oq z;69@C4sZ{wh}dzz52cDkE}NXGj8x?*`2kRpDzWsa@wV-PZjIJ4hWcux?!~~}tVHh# zYGJ$+AYPNYfFvR(c{7zaR;}TOmq(x+K3BC1N_JFS#6%*4fk@>&0qgtyHG$chYk=DW z^rlMo}CNS&Jx1BJIO*Ldb#;ZH!9@hYSCs}*R& zrW;E}d+EhQqJ1MqBuJU9`Fw>2bKY`V283dM+1O_*&^Ppo5zsFHI>3ENdwdGu`CjOU zkur(H+TtPRG!0glNGETF>$L@t?sXjL(6`>gK32(k3esK)v>yT5RgqEr?-k7udmqI1 z`U`u*!fyQjJD5I*H$}4P%e%K8DU34@;^6#pX?Ku#Bl&WE4dqO!cjXwp#vP%^FKv1o zwR<7ocj1eyj(AQZN$t1L>+ediG4Nfi317bQ*{sZ*&CYyc%O@Dp0nC;3!_M1`e9(UkO z%DqcrYxzuf1j_!tIcJsH@8&lv+4#YGvKs7)A&2I=Zmn)WIJ|rew!c}Q69~yAB8$Bk zyDzqH`AsltF`TKq1;+R5bbN;*pE_z>AtU35BFpR^lhh_1l^^r>bq%a4w=*9$|`7>&)<6c-{zMRQi|$&jqk#-2l%Ic(g%AH{m(hFA-dUN%^&`z)1B-cQ1|0%wUy)yJP*&rGD?J8=612{Ek zCr{N$*t@Qy))j|)=An;O&lSXmY3D&|v=e28sbvm#e=O6zo+S7t*gOFegZN79+%Szai4 z^vT8xg!16CpdMSO9W#!cZSrM2`60QU%eU#yquP|U+iM+p+d5Xe9q3@^PANVJed$0I z>OxSTim~L$JhduyLpMkDvY5O@F||gyrM2Ww)Q8ZW(1z(tKc+1zQEryDr-L3>IcRG|kutP>a15Npph)NkrA`ulc8WY(S(2JIn>9 zGaI{pNv}tmKgC`sBY(e!ezltv;{R>p_n7#lBk-?}z;_i; zO^Q-|I#8{b=G!+Q`6Nfrk#x!U!Y9db<8wmCEZQD#rFQsn$8|GD{=iY4WeoK}J0$2> zOmNen9xh+GgkZmth?mbc|GK-RPUXAjd{o8q{{`fqhES0A@hQR}gj7RF){HMXQ*Pm+ za~-=u8l`&i65V6m4&OpM4QDOAyc_-eb;mxcO2aP&y(1mN+W5Sin0LVuo{ino&C|Ca zy*q*QZiPJ14t3u9W805Etg5Ps_@Ed4_+vT_VaF&m31K=8(KhldPDkJH&3!BRQ2QkZ zt1d44+bPT8Y3%n2S?x5)qgp_JU_8~5`dxR5N|zBH6p-%GP$t8=lTE5%cOX$aeqStQ zI%)qqEu$T@lozE1-?JUR>b_&4@uq{S*qJN;PN}-NfGW0UO8_-fY`P44uC86i_A|@} z34_jAX6b1Ev)j5Kj_`%cES)5Tck}w#Jg##Y+qW}ZHWpnGE71F1W#_rGAkVCw=gy<@ zJkQQ^XF;CUzWS%jm`o`_R(aELeQaOswrvb$^;p(|3VOHAv@R*5kS%CdLlhy+MlU(C4XN2XhE4<3d;QSh%#3|nZslK zc6-0nY03^`6=O|)hnCN(lf8DGRE)KJMdLd0I>4)Fxu>b=xfNq^Wvd|}foN5A5g*RR zG1M&owC?|L_9gI96xqYo-E(I;>FG%z8Ikl%1{g?$Ngyx*(Hwxf>j9yo8xkNS;0cqN z5CY-_2;zP3E?%pvEAD!%x3Zpitc$m0_;wgIJSa9ue zEELl=SIEJTANu_n0+U$ZZ9Zzm(LxREVqDPbjS+SBqtSS+%N3a78bT0@y@0lq>sH5! z?!rD$OB1_Pm-$b?LCd?zDA(+VF^wFU>e6W%-95xZv}|K$!9ZP+XYG;c#+$laivrU4 z)kSpVsf;qDc9Fy*oa*Y*`+sn6(+IXCuo<0F1FYyi=)6Ab}t*y`R5q%zu+xK-33V4-+M?Bijc|?`q5j@S~ zBFzW~t!D&$WISY@5#yYHp`Fye5h&=AL4gt@3iwfv=eN1XsI~ASI7R}-p=?9_Wx;}QKch1*}}7X z;xF6zJ#l}hrgX@YK=Uda z&HZdN4&^(;_)q*_^Il%gDA>Ggx`O(@fr{a8+Mr5_0ht0Yv@n{V7JQ(IL zB#)Wwz+6W1=_^F~Zh4X|79aPxtI>#=1lrL1KqqvI)-6qK#WON2w_pesilpxI-TPpK8KHs6K&(7(J?MY&#|pxjpucu#sMD_ z^>dtKqB&kH+IspN=C8>9?)B0@zQv}CHnv)VIQfM{TW__LPtgqA?PT1m$obYiMJk{I ztvrqPd{n$aVC9+p3*%|VFN~*Yw(;b()|ubUVSX9S?q<41%dkfG$S|hlMi@nn@%(#~ zZdapt;~jCGDDkkluq7Uy#$Pr^Tx?9yS1Yg*q2JAj>oSs0$wm`~yIuR+Qu4PgIGXC9 zJU}(JI(DzjVy&KbZ?k4Q8#`Kzr6xL-yw*ClWRA73gB`JHHdEQ5iLGKSOm?V6o3Oj; znssa4nh3SJxN`(a>_pCeZ5N@Eg9M`tbH-6PgYc4G+&P`{CXW>-@u})!A+*oyw|u?q zMR~V}_EjWDhx4+C1fzD=B~<#z>xFEdBi1_e zl1`>Wv<~c^X^+C`l$5k)F{q#!2*Tc1Qe>c*ls}*v9(1kf!~AjP*kY zjdip3H}M8(*dE9Hp2qaSwlV!n^W-=2|2;qQv=Xo8=f}6dFh36ah52#t9_GhSbC{nm zv-=R3AJ=u^ee7x@KSK_5%#Z_ZGeqsr&ye5#pJ&Jc|6_*yR?LtC#0=r{qqu|5kAocZ zBMk5v)DJ6@rp?)hP+6|ZlBmlqiF#x>ZTzXTj3hqivjStHj7w9%m`CZbTRDKvkcl)D z9gk`1tr^1Nf0oO~$1@w#1gHzBn1@)B-YA8gCrk8ACeE8G+q@~8LZu^h@^Y9`dbw#OjoXW4D(ejVMx_rfO@;d*1Vq>VpguJjEm zJ5L)BaZW1Av|X~tIO|26Qy|VwjyOE8KZ-af6rt2(kHg2pUplxfI5QsN_9@~2zjZLb zD7e2dH$qLci9L8qiLbJ$KQC_ueUsRS%aEYO8Df_Pt1i)(Oiyg!trA;!{E-Gka^Nw)5qXE@A4#+m+?lsrctp%SmEO zBs5J$L0lk8?a#N~xS^^Mu<)qU8W-wpsZN7e`d$B`AHx*3va1{gt&iX!Zxw4pPd zoM3bhxs2alQBWJGMJv?e$-$+kwr3xub^GAg)a{EO@m-uu@14G%%j}QG0!%^)P@NK^ zWJ|E2#Ak)CQ&S~}3V5m{MJh|#Tqq?$zg|M;a`KhVt4e|;5sl3V^v4jrEP6hU1HDA1 z9Fx7vs@Gyp|32w$`(MNcr=U9rO6!^K9GRbFq+pG0rFRm`usu zct*(dnhtGAyhC4ZyUz&D=knST$GKxfz|)R1%*1?t{@v?1|DGt~XB>2<3wYK6pDo~h z4)_8AU+R!AGV_@pyQwV)sqFm@rgOWtBd=r4(w{8Kx6Dz#bLR861OsvV8-vS5e#;&C zUBActP8Ip_^qU0T6%M-p5_FGu)bAw$U+HMqcSX5RaFqMY`TVVMf81^dPwJ|r=f~Ji zDclpmZ(6&24!gV0zpml&wJxrg{Q;HF>~Z+MtkR0p4dW=S?WA{qS;OCi_icP1Jr3fG zkeufW)k$k-FGrNIN$w>oqNE59n?2ZyyE+uhDjvhv+we>2JqUwW*x*az`S=Y2K6~K_ z^nRq-jqvdT-rBPwj=O9Yzs?39u)%9>be7rZ470&|ZScKp9%W>%O_Kv4?vAsn~a>0IKi34{*7vD#ut-D9|{_Gkn&729n@!3hv zt5}*lM4F6akNTK^XB~NL74SX>{Br?c8n?d-R2DG!9DSK1{tye^E)6)~qZe>G%N_7$ z5r2gP-X`K7?|>gI;49-HTX|NB@|+O2zX>^K0pGLj6ni#)pL+R%{C(==x$F*(pTpmj z$2Crw%isN3=a~zvyX3|br$<{L#?0T$#n*0bYrpl<0!wGYJZZXCmoa}cSF0JHEh=)je=n!CUY2&21ZioIxxVskQO{^zs*2M_q zWCW)h#E4e;Qj(uk%2mGB=%W?w(!CWS5(cRPLy7OXf5-Z6{ywDzQZAa2B&9HdWytA_ z85)F}33^7pa7I!JQ>pWGfQBX5XB&T}}2NDdhLPzc4yB}JKJ zW^SXqBe@PZR?FNLH|)=or^ho!^V}BPt0&h&+pUY6wWr6;y0!64>(sd|TCsTlvACP@ zd{cw;THjoj%dEK)^^?lZrcSiSX(s^Fd|g}XSnsY8@Y5aZ>uue9?9G^4 zclK_g~`?NUK;)CBl?LP@(&0&`Qs2)pxfI6oj z1#J(-OYNRM*ep@KXCIV@>k^;X!|vBQr2FC-&DTI|I#Q?haNV5EbD3@q8(ZfAd~e#; z_r*=)zIayq_gq5j4|TSEr?vm4u+->B9!J)zw8wP9-jy*4=@KiCwD#~^b}q!;#%?Tt zi#MV_6aSH)iT}dSz~AEiAUz26{ut`rA>SX*)BC80%?&5MLwO*cA9LUJSoQ>A=1-jx zrY+!wcHVaiT0Sh1^e^zeIE!1fklT>ik7ChU_|Kyw>BX0g&LL9jPO`|2RW4~-6pBE3u?eCDO zui}MVzwcp~ng5;3bmNFGtz9;a-Hfn!s~7UK$>~13uJ?HhIj?)n(kWtN?uvzM4FySV zE<2BXEN*{`d;3DRH|$Mb;KR0h3^>GLbY|xH<>L$4xK0}%;{6-^enw{<$G^t$+D8^Y zJ=np2J{g2R#DV{55PlZLbA3K-5!anuIURK;tL71_e2k}5EMj$F_(~ahY1KT#((7V; zdGsR2!*p#;Q(7A_Poa|P9TK%Lo=i4rGFlTY5qZ`wvgWukYMx!UutC5R^EBI9(Y%Pw z+q4#+$Mon&&Z~pb-7eiwkv5X^WLtgBMSP8X-Wn^<$8jC8x5>Oc#<|E5=cql#x!4gW zE8;w7#d!|md^Ozwgg|@09%tnq<9tKocr00K?IJd(GL231qO;pe-;Kw}W!{XYH{tv6 z_Z+g~m5aEazV~1(mo?e_$KJe%zbyuwF|^6By)CA?hrBEX;=7;?(Qa>~DJkV?{Krn; z*sIAP`M28J7qL5{wD#IGna)mpZT7kq##`|RKniM~r@@}$!)da$&apMEM{sMUNI==aYK$vJRw| zri~A#HIb04yI2V2N#?WQ*dz0AWO@Bo9m(&S=Fh`*0dEVOHA))`=T)&9eVNfZ=P88S z{J^&TGo-Je=^Lp8Qz=1t>sWcClwWDUuRflJF2aMrnWuaKv2*53K)qa=}6ojM`$`( z)5Q2Z-=h>A#osF}re#eh)AJ;m^^4Eij|@AC$>3>Y$vhKEZ?*s>BhgfaGEd9<@oeL= zdCCCZCoKj%tcI<9^Gau@wSjpOwb;-5|DdCI|3i9htmuEwPq zQ;y=}Juo6|+(O%opY5G~6l;qJ838imr#OLb ze)9=oe$p}j%Z_5UJ@Pl~VQI3kE!QnwGNN0)6iW7aPb)iq*!wdl)BI|cg+1R zrE>tM^9YY|dyvJjQvR32YibJ0IvSR zuX1P!9^*|M?W3N!)>yyy?Gn%YD@ zDVWt3&qpb{0p@X^abnL=B=I`>!~xFW&uZ!U%#$boUV`6J%I&6cj{shY-UUzW8A=il zDOOD%Ihx5#Skl)`~EiZV}!IUrFY?y zPS|@e_UE(y__t#F^A&s-;(WGzw;#=P+G`|T%^`H&QkjkFfji6QraCPwTuk-D+1&UJ^4qwFx$%UT&5fXpUORAP)#2G`&0uKZ z?D?oDqh+A?*xbR98=!Z|%YDa)IfD?Lj@_djvj*W|E9P?f*!g%%6!F9SDWdZy_;FFj zST_F$5>p`;BRl^`5-tu9uh(1d3zX7y-h$bL6o-hs?ehsSLj?wB6hg{vrFtqjxVFD$ zc5(i=k*`)%#1aB1sFk|pm(M>%|R6^e9M|=U**CA9kd4t-y!1Lxx`MqFD{uE~OYCLIn zH@J7?kl$D~@H}`YDABv*lV}Sa4&kt8D#b4XitA{qNz0gbm9+%(MR^VLQf%o=S`vkp zL?>Z)jV%Xf%)<$K^W${?oMUtomxtYxc^Y@xczMC^Nyx?IFKm-{j$w1STe^X+Wlc;| zJ87+~u5Rgi8(gfoF0=N=5h)2|82CkwhSuLF&O*BYS!3yZwE7pKagbxpqHXtP(5oeO z@;?00)`!aq`cOI6*@ricK$|$M4@&{pgR-6vIquPTBMdDA9Je1iF7Hw6j(88f+3>4- z^Vjsqi@9Iw5%kc5FPNvgz0iAx6&L%VpCqm$Vog8hSZ0H_U_DpN=uNDh;a9YC6Km(? z^O;vCii37;vb8h6gFW?FW>Y?+T?DP1)>h1x>5l!*5ozssD|{D(PqxDMLij{0{0|79 zWQFg6@G>iW8-)9<@U0MDZiVlF@JcIuH-xiR_+|)atnl9jnH)2mEFMzs&)^L%?r$ z!2coOcR1h=2>6{2_#*;-mjk{2-$QHg2!2h zARM#8|AO#vEBsGezEcJLe>(DQ7VyU$@B;+=Uk>=e0=~sj&RNGXKR3LbNvjNxLwRbg z@DmWOv%*i>$~ITfeB6;&w}3z4fFC8`Pddu5xS%hlSb04S`A)XNPucQaF6cbvpnsx( zKkcBux`2M8Me|vpzrPiJ#zy~aLFX9<{R;&A*%2Yzo#h{nWBd0~vNv&^!pp( z@m=WSAgi@5aB5bJk@Io3Q;&w%6JW$Cg*FQO<*}gO`^7%@HWbcHX06XG>*0r zml;Bf`8oK0)fugdYHIT{rlE_OjM=9Z&vny$PYRl~`&Fagrb}m_2fDO&`3%WAmtsD3 zY8SIT-!ji+Vbcct;s6WYYfN>#13$vbzfyw!OU~%Rx8QtjKXNg<^TYgIR{mM-gGP`@ zB=iwwM)#}E8VAw0LOlP~BLDq6>}U0VT+H{P=Xvb*JuhF(?R);!BU@)f{H*6Mi!I$7 zW4$L@pr6Cj|6Qd2n@6_Y#nZbifxCVX?g4?jVG!;yfxA)Qcso8L`fG%oF&h1v?L2qu zVtzI?0>;7)A3rljT5sENZLj+9E`+E1axp(6!*s9vjDow{9~O%@uCo2US6;&Jd;jH= zZ2DYC)3?OZK{tS=_Lh&(_a8|Av?k3Km!7>XvCa??uf0cUQA@*835>9lTTtq34c%SA z-*aP{VN3XZa6V0n+O%IoeLFae?(eXi2_JvqqcOu*Me8qt%v2x>5CG9=xx*?YOpLKfAYLby#M{X_}wkJ7JzD zF5&CVZZF!5yC<@zWPK+ITt7BhFf4&5uT}pYc#jpJWMp zw_U3Il!IKGQg~BSj?(mm+5qg&dx8=9w(5-04Eys@65?B%CqggZSdO0MCZjjRrin88 zV7jBW9YTrES{o&cQw7g*S=^*%SltoC%M7iU?Z+s`4?c8Cs#$&-0Ojd~L;q<( z-y_m#95&B_y$LZ76fuvrpj(Ob2M%kuV9!C!77??@f^Grm!5nIpcCLlHpF;Woa)>ME@-cryj~U!gW^!jkkP%3;LUm-7WV8T=uFx}++sUStH3Ww|GI8LBZ+t} zB&>C@t)+ZhYZD<>(3O(Ll9a24lzB+*&LK6P<#en+DwWbv{ZIUL!|29epmiAGJ%tiN z#B-&R|89lvx8(dc$QvG}o!m_^aD)(`XWcuLHzaASazRniSK2 zhX7_8z=qMUIQ_Sp{yU!jJ0&NrA5Esw@WHu=GJQhg+K94reBx@=lh}+4MBeWYo(Fz} zx_9_?jBZG%?i;eSQ}A4(%fiJ0bckfx@RkmLL8h_=(gva z&_iuTgWLc-qBGhccUJ8yo5loaoqJt)|M-JXrZ0vV%}tQz0?c2^lCWGvCPZb*Z)T8) z^w$`MhR_*s2HWB1KLkeEtvJ; zlt7UehDR3L*6VlDY;8|#Z~B;q=$|BN2T2+!hb&(Me7*YI-e*ucQlK;TwF6)8FVxfi zAuVje%OT4SB#tM!x0W1+@E%Mz(XWuViC0UJX?SCrGkaj2GOjOI=ouAAt@QgA_->E` zu!`JR9C4lO$r{B?EvVCkG>lq*74<*07scDXcAVnLd+m62LEPq{gHcGlS*lQuzBJu9 z;H%w`*xK9pop)dZ+70A7p8NOO?-^O$5A5Z-;Q6*mYs>viroh)TC4ReZ$IMn6$(cM*J_3g2i= zI{@LcF$^5e2U3=YM5jkRb&K|fbkO>quQY7CMZ{c}k{jGX5_5m7WVEZx-J}B`I;Ci? z!*&_&N9|6;M`vV=Yswd~7*ce4{j7I#n0}haCCxxhP>?1Td8xn0oqP{-BeVzF(Q9x; zNN@5-Z;Ly?=8X0>8|BGL|13Em-KFI@fPxkmwZu<6KFXb(2R+%#WZvGkpS;l)ZY!US z$=5lqF(+_bHv6!b@upsl_#~>W_X_;7o;Un_3{?C1eI=HCS1;3J?IKyC&#KonqBo9L z@ZIF`O)g9CF0Fk4a}cG^-lXJ1U*w7Jg?yf|#)~G4ykdSr?DzM94AW8VO)9>qlHcRh z$fZ;YNqo=7S(QHtIVN_ouf5sVCxVYtnbd9hcjM!A1kc}a`K<8@Gu4@Y65?P^)p9W{ zh1-XE$t;&Rst1ccgz7!I4-(Y1WwmYD8;xja-y=M^7X5Fvg%&oE7-v#%fZXIOX&hGq0=)*yS>zD@}#G38HEMtcGH zMMrX^+)+D9?x;)1iCsR6=X$cWT!@sWQc9>#9B~0xOWopl|GXXu+s|B${(fzE_ z;22@_#`uZD7GzJB?P0UVY_DBUaIt`!Ub~*)K$fk)9aZ%*^4PFcMkZ)z>-~$cLhbM# z;FWFscukh^<2GX|w1rOe&+A+zq>RAsuaW7q!R}9DyFaw@(wkI$Xf=kvvA8hH@9xqw zi~Y=(ke^}|a&?yJs_Q#pcL}@3sq%Q3*7_IO#v{B7S9i8dmGk?|;z9dN+&fN%z2pDb zX$m@t*L@c63tRrVD=oV@XgPFjLE!x6{~%ddum_1F3@LLe!lliz^>!CE6d&k zX0>+%vZeKrHeL=y3;g7``gpwe0*V!{H~Cy3s_?Tab|zWg$H&t9fvB|}AiS!N`vTe? zs4F-}+{eQ88qbP+dATR_@p5k{;yz4pPE77&`j2L&Rxz_<6ti!%VlGW6X8$O~Tvnqj z_tXS&wQbE#P^JREYL$ZIrO+zUE;;ERRzM$pE#jGGTOZROG;aagw?ZDb0sY&7{v9I~ z^UkSC>s@tsYWsXF-}SUczIb@7L;`_C@Y?`tmH(`aZ7bXVFMD2Nelv)T#Jqr*n^>Gc8zn4*rP1 zO&^4NO5kP$?dSH0dr{yH7?f_Cz#TXU_rAa#Bxv$`lF$11xx3`bXeS2j?`Xc_W6Stm zP@`uH)+>{x)*Nn@Tv;+Vi0?VF$pyhWcb0SpQD+J<>BjD0>p<3+Pt&S03yqSQ&K2`z zHpDuQl}N>}qiOU6Tgflc^wT|!L~4E=&EFmQE6T~|+ks2@eCrMJcRV;Y4z=LfC3(uPm1qk8~c&9~7Q zea1~q3bDVlU%Qmu@APSZMxAoUIX=(-9Fcz)%^!Vn;G60T0UkwtniAkP+WtdINYLXw z-}`6pZQe(`|M9-J+{7j1?P%3YOXP!fYy<3dkAPV_ij49yn@p-@DeZNs*nox+HqXam(yR@53CXA|&x% zUZzv}`TbxgtlQ_Qn(a=@54fY~Uc6O}w%}=39QfMvM_|Z>764!#JOm+*xwegCmb$Xq zv)#;&*u%CMa}MV*`dv;;r@$=xnY1^E7y|`q$G37!wxC2V3)7}$TzH=667n(r7w;D~ z6%-e3=72QNRZr@O=e*xr?2xNzn6t(hTrcwB7GdYnP~g>s_LK)WUf1 zqy5?o05TOI9q0GDhC}R&AU4iL^vDAHs|%L9%nO&g%!~S6=Ecig=I;kw<{x@p%e_b9 z-0-HnXk8?SH@WBcx%!L%?3VWS>lU?;SM}j|@RCtJ72#6H1qkQ4vwtPaR-IKowB>UaXOh!4#tB;ao^U@?>H}4 zrGoWhWk0(MOvyzAN3m?3+hM6?+x}y%V+{XEwcEu%v!C(aUadn#{fVnpiH;NM*8zU5 z*+I{G*f-7)Xd?*Qbvu9G&)=11t@(>%?L12Juc|~Tcqo*eEMBNe4*B`Ye*TW~9F^Go zyKU?jZ{=O~H|w_uc)tUFkAN?8z#kRx0SEjU0blO2m*?ev&UgQ%+VAVP_476QCADz< zepleO3LK~Rk)U^Ev7O%MBF)NTzUK2Z--t9=gDU6`z~G1BoBfZc0Z%Tmsw-bcu%e?$Zzz|?ND9a97mcy*Fa6148a=PXz8r~E0^|*Z*(}6dQecfi$7V6~cF7 z!r#R*Ec3%yPMIBD2a4w6kSjNr(Vq}+WMxSzLwKXBUp~y6z7&4m7=#%br za%rg6aRzYiGVb@`a-h{AZF94?Gg!wBfE$6j19FiRQI>?#hD>#BbOmkx)Nu`$=56kn z@{^ot+!Si*>PtQlY6Uq(l_K&_RT1T&;%qX|R3|0AQ6+jd3ICN~+sbd3SA9|*;qu~r zqP|ypGTQUHU0!@d)OT*!Uf*YzS+;A8D?K1DgsC5fP`dH(u-3xgPhz~+mRULoNn5FEC!|0NW?%vOOlXq<}GF zOvaIEJMIN>hclZFUbN}3pVFG0>TT_7@U||U>}~De*W0>mig&8-Q zJv@w>TYPTR5AeBhMwt1~VDKgZKQnCit#QbJbx#xh3(y@`Dp_x+V^WinFjlKOYv14A1|2!K3+C^_V^yk22izKgu9%SPby{NKCQ0wD7+2F$ezcLHMT} z_=ie~L)S?n|NbB4d-zwB?^Or=M+W8pmIMFKQX=-T4FA3Zze%L`6Xw_IW5A<~WUdnB z^X~0sUyma-iG`oQu*||+FqTI*#!Ki^W|QurRtfILUsz-A!e94rZ;WJ>0ncS+=+Q;5 zVkz$}WpeZ?#eld@*lL8i6YoM>cv)MZ&!!}m@31b@MVHL6!GpD{IOF8dm_#^H3+QImx%k6VaCp-qv zf0YC86LXNCy{vcOfd}B+SNM6TL@rp)&ahcq-C4>kDtJIftki^$2 z!MhIrmhH{*A-49o(ve?4l!x=KjmtStdUTJx%V*tL-Ll-$0c^y0B_t-#ROn`|s%R_D51&|W$;7p6T%gw4Hc5g#s0!l(&jt_^2AW7a>Y^j%D~$+_MXo|9VPm~@q5)zY zy?H&w16JhUFs&IXiFfgs_RtlU&6QA=bl`gcG5m7x38&JTlLK*!xeZ#Ut)U;fAb1%Km1cAliXacL48Xrh{JyPT|7N0tH}F* zXSDBK!Ozo%RIu|j27i17x8t!nil<-M%GMu_eHX&ukUm>;PtD8qT8 z3|)>gV7fnubPGf}j=M_Wx(DH|7q}ireps(Nj?dem+Zc&jx(Up$#(jYM8{&rO?lOh! zpGiI&S?`ZYeNdy5WQlZSW%xP)zHXymia#vnNPCv}JD2VBbuRnT*P3K9AxS+_r}-4yXs+etU$ubkHYj=vxQ-H5-g zw0Uo2XkA*nmBlh1hzvzrU6CV*nax4z*Uwl$Los=ZD`WgQ(g)bHXG8(^qrmwq5WtGP($z)qk2-0*|rIbYuCE3vIbpB>NmWv})k9S5yZsF88p0?j5P;(uQq z&uycAP16@!d$8{Tz6kei_+py$8gE8khjLsW36g+U8ZbA1;Y(}T8Q9mY4@v$DfITwU zfPkG3%(8X!H@*u39%62W{(Fe{-;$*A)`!3L-Fe$xQS3{NtXaM0>NOXwS!n)K_Isb} z_Z$X=Z`-`nmm&$83i>4HOo4p>r66m7`YzuEu;Q+Pez=Xous`5exiz^)S<`Q)$@iD^ zj&@}&S&QSc6yIOp+2pmXNwqEd%9nD($^*~`npi(?#$UObwuRJ^__BS$ZeM%%x4zDv zuY8H!tv$Pa*C`T6FI}iLsq}vD5O;!G$ z+e13ZN_QoZn4T`q&wUDXxVl$b_XEa%VJ5d}U-}xLWk86}-D%*7qONsnIQl?x`hllO zuVgm=dyRKR8ZXtTvB%Emu~Ni;?-%3a2wlIDol|w{JAD}AOQ_ZD5&jN|ol{-7lC7() z+IPNsw~Mrvedp_K`yhgMOZ@I)<4Sh^&|U@H#DLKlW!wbE)9n%2A*bEClAQshwZBHF zHZSlSCac{j;oFY1abLu)t9h@;{|8^a4EgIn_{I+Wk8sSH z%UIuIAGHp^ERx(F1{)Bt^A)$Jbs5YeAd{Z?kgQMWZTvj4{%>V&vj25%zZ=IE#x3)Z z#x0A=Jg2m5S+u^beHropTI%VUj{?=SaYtm7ZEciJ;A>CiUiP)odjelya>MfLA6qB1 z6Zkqy_O`FH!vw99_qNlD3R>sxU3eaw5NWR2+rF0XBl5V@kw=4wf5vdTJhng2BYEX; zE|2lO|^YT;#LJk^hYXexw6_pMW3bfIlVRM?2uJ3-~b(_{Rc%tONdo zfFI|82T$bi#SZu|0bk;P*9dr;!abHRt$jH>*<0D-&c{Dk#Lv+9yl*>CWcvr;P$#F8 z|7ccRF>)oWoLh$*5I0+?*k~^iwEHM+-e)IqxVDt`8PD@fk!Qc7?3W7oG6(#60UvO{ z?-B6jqU;EN;zYLRC@gW-sI6?a$$GDy$aqm!yL1@dZGn_nDU-qVnN-yqR?2!nFw80fTS{3*3Q&aBTv2 z&>-AAf&0xM+))De+d;UDz#TjYcf7zIG6=Uu;0}$+1^b4xIF1|^BL(ewfk-!VP+MOr zaI*xCkELrk&S;I*73}%{elq9NvtyENTy8p9==(ax>!SkR=72vZ;DQV&vC$m0^Z?(mkW5O13p5)=Q`kZ0zS_H-(SGzJKzTkc$Wj-F5n9s z@FNAh+W}uH;5`obDgj^UfS)7ai(+;;?b1^?f7=w}vLN!#D^KCP^DW?=H^h*4J`v+~ z3R&8XKa=(bk@g)(dn--*VnN#5MB4f)y9~PN6h0m|R27c@hXn4Ds={&nguq=o2={`( zT{Z~!y1-pND8Kgv?utRUPX+EzgK*yn+?9j!Bda*>szK@e0{7=ZI9=eb9)#O#72A_# zwQFd8S#8)L9uODl|1zjd`v}~%gJ@3_xQ&Bw`wQH4gK!55++PRbW(nNi2I1xi-1UQS zJpy+_RU!Xd%yHz#s=~VWiF7wr*>y&!z3Ek)kNv&M&d1hqxN&opeI8vP;I}y7R|xp6 z4*2x~ewzb+mw?~yfIlqYcR1kB2>6{2_-g`wmjk{-!0&dzzY_3G4!FFU!~fxcmk9Vh z4)`zuzt;gDE#UV#;1dP>eh0ioz#nkHXA1a(4)|OF-%R2BUgOx+`FoA+RZiP%y{kE| z*-~Yf;g$r6r*?^$#+Na zGYXz&yh!64Y2V+Zcp4)#vaUe?twp5yZlt}Q2a38VqY8EAW{NbyQT8-#BF#Rd3ik?g zMLoxkirVUP%o^?!`?+}3)gE3_)E@3FijaRFmNu#-_KN&&Z-M;AtA4k4Md4 zm*z~7=HI`V#%tX@U$(}&gH5K3T5FdSp{CMVP1;E2huX3;<%rYkh{JUmZ(qax{wyi7 z>p0#g;Jrn59mju)_Fdp;-zP=;UOK99FZdsk<|#*-S4EodM-`6O{|ej>qYCHR#{&1` zAlz31_tU7teeF+cxO~;)&LpoHh4NKy6q}Jej`vg^ryJs2MdOe}J`VM7b}G+9N)*ne z@>BU(k`oR&SiltryiUMf4*328?oLE)cc2Gzc+!)ID*5=GBEHu_=NJL^IpE6#-0y&| z5%55Q%>{{K&OMdAx6EiW6D~4Le%>2V{yj~XDy3`Hbken;P6|pLO&1pplK>+>(S~}8 zXrZB_>Gwq@{Gs=n;oVXCnkyomJUSw84P=wPrYK2l=a82<kj3C?!SV_xJF-H~oeDl9k=FWV7z#A}r-~D*B~um3ou25_oRL z^E_6y^4yiy+M3-Y@g=tj%=AVgcH7;j@^L&fVdr7boXY(HRW>Vhwk~&@FY<^=fRs|Jk1+jIG(o)-2Bn@H%n9p(i*FH5Bts-JXO;}nZ~VS>a_fu?{BR1 zx`r6$Ka2ARc`eg5!PNKyGn0(ew7|&U>`rU1k73@V-@sov)3|DkR@ISwBFOG5Sb7c8 zM;!Sh1@wgX{uuPx_Q{x5i`pAwWU2$ZYD`k^Fpvsg8!Oie+knB48lkFv^E22D4i zOd%!i82OVoqm66AcHT$AcQak``>GyJH*S=o$yWEq3N~&S2Wwo*b;h0urj3io7zH|K z2io!4AI8|%WlVqQT5bm*UK6!q{c()b4nX@_b_YbU$xFrcqDJzSMsIbJ1F^3xsX(r!jV)9alJT zS2}PT9k{C;xLX{!KT{mnp}l7`^cT~7qPS!s=Qk@Oeo&VJ8zWAgrB zsIT{RTzBb%U?zEJHPfqQ^n>dxT}bT%7!fB_6YI`3Z46Yice1_4;WU)^p6hfCS;zF( zVx-Pv)_o8(V;=+EE5{lx{7M_Et7U5a4XIo;R-+ycb(!hr;#eIg%JX#)WWGvbwK?4% ztYdaXQ6Ks1ph>=gzhNrs17wZohG`@ZjjL(nz)C|vI^?)&^FOnW>v89)pbx44)M}1B z!NH;|y9bqJ_Bv+E4a>57P&sxx%CNg2|M`%1G|hjvBX9m4me8K^lQu|NyRDX4!z&pC zt0d2Rv)YrxoIWxZi?V+=sO(DtXIf?d4ru*g<%%BIXgLIQFEvHtj_C)Pk zT010PZw6s?ccx$^H=yJx@>*_BxO}Y=PjLG!r>$dmN14VWs?i5xhZa|3AsiyM&w9ah>pYs_pMI?&0v{wrZ}Ujq$gL_^(yl zZ5g~E;I9if{`bZ@?t^nQ&6m%y57x0YD`S+`L>3 z)_c`an;sg*Ejf+b4}7&6--V!V9L6;Oeg=-kr4!XsmrT7Ve%#zbEpBh}m`kUqXlIJq zn;P3JQ@xp5{B@UJd?w(ua4{*P7-(IkjaB=S{VgE=?&A8u3r}OVXxgHNnxZc<^-w2-&1g*R)8^IV z`>>CznRi2#Qj;y~s$pp{L28R;Rbo9znvGwK-$HD2R zG26JhOIK3fa?-lMtu{!d#GDm_a%l9oPg_(kS#L(o1;r|k^)l2@ofTCha%3s)*qAS) z_h23mA#Do+kXDDdE)}g{;BTLCS&K$eUN6l7M_<{D&YmK*v&RpA0kvbHu0o9$XsS7D zygGitzjGbtcs22iX1ziAJCyS_=#|o99GhWv3DJk?MS8&84dcwu#@PlOXTHy9@2(;N zUxN=@3i~qV>j_5uAB{!(mmA0^UzcxpD4l#&S``TRQocW+26fG|koI#M)J>sp0`vExMBYm3m! z$yRUYcjMH~??$N&p0A;l-NBfj+3fL?NZ=i6v*&Ll=x>7q9_hY+xY1~g~D{Zh^ zsmpg^3G$=U09Wbzho@tAOf}&T=R^sVug^%=Z-6!)r(zEwrqAf9e;FVnRrI8Q5PdYl zFxCiw9h9T6b_N?wnsVkhQ8lr-ZFdr|5$LB+9R1Yg%aX9aj7->22L1FrtTpFW?}k0V z8^cb6)UjNb?_)>M#mARo_doqli z+D70dyMf;tC$;RL9?mfL<9STVkI`-_>^*!_afBP6H(x`oN=I6*fv*GVVQ2R_qp+^! zXrk{<8}XJ?0n=IkHZf9r(@|Wh?Cnb%wbO5h+PnZIybx-WHs;i?CLs^o|4QV@^|fR_ zYDd*;10iX{lSCW-*Shd6%v9M0GJ;2?7;P9}Sm^n2GU+T0shy>o8kQH6 zx{)r@-~pPgP*7G+4ah1L81sO<7Suz)UySWMC zG|)C}Yo4Sw$n{XpH>&aVS4Zt(>07{~C|#EGtV zLVDhUxE{D@e3iZuG38>Q4ZI5Kkui2v$4Rl(cKF|G>#esXv+H1$Dk0INF4Y6CpCK#E z;$Xa39ly|xKJrN7OKO?w3y{sf^;x>XLr-Tm6?B(56DR;Is!Z%DAulT)sjBw3Dzzf0 zWM}VK(AebFI%dJTC=*WuP>#vlV65F=-AxVw2>PJn{rOvS=Z>YDc#Y za+28t^?`L&iYC4@XV*eFKw`=pZrznh{;PVns{>#NPaB)7Ct6ZtN0+XeJvzjF8~v@m zk+*xY_;e<-19z)tekcD~jlP~=b(^&+wCP`~4XGpPQp02xX;1o8+^ZH@`@I#AHjCvf zH!lFrwb8AnJU)WIVeeuxe!wK=A7H$AW|EkTaX}Zcc7mkK!#H5qTHW0`19%`>chyEp z)Z(o6yyT&FWUrIl1hMJlHPRwqm*+{EX3<)fqLeha)n81Na%<4mNssP9zN&k$1TwX2 zd!2MR@kV3H0iKNU$T;+1?@L~U)@-XMlM<0z*V@G6MC=ouKixX>&|8xUb%P|k?$X*J z)Rr6#(hclHl8gsXTLQIX)U5G1?0!1yMyvUE$8U%>r#2Bma?xyZNt*<663l*_QL>AA z-<1+S1+27RL)z1rF1pKH7E#e3j?{#4F#UQ@P-*ZTLd<2*?(T!=Z=W`|-c9XaHo-Tp z$B#9;p`EhY*?YUG|C@R%-lBT;J(A8LFAW#da!m4LdY=_9gYhKvDu(nTo}zk`dKS^K zb_2}0T4=*HN+U_!$>Mj@_=z2D^-wdnhqTrERixHd8&FXSo8(En+E!l#u&p^=Z>tYc zZ0Cd`)yi8=$xq}mNk4@3P~y>u>tj#E{b~TM^_e8GrVLsJ&+KNLQA_Rc`be0xxgal> zkMv7lRqG&`r(6oPauX)4E|BV6BdFaaQ^hrTq@+?CfVbeOQn2;Wv1FUeRiaNHZ;m5+ zWm?lIzIB>G!tNq6!5m5S;i(efh{Z4G`lXM7ey}K2w6~y+zoxqwrN1Vp|CiErfgB0- zVs+FYyqR!#gX_;^K>pmS@0q!L{I$6O`7;ZCGL-qD>M#wju;S<{_Z!YQ(~DmHUH!dG z^10?_H?37bRynn_5o`Gi$)}^<$hDM)KD;$zxVCyzE|pYjTfICE!qGc9l%=0KfTADf6u%`YQvz4K1?O z6F#*)en$lhmqPgNihTYd*e6`l(kNrUAmxBMntbt7zEzJAt%vdjvwk?=1{>1i0{P`| z3j#dab+ZWbwoJ*_=33)7R_I@iH?PX+UnZ_V9?$N4JZCaHk7@1XCN`U(mT1EjW<`;T z)*Nx{*SQgcoCGBTAN@@?{xq&>5uQ4InA;|KfP1{3!<|us^iB@B$Tr|2iPwYHo@NZ> zgA20mLyvMeul;ndhbO9S*T9^^m1H`sBo~cWaR-RMb=P?5FVbpoqg?5?JQcKF;|6Im z(~<;Ptm7I*#qX5jqwuf?cz(|k;6`XS)VwIh)~$<>11zprhzaoez+JQ%UcR(B@( zr|OG*9RNYBxv^L^|5yQY@VNROFQ!HLMxiA|Twk)cCFw!$>hDX1yUqj6cw%pR5pzTafj z{lrO~QQQkCjwX|GsiFk5PJdGo^|i9NiJdYWhqj)Sx|U%?YU#YDgqEUhV+rIr6!Oed z===-pBCqwU9hZ(*rRk$d368pL((J_h0c$**1LI)>`o)9Z(#v2C=|hQbEx})0DbP=G zNBN_hTv&oIg27a+;K*QbqXLCdv??fExT(pl_{ zNSiT9Wi}}P;EhOEz>Z&T;x;HzQm6K)AnsjQj_-A^?lHFvgB>4?hAnvNcvCIzRgKeM z@}_(%?J(Gfz2t?lLm~G91b4t^L5vjaeh<7-@(dT+CKHx3Uf<6&^!qDnO^hpsG2c8Z`uHq z>Q%%b1lMoemv;rOD8`p9z%Tr1k*Q>F>i(XvI?g8HUZu5p4FlEYD3o=yO zmLyPjlaxmxx{5xrX`PH`Yg2^9^0Qx09N)h+uOKC=v@CHm!jQ|OZSvN{4Hb1SZ_Tyu za|11H+PJzoK@!hM1BvIcE-BxOIjGB|TPqUJg<(xhyw2ZaUwjt3+khXepg=_>_d@PLNbc2;JqSJO;v*(p}!Z#&u0ii;!z8 zXuE)*eR~zsp`7&CS(Z-_NgqmWqRM5Y-WWlo0dv)Gm3hSeuREhnh6SnvASq7;@t$8v zUiM~;(i)%T68~^l&=)ef3ChKuLTG^6>6-@+bDS zJ%4UI>}>A;?cHj$NX5<#49C0Vk!SP!#)+!^zOM%0lj%8e37$F2HS#bT3u&xwVV-c> zv{7o}$2M)8n)t3wOR9-)+O&~sVpp3sLQQ{|6vY)+iI(z{NIk&NaAgldKjesJeN;B3~KD#Mdmq!Q_0X|fPB}OJrnQeoGwW&PYTlN^duKEGQHR}0jmzNHjpZVk$!Mwl$Lbch z1bg*N@`viMJMlwWTZVF`{9#Wc%CaA0VG5b|xOi zHuLhnOMX0h72Or$tTmT`^ynT+@E2z=$e5nY?4p_@{(!v;^SmGMu1|9K+u7oWoH1sD zyNs>xN|2r(jq+P*-I#XN?*me29A)9>b5cv<8Fo&Ob)R$&^9il%x>DmoPpVQ~2~fyY z*LxE`w9TqfJ7?FZ))^I)Hb{4axNB;VKFQ(A?v@if(%RS6ZpwGw$tB*lw}D^ykY@RH zox}Vwpsd42Tm_XS6guL<5Z*Zs<$b(ks-h#qPg-@5l#_iehC3ja(A(U+9@46Fgic0M zt%+K1K$$MdndfjD;&@&)J{~0bagHPPMVQMamcJ6ORlcjwvBs-H(~MwgT(&egx*Oa% z*j;0*m~v2R)1gJE9JH;vR7rfn?@0f34!=ixx7u#o{P}a({cwKXc+k$5p^b6cnt5wa z@uYk_e)sp;IeFhAoCohdhu!;_8px#3+xXjO^wt~n&L~im_m{@PApMSkxwg~PCPVzs za`>Az&YuCW9eghP&#fg#(s2!YBjD{V(Bo}&`>HAHL~wi@J!iDl0e1k-J-*ZhGh>um zrrfwpI=Vp(n76W2W2&tdhIjW^+`nl+nu51VVQiEtP7fab?Y{x{fATEt^s5{v(bj zC2g#2se^c5LN1BNJ6aeP<1-BEhH)QrS3wyY@&40|<>-cT9OuECAuNa49HHY2f7xmk zlU_lM!|En?erBRYg^Dp6J?)ODEDgwS&3mi#+!=n&mI#dhs_HsQsX<0vgdsJhwiF>* zqjJ1N9)j|;;yz#119}DCDS*7NBf{>0cCd2zNX*O1vAqPO_Z^UvkKM)=(;GsVaRBQx z;?*nA)0b-q>3A3Np;T1D;``~Z`2j2021+~RGj|LFIr=oxwgYeWwiDZ}*A8*(C3pGQ zneUq4vs`|j`9u@{tmFI5LwBsyvn!La!eO84(fXJ7jFY2zaZ zbDCX6kJ9pOg7RHkVZD|wLhBqw@S8Pin>N8N9P64kp2i&l()cKCybCm9z8BpYV?*^0 zD9HpB#bdd!W@X!&Kdm+BF*}CabL*hV5A9U$uYQm{_?1!W}!}5HGIA z{4YW2F0KB6pdQKwTJn^yG-vK$drnMeet7w<2ppgt6YbO%bHgMu8r=iOyhXykH9`mJ8T$X-$nZ{eWg;zch>j> z^`j`H_-7zY59#-{PAIOc7h5o0${Hp6urTaQ_aRnH&C0XL@jX~K>JCw_m4oVa?|GIj zNn@ogpOvBzMpu~a zpwQb#SJ+AG>s%qN3xQVR!@REO2ckY$1FVUuVTzZ>=H(Y^U+uiS4WYVmQHNjV@AA0D z@#B~tuHVw*be+%kp1Ld3`2B=M>yh)IZ{#lJkHu-@2B{9XPUq}Z;cg`zN}ILPz^SN1 z)Ei1C-;$E9fYLsDeVFU%+<|vnN^9+v6=e!(-V!czk^LWQSwFsg_G#g?(KfCP#?j&M zul{BG>@&i7-LNs|^L_E@VY|KUIssqjfKL|iwc(I8pQ#?<`L?^umNUb6dyBSR8k8uJ zG_&Q@a7xjM*|HW&+?!M^y`#34RpACa|7}?v#-CY~^#^?PJbod+rV$OH`L+cc87~(BI(xNu7Rm z;FmTbDN~y%v+37C^eYAO4Ejauq_6|57&GZtlNAG2PHjz?ovKWM)v9J3>gBBo7t=Gu z#5?(NuR5RG?QR|?71+Q$?R>s}W;i+rG*)K9eGiMevGITQ`IbF6V_le94uoGbx;ETr zJT%VkQ|OQ9GrwfaKaP+5Kib{|K8hlH9Ix)_>7F~Co|!-dW?A>0Yq z&_OZmN)mO&V@Oy8S9ezzQPi*NCZGu3>#+!4K?MX+@!;~ljd-lbdW-k1%lzM~>h9^z zg#CTLzu))I=R>Be>eZ`PudY{BuihIiqrLm=Xq1I&NAVWRF$*}>BhmWOeD!=7+rJ&f zY|a$uvfHhI>r`z2h~h?C{lw#~^MZ`+Rt~S+Qs%GV*=ZnptQ<4yO!(U{>PT9SpN{wx z<^Wls4u2gJyrSoIpM&ofygvALzwUGK-A=EsOTMNQWEO9|H(=cVn(K6W>rKTyPRXgg zj@%g+r)zio>Peg2SdVRJ@!XrdFGxb}Bsrg83B5WWN^bZb`(T3Ri zpm#RGxZe8M_XWm&80y!Fdg)%0!ut7W4<1C)doBr%k%II$BOinDP>XT+3w#)hzn(=W z2+2RLT@)wDHv(Pqrwvd;XP5jL{)!p-XoTUy5;?#6tYZPs%3znesBI~%af!_ZG(1j% z-F*~o*dA!Ohj=8!^v6KGV>r?Fz_^ksiH=3Ua7O+DWKbVS+q-x?N$ZgW^13AP|Czb~ zNk6(W7~5maY14ajTaC1@HN=U2`iFg*^}*%AOni5(%v*HXRW6Boo2bifjMaHPy00_2 zz}y3#*kkoC$>M(3W8W9jcZfY~{b`Z^5=^LmGGF;i5b0rhB}muEIP*iq&b0s7!~8!h zqT*~l8#v=S9ChD7e#Udf@9>wTe}7T1HsPng%d3|U-M~47^kVpS>BlMYf-CmDewSi$C)r6AQha=55wmcej9qb-}V@KyNgFz?W<>d zm~NydyF=yVPJXdmAd`M?O`NL?`BDX5ALpgVZ0TR;rH`QLF5NHGFOXh~>20o1J>KfKF*?y3JV!k} z*Pf~bE30qyD?+=o>G0`Jhk$PlqYfX}3VAS}*6t1=%zA+7lHXhaE1r|VCE8KS#&>>` zher6*{ax__yphoT9~`N_?>ovew<@dq(>u~upOU=v!)@t9^U{y7r5~A>ek4sdbn$9e z>-MD0KIA18+;p)ser`PKSgcl?y(p)@H-5l8Ga%2OX`Z8OdDuEIy+0lCQL^gD(Rq9x zopIUv4y!FMy~VD%f{in#t|0iZ_Jmcru+)CpO6RmJI#tvUYrCwS7G|^1rs)nAe8_f9?SO z{7|4W+vrusyl&i2z0)7I<;Mc_Q9lsu*Lko%<-wXZ!msF0!_Rp%pf@*cM=!wQI8@wq zApW{Ym_)hC;^X|<^N^RjgXiAmzTpL#xSWN=B`U-PayIV@k+a>u6mYn|a2FEA6TLS1 zgr7{}+#W1r2+SYTxv;0t3OgR^I*;X zokv49j|QWkthmCsPbsY8ayevNY^;81|LY24%oq@yZ0%F4^2+4p{_SDFUXusw$b&V? zz2ypHEE?qsmbH=f(~bRM;!YXgzFJ{6=fQ|3jPcg(k^V3#Nmd)}WA|BuU#e0SwbZ~R z+uw=4X2Jz+aBdyWDD%Dkd`)?v%$$FeullFQy|U`arT;rG-6yM#T)Vih?3b?kW!2(q zD|lsp{st`kWwr~8bsVV0ER$CLuu!XGSSVM8 zTu*PF0T#m6H_FT>1;aVchVxAeP9|GUypr8dYgNNSOoMS)2+vRquU-lVQa(MX zha-#R4@XgLH+4U?91!7ea2Ve}bsIYo{E+^}-Zl0)CtPWq0SyaT&!kNn-J{_}Olmj1)2{%gkXuQcX!tMedRogcHM4USuVLp*h*u{O^M^*?KV;Y!12{G1S;HGf9Wx7qgr{VlQq z`^J9*7QH@VSswuG94vFk*&)TD2n(G5^h>?c^U}LZ#m8Xh*!s{iXxE`t0pfF)yQjf^ zvN7(aeYKEu$rmMj^o;FD_+ClB@l^$^$q6sfc3ufJoCIHrCnMJa29Kn;l4s+4f?-vc z6Q8(PzPUl9=OzkSEME`b>o?N5bnU-I|*E#Ch zw04&yWc_;{_qULtKY(p}48RYix)H6T&kHGJ0r!@_Gj;6fIkKWwk|F-q_@9B=_CzI6 zcM|-?)5}v64*1&vp$d`_J5w_f@y3k$yM)8ytA6$x!&iNQ8F!o|&Y<@P~i20Xcjy$@>r-T5KfXBJ3*kyc4JbN8`+ z6M`C?4|U5VM51+KPdF34a(WYQuQ7Zjvi3Va)FrP-dpDd}oMntfX1!DVM%4X7j)Vs+&802h_84Fx4pfXcnUBrO)d>Fzu)-1GQ>wfMgiDhDIv@F0}Um_6Jj|2 z8gc~*DG$CX1&bg(Oy3}Q6mRmEIQ8tEQSWWJex{^Vpuc(Ma3@zl6 z5D%E^O0b3#^mKvXRZpMS%f;Tv$kX&#C+Q1^x!C(kB=#Q5dzGFyK9OxgnDig!*I2Zp;WKy>GdV};%6|x3?Z%Zx{#g1YT5#r z&T}EcLu6O_{X}Yzr=&-cN|tcL#}6hRr6&?m>Rm9OxL_`ptB?+No!bj}ImkN*@|KWH zd}u>AhcU>lj5;5nD6g;1VGjY+nd4qW?;x5x;R$twQXx&gSf2Wg7!?=FeB#+67W=Gcog{+Bx68(BuRtp#M9v1F3$eL9PM zi05S5k7TNQkNv0$?@mjwm8!dOj%uV~J^9JV`(TadqOl(oF7};4%kS42`{RprS}p=w#wUomOF|!yY##pO zI{l5Tq=<{+r;l3e(cdd@UGjpX@Lg5QinSqpshE*ZISO_a!u%Cig<4izr^mI?xOpqC zg}DFHS(P-i@ySmA7i*p?N*9l=i_v6!eP-shRk15<}USJU4-_-ZnMPyI^G~EG!tWdnt0JTW%=c ztF4?cZ^h-I)|Kl(%4l8L9f}>uwbk}@hHt|)p?cbf)+X4Ub#5PN`mS83pPS3baUcE7 z$fqaB0Py&4_d3H*&{d%Vi_NB|*0KFrM!qb8JJ~ZvF`sruKYMK*yW?(Afs1&5sa_n) z-D-;3$s z1)*_{pR?MW%R=eU1;FQbMm5rLgdXE>MBRD5oIe42_w|WkB=)|so)=tg*c|-5*eRa_ z^rxeL3(ey$2o=&Yacq_W%rq)PWaLrl5`IP^_l}?$njoQo7GMCJg953SiS+@nDO({e+yOcr;FO0i$k5MhD5rf zHGNS?ga5eO0SOkrB4;eh3aW!jqeD|l&bo%}Zxd`*Y%fQ9hPlkMU z!qtZDpG!=eWpsajwSG^kTpB_@Isauj$5?bVJLhOs{u)C0Eu+4j;4OR3bFMb}Qa5Wq zoFkyGt4#9;=7?4W=7*n+vR3M4%~!6XWvvYbbn7;RtkTPxr(7GFAH15TU#F*IoBjQ2 zLsx^&yj0ebs6SFd?zo!mXOwVD8;nh^fsO!?zVtqtXl>BDxLWwdd8itGVU%#AXnaQg zd=xw9xQ}W+)pNKf>lC&2i$hw+Wg+dP?vT{BR9pysq=GwB?2I=j+DI#4Kx}k2YscB_ zobgeZ&9DWENP$yv#tsJb`+`S-wg;JhhF9AMdEBs%l@sG(CUTZLUzO^dPS}k;e#ZJ;7$ZeV$f`#gvTPngHxlx%8@pHA!4mMD6a-G_|<#Dxy6O^%Kq&8T3;y=lMLD z_```SJgnyDiY-rE1+d>HHefFjV|Q@(#2z1qukUV(?S$`xn6u9PN!C)HTYKWKq3R89 zXBiGC`w3Rw1`>Ojm_ANsUSr(luMf8dH-uY5w}sIT^WG$9JLfna;40}k2c&bT!6}n4 zVV2b#5W7CCMK^>q>L*E=hPvdJlhpnIjosRA#J-XwHoT`?WB4L9FnpSnEk0N}P5L$h zeRlwTx7+A5#@!#TVdKc4$*O~Q!8Pn{f~MYX(ypl+p}aewymyl<)Fr>FQ+$U>@kWzk z16Q|6uaW;fO0Pt>4H`wJMu|{w+ZN{o&T|)&cAA zJ-{aQI^3V*Ya+2Whb_&s6cjD^~JywC3D1rTte)k$8nnd{X&%r;o32JS=vm?oD<`*e4Sd zqKW#~^6R>0cLVM}FkLf`wsS|go^%rFWbKg$!gXARXi92OowJr;sZMI6=If-FcwLD9 zBDYV_w(JROdv;JtmXh@D2gB(-+rpccECiv3ZsGyPC<>sUK> zkmj7JL9rgGJ$5DYj*I=weVuN{iPP4k2K6|6o*u#PMN0=riAZlMnqfrO3D%ey5Tl2j z+WGq^mEHLICh39^iBvf`pHxA1ig@C>RNR^*^!0*7WsatDqQ9GCZQOVrdrz;;wzTp1 zXDQY+z<-+*h?hsKs>8=C4y-A*XNBV-;A3yH(b>O+b7Q~lI^(?UyCl26!Z$|$N?PAN zExeAc(Tn9d9cX>3kK?mrxKgrMozxMc_XUrEwDx7v;Y3>nuovT@ui!f${(&%Bwpy&t zgnWG*myNw|)hSH^*=(+wnW=~atx+=hx2g22D z5z?A|Agr~e24SDac@?lg2{I4Y@g4PQQI23_d2%5cBFBOp`;v3Z7L;;V`8jn=mh29+fx$xZ>4&=hC zFzj2(e-ATI4<8OLuh{d#%8@;MQ3$@?U3s_(2|Rg$kYP;KtWdic8zVa)?x4x(?+=WQQBlYo8b_`$6;$Sy2ocM%t;c-!${7ATZ zt4z6b5#`uLl#|8pxz(_KnW4AzIT-9K8He>bbO$#f1)3jdP3tE7T5tk?!$B^raK_r zQAzh-Nn4Fe2dFWYlEn8XG%qXr32WI;!rm_%>(kcn?neR0r5ML3fO!%q03P&GEI}I& z5IZrk@3vxpQ(OP6g?Bup@9G!c(=WWw7DidZ12b1ZKR1ltP(@m?fB2w(c(whkH+XPn zcficBvG);6%YVjJbnHiB`;pF4HvEdWjV@V2)9nSL03X_}<3nx#Q~hwjEQE0kho{^FtCji%&`sgL zV(^>VJ#-E96OX6fLoHJ5f5N~c_Blkrb2N)%cwFT!)}K)GzRwBeIAgRw9Z&bX6@4=aF>WTiY)s=tDa88l`Txwtsg&Dn=6;$EaX^ik(vER75Ei zvkt*6EO(aC+w^jG({eqm+_!1DPiy=4_AB=YLgQGubWG}R*z|JQZP08RhxPHQm$R3a z6Jh0iM9X>}M*MdnkP7<&z^5zMP;2tQ>B zPlNE&mhgBsTbtoAbWe~AC#X!G3y-8ScP?B(_X@digzhzRVTH>2xv+=s6^yX;Ez=O) z=CL2@(L?ViONmCF3A>8%#_m46mn^O?PLg1d)6<^rmo}0F6(jAbere@IDPbv3_Dcy7 zrKmm_B=t%msTT`Kz1I)@9U@5V>7W9C`xGz8Lt^Z6J4Krzzt6u|F7JR*Qe0OYfR##x zZ=bK+S0cHny_J6^caqo__I#TlU!5|aR1`k$Tgu(uUTCWglZLSO^tQ`-$`g7@F{BjI z^;ho40mNA$KOizGr4;0-Led%E2s_)l;HxC42%y6T3!IgIt3V z-?zz9;*GHTH<>v32iX*XRjH%*Ajbo`;Glth0-hS5Gj}9 zcO)fGUGQQ`C$Hb5dMJ&LF&ce4!rD%tt=LLiF>!K?uFhzk7|T{T8C_0dZD)fnBX+lq zu35z1Cn#OQgF0PzB?V`FP=uZ#kUH-~QWqR!lpm^7YVp<_zXNsN(eV8>e!IF-XS5w$ z>y2Df6pC2u9Zck<>5vdsb6cN+W&4DlCB>#_3!MAt8?zZYZ4k- zc84;)niqvKIEIxYt4~nong_b8%&nkqR z0p-oby;E^r!4%lpbI&Vs`nC_k)oUlg9D72IhuS+!k@Rh!hx-IqR{4%=PbkL{?Y7Ut zlOz|9cc2ozseJ}^+p}uU0r<|;+?wr|d0buUkeUmK@?-UdmFRD>1}#_Dt{q~2_qklz z9+v=cB>-o{-gA8Kie5hUOrPk_DqksI#cNISc5ue zXw7&S^tA~!MO34TS*9%KfihXGL92q=NuR>ZTV6x`7Q~Ne812+f`UGOiEHTvX@f*gz z4$B#Gli@GqU*R;gL|43~Mt1l}D}an-p4B)X(TyEED!Rxug>GdeEuTqqnn}URE?430ZcA7n+ha~4Z=`F&h8+)so zI5$tVZ9Xq_8|&Sf23<1NYIp;FeWHIcx>&zG>n8opwNicf5R(4K(4x*%OU=rK9%mgt zh>UX{MdQYaBk3>FIuCxWaIw!7KK8GSeAXDWcGSm-+4L<#i?~_IPyp&9a5|i$)&cbs z1dfZxzL^IQ0sRJvkY{hweaWbwh1vVu&%#lH+)T(Wl2$(tSCZrXtq>cacl5~7S8rlx zEgAU_W7v(7muL-Ngwx|c4`|%paE}=V*j+_D|~#%h)mM$f1Jd-N1CdJsG6Ud5g#RQC$!-6=P- zJuSB6^1{7UUGm~Kj{3Ymy)6Z>oobTKI9@u75^@5-Pse_chS@J(TXQmu*8mbki zR7df??syu?$TRSl-xSTr)9F_a;drbsv)?mChiW#VW|~m31CoCCvHoUeQ@!5lB&fGj zAmD3h0XP`u$oUCb#NSl4jJDqJ{WPApZAx!yNB%|uKWa1pzlGSpa`(!+Zf0l0s``vr zV43Tmf%xNSea6AO4zsFL+wdXG7k{dQQO&XMKj1g1eJcX91@~g&y|HvY9Yd|2%&NH* zM*kR`nZ9=s9P``Hz#XMXdMjg}Dqo|WF={8$UGDZuAfea0sooXH55kvOX+`V+Ekj*a zcL~HN-5?3m@Ddg-b^{mQ$VwN+UPDXY((#2ZX=3c(Ih%pnExNw#*UCHTIJ7yzw|~!w zo$+uD+C?$GRWA0kapp4r7It69(u!(SM@|>~6dj+cz9KQ(q0flr{3}wYT3n+N9iKWF zzGFW-b)Dls+`@D#l)|(MtEB9tb5{Yuxe;3}N%an6KN?{?jpD#c0XdDvay4> zF4J)#COl`gV^RurTt6HV*C)CAgX?cG{2d{VT>LG!821EU(0c;B$wz){g!mExB{0~> z3E1*~tb;Nt!vab1q>?03y;Of|2{*Ck2x<}f4juMiVf;-yKMzlc2u{>TT*`F;j0@zJ zv`|x|gsZiyL7q?~#YG{>=V5+0^l-PT!z79@-o+gWQu({M&b zc(j|Pk>LVrsEr`$Y%qeqzs)M{5#-ct&+y?Rj~))YLaB^eQIC`P!tkPiUf(03)K8(l zXo3C9Y`4oblC{WZ;ptvM>XRf6b@PHSodheO{sPqB3H29`B1^^U8iDGq@*vkIJ3l2x z&PiUO6tQc<(M9#bdQ#`Uj;3YQs+wNv<L~FRXa5k9D0esm3|U|5#QRgjrg*8R%KwvRBh<3*Q@t3eF>ip%vo<$Wbwr^p%zZ-&?Y1 zw;lKvPt^1ZBgjeFI=5Tr%90swJ&R}b8`H?!~EKtkC|~= z=kkkeZj4f!Bp}-;IlgxF8&5VG1k95Vrjq}CepeiV-v+k^(X*od++y`XPQ?Ch*8XjT z3WBiVk^!<1AcG82Cb3Vk1}-j6=E;W@1=pwQzU1T>pME++B3I{{2R{XOIE&YPe@`vET{534BZ~01MTiw;A0B1BFvl%lj$6Q8 zpco()X3aR@dUvcG;!eySiVw8*<@vRTd_wFmOSqYb&UN?zxrz^mS?ZLm(N2o9OWoV9 z!FbyCYwj)Z?f+nQix;&VTN`ccl)Gv;D#76W);PS|h8>DSzenzD8C!!e$J8*L7*)sd z2;le1pCKVwW7L@exl@|1HMT0{D$|E5(tsoDH>* zFI*qSe6fGI=F9d_2caDG>c^^(1@J*X2O+mAg-peM8f>0OIqdZHng zi;N$zCzkYI$`29w;Vh2uBuJ_y)D}=k!ugx5;;1hIc|KU@cq{8F5{RB>Fi*W1F9Ny5 zQ;d0VPXW8hNY9|+NNleq#&3ZP^b`ajJc!g50Jnp&SMa;K;KeLY29sLJM;Nzdde&Mk z@5utpqRK>Zufck z^o=Mb4<&e73*EP|fHnZ6Nl6xPZn4wC*m;E;XjeMmwad=AImiirC}C*7IA40xOI{uB1d@`xI% zeZav3q>0pm9PCL3NHcII|3kis1Ed-Io#Ss~gbfm&=Hy& zmFyhT`VRcG+t|4h8_jIIE=r|geB0lspEDp_iwWn`;VuQZlabzw{uQnlod9!O?b_|Q zYj#mgGfV_sA@+nZ*gBl)ebof9m0504gQRBx?nv8jMG7H`PehFmk& zZX2>f$Gd=h;_pmdH5TpG82#zU4Z03RYGZY@F(a=Zizi9*UYy=#wA)X^H|ebd3;gB0s*c2GuUdS(w?rK*{}d& z&ZDVy_|8iHqmC&+wDCyCyJLC!g*rB`j!lr*Ym4HWsx{HW#a=S>J}&{mk_f$8M zIw4N9D$M)SSms>?z3|*N)&oIP3>T|J-Hv z&k=)-{%P2&es+WIr_iA_j2PUd?ix4S=mlIMN8{w(u#3k>z}6{7ydVh<%j{ zRq=SfV!VNPZ-b$u94wv}3>7m=uQ+!q#nv|+pKW0Jn)rqSQ;c!?{RZ8xpQ;qsqn%7O z2y6DXV{w*DM?=LK_0D6hb}G4z#+^eB4z-0D6u!CgGJ7%`*_dhNCKS(ePbzNpOe|jN zJ|ktdDLevTnkXN;QjMe~-dM~m#HQnuipRn{p~WW@Yvj+xTGa$7>#r&5(=#!#I1`_i zLM>yAy(q=Bj3*YO#!Z*^`R8Aaj2g$Z)ARmGV(D;OSs|-`2Hdc<73>>wLn$%`Rtw~ z_I;PUrW7?Fj&$R+JpEok!1`D{&N=9uMAJRRltK0$~dTuBu3w#+l z*+%HO>dU1e3W*xh+s23ZMe4)AJ$A3+qWXJlHZon?I&TG8z%!h~sn3uIK}zsszDpj1 zw+$R>A$G=hrB0GOj(-r|f%qks3$PF8&T{Qc36{6?PiE6&LcpKml|isy!rBCX}+2La8 zEw{6EBBQ=KDM8ntAE)5^P<)ebzC+1_`6&-(nOng^3L zVMHC~quX`6zyPD^o@k07LFNr;*fW4U<>g~P7b$96Nn1!Y;)iE`t<2L%vy>}RW z=XqP-xj&CCF^^~a4%rr>PSv$}ZSh7PUdhC3%u5IEu#9(kaz}qVNZ(k~)hT)N+OM|! zQ#<o=rrcdi2{cMwo)^xQg4}XCze{){`ur2@e4z*u;nJs-rUixrb`pmrfaFi{5 zR$lrsw)EL~>&A3zdOQv5hGB1w$x_GPX~>1o7F*@T1!ny7#n!hA3vK+E)6w5HTgFzN zW+_j%*J{h(lE=^UZ1tII;TOA~{HvZG1W6BV(@2wf&icM#^_{tWku*8CFGAec-pR%; zTf^CIt`FAn$_`w|Ux0d6kQX8B*TXn=jdlI@JMHT_LK|i7(9@76ES0m^Lf&H87HrDVQP1ZHsDF1hP<>#-}XWxA&o*#Ox{;#_S?!OuN zvNogt8gt3@cU$L@-%=u2R++<~nJx$kddp6W#-4)%=`4H~$JbN?wB^})8;)H8iP z_Kf;)TMy;e{m8EYVRBjx8THn-E04qeC1|4Vhm-W;a7qDRn{ zZx>I9bj5#|qKQ5ydX$bhKWxrXR85p&h;8=&Z#2cWM4WF;%aw@dg|W#V+VAF2{gDym z@q+-fCEGFCJ2Q{=Gi>P@ zi%h}Jp%?e+XHBV(Cd(B8GK8M>I>-u$U&Q0Bc7$jJ-xR0691-C|XwwZ}SceGDg-NxH z){-8dTtF00p$8$;q*u_Q2Jo(#VMNoWoCB^hkP$ilV^VEgV(sKzZ z7d2mL=mMXMpk#bE7wUyj`29eQFHj#i zj^rrzTWA>tw8%7^QFl?w>wN`Wh37<{i%Nz^wRwcP;MG|dL0g``ws}ZwbqFagOe>KDnLnu#Ak>exAcb8f?72l%R>pd`c=4I_r zBS=?XEhC{*=h^8yk__BCfQK^Cdq`~Wz;%#}I>@ol@=Ln0)?QMW_M}J{(kXHR-*#Q#i>-=;t~$e>QzoUM4U|tV4&$!`+1(c`4{q>}Am?V6aFS8*M(zmG=nc_m*g9^+{*#$6ngsG)+!sGq6-luu4h$Q9H$RsHo%E*CsiTDPgWjBBt zL`eN0kw|Cvg+g5Hll;`+VBBS(6}Z8`3)HD)5W&HOOd2$3aOvPb`4HMg)1AasDAD`y zd_24b&lB1IjAy$gozv4Vu%vIyN@vB^*TFm*46$)sN!I&aA!gBWx*Q6le#~?s6lOdw zz&9-+{4OUK_#}^Xd%briv5%<{WbVPb!XZ=#XCRF1wG+c8_rn%@ty$5Q6G#RB60C3G4xY4*-xINhc1Pwl?2WWe+!cwo zC!+x}iHID1x8JxYvRM6Nhl9}972o9cr}90yJ@JcEINtCTM{RxIqwC%)ilbga3t*bI zD^e$T2>xc&!EMZ!`gd7P+YR{t+_8d&VGo;#eUjGpM#c#WT54GEmk9bM!?H29wt+&t zrjd1#*tePnw8YPu@7>OX?G)HwcjzzjNfgGZ!zQd*y2yP z$I#c^8!51yZJemb&*Sz+0@OAD(~&v#9(J#P3*D`9dB&p_cL;Bom)IZK&jPmGYC^ zr49_wm^KvF>k4k7yEFdb^x0ws|GK*~wQrWkn4A_+hi+f*sDK`yBJ!%WM#9vp$PdaI0Ke`qPLu=Ric$K8bYAT`)DV z#K&W8qsL{`Ez@KwWv+rx}cu-*!!4o<$8hb_3H6O zBIH8;2c15#lmp)J*V8r#^4JE9^9^F`6QggQb)V7ac0k{Zn|*WgG}h+~JK`7Ir}MTd zQlceFOOVRwM7-@RDXHMEc6Fv6pUNkZS5dl~HS93neV^fzV~maNZF+o0J}7Xy zEqLVFBlj_Rx12-Yw0oOmeOHQUPv2+kov-5()auLCTz`4{)%$cieDNomqK=$AOKnw| zwEWXX%Yj4C@|}&Ar%hVuecooa-;a4b=G-2L(6m2oW@EpCeCFzuCp8nYko>i@g1kw($X)?=z!m%fm*VJDr#2^m(q2L4 z7m~|M1JoZcvwL#EX4a3}#lM!q{H5Dumv$|crZ?lshKs(4B;=~i%x*fa(ssLDJ*BP6 zb)~JrRi&+=8%yVhuPJRUy1uk^&=s^C)HPaSuxSUW4Amv;bmX=H6yiZ83Z? zv{bDvt>-+XrD`4gitr2E4cu!>3oLJPo3`jS_bS(vw!?T)qM7&>7(3LrfRMBONb{PoH!#@3d{~1g zzuUs>-R5|LnyHKrBI#6TH{-nx;{o1?(J%dOua0~RJB&2cFZP9jZ|N38Z|F)G5vw5A z7J8P^DqmG6jLc zGu=Am!PPqc3ZjCnGI_e{=!}n<&Iwlhx8>oVWy9ZV!#~T0f4hml0`NE6@SF3+7N)CI zN}h+^`OIlp$4)gq!#W2)x5coVw{yBoa{Gk02g(~y&WMtLIp2R|9cQ*9)}`ov<1Uodp**)BDkHZT)D<{R8*k;|Izc z@38fw1@{l!e-{r}?y0tN&$)l#{(I^D*8Xdhd#0`2Rre3ve{Z?p=)Z3c(0|2dYyZ9T zexv`s1^w6CjQ!W3ZL3M!2ud5(eSrUaOnxs0`TV>YC>xzWBqw(~W#pr6889@M$^QF| z{&@ZnLk`1#|GYovqsO4@C$r6ebY<%Ql7!`;s9$QvIH7dOuR9%tSw9 z7YxbWn~&UP*u-Bkq?}v`tH>KXq4!k(QkIn(x z7_ABkawkA*te#=$53q51^fvoAT{&bPfANsqTZ1Xvbo+_&$|1}{zyNAMmA}d%=r7?2 zp4VRjw38|l`=Oo0N$gu@w;%bdLB2G#GqHSpQ^*^75VPni(!=@AQg`VPp^C zCx}xata8D zWV`MgNLhZt@>}*bE?=_z%6(dwdRki}@i;CS-KCz~rV+1jX+xJh4R6;R`2HwCU)4Lw zT4<;OUg2ZE8nhm>ePCJ}{|B@lXVUu2P{YS1{+qwu>I01Rku$ds+;`5}K5*aplZm@K zP-w9uw0t{Ti@Q>zW>#uG+q|=SyM5mIhh^Tme!DU6tcQ8z0(VA!YsR7Gotw8C^UgnD z-m$|Q^NvCP29y33wtC%T#v?5`pG@1gvwfzfI?Bq)^?>(^nTR*aYk?Au?| z%VK-tR%K{e1-TaXS1V?s9@SxGt-)bshQABM_0D#7eyGhER+f>!naR8~p3&3}BX&U( z?%6O!(+(@ks9(-(q^DyoO|qDgQ%!`PV=`HTe?YgNJ|3VOhn8jHU(ZZC=sC(v)C+sjHICW=}n7|i77vor@a|7-{ac+?GnSbO1>`WB>b8J~KmlSY*65&GyN;S^H2`W>$ zX-veiAkY;TnGKl(oZ*k2+cDTlZPq)etUnd-?WKDhI>&p?=2kQZ>AOPY{@R%$@%hwe zmbmKzXpQ0u3|YAV5|f%>9t*6!PsLV66*W zm&KTh0=9Y;kcd3qzl7fpU%mpJPI(Fc3Jpi(uSqVA)?UV&o+#mEe7$NwJ!L}SdbXW- zO=8{vljTV1v|zOjiH(e|)5el)ag7E>J< zn}FEZcLt3WJFGN@XGIOnnNB&Wl5y z;k?oc7!XULInKxIV6u;K_O%D7*4>Kivf5eMXt}JzVn+<9wmH%z6)_ z?J#_{Ks=Y*!=AW9e}AUVnH44WHaKmEao01WtdQj12rk~i#&3lGq8?vV4W%;H)A*i+ zo&eTy)a#pI?v50?&K-2>a^b~0*t?aM)buj;az{%wl_3Ra6=r^_xeUWv!?dyreiDf| zwp4ejXK@LbnUb8$EAo8E7yBUB4m~@Jw@A~W9Vk8(@<)MF>R3+3S51%-`_6dBwQfi5 z&6ctDUcbXwdykuCJuAG$j6dEMzi~%@S)Sp(yB}`+ci#YU+jiLBjp6r0JM4SC)60za zGaTvL!PdV;@=E&trks1#T?q4L1$VX&WLoGW!zp5s&X0YACCmEs#SX*Y&7HIQ`+)xU z4#VHm!ZIdfFNC(%dCi?whu>J=P*wb{_(@fas`@s%*(9l=G)E8!ve&rr+ z;yOdeb%u%S#eTSsHet`yVb3&SU+M?jWWr{2*o+DLvI)z^#QX;hz3YW#R(pV^gLk8~`L#?;x@jhZpe_&RB88Y^eG46j~X3bY) z%eNyB?*v==gL!z-ya{!e{*@MCC;JmpRXAJ?#_qu z$Kpc+#62}Y-u(|5?YXPWI(K|#(m!vGp>t0Ci$BEPQU^J-nzN}b2(#N5GL+=rQ1?Mq zQFpG=;yXLYs|5Ax@EhOi?X;!pFRUGfP{1Idi_XgrSCN&d>&%@pr-=AM5l*dSlFEZ9 zgK_m7yK{_i_YYMRs!J3e-g7ra6iG8DRlei$)C7(G5a4Qk+f|vof5aEOfS3A;{ z(;4CJ^Vwpg2=~HJg}3DLM7WsK2IGxzdn6m?K#)UQ>A#y(M(K1AB@p3`I>MGqj&Oe) zX3OQT;3j&Oai`5u2>OFiM8&1J6`xXoIzCGaGf<1zCAl^3%!iG;uG8m4^*(8|-B}O! zZ#(_`>0!1;)$U=IFPnTQg zp40o$Z=5N2?qvD~b=+XsM?PH+ySol1aek`b?LglpDLOB4bY9Bcry&-ULzV%Ku~<*9 z!gt9J%t6~G5%PKk)|2^HhkEi6aw7DQuK0s7<>BX zjryzaYq+P6=w~zgA^sT(H;8KX4OPqhP=BR8IO}lK2}REzU8);()P!o8uEbx@}SJf6+BUPjo`&oe1<2drRBjD)s zgnq2O88Fdw+7PG5g&~E8%A6h_^w}?z zD0+tK=6nT{q%haVxeiX?B(Bft%1&@f&feMZ*VQ{4!W;|37tg+WOOVRg+pi1WVzifz zK3!a55m_ewtih`7_j9qWl&7~@<&CM2vhkXf9i)J(RR#1u`zy!AekSxRkKTzq%FbDX zP8ZC{s~j#*H*rYGbO~B}o(=s2DmKL-I$o~MlA6_S2uobI-~u^dt9GKhv1o<%l6$GdhKo#Vmb^})m zERgGie5($5q8;*9fGn~=t_t!Cpth{UFhbmDNxdM*Hvpax;5h;C$T_Hou^n=d)N&?& zt`2*i9ri+iEwRELpAB;7lhGlCM9_vX$T4A}sKB%HfnV`#OVH`zdI4@iwo87k1y+hL zN04K(hMYd`G5u^=Eil`4{A2cZHP+6_k1>52izFpK*5aZ!FIDjUAbxY{6_2QBcY7ZE zX5x;ygCONSv}3`)A@GiR;lpf~D$d21A`bz)Pe@+~aI!F0qLz=|ZP7&R%QP$`8lTH% z)O{^=BolYeT}c9_t>>kW>3(?&gTzm&spnhdi2$QFNJc`8NW&o#`!NVqQwWtoKo27- zi;3$o9|Q^XN(b~RSQ%>^(C3KbxjsUK%XO@=mxH81hd9B2co-l8CdA{&Uk8cpG7t_YmHJd_x-}>Gns|P0GA> zF1;=Jc&c)g^;cQbHxUK%7&f2UeA_YLaN zC8O5P#g}{1?C4;Wp%;@$0tf4J_1psD^JV0BHG#ep0?2q|-W$}m{d*Ya&d4vpZo=nN zpOU?GKD1QH!sR~Mn^EiLT}vuFSo=O2n~`6}Uw?a`sJ!#HkEEZtE+apOF+6IlwENo1 zv8GSJT=G1|ighB!wzF6aXXIBg?8jGquuJe$D1W=}R7iPcfE484 z?S$?I{)XCSUW&^JxV+IqUza?3u9x_{xC6$N%BRkvJKra1ZO-z?zVQ2E?-J@u?sR(I zd3)$)E_c5+X;&4QLHA8x1O1P*v3*l88lT2-!qq|t6~surPSx!&@NIb&^(LM+^UvD6*5naL<970kJ^pc#dP88 zoHCJSMI8#COnAvuKwJ%L32GNm4;$YrLhKh&_j!8TE?uwDp*565)8ix2CMU*m2Perw}PqS1=c(L#cu{T#^B7t?Pq8&XGqFsv*+=GOp+kcP2fC2vI|;%Q0;8^ z8wLr7kA2%6kesjk0=y!ITnODK$eaoN7l0dF+XjD&3}~15x<9}N$@xTaD-Pw)$@jwK z&47ce4}kRb`ydH}l)hy&n5UakK}*(dg&N_q+tZCIkYG#Pzpl zDa1F*H?do>FEd@ZZBVaMIQ{- zAG9$z>;av?edXWPFPMDy5BD3emmh^v&jFkVTt*zqD}IoIb^a2Qs=k1fo#68a6sNL6`FHZAu$cl}6(;!of!>!6+L8T~GRboH&anZ#27lon*-@3&14&~o3g z^5re4tH+CV!n!;N*y{ZQ@rC{dSeXIh3BXP>tLJtYxyKzcx5>d{Y7SV_>jwFNpNVo@ zwb81{a}+}f`Ol@kt+%C72Mj~M6Oy<1OkM+@h2Ga_eZO12hP$QDFJ+T24VeDT^0gIy zl);R$K7_J-0i_@)^VG_2C0XWo;rrl1d>?$2hlkm8If3p@y|3cwL}&c@^a5_WA{Pb= zx&HujK80y7^p!7lK9cs6LVuy*`+83m`4`R+O_keWHSp|X-<#l@dlu*LUl+U0rzZG0$MQG#z0v1~7{ABA{LQ`qdPg48dX!40(n#U_bekaY} z=c71$%b!A+y#TrM*xfoF&W|{od`>T&10L&hxm@(?(*IoNSYDmAU!cA|sIS}WTYk+1 zpGc1KdVOQOZh|2vITAwSyk>v&4)>Zocx`kg-r1UE@5VJ)AOrk6M7*&l`54-@2HUcs zQpQ!igs$ppl!Z!ZXowyfLPKTIc1Tyy)CzY7DW~hdeVsPK8b}l)ah2D@qsSO?IDKKt z_B!A0G4?tS%*7RdkYTF_;_+h%cYj+E+Sm{B<~dtZo(KK+JlMB9*QSt@gXPgB{EP7A zQZN?nC@73KoQj5;5@hDN2@}o_S)Nixg2y4L3skGVZel3jEe9WyBgE z3?6CHk&xwnX+zDlYIz^&D=2XH!6YAh0?*eG5>FoyTBap@hb6eJlpF%a*RH5h7qz`T zb#6ED6k5YOiO1Eh46&xm*6>dB_F5Pv^{y4!3Z>mw5oDYTl1S)#8MRPg{}N=oGm~>c zTES)f)VbKgb&7~B zVPmVS-X9%%lTrf187~lPAwYF+^L4i_va4YT?y+%CkbKXCj{iiqA+KxJ} zkM!@K)m|q#!f`5<&=gO*5~S@Lr6<*_{{{%gPF2vS3cx!?Ll|TgfL6kasPI8WVvzhO zGQ%10<7w<`3NNk$gl{SeR|lL#uc0)z7$Nn}BBF#*qEp1!yFo_-i9Hr{j3=?3K}REr zJs5OMAhGSVe{WNqvCsNMk&8W(H?F)cdb>13VI|^BK7#x?TSyN@1nO4{_W(2WJ-`G! z>!R}rq32yreUAEkZxvbMf!Z%oV84Ajtasb}3Rn66vGyhKQ54z3Roy+)Gd(j&Pfw1? zK$7W9FoOY{Bm@!!3=r_hst|@m47kYvp6i$(qI;-_2kWi}DBimsyI$<>U(xmc@8Pk! zuE(y|YB&W1SMSxs+#@{=i;fc| zLX98~KWBwa9{!sZuH)f1t?(2cUT1}8@$gm=j@9AJwi`o~$UO7~4=H&5%CY|?utU@< zAXKp+nt*t0h)+NYZHQk$N^D3#K+0`Mfq+!okU{~ewIRBI)Z37tfHd0>LqJ+=NJv1A zwIM|Ua*_=x7LYkMq(ngG*^p8JSztrL0&=zuDHD)B8xj$ai)_d+0lCzM3>T2AY)H9) zTx&xr1Z1@hsT7bqY)DiU0a;^1ssv=M4T%ZJlQyJUK>lPyMhM7@HslBadCi8@ z2*}$uBrYK9ZOBLg*=j?M6p)=Zq*g#avmv7dj1`bEHl$HN8g0lp0hwq+#tXF#_^q8`2^m%WcRM0lC_SOcjuoHe{NB++sso z1>{Z}GF?FKvmrACTc77*2jBn70vhRhL=VjI#SAj54) zr+~z4$SDGHqz#!XAayq6Q~_zSAzcD;j18G5ATw;pd;vMphMXoKNgMKg0qL?K-2#%b zAw2?emJLY>NUsf9ARrgokc9$ri49pKAXnOu(*@)j8*+w#+-O726p-6($XNn%j}1AS z#HJ$TK><07j1+r)Zn1u#;_3W3nY8KUDw9E!Uyq^VN@>CoW%l=@9%&d2sT5zckPHCFN;D znx}u}(#h>V&Nh&T_&(`j;^jlomvZp(eV_C&@$w<+hYmqMH{GG)^Uo&^5y$J zn&gVDS7H~sQEFMKPAuiGZcM#2>C|& zj{QS9O#2@y-pNZYedQ4HkCdm6PN(@|BXOeus+xF7vB0M7%P@_@U(CZK(RE zj_-M>`BxcYe5XV3NArAx@(}UzVd^(udL_@;f2jHEaQq!^d{+*`pL~ei4yHI_JxgA%j#dO(ZW3M5lTq8|$PGfrs z!M7Q*ODb|TG&CI3mpG+kyh~HYxD?|Cs&VN;*KFM1>c}c~ z_wCkXA<=w>KOMa}`46Ib49WOG?1hQ|U17M)arBDD$9~K-0Zt~G|H*l%LDTBT(=$J9 z!zZ3ze%9}I4>UZVBAm~V_Y4y9p9OgUpMK!e@Ano3EIwZdXxbRRMvwLbpZCy}{a!DP z@0vhNV)$1D6m>%&Agv0h0kjFQ5%M$w>6SZ^|9B5IVG4;cG4@(TzzDRd{(w>5rojKv zZNwi4`VBwuuM_v z8ExUOSPH#vPRClRsn_-n&0#2ZHlts!Dx9Jn z_K^OP5_&_dL|y52$D~jxQ6D#FqP7`ovKN!afA&K7@@+=_n zm9^?!@PX8N?uY+P<|6~4*dj)^!Ly1oyazJ15{k93xJGphJS&(_^aedd`eSMo;n%Sm zw(5!BN5WFa-?1>>Aj=reP}uQZp;))bBc7Ybvxm&%SAfwnB;C)l>kmq-j)xM*R~VJ7 zl$SSomk%tVAM^}^p4A)+kVtGq0%>>{4Ll1&>(!xHc@Aat<=kAQk){d{v@&J9j3o00 znrs*mu=asa1%>BH1DGS;J-`+iNoK%TF_KIh$dvpjN6Cv0Te~C4h=K21zdHxl!|N1j z$OBjti{S0x!6xs&4<4>A_8iPt7h4Vvu8VgM4z7#W4)VHq`5@2pF9&&DJbMu9;*UUk zp{R>6^mI+U``|s1lPC8B{ccY$q`v3i;L=^hO1JtTuk)2qw(AaCwu|$YZL#1r&3HUV zg!&GyGD<_%myDWTFgBGgp|>V$A%|7frJ)Vg)zZr9>e36P^LkQ%a@>uB)OX4 zn5)+#N49PPd~fhg2Uo#2y)ouK14|{*AgR|8<8*-`N;158xHH|P;l-p0zL`*Lf%ukZ zLN6MA&?=FHR&^5Z_vjKEy<$MjR13g6735&%sL_5r7#c2K}I#c%(4#$RmhHIfC>ipKI6agLqkn%H#~RrHpsd z@NOo_z=Dn+!cZ6QIOuuLGape1^D+I+pA8HQ;7<{HoOmXC1hapXkzMdN!;!`f`1o^) z^IViuS_B`?G{>!-L$N@*|~(AM|(LbbkTV4z|A(EzK5xB~@9!sW1>;$mSYJr!!WxZ>#|LXsEGybdB2`?zw z{;Mx=|EWV}dfdZ=P06!>=1j`iuQcpKL>5`K60zMhptQ$i(CPG3R#mvH(@l+-HU zVD0AQ;__tY@^(*4o?MtD`dU?x-g`G=*Lo zU^*AihxF5Np459td`C#{Ch=_{9VCSJ`%6NSMH_Yd@lL!h`AaUOC!vmpj(NmiYgP+0 z+!VNB7CMvAkC5tFB>rznFCg&)8(pq51UIg1ZV(zOJ)1yGX?6_WQuz>S$-ae9(o|AJ z#4Uuv%EF3(`h_{s@HM{r`9N#2>|5#a6r*-X{F~UaC%JC~gOI^AO0#HSKjQZn41Ry1 z<@+7_QCi7L!zhV=7%U=GA)lj`5v>=2xQ@X8jib^kI4o++nJ3j7-K0Pb5RHWGI)Ou?+3vX*K8}{`35|%B;3El zU*NeKb=cweD;(3&cA>B@f#tpUb=xLr^z;r&oW2S#&%`Cp=*ZX{#dO!aZrPbe9sGH* z6U=$l$D6sj_{W(c7}dEh{;^nFF#7O(e*x)l$2#_$NJM|6HsU+%;}T%(D=)-5G;Kl({QDW;N8dg;~6~UkdpW#VhnW$-KZB;E&5EY=$l~?_KCT)K-^0>0Cjja zwok25iWaqQP5PNl#ha7YU@Z`uG$iwFI;*i~4qK%UCz|)kkxgD$rF#PeN3=FC_lNCR`EqBq+F`*HPMgwG(TyjL~iVH5q8US{kS`l*diyo?%fYs=Wqz-JA+O9)~Xl1W-XU~2?02G;wjH1-!T(?3<{ zVYr`;+x^@CeJXx{z_-Eo54Hk-DRy_Dk|fEorU%#JWtQe>8Nr(bx`;i_^cYsG!D8|L z0LGfa4#n9WXon(H2J&)QaT&rn*3BsI>nQJ=MDuVsq{Fc@@q-Rsx{#iW_fLXH2W<(x ztfuTjdQL}>XsSot_3R~*A5ytWhw6gxPvVm;w4PS<$hf!R64x@KqRhjNz6)y9ku6zBm09juamXKcKS|^uSH*?4d zrUdoUR5q2^ITe--gkY!wIpIJViIjaQ*|iuULT=cMazkW^^hgh^49ZrPmX@*kekU*S z=AOL(jYPhbHV!MTT_W9wQcOf*do~g08i#RVu=4D+^KUL2%;oWd%QMJ@^vn(e^+`or zg@C8lNO5FkSsBX#Rsn!n9D(&qpe(ZdSqv>-D*;yVFn~oO!|pFCi&T}3(lBLc7)p@C z___l=n-EMTRpq#zh$5v5EHA7jXa!qKyg^SaA2vKRoaV*BwMm7w<^a6Z@PbOd%M*eg z6M;1ctV5OI)|#VC=-Y{p&yY+<|wALXwv>Mh&t~BA#0%S-OcT zQZw}sTHhuyX&SyPqbmL{?!$)5s2~2rl2Hrt%BTnb3mMfAGOF@M9eIRs85R3_C@_|9d{1fOuQ5Bl)Fv>x$7ho z^%l9@b)t~F@XlHh<+2ov-%M7DQ!Z;&!4KCQC^u>Fdk}v2!tYn`TMfS(;P*55or!W8 z{BZ0Y3%>};VvK zXq=oS=V^oFyc?OEH-X7{J!EY63V1Fgg=}8$FyFeuwnaPs$&SsKcE!)}1k@Wii z|4Vu&WJ!7M8nzmPN=iw`jbtRCT=Im zcTYB%jJN<~#aWGg)0vc5K{V~jBbzjk5;Zrovow~Eg|+jK_7_ zONLi{)^tJ7o9$teAINanZw?qLNN}lQD7jx+{+nW-KIP?Smf!KWXZrNTJsO^WMaDkp zBE|{hA5@6(b)mXRlW4Q%CouY6p^+_`N;j(-W#jKRPpx3G-Z}y^K9}*rZ`F}v%6GXv zv>d+fAEKNVLXU#2#ppk>oZZD2a#I1yY2{2#8wT>q$)@Eq@IvXu6hGlfl9?vE`N!_` z>moIm1@LJqoTs)BBU<=A~+8|nIb6WM+X@t{Tjr59} zi=A9q6hkEv%Z2-xbYfgcFMxV;=)7tv0j5#z2do6Ye}eNWpQzdxc3P4Ra^q{ zlfSqGq$vn3zZ5h~^WC7Ddc{7u5_Qik%U;hz zZdX=ahIiTNlE(TV_GqbJRcI6S5~KJemz&*br%U4d3|IU>$mJ!4F6-`h(c4^>0$EH# zf5tfe_Y(!?gi;bw_OrE>n^{+Wq$de8=?w~%*G|Q+W&HUtD}>mruzRB-9aX4U^4-+8 z4=>*tQbxX`_1W@W&)b%KSD0768~88eyFww~T?#aD4;hkQb!9n;-`- z2!G!pS~DeoEL*HFqk6`zoU22adk4XN>laP50*MLmvr3nl;*~9XBdfidF@VyaTIHJ4b;3yq3{%lf5uaqckRt= zbowylMUS?ZcEBi31SZMFtn%_wc$w_D3$4#-JRgna^ETvzb}v2x41Yn$TWC?Ff+EeO zm|cnt{3M_14x;KlxAO`0TY>V{bYrYBJC;D{?JOp}%{OB+G1SXK3(QyxhAv>C(@eDQ z>AcT%KFPk%^+S?l8qjr>uyo%4LgsV{8y6mNrs213RVaCNUJ#y7htYKi{Ycj#bW2@_(2H~pp;MACzkKQP z>EgH!p=asJ!=pSz8RQ{oX6umhvF_8ixlLS@g()%i&ea#0+z%?3d%t>{+XXG6^R9n> zvavViPMILXNR9O+1m9;UZmGy!^w6=#^d)}XajaW&jd8o^(Qc5NX9?YxJz2UhAZ6*o zgG}Q)b!?B#=n84jGw-bk#2$s;;}wC%PsYJ)dT+-@#ZVic43hO;Rch4~Z<{8m{hF7; zyVj<;RA!-NZ=e24kmErX&}ibi-{5!mFhQ6r2d1`|9>d*u)msCtGI6h+#CG)$6aa7B z7wUt+&uR7^pZNjyZL!k_(l5wu@6dM}JKES>`UA)Q9u@n0@I;DYf3Kbtd98Zc>eakO z8rI+#uU9+TxtHhWdwJB;s?n^yyhkqMdwEpsy~i6REyQA1{amujR!lCc3B{3rKU+g`uOTu&vfaaJ+R8m@s!6zy+%Sh*EuGu=m; zXn}(YofZEWq}Bm8L+#@IM`H5iM4(yE`1oZK^40G{n`bm7pJw(Ye$`PbgFGigYskHc z`#YA(@D9lgS=d8SjN(=oaXpf3gAQYaEa)TE80Hj%Bp}{uWSO0rV!s{@5&-Y}iy;5I z2)6*`VdwDopu7^ugzv<#tI7wfzyiJs+(V3t)`CERQP^7OD#VkjzLvW>w)`1Kav$;g z4Y?^?NKyqyf;H8%Iqy*t-1sG+S-ghC*7g#saQ4$n@=O7IP& z*QN5C?FMn$p}-Tg){yHk*r{Ns5@kG;lX_=8*Z%iHyhCjH>-hAaVvktCwshm{C@o-Z z>6ZM|Fj^%lwaQd^q<(`WDRbKwnE+9+br(rNVFL;O)OWdF9a=cTIjWG&QD>M&f`>ya ze7gBv#{29sn2&3P?`F$zmb_E+t|jk;^2$51_TA;30wM3z1I^1&-tlR~h+wM+VAa0S zBTG#ljZ}G3{)qR?T1I*82a-NaMgmd(R>Hy*>Sh#S$ie3arBpz=XAzL$Ahq1 zX8Vrp%nIrxMESg;kY*Rk<4rF7@@p&ci)kc&xk(17QAN4MF-n@q?eN_MA%1%*0X5hx zM<8702*Zk0HXLE-eR9MOH=(6^`6-YaAMTjVPDkq?z91+5cN(6)#q9XPocM>dUVRC) zuoWN3iC+WpNk@DrC;oAW|AiyopA-K8#2@E~FU^U68R9EDGx6b^_}3x+WIKMbz9U6h z+|)s3XJyqF*?HyWom9VY=nB-KE3;oZ zZEIP6cYa$GVCSZM3>fyF@O#u^(b5>L#rhxGWxmVub%DcgNGsr9DP$p;G%IHigE)I< zJ&bj{cShMP*h8wMwNL|Bfb@YiU_!j%h(|BBk3#%)j`&DU{PPgM&yE+Z32~7@v~y_< zPRnXvidC&(wQn*z>?;CY^=D!2OT6~085C+i8ox0ml{vWi^+1*Mzd-SMn_~PnJoi>u zeO?B2b1AdozPqD{&7THI%4eBo6G~LQWQHcYC1zKo2v*m{B;Ec|hxVr5m)8H%4s&Kf zsxVmDaPS0z_Q-wAq7sfw=o2VZm>>-YC&B8uxp*S1+?u@bRTps1b}^qp5LeXXnn;?I z38c!8HUb5WO7u;@&Ij}t5mK1e|B6pN6)ek|!#;+Xmspx~^p*CHNzflq+5GxzSf#(1 zDoC)Mfy_(}^|LGf2SbU!sQw|oTl6%Tnfdy|EBe|(M_;SzxBA*yhwN*9p@Y>1__&8| zoMW77G#eh{*w|{A_mn$u-cx>LqBMMjawiM@(2PBXq5D{9i5XHrT5f$N5W4`NF1BuR zDITLZwiLqdhcN6`T*e3m|7KCX;UQ1>hX&dP&`pm_>RWrf;B`r?UM%>)7JtXJsAIZy)0vjf$yGTqf6GBU9SxoMe)DkUOn#{>w%{c z>>kG_9k+Oj==IO!!lTDdMw^Q^JtzTFP3f$NQy^$;LCgv zR+_R$ZF70tK@U&^d9KjC_SUtRL+XQlr|j%`_)>gpQwu#vk3Dgv=`JMA6jqu&@fXEP zv(H{>vhsVy9hMu`30Yn>r~xbGl>0}fd3vlHRzkFb@K9gNOR3(a_>T1xKf~{8Ra~l3 z(ki*!tK5>ZN>)ZL+K$85}^o00sHrn2jXgKTSpb}=x zDDlW4l5W}2q1S6#Q&9=yVENsc)8TVK8tKIL4qfwmv$^*Q?!Et4+~eMQtH&Eg&RfIY z@T#yUywdQ5@wB9pXkl)JEllu)h?lNX?7WAW=K3;I3pa;Lt*<6r6HbN4RC3)JzH)}O zcepZq6m;4!LHq5(zE?5o1{6aMp)%Y_2s7OkelqbBL5Y_e&mrE26+Gr+pNv8*<2)P< zTWz>994$mNHZ(F&!JW8i$mq z4N^4>Pas%b4!7=B3}>egd+CY8$|Beb`EW{@Ub{G@06e}g0qp>d)I0yVcGWa|yboP$ zdRX3+aq3}pQUQ2S<8m3)_D1MAet#-_P9@4me&T019@P0syxOi(lz;#lMkq=_DnV%} z19^c#SjsTgewb*!X0sAT@FpceP^(9sZq7u{i+FoTCyfOfX$`sx(Dy}yZ#ZC3(p)+$ ztF1@oY3qsr{_x}_{tml!v_2IMvYnKAkSbH*GWOmOC==h#PguEmS+KQl$Nd_26U;5C z@EHu3mCqei1L63Cs7o+W$Y)#R%zi-ShV1efTswIQfw!XT(S`~r#03UkXG46$H+1{T6PhDQ))1oXkV+WNd2-r&<4)}2c7Oi&>0PM zCgrC?EjpGL@GCa(Io&8Tv{qk0YxM`bDv5PEI-{4w-0d_Xb?G88g*m{9quJ^gM z#>Zji_0l!*gYf$|U$5bu{w?rS&c=RoN~2yvW>AF`NvEIw;pD!AuQMcRv`BjWweL+H zL#cE$#o3$9W4oQ_)mA?UZM1y3{nX6zt!%@u&VrZQ@SkPDt8Dnsv*0y0{F*HIC>wsQ z>GT^^x6$$&bVDcl4N}E^`~-j>$NaM-;A{P1r<++=XM4PI<7|6pSFVvW9xOt#2fmRD zJKcbJ5ldlIrxX9|oDEV>M1F>HzhJoQ6b0Oo?0g!jbKHiTXzPobx_6oii0(=qjtzxQ6I?*cz@~waz)VRcH_1eL=f_(p^(*u|nvlPY% z!rlOxLiGQL|F-!MKYBgK6J3peDdC%E3g6iK&6Hz;&rv*Hq`?-0^5A*7)@Qo=ga zjU`UH(QCyYJ0;|n=f+E{1eHu%-H=me^l^#dI{=RQ-$rYuOcD7BtG%h5ZtYwo zrK7iXj({FhMDD(d5|G-GjZ<`Tqk_90Dq%T6z0AOoOJn20UgT<=!@uZWD_{NkE+Twb zBYgix%SR}}yXfaJ?z4>fI^W1;v9$iwzxImzFC0cn3C# zGmVztcGV}*EA8j8B>a#b$)TqT*?X8puVW2M+_<8z0T~Z#O%0avC<;|8~QmBLIpSx&I8%H+h@28cUt#)}itDhq52#aR) zE2y7W2en(BmA2!RL2=D?+^d87>Ws}+U%l9$j=nyquYS);8-2-+vwTL+-pt#)H(EQ- zgnIbHscc0S9Y2rSeo>ikK#>RH=`23V;w?H?*>px7lFqMfI-|1aSnc`rX3Nk0nZBf1 zT-_V}Lzgbv1^e7zH}n1*A=5|oCc5UC!Z#Dv{TrLPA788Aq@%w&HNjf`ys^D4sd>_r z0-Mf;EIRWU9YxUDZpZO-W}?96@3YNZ-^khDjtge`)tU41_bclg`*O3j_U)dBHDu7< z#N>GrEfD*b_>KK%GuQR2B6X0*qHdHFtE3ixZ}bruqtnqxyQc!>bGrE~AAtG)zHXQ? zWb_$F*u7Tn?>@xZho6TX`981L2f1Pg@W(p$g2zacQFqrO^ko;seZG+SsDYWIselj=KBjM^G|uP zANjjNNJ&t4idBY%!1H3gJ1^c05`WDu$6pO8-fx%Vkt3Kd8(xm%Sl{B`gl|h7yB{5r z0Bk^$ziP6+i+4ua<8a-`YWtf2DJIHVa*mXVugMeN<%o|DiVx9?GhTG<@609iM)WOK zf1f@oLSIk!&ibEu^$L#DeEuB1h085{(T7>T>TS7do;eeJxpWnuTHRH2N_7GBir3S4 zM@bRwHEs(Z<6zG3sfXG}U+TQ33~GIQvZx=IV@x{%(v8g-Gw#+hbJVGJ*&_60l6ikZ z&fuKlz&V!WjxQ-Xx4JLdIA3RVV9nDfZ{hQFigZ>79sA44E&RNFIJwQ2*1zc{%r9#J zG4!*^_0`ttzlWXnuY!6oNc>A{pV}a9S^~c?{EFabji>XrWbR7#&gXX}Ex(KlMSi`B z_u|vw>sdNqW@q@1QS>ZdOqWeNV(zi{%3tr!-DOPeIg-AMA^+7~a87w9(()F;m@)3bd&Kv7d=pSh@0c z#=5y(^f`mJM{lfN0W!e(^9@?SBm<1UdkdEt(k(xpuh;W63AV>WTev<~GP%0C3D#Qp zG+QSr;1-q^`iDLc7pLeBNGkYgAJG?+y$n2+zxib4#fke|ZtHj3ikTIZ+xMBhv6 zk5558p;`%ZIxnh?oCcvnSn2$U!ROZBP#xbdLZlr+4*&s}rFu|{tG)iF>V8RTSza|- zqS7R3>i~=l+t79bao9t!WDYEov6Y{_Er1?{_g9-G5A=bPp#T4~8?7C58LO+EcWsAn z&Ges}MgOtprqP+WmRshVGM_8COx3cL*LiQt(euq|fHCuKcos0J3FAAq3V9yJp6%P7_US98poUBP)W@m~Io)!uLyA5C^lFG{ zOp>ZWIswceP0DgxgIbQo$0$&d6AMw(@b7^XOqugIXMB#?^ms<^I+&9{X4ofmWi?+1N^` z6@>68x!KnQJpkV;;XMdg7Xel!V6A3YnRQL!Ha=dq>yK3zI`@?Xe2)HT7JQTqf6|5{ zUq^4_@=a2Qz62#PbXYmhr!2f!Up?Pi6XM_Z1dVz0(dq)RPQ$;`1bi-i%>GU=*Iq$; zp7CTg=Gz3LNUy$TK1$ix%P5Ke+midQ09+mSe~hQ9IWHRH? zmiY#^%+K6+XKTZ4{H(4wF=2i^j8XsN>y2)hABFY)i`7-+AqZ_^p}#;Ye>7i$`hF4G zeh0jz^$+Ib&H}WQCuu@_^p~x={e2_t$3(vA#J2g?Igpj_pSSV;3iF4jH*s5QLMejp zQG(v^i&nla;C23{C~I2Z&T>oZi|1!T21w{XnXfzcO8U21>$jcriGbtZhuio%-03Iz z%WYf+ZIa-7(fW_;;Sa2RA@eky*>K_V za1`L3SnoU3-bzyK!M^_U={i9#7U}3u;jM~F9%Elfu7_~=v~e&K^(O9aH9bu*$%84{UFpQ7({-tePP0?=MiSFr3jRxM9-aB;!v~W}&4RVGTT6(mntL3d~b|SquDo+FGw*!@A8bII1IW^jFT9P>H z>yaVq>**ot>$xH7>u*EU*PBDs*SaCT&9JJH?&WCBrAr-EpmF;!p8vMQ`=%RR|OFmL&Po<7OT_gF^9p_K=2>$d;V$XJO zJr8R&{OKFTpZ=qGd|*6(7BsTwoWgPZNt$ImH{ZK!c9?VZ?T;4ch&ZV;>0P#@KPQ z{gPvk7vsj;amhh(Eq2_TK{SuI<2nYVYq#S%{ki?2YrEAS&i6ad{(83ac`roFEc`QU ze0RXv=gzhBCP3Kic$J)QT!lDyh7pN!Md(zk2Y0fQh=Dpg^ z`zHmNdg1i$5NZ0N7Z;e0Z|8oS)}IQTd&9r8@bv=))RD*Ib{_vKu*zqBpMSJyMQ0T{ z$FmnLc%r=!$203}^Udwnp5`tktxGbo_X4>r{O)$XH&sP$l#+G36+`Mx%mE6{y~YjO z`92Y&5!K|VqYT?cTo--X4P!$O5j-)O&gOM|k1 zha+}4^3+c%B93`{^bV_zATD}xQB>5Cm3CZK+L=XG-^I8|S#h(9tp0^%X?4aW+KZxc zCT><%+-w$S(L61S=A0~=i?Y&n2%5Yc=k4I~NHY4gyHB5BuoZW-vq*RF`@<~Sr(~67 zSytTKtbA8w<$G!tzpJv+brlgu-@kQ-)%RZx6R~fLyxzG(?At~YWw;lEGJh4_q4Y-o zP(?`)7Tj^$U-s`sxvI$LAOmd*>##a$3r~kGrcl_I7$NjD>cZ~bg&g;=K=eO|14r^?9smwVx4A}U`M4aP{ z@}ZT-qDXEY{tvA*Hx6^AG3+!_dG6RW>_aPmx!jq5+@^I|xkU^AMt?YX935-pt|}+u zd&c%@w(?CpSzfPX^E%y5v!sHj;qBFC@zZio1+Lxgb2J-&Lj`Xuh4GQH`M<2P-T_~1 z!==hHvG2m!0pQDxGzDuU)5`D|74gw>GW!E1h-vgiUK? z)G7nk(;qDS#2Hnloau+JT6sjztg_}IEABlz?kqdb;%%GF+u2pQeRPi;OEpI+wcDp~I9DqaTb{Id8gwsuuneqUR- zo%KWFT6R5)cXIuQWc$UwCaH>;-O2V#;Y}s@G^^?*H;G9Vfi4Icw2>Aucyji|z8MNy z?>tD+DodLzbk6r05@OUpHq;|7_< zHT4?eSDVx*F(}S7tsYrf+!BiSUZ>G!TFk>yMY@joUCl0qM4*__i(pmf(MY8V>*jF0Ivdg6yWhMt2_%FcgWKE)jcY^Kd-a<^VWT`h~}Z0_dfeQbH8jV zyI*GQbz=Sf4$6mjX}Utod|gG$edk5T)|fEU@|vb%Plea@p8$6_oBuEI@qNBae2b$- zJi+=#d-O7&@%eb&%igfGcorG|^1Ntc4SwnI&n$WT)t%N^|0O=B4#1l`t-Z3#e9k?w z_iX&jeL=^5)+Pb(qL=ub`&=LHwD!3!%YyH<@h|sf>@HIBubtxDMn9aYjLNMoyY78dmP_`zDw-GM_10^;}Flad>5B3&WlcBwU9J<%^Lhf zm6dSxF6;Yi9qIgD>vvh-YtKk?S_VGdhNrUNr`YfX3~tF!=j^iXe!t_PFyqeEU-vur z%KCQk{qD4W;7HtON+)V+QU0>Nu}gM|a}gsX6TL6`%d&CoCR!uvj!nTcjDI!^T%V5q zXbQqZ%0$vItp?)G$2iiA7GU*%ABks+O}Gx#KN`tzvK7Po7vjB;%xizmUnn(1H8N-R zYyKwL4Xe_5@D~5-ylB5?5y1bv0kZ>YsyJHB=%yvJ+N zvR4x=A?;IM_cu|4bkjZ(l1j-~6Hkc_Vj9{$^>sg~CUpfI8Lz?%kpc`d;XdnUXfulB_eng5CTK>%7Dlo@p-ROCd(EkYaDbv1PG- z*A(1CE0RVLi8h!)kn#(G&U+)V6q_hj@YEu$2W#fogyTu+=;wulXb*;LeX7L^UCadn7McrHFJJBxRfvoaP5aqMRqdB_=?+eej^N_sG zJdV!E<4ijbm)Duc#GE{O9eG%=A39*x9`$ku%+eY8>29tYo!0+@?GEc?w1schR(!1_>Bsa4>=5C7}U0qof)s?b)ULZ(Ub4Wy3$D;=$bl<}_&IliCU>E-9zAA~C$ zW6{%Axe{)#DQC(*y*6ss6aKxl+gd+l^sD~9JLlVpPG+gB`2Ioh$FO)S?`^s9i54~v zTIoLNt1#CQn_{J%eFd9#|*`hS1@A_`3JJsL!jzY=)z@#mfu_JS>qqu zo7y1gy0)bcZF?sfdM zJxp%gjZICuwfDj71McB-Q6|1w=lWzv*E#0^{Cix~ZBnl(sw59d&Nh8U#94Hl z`)Gg84wvy_Q>` zf38xKS6mmSF|~N9dv6P|tbNmv4D-h9{ub2;sz^g(d$FegFLRI=ck%(GUkx*(-xX4q z!6DAZW2+SX0}C^GX24IJ@?}i>eUU; z-stt+3rURd<~?3PLV`T&Wzfm@YRQAxzp6F@2}7)R@R9>6D1fqtO& zB|KA>g1mCUKtQC2(*D=!;~#Q;HZQDx0;2z+&TAQj=P=u#D)}*khnSrN8KjjfnB7p7 z*&mWg3G)dM!MzNr!+0t@io#F&L-=xhk~=B9{+hiKpRk>D$|rT?BG%?j8cNwupHex2{G0%j28xQJq&$P>5Zl)A1|=hkoXfYR^-(4 z4SJ@Y*Jsx=^qi$olK351ujBChmiC2D=$LPxkw5ea|AyLO^fta|s8^T-fFayf7{Rz+ zIJt=Nw11#C+A}%H_7^Puv{ygjc7NOJt_U0Z8caSyV+hk@I!uqJ7xDdW(FU78sS`dS zAjJsyPATFh*@zy%)1Z+Nc|$Muk$Mu}M~KTFo8Av=LLZ;$Vt>N#E1Eb>hDD8{Z?2%^XU}x> z`WaVIx zkF5yTuhs}Y8mW4QKx>>9fa z@q0P9j}KVfF0r{?LgH&Iy7!X!c9-aTH$eT)#Pwj^CE+Go2<-vAP5P=9zZ4T%)dj8f zZ;HBpxH~ruApahS(9P%KJXFN=S$__a&HIk8i>UjgBF9pUBS z_$vXy$KQ{^UT>24b145biavj=W1r=bPp!N8>F6nwDKYeU`X%Aa{?XH)a(zfcZpJaJ zE(mkbrgQtE-=92#pzLs9AeqG3@)M%47Wb2gvfhe^9tvq_{6miOsRL)Tg#$eYaLo8S zYF+#-OXiWt9>{kKzsm~p#e8UgKl`dc%2AtCn4wgdp&SxR#fXf=vaaVThg5Ldi5iBXP!63T=6rRTMbt66%hUkXa_ zoq|Lcad}4eB?_m&$h2@-IJxMuaJuCOlV{w7-^OPHI9^L)yiV5PSaut`-HJ2K6cXR; zyl3zYyJuk4>+a7o=d`Mr5B35q!gy$^nYPGJtE3ZQRWfHXe*e!*HA%O0Qz4#-m`nn% z^0e1q8pb_!T+3NwM&Vv-|EjqL_piDqQ#LPOFqzu>T!>d{<4wqmXU%Pudo5kfmZ> zhx)B`?E9R#*E*|M5q9q1_U*OK1kRl0)akjH-5#AVtlexLwm7kRmP`wTL_x?sd!2iP{P);iYj0$mw^vtZ;a!e9E4bZk{MMcp zZDkatTz6Ke-D)3QPH$Z5_Rq5Rb=_QNXsmAx;}R%NxiY8at_s}k=_84Dm@iv?U4gpLRpc`mSAMks?*Ify1xOWhTJEW6 zV%pnZ`jb=cuIP>aegW!b&uMv}0=1iyE%#ScC_&QfDu(w5E0B7+#XGB|zK?v-!}pXT zcwZ3c&gntAY5mk57vxn3RXd4%I)JGJOyViy9}Jx<^6AOq6FF&SFgehxzsq3ARs3;& z?*UJTn7wai<&=3ESS%C1!#p-LqXR2*s^6sS^E~VyejN(@Oz(I`ZxDN+9wshSIGB> z=Y7uiwG5ES3uhVP22&M1$=@4&7gmln)Ur#3egE=^o1LF=S$VNYn@;?5!3>uV*3+l4 z8%Rh=&e;>Y>T~N1@V<&5$@JsZpIiNSO+~x;s|u?hOQP4_C*sTL9R1f76(C(f51};< z+sG~(_xGRkJsytR3}v39KfwB%p<_y@ssHfQyiEMAO-9fAxz7jh>%QTDDdN0w+vj|& zDyJwZ-BZzJ++C5>dAsO9zd-OPSvKe(Y|%TAhn{brlimYB@BYKmvv{uGH~1`I%06c~ zcpsR#&$@qbAN%I;xmf?#OfK~WW>Lpjl-g&Vv))%>(ZKMMeY_vR`e<2i;)Yq&p-*%9 zK5^%UjdyeD+b|})RZ(Eu0J$CFr(-)O-mYk`d#j=^I3!@@-qs361?KAnYBc83NIX4N zmvIef@o+$tfzxo41wet1btx#xyJM_c>eFZUNX+LDuLGAzuY6(E!8@~XZE6sloukGU zFW%Qt^-8kE8zfZ{P?NVYYW1W>%Is|)@r5-8Z3C`fnH6>D_m2O<8XLA(ICWX4e_`o| zzBel~W)af)1-CuwygT{rk(qmuSTE~x?toftefk&t-XXWKk9Qi~>`vn>Var|y`&pM4>!kw!g4Qgjyg z)KY}I;QbOwTvwG&Z0$k6M1y_y8A5jZ8PGxd|Hq<){omOdFUTqzZ8 z?ftx?;}%U_dx2pXXN+51Mfz2VV%kxvotCUqCHHNrqHa=E+HecA*{P+}3(Og+N*IL) zkOI5UvN@&x(9FP$#Ua&C#w`x#rJGWhW@y}E)A%UES{n5GPf?@eyZY6a`M#^U z?7Py%_pkf=UMA8+2DzmHGeZ}o8_Zy%Tbi$1Q2v($M&a|yQ>S%N(mebJ&-+4>~(aRunR zIDHq1xPM!dv4p@d*-kYNf7FBfZkSJ!)F>fk8i`GV-YKON>;tPiVhc58?NoyrW5-Q_ zUZhagi^>$gA~d>~<=GjELKyZE#Ae!lJ5$OJ%?!+#Vl4Si6c#!uSUjMuCSJ#@_Y1ov ztlw1;Zr>T?A^mLD_f%m|^Y;DxE&^KPb2Gag!eccJNeR+m7J(c+N;3?!ejH`@@X(SU zU@9qBS!M5>=i1F_K`JaI!YFUel@E#hlaOCJy0s(9_PzerK^(fj*f*YV;w83qMCEKe z>psQH`>p#6fY-94BRb8p&B^26b<%115aP4xxW)PH9w*+Mj|SmceOLa<>bqr?LCXd% zp5Fs}8P2C5L2++5)okv)M0oN$g01M!BFju8>hyopoa6uIc-sTbWwze|b{A9loJKzu zb;6G|>L0~~f9H|HH{5rzEBxQm(}W-D|3+?ze3fr}Th7Yl6Mf7C9P|=o%r%ZP#v4Z% zE@MHgeptW=8B5Z09`2b?jbC|4_A~pxb_ipaZ| ztXxO92R-9_#Ghc}i!nhC$_#%I$8w}X=+gKO_Pih>f8vCn5nsoiS7zYH%aVsvj=zeP z>tg;XhdF*nvNI%Z2a)Y_d?jqLQNtK##!z08KwgRtBPr=Ja|X;Et&&6z)^Vzk}x3tG)6ou_vyl=rR}~ z4hVa-*1U85S9Q#1dGdwj|Lwe^!Ypxi8$OVq$DaVb#W&t{2@8rAwW?JzS1`rsLR z56EDVbw01_sb`*efXyB6^+mtwxRexnGT-4r`#X$e%^}Ly`R5St*VY^o$vcOr|HT~Q z7jsC>*W4d>$m=0S*idnH@WJd*e>2P>ZlLctbL4XfJ9Fe%O!Huc~s3K6v#eqE~C`C?X+~A z8)P51?A`?OX2VqqT7lP6ZjgN-%qT2H3PSdAFX2>|23;;OuAKp8L_euU(wN3Qc`aq* z*li{s9|q4mv`iZOLtnLi2z>0yr11z}V@e*o>ym(5zQ~+*)IE9Zz{|qM zzbg-17UMb1V~^dNCtuZJJKhPme52*UEuM1i#=G+5YuSbO=J*7=_-o5Q?f{chxCacB zQ+{DOL%%dLXL(nC&F@<@yJdDxyjcG*g__-HNs4Q7moQ6Glv%?1D~w&kJ0)fdXLu+2 zL2Q`z@jzNH2biHZlPv@2fnpJfZ?Lrf{s8npWHQm{PSg)Vo4H>6lJ#0=SYGM%$gAAm zz$VQ@oBVNNlr`L5LyXc*UYQz^hBYzt#Os1tKrsl$hrE6={?-UFg6!=^c+(-x&C^Je z+C-Y9QI=&=Z;jXR#@8Eae1jpy-#3nLymjY*Q5@d^Z#V8lYx6roULVl%GFlqYf;Syf z%x%2&0AhZHm~SKI8%D6nHJdci84l{`)yt8W9{T13tvT35@&0Ca z1aN~SJEpP8MT}yg_OcNKtQVW4zYJtzGjCSCru8xS)cT@Fb*=#p17vVa4aO)%1Z|x- zDb(hpK#+nJGs;1M@8x5EJN+Ae4xHA@Iu&LSwXD+xZMj~S^|kdIiF9&WAJ&PQ#%a9- zdyTYSlDr6Gc2fa{R+Uy#Ne)TJk?|%QX$L}*$9`|n6=?TD30m$TVOFc~d${r&ZV#YT z+dpAC!Jb$MYv{{<@yAz|(BYjrd%wf2`TL?TqmGP+c|`CQFo|d-)5q}u&N|r}m;{n% z$jhy!u0-F+1M#nM&RK@?h8*$+NaKy%yL|%vS4!SDus=3?6#^xZ*P6`M@h2O-R9i>A z8up%sRWg(Nxn0^}z!}zGQKuJ1t|fFBaA${IRo+pW*pbpeZf19X44?76*lQP}&+&p8 z1xmq*1^$3hZdBOsqY>`n?~@SD-&29oO0+w^=GCA#CidgkK|MW8(O>(>&Pvn{EQfiw zf{?ZfS9z$MI^HG6yX<&Z9Pcj2yW8=u+V4$Or$b)FogfjEBdoQ&yuw4GM55)SFEO@L zcQsZ0n1pnlS2?d2@eK6>4EjJ2Q27~47SyWUGxk8R0Q)=e2EL>FuTu;GDRV`;v zO%u55%T;-$9E8@JMK+ZeL9Kv{U5@fv5i9LD9lnur#ST0C442oGuPZO|ZwQo2sq#C_ z*5dNOI$yCD`i+7-($EcTF=HAM9^1$;#KtVHja1IsUb07mI5b&R%rCwduBJ?Pot0+UE-H97xpGqsW>ke;%Mr5>!*|4_zt73ckQidy#S$Jd;&yUuW8EKHN7q2&K1W8 z)s#Ah`IfqrX?h%`sTaf_4p5jWzuj>J1EogkNZn(}x^p=zs_G7l;6uC-y~J!D{l$IrOG1|;1lSK_%Ma6S;q=x0>;S!SW@dB}AZxgXYRrCIB>YiZ7Ujb^RKtUOrg_f{S(^elDy za(-RpVXf8H(d@O_jx4(SIJTVe-25MEt>rWU@kkcLCmEmfDbF0lCbElnBT*lC?&C#OX~tg>g4X zc55tlhIu>QB#G9Tg`wMdNQD{?V)$-Jtd{$D_(3VVMIN{BDns{vbJOou&Gl zlxdle>HdDge?JnL%9-QMBcTI}HvzEbBznV?sMlxCbZd z2lrNwap2+oi&bJD7SEPY{|MI)Z^G|&2Oj#-`=!|1y;1Df;$HJ_*<6^xn~e9i;P+Fs zql9NpsOu~CgRgMlJ&kJ>Tm!@JI#Fk+*NwZ}KXBmnp}rT|-9+0~xX;0CK@(>0uik-o zv)DUMioIsMw{WLu?_W6Z@ILU*P;VaX+`#YWc$X4>f5Cg!4!rLXK4;(>?l!S^jXIe> zLYor~Jk)PPKe=n+hkJMD;F=G0*U*QC15X!wIxEHA58eaCIp}EADR$tY{D9|3xYzYE z{Ls@O?rGz`*u4%s+&6j)b#Blm5Be0qd#z~S2Y%-}@X*8kpYg6A>J8$ZTePJl`v0FC zc&o*pJKCW}FNwdyJB&;hE8~C9+D|gXJ~W=`qCM_s@q7o*lpT0@$Kxikr{5;__>UBO zT@N_$P8R$8C*hhE^%&5u2HL4dT@wf18EmhWklEr~VKM5_;JFU`e&WExJuxJca3U6Lx3C!W$1i^gVgJ_$E>352UV_TTT zLSUQ4cq~BJvN2#ufDQJ@0%WWVNU|inOeV=>vbEVdnPy+w?32kaZ6=~z4xAT?so3E=bpP`-<#Iow}5Xq ze$Y5?r+ zb5!GOThAMJFzt2!=&)+IqguNMXW0&ZsR3`zwz=5B&($-Rv*)!Q)@R?r`Yg4EnImnF z=coHW{us`Y{c`_@9>*E7U;Te^hKzUt-}9UY`huDvE5w}MV214MdNI%pnZ%qk#K7N+ z<@KBVqZmV!M;`cKGw!8-BiOi2r4NHed<(wQggcz^Thd>GuVvv#t%Nx&E{|(7g>Z%! zp~f8h@7={@47bzHZytk{?v1IQMVkBHjw26@5AWjdv*FD$)o67K42&x^&-cF5@@@75 zN7*00_1PjE zAtw!#ldn1=Yab-L98b0!Uo3+$0*(VLbb`}G;|6}aFQ-g8kIkZ`pV9q`apw7@gjp2~ zA(xyNkQ2a{68;YFXVT77vv!KJgeYoDT5P;^*cgU;A)Y{9?1gcorlq~1*`p7GH9EHz>HeVb_1Wx% zyX1UgK{LHMjkh9(X6r1KK=X?mc^c0@S81Ln-Rdpkd+WVIR_JYE$ioC5Z&* zdF4vgSed2#WSPAjzK)Z)W5qL8ZY@7qZZC87fy;reg|aP8>C>ML;Tl(smfzM^xzs6?`&H`0``C;aA^;?E;)*zyt-hcH4a@<}1v9`YQUIycShO3?@%K7Yp z=kbg)NGbG{+nB4w^Cg)gP!Vt5qT0}5lsm{@1J22oyBbGJ${n8jU8SCn!QZD`7SHEt z9^&J!{+_#sSzl=h)JYQR;*xU_XCfelDi-;~hnu0CwsHr#8c&p!JE{$|u5!pB#_iA? z_uqH_tASg4(JeSOpxgyq!*RcBE0zj%pUdUBhh{9Egk1e0ubnH(7T;w%&E);d4cDfc zQd$H4XONRW)X3!|3rC}R5)X#y?}hc z0MWMAnLB!S^Cf+m=8g8JG1#b)BzA;%AxYyUKmI;^r)Y*Vw}#eQVfEc?9;Y!qbrRaTAGdq%A` z>j`V#f5Kw3^4BJ-sUPHan~&^!ToZCxB01he&=AlL+s68=mAE@Q54DmMejg#&r(V+Ivk^M2^wv4-0blqyLrwP}3+)eoy zG>Sp^o9bZ5Kibr!zY1XaunkRV|9utirhDC`6<4(LF*n3~pW9tg-}J^eyy0*s&w6&e`?k4D8{F)cce~x&kn$xqtQQJn zYi9LsEJK%jn|si0H7ec3Z`8YcdMf;# zfFCl&MC(pJ6zfhZhVo6Gf5P{EEt(TX9#gYUsMSrtHHZ6$O>SFX>j7HfySu3gYP^TL zp)5bx;l5F@Hiew5cHbDN-pQ_5mneolx05ZnKhQkpcJKIMQ?+GuySr)B?W(@V?cRQO zZLJ&Kch}duX)WqsQ8GPWMV@&6-eqsTGautNLyRs{j6Y~<(s-<8JXX7%$M&qL#C|2@pHb;13v=F!dWss;DoHjh@itL||(;%e5`ySKS3Tik!=D8o}&+BUhO<(Bsh zXzXR0kM<$IXr+DX zABS{CP?t5hN+T};J#=Ih*8mv0(R#Ks&+i}w^nnFsr<2uIwnszTyNrBbd*21Nwk&x&j9;n|CH6U(n|p!+nre|95pjcbdZU+^(gU*YpEm zZ92f(v=p!`~NOR?iPyWgVnP%Mka7?|)dyGB8 zEc%Zu7X1;MrSb=wO#^qOw)00et9pa?BICCK8QWp zmcJzS`UoG>MVPNywRdfgW_Y(4-#GHVaMlX>@Ul8fJxd;W(X6$(P8)?5`vQQA-5MI6 zd*-&$CP>Go>Y`eu-vsd8l>W;L(m%9e`mR$+?@KB5PDmXr^&>BX)Qi*Hr_y}QIpdxF zM+QGyE5}%C>ZWtMOgbd4O-Cv)J#X*Ld!4?Sq~L{5!C#5Ekd4=XU}Xg{%@G%L_tsYy)BY8NRLb)(U*l@RXTULy z7eE>~C!IfG_p>Q^!Y=82rFb#OR@S1uts?Dx$+>1rQh)EL(}YXv?-|AYJ$Ik;neJtL zz11h);(4Wbiw9}%8#TVg^WF{k{J{Uk>a$SV&k9~WBzOg|=7(C7 z`k(rojAI)J%X#%);?-w~R}Z!3ssGUDG`+p_O{-75fwbM8_I_?4{|3^>2Azic_I?6% z{2irlt9O*7JUmt)51$qC@Q{!PV@^>X9x}+olQ*ra?~3}^Zg0{457gC{sIERU=rrMy z`uhjHc)G8kuB)D8FXRoZ;wjK+VT!@Z9ms7UL-fm)k)eyLTSRmXqZ zfKHx;mG=`J0+^TL|J^zM;^*5dj54HKHkaYMPA!(Jm5tWVp2t_ge3Dvg(%xQyH>>I{ z_<}UJpk)6Cf9J+#dgn&U;-?E}NYTlu6nVkGx z*N=&?m-Ii;J2X=N{kM!$pEbQ5V=0mP@3iUdm}-FYb49^E{SOwM z-gn@-b35SZegy5j8n-osoiF0eI&_~YAJ2b;v z6c;62-?GE_M#Y+fZ{5*scxUD=nTEG?9?2I~ylzu^-%;=;6a1eQTsOfVQ}AXJ{0|D= zVuF|1C48p|Ua#P-CU~=g?=r!=6nwV{KB(Y(Oz>k0?lHlq6}-*#uF!&A>VOyQF!o=| zb}1)!?fW zHiDLtf7k3)zU!>?8OmE`6RFz@Z zoi;U^p3~J6#Rk-{;+~Cw;A8>`6m_sZ}&38J9z(E zCdN2NQtiznb?nVI&Nv^d#5;l>tu)>*^E;rcC%gCYN_u^o{k|m9{Hw~OvsUA$Gr!s4 zWC_3`MJ=5LL*D%f!tJ3q#*vopR<oo2LlSv<1QQCpKTNQ>L~Zoo-kMK+3sIfhPofCth2oNMi0bu ziCv?YDw6sg?YKYF^=qHg0XE59^wL9(hP0mFxHQin+5g3-I#B4JP*dl^Dhlr^`7n>$ErD zNa>f_eGF$eL;7QtJ&?mj7Vb@Y@3L88tbGPx`SI`~gsUZ+F#}t^bG1`S?EVeAOupEY(u?nL4|BuD;xzpIiB{ z;7!PBcN^al`gysWb19>{g6yKdepK*(K2YY4_)Fa`SJL}YTQlA#3%>AhxjT8}L7V2Q zHoPI=aByBUX^SxG{PZM_ZOSP|;5y(sY0PuasRes}mg8?6a+agNOv0|@VKxbS?VkMI zP@i?rw_bOj+4VX1yyqb|&ZK;v?pBg%4MJLd&oHf%T@u!OXTQ3?X+quK^z=FSJmuga z$U!C42aXk@4nCLEU}JaM)Ar}v@6q0&1?(TaY>&~+f08b>A>G0$Cgwu1Ja+c*nA4heE}yb6V;#Q3REP0Xe0<6!@`H{-dFJ}|^A0|Cj5xpQ#``Uk&bdJ0*!5cu zKIg7z^i)7Mj8*=19lY1@2FH^(2~T^SD>yIvtYs|YJ$h=V#`g#$^%tLNHoiStv3@)b zfMPs{EBL&3q3nEM9oZS*b#poW8c4`DK|;RnKGXL1ATi$n8NuEQ(_gIMV`8fNJMFKs zzg_zf)cqHrkJcrTUlk z{lW@a-`{}x{-&z$R}|Fu>nn`){jyX1y%CPPw?fWS+;d94LqhK=R!E(9qde_>-l(nd8RyIRCwZkE6NlB=sX9-K5w4v%**O-iuZ#r|2WRve*~e9UjqDS`&F2E}Ur!~M9iq2bS&iiz zEl>Qw^Cy|kuuA7;rupvU67GHZIsUc^hes;qT=Iw2T(YdcXr-Kw-dvXUYJvQGv^Buz zqj_Ci0y-bfjeoK=qJOfL>#)N4*`Cw6+ zUr}l9fi&M>Nb~(7O>S>JQt1=-0sNNc#6Mh-)^E_9_}5xn*hj#p-HN`iw&r!=Ph`5z zl3Vld(eU_wQRx$RI=s6g=`6j~Lbl`w&S9EmVyE__K$E{;SnTeu%EL;FZWvM zf1WeG|GQVfQ_d&PF$16WNx1j-=eVBWd>sI|hw^K`)k<^sn76!42)Ndyy}JTeR{FF$ znxVIY){OYR2J%uuuCId27QngskDc=y@-tJVZ1Ho(w~yzmB%ho`d^%qx`Sc#hOReD3 zr-)Co{P7LSe|dxQKf9p(lK#b2=COk8Ctg;?bwf(8Z*K+*HpQx*m(<@Kg)$d)>oEF!wlirU+>wx0^sFn0zwHUA5 z4`Kfk*MusZtkJ$b=PJA8edE~eWq5zfo5$=F!U5FN_kL$rpS={?#)qR1FwgH>wD04a z?>4+2`qyE+UAxi#P?_-tz1(i&ZR4j+@6D9^U&0pb-`JIOJ{c}yjS*D8Oyl)~O$G?XyPZQ_k5a%nS9vSDG>|baqy|pOLtC#X| z9Ep@ZO`N}jINut*DB^5mmu}cU-()*SoJl$dBQ^}@eH-Bxadf2FNmh(!tPtnyw@SHqfA8QipV@+axtVyhoHHr1HCb2%&B-Y28#QIp1SRZQ=>tjt~eXL2Wk2Q() zu_nX%Sd(FWtjVxG)?`>8Yci~lA-q+rk2UeNvQ5(6F4o5|o?T*n4BfX_En6iGSc8qy z-Dxe`Cgbn2TDD90fVFG~=#A}Fl@<;$tfw`Z*3)!WrZpMX)8v?WrdrMK7Ohi76|P?4 zAYIn#R79V)&X)rE7yFH|@%O$z2>US2KdVzioOLwv7SVJtQI zca!OfeL8N(idB0Z9TC`t5%X-ryj7b54(ELkb z@3!^B7kWZlTHn{?r7-wDOSf2Sr}x=p-t-Q&ej#z+R=7@uvkPnC$AH^M^CT|IqP4ZW z&x*F%f^}DUztzRITfb>eH-)%LL?_Fv>oZiQ+@rk$H9%{yZ z;gY^@hs9to?@-~qrf_XF+;-`=+M!-9>D?46>HNbMdR_SUGW-D*-e;Pp9jTFZ_h!?a z@39&w2cIfhYdEEFpDvmYo>S?3#+1$lmCheb@5-+z`j?vCgTF)3|3o*gVcjLu*6%2K zkNuS@U(YFebNzJ+_uL}fTNUnkMRT(EDcqe!;XbHv&u=N@!zWd_?lR54eo?}`FEGv5 zeoxWA(Dc6gPZS?)rg_$1sI)zM3iI`Z!nGC6!Tw&Qvv-ei9l_?5@OIPOtkWseKhkC# zzim?VGi}X=In|v`pLoaoN_+E2Bl}7kN2lC+>;~KT*M>JbyPbSasozow;aI!`#|82<}mjGqh` z_a#M~hB2?6QFC)-du|YCLdE$-)4YKUmr-%P6yjV{Vd;%dC$AsZ6KU_&Q|9&KmxypY zy)%|CyYu@HUkx}sH{DQr=PmUmU;FC#P|`U!Sw`>KjIv1fVRw@iXIm}=@E)kUdh?L8 z9MW^2#b!-9BNXPYo}@F3F56wB_c5#OUaO__lJk5FDZ8xJl0();cCVEcz+fz>SsjIG zrM+)H^?a*+OUnDgQ!go>zxow-DEno1QeU0~tIe5!RE%>B-%z}HHR$+jr;K|Z{>jO0 z{fP4`Zrm4uUyQ*xR`}VvG|!qe+Ut+1`gwTW`uR^|9`xr>{YaU&)JmEE+o-WWbJTKq zZD9enUHc=9n@2TWYt-I%AnCoJIjwkm$q3`~DRK><9>N?UyX}L~IPl_=QGQp~DO?4x z^jUgYqZPvI&$jvK{qGLeTsLHGV=ilR{Uz@KOScWJJACQ*Qxvk!hO;GijEt}r>t2wO zFS9V44?nUi0)LIR)?8A5n2j*>C7oY`99+_Sqf<1?#P#iA$j>mXW&DUNdVJ4)6uS6! z8udl=M|PntiQlC2E7aG|lly@vmg|y!_Ce_otWiD1QI>l0J>!f6Uvq zb>fWnHgT4Gr@^+B{64Gr{jMl8+*=>3m2=cT+f`$j2Tut284ciCe(pL~E9b6%y32T9 z?i~vL^IdXWNpoTVZx(meC-o1+_oOX+Y+HV=XVFtSH zXH|8ce{Hn(dGWO|yg3%%*&AS$u14#xh6-Q}jn+qw=V6)!zeCnPXLYrjh_9ubkNwJ7 zUqdbA=cBO(O0NRsZf5R^_PuBWzHUY60y-8PGtRaW#> z)I$6HDBid#INu$+4It{q}N z2VCBN%Wlfkk6C49Uu7NTsZw$H9P+LP^Hr(x^@Exk&GSf=;MX22ch!RnIav)l=ob}f zXC!K63$~v(CG~|UTF^=T*63f7mYc>o4%!oWNsmW?7iD};;!k&BAN&HbL-FUJxoUFw z*47Br(}kz1MC^O4%=E^n6?)Aky33=4?t}g!mY_9@l_g4RrherUrn8#{OS{=lA)e4dr}vzserKl_crr1x3S z&(>);$1)0SpYL}hyAZ-0r14Yfd45CYDY828bz{)x76_}q!iKlR&kyfykH8DF zU3CY2F!I!zpw;!A*BIh1>Ho3dVl9>}m64IX?P+h#`C;q)um{4mwMRxg?MZzQIPdvR zeqDRckms~>M8h{zUU!~m^sG3eS9Kn5BP%&?Vfpt)S0GG_kQrPR-%c`9aURc6Em1Al z&U4GzT{f>n%JA2sZ36D!h&JP^^8qKMa>aZzy$@^81v`Vmp`hXwLuWZp8fhYBlN?L!EZY6y(CfDS7_@CGDwLC7r+lBnr zX&02#@;A_F9TR9nB)9d8<#h53#y-|sYm1fFgB54Q0aIzuIPY4t=Wm3w_t_tlH^PC0 z{J65k=7td6ApIF?#+^y#=rZ))V z^=5f@lf1W+yk8)B-znsM56JsLkoSWi?^}V}uJb7GA0T<(E##f+oJ_r3Ywm037Hi7+ z-l)cmZv|efH|r(YW}gf28dXoasHdcUk=~Qf+w$_<_MZX$U3B*dmf!(aZ{JEKICB1W zaG#86ZsJVxs*T?&#n-31z>mZhT=rg|-!?#Vx%B(iM%Cg%fGL|7_b0vIn{O_~ zmo%F}8vN&nA=edW`I>jSBB}Sxl^E*vPo{cp*|1*ac@=wuk9{B4kF~0@77Mq&z=pKW z--;HO4|@~%hNxHhIlkUy!CC)ih`XWklK$SY2Fgc6Wk1crSCutdz7o5n+x@hM-0yEU z##x(_aYn4I?J9l|FLJjT!VH_jRH!f^>n;fM-F3r^n8NHdq_ca&bVf~KT!t|EhG7Dx zFm;A7EgOazGli)%glXO&%q3^;IGzTISat%%w~nJ^M23%m`_sW@uo5FTxDLho_Co#P zJ#%&TKdZx*`Fd7g+DI+))cK3x4pGZI0dC$h=U?n^uP+T3L5BevDT0mwbh-#S3ecG% zXaJzIMbI&To;E?j+IumS#d-348Qq6*N-HH>1@*uvhdY3-^W z@T)V-s(;)lvW9`OsOCK@iefLfE0qqq4dcVkf z1oGBGd5@j1hrHj4)}_XCH;cP&Ah*8*PQIO1g6p*;mE#=HBIf-S^ZsM)5%^0we}ZT2 z0LIFa`Wr{V&MbhoSawyqtZDBVur-tVUyU}K`mpb*GJm1kI1l?sgPe!8nbvWB(IDr5 zOKOVdhZU|=t?|e`w7-|}P1|d553QWHuG}Q&t;=eft@%B-+a!Ftoakk~_DQ(zs4?wt zSMUlG{HTIgn#vL0q|S60)}zFpflX>nY@2azJf_0*7VU9=mI{M+NaWWc(klIz(>jEN z->KlQFv0Iu@K>7PZ&mQWFs*0YuhRW@(|+)es=U6YXno;9g?nw$y2O_h?!`snzNv68 zDZ>3w;a*yV`-#H6tO)ljg?n95UVf)=FE0xBl)}BD2xs3caj!3m)2VQ8CxHlK!#uV-?MYu_Y`zwW$=MYXy+>yU-@kMw(anBFJ z5)wD_R)v%8XaJ$v5iZqM%(tKTBW6iw|(?>)Eb*0l4##h5~l zfp%;W`!SAuhDJaxnoFu-ILhm(tKg%5F^_af-yhY*J0Hk{J_vgc^)C-%|6A%+%f9bg}Wo*CzLa6id^M2)j1w4cNR{L`NgJ+Q-aW_SmsR&Uiaj`1PJ%v`1gx!qb%yS5&R@)Kwg-QC{D{_Dmj+Vl5^s6}%*abAvT{N9K%!(As=jP>fg z`&Jw)epb}0qcX|xS8tKB z|F}9AO#3Rf@I9)vTE3rpkBa{xwWosKF5JS`S1&ma?66WzmBCo*r?#~IsTK`laA}^W zWL_Rpc{y0LhW}-S>np;2OX2#9a6eMGfg;?$D%{|XLf!kQ!W}9K_n!(kq;PUi%ngb2 z9#&@#<+;Ynt#WViEp)C?+9aDKeEP@^qfOE-;kuvpCP-a;P{NN4@9;&cRr~=J|A^__ z{h0D6dI%zsj znpN-#6Z}pEpA>CJoadDA>8TyYGk0%O{HZnByZ5R*d5h%eeue8UI{)|ymA=okpXLh^ z?(H$}r&091CiTNQve>25ZzfHz9 zT~t>)6mF&nw_D+6i|TQo%EM_>eH~KpfGKZ5mA7A+?gp5YY3OHn6t>fOi92#`hdeVY z+tiB0d2dzvS)TQMw#3auRXEwcU$ITL@AF0FeVZz8tf(J(ufi=9;Xb5ri$!sMO5x%~ z;r>qHE)<3Py233N;l8hM7mM#cP`E_#-3JQytfKn-jjFfXO!av~!By@_ zWdF5gyX?P`rv9r%!u6CXjeQE9Hp`NNUoxLbSMZDp9#QbD2_94MoC%&(@HJD}o~_Du zS?%eRWqYwI+m#(gyX@}mQoesV*YCUjH`o96`bV$7=K5=|zwY|$ufO5?8?V3V`kSx6<@#Se{@};- z#~=LQ;}3r5@drQg_=6uuvl*{&gi!z(CH{yJ3KAE|$ry6QaSPFUA%x z#sgQ=iA?-tVr3EhH)iL;+RBQ)mPr`1Q|r(##$!t=E}eoGfOHCeF_%jZr1ih~0IxlH2ffP*8+ttTO)4vb_qb~O}Vf@)mMMG~v= ztcaVyxy&^VQ%SDIa~D%f<|GjeRl8DBsKY_X>oM1BM$%Y$Y@~f=&|7O6XPc*CZ|q?!jb8j+0$p{K(l~80j&Zm;!_){ zsK+1tfYcx#Mh)U{gmal#F1~zih;4SvuMnTkLGoP0fNxZ~`5fd7!65NTU>s$y%Td(w zGjXVfY_2n&T+-Lk6&up8uPoS1Q3zA$l|(L1@(uB1)2U=Ot|yWgQu=zSo8m2X+(BZa zRWPlRX;sWp?%>I&Cu0#**NbS!sK5Q5MM7f6Z-awV2b#`N@B zP6UCJcd{zb?4$>|o@xLu2z(BdViK~tk|H(1x&geF$zTT{K#8oLSxY7%)S!;7eHD}u zG_hPts8zOmy&&0KDxHom4FbEV7t2yM(oi4h zcuB-m9!hBKKs0Kbd7v=CKuQ-PiQk z5;SqP2?>&kEQHfR{lpSUo~2#79$ZeQGBOLIh(OiZsW0)&L-5@Coq@~{9Te+i>^7o`W%JBVax`SWRM#idP}RVkP`q<3i=^?ZsFM^+iS42I zYU;9zM@AqhICB+=xkdn4iO6g`$2nG|n-~b*a4G{r6;9k9&mwIYn=40>55$7|pfuqt z38*n4O+^Vo!*cq~Z8t3^e-?7HAdB0%%b@KcQ4AcPx?2WjPAH!KEQ&(5kS@h7(C(+H58U zjSg~MpT~@VETxhZRf7>qx*1X(LWQy_%7?Mv2K^nf3*ty6$DuM*OGzYkW*5o_BNJ+& z^GYm{gLam^jq@Kh64G(aWC3|B(|7eO-2s2#^MDHUKpQ=#dq$y6UrVj&7gE$jK?b08 z>N%*_SaK-e~C@>L;`bQ$cnPB9MehBP?SSMOfhoS4!J=4hq7+`Ty zgdSwYRZO@I6kj_!I>6BZHVgc4xmo4J)c{cD6?UTF=a$C+r>1^>B(;{zQPdrxOc*Z5 zMKd@GerMjFjIHu)bS!{XGd!{|JW$YBtM;STHxmRC{>u@zuN z4t`}Hz){LN0a!pk3St!BnTao>xt7tPAzjpCI-0&KX(iEV{{^n|m2S?%QVk6X1k7i=a$Koq#Lq7v1UmSHJ zXb6%>u*b0=&;*nZjm>y$wF@e69{$cj_G1^YGJs36ySWJcT1;mpDAB05@N+SqSiXn? z<$(TF7t-p~7h+(OT!5UcV%$5SS6JZsKu58koQRH2&Q3tro;Bug39SuDmj#`ReJ?1j zg_YFeZK#8(iWa~U01XLj5CPUOT@V})*ky&`T;c=6A}vLUzCc9+8Zj?Mb+>Y z*D{gV0xCnSHXX$t#zTNuieCUdy~KQ~;ud+0Wm0R)7g42v3W;aBQb|Adaf#eDVf1*~ zAa_q2CYJ+s@r+1$v_QJ|X-S0<1hiexloo~b8D(QME^_R7TGA<$nP(I!G^MrG_%n)> zdV8SU^9(3cX&~%H+6WcKIk7C6SAM`3>_i4o;UvJ&DaBu~8Orno+R4z~ZKQl0 z_{(Qzpa)H$`XNIRd-O7;2KOS&Nzy zx-HeAJR2&SgF1>7DfTQ~po|cPLjwKE#l%WnXgsJAkZ?$tbaiSqeg(QK=u1|z@msKH z+%|+p2DECpLK+D2hsF_PVeuL;GJ{Qm%nqPjNGvbQUJvvmKo(PEDHH2a(WbzpM%$K) zGs;JTODS|rjd?ep=Fq_&Us=*q7ew>|mx*1W;h2JCAu8-k1*S=1*1&wqK;N-M0+j~q z8mdy~rJ@GQhl>lY zK}+V^XdJ~*6hFBqhb4oSg>?lo$9CcX!O$^LSB2w`H7wU~BDWe#gHpU1(Fn~Df{Z{F zKTUk07&gSGAqvy173hGQ5n&~=J}?SF+NrjIy^sg8*!0`unH2E}gGQ)Tb%ld-f#_r? zcr-ZSABVQQ>d!302%=739fn!~mAZJ_L|o{JZ2&}x8_BG#E`*^5bCE=DB_08_f+H9M z(g3f-k<#jFBA3HDs4KN#d zaZ8az{Z)xeo5Mfr#nW2+M5vM}^UOT+|~P^rEei7lhxukzXsah1jOHpE8b$^?#U z!ntcuq@9?Z=`89FDkBajDVo`fDav>3Dw%xHY=D#0j)Z1iNk9$9mu^8l&k-ZS*0;-X zlvQ8NVs&G`C}bBkA&e}OQotOjhjXLJw3nLe|ntG|QDpu7GF`qA`wBYS4wClB>Yq1W74Q zt$~LOUm!}YEMd2p!U+`{Ha1`@{F0f1D;yc<0l*ZgM4&S1%caJ{+QWe|P7(;4Je^9d zNFG;%&nRCG@bl`zfH*0JjDh|<3nG(=aUOyTg$uer2X#@Pu(LWrL4U-vAPjtj1VPoP zwu^1gL;1i5G&X8(8VN&UnH0`jgE^g`$g(kPJeXJ(@L(Z9HD?zyu{3rF;7F~kOsTAH zf=)jta%CL5*kw6)gMkHtNXqvpaE!NGq3X#5pb-NGK)NnqAPli_kz@$^CS@MT9*hi| zEDfEAIVd|276&IZ_ka#;TDjG<)GSbUNaVy{oaQQZUdJXWXOT4swzmC3l~_iXnt~o4TnL{04R7C$4fMH3X@4VvX;rFGJYNp zloe-AsA{*MrLcHWc755k1z>ez0kVIqz~snSK+{0aD9vRY@OS8m3pAaAgKa+d7c&j| zI|xgS^g<$&|gFk)X-D1(|@lU-`XIeAUT9~z^%E2rxEv%|# zkSdVO))r=Oxex;bs)d!dfY}UROUrYZwv%bC%+lJ;+FJP>l2BP5FX>Z|ia@wY(Bf}? z5!8Qd;AR0AX_2=TGzf@&E3H8;g~&tsJASjUI0onIdj%;k0Y}3$DZ&>uiCJvyW^tvL zF7$REd`9u?yIDM!h-E4s3Q)*7Tm#CkC34wTTnNG%6~<`mBGNh;^{yTmcZgM?T}j~=6R6-X+ts_|+2vbmV;1n$?ZP2IE<3bqiOWCJQ3=BP+trpUr`q9_=}8kd8AC_g`*-5qr69a zgZRhOke)e=i9`t5h#86?MHzh&AzWt$1#U)s=P+^j&Ih?8*rpsa!U2pd6At17xqx0c zgCZw`5IH4KEFm?O-w zK`JSJIqexNJ1}I9Vwl4KgC6Wl+OV~%IW1@aINgBrV^Z9y;}$*9Kq@%``sp@o%X1)v zb68z-REKlCK6&N)V*t#_Vmne_~Yku(~$RLfpcU5jHrh;Xq{_F-uz)t8VMkgSq&sn6PHn zHk`R4g=r%VS)OMH0K)Vep;3-TK3-vav4(gw!MUS{2U7_jgIm4UxA{4-AEU)Q98vE<6!!k0|H1HPPV}v=rjp0VnB?5Z zcip%+LM&J$^G{-vVyh3$F4S}ww{1ZRWe9-i2UvB7Zi)y)b6Z<6A6SEy65mfWgjrpR zFRU%oL`YqS9CFY!>1ZMYv2Qa2jl158LY$<5zAF#po7NzfdIdWM#>z=r&V<2~f}Skc zh&9AEn{je$(~u!Ur0Gu?woMHof0wBH6kB6;`{X zhFBML(+L`Gq%*0@ILW#M2`6#!TrIU3Cd85bGzC6{RgJTJg45umne7Rj(Z{OE`*5rX z{?sB)rV+!i{o?oo270&AVrp53oaQbUE&R!_}Hj~VvK4PkmPkR8E! z(+n>7SCU_@-$R^yc7PKmmX_j49cmQx1PBP)lYGDB5Vl`vW5`8lW&@ZS&9>7-G~Wn8 zn;$#){P0TZN_R=Ce$w6=^vyoPh3W zDg$+vTFc7GyBZ3C1Kl)_44TMlAh|RSqixb-tAVRvCuh0)Xe^D*gt7(hsdy%wjwMNY zadL1vc_jwyS^|{+0xeQt)^LuPClpLV@-pQr1jxKm<0bDXwF=4#7Is{+NCImW5GN-g zr_@AN&E+!0i^$L#CcKm&or|+QF(I^@Ig(Ed7!jB`ngir~s3$MBfVE6q&7@-J*wvG9 zzRWU=mOocS4nlA@RP!n{D51Q{(FdavNCHHHR=M?ie zwH)UJioMjJjt<^KP)95_XB>mRX$A9MCjjArMZeNLfXvue!uQ|U{Y zY;NuHm8;io-+0$7)4G_Y3)E;A-=?B7PnUj1PN~TrOl-ozndBI+9q4c%TogwVP zm?*%OE-$lnEyQkPRb5%=yyLk4A(o4>jxLmz$qSw~+ImSV2-qA!gMxaXHi_mBnv>aP zh$6R|hTp5JD@@zRO81T8HU#F}hjSMDuzTs`6TMsZWv^xTEz#Oo7Tutx_ARE@_A$IH z!wYS3hcG7=Vmv=|J-U0g0Hm?Kh!jL6iilE#p z|M9ql+v4qJTl2e)cUP5n4D9UeYTehqYwysltUizGY#rFw)sFSUI`hzt>q~FlwYR;q zYu^BCe1A3E zE9vR-c0qt1K=wc~Hu&Mc-Sq3D-yZtyrQiMZdw_lq(r+LA_G1Ly_~XN$9{lOWpZ)lA z0DgQJvCqqYyXn_QzdiKZOTYW+_W=DKq~AXJ#prz)Jr=FUhtc~mdLKsbqv#LfPapmu zF_owXL-b&X9t_cgA$l-G4~9Sn^&o?KkU>4YNYaZWy-3naBp7KgM%s&!A`g3zhdui- z1TwN`KZe+kA@*a4{TSi^(j7p$14wrO=?);>0i-*CbO(qIV?NLi{6}9uhU&*qIQ0cT zUi$5(Uk<^D`jKD#J%sEbWDg;sh|{`Md2!ygRL2Y>w#2>yBbr<-X5 z%mUrfo&nq%&v#nm8ZTHu$xgoO#_sI!RNf(Cc4-e!4J4`v8paarjm?AU7-a4uFk$8}6RLeVxP* zGAH@+Tt|M-QU~Agh?^jjtdySy!Y}S(gyQep>zTiG-;s0eZAajHt{p04fK?3expC^Yb4WWm6v65^KGJS+^1q*0z@P|XyuDs;yeZxdss z3gP8@%LjRhCiq5P@+K7Nra?I)U>LaYDB{FL5d{r6^U;g(CwM%Ac79Ki`-QrAe+S*4;%vyiUnFh4%jRV$QJoVrm{gD=LOML z926Vp8wSNfp%~?J^AK5ut8_sORX!*TzyY>n@X+BS^JmXR&p)>rdua#u(k*xF^|amc z?C0!ZC4-j}FbvcVG25ZNd-pOs{^CSdxp089^biL%;5VX7S(-uy@TPUaZLH)Fg|Z(K z(Le(5TXKkI$V%xG6yF)~o#S61E8}0BQ{*lgR0IjmF$e$7;p}HQx+5W)bVKJnt3R|} zo-BvjS=FKT$ce%B$PACaoV=7cI%l}ka;Os$=#2O=R!F-F-1&)f<~DhYdD3)qJZ89) zBF4E@a7G4+<=jD;>Ws{Br}fYw2mJWK^gc9#Kcg@PIfSG40mvbKF;YYX@MjEvP7DCI zPYj^*B(%IkDk}rPPCnU-xDft?kv8H(XM~&s^y?pFF8t*};E9|bY=b{Y8DLba^lgLq zxMK#AAs1iQ$a|<@$VYN+CnuD$>nM&=6N{KDu?&Az@0GGrZSuCUttNlo4I#H1P!Tn@lmVe&0g@f#*&II}zuQMg^Hc&5|7f<-{jbsPr5+h$R+I&N=CsGkB=w*ly(0gu*HmvV>o+053a$ZvA(*e;5iPl2xOghG}*@Q^UBxp{8NFfUs>S^vo zH!!A<#jZoelB^$kIu18K9R;<>d@&%45ueaS1LSh_Ia<=Ud>81eg>c-lJ_At4C zTcok&*Ky<|9Zlg!6^TC)nE)m05RS;n!Mr_S12b}+eNiocW9mZ+*S-c?2(JU>x3A?x|tR-Jj0C&sjdKWM%3CF*$13a zs5ya}lc+gWggFvw;p8pDp`29We22toWdCK%9d@?U13)l6abjX}cH%JjXRzCyIflPy zsOO%8Va}m>aLf;bQA0YxP9HLI=10gPnjht#AQclom|-w}lZo76fbg$==yDv#LWgN8 zQ|&_JOC0)P-3wY`T?(`)(WXC^r`&UM%Gtyc3{{Y@X??;gia;A;)*&4%;33mLrX6M$ zXa-ggdHe}78;U!#9~QejN)FS0jYHzGioIlgLp7#GC>J3kU+ z6^HpMHf;{6JS;JGrA+g)ztQ~pa|pN!63g&Gsn~`{qtN_D_|@T97LT>Z z{VR#(WPFL1;%Hkq4Lz?YiR%!1DX*mPSOBg}cIkS6uRw}TtT;~R0ch;JM3lJ6b>l?3 zm<3GgBO6csZ9LhWp9*Z>$F}%~!_i}tq2S!)M8rQH9Sw$}W8?m#VdnIYj0DC5A%7$g z9hn{uj+h{)rh^j^wh1BOaBw&{9*mrcjso^5V42$t56s{}+L3X8I2@hupA4{_X8d?? zCJ+q;j^cqspb3N`04R*aNHj4y5n%ep_^C+%1z0IR#K;=OVMcR+vB{C?F!M-U=;-uG z%x2(pBrq`=4MSNtW_WUPJm8h^na>I43rTivOcIXxLlGj{RZJ9#Mj+48kz@W)IB;q@FfkHfb%kWp zp&&?wD7rrs^-ly(VvR%P`p@JsLF7?zG=Q;9Oa#W6JTW=~%nGf`YL|(E!#0^{DIR`{)thxTX`da&;-c4 ze`*R+@FOrB_0RZ&82<0l#+jA{%{1!6q@yiMpf?3g9)e1QC|Ru; zb~+d-0HJ&+(D>xUQNapX@{|7X3DzJzlTZ<(A^*{Jz`@b+00(a}g2S`HDFK(_G=ak5 zUtcs;#S@WH!c}3XfCB-8Z`x2#Qz$!I4W8&&X!2zAWMDMtha9raMW`^y!^kmKUxYyU ztTjS;O0piNCWFXeI=GxqQ2;?`1E+bR8`njJj|Io_H6d}+Q*4g}g#t6d$?5QheA-?} zXyVl_g`J#%#uEYoo&XIoJrbD&=?@;A@JFUY0VTDez%1lTdBYOvww|4f5)Mgk}ES%{FL0XZ%Jp$w~L#6cv#O1{F8$thJ(VU;RPIui`cZoueGMiPoR z96b>@!;3Zp-cgxcAi{~ElTjiw$~z*bydokx5(;1#X7!JbG8_C1Kn_PoL!b(w7dgSo zz!QxG$1&m2omV()p^vtpNH0_yW#9W93T`__f_n4y~pdewWidp+u_>&5I(E={5_;}2#z)QQlg zqFA|sV+wEakAuD#huQ!}hE9Ud>IeCD!_VXhF+YUeR2Vz7(cnlBDklQ6u?g|BfQ4R} zch_N5%OIcvJ|37j8aWmQ?g;?s4BqPrnrLA3XaIORf_i`e;bZV~4Er z(I;|fhDE58u@fxXCy>!T%nnHOSP%@gEgYuu9UYwxkppCpFkGp%_{Sr`(P^~iCPN`% zE{uTOjz=T2&`lpbhAnzLB1{OhHF$=c{_$D=nJ`)i!_hwY2laLm%6@Vx5DH_bYQ>*A zVJD1A^>fre1;v-ZnEVUuHH*emi-6&yAj9E}_U6_odg zFcugyl=#CVL9}D=Ll-$po#-SGuSmZzh4T`I4l$x3!VlB8GJ$) zf|?75L8U}7j%ZImH0{9131God5GRMg9SwJ5^5iC+5j`G6B?@L;C>TD$bAU?B;zw@K zSi+>vO8t?DAB?s#_(H7&Ft-tC%fqO3WG4v{r(lubN$ftAf0lE)1R-cK;0L%m8k!8E z$_>ImBZSr~2o#|BSdu%DADAwb7xK$Gq^oN&wc53?wwlhx7cX`#;{`@txJ9swuHsqX z2k-4<%t5er;dn-&EdFU|iPNLONiy?6;RVs+Gy_1DVcW!7YS|D49Xkx3r)i**rva%C zo8m*j2Jx9usMvUXHvcqOe4Fr>4@RP7y3D|c22`cPe>xbB4u||F(Bwon44WdT6oHlK zJqn^)&0T>B>W{i1izdIf5Ku(nD+Kfu0(uJp`wIaF3bNrV@b?t>dkg&g3;c!g9W3zo z75MuFua1F$oHn@6K-(j?FwHp^$3_1IqK)3k5LOCr%$#5fEkbVSqcBF93Lk;r&JV8FzT2o^>rC!wzW$D#8z0)k+0iR?utr$>$n z5)*`Ic=={T`FP1^j|HIHEG748@jWBHbI>m4Ksx zzli7KJLSE-(6(vgPhugllE_`-IUb=6nNS2H3U|0Kwab;2aAokZ0Y~Kgm4i$Mmy8#vNxU}9mfOPoToy^N_7}7 zk#}GfcM0RcKV^YS6gZ{XEdBBdE@h1gINlYvoWb4HqnX$hEUW58-6mAzRJsjK0n zS#CtcujX)UfE`^iREdp1$wVTl<>eJ_oi><|@eD_yB3lQ{<8!ZzJC;huuPvrl7YxN) z7q5)Xb%>;*+yI692nvd0L?0W$o_GUfzBdl}uz{~bW+YLA9YM!8Q5XVpKvbL{G#^=XK}nf`?FMK#4IvG&8BuuE zVcZl>G}B-bnoj_tY+N5T9=~9U(})Y<8p=jUI=^dZMNxh^zyvUMnfCq*R_6Hl zo3>LKBf}9Xa+%i}(FBwd`#a@N;w1o?RXQUscZJfGgN9Za#oH&Q__1PRWGkuVl#vBV z#U8r9$&i_JD!rDD;C*yxD=Vl-4~0#{-ncH7XULVuW!DyRcox;j4GD|Tb&VJx-*Tdy zdP@NyPb%wXEtg9r!)pt4pR54l)snPbh?JZGh)2au`c?wRQkg3;Jb1q>J8PMFNkLI< zE{2(uvk{>hIaC$xtTTq5LiVawXUO3cFffj{5XhpNfTk8~!l<~a^T@)|=d=*XPPD=822inFZ8cyEP@+=gFu@~kplg$ilL%hw1~X8UxG)j{K0eIs9FgTs>vI0` zU4EH+jeznC1+xR(a-dtUIfKcGd+HYA@ucAelYI)wk1qjAJd#0&%+`{(B~w?DDzz>g zMw%{Lgq1!he_pyR^^lL^7H8pjhC_=VI4V-N9#V*|y*6F&*2l`?G!$S_Gx)mK1w+eGb%AFERxZ=1jO!Hy(wjFKXkJ1(s)d6OxUvu__v1kT zehPp@p{@u_ik<`cgA{Tl5}z%~x7GnR%^~#66gEiX)!_J;k~r;&S0&Mno9e)7CLUYi zn`^uD=_J1gUfs(MCLcwM;~L|;K`;d5cY?(5NgW#SkY3KBWhGCAZV@!am~H-bZxrDN zP~Cu}ZaS5^%|Bhd6tKmJHw{u+4491<67n?0TQ24BCyzD4opgl^KbRrST3~JtEh#jj zB(#E{qtJ3w%Md8qT= zJzOMp!OF@=ES;qx0)K~qOa;8bN)EVI{vX=jgu97jTNLiYJmZOZ65tR>z+giXg2Opi zL(6Vx4bcFBx4x$*TWwo6vZSklz|DGVy|uo-@%@;3W4ff3byjfp41Sgw&_XiF7~=@svk?j5V2r|cAxJ$Yw0cOX2sQ`=R}%lW86zh^G&w%Osaw=g_iHMTJsq zX9&&&o9}%z1?BCaiOis7Y%`gnwb9-YVF+l87)(tQLA=Y!(7vl7q_CkDJ^Mm)3JG0P z!S*$gBz#gbi16NHM|>Sc4UpeeB?KbzhXfNuL5!&nACz`E>V7+OytG&jLs%aT)^E z5!z&i5sUY8bO?|uHNMOR=yUQP2E&neF>~;IZIA z%PvG%P`l5}g3N0g{g8b*28!0ndF5_z(cuO)5&cuNInCAfW(2BF z8?ueiSYap1;mEB?m}qaft@a3;T&+b4P6ocsj*Xzq4p^{Ja*U6`qFta7dP^`IY#TKW z@c4Cah5j1F9ZGG%CDfF>4vdtu$Nhp4m263>2<<`YQU8MpT2~ zcMZM~1>5^#jqJC(UE-h-NVNB{>NdNMW8SU)6rC=r#f;%#H{!z>Tz3`TWCJ#Uoe?^W zxfQ1*3f}y{21BFizUz)1ZZ!3+uUrd0m_&ekvydMd{2@YDHZRvE(4dL9$tlns3148` znn*+F`;*YM=9VT(O(9~6;CbQrz;Xd+P-udmDsJeW?ZZ!W%>OxNpw(PYb$$;P7@62l{b zCYxNgaufDEnr?D+4erI&{ca*@m8|8!M4Tb}D%$KbE_Ei-;nXnt<@RLC14{Qk*s8)X z+1@)KSNq;+S{Exy9A1;hY2>bILNUYhA?LdR)$LD6G^EYaZ866f##voR$SF-B;Mw|p zlt5UpY!lV?enPn{;?T@>yqy!4(qz80)f)hdMpb3AH=+}mkMj7GY7l)tiKvMCq4p zIru%sFo}Tul+^ad`&*Jpyw+3%g9AkqYSH{D4}zTluO-5lv?Q|RMNwWTH_`JSKJ<5D zY)&ZNp-+_Ugr;xFa)~F|uzOb$s9Hj$3yj+wwki?pgg|!eM(uA-AmOET5;l2X5`RC9 z_F_9c8gLSiBLsL2$2VzV8N=khNuZW(pLz3mKY=W^>^(>#N@&CHXQT7cH`lDhJl_u_ zmZ3+l?vH0A=4bfmaO>l>sL|_plkm9g;Yi{!J(YxCOry+@UZumu^G*`l?1Cu4AUqr; zbK8MBA|-dBjSh#+y{UBE8POIS($*rJdN*QtI(;RtoNQ*WDHh+2c3+*5Fr(MWc-nl9 zQ~PO*H=%?~n7l9yiBTpmfcE)}26kEXY-|cfh~7+ul3lZd$x^+9}|k9xh%7HmbdbcZ?QZzK~lGCD{jw|%kB zNj6X(n>Q0|l}|`6-~Jr5n2!~j|JfVNK-TU8+45vEVkex~fmD>%y+o>lh;ndB2hdPD zHxp^ZFuQSif_%UuJEg(Em`f%&dVRu-PTgdZl-u( zv+8+rfQU??K5BQI1uLlD7nF}gD6{&s-$HC?L<-@eMzc7IkqQH%WX%7Ze0r4X1kK?n z1?iDPSMnstamXGqx{p-mdwT;xDCyj8ughkN&!k7a{q}agO@d(hn{)j>JsP3Ic5xUw z?kb<0Y(R=UU8>h^=Nu4+PdAq_)P}xlt}C(3muaHtpqzAdX0mE0y>Wtjjem~^BPQjPE;&% zXkNE2ra!f|g@x!Rhzn_SW0}>$TvsW~&i&}o%XpYajH%$qkoSYOW=a3ZI7c$C;9uG~ zh6Y)j^Z2)v&y!7+l5-)Gu8{6^#;X<5WoJQ!3tmwvm@g_AYK$u*CYKbjnoav|u8~iZ zAq7kim3dM9v5v-3GU=+j_QQ{+;`jv%<~mClMoT6&-wn+uoMtHMk{-!qq4c@*2j@8c zeFZ=6Q@`$<&A4v4@vh|83oZsWyyB~OSu%7a0kZJrq$t!Vq_dS$qnyjXSp5k#{A-nx z-^h@)jk^gHr81Ty?KkqC>*pl>2B!}Nc<1_1unp%_W~0G+;YTu?@Xv#ydK*7DXW%c| z0Pxa9=V-?BoD&(Zn67+)9-yWc8w1XD36@d+wT7DbHMDBry2UDF}}Ry#&!q*eECH=QRd%&`B3ErFt<3H5T>PBbf@IDrl7B1pT~* zyy~8xV_OlIGe8Xkpju3qtDB{o8j&}naIcWwz~a;@-fzyGWGoFzO7MKx|;;x}MAqLyA`TPncK=z$!%Y z>K2|fGy`4FG|@Ncejk>J?ueX)u|NiJ-%q%ZqqvijI}~xM{b1BYy93TujEwf=fdZI* zy9@vK$E18g7?!w3e_ab0X2A~WyHCTUE8#vV1gQ|7fE<^&KeZo^05nVEcvrBBIS* zGu1Ug+Jh=k8#H%z+S@40Gc<72f$svCD$p@NgS&sTg4F4e^im-Vz2S`q=4PBV*c3%s zoQ&DxJ7Fir8@iD!!BAaP~_-4BH|d_e{@s}`B|(?FiGTScXohSVcYf(;*}2p83~TM%2Z9amWO?MSl63SUS&_hlou|L%O;@95&`m z9VpR+OFusZv98kUOp(k>{TW+6%AXD!Yo?hdvG{e>`FSQ{EzBi?XH=&jlcK6#(J3e+ zM^r$H_rpx_YJ6874u`cvMdPt>gX7@sr`&@ZJA!YfAj9D-JC6xu^m_f>K@>)6cc;t4r>dkK^5?Hlf z5wf-TJW0G9y*HU&$p`a6xAAT*mbEJN+Qd@do=Ctw{>^l}N=B7nEmnftlQ5EjiurtE z%;ytgUSa%ClOp~!sm`}1;W^#qsc4nR6Gb&!H{P8{u6vRDDxO^U`gj0AquT4VTXH;@ zLdK%6GN-1~QNd;*G{)*ALSEe;A57DrCj-*X{(c5(B~>Wwcmgpc_h>RjR89B038YD# zdo!6Wb%Vj0ZILeBF2Ok~1e9?wQBT;|El)KsS*4n?lF|Fh>p6LxB|gn}w7Gm(W1 zXkxO~z3ilZRicQK2A{&~!6Jv}$%Isi3G64V<--FA!us8vLMe5dL=x)lOd3B1Ny8BA zoKSqN%rl9nYl4O$-gpoxv!V&>NL5R$O`63ag)z5oO`;|Fwuxxr0S~958+FuX#>>9e zq%tKQ6DMRU2enB{hdRdzs|@9<=$5>_Z9f7n5v;o1#9Z}*(X}L~zRyPqknqLqELyUw z^+?pjnac!0-x2_r&jdTLyqH?^3z>GS&96=xb}ZB0{Q*kT-pvKuZRlV_CgvhQ%k6D^ zkYE9@a{vhCZ*OGU-R1zLUQBU~Cu|btf<~(1VE7BaKZ%G1gQ|P&ol&j#d(aIjq1$SE zs3|JK3=oa#soGA0nQ^;gyl=Hf_Vbwvo1!vE#o`v~X^2V`Q&x8VgAti8qhP3g{0%1B zKOcyq_sU4o!cj3X1yxDJSpqmFNI!yUgOL_GZdUAyi8c*(EHJ{-JiZ|?dB0Oi>S1F8 zQmLE&UvHoGTo!P5WA$;+R_vFP8 zsb0b~K&*R+po_q1)^sZ4P+@V&!kA-;psXFP3TxT6zGlI!0lTPBX6v72AS>11Gy?H@ zEi<;(qt{Vwh%YkIq&wyDPL;R>gC;ka3}+W|gI4Ph>a>fnG!!zImr6JG|g<^FrS zIcUW#ek^1oGywFP9zynOUpdPOl|e{LbmevJtT)RM_OuffPcjPybda}i?PZ88OZxv|eNxqa)c@@GtEg&!)4RF2u$k7T!9A zGEgXh<($r@3vPuR+MQ`;Vk;@3ej#M?OEYU1?3jQFo_Ia*J1Rri87N7 zKV2_E<5rBMStc$FLY31St~0M8wngHSl|2?ZPP zH$4~->5AKcUKSrg4L6OjJb6!aabo0PYy)`%#RD(Vm-Zt?p6<|L2!N|@BM)hdJD=0! zT8Q12(I+G`FCT_8y-S7%BBL4$CRlu?-NhNV6SEhkn^CB6$rCpkb2EJaLmeQP1iu13=s&hF4$<`|soV3TXzMqAb7awS)`UWz{ zBK#{s8v%#S05d#=BZxdSE#Mc*(l)AZU3RAjlTE?c!yQpKR@Yuq0_dVjK7M`<8I{=2 zEDh+h9Kt_oGmtR@S>Vw4n=hivqVRjo_*Mzy_X|kN3}s;6V5p3qtSZH-L}SLlgzUa9 zZG|#cC<}9eLonAl0d@*@JX`WhIIQ5OvMRr8^7~wVUpU{;uPhAoO};*X5!Z{kMxpN4 zyt4nnxgRG}Lf6`hrJYvILmyEVrTAautdW}#Hs|KkkPY@A22~!k1kN$6z-?DGBUF1Kb-tA~mOLnLxa@mS!Emdfrtpm28fe@4HaVipz5JG?$N|LrEYh*Hds> zKoeQev*mgN_7~7W{PCKEDC-YJTvw1fjzByRLK*5X)R@h&pVvl-_dhT->M)TD z5aoU9o98Xu4t{`tAEBkt1fSeIz;2I1qzDBEnvDQ2p`e}!&9?_|3OGyOqF*#;1Y~DS zkkH8RX$qIRoiD)ao1N`(hfERf2m5G!ZX1zwYK2z62KWFEc=1E#1-wwJj;*nw{|jF^Eg%H&_rKKAqxxlJ~uS5p1ocVBZiT2b;uZ$$KVyS)LBNQ`g87|3$SK0FK^ z9f6GFwp+-ooBP3_nYxeV!mpKH-=rJ$psu6wpquJ#{U>D1)o%^Z{KYkj3n;@5l$_eK<$JLn!AZK&woCUSIva(BvF{< zy%i#4Tz6X%gZ4@;2ZBzQd!=n~46xa6d$MFad> zEXVKY4hbE@4^m=qA=QJfz{&QCX$HKwU=;)Q5I|Lc<&7?N$z*t{N3&2h!_fJOZ+o3_K_8Mw+gZ_eMQd)gKm=vg$PyN9bja%aZFHh`8DusMajDSBfqVV8^=q*f2k5}r$CinlS8dOrG*I)gXMvda$c&$VE(G@U34_+ z!H9LGQxFOr%u7t+@UK$eIv*8?Y@8$C9RB`_N`+sReP;3~B6O|P!zNRpa&P!5Oq#}uW{D|&XOi6&a?%yrrQ?^4l0{7kKmcdn9kX*4*Gw9f=*9!t zvqN;XscOoM>uIle_j_G7^nlhgV6jk)M%EpgLf!HH7H;NtQm7wHlLQSnUKdg_vfUlE z@%4DS(;VV*_KU_56GT*m+YKiVFz2zv#^Z-R8qwIrifbno;=V!+USY??m}O%~t5iS&Lz}u5a>J%(zTa}5=vdTdbew?GJLM$bCm572EtTqd&bhD2snukQtVW_d%fGaV4zU2;(lK$JCl-TG%wlK7 z`JaN8h%mtP!vD97?vHl*f9uTIRA~pJQ715`PI`2>$~E;)@BbS0A4#67_9x*EM=8hglaHyvz|O* zBNQq(RCiuVaCnZs%=@tgv2Kr&amu02#fZgw=Q06?<9+utdUDqyB`0Y6i$^*7ZIRqB z&-<-muY(JPxHn7z*Fu_P_wLsSXYQf(E!`ZUOrtiJ34+IX+i$}K?e&c=4kZkGbB+v6 z)gEl4H3Q4)J3(Pl#Y4{y5N`*sQYmN^ff{0ImlVwFn$l_)vz_LCKWMS_9l8vJQ8}Qq z(^>jtIVh+J-C?A38$#X$i8Si*EV4EF83s_2UaOgD4lEG|fthxA5Ej7UIZB5xlWrbi z&wn<_1QetC`FV`$=jSHX`K%nIME)xa4bbclQA~yc%a%+dEZQm1?TMyY)X{koeuJFEY=wfg-%TV91yGet*RAOmVZNP+jyN>GY7zFj zZRiq__e;P?mx*vB5De9#wMb5kw@0=QB<GYR_!(Iw#RH8QdAGE46u>3SPBArA!m1Wi@QChQfR^q%1MeLdAh z2hsPq4oF8eBPXp2;s@Q`(H_n=4zn0%Fwms0QZHfiaQ+PJIwzBCk=!*9ozq14#CO3A z!Th-*;ryVfe9wj>0TEmpL!!~>7>#BO4O#-ivJ8bV)EV^JKzMQJXAS6Ui8yxbJQ2l? zohPE-WONhR$jCjE$^cG9J-!@=j!tdMcE|abMt7*T>hS{@%2qJ?0}nN;WaaSXv(P}* z(70(muM!9+2R+=yR)9+e=G%~Ctt5i^@u*FP{pjEz26l#F1~J}uZ4&0L6!P;ZTv3gn z$e&vIx9xvX-4d2 zsWbJ380^vt&ChA&by3XA(goQ=WCM@!Iv6^a<&YoYrJm`nCsijiX5@u#ywz!Mr#`V& zq!s5sB01sBF|3_6wAl!QNN$WD#*-}VrTz#|;o@bZw27ST6|6as@9)k} zacVr%NU^3w{2`3EgF>;XeKrcvXNP!vCCgU=rsC7ch(bfI^};Qr;N`BtRKtSVkZzWa3do1|BKj>{izIYL|-NZ*Hx})p& zLrL+y<|n#q(UI|;a=$$!!Tyz0Uha8GV1wRg1})qeK>fzuL3_#Godp=PaYqhch<%97Un$KH5m( zO+f_GQbI*3nI!ZAN9+l@RxE?zUQLGlI;w>1(@k#=N#Th4duo6)QgPxifqmGEQ!ZvQ zR8S)oyoQ9;a@c`sg1dH=LO9EeLgQ#_j$7>>j0yI6_eA4*TlCI{gTL1&-yC?0ix)Ma z!~$;A6nP((dE6REco5(ol1wV6obL@V?QjhKC+u9>S2u^Xvp3s z?2iXu`lDWnBsrix#qVVic6K;oykQCk1#!z%=1b~BZ#;lSZA4Crt_m>sfO_X1N2>whjw@9TV*f~jGMY=mmHq3oAk zs}z?3AUAs!{3gK3X(1`?!N$nKE&vu0d;=-kC^=`2WGGOY+AE^)Y0fz>QWe#=jc3oE z*}+vSxN2ipE$pftch!!&YR6rLxMvM%4(E~)V7tl<96yT|m~8J>r3wNh+1Ys$Qr%3K zU1xzoT0R|hT$Z9R->cS~s|K`+0&b;ZqgHy0BBg|3bI(=Dq@2#aMMJ_QD9#C1+-lvg zp}vOey>lzhMTVA2wZ^80iZNJIx3TG_bAUZf0g^-IPf|iSibkxD<}w@3tsL5oE_wx0 z`)Is#QTDcxtEAtP-1#D+qrfA%97KjcN1!o|=iE$v16m2n!OVDNhODURX&tpH)ci> z)y{Pbg93$KG0(+;_EI?Ccdi(L(t9^2${$r|e1$*(r3NJGR;tiG0?pL(dDJbzhSr&p zC1sNL)Nfh zHZ&&gI+r!XgPF|Dlk+NJwg#M41Qn^ZV@%VG|*3Pm^8oy zP=5i%+e0Af9`Q8L`D|c1IPvmsx>m0kgH831&SRsFM%5R?V6CPGx{k!mrs||L09akA z;sN6)#j*-&4Wf*5f%9L9{Rp>7-@=1oL3TS=FVY@mAaY|d#kDQy~|y027gbatp>Le~9Z ziP?bcG;cu-5>$xb9@e9voJIz{Xa!~XT?m0N?&bSr>t7Zz@q*C+4KGl^%m6C$YNIkTb`lDtmu;5qR zgyE~3-)^`nY9oc?w^~jYWiaY?s@5uQx}X_^oBeqp`(m?1Z-8iA;rx!>~u~buZI*)@^8*LMIW*>hk8EOi~uPD^Ck*aZc0=8mt%iOI>@Ce_vyE_(7W~*xYy!%fn^e<4o(BU+cPs8omck&`M~09A z-2`^~5th=l4~?v$Fqvz}g|RFZ)Y74!6y^s#SRsEmyP)>=D-pSYo9Adc=Tv=4j& z8|05tCc_^viJ;fvgEg}#{-Pb`xj>mIhb;@Jq?++9Wml*M%nS5K0o!Dl;oLnZ5sItU zDfxH}9FV^nh8nXAd#D=Eiv@+=EWwhO#>T}GF|4|YdfTj|G;aZsI*d!8npg92DhLb) zK6KkgiBl_8VPy$b4Y8{PSS%G?PMm^JxOZNuUgZiBs9vm=-K+;^4%|M!fq!q|pAUTw zoqQx$a*pLNjfGsPo}n#XSx@0($QYqta9cxD?g4$murB#Nsmsu2nzkNZL8deAA?9%B zj@r<$BT)?n5OMmUl^6{e%+~j~>YFgA3oP-t;fL)SZn|rvvIxDS*wT^QM~6kH>7X4R ztVzZ?)!W$_1|wiQND+H@ctGHhSO=ktr7>OVlK62O4%eOL7d+7lT`#rO-j(dMQ4zVU zPLcm165xgr3KV2oM688iSU=G&P)I$=$m=1(EL#tE5n_sxB)l0%N#x-u3a*d{t9r^j zkLW^kC}q3EK{Oa)%2eD8!BvuCM@fa%7cXLwOsR{D2sTYhEQNqSx5hg=Xx;TS3@3on zQy;9f@VV6-lEIFl`K)s+M;@W@uOWD`n4^$wpz2l*FD^yvg(Q^!6PoH>uQT2cR#MKR z2)flC_Hl5aLHQ;>?2~pIklu`t?lgy}^!7({&;soB2zECZxt~Xa<`8h#;<$XLxjRfq z6ffkJW0e%F@iA-}MoDuwKzR%xNF@-!u;iEhogPr!olL>EKZ(WrbsUTlb$bGetU@Q_ z*)SXSAmH!E@zsFt#&s{HVBcXA_3@@1;FqFsD0f1g5u6|N_NmLfRzkBW3O4nY(CUhy zK4>R2nUeBWlN3m<#7NLdVgdp^qSkr|Sq_74O9XNfvLvi=QK3a zf5&H)V(@vC&{m8r4}wqa-gubM+)O~D0ELti`U#5NPw4y5|DDm07jwbZc-N3pf(G0M z))}-)d>5?cOXgW)*K|*G)dX3(W($lFMOe)q2-fb7Xmql+E(726wt$_ePsNxi%og8N z_NM(eNl@t;vRv&o1r)(x!jYgiP8LRKB?}do@izpIw%|xS!Q_^6g2c5UY$=4`M7Jzv zsd5!z01VpOR*SUw*4V0{-DZ|6y>AG{!qcptLizz+PMKd&UZr3OM#&&9(Lh88%B18f z7s-SWQ-r$oJ59(ZCIxjz5EJEbZV5piUpsQaFyiG>CA=|cx2jEic~x>eg4i65`t?C4 z6l+pBUljt9DHYKKxq=qVn`)_OSw#}K7=pu@Kw;pp+d=5`=%#=xC@n_)YnZu%HJ7o~ z9^H_uG^+h(7nel8*ZY0kht-n7JOEXZ&*lPPT_UM@N(-jWsV{8=?gTHbcY`JA~3cBt>Q>0?i^PlA-w^f~)lY(3U<;y7S7_ zlpfJ>H;+HEIb-Et%9KrEMQIk7YZ?lBq|LWz$5YdbJ=fE^CY+(Y+a8s=!B9SH0rc?s z99nJDLYAvJWyB5N5x3B^BW!zkH^!Sxd@~by3epRKF{7fWeUY{UC(dHo7(q1{@%}^m zGec3m9T-^9A7CtWQd5q;CsNfkG(%?>gTU_*isx!?-=OGgP} zZe-|H#{0OvMRS8RN*@bUy)tc)Vo#Uf4Z8v)t)shl@9NAY-?zaRNqim=XdaDfg960B zciKa=(kD+->=;yFMKs4aguM){HyT{(v`p}I1ZxpV=Eh1$5}JGXJITwc-Kh%OPhA?U zr_5yyvVE{#({S3}`n}Nk@OeZj`P>vIs)B0CGC-CT;i8FA62?~(fMF?c+maw@dB;YD zcJP$Z&fAIrU&6PCEMO51Luxa`E4Fqv*TyD+Q&j4i3h?9qQw-49ZgzHi&>VaFmdbf+ z41Lh=b-r|a`!Ejv<$Raxsb_YU-Ggn{f0IyHOj8e*r`|THF_3%Rc{3zZR|+&F@hE7` zbicj&^Aw~K|4Nbgue?5)0wN)~c-!aTY2f(01L%nqvsY*F;=m zuBOD>4I34a#n#9{Z#c}ufzz5H_hV>Mx=|a5NVO8}xt_C}LoTV1)s;6w1GI7LsB?yO zTE$Qj?bYheiWx3FuQ0UhrJ)f9)zMgBktuIO4H5Y35tP}{w<5SnJuPUnw{Avoc6UWf z$@UtqB|%w`|9TRNiyA8>;dD`xqjFJWr6imxDtCmK^;d*OdqyzgAz(i4G~jOBJwOw` z(Q}^&K;N4{Qr&Crh}F)St|dwp+U&G>51J#{!H64&mCr;{KM-*8C4EszptK z?VBbjCZT&dj-^R^BN_z;y0c}h6 zTTjr>E9X4@qOnUdvwDVuZ`}`7q%5OI1^qy!N@y&z>Rjb83Geu&bPiud-+3sqb6GHM zjpc4w;D-_|li&(`U)101795&`0Qg)dbR=ywC*P$FWi9lqf{;~I4wN!)Agd}g00l+D zh!d8a!pE9(3P8!7bc^(w1MOLiKI<%Sn<;~Zje5n0zEXk{=hatZeAgD|sE*Sy!P?2+PAhd>Wx=F?r-Qor`(I(_m%0oV-JbMHO zL@7^dnSk)1gHa|1dy(w(&PAm>ptq9cKF%{-B$;5$RH5an*>qW1-84gMR_M7EdI4pq zXP>;S&~GDK9CihM)k-y(e`xH~#o6*()~{F5$l|>Fo0o4C z(i>j3QLGm-_!dbZarrI;5@NBJ6Yg*2pPxO0Jbo*u$*$uS_0#1D*C!gmc*oL zNNt@LN=J=sC@U#0xBS6DW>VmKEw1ngQDFTm`eBYfnd|p*~dDQUSrtX;0wJwnhxr3GOEzSePaxJMX-Za_HwT` z%$MBOZs6|h1lyKs+|?-9+m_SkttiGm_RWWAh(cLhFhCf-9EMd~f-kzQ_D)ne_LTOG zb^^a(#XHBpqStrR48?SXml(@;D{u(-nNRj66nFoumg(*{+nsc)g*u*bo2wQ&?$+Zb zp(i>0xbE)vM_-a3-Ip}38jQ3Jj1)oTYC!JlYJ-4`fXbC1QII(@+*d1LH~x$@&%hR0 zHKaqB^DhMwBXa5*d`Qv>`>3)+CYZ>g++$58f()sLuoPEH z=vPiw9MBJHb2_X}A(u5o9lxxYFbU+2MTe~mp)(r%Cl<@JZ)3$%K$Wc|ukW@O?XVqJ zfYL#*@9K^qiBt4bMez|A&L{C_s6_-1#bnS^f%XRS_L1rY zpMs9QgHVdi&seefE;KepAb|qXc1Z!x6OhtCCe@?g3cmB4F{H%TLu+}vFcYH!L!n`- zL9aI&Ix8HhKj@Kl7%VH@T(774J=7E(u*oU0(wb5gA4rdobu50Z;3___@p~{QdIQq7 zf+`PC^|jr>=hpj*ZU;Ekp6ZrP^Ggb?0iaDeIPyPYBC%zw%*~-x%64ZwY=7d1AsYXZ z?;miapPKJ2o31~=O16|*mh@XzcaYq&MW8yQpu`*zU5rv~+43hUA@352FutH&we z2@_-A4P$rM+yF%8YLiE&;cJ*cnuJv4CAm>gYyff{VFDXuWOqyt=wDc;K4?ApL=UF_ zbnZ7qifC(26`JuuKbd7TP}Ze) zcSV5U&;roB0*8*lQW^wvW4t|z?!Lf4HAP!2 zB?CtyZ)*j}trPG)*ba6FjP6xUJwmerIG9?&4jO<&W&!oz2?hf;q{ZsrE6$5B3O?d( z2W_&erf9QMfhI z@3W`0U9)@mg;s3DmcKmDT6={{B#l>QRvoVLizZl$dk_$JSN1+`f#BQxD#(56{3Gui z$-i<=vaozreSC1v@&{f#Rh{#e9*wg|L9b|O)+`aQRJZkjPKcJ-#XKG=48J|c^J%{d zr#jJQPaVeY6E{!y@DNVkrqatj`g9RnX5KHJ6x(d z=Ryp6oiRcgE0ncDIVX9Qk5ry%52H({jQ;TXAYV-VIL4FVYER~VOrVSsYrb>FX-QGvs`Wg*I?sz+5+V*O_s zT`of|FzCa8o5P7$hJg$t7ViSD8Awz?Ag@&%@2ZKyD2RrvYA|F8Q?Hd8>^Tlbi-wRJ zH(&vm8T1ZDIUW7gEf5zyQ>v3&xO}BlK!0;N^z4O~Z)Y?*=Um|LO6ff*DL|)_vIXDQ zIp2utg{U*~Pdq;^tgaT`mJ%disarZ!$Ip3`|Ors}N=Z=NbUeuJI zqN*gg>1}L61A3(jUS8f87!|hU<;<(ltnZb}cpbkO5|J}Lx(T`+0_noYh)8#H-0R*( z5&hPrI8e;`b%T?aNFB_%zSYY9N1zY;|$&5uhF zM8!o9g0b|;2Nu`HxccOgiB8LMQqH1F3a>QWNL@JwEtE2_fJwe4f^<_Z$H1i;`Vx$j zzxRNZb1|_iD{l5fmWDYjt_)QSW!pRk_W=k^KX;z8GDaYbx4pHinC(wDpxD^+<9X{wVsHU~0pyoUo zgdE z)K(9n$N4F1p1ku|Z-0vfiZt$72GUJ83`GiHgH^)^mppLmQYGsee4wGUu!LI^nnv?Q z{>H~5V9>;_2~hpD4r~`zM`gl6K9Cb|4_#vjKY@rr0l!pwiwa{Vip)p+T7iBm$)gn% zyIzsinjddjL-|O)0t38~rdKmy&FKv&jRYxl9EL#=m**;Eq1RR5A0P1f7x%2FvsfvK zF54vvqCc{Vsiu5VU#iK65?!3L!<$)HM_4j&t4;2UEnAjLf@_WU`(hV=6u<~%Xs0>u z8aABZRC7Tv|1}N<7*_F7xB?B((&Y-YO$a5sD|x=i_&J2r%|H;lJW#f_`+PpcTO__z zm^Y)MNOj8jJ_Lzbd%D@_bpe3lzoqd=pLCrkAu-wE*%qfdXv(|S6CWV@s@C}~LQXbx zAb@u;e3omI1$->ptqARCZ@jWBBrN+(#zll*&v$SizHf>+tHHG42i+fB3=wQMX(<92585zfUx!e<&J46kx}iwgkm9$J*`W8q zDjIoek`+(0KiQI3r;`fQc^xSp>!6*Pn10u^;$ue{iPC;u9xDiX7Bi!>ji>Eqx7VdB z#eQ?N$M?MV4kE*=PLoFLb~VvbK6(ygMT(W_M4}|+EGG~dLs0Bttt3;$2cOVCOrYPl z<@UuNOj7>F0G0Gs6R0K)O^LD|Mq#ed62;XX@f~%w4jgQwy`%1M)Y}emNZ>xHVe^yb zyLi=`3>W1OSQ}u9zZt4K-V_Fb&H3$afQH6NxWC`)gc>xrg`!HL|8e}ie86v9Y4V-k zMnhP?j(aE|)*hyInw?<)%U58$gPmiI*p}k-$=W~{2u`|?eD6kKOAVDE(U%%dk7ak+ z4lBcd&9`@YH4a*ep`y@~L|zS%_?)mY z=#Bfj4L=77t{`p^ygUf7U?|sZqmPr)I1CrMe#Yk&)%CD(v_-2gnV?V|dxhRil@oC8mh@gSgDln0D#~hKGjwM28;dmU=9LJn=25kgmK% zGZ7^Zdph{s-hs7{b{m){QUoXB4;3b2`IU7F?`d=w_jfpqQ{;Du9TVbK1ZK6Zaj1ey6COG(0#OYqU~Mv9p1Mpp zJMoYgSB2Q@4M$qnT6mJ6lsLnU2mr;gw`H}5Mz)cWf(!J|FvBuYp%2d%DPjB>CP64A zzJ4tUs`$2`k_BVJsFZ<~>g|arHCqJ_!xoz+xu6OuEL1~x!_h&;>rJ;AcPvbs9fBa| zQpyZEokqJA4ul4pMTL!w3XaT7hACw#6dxpquPEAnpw-6~nH$miqJb9(s3nH5wSqv~ zABJv)zbuo0!-rAYL8TxdVHi+884=f_NO#E+I!l%rUSLfDv~&4!r-NF{_>>6A8=*h< z%i>w!HO!>(08Yh2)co5|1BZcrGCUH^=f_xbQ)%lT8_xVjy3DuCcq!wjKYnn&u|Rm& zMhDqyBjeWIqa87{Y*mfKq+6OJ8yV;1MrQTpv**v86C0Ve=c{YZdHz-M$wxObZ=Jb~ zOhlIM$cF1&R<`PLY(=x2&XN51(G9ocT!cR;SFYuPkD^7ylkkTm7msh`A3pmG$!r3` z%R}y7{^ifGHGp3wXTGrE<9)Z7Nqd*}>n;!%Y7naeDTz6}BO6uc*haNpfUlZ!dZXqQ z`8j4`12v<902Rd4+x^uIWUI|iy5IL&*5ZGGFzxM)yl`V3F84aZfSy_~?Q($l-w+M^ zYP=kEt_gq#r>*5GDB6$76nE|_AX;;UEpnzgz#^JDC#sw(%Ay^XrP>BsihDN&M>CXD zH)5)48_Igl(nioraLf)+GrXk3mNei7qyWQM>8)FSBNA~epg0jl8cg3zL>oGoYgj}g zQ*PjoZUiIe>;_)rh)B(4I0^E$+umVZ(r`=hun+}nZ8_DLGivgK$L!5UTw)BX2t$ANc({X+M!hV3fZq`<@as0vT7s?;&Njj#*H{S{ zdkSnOP<-7iy*E82KG-phJ%|uw7yGUSOVoQmYlw#d=LrLH;Xsi3priP1r?=JYY@!_K zF3gz>dS)^#>f2)5uQp%|YPq6!ZYsc$Legk0@@OE=GSoGqmXd9)!0etFSH;pM zh~lyTWyCI*$htR~Z9O0rRMo{z?~3!%NT6Ombiq-T6^^0kCE%Z_7wpm3aNGQtj;QVK z7zX}h@uG|>eXn6KhF))#d*yAyq!81E5?W_meqkbiSupZ37cvr5p^1anA?FbY2MG`B z^%~YHc4WCiN~-v(r2xf}Hm$rMFmsnOZ^2lRBnF~g$*maJvKDdMLdT6o%%h)>qS%w~70yLq9KG?_-;&{k%zG!qud0z&e98FQqvN0=B3v^F|f~(!%gI1y0 zf0)9G+b}h2hRguvn6l{{*?i?3hr`B4&zalIM$Qh$aDVSy=3PELM3)V--Dd^Pd-zQ^ zQ)#e$SUi#7bL|Ob7kbnEjZ~XOANB-`4mp=Zgs9-wHcKeu^se+4P7}vacn1H%k>fbq zteX)RD~!z*wwov+CD+bk79fI@GUT%%SvFF8x7VB=}VA zZ5T?-N3F)jRqiS;&cpZ$c}_55PjWNZ8aVe^{+09x$m_kn&4)>eE_+9*Rp=TfQmB8X zo;kNonB-#GRXriDTp`oXXyt=5^)|^-a92-l@&DVl20BUkifel2SX<43el_ML4;lgT zC&7AauW%BTgwVbA+@==k7axwtH`}A(Yv>$pVPjr@YO4X4LXfGVc2k3swA3D%J{qTQ zEv|;7D06Kj@@tVk{Cu=}~+Rxe`n z8mbki7Bncl%AwrQ5?EF34lWXeoVmyrDFj4rb(xgvFWavW@aHzGguRyXk^M^87%SO) zDoiB3YZlD1*Lc}N{mJ6*t=GUQ0j|!r6!3CJ1K3-VlLYGR!rbEzqX7%e&y|3kG#T*; zstw{&ec6|u(RvI}27nM!45BSXeP+~tQHSYdW29CI`e-juHdh2`Z|_A(sZXkOC!f?O zIKIYGBC2bxxod>bvS~Q7(EK6$?zwISQ(h_5@_<2a<8aF}7{lhaWsxmdWJX~VjVxXe zj6MX~VcEV5P;E=iV<1;RbJ3;EFI%vNN4BW{@SG#wBj<$osP=Ai-8t$#dWU~L0yGW( zvJl96_{VpaylgeDG&>K_2JOcJDbZcn2qmYk>4@hmuw8(O!ROXJq}&a?<0+$xo< z?0n;~{crZ;DNpF~mSmWyT1g_)%X*yt7So6Cb@t=j0;9!1Hp7m1Mdz$n%);z)Y2SPa z^+A4ft5NeKA-Gi5&~pS;Qo9^gR5e0R3}+ZjDlez`n@ktMC*VMFsg@WtXLwtq{8KN1vxlrqQJ3HgQW}SLV$>0>vY*0 zlMbPe87?ma$cE1?uL%3~9r4gvg_Rz4M!RaibJQ#S3d6qwLtAVGvr6GWO$?l@)eM{f z@o)U0<|2Ykz@-pi-r=6{s--6{U;gm(lT{cO`umv~urSZfzzZ|*gBkeINO{fper|lf zFus2#mw95JMCUVbZ{74G#OHI#Vfq zD8Yy|KyNZI+>LMn*id|3I^xxUdEk4k>7FQ^iveqBM(r&7N95UZg#x6yLFU=C5vHXG zf_>mzia^;38jR;!9tvK|ThE#hHZAEL^WGJFC@XF*{s*k3u$%{zdaddj`)wG7kYp(g-Qy~CM) z#%pO2oF%UX=K?raZ#IW}`ts~Qyqy&6`p|d+*%qdo*-$F=QFjK}PIEZ?b|u9+;3T>ezB(wsE-Q|g zloC3q4RyzP%X)B9i#jQ}Gxp#FyXbZBhNXj+GT6}z-qC2Fl4iQCAbY`Q7&6;%+%Te~ zpaBGrvgDA$GZhZ)RIrIf6hW$acq=Tj!A3xd5Xf5W+xtDGUsQ$|*|Q579#8NOApv@}d}3|NnDmt!C~rxV-~Ay_0( zO=&#*ifSRiLDkpezQUWXy6k?O5Xy*+Ac?>i_>U8`d z1WkRky&lrV-c2uuIO|paRt#=k9-h_@Nic(x-jr@cpw=VXG2#@bm1Wjvuvn?X>lyqK ztG`QpezmzA3={Ja0onx_+Y`R2Np*T~uASF@2)L%hSCDLXtM|D&`qBwtV-7Xx4(TRn z`%9`t@)9r|Q=YuEkhkf+$RwqlUk;+D>Agp;gi}r4*X!sow#ZsWpzlrZ2%uH!BHu;k zX!|lbgHn-l6MNa~lD`k&5hQb-9+K53r0KM~K?|A>CJMS+7Zbd<$Z$rgIT$p*=xgY1 zuls}^ikydxR*0d#Lv9YY16I5uGdwGpGf?INI<=SrDu!ha^U^$Z7y2tih1ZkUBG5n4 zE(Hc&TM6i+kZc+IPBps;nI7CY+lq-)8>;;j|k zI%_vk7X_pjD2xIbCnyG>oq!cKh>z2<(q$2D7+UBwYUtc!$W&_?7Zr`VXT78V&}w~{ zDuJ1&tl6PSbTw`0S#*djy1N}5A+-rb zO+gLkRr0C|ceTxCLZ#r;FPJ`hrs%@T7Cb@sV`y!dY?jcHhW#aE;fk&^7s?^Bq0~cX zO~ZMe!eIyn?Ds`_eTYv3o>*~Ve_S}&IL;7lY(0fJo7x>WVF9LPS8yX@xgifyZBl3s zeh+8HO^^MqxBT&byGwZ(!VIUpp&#swAlZ3jQTWOgHu5>s3l1b?gp?q@p1w;aRzq)? zP#7EVH!x;AGDRh}I&X$xW&8XEx(z_&Hc0LE&_E4wU}T<9cnH(iS^h#TK1o-d6k!-c z$S^9yC5>5`xgCLu{G44s!q>g<=J{#_8omTm*=Xhb#~bJPn@6?Ux^v{sGw1%BOkuEg zz#a13o2bxfiXl_t9C?$2f1Y#njrRyX-oOWi;Ood6ABy1PrR&i*K4N?V_&(xF&bc?G zI$bf~^R2UJhUgZjUUud!AR5qwm}TeKo3gv%T*to+%R+A%?IGi3O=>cZT#;9u)96u2 z)&%@aT|$6T2Qv%> znP9CuMnGEJjFMgsp_Y+EDoYK9sd92eVQs^aN@5-cuf2i48Q1~E)!OD2DpbI^qCn9? z-arIbIl)`j8+zk25w@8SnDNzKj#U9%!k+n&QtVMuJZ?+OhAJBde%Rl|icwX-d z^Upz&f3TfInfE z`}y;0Xg2`SnZ$M`f?zA7f4p^$zfBim@*a8XI%nRxZn=^6(eU)*TNI)|xp2cO$U+2& zMnRTr7<)T+&Z4@vvfMl$2E=HLbB#d0UwYrjqk$j1-xa$EX9!iVZI&v|1^hNV%@R&b z9nax68^dY%>5S`hrrFJshxU*t(=1F*uTl{FRROWt8dV;=u$(h7WclT46r!b|MEqjGIHl;?)nu+NN9es?IGFUvz8l zOO>|<`ZS@*7dbV7D(MvrD9IXBQBdZ{Pa%S;d5OM?;e{`^6s5?YOY})LS&CRmwjXi9 zR_AxlakyF~XX;dn5?Z29=NLtSvj2foW|!-8{E5#3UYVXt2>EN>MN{bbXqm75iewqkqRyhH3uTAIPuGiCH2Fe}K<1dw(-(T3uccwJIn6<|#C+uK2GDsv zG)}qzp%VOq)#xpbzIP2*%<`~vhItdhJ{pd^eGmUWLSF|#|4ABUQ6Y8smMiDC!52tg z2~S*A;w{?khnBBZ80*+%11(=mHY#$0SWFV5ISD`#Cq4lmXlM2^+kcHQ-vx%-Mx+^r z8ju!EU1D&AQ!j_mDO-|%_|6#^uu6jK6n+2p;iGe$Ot?G8{4~C& z;9s<3;#{OJHe*7s2S@#M%{k$t7w)wDW}LG=d*!CLpg9SY8tG!y`)zg2fMn8DckPEC zo%10CHXP296(rRi7iNTpW?wur5)oG$2BcUokbSx^SsJiQJcx1D=IYs6gUx>}0(Wu6 z`}k(Ml6#LfU@jU!dW$lts-=95sLt`#b0b}=RjSTa35A!`UJ+&twAz&zhByONG>WKI z5}^28bw;3Qw{1?oiAz!WEC{(JSr&-A>?6~y)+%+jcIa&si7o1)k%2+9>ZRV1uA2ya zDMnT%I8|@49Oq}C=QEXb)`gLRzi(ZHW?^t-v+$9FVT4ot2tLC5C|BTLV$qxu9j0<-BdnQwzZEFoUYFQ}kcE28k55-dg;av&0h3m!gbgkg?< zoGs^H^vReS4rw%nmcwjnZOa=5LC;L)DX~!M|^C0k=9}#~fFpVqt;Vd!n)BKBMm=Dn(^{KshOmTvKmXh%)zR$JvrIuV> z22gFOG9GlKt_G(;^TOvrd5jL22z^7f5fZMA&OvI$qnFVqeZilW4@s41&&h}X5j*=r z7{Zo>VG@Qvsua1zoFu0M<&qEBfyzgoT3Gc7=6O~yo{)&2JWBPWs@g|x z1jc^kdUE3v=p(Th_#rYT2J~riy;Q@q_z7X<7kIPxE?x0x**k?{dKo>2J|=+CqNj-h zTMPpZnIr3ju&iB*Ah8Qh=>x z1%=Um0EJpD+8paK-7Qc%p}h+l<&H9*v`1a!QLJWJ@b?0sp!C-gG#j8~=*1ZH0zP*@U^jdpAFmI!iGsEi^ zBeRzYB$kl4Zq<6fg&~@FB6(L%Mh%Jg}6%s5qtUHe^5>p6inOiul?cIY&*PZVslVsYv z=i8~Ycq=A^_ofi4vVAj|CVUE=O2*=bOm=-D*|b*B&2IO7nI9VYdCKBL zh#d5GaR#W4wo|VJ`@K;>uZEKbok0@KxEeGE+k3iHHxrQTN*%fBr3jW7?YeW{2JbZo zLCa;kUFwMFy9KiuNBn#G(o`X56^Rc$AEAZGyp6uwHVdVQGlO2U zwcQ+Qxj2*kDxz$sO;)^?@kPSy;h{NbEP~H4Xi}3pJxY7!<)7%c0OWiC!sCB|6VRe=` zrX0Y!^L&OVx%P0sJsgISp3V^IZSW0tW z!=CGVd5-wXzl}e&2 z!#sc~&J;gSp%7NEjMHMKIUkEUp(<)3O(~>Iq$w2E&ht@>0$BJ{vL$F6!86yc7-<5B zG->FnkiB=q=u2tg{a*^mIYm@Rt9G#7l6 z;dN`>Ev%tk{AJ(N0l8ZpFXGPICpJQ&&=VvVxg&EcY#m`TJbompv3Q)rF`?awN! zn{k3L4`X+hfL(VUYV@4GkFmWJ;G*&O&jZ;>dus!c=4B&^>(uC^4 z-fxsxd_?3EyQ&iG;@-d1Pplkc6D!B#eYpngo-2245{E-Yq7Kc|3(&jr-Y}l>|y>BlS@heKykScC!=A zNV?bT2eb97-r-*2qIFHL&(i%??$-+)hoTuHbeG8H_}EcyJV< z{5DS6Z|yuSw{~*9?J=IPm(gsec{ZL($a~X}yTeYug>qQ10PhEb=5l%vG|j|f`0=Qh zhXjY=3|pQ^%sdfaOF(n?ck7+zc5nNGNFJOmg7s-mSX1$lguH_fD*{dh!k z3&vRVmuZ~VA4br04QO2SgcV2~KxrPO42nW9YU1`kOz74$GV`F9fL15_2h)fu;w-_s zS2O6!q=5u&N@lFXhP*ME*t~*fB)gI@S7CwEg`}u;vl)!#Xz9~4#3^+*f)Qp;V$dRr zopg;eEeVxz^uZ!GQ|xH&(NyjqoQlcJnCM-v13Wvt-TN_u-y#M2r=~Lfa(Mp}GM#5L z#4{zy&1HCU3<~i5=*t<%tK%&_{=6DA!@v3EkZG2U{qvf7ILjhYHo0*(332+xfoBTom^nmbhIlAIo7M0$l1nG z^wntX&~f98G%=2OOzZ}9YaJDpHn$2$QVd4uotX#5bqi(c|3;(L2ko#v^HG%fcGAPU zy)WJET66fj!RJlzG8-o{8LEjk8_b0NQlrh(aJ{CUjMi(iZ}{iBvuMU)Cpu;Y5s2kq ze&<%u9^JaL5W__i8KbU~IZbx7+L_-2C5}9>ZKnfgl$&TfBcU?j*08 z6mIuZd(i7fA3Omg`dG%yT1r4i8bYA#TgK#7fD`{i%TTD%9&GB{edggy2}I@<1VW8H zh1HOLuSbt4RvHELyS!^XNQO|F`O6-ZQrF&f+EPK75gJFFMzGm zva@z`YH48fYWq=~giqY4S1zXbSwqEOUt%#i(z-JpAL*8mz}(IvqW4EIP`k_b z&EEsq+5R4BXp<(=f#M`PQe4>p$Z*6dVHY=!H+Qd^!04PCHr6!#5t$~{FGEtTrD|By z8%_8H5ia$vy*1$G3Tw=#1UyQT&Zs$r1ciT-_V$ksAmqh|&Te<6lbY+bL7)!0B3!e~ z+P~Z$;p~4oOH@)SipE@?A?Ac?Dk@x5l4K<&kea<`ki6+_nM1zCgC;k3QJP9*K6(RSx2V4_Bh`FWo{M;ENPG_-rLTg-?iYwu(Wb(^MOoFv+kZ#o((c35GY;732^P526wsTXS(w zr2Ile-%KUKr%NK6UN&H0MD=JI6>l8W&SPqVnO?6$2|k!cg$%4ZrtQVlM#-Y}cy-G( zwZ3#C?{#M)JGk|7ZJ2`x_nBc{-duDNC_`^w2PA3uzA`6U0wo#eIbf);O@#w0t86VC zP=(Oog30D45E|A5tO*yVM#ZfIMvGoF4=7=w+3wCXNKs|#;JH!kb&KOp=YZBj65ggw zEnB%W9yB|{gS)KK{DX*IOeG5bYupAFR1O9xRfOl(3RU}uL&l;_g}H3Z6zza6jcG`^H);KQ@=zM&lFNVm z#axo6Q^LbE?zoi{%(EFHpsWK68ewy%4;RDzOq)qwhGacmKU@;{iCf|T7Hm}*RQOspo5ZKkA+YGNdH#GbseCPoWiDc5IEdKr!hV5!A@M3lY2|6Vf?SZoWV5TFW992^WU07(r)XJ z>6@=(iAf}8`z$ezsY8g%5F8PDyStqL8)EZtF%qH7!u-D}CA5yX?!5V%QrpZNciSu>@0W=d6U9Fn$aGerzX#xI9UplbRFOxlP~i+$J;qDS^}H5hr_77Bj#L?h*= zuS;nXvzipq?xsi6;)WjTa4x)=k+h_&cZC-m!{|FpcE+?46%E%`c}k^cOJr?zQZh4_ zV^R`ajz_a5GCS#7()Cv&>AF*$jgXw}EGKo1Hp2N1jb-uz`1lZs9>7>bYGcgK*br|r z2h7NrJ-nnln`!iHx5<33nh;C0WAwJwg5p5H{{8EzV2z(0DizFkenJw60|(w(SKXIOj*pJUMC zHMYadv}=c;eQv!UPNzlnmzT2=hZnkX*nc=<%qe3@Q?fAF>J%<$lTO+X65%jV77x_u zrv1AqaydgBgL!>3F&+s^9o+W@nG|Jp7Fv7hzCS$*-uX>wKUP-`El5mEO_5-4ygZO7 z*&6wjS*Bx#4k0n8$A_R#dOnFzPniVKe#YE?nwi-0Svh4t5sO&tbuFD;W$$`8WqL#t znKHx_si9Z&{VcRflJ&s$H!E(4kpt&ID)Rnr3p^I8SqThFNIsWS-7Qt(okT!$g>Y97P60yH^L! z09}p;Gf~dK1&Gcr#ep2M*4#qoG1Ky83vqXGwO$#sA-R=&(W)27j5n9qCNk*XfLK*E=-B$_S@(pBN(6=;IB&pV;X8( z&kvu(l=IXi--65duCq)oCZ=qPr^cSLgPjy_%H|Y#r@8N(jc{$s&fFxNGA39CU9ImT zk*-~m|M*qWrrexOjrWU>rW2obU}GV+{%}{b{&i{9av1r+Op#}8A6l;%!hGhtnWIhF zH58klNL*oAeK7snq3HRR{Mn)6;4R19gJMiMC@B(5XW~*^>>(>BPM$}dXqLsBvRO4J zk4TljZ;$r)YIiv0x_m-J`Q!)5-eAhAZYB_3*1R|bxu}4xPPw9<97~JPuOB|H@`5pC zFF!f*`=B|%w}3E_wL>RzxKhVVBECFaWWz?{^TWjaniiHwVdMCRh@5Teh|BdZ%HhG8 z6BfE*Qw@~L-)h|VX%%v>~*3%;;Z%oaYl29>8UwNnDvXVh;8a9 z9vF)mPnhBAVWZBt-4@B(@Te;if4IT<|CxKY?lz7rU63_vW=@|z-CY+~`BrvWwqaSK zB!UD<-AK^}LGU6GBn?24?docE5=atRN@SuE2}y9DwdU+vNw|Us?r>sf z>{J7iPWhx7nA}5UX_}Pb<(6L|ANb9j6yC8rTnq{95AkJLn%!I)ro1s^?gQ$)W-GSs zWw2IiBgI%4wm{24Rlu-TvG0s5HwdMxg^%T~Tj-R=e7|iYZE&y@MX3#P&sLsvyoRkf zr>bif7|p=UNeR}|zBK?F1AGQEi{f!*4!e@(4T()_d9Lh~?J3g(q}40y1#e)>ri$F% z-kNc+j3Jl8YQ}0F!u?I!_O$$NoW;ex^ z3rhPR9|uSJ3Pgo4FUsK-G%a4srtPBEBkwOz!V!%=yJrn9J|GQXe<3_+3P%fZaQ5rqHkoX}nyqmZ!Ag zidDEJ758Q^YgYD@wA+g%vXNGNwnRoy91Ukag(}cuxE8i*1iwqQ$Bd-1)Jfq6*mMCL zChGdSN@MxP9( zon*sMOgzY-DtJ+@?(4P~mY=V506OmMnq_K-aWe4X@6yd5k1WvV5r)!WcWhRxZzx)* z!UJT5r6ZF=zG<+fD)}xzo$_74(tLkyCQ#VvqL6%FL(>9?tpas}xMfLU(0>rxI?OH- zV;+$Wh4HFK@%NEoM@rM3gT?t{6b)wzgE|4=cWsq#gTpN0wS?+y0a+4Hx%tu$10Xn?ZA07 z+dPJ?OLea~Hm9{s!?dL!ukg$&r1i0RwUr7$G*J&l{Ts)!kY7%6M@0V zE8QBG?+bcS1;-nx^alxOfUNpQ#4cMdFW73DkP=S3Ec8NiQ6|H9q@dW*Pun4s?bR%l zT!^V1KMGg=Y0nEvFMzYkoCHB9epO(bhE^+qF)P*hU8NXGQdfj4~D!jcE1m2NvgIoS91u;T$L2>yvP!_&)7(kL@D?HS0tw@k5WO`&K3QdvH_gbPkQ zeYb9nW3&2OS_F=yN!!?=R#I|zRMvLbBaOG!$RlzbSK=TmX(H3JN=#X8iDYM$$nq*o zHkR?3q-sT`r+@kHcmRpRQ1B->R;6y~G}M%D47Dp=x2*{K3$3%7e!z?_$( zSq0BGs*3q%D&k2MFl#y{T~>l;0fjCq;qb}jTHzr*qx5{qjP#WBPIcOym6w&kq-jYr z#ai9&0>nEjf2oAd1Ifs8#x?2h7Nf6PY;>!YEOV@}?=C>Rv-0OkXx3Mx8OuA;-a_Qo zczkD|KNRoORG#3n#4F;1S)$opzz6=72X{=!Q)n%og2Em!+}0-<$H^equ1MR-jeghiN&iJ zUoB3kFJ*u61V{(aC$qnBGCM0L3v-YdR;mDn6{u7VZ1`UINh@RCUd3L`3aN-q?r1rz z3fEykb6sW2+6SgK%iNAI2!mVczNsjTs&p>HgQrm-BFO@-;|Mzai(P1nX%B*EK| zH?$i zS~k8uT?P$}TXViNuHAkg*6WYl3FY;Ex*Q_OcBGo%=BgtF?{*sIu$*uF)q0V{Q*qI1G}RM*qc7XNG+T+C`|EkKsJKlT?OVGj6( zIT}mg*jxg~))F|jm%wp<2^G#9~!> zVPob$1C&3^I{q!5GaekFXx zbT=1FS9MzthwJ#M2RoYc`grJuAR9iO`Ezp~i%8pVE8tG!=o+WznA5HY_eNLADa72w zxHTu-j&X`3$`_j2raM?$CKq0k9Z~FsrM1r6Y9uMSyoqdBiuO`3p~3v_SwrUX`{1SG ziUU4nLHdoF`oqDs;Sql`hK)R~3wk}JlYB#)`;xrYFe^!0ttysK{I+*xC|?_FV*%{u z0@$quu-gk@?`wOW7OU+W8S=tUuHs~D81*u7vd1wy53GT_h{M@9J6CTt3`ik)gWGXM zk`4!_Z?q0m8Ca{zWq@p@`biaBeskqk1-RB^p8EJ~9^DL*DV67n|g=t#`LlA>@mZsP*Ot(@zw#0EIll7X5s@SZ0I!MgB&RtN?7G~s@ z5KosvroGwMg>8Wh6`mTs@Xl;zFMK7+%>~+sgpzpS+f^AaLT^s?WWkjVPpi@tZ703c z!;ysE=hZR zvIyZ~`Pp1{em1pxZv;3UEb{^ExDrq{)+~u>Q|mjiV6yLDBA$PwIn?UR<2V%S$=J@o zC9*XX_YzcNL+{3jOuMDem6Lx+jKiOnNiN!7PnSkrwU*8!9Hqf0*G}e>x@IM|A7=i{ zXFL49TZ}@xSy4kk7NVKOP5128Hmde8DV=taP(wz4(LIb$DslAV*FN6Ix>Fr)HBl;q z?WZpS3@N3JE$yPY9{Z3}w|}lqavrf^{vswf-94WS1y9Dmzdv$nrc^G!hYOV7Bd+{< z)k)4H<`gcL+mFj9U9`L&RWC2W>^)kX1e>YVEEcKp+*uM6E#iafbeyh!T$yD7Y-52+ z-sCFzcyW?N>t<70HwtMx5 z^RzTa)n;?m!F&FH-ZY#v^G`U6q@FSx^4=Roq4gHZde1e zn9(<_Ac~;#NDk@6e4qJkoshV%Mp_yq8p;Lyp9J--sbX-ICC?-L>oACd=_sF@?%AQa zzmfiVosY2#;TzVum*N!@SS=db8o@qs#=h{Ad_m==6}ZetZts?|6> z>Uo+Xs{z>yEH*u}+Q@rF57BZeG%s9eRNoJV!C{ZFOyFAKezTxB43cTeNX{yf z2ydI=b({q0Xsqb!u6)^B&7}&}IrRbUD)ZvIY*crDnpqW7@C?Ys=vQw3l?oSrlOjE- z3NObpy=_aSQ$w0mc2>TW!SE?`eAPk6o5=4!6-1!W%u;KryTAk~MfnLb{Jl}Av!NkA zpPJ!7fiKYiV9In{iAr`U)uK%F$)3XO5}EqXcKRX+-5cUsNc% z?oGU8>f;>Bdy-6YXXU@zit;s{_*eCpzW2Jz?qRS~K%J|vQ?M%IMlqu!!Nt|WO`K5&Jy zGTn6r3T4}LMVHHX-H~Ev<#Q$C!V8j>KWSg<#xr=oySloku#|I|{^3r)r@U2>$i;Cu zt-=2_$}<<*(P%p&MQ>LH!c}WgT_-Eb(nh#$0?ebq2pP-4FaD4uvF(VU34Ni5>2wy! zbY|_`vJ_Ozk|mP6cTj7)Lz>&AEkNdcQH^h3BThek_ zZB~lHbU0IYf_^aescj&gTwuemIT*m&{$&6T0CpZP+b<${hvulv(b`=)t77MWMNUlk z^YRF@1!PtLKfWh!#iqq-%(;7cy9%koqiuqr3WXBtSH((S?p7oWI|?j z179>)j6w5V-2Q~Ug%Z(!CXDC#t>LrF=fR7B5$3DWJGKlm@GVQQV(N+|kNjymOZ)>r z^#}RIk($Q6xr`6K_}5MGO0#QABSqh`L@Q?R5=nOD*M_A$w=3sJ2|4xV@hm-wu0o_lvnyRB4>bqY z+=)p0f4Us97aJSP;{bU;hQCtAbWw6CCZS4stXt_dR@up-hBJk0vd67LqQ@Cenu2u?1;mZ{~JQ8$b(-xiYLn=}{v88}Jnnkek_?#VFXLA?8CFFOuNOCeW zj@s`g2w`JRiUhjRL6qc1hZ9Q(OiJV#%=FlS0~NiQiRYsmBJbF1mWvoxef~VCkq~sQ*qT;rwL~4db^b z(bP|;xt6)9gk6B6kVf}YxQcVRzIO@!N4&&qE85V_V+2uM<0FDW8v0oV?pq7P@4PIY zIN`Y8rlHOPPHck%?0MiW~?q4G50Zgl?+>oz918`UqXu%oGsbKB1XV^n)mc z_3M3a@cKG|t9=PVJ-WT{!*~#+bJ&OdS~xOScq5EVJx9K57|@YEbtKhs)!n#sW~UUu z8FuQ?5Xzn}(Cnwl^}zwD5tM8c(c3oYqy0*-<5m&&$OZ;GPRkj+ZwalG)2F2md}sx` zlw{Nz*{D=Hq?;F^J2p@@!!LsOY`|z{IvtI@FpS?;Dq^C1PNE^)kQ>83p-mfDF|C>f zNH+z`rO3d2&q6ZmJX(d2i3>*VO$z|{YQD9Q!+XzH?F4adZ4!UFuNw(CIl%+rh-ld5 zn+;)W7P71{gN1R|LEf$oxz?^*I3|GTD!87}V|qnB&Aqc7`V^dpNj#7Bq%WOG^AS}` z{DU(wvKaN0XU>#*z71DC^N>=4;40ABbP62qxZi0}N65^Ya39M3K5mgO{Jttdwp-yz zWd`-eXB#+wFweB?W1wQ)*feu9(B!)eZrf7m=CY+4GwCF;c1%O4q9{#`UQ%p3E8l1# zc-{vp)kdsgC$?!Pwq>ddB6a{b_?e2Ah=TKx#I9MlkmjB4CWDF~I&MoxoLrf|7RWmKQT3-9F&}2PW=R*)U_$ip7+Kd;%(2h4by;LM3^j6Dvvk2 z$xGs~1s?xJL&4!rLbs`YZN}>SvP3A!-Ll08XfQA>G?+Ool&F?~_jnvtrxCSrt2$Ax zk5{cpOvZbm(9P{Ov5OEPMdS)rZ&h3*@x)Kkc{3ts7jrk+t138VXv$xc;47(@U{CPN z_mjZR%CHJCovLdx-kHCcczK_G@m^BV?TXa!KHaDDcOCQdYRo3upQ_O2ZUY_lpQ}*w zZUr5AuL`+|bgKfX$+Z;J6GJ)%dbF} zUu09yzbv1dw_*OgeEQrZ`M2eh3$Bar7v$GjUUm$I%^7wi%xL=eDm-E!K-nwqB*(wK z*A#T7*h2hyi@JP22?(t!SaKR9h^8>nV$E-V;iPo45L*sXO#k`zj|NvnfbSX z4sl8+3x)CbNQzef;C&^A_k0^^m2V6?m zD>G+pu(ve!tOM%S1szFuR{W||gct`%mvBf$H-?6LmpZ{^fn7kt>nrqV&46T9y>pN;_Ht3$~}8 zE=t5{fl8TTK5X9kakUg8#aqrp;l0mvND}`0Od@ZX?PVlWu{9KF=+s8NDZ<0cCvdIL zp*Ky>XDOU%ff$82DCr~)$@YyW_5{5UG9bcj(kBTk2zG1;;`sG!(uX4!BKWZd_`*v^ zJc`xAca^cU==UlUkge2@D&P;|Xr|im`xZvpwBDShG1)wBh}f@^Z-w4?!j9i555B6< z54GO$~xZ(sqT>KJm~Imal?8 z&>~Uqi&6+G2PaW!fcSk+eJzL)*f4#f0%&O5vt$~xC3eW%Lu+BOQj_mj+_6S><_BKt z_53sk-?jzYq;nXAID_1eRv6&Z!?!HK3O!9FA@Z!BkgcpW#qQLWEgm0-R*-yWOTz!) z`|`nJ1a!=5Eyh9yt_O}J+0Kn^TcEhN*cv8oqTO_dDa;`$2ydq?e&LQS90nlt;F?`l z0vUc(6|CdGJRp)c}>nnQXj0uIc4 z06P`&>Ycr2u(&<=t^!VaQ_G2o zt8$*?i4#c)e$NH2HyTRf)LeANZ0e`HC5#YuVABQ3ny0Qscl~KRO9p;n%Bw4P=5P}N zK!_nqn~T87i+YJl!~^`Xt%4->Q_4??Wfk6=TG%B5D8kbAj<&Q zOH^>T;$Quk++)&;qc=V|aQfJh2=cLy#wBI+MK#s{2m|bU_9CBpoD8nRGC*O|?>mtk z1XGw!pkIEHFC=~M#*ui}WFne-%N{#1h|Wm2)Zxz%9-9u^D;dN&$-|0R!>Ck7lADVp zxj%5@$)AM0d+&G&EX1BUTmlmu{ybR<55D^Mo(q-Y#yTcG@dkz&W$$e;@r7lgb(3`0 zze2*Jyl*=q8qSDKXT+8>V%r&U-x=}18S&7dGRlbai2cqw-I^1FUd_UA%h@q_>Lflh z8&m}j=!r54hiu@`fJ@+L$T+@p;gAtLu_uthSFPdtaaok5lU{oO^_bqZ20XoVp{D`< z-2e^!OrJ$o6&LXJ-@sPK@&yP7>4x4HP>{||idAcn)Nk+rUtLE|55gV+Wcf@&Z+I-PhZkHS=hoJTnPzvND+2R7h5MeS++BCzjWN>!jlF6aHq zC@-zFf(-ltw+BhpenFNjV)ormxC)*-Ze1#E!%8riWU0shfUlK3t2;FC8tZ9>At zz`Ks%*?7!N6~1>vXY)Vp0)mc#Ke3dP9JrD6;}~fKI*-j+)|^;eYcQWu_xv;q8A}cu zJ*dW{>l`7Pufi@R;yr_=ZY|qzkll2U-ExrKmM+Q3W$|yKQx!{qW?Z8pZnGk8OByWH zj607m5`W?)K3g`;mFZRmK8M_sQ9ZkiZ^stb8u^3Q{t%AqWqyrYmSCw>z)2niUKn4a ztOX&~sWl5}T_c>($ddVpVwTO#i!Gxp(>1lT;Chsj5q;Gf<&r{niQK8j=e+QgKI;G^Huc2c9uz4;TubI(!FUG9Ev8f?ntH^ zcQXVXBiAh@57Cr)jQ4sU8WB*UiJU=K%5Q@Z>|;ben9)Oot0rL@eoQ+7EXuOq zR5{kw83luBofTi5O;a;HbYhPycvWlU zSCEh}L(;7PmQ;!kf|%!n&``QE|q0lI0QH5`>EJ#1Gu9WWh(<$5l zGJ@Ttq>7bet_rZWq38fAfE$0q8Q_{Bd0=y;IDPWN%%AzXmRCmhP}N`5+Rb(mGuw5obASID!CE zv%u(dMlMAOzgCLobtbn33PQE~de^KJA5_CBY-%%*ev?&pJ6;fxpKjSL<1DjV1{&*> z?_;+uq$uH+YSAFX>sNBqL=dULADSUWkkfT9L6GL~E2H#|MbeZ^S~A!U%B+=(I1C1J zg%adMVP3{{>zakQVsyb$5Hk~*S^+ZK2!Qxo?`Z%L*l7KcKh7=cHKjP3K1V|@j3b}V z&%Roo{LY1G8nu!)q2bJ-@cQx?d^C=^A?Y7OvS|i}w1PYGffF74px%UgEu*f0cVH6x{#)4u9TCkeFB@@qJ*m7F^zCDP9I(`$s_EkBCuAbJ9LHax8{UZxR?s^Sx3*i-(3fo zRT1E^Cf7mV+99l}mX_?HH$da}+^U!IEx{n(n_UV@W8F%ePe58_ENbB8G_!wk5p5{; ze5&O0jm%)d#$ZBoLZ3 z-k6EHC3H{4Fl!{q)T&`gSwnO_@gpdMt1y0>9|Uz~p$tSN!IweF>@UosSYfx|z{R52 z-=cwIm}HH8*O5ou)AYD9T44>Uu?7{J0hlJ*vzN|);&6;aFCA9FOA7dbJ&)MS9X>$1 z2V>tJuXH!8T637S66|1ZjpBIfC*UCo6=B}=7}-M>-t(X;83bMl-_V;@zN^ZDy~v5V z-bw@q{*^ZiQ-*K4;*U{v#Yr&mLK6O6vD~bqIFHCr_A+k)$F5Wta6#fUC7GJzrL(>_ zeQh=kicID)i$kzp?+R(SLpI$ZThiz!T8QLXHYa)H$i;NRRB=v113ihNJPv5x4Qx;e z?sa+A8+ukh2J614i72LBC#%Eae z<97ywRuK1x`G@>$g%Xa>(jq7OP)PhY|ByjX;GHZE*k;%?fF_rRjRE6b*;Sq@jzjDr~p`UTi$D)Gc{G)D5DfZKEc|>=a#-!ZSQNn(fcfxM)yZ zynJq?d~1i$&nD=t4TosD=Vx(TnrVtg5X1QsC4pWZZ-AyCG|N=oi6F|;o$`94mrh~u zsam?QYqG{=kcK;C(;c$q4%v2x+;@jOaECn9D+U>aggYja-G`3YPRyps`;N#L6OT1& zT|7A*hrZj9mBW6Jf}2k_Az)?>>zgg{`7BMYOMqI=j zZsMD!k`~38EzUxPC^jZ2(B;inIMio|uLne<$-tkaioFx|jQu3IM%8i}!zEg1s%7e_ zCPMuxPZ1Bl$?@PgIVMq=zITA*ze{&(edo$RT3Y@EO;-YZkxEu4v11;P0zjG{Kgn0^ z?${HUi<}F*cZ53aGv7y+dcMNGY7N)--t$SAO$rwl~jh* zPs=&M-F_Q3D(V_$mmYLu%OKXW4F}mx2iYwL*=+~e`}$5N$Y%45O-ID;>Ym;wCk6Fi z978qjIpRQL6Ln4W&u(QreCoa}8ha@~>!IQ5JTV{MmvIOaJenOcyPPU^TN_#UABRB{ zOhNo&MN60N-4Fb! zL-!~cyxVR#He))mg~3WTT&aoOXxJ(*UhlMPPX*le&igUT;0zM4!r8o|i0{_r>;uEUF3OWJd8T1#$OOKw|B-nW)~U@iI3TJn+JEaN0) zTLrrQ74h8YO(Tw_a66LT@hIR*S0L$!1p(WeT_f{cjHkY72Ns9w4OfufB;g_WPri`# zvv&R_CT*@pUgC?#ij;8~H4s#W@U-tGNTM9h@7$3tdsf{4$c|_Cs}M3DiPBqAcVpEX zD#Wl7r#L$Q32G1EXZ45WwV#d3$cEl<)gbw`i&ixXakkR0O7hDb*1pKPSM6{Xf<1xF zRVbJ4(peSZ0$n*Pmzt@GKU#(-`WTyui!ePzA3 zK{^=a!9pL{%JxUI@g?cJc&2d65~$bAIAjA|XMbRl8`2F(tek8%xygX~5{27g==rnE zrmq>~iDtNMkjmx?`YHm^{(RyOn@Qr$^=@mr_XcXxMyz2cwyE#0OpKj;&yOhEoI)*- zh36>4_9E#1CscMM5H>w5smQgx&&tP$2c^~_C_FS1oY zH7cPtE1|Y3p|f78 z^Rt#TdZS1|Lho+1ItZwsAlHw@lk9$#hBJp7=J^Q;=(X>R!NEUFmyFwRaQ7H}SB-%M zE!UfpY686rpb)B#t+(l;Wm{oc?7iF$O3}1-GK!;l{Q~{pKSRc$pHR*D5hwL7t;6{b zvU2%>_~JMnqc8eGe8|qnhrxA30`>nvCa|;eC-E^@=y)?okH-J~M*BXC9`T_>%tvkH zkA>&3*I~fY{#bkoo|X$QfXsefeuGP;)=y^90F7BqIh+>Vr{y;z}(#zrKWH}d!2}^!-XHgoA z{q{T9>x9$%V?i!O4f1l9`k3T%@g=>o5tU^Uz_sAN6JMXg)fXR#&rm}|8U93kh)OV- z`glUYwXxzWUPTn&<@VWtoDZlYJHL*PwqfHKM;{cTWvLnBX?=eN;|2gW?Eq+oFz`dH zNA`GoLJi{X%!Cl{+07q9s7DUIk8Eb&i)cxFE)zM4Qu?}3zIeX&!V4idZJ~~S1SOZZ zA9dKoPgF9zsn5O2{CTpgGe6fMctx&@xVT!B!n0z$$%^}%OnyIA%9g%f8m{p}QHD1B z67OL=m`xAq{qzm-9W~Pq{1p4yVFy_}gS)`IiENUnz?6)=`+5XhGcMu&q{WrK_$cwn z6>eXM&*@x;Qy@1*foJ}_HA0GVfK(ssH$%T+slAkef*c>sp1p6sK^;W88Bvsg+9AUd zofv;47cAwKUTe<6Ptpicf?Gl(S8CRx7_SQPYts7uSbmrz)+8^%n<|f(#;doYyuvB* zksMHJ*qsd>ZjaB)UTxg=&#A{8a9aw%8n3uT=}W07 z>UJ`h2rt4;Qiycl%4Or|y6{c%4=-$$`JgORQZ{6hG~6OFV|&i-l_d`R%h@$*auaCz zLq0mJw6usg>autqlZ$>+7A0q>MCaojl~~71u7gMv{#YSg8pm<2=~+ri@fE|}mNW)) zUzG+Tc+pRMpY5rFu`7%(y^v%yua6BQ?gHtR#Ct2-IH-b<{Sl-g4V8nX1W0;R@f7Qh zB~IEKzR-h93WuH~$W_@NWbaEO2d@iC?T@^aul9YW5iRKnk5_bcLG4lH-n9l~>zDjP z>7K_8S5AIQkO^`I_ckFbQOpP18P{~@0eh8PcSDTN_CgdmS}oA*y3=&?qp}TWbg8=- zFuDD{ZjEDJ{4Hw)Yvz!@V%ubHM~n#l1nz2tDfc7}iwAIvfN(PMIJf1NQZVz7W`E_) z^eZE(r0pd#c&7cWQH=Uzlx1+>%gaES0a5IZN{k%q6NPW9gfF~wWLX8+jN}SRDJVK} zN+WX+O=co7I#`G1@F(ExjRz9|8v;de@z z1LHqS{iD)b8s+Ab;)^_D)(z<^J~~$Eo5W~U_=Ew5sO=OfP-x#&V3thdMBSR&=>KG1 zC;6s4@Y2oFD?F_QZyM+A=QmbK<@oaxg@$Q|#1^u0N})tbS_28ERU`k9GvQN7eUtaR zze{+5_etiX>L2A&WbvY;TllanDtoUiDyb*fF{Jp+<2VU^f!)U;QAmnLFT~8MN#Bx< zlQ05+Cg$hoMJayjC^?y4_}0&LvXZO{?d^u_t#DTN6Pbh}mzpSDrCdU=-29A1sW7 zC-Rr#c?XOA&ULM@WRvqB)d0yLokb-p^%&{?*0K~?Mi*6dITaQ)>kGx340^XH(DyEn z<0))-fkOy|id|Jn(*p|-_ldbpZ)jwR3+!Wsgrtq2H)LPYPT7EAJq~3VMjv*YZl3E; zR0xUklkeU8up}0H(^S&M`|CCEK$=GWDq_LR%Pl_s_z%S157r=Z%$r;s*})78NZ4{}(Pm z%gS%KALR8%+>`$pH{W;xUJHBzuA5)xND05jn`K#Vg%bZ|e(Zb0LLPsUKc@-*o_q2i zBl7PP$R59e8I{{09@o7vxb!Z)`W0$Rf1RS4($n7g8FVk@OS)XBlX&aF{%bgTiuBUN_r^3&w@h->jjc`eWfG*s&XbCOHPZF3`~(btRVfHU zV2YWg=;clK8PnVcr8DJqeKH zFT^iufrDf&@RJ&iR89hF*WJKi>*xUOXf_se_l;Km5EbeS+R?XKG04EF|BkFfm<0Rr zYq%r2p%+B`df)dVF|(^y7~=QZGRl(fCZ_N}i-JKA8iS;k?`eS@Z{qSLxH7YzX(5}i z>%8@ilr}9%_Vw+oHy>ZdVISXB-j32_uI#{N02sYG(f%ljaabOgUNhum(QGqKJi2k2 zr1+>BIL46!+@R1Las$%=EvW=oG|`s0O7RgDYqWdI7vQ+b(K1uEd``Z31$G9V$KN%J z!+_h0hhWrh*h%-e4_Pxp_Wi3k@mYq>W9;je2L<*_+Ke-aI_?t~#H zD~t#_zVIk>IwazoQPXk=G+6Keb4%z1(*Z3jbMHFy##z%hcU`h8*t#N!VsR@VwtUVq zwP}sG$UCvQR7s|?L3P6tfc|7-s{_Pdw`34zWN+F-lFU4NWCmeRhot1pZGddIrftA1 zj`vV9c7=I~w^d@rK(xrJM(kwhBh8b}kG<&#g0`*O%MxQnRSRl_(vDI?cKa`2vU0~B zx8w39lwS8GcvkMCQb)CbO#^b=Kvx4GMVCmw!eW=R@g(&JqxyA-3>q}>rDJb$j%Th@ zHkp*lbYb0Rn$kV_)H<|~WQLxF=D`9@7cY%EMg zC*3A7)`d-Se3tf@_n-iRSgK*{4YMkcOVPlVnbfLIs!&yT>}A=|Z6%Bs9v?c$i^cJ+ z4#`)_ElWX&6=Nq^$ceNqAAv747!=C#uC*wf9dnRwxJa*UC|ZD2dS_*1ExWtADkX*{ z3Wo{s+35O^7HRzmUS?5OQBitJPU$+hsviYcd=h(3Nt9K=|Me?-0+}Sr5*jBFVS;l; z{@ihpWG?XQ#G8zQ!IUZv^@}|?Qf8fJu5F|5N7#R>gzdxrbn+KF6R*&%cQpK&Fzd{B z9faAG)lPc1-$a?)>HiFQ`oRfk{%X|_g6g%PA#PfUsgzDp4(r%WJ5f=oeWd{Ln)Pe5 z46|XhLWQK|MF9V=wa}b7AwhRw)k-C|qsSWkpVO~jnuHX?DPF-&d{8xn$U>^YOh&B~ z{fmVDVe1?Zs^OTs$Qel8>f6?6xTYb??fptHg_&o>(Y&r(gIVL*c0~Lz^Jl(IO|MzC zhqZ>HiwRN+D@Tx_B_M6^9e*4r^Ol$T*Ys$OMCc+3;v^t@=q0adALT+bH7vyF!b4_o z-nYO|{fgTnQ!!7g;n*`l6FsQL1)H%e0qKacwbjC|f>mC;)y$0A%mEKSaQGM037s zz?}a4GLyY!kUjHfKg>LG>{K=VBSl7{Ca`@OGC7*4+z#X=ASkFoL~@Y*Fu-e;gCxK= zpzJ}ENh6DOd)R{rgH`CTz!+2z+YgFV5<8=lam2tn@GM9Lx;@gM|-*o z%*3&7{9Gyb%%AI0#hXQo2OSzN;xq@hlo&S4qqQRMdNRqK72j6W+_ZF4|CxOP z?Em(w_n5AY-{%r%1$qq06xYJL_E}>s9SU6gy|1fsR`FrId7p`C3ht<4x+Q1GZdD@e zo%zWf&1))MH6{yESEgw_@_AFJZ zZM0l^O}Bewol>br*X*G`D_2#pyf`pw>b*GNwk##Jb@{K>Bvq>Np)GruYa_`f$BDo%$&p4n6d7pcc6`ua;L#rqlrX6^3N?=P8NPlqGXp4*-S4K4H~bRA){X zWv#69rURYA04aWqzPI%1*`{I?<_l?z!+7#S6t`>g%Oa-E@+tt;f*BJN_{6 zaIjt+3Y--Q)NjvE-UP5Q|D+NHHsbM<$O}SztV=h{>!^w>&lY1LUF3X19ERQHk!9_s zT8ZHqPw`u~t56wX^gxK~=s;klhIvkp`H9$r%A@V zvn3Gmex&Uxd~Ps|>35aO83K&8J=8y7PxEcw&i^o{+Q1EQ7nQ^i881k?4e@S^C+F!Zw!(NCr%_K z+N#!;mSc$CXj`J_#pN~eCwB*`8x34O$5diju8*k_y~fA1W^WI49p(Fu@;~qF>83XYd3L!c==rD4 zpyGpEWpB80S!f1Q{;v{(;KG7aOQDAQ;K?#*$d$p(MX40K8Z;CTpMa)sHYLtuDlQpx4mEQ-Z`RK!OZ7Ca(7 zT?!AWZ77Td&<%^RLyg8i4uS+skR2re zZIaJ?#_=0I3T?xgOSic}g~?RR&n{3rj(Fiptk zww>y1)>Yf{u3-Ly4-F8Yv1xaQr%+7%j-zDh0Hhm4P^wqMs=yEN2!*zqd zyw3!7RxXxBe~OO;O<&8;2rj~CF{^T=v~#FAvvM(=X-GPh%!{QbLuT>AW$`|b2Hxy? zlx6{?cvJcBkO~@#FW-AA7E@r$G%Q@y853oJz!HiR);w&I_*X#~GM@w|)m8UZpAb<>WLaK26(`Dq;uI6F3* zetQcgpx6f7T!fU2PH$W&Y+IK_dHnT#q^l^VAKyb-r1XApU`D;ereNBRl!|ZObfY1k z^OFlGkEOEMkyJgk;`8>a(FyzcoGP!s{L1Sur}Fwc{hw^?7Y;;6cRSr)FfboGWAZHC zGhnm*Sww@cIfgwurn*3;heDmC!p+DW5rL9vY0&q0$QdIA5;$k}F+HkEVclg3RHAn7SHe4|8!nh`)?DtH zcQwP-HWqwk%}HFBEtz~C^T0A&Ebzgaleo@YmdWd)HI_lepbYmb!E~KShtoxC6u~4K zeRkMj!xdpwxgx}Pz&gV{kAk!i4q>|rN;hfKz>Mn`8J6z%C#y@WmprJ3)9t!b0JAXO ztWI2$&YIgpM_``ho+GkYLtEDPmJd60T1h-{`A`VpKJ}m-;I@tUDwk4_!1G3L zPlH#&_y~XWq&{BRJzIdL>qWzO+#J9aP%NP0@dA9z9P@049~G0%hLeKvI$@!i9aNww zxA}jyW+7*cppy4zS8!T($ayAfC(#=ZVLM*(n!88xXgTbk|R@h8=ISee_y zMIBD>FZtOTUas&Oo}kLDJ`_qxaXtD(QCsnBpg5o}}47BJ$c zK6b|EUEzCYY|)l}V9kI78J}kND>N$s5B$)Zvv~ilN)-6-{7mpkbrSM-PIXY7sux^G z^jf#=DlArp9S`I8gt2ErAhySq`COVb#+Jh99$VuJ&{`f$nH=!xEW*T_n1t?8RXUgU zUU0D3co_{8R)&@)mVnLVLk-W>&E+y^vbgKiuBF2OE2Mv2W*XVViOn-km&m>(wyci3 zi?E5V@hpeW7U3+86=yDF`6Np@@>v)PDZAK-x`ME|o!$0iR|Q3mek|CoJlnYoTd}xg zgh!5qjHC3OPo0R$jtHJ>&xI?Cu9^{OmdC8{Rs+9|U>C<*`(J;xAdC9ewnh9!+5j{Q zW{iY+3Emrh=^nWMW8pG(wx^dIeEof8lT^k3{dXxJ)v&%usHKJ5s2Idv_@%m_(1G4` zLE+J&{A}HDVImfT&`Bxg1YQ3+n5O#8f)avk1&V0oo$6StNu&x)14Bu@Wn&Umt=^v^*T6d&TOq4YUz17cv z^kA$k;~R!F)lh}|gaO;=>0G?W3Sym{#c)aEO&yY}hczoX!>wOT9+su0-?6PjiJ!ol z7nEDK0*w8kDws`oPQzD=pv;5qlvJL-I~JfUDA2A>xHp?j;v`iU@4r_^)3>I=eq1>P z#R0r=Je;v%u!H|r9FU=ch!wTrY0Bn}(&j#)Gnsm86of;5ZX-YWsFqhu@YR4kYAzXl z?rGsg|El40%I?^PlRUA{|LTTW=t8Am9Mf9ntxCi9oHiL^|IINK*GqQZE`z^{>3-iW z;q3g)u_G=!%~G;eU30)pM>kw<=xu6ocyuoJz#Vr`o>P5yKMdaaF50UkZ_-{RKv8@B zw_my94X2)}&gU+x=R?)NO3m%IHVvU3R;@)9CZANcSo;6VuNr5vknHY?Y;^k`HMeO!lAqe$s`pg&1IrED$lA; zn#Pb|7ZNw@Wos;q{~ddbV%{hhF81h}4w@xUw~%VZaWV`dP0*_XfG^Y9OHUKxPy$B z<(j{zr(#j}*bV?~L&+}wk@bz2I;4j$U=HFa+j!MV;_39z8)iWVsW+#|Bs2HXcZ(4# zb~V@&=yn`gu)GNTx7kO@y?3rGip4Nj8r|7~G8gU=`G+*CplUdM7AbMN3Wee%z6rK_ zPdE4bTSdwR6w1?zNy>uU?Ns9;>a;5OXJs&ZBbX#y5!-h=bI)zxBtNU1@eTS6FGe4EC55Lld+7enDN<%HO|LfyQ9hDo}2H zMu4(r->;5^HKak}r;_fl2rDx`%B(xpSryB9c3@h}3o*DTC}2R7Ml_jD=gz%T3Z|_z zR;_VZ(pc*`DVi2zYXJ&}ETGIxDS^MY01JjriJ@V^PyksKQ7NH^?x0-@lSYozA1NHTfyL7;@}m<2s!u~h-Pqxbny6fL|}Yf(G>#yJS<_Tm=P zivqySc|pOPruf-Oyav^JfQ*`C96*3&@#m>Gk7t~->d7M9J67WYufOg)$>$4Q(snsz zXEXRMMKAmW?g8M=ZQRpi@e&&+-q4G4;carvnjS*}i*WMNtqij?2 zYYLmL{OCFz2}elpD>2!D)s~kIMkq@HPMsEBAEWvYT0p)y^}rcJ4aqN+z|;7;AB=si z2)(RiEQ#E<3X@4O*c$o#L>%H(H-XPhsLe1q1vB|NNJCs5p@&n1Fgb z#3vGVRz8zR1Q8lHeu4aap?Eu|elJ>zq5y<~CKp?=MHJzEYvd1JPiJH9ME93vDRTJY z7_Jb*NA@N8%FS}AhF6|~rzg`89hnTv<BHf61#{4*wl7Y`#v|!BspQF`<3by_aS%7GTtw! zKi8Y^e;CmRBvc^&wwhL&6`)><g-6@1{+2#Wc$Q+yk#lRW+GBa^67O} z1~pnStJVmOtWS=BkrHX)9grI)S)$B(qu?s-$FKcJ^O+1%h-RgcJPxi$r~VtC1+;=v z-*5$KniGT2841b%O`|lKKp5pH-%eR>5C+H?f&~iHfa}f6X_}zP>p|R#J2CA~bi?Ok zBX~GOe@*w}_;vHSh~0C*%F=%5fXA32>ycX~;cmHu|+w4jVQip67O|-oleiO?h#1*mIoGy z{&@%f=hy^#o&JSm?)rY{*fJ5qFN zxUCdwjXW?F{G{in?bZpK&&x!qHOW5uu0{~=`8i60VUNY|yQPs9t?!0X@+gciz3@1g zrtx(GF}t!!@i%G=p9ys_9M3P2Aji0-6ut11=>(tX%7f16azMOaG%}dF&@#IkRqTjL z?^#I4Q9KwWF+?jFq+WC#`nh5L$c%qELh}>}w626EzCWDCVT?Y~4U$!j6)@KwsW z=m3GLnA&~{#hG(foX>Bt{XF&%&I2=TMnkOSf|T4Y++P}3D;`fgdV6r)ja52GaDdG3 z&}*HXWF3FY3IogXjqUpxYTXLe+FCEfG%_Lb&flAlFXQkex{5cpwoL6PgOf4#BJ>76 zeKy=RAVD?=)d*J$3QCbgEKAm&~xPT&T3+|=z#qU@frtFpY@?J<3=MxNW5!f?_GeS7Ie@b;8$bg&89|HIeI*{0IBrw9c!%I z{2GI|yuLsGVdf2yYRDY$+bU6NKwvLBGV18kiDtYdFopc4O8#$Hto}n6N*99(1k~xC zGpN_(mEDFbUfL4`NNx_o(_BrqoN$LhgyYJk$QFsn5BS~}3zLwO>G-aBt{j?+@=C4l zIP!;eRDd3;YF2y(F=l;f#QcrML&kPTFGg2~TEuVjjg7E$F(DJ%e56@&;G}H09&Ori zJ=$bkUn`{A&9jY+N-LyUreQ)4HEU9t4CC2Q%XGYG27}uy@sso9n#NO*E=6LV;5+rea5FH%%#n4CAS*WzaXY z-=!q+Mpo#Sfb9&hW(UaRYg&0zGbd6OrPQ`4rM9V!B-3fOD%0)t80Bq^IM|1ob4D*J zs7C1ygG}_o3lgc1CzC+g+t@Od9u=f+iY<+lPZt0(w^nv7^@a^9TR*`0UUz|X~iTnryR}BNS$XSy zJ^bhR-G_l64#gWsY@v8M<%P}3yxTj z;(L8q5pGlDWb%nRkY?Rh4{62WY#d1^uX-RF@lQ})3}AZ6NX)6THcjd!>jbvI-oT3@ z*wXK-U1SBIKPdaU)@)FC9zC1Fa?84dJXveGqd}DXs}Ib=$-2@JB}=vZ&=OeoX-agW;4aeaTovRrx-)aT zDEx$Xj1X>x>8_P<$D6(eedZwDaFX71lHPKX-gc6{?g!arfz{p?jYu7y<>*vL&v&VxZtpO=!nQ&(?`{i^!iNB7u~N$bT~`U zymOi!Ch@rW23gYAf`|KlC03~kp~aC!EOjkqBPp5f1&L0(WWw__8>G$D+=lAgw!%8C z#Y914k<&kSEo33LMEaIdn)Gz$E(_7HIGqLQv_4AHiFjh>PcjL(C7vF!`da&*o(K9u zDTH^5=>%vtqynetCkR2o>jluj`MFMDXXTHw*WDUwV~GOWtxfUnCU)GZ_?oqx!gFLX z$0<4B4=KZv`|~7Z#-m;smudUmB!Gj2cWnXq1lm1Y=?)ip+8{piVCNhgf%L*B2X>#> z@!oa)VUS=~z+GDaj={QWBkiZ7c*wlKdfC2rZ729V3D_j2AUKGl0rBnB&yk9R<8o+1 z5)9^Ss8GvaBteYq)p>UoMdZkfDTN-YJy>gGDb!8!V=qbD@BG1x?v-%^G+Y6jZ0>Fg zAVE2Yc?sNefwNVMf;jj>@XpVvpH3ATkjS8k5lE<64!vpm6d!C<%fP|Mlkp^E>j^R$ zXhSTV?v_#zk_x72Fqo3DQ=NHO#>EG3=u)m$23pXjg%~{_ z#C|gq$O%Npm9Nc6g?18!a2$YJ7IGw6X-D+gPRTkM)VQ6K4ZVCm5SC8uX)&C1-7J0P zJ7%fpCvSvL zr7q$P#dpia6@ySFj7O?0+tNx1X?zB@;~PC=AsZm?yRI1ck)^oqh-L<@3c<_Do2*n6 zKIFc=wD1Y5);P9X$wrpMlHb`|6Vhrp;}u;|fx+5DUnjY;&Ob{!W`*%JVUMpB+9UGQ zw{h|sIx75IL;sR}IyDRF9r+M2!OjuvUm<=HxwzMaBIns>81@Q6fWge9fUNc ztQ>A@WuYBqqPKLSi3AyfF9$U(1SN zbt@PyVFGwy13-o$@%IhEaqj>mn}J!EL^>>Gi{@59yfE)2^A;+`R5`vWuvFoviUCND zqKe-wn_OKJ>_dAj+0~9v4%JSO*|?zcFfkbTvd4AKE7mqkB9S`cAl%xte(ck= zoi&XNcp`8(xz=Qc^f7mcK`XCKxO1@0FF{FVNb$7dVSd(I!}vT22qS3$<9RrmhxI`c z;_#IC3}WwXFhLgJ6)LC^Z2=}RR@5drAqHVdm|yw&S}JmK7{@7#rO8afk`UaSB<4=R zCJNn?3gMBC7i5WlCKVSKt;%nQu^nY;10)LqR+bTiKj<-6-277dt1ckG0$o@>crHjfAyO{$bt()||*xV*xM!(!XS% zYcJejc7}y8GpdWC-egi5l-NbbingnRu=%75Mz|$O29)&wEQ=4Spz@2)9f4~b%;Knf zjzezOIu#?k^`>yH0$PyoPdZ-YU7O_imUdq)2ZJpB3pQ$oKHhnpjjrj;CB zLuKdT?zw=NA5ba|a#wf*s5DseZ5t%{kS(?7z#IFCS8vYJ_%I&KrnC~E5r6NF${zIb z7W9TQLqX3VC4DB1Q;PgIaY4_OnbTf#DJvStbBj}qS- zYKxxA|Ij4}ZF?n~t#LK+QK#-05#)PQgCeBDop!6)JrEOtUi+*Xl03wxYPoFuum~A! zOgspt6J$(rloyLo_WiKTc)t>(wqsKq*)Go&Zru%{)%h8K2-h;N{i-!a+m)y+4nte~ zbW2#VIXt$5Noz@?d&`l~*~!W~Mo<>~y5OIZ3g2PSc1^@Gb-P$!DX42l6XzT zM)DHhzIEF|(roc$qIA*au8nARKi*9XX;`kgVWV1HpY7W}3X z2P@zW7YcHn;UjBEFHTYl1E-TsV~||SlYQ=ETQqI_d=q$B5vw(rMI_i?IqbeI?0FLK z89lCoBO(9kG88+PvQ>czjKQH7z6oCQCmx&GpEM3LIHJp9XpRxa5Y7tUf(Qy%Bg2km z{z)Qqf*qEGjz7Mn0{#@XJ(NYb>o-4@yhii>_$@vQ=wGEbP@lY!#*-W4*)+Xz z>EDQ8VfWgDI}gx@qQ3_7LzHDdnV>O>c_r}4_Y@BLt^6aA!GHe~xuf&^sufS>EB|sD zT#;qUHP~CU@?rLyd11-(-=78%4Qg^DnBIUg@`o$GgQs4$_yFmxd{ll$C_X8_ctw67 z%T4v_75elf4u-GD`2XrU@t_$XTi+Hj!Xe=t03?PSvJI^P!7v>m8=@@F1TVd*AEMVd zpaUwmEqmG42+aphqM`o|)wCML%H^g;CQhK=;r6vs)5wtm=*`BcWtOFe0lrofwR`2e z3vUSfuB1gW_Pr@;^)G{TbPBhCPE-7aD_=-tr=$4o0im3(e83CPCN84r!>`FN?B!qi zSRz20;|=oW97%={s0#ZzCvga&BDgm1CB1PRrz5fz044c}>?r~K7xe12KWs;7GGF@`&uHXL5gnhp;AweMbkV%*6MfvkfY+ z)6OoNie}XmVPh1VXMHO2u~Fmg;$ar zT|X5B#E1=i0p z39=|IW8NqDF(R z9N;~=+_&Z_G2|EAzGrs+gqUYIW>uCX5tvMTvazE8L}a6}kCcgUoiQ(fn?4$8QE8oD z;qxlfa`Pdw$goS`G0ngy{5zyQxSsF<_X{D9q) zyqBp({xv@Qz}`z}yJQ!4`8mzC21@tZm!HG^Ja`>Yjr~dS{AcNBw7e-F6QNWqr!fn! zUU(rknM~&T?z49ekVwPN2WlGpOJN71&jp%=bP|_H+YRkKe3*={#8gW zp*%+uhGNIz8+#r)>I3m<8jO9hVCh4Jy6$;b{tKiWlk2Hio;`msgD_nRZPgp$`#JR(if9K-{x#bHGHN-jdnmIOGtA(!d;u*s=3 zy2>P2OtsJDa((cwq+-=1{uQ)TH2uSt<>#tbKg|4@FW3&{*E=gc?fcz(N;A%nu7k)& zqwY0!DiZ4m#$Tj-x_Z(|oSzjqU;5tbjJH$@!duv9qP1lJx83luBovoGDnQ>af zQQN#I%|@JOc9fhcjxA}_cxH9M-veYFXEJKn_hFMNxe|~>wZn7`J37I%HxyBoDyxZ< zpj+$2mXR>$k zFt`fHJ#yu@_?$e_q;S3TkbJtV>@Je{-CP{_*ee41Lh%L-%mKD@Zx{q%6-qCGTbhjK zB^qG|u%`{@gpQxcmKoLe1GxVn7{f4Gc%Iqqw9F!(ghP4WJ*CG5dFu+^cDxWmd;3Eq zQZ^|-q8ATd!%*{S@lkn7lfUaD%LcXivTqPXo_9~O;fen4&7;(NrxHKSDvAE)Kjsg@ zn=B-{_&D2u_yzYkdL3b}wJ>L9U!FNrvpUQlJ%>I0S7H3NJPnShE0tk?FFrm`gv^0k z70r8?@Td9X0SOq&0*B^BTz@ z(8osg@5KjbG#*c~o&f_O29lXTmMij{bR+iaW9}6{eaI>Xzrpdn%7uX6kysdfa)06` zY|Ojaf>kBjdOzgfgQh+J*I@Qh`E!`Y>jadMX&wBmq?HbV`=W(XSr)QNuPKtb1|OU=U}z;{xMvTU79n#LcJ=aX ztS*~$7f6ZHn|t6-@E4xJCZ;{u#$?6$W{Vz!9lXYqF0#%81P`4Evcrc6dE$gTi)j}^ z1x}WxYE9D8a)ZW#id8ZYIx@*8kIlRjrFv4XO}_ZNVF z@i*L4VqgE3e?pAWN5x0R#!f=v?`3Xq426Zb4s6{oKE%rKqryXzyC@tS};6H^ITAvC@WD4 z=If5l{7Tq~jcRh}!_*=2LpDzmxBC$#FtE>IMLn}8nuJ**#E$w{_6mmp1>k{a>3r=38nVVuM4#+jLhT< zKPWbU)q;D(#_e-gEnjHg+=7urntl3Y49Ab-FrVSBD>14q9`*>PFTYbFhy&^p4p{ia z|Fn<)Mze7E!PMmU1_HAO>l-CQJgx7~V2#8mMm$#_wy6};_=XN_L0Y%ai46-W6}~(v zk5H=pg{XS7OR_^4a>-(+6x=!nR#~-CcA@f~yHj3--u#ky_EMj6l8D)PQN}j3#MMHV zJA*Ly)YD(!bcDW?RTTG*Bt_m>e}`LwK>Nf@tMkLXuz^$e7CZaZ8pSbc3V0i4jXf-A zmfoVg#|VVx0s{yR&3u;!E~Mn(A~`rvdp_VQ}ePdi5)Bn*Mc)F!bJ)A$QIL z*^OxUy+~qc+GMahTaXMEUoWV~y66Vc@NqQQmzbYbDf*A>NWfIdS77#?@#qs!U8ZyS zDvle+MZ#s}J7*efapeRL>A~ zU2ypd>l*hF(`Gcp9_WDhzm(PNxOI1b5fVBHwcyZSyj_?OSK(l7U*2r3<~Z{5bUA>Z zA7zkEMDcl-f=kx4-1Ch_mYX5fG-A0=sAe-umUKnUGSGdwu+ic7qXuX6Bo>@r;spN> zMdq@L7eB_X=kn8&!oml6YE&>S3y853d{iLG{A?d9UWkrUydv#q`-50n3LlyIP=s>I zo{CO~+~Kmix|i(_D!hV4D7w`2KmY3gKmMeZxB9$fdmPBUX*C*oiUXZ_Z-Q&^nikq4 z>vqzfSnyYJ32R%ByjMRlIlr`7S=lkcsb-Msih-@;t?Dec=tQ+jL@=WNVvDZk;eFub zdSnNCZOXmu^vlb=0ytOQ`|jY9Mh~lcT-}Y#d=vMQ{JX+b(~?d-m;4Wo znfPn*wdkV+or0BWp_K_62WVd8dkH=%0&_i_76(&T1zgDk@nbPnRfBlu&v)$h#y^cO zf%$)OVqW%^e3wt7G!v9^5QcR!AtXm<Bi@d+Gr)m&<#2fcPD!8xZojPkdB+k zZ>w2#Nei8ujbyX!wLJtIDSacTs6Onxo? z7U`e>R}1bYT&Vitv@n4b5Q{sbc}7pi3O7N+pP zMyC7x?6!x`!Q#fsHz2$XUEC9oAKC1Oe}QN4?4To^-MlzT;@PB_CpdTUGin`T+v+F2 zU))+npY4<$;+FYs`Jvp)!*`qK&rc4-4hHrR+r03R{JA)@;$G+m0heQ-d@DhHXn=Rz zrDQ`SA|-vjW+5b=A>pK8i4>ng`$GR-+LP}Ni=^?^4uUBhh-Hxx zZrcKt{RT#@=TVRW;+U^wmEP^+7V9q;b6!Oh$P;knC~C8!&C~ z4xj0pPQyAJxQ$?8%1`JS?yrgxX*!t}j`@CCkm>bKX?z2w&V+ZRbLYZax-+PpH+Y8+ zFlX(vDDmU=`lEg_%eP%4LkP`j=-o*9b)=ueQ?_@2#P;Q5LH?G1O`<&hBfi8L*$=bn z%0Iy0SX2II_7@B&Fz+4SV1d$ZTqW`NhKB>wWDlq4du3wS3ykIhc@nYq;J_~tSQMO1W>$+nI!!EA1nV%ez4H3zY~5EvVRet{RgtlU@hkcv&Nan?FMRF zvSWwvU6RLHM$x>)E7_b5M$NJ4J6NHwIvIWD%yXk%~leH`0+8-B`bSBTjCh z2@v^7`o~>F z_UgEKb^xOP)M=hQKWw)8&%15RlmB|M@;`Q(-J_GUm48J4K5KVhwa-shegl8MIz8!} z^k41&)Nl6ygq~cS_fGmJ=V!p!Zymq7Xm;CY{gpqUU+wNm^Aws$yL)kdiZhHd)$jC< z9zznS<@^XF@Gtt(lcVE4CV`(XPY(LWApK+O{GbhG^WzEr>$mK$SBEF<(}P#{x5%T; z^A5_&`RS|P$Y#nte16(r`AqWe`5FH9_QA@3#&1tAj+^k6=+E8-O5xSPNe_J?E{fma$1jdvy=bB$ zIBT^@>if;sv-88lR~?$0{nPW-Gm_!oe1iY}5!Ewl97v{f(LU>8EJ^P0%(!cm3wS;Im~`)&h_{-|ZO@mFJwy%E~;M zc{1}X6)AhQnknX07hen^+{@mG{I8R7YZvQoRU6!EE1$0*3P8!%Az|9&1GyHzC(m^DeNW%NtQ=S1qhcV^#|9@{RzgF~fmCjah*yy2j~gPM6o9c(<7;t-(l`jKZo}ei2sy%7V=D z$<^}P2vZTzg&D|kG(&M_0pgSbqn_#VwHmamrlWpw3ow#_lS?J|0yp=j35$-4*wc)a zu}n|RBGji)anySaPyyyJ`c!CkHKdLebJo|z+z&9PCSOSbf zcO4sZS|j;o8TSpmTf>NwfR|&yTDjbGiy6m(c`m>51}6Vg92am2cq}DApsXTkfe~S% z8X4hG6_yeN55ALFzFvA$D!(mZJ&NV(d#nfkF5!pc15Yo_8cg{48g^SAMmMl6umX-i z81*&H8~E)8m>C2csg}uQYMJJn{Cl@qdtb>%VK7&&)Qd2gC1Aj8HT;G&IE*0t^fXkn zUd8n&f~(>Hj6tx7nK+O#$4Kk7b>Py=5g-ohg2Svjo4}M^;JB#>7#{MmGGH3W;xJzU zVmpqhI55xW^3ddk3cck@Dg{oA){T)U`kZvMTVJUaYP8g)p&1wbG(9+@9k`Y+RpX@0 zUWFXY&n6frH4sO#Z`@cTW5K1hSixL}=!a8o)oRi9tV64-f}*9rt-?YO?~(T~85<0M zoGHtwQ4NARWhgO5nW!*9Yx#FL$pQ@c(c#fg&EF)NRglAQyuez;YvQ`gCE&7B0FkB2 zSztH<&*cDD$bmf8gk?a@>@blrOr_5i3yxE8^U&Kl9GXUo)~7-#yAI6}2Up%fa}dy+ zC4mkWUiuV}@rzVzXyqsny=RqZhQAPEUc0~-b78uit>KJO1F^Db(oqY+n@c2s6?M*?LvMc@f7pX|6iR3{wQJX5Lail8nrt z_oYk`R`@EcsL0O%8YM9SDpg{dCJep>)<6&p@pDcQ45X-w^guEbS9~%AXt7E|xLK(d z>B0=XtCGo)=&@1;p{OV@*!30iZ&{+i5e%^SqEBt?u9x4!=q;jXUJ${JpWYNITsz>5 zLPgb%Ajla_7rP3Yk~$T}ddcM-1J*7Jzp%W(K88j!{JaC1Zi0ST-c<>f;g1#Hz&{5z zJVh6`6h#;JJI9J8_*VufR`&${#dR2eUID-0-T{Vg`7IR9DJAw#a0)gp_2)Y0RvW>GVnnNSS@31n(liSWLbF^ zV@hS<#4uSe;Z6f*ksJ)T5dJ>z%G)aS5=f$V=$S+qWNF$~h?GhaKQ;@~*Vgkz^<1x1 zXntT>m}O*^S7C||fzZSiV`@S~8Dw&&j(d!9sf_)LOHLUCKiKpEli-dA_oZr1hkn_} zTQ~79iM(sT1a$|bdfaQN!3yk~hKKQyAAzbM=iD5D0`a<_*aK+pfwu>R-X7y%Od_B(C^^idw{^g z2kVmqa~ui~(8a(G1qT)#e8l4(Y~i!vDF`em+}8L2m8~LMfSj1kqI5q23xCBabFL{f zP_7)fB8cx=7%&|I)NwI1R;%CL@`53s>q(@gVr$Rva-()Tt-WN-rU`&*`v7>sUOed2 zjbdxC-R-l3UGn-GnDLvgk3!RK&mMUN+4zbfwO(c5Z)0>zeRj(y;OO}u%L#PJ^0i{?i`~Lg zXS?0nYqjyD-uu$_ybjbK`t(Z|<4&`$Da8>9<#-sb3E0BI0<0-Xu=HR8k=g4$e>N8T zVkFl1z)2HJO*tEf(3{f1FMwlXVB(l7CKOtF=(p85^eq!5H}Pao><{=whY-9-B~W9H zzTiq40XO{3kthi^!@dCSOvh5EEHIKTZj|pz zyRG!u;$hkrU=Stg<;0&b;!(G!x%z4<*zEQ=&Su@6lV^koDu6i(Y zd7rdeDXh5c4MO-)-6>o5OfL}&+CPN-yYVTnWEzY3l8}~+z|1)(f`EEH``%>z1oq{q zY%j+a`loT&=oFd2J|ByHp{D#a>`Qb06r?eK8W85knK+nOE|T3H?r%!(yU=5v_7okd z2VrPcG_R=VLS$`ce|J+|0AEXo%T>D|4|*PU$}ZjB;bLeCDp18;U?1aVZ{C22D+oPA z88Jj(a|cSMAt2r{!Ytk1r%PF!qmxi2?s)xuDVGxxX9cUG6Z(xBqUEiN2sGJomg14Z zqVI2;!7k4rm=rm2%9ckRoD)8-{Sg~u#oK9p>T;dqL>?&yb?_tOsBQ;WlQ&9Loh}SDd?;yO{q6tajC0~z$m6iy{0lXZ;a?EYS+zm0( zV6EQXPHPjRB2rkO_C76DF(TdFX3-`NdO3+v{Xd()blWhsUP^*d%8dgfOkpR``N_O-ews^A47)>Ao=u0tGSTt+LF%_FJ`BGdV;N@xcFx0$K~Zmc%vn!k z0J}|*d{E%nhd0=tyTcvmc)Qhy|F?J0=U^-c^UJp}XkfFNyFJ|Tx&zz)+_%w8CBP*s z5jU9lx#|VR48TE@sk$3bnwrOHcu}B>cakJJD6j;3 z<`$38bfFE6Lhh#$6o9XC-GJCGgN)4#pP;LGUxpYa6!u~m0LV@deUhNVsy^Q&C_YoP zV(pfO*NN+zY!6#@@X5m(xwsYTZ}Z@n@hx(PF;T~7gqIR>!A9!}+^5-X75g)=ffWL% zm|bwoPhP(K;ZIMV*`5SaT|k+IbM`3EI|;5`=y%*o+5_|<6fD^|FA|lgnPTTtnzhd7 zB*nY+aEo`L*bUmai)(Xw0n!2PB}@6*+j8~IlMI~=*cESpiZakL_-eJs|JnLM(Mvln zh;6|_%0-C13)0#X68kQyY@4LH^9tHh0KgL@nAtZ27x=$_RRj@;s#?Xb3z~CBz{BJw&?MpS=DsDh9jGZTj$MN<@CKXV zLD!uGiIynzQIGlZ=+r8a0IbLGgl)5{KjN8V1Fj_=juOHOp3JR|s1O6A zZ@A)j4$N_v-b0X>#FGkrjEb7vY%St6(t4h3an48a=VKa8`30e`&;%NdnSV^ zoGK24cB}o@{Vp(ok93}y!K4~^_-UzBOCeR@4fppRJmldzY<;)sk5_)E@Q`xZT~-5SUaj<1W+*wrC{1py=X#fyn?;o#76$6;Md54|}WE z+O{jzJQjt@A~4Djjf1`K_n-XD8~Cak?8dIpf$_1A(g}P|Vn9G2+T`NS-h<5(_9%V| zQg>`+n5A-Id(p($CG)JdOfQ(;1LlGbJ&3qM%y}4W7o?)8;sFMLaXqcl4eQN;T2Cj7 z2W&E>CP~;)9w=)GSZxnn5I@>GB19c*?6s8d7VE2$b*%IZ{ym3(FW}$z@NdaFj(3CB zN&Ne4iGQCjS!d|RkS@_C@DcAQ^4WqlQ_5@<)-w7AkFHCs%W)`PS?BOBC_!J#thmlMFQELezzl1hMargIaSAnPzjC#haj=XU77Txv;7#y@x*$ke z{W(}Sb_>jX|qILuS7D`wZrC~QgkD^R_sZ>^thgaWFR5e4zqIOIk8q0+b ztve1B0DtMG7HWo%xjZJSl43QEsx?h1x#X+mi&&Q_hT*+<6R&;n_Lr|{o8?tQS@C)Z z)cU3&_LOKh;wzMzqq=IgZX{vCywv))0PVgA7pqt#g_#g^meeM> z$>vCiFoik~80Nsb7l5zeT(3ulT57n8GznO`InzxGg9Kz3BV+)$p#j70)|PPyP6h(-1t7?K9k-1K#58-&#vyVeWr9JD z$?kvdKNC8y%d+*2hZ@}TM-Z@7vw4)7n$*ZtlBJ)q+PY(bC? z2OsT1V3(kYGM~C^G<(TF)Nye@;13E24Jrr4u&9&=DgiZm4DxMvNQ=+_M5zNCWlba7 zejgTQ*v(;aH$%8C?J;H>;Els)U?0ZICPq?fldI7vFn$2GomKsq+sf*shMZm0k4P=L6b-1q1cQ5O7S!^G0v-Wd{yUMcyu zyFb`!wY_y&g?X9p!2IXi8?+J4`aQ^8<5MMoijC4|kVy#{RSY{KW$Fif`ir zVQ(G`K^W52{7%8i4aI_;gUZ00Sch=x`VVJQ$P*zXodGREb?p*T5PTa zd}WJEO&c1RyN2q*(xy#q=3(q}sQ6&Ow+~z^U_(HC;g}96qC-f+COBkS{wOF>pLp19 zI#E0Yxp#aRSJ+c5LBS+MGMLDc29w;iUJ(`U3qkbkpa~jm>2S+SE(cW1aCQ2%?F}nl zzeD%kn1||m^z2ZXfwCFvLi0R=+{`g@DmIR%kW+iA1qRS?0Uo(yNA7X_cWD#+I+OR# zlz5{Fj}Pz>H>3Ck%sWusyC{{1UZ#w4j*=FJTA%%X2~Qs=bsSREFzBPVf7)2|#8T$VDU#JALiB05dcm+TlK)W6ERAapP*^B@T9Q`y))3-3)WK0d8MFeSSs5P0+WbSzd5 zYOW=*D7eYtND@h2!R3qYB+-e(B0EVFyMOvNNl|EfS-j?SVYm6Y3p*Y@IY}Wzsq;oU ze9RZByVfHXxL7-22=b;Jefz3lCn{*D*CYFQS-qhVkNY< z0f`t)T}Fs9$BkglBPLXJyItDf<;h74AvbL%mOf5wT92oY?Ek{#dU ziEtOS?XWILZQPuERkqHQSDeBxb=2Jdx}3|wpVd|C7;J;T#$$~$cvd0$h@iCXDN66J&FF<+t zzy}5JP|cI-^;vqXICzq9DSTc+5ex?FE6Ri#{!sDinsprhEJ6P2TBcNJbk`%6Bgq@2 zk$EmMsT6yT5qzQnEl#PpV(gW2rvuBmV&d?25w=C;J}=Dd;a(q1-bjZl?FPyA$>T^R zI@>(Jc@Gyu*nrsE>m9tM%Ty54ykQVMR+$6}647;@tL459p3TLD^#f}5FJ-=g4i~r( zj>{9R!)2sEudYgYSz|5&rUwWOn2iBsR=$=BUKyb4Sl|S_k;c1F^9xqHL-!y+br1UT z5O=5CU-JUgYtp-~#2w_fK-2R#TRoPOHKE)qs7=c&e0QP0)kF4DWOmms>8(nq2ZuX4Q*W)lc8Z%SwhlgS& zv;u2clE+k7ri#yDBVwgp0g8dQ*WxzE11z)0E3of?k<{-7JE78gxli}Hc*ABElK={b z+!~1rxkO!Q8Jr+43B$YefNvDcdbk{lLHYx)vg{OKbWqJB1)iQ|Hi`4h&SgZb4JQ>` zL#```8CuAkCtR3LJYMPJ2d3Cj?*8^Re45#P7vr~wHxST;{SSV6tA}f+c^!DHyayHA zt9qoyqrJS8_q;wwf|E5r1d!(wJe87t5@O1q0Mzq8>zkQd0Of6?;{Dk6YC;nPOR(}0 zCa^BZ1I}k%RHrCYtvY0!4S5E*J?Fc|IU`{nTV6EabdEL&fbA}Py1unNQN|lMSdc%p zdeFi!b->`2FJNsyya0!#UtpvO1RMcLybNK#Sn=(gefuzq+cvOTghFJPiuISugP)fk z{Mvc+@a@B&)nkqxYbv=OVv6CT`|#(7KU>EtOYkpaovLKAZ_py^k~}okWftDXd|k=p zkR-YXu{5%Lqo6ow|tboXHDzueSg(-RWjHK6eqq6LK3KC67 z0Rw@MT0wI!wxK(vti{eLGdT7PQ9(~QE}8D;@+CBjyqo|vGnGoST(PDN4BGyoVc4714JEvRe-5;~lc}*mH5-#MKa(Yu zMs4JpStrwI5H(wjDH&M%X}F|OVwj$VAutmKq8MMx16M-nCn|VP3ts_0;w|Vb-|JEn zoe5omT&{pruguioZ=sZR>TUt{1J`sd*!+>~BbABg<1t8RnQ}FUzKHT-k$Y8B!$yS1 zlP>AJ#?dwJtWLsMELLD3ui)k+0ba>FuoIcrU}}OwX`|p4@QpX3h*JJ7-rG8vLaqtI zKXiN8!susY4Z3|2V3e8dqO0!>h~m*X4T<_eIZoOPCn}H;_FkbK`W!sM{-hdu>VcMl z&bSuB4POs}ycienAs8^h|` zu)|yHQ)1bTg%!$V^s20$&uhqfVQn2)UL~>F!xY|H8>vDG%Pi;WFfLBZ!z=tCdeY5! zP623uQ>y8{FRqkfQ*}W)Se%N$IC9}1HZEB)PtZ@DcbS|}HsG9KA1#t#_B&TWi+g3M z{x$3yp~UyVm3+j%xZmyAAbZgse#wT^E6CC^B%_O%(rQBhm_ooHqWOQGKw3wHleN|+ z9%=6Z!=&#!U2M44{uCT6U*9pd(t`<={T9Ws|Eo@_PppK{TJpe=(?5XulLk z;NjtX3Xl%?=28$)6mYpdYJ%42d%abUEHzk{_$q-S+Q(X+ohF=%${V_cui;reY;3fz zPV>O)YDH;&!oIeHx4EJ6{WlsHXw@Ou@Y0nG-B#dz_idOzD8O#$zdFnv0nX=f*tO>$)lSB15c*&OB1HMra2YHoNfLiH3>3))skM~uyxw1b4Cwg|U>-(r} zscz{PV3^WL7>u9c4qkfU#SVVmaL4pW7%?kLN1BFl=@j7^^VK*(&hM+MrL&0RkHZnC zp5+Jy0m_#j%z}IkY0G`Z5@ZmFoZMKZ%JUv`Hs05S>JumDjh=%i!?0hP)-IkbqQOoRk6Jt(QHw;A0AGUhYeAg3b zGxIsYsG@qUerxc)zLDzd@JU4!^TLx-bw!Vn)4K!GJ7AS|V8Urd-h>U7?5Zy(VNC~> z5P&TdrnckldbD+E9T-{f9YWB|wFVzy4mgC0-!`YoHl95*UUEGho|5bP5xKrk6oEp zTp#lSL2Ex%4jSCJ^xytp~9akLoDQ8Kx5T_SkwkYtvCbk;^w5FR7=1CT%v%qM^H zZcc>uExc4d8I5aFGc;S9Fa2S5|q#<9ZRWFWA+-hD=keID{ z(ZEu>-ZcQ)#%2#;hSARzlgOvhxR>E?pHydi#g+&;z+Ax)nsDGf;mfb&M6)Ye+^}|` zQpq5IwT>fIkr9ky00!X!5uTMw60I_RCr##8@bWOemEyC3hleGkBBYG-fJqpNc{T97 z0Qszp$`6xjRW@O4pmPpj!=d=^g9)8dbXF-I6=ih zN_2?BsRu6^V7&8_;SvH(BZocP_J{C|(2ZiBfC_N1n7p#S z`o)^~rJB{YU{^UIhgx{>mD2}b(~OH8oy{?fEIZ8evnhtBfXuV8^S@O2O*+YibMn+L zRaVEIk_T~A{QQR>t&19@w#N!U+vAB}>Ur{mR4l+Qn6G&+{!%aGYt05Jy5ljz9L=ae%w>w*D+ z0XM1|1?cUy$b@SEs*^rGJq0IZ3bQ(a+F?r0D2pQYUKUEh=YC3B+&$HzT0h zdcC;PtXG=sdyNiCT-ooRtgetg{Av1qlgFB8v*eJ8&pzmN$I%rMyfmMEpXCFcavfd+ zWeKEKKxa(KOA;Nr(W%4PYJL^18_<#KMR{I%-^|mQ(S!i#6{jEp<*vi~^XN2m1F!n4 za*STPif=WcbO0{STCb&{Dg|;7Ze3PL?X~#rdYP;{&M6EX zz0cyQRCObtYqFbKIlh_E;0*%`?Moi1ln+Au2=*^4o{*bar%-|RS;;&29y*j`N95Ox z6x5Zfy>OXpFt;)HRT;sF!brC*hyLr>7m8R6JKT}Q)QoBb z%U7W5>23$Qxmsw;6-xjaTzI8xZ&FMXeU1m8?Yhstk60W6gjE`Fr4Hfe0dAOboP=ca z+4t}o_|3noK)2#$PqpU2yXx?r^->9|jSuAO@_co}X8jH_l$e6#>VB_R&~CkmqTF8r zk(MYXC@D@JW*`BQ0NQjIInDr-_ZdLl>U4d%^P4s!{P9NsEs8F@57dvc&pcUep{)Yc zfPR+(v|xXQSunZM8bEdFF|w5~LB?)Da!~+^YU^{(Z||etDn^19DFdK-XLzgXJz>Rb zl$k(s<)b;RFb>^}%6}7PSIlrCb{G3XjO#jfE7Xw=eI*=_P6Qp-p#;(={W9x^FjJrW zlkM@j)gjsL>TF~*gt86Yo(?=Yg54kVUhBFDPq34$uw_C+XjTEdc~i zT0h#lB=*?*J=in52fLeoZ^?QBzcEwz>|iJA6S;zFPLT zF#c~R;X7_pF7b&6X-|GyUF&PyK<{eLnOFYSZ)PgF#nR`0SWR?Zu^IS1sH#3LT(Ikb zCuB8W?c&Ii0D0hcqBXB(HSRMGgdD!;?(+G<}BcjQcO4oe9xDPYh zeAV+huHW-_@d(inTunqoqP=1wqGJlUZi{8ZPEUJ>xXt0olw?i1YbaYk76{Y|nrs)u zNU>spjp~q$*U2!yOG@px521iUzKf73Lj&4cv4I1Kr-9d}%Z+a$w88!+dgR(n6!|zp zhPGGZ3cVuK0V}r>%XPY>{C}5Gy18(-x4YjbtyU1DG@^ke_c89!*gTFb9gqf^@w8Ac;pE3pHb_?ZNai=8%?-|w++g=a6$;-e z5hT6NZ5xf|REoz1Q*E`ns0oKG$pAEk{|tTKZtZXHP}2X*cGyCphYO{$KD-&k9Iae@ zSr96+V0bn&Bbca$)um`OS-I_r0!>Zk@U|;G46PgmM3GuF(oA4t@ffJ2cbWIobjjpf zJKhEh7ydw3Ty(BE^RfV;NyUT+HvF(w_Bz-f&z|8@`0P0hlWkOl?)hi|xe3g?4NQWo z?YPV@Mr8YbY_^vpa{W9uR}W87=v?CE(-8&S3k&Ed)wA&IIza!bOA)HAfi@}LWM2h+ zF`vc3rKtR^Ets58e|(P|^K^H+(U$=~(%2WjKIDF27f9h{3srR=vg?6_0u_TS1OI^h z5Poinxec(vpxfzqed~Fg-muCWm1kb^1R;NDM#iHZI(XG8ayP{Gm`)5*T=EK;YL; zV0zSYGGTHy8^+`^&qc3lFi2Q_^cH_c;UWv{OsX}(q=M>keL+Lm%h080T259KP>BMu z&ro1}^f(`4Xd(@@aTTJbt@hN8Mj`NWH+&;TH->c|#6xt5rN1iTD)~wbYRLa-s28y| z4Yc<>?E^=@J`io-u#$T)?mV^a;ycjG{A+*oNI~)2@EUx=JW4&qi6v?TL$577ou5jc zvQ7#JF9O0=SCAx^C`^#)cc_iKENU%Rq>9*>#)s?Is;awupMGr8|t1$rIwd8oc0o$id6&Z_BgECBf=c_&2wC+ z?^lOCb(_krC;3u`bV-c6&_#nTao@>T@vu>CQZ_otd^|1#zlq<0e%Y*tpC zBa=4is;}SbvGdG@qi00z@bUDa%a~@dwN2mf=y3XGZs6}>G->PEA0VbCdiKY&JpW@^ zNH5-c`bV-*JIz84aja+FV_}!p(K*#Pmf-`F=SL=ODs^h>1gwF;zq9Z&1o0p=si8BL zuUzYx`xO2?gMZKA-xB=GSm)e~G4_wU8T3kme=+(%Vb!|iX7F&+RJF`mlMG~s{d9Ic z#}JMIq2h*R)~soUqy3eR5HTUJ+Iz?-369-y$<1aks#^JNDLnSO$iO1sJ~)nbAp)pT zx+HF8uy$uDO~;_{dHAeuC?+T+QC!YYf^~K2vHV5|yjS zr5vPd&}I_BXC{HbgW}l))XA^bbS*+KAKWJ4948`KI7Z7*g){f&s+qMlQhAPm3ptE4 z76DN#Kss8*n16WVbj(Gbk{DMP%{W#$40mJ#*30!Ou!R9B7D{!DIl{1r`Q!!RHWmD7 zLZ#iZi^WQU&edTc%tayEL~)w0Kq5M|^V(#92UZxKFos}t=NQl}Q1HbwZoXImcH?)* zW0M9#v6!(=@RV|%E=;OQ!+T1FIic99t9ZjRr$87|q+C*QQD8)*!YNQlK4)Ezq0tXi zGrL}Ja(Mo(-y=~Oo6qp0qo8cPN&#QL#wIxqe_ZQ6b}tT}do3{ z=-WbVokPWO;S}B#_+TXuGYH+fOh({1m0gNJI7%LNo<xc9uY-1P>fkfOLUkeqqGk z`AEdk6`0QClJ;%{!4Zj8GOmoVjf{gAhSyVwIOHyd>pe$NLX}?qB&Al-$C@l1X9?n9 zs7>GqiYS@~#w`LzU;>r`_;#4#nU3R!GTl2)9CwkKjzJ^OV)&v8+6};$a&$LT(4V5H zMmVI9)7asj>%iEAx*vBjNZLI7Ef(G6j%fxEN!^wUuA-H_o69lQuF)?ATuT;p!Y$S+ zuo=alBzD3rWhnAeru05cVE>+130`tex_B+PM89}lf0lnK-z9m@IvLkh!LDW_z}MyX zF07bupixXP@n{qzi>(Qw`&wYz*%(xogSiNpB37<&Z!tWF_H7p=u?7 z#R*+Y1$dKxzfwjAj^_kWEMv^B^O8b2f~Go7*2?wlIu<@{0)*e@O;|JZ2MMex2wibi zR~;_a{iP0bBD6F8vU!RMd3f5bW}6vY|4-tRf}o8&^gZ?6Df&Uh4t^-*LW8Jz0+F_d z4mwO@^P;}qmYH@c1ZX27S(sG-I!;m(z6V*8QnhNK7~XiZ3`d2-!p&|3czz*(EQkoX z5EEl2IL%_QBvvzyi;KA=!r*IU$Y=;WXAK3EbNnpUgy$vYWZq*YsTfB(GpeCwq$!=o zg>)T3a{|IifOKTa9OUh460T#lT~FdT78ylAlS-*jZBqMMwVqcf#TwYPwK_=em*jzk za%rYB0xZAbdgEgyul5$R0>Zdv7#p6QRbmt5E1@4vTrUy8x-eK5NNB#|3Z9F^A)Mhb zq|Ftlp0Ab5XwI1}hfsDMArjyPfvS0WPSPBI5tt3WC!5FBhLjd0&U%gIf|D4>?+x`R z{>olr+Dyp=4_{xclfDd@AmaRXIRV0kK-1N$NsMx}iLZjKLsQ(FUQj73@+ z+L{1EC7k%FC_q@>t;o~XLAUsMT zXP5#My^g^FU*Ey!4O)B3N8BK^6|!Cu2CoGC&>0_xs4$J42BM&_V0Qz`v4o$C7b@C8 zKwv#&wHUl{HN1b5ksQD9lPCU8uw}^qfw~vaR~wUzDD*pct?LhTsic2^t$@xB`HmLd zh?~}T*e^)B*&3KfQWqGiok3iRrX{vo6qrz_pNrzP#olxbPDv0YqT8>9z&^v*R_G_1$O^zQ@%%I}6t1 z6xzSyk)n{A8a@k9A)+>&-580NSs;ei z-8`Ryp)4~AL~21=A^*B@gsik$w*2;fz!!TdSQuZ*$3Uy1(195*C$sx`? zuNoj?7sJYACXS=mUNN8nJt8>q6^u%JMXMK`$p0fi7=K$UJ-KfAspv*p=r5zuIeU2e8-ohFHi@uX%KrQFcW=s}%-d@Os`S zURe_X7bx5WKwILtxHZt1`|Kms`b`&zQ}Q0j4BeqgzJq!Xs3+kK|B>RasNxM%LGeue z7xG0U`b6lav}dRju&-Rw-P+MUd7miSVQU+Yyps7b>u0amdqQUaoduY3kth?1#wI#e z8iTSL`x+atVHinH(D+DTa>gYCq60!*G=XGs6$8*BKOF-?c9;O8u-7XQGUaIg9>LUg z9pZ-QfXmc z(J>;8Xlksnb~QvL+^b!3$?t9k;}~l@x(f`{nirQPouVhgm>hWo4_&M=6q}QUP9KHP z1WdFk7?I|x?W#hhcsi3hrT9>oRv5#i{j9)H-S@gYryGAsJ(H2Fq@|)tH&YBWb>t=m zgwv7YWrl#g)XP#VB)zp3RA2;gQ;>CW@BaYiJtJiCx1m%WEGp@ zd6WSCPPA-vSIUAA>B?g41zZRyBjowF(L8}{TL+?%D$1gd?ZCHTi;33hz21YtKDoUj zZPbUPyAD!V$KLPnp}Ic>O%R1*c*CRU8>lL(09d)mFXKRkW15Z-a})m*fi02iaV#ak zA<&kc3T%F17eu~5xF~q@j>~Q~Walf(V;956O6!GC1pvFOE3=L-~iZ;-lX=3Fn###kKV9`BE+=o!zKYe(}hyolnX2O zs@LtTwooM%+42m5h#P0{QQSq~uu!uCt@a_{W(ZIYL?Z*{ylZOYsidglftTRb~|Mzhj|25S=O0Cb*%ZX88D}m4K4j7geOrT37C<)yQ z0P_-LVCCt7gmn>HRW%2p(zx=|f-&Tjp1P89IV8wAT?}e2p5TMkv-G2u7CK+q<)us+ z|GWah0*!27OWY1ZXGzzhz~9B9qSoE@Ucq?M$fzd%Nkr@iSQqgnf_0f>^C#+gJdNnU ziX{+ezaWg!0(0y&#$*Bz7*K+WLG$6dsrJ|KyG6I+~=0hVArZZ1WG~jo1 zk_~L|>RW0*gt9!G5>srF2@H?#a~cAF4YSe<49|I6#s~Db^Zg-=q~8Ndz#A_ym;;OG z*eNN%-zhc|Vi|Km!GcJm=xvl9q7mrtfqH`4NP`$3ew<NYIX+311!%2yxvXmJAKY& zQ!;h@WTf=|?@Ah!KOz;y9xA3ox5t49G+2!|OcbtN*j@}uKJADTUWhNdd^lqIW9OIL zh+vB3jKWZ^pH^s`G;00|2EX`5U}_pqw%|je$XvKQ_^c6^?rWi+>Uq3oU;mLPGUJ3RS{%6iwB+$kKW!_{=cC-D&N4>)JkLlA*Owj6d%l z^xL6Vmq|?S4E#PiS)yZ}uWHt@+LHBkEwgM*)G{kgUKoy#NQOOi$0;*yR_&Nv)|kZUNE@=#=_0Q zH@>qb6<(M4b!}xC{^XXSQF6-S2Ii7~pdZ)@-)A z4D7fL?0TP}_2@Y@Nct6nwN+UR!hWp`xeKabrzC;tKMXbjbuLwKkKARMn;#;5rmPh_#}o z3|J*Y`Q{9ensYzwG3%9AFEZN%2gazRUS|H^AM91Zis$Z@0RQ$a4gO; zFbkXl?WMssgW20oGn30y(7|=Rf{~?NqPWWx*ssVF!kXy0O57+R(Irh}04EtJQw2h< zk&cp#E11qBLgVEq@}FUMz`lQ>?F>wtjMwRVVz3NeL`1;6+l59ofSqoj;PWPYs|D-3 zKlt1lbfSfCdlH@w23i!%mw|U;P^YyIYe+N(=j9lUj#?P417Xxs3tobT4(08KfsE1aexf-RRwokR@LeTRG^Hr?=3d!mbQI1o% z`k))-8*=#V?+4L0RC?FutMu!C>5(-L>O#>Nh~vb)QWr}i8lYxGD`D3jpc_8c)`YU0spR}(D2qeQ+rz$@#-u*vfzY*oO+H3QD4{IVMX6#MJe(g z{>5zq#@RvVhuq?qI9*%MKm)mX_VIU>d_-nQH@L7;aL}b88UkS0meY*O<=~U(sZ=V1 z#F@wD2mT~brQ(QT7|0O_;RRgEMMYzb=nw`IK|Sj0BXF!DJ}X`iC5aUMV~8rK+S%jS+0t%Q-N?@)rJrTn`Jh=eSBsv6@r z+&hGZzvZeyMFuIEcq=4vobwi8NtTLs&T2VJRtVpWC4j+{N1HflO(I*TAc!<7VLpz7 zVPFEAYA8!qP=Fo6c)y^{AXPY)r!fi`glJrds_->xbsDZ1v#0K`y8JcDf%Xz){lu{v zRdHX}8aOT*Jjfb6$WGG(3@>_O(e!KBYs2tpZK|WYNmP4{D94-v2wjfT1L{#tz(WL0 zil!$x?)?+^3H1GIRNV@g z>B=c5Q@t+wy~3MlaVX~x7Hs^;Xn1w#;uu6OYvbUU^6N|-&#J0vP*zt?!-SE4Q_*2O z-$ZR#yi74M+h@Jafj;0Nt7B@#>ns~$T>=68O7^oxh zy!_iE39>B~S8k7_$gzv*XNQwKKb+*n;UwRWA;CM1UbpX!`Jh6dJnM~VGY2^zB$=^z zUC#HT=`i|&c%op2Xo3Vdq%Fs@Kaz`gDL)*NMch$n{~+=me>j_q4y(qn42q5WyVkdd z5a{(_-{R5p@`wNQ2Q%n5y*OG%JoE}bZTTO_q~G}T4`k+# zd-+Fm=y%;eET_!j3rC~V^0TAVj-~ z>i{>vShZuI}0b3O}3md;TD?z(i?sUk)QUu}L1N}M?*zwJ z1Su#S#<(I_%V1;?u#d*r!LY}Q5@1$QH-=3kBywE|%9`nIW5kl3U6yh*eBIk0kgifB z2vIr-3CTA{;Kb7yZ0%C{i`8caIVpogEFWS}`g}VE)S|q0BzS8K1r>2xO(gt=xZ&RAD9~_U7$c|f zadC1ZrrdNCL+_rA!d`EtzVr2_{+blbbG3Qf@oWpjk=bhh@ogafu$8KX-RiMNOw=@N z*`gH0UO-7zF!1fqp0?-}xUI+kw}G{eFA&CG^82*MMeAHX6gR9X_5;yigl#CP>67Y} z^1k|IX#KZeQBfEayG>hDsID0yQ^)B+-NqKfz70a>t;#7oDodjFmYMf1pQ=mDFFA0& ztz*lm;z*^B)qGJ`8|$;x9iW$Ba@{I=m1~97q$$WlA||q-vLrA}i%rt|NZRxI+ru4I zB$-AUn#CSW_#i>=V3eXS$)QxMX2l#wzPqk|cQ21}&kPvr*^SKSUs6TqTi zM!pJ8ZYr8`9P~ufG)W`Q6fUJI2HtSN`Wq5{inx*AX?^k}qUk#6#xB_J{e4x5 zy;gvyC!1a99N=)a8Xx+6Ai~aXALDl&7@g3ja15d^3!_Mma^^+^3baQ={?p>Cb!}_} z!7)gqjO%0L3tl9wp*P0>qn6iVfF}L4NzV#qlNd7BIw(=W_eWu$4>J%^{S{OwSt(4=u2%^>glxq%8U27tAH7xZ=0c;bDERrxQpuM`RCcHybD5 z9=)3ijk5H7BHKr_ zACWf)9x7<7iK1n?hUcp&uVek+u)qM3Ry>a^etpwm6wge1-EioCCYQ7185gFN9L4!i z`t3IRqg`0dXZUoT9g`?$WGk5}c}_!HRW3$raFo zMmZu}H_1LDof|-UClfK-I?E5Zdf>XDp4F)}20}o)Gd>u;T2p}$l3v|s35P20WQ!mH z0R>GJyobI=}J@)Kt>-4DD3bUGm)%nYNbXRgc6|D5$kJq}W5srUDbFmA!<2KgG z`C3~hcz!x0Whvj4v3hhcVN(Y7CxVV}G~{QP_N z*@)fNT{J8NabEn}kjtS}f1s>z7S67U%uQ?sEGBUT;3VuEtopvYyD zCXs(&b|nqZM?vQmYAAYPX0iyvQMbS1 z!{_XVRWwkM1~=f`bZI$i{$ALl20Va?!Gy-XU@n2=>d#PobyzQko)Nn41WvoyQ1}xG z%tny#*rWPf@$R6twbgCov11TDZb~4ux1qTd93Es`h$xjTfkdd%op67w=CL+TbubRb zknn^HGl&jS0d1w9lY8v>5LqP&P=ywlVmp6t@FXuG&q!X^Xm;vKs^`*iF=w<_zRdS z<8Zoy56MZtOfT6t6Y!{A_MHSioimxH;ti6EHM+d%qWU%0-1xHrq2XfRcR#%DncUzN&rp?M|0M1Hxh)9<>B~`a&m7 zcmgI3TF7D4Y&>AWLVyP5GK_NOv4{Y3dq6!lRA(#Vg@BH~h5=eycKLiPB8}L+)&a#o z3SUSPkdD!g@fL!GvqlB&XG_+9edOu~?6d)^@2bZ@Z_*TJ6zguyUdh}0{VqtW$~|`7 z$=RiHO`0H4iAkIeQJGn}wt``PKsHhAv_?s%%G-&NHYSgmP}(%0U)8N+^$h%bW1Xp! zu?7Wiu9tEYO*m&w>&H+fa;9F&yV(p{31}bju5}TkxUy?awDG7~r<9A<)AF!ros}o_ zZ9k=+olGf5#aWXIguCHt2E$IX>f<#1Xn)^OrFT&03cRzD&6sAm1Tfu+T?aruQ_6oC zvLDCiV%C?A{UL(A7Q;r6Q;duR=Vp-kdaO@AUctOcaRTE)WcVjfMZ}^+oMaONMCHhx zFS>;l58nc!@Yq;H1)6<=e%L-nCD^Iy*Y#?_Iu3u9pbM*o6#XQCM($j6+SE^iVjOE0 z{v=kp+gQ4@1XZp&XeTm9zsV9#0USL`L;F`9^1Y6R5S41VRt9F$x{y~CHiL~EXBs;F@bc2r~cil8_bmC2J%L0s&2~(79-3sv%8j7wt9+NlR{os{l zn*`{7hQ%1;6%Rv-Ev(xbdNC;a=v&7o?@qfqR_b>#Qu1g4QzN<|fiz{tL0NpUw$ z8;udi4rQOjh<3#;0s-Wh#jH(Wehl7tV7N~V!-u|kP&XdB<3>n9dXuqlU5KKMIIvV7 z3f0FhGSGq5E9-}l-iW?8riu8oZlz}n10z2+2|mGEGPWsSgw*I%-w*eb7^pHqlSuoiHa_ zK-ga2-{0Pee!!Kw1Pay1VcKgN^pFl}+Qu-db_Kl!;oEWLxs8KT6Tl~-B-asf72h33 zM8#-y;aw&A685*?-Bb1c4mo~=@_Vfy0MMlnB%BMtQ}uoqKNO}zepu;l!z!$w>;2u< z;3F`>Qk_Maq26R*6SCIvKt+l~?jy<7^u!myJW6>{3jiw79mb;x&TC+7-vqV$*vE)t z=jFj}@8X%&tV&{Uqq9Dk_g>i`RtQ*)Oyoj_NX%JMbHG(JSqvOr((-LCtRD2r z@*aHFpc_*Yj(IRS2kG!Q7E(Pt;w{lieF{_m&;R)!|MUO+A8$iT4|=Sg(OHG24!x6{ z0Yo9d99Ve75z6^`fSi!?+Au%$;0pt<;Fe$h`1Dy0>bFWg2I5ZOvD>^~_I)&XJ6=b3 zIA`JS;7Mj1+4f9W!&~(sjAlHzP%akK_Ka0Ktgkk#V;euhza{Gg8>pV7AJ>|oUnLiD z0^@jO3)aPrOtnCEsbXMqY-7dxdSk_bhpcse10={?lLcCkVmav)-sGDkcAeSC%72h2 z>sZI(k7Hfl$hHO@a!TEfDz-3&{E%@Qgr02)laz*T5WME~L~A*g4Jy#+KV zCKa@rck&rGZ$KnG)+=akhAh2Ucxs)NgbQ`mk(tivh)ihkeMzM_!~z+(=o%U3E;<+0 z{j`oUHm9D@@B+8{ptX2FuML+OxRvz&A3_Ta%f51)n z=rDPKe;m%`V8ELVgyLTZ3oqaw2lK=Dpbk2@!C@JXZ6L0&0xefqsZtaVwRr+?7Qy+q ztGJJ;!uAKH){6#&JxSs}B8bAeaD9 zCHzYyC^+Na0#v&|zo+>Zp3bPJ0(5mj{|8M$zm7aO4j18YRtKNXs3$4c5n{)Y_caLq zTHvp-VNc5gRky%}3c0+(X%MPGi3Y4g$fC+UZ3>!><9)TFQ#hCj)D6hf0MIZYc0wrZ+W3mdelGhy`=2YAB- zxp^3uHGCC)c%wjH+~7o`0DOj3ex1ufC0|nqL8^dX{rWY6UJK|ofw1PU9RfHwaUjq^ zhHz+JbF%nRP7a#W$*KPkf-Q&bH-UfYzXtZ9gM$WY;^1(gWP^$!)^lix(90aADo_tN z#C6j0j&L3Q(m-QkK{%cVZ0-+P>kU4G~sZ=P#$Uphg#NoE!fvQ{M2iZDNpmS zyijWA$hYW^Qhn`6H|P?aRr%!#ImD)?_=&jBkx!$xqxxkf$7}g@gdPw~LuH(n#{#vE zl+u8C-jQM&@G-zf7fe7ym-Sjbpsc|UtHeay%nkaWvw|sPbvevY&>C~mbOShx-gi9) zX9U+Sd{+$HaMbtchM>m@{RlI~S)HH}6#fUxofG{JCOIb#k{2}e3mUqQ8qyfLc^cB& z%uP;1I=LatqzN0sE=<=DW@sp;YY0;`Mg1^JKk53gNh138j7zPu0>Jm z^^Cl_;r0ABY?MT?#4Ph}DlTST8ZTf2wsv^gj2D;ZB*BzR8{LlQ|6~3*=Tq|X(J~>( z7mp~qfJlv?m_E#Lw*RHO4VY{2XT1wsszH0_UKZ47;1PzDX5AB+`-36Yn&mm(7P@ z2Q`cK{Jq3y7D0mE*(D`KxwB!MVUKRM@9h!T)q#H?`dGI{kmwdlzQG*rlZb^`W?Ogo z1qBf;@r@)y+z* zp_K9nM{y0Myn%e0y*G13C7wrYqQ9Mri%j^pk|a@4=OrKF9$R*d_suijddZ!-moue@5WvQyGiZ}Ww<^_pv4<_A0#&ft-59yapX0$$lq z2!`lSyj?HAerke#$i*kZDAw)qw|LZf0{<>qXWo{pInHwKZ8cL-&UmboZ(9_ltm^?N$Js$hU;njZqlc>AXdaN@y+;`bZ9ZOM0pi^SWzqci=UUbJ(H~LK10J z=1kW8Ep&oJxKrz9hzrMznEPSDR})s$q2Y@?8rO9F9*&YR6t&hS7IJ4i33)g^gobt= zH%8I0Ieij>;2I$}5gnxxzdyRj!DX;WW+YZSRE@5U$s_Q&ub zfsPs}G_yNi`{RoL#d>rYCEDWq(z5ptBNjIg$=2iWXqmyl|6KF8VJN2bvgxxz`G2sk zBz+=uxj_i=^)i%Oqy(1j*TQjn|1b&}tqVt^)6O}*J(OO?_~H=>b;%Eol7ZUh z=}{^FSlKl2o*tD_mwk794(_lgM<6mLq{l}g*VEF&vDDd`3LvahERO6p<*yg%F=>84W8+s|V zWUt3q$i30HrjGcU($FCluOP{F-00eG#vqOEyqrSD@r+Y2!uPjFVZu&)bSQ~Yhr1(* z>nJs%!?{k%_oVtEx;)BtPRg92%zR`bDrsvd>w7Y|eGy`N|7b(+9cucX%wn236+n=!z)H>tROi_8k0PzkHwNhK{p-th1u=FAZ z5@=R3Rg~b5zwK^yty%n=yl*FP^1}TVj{`D^AWgsc$@h;!u;m%SS~opqrj5qjY*fKJ zHRU%1M+D}JSp>={tl*4&(+q>~KtD7t#JMF2l`|zqku_b!tm=9aVeG%4P1&6Z+Ci4Q z;b(vF(SB@qcS${R==Bc7SqEt~9#|LN0s-tX_xpX0+R15C-S`%NTgT?8Zt)C7L~_+WM`=_Zs|TK;L&orYe}A_gptE(KBR#=x58;mA z{%D=oj}(byiju|F9xAT!wbm5^mCyzXGr#c;GJ%vc&nO^Wfy`d3p9xmc#2)%hAt*#- zkf+F7vl?0=M=F`1;SGGLC4#wFMSh9kE_~$Ya7$oo!uw_w0E@bL|2EA`v?~t4v?PCdi75G4%o5|JSLsn2G9c#{^LY00o zDjs;lFtVaePMe16(va25hk@7ITClS|x#}6%`vFaM7;N*wLu{(yj-C^BNLTcZBW7i~ zxCaldcI?fhR@>S}S3kQrlMZ*F)qHej;4AM;CJh_X4Yd;`^;Yd|XtxEz_*3&G6#TNq zD(IwW480)n1GMe8wLB^ZF@n~B4-Mkc6@uJ!S`Wu&rh`y%17Q7ECd;r#4x{C1`D9N> z-F}Dw{xkaIvE4pOM?44~QXeS)3}F}0x2mNMRxVvf!^J=5iH39FRmOTune~`~E<^`d z543q9nLltmKzLP*IyS=em&)iWX=)i7dwh}z6_lHXTz8kRRMi~Ao8-{WB_K6>z! ze?bfH;=<&TUn+AKo>en71pIthdlzLi^+h3W$QLBq9g zt*;u^vBpE|>&C+k{DY|__?LlyS?g3o6#37{L!kihoOQgBua@Cy6|$g`YJ)V!;V-Iw z!4Il~HBfaC&;@)%?b${FlBjP*+GHn0A*-R(R+T;$DvmZ-lago}lz|hdpw&PS6!aSZ zP}-r=94^`+O4Lro1eHbFYG0!&@Ug~g_=gE6i+`}{4pklXbb*%CbvcPIp;AZzx50Xs z4N>-NC~ezQ4M)|LH6|OZ;7Q2_<$g_n8RTFaI0Si3)gZ9L@1~amhQ5b2G8>{@dXgSq zGhBWgqNTE=7>5ZRt_Nv^5?GRos=>(yzpO!TAthR<58)c}W!yzTgnD~~Cr+V^`1b_< zeQ164!8-QAwoZL`_?MecpWTp$AJoH-H>|l2PoMnhx8Gm>{XvbNe*Amm=Z8OA$3HAT z{>?h~A@ig`;AcPm9g123_zDJp_^|S3t@@h{pe+2$!M|1b2d(p=Q2ymNczkW$`QQjs zFT$2-v1Hh6-s1^n*}68GX4$$LMOM9C*bI z%hr>TluDWMo(nTrN5~frB^M_JLjUcd^g{Ukp@gu*T=#=$bsmk(#nxR?8PuUzwqA@R zHu;WM1g1|{5=m=uVmh+F5z~_SMI$zG}QYVX}ltvyl z#&@O49Zp+e+`45eca)sTo!LE8svI@M4lQNWVA3mZB3kV>oXrM$G1lJzH=))Im@PR<)Y-NS-8-Be|ZB%N5==Me?{~^9)<)^vUaB`1ELPoz~wD+`U%c@%@kcd-u?E6q7u~t^9+9 znic!=KUxOVB7K1A+;Ynld7UA^8RLEaLv%!oX>&xfBZTt58Yw881Wb`YDnVKo+#MKy zfI}1C|KPO!-Nja~yV=@oEnMCI;b_9BzX@8ek4F0EQClcnw|+Z%DWmArY186%cWZI2yQTMBQ2fq++2Yw6317lr zpoFHs(E4`7H^n28;y&o8St%sxi_!F6e;XEp#l%I*vi0Mknez0bE+bJm$Gv0w(0nRr zA+Y+EuXv8{O7YS$FX($Cy}Rh?Va!YR2HsY;2eaq^2P?&0zb6OF%hnJ7NcLsx=MRT> zy7ahqz8o0>t4A+@CTG4LkWDs0xFVSkf0()BRdGK2YZy3QS~`cxN#)`iZd|%;Io{X1 zxZ9j*+xNG7-s0cBfIzpn0wRJjz1&G5;R$G6+&-t%@O5lRb2WvAoym>DalqgEBXMfa z$K~G|Nk18T7QGKT9hkE`K-ac8XwO*Psz~kp*yQZcE7x6YHx5Y77op0s&*_} z-=)!$QR!lKr!{D`VU2UWVLn^X6MY)3(#}?m_Wfwmf#-Dszvtt#aK+kc#qS+x86lDj z8<=CAgv|t?m7d@JNHX4$a?o!F_?NGjWjGb-tm^sE$`G@)d-?22dNYsCb11#XssqBa z&@Io7M$b|cOA0^!ku2^`Ymdgpvh_G6pWpX7i&>z5_WUJlP29^ef88BLUG951HJrW~ zMP#~pT(;Inkqv?XRtOHCrrI)C%N_d`S z>o12BkL3VpK$pLlmq*DzWE*ZC4_WeDm)@(foG=@Z)4BbChs2Z7SyYe8d|CBBABkMz z%@A9r_5EL|w6wwY=xEf%R`8JyRSqN04+dzcHIQg$j`zvyX}NP;M(&4&!wDl}_QfBf z$4?H@=g0I+>D{Yod42?Wr%%f{x}@rBDdgx`c&y7(f>EG@{q8VW+!+q{@W`~yV`P!y z6Zt4i^}6kYBV=$)Y-@Z|9&V{T8663eK?nOJ=of zo~)*+XJc};Tf5$%wYWNf4KpcQbIra#Jd3~QL4VNmYO9TBd)CDdeBjsh7x_%_$_L{F z5EphAzpdZ)=pxBLp#tHuHJgC_`8(J|OqpQRAzZdDnIP6{jAd7w1KM$#$B?b|NAiR( zE(~L3$uVX0og1(tBxx@Mk#-P?poAT z`ll>B@O_Y{Ki~`94F*AP@r`#NXH(18jX1J4*w^26iRfr>O!K1bNaG%Mjjq+ zSjRuq@&u^hzyNkRs~;a)6Ywmm@5@M8TZVEP*4H0Ctl*zj{8Io)@9?Ei)-_T&MJer% z&#p5c(zx^Pha>P0)Up8;{|y@8pYZ=|=+`HUuYUfg z=D+>@-~IjH1I=Zj`7NY<^km_;M@ujwl?I&KhW*oT*69zMtRQQh_<)fktn(jOgHP}$ zFgbwNcl>?S^F8@t3nug-G%0%9IPsz9_qPEU?D&JB_0_M|@n3(v_slx`>#q+!JYN3w z*WVsmCx89*L%;N!_4TivN7kiZJHLPb_a{HY&vW%-9s9L!ef67l4Ey@G2k`Ha_4RL$ zZTPcBxm_hynQ{E}8K)rXD4$}j#~4^S}Lf|MlPN z)h{3X_R+t5{67f&AAkQp{_*$!lfeJ-kH7z~|M>g=_K&~+@BjGw|5f=#qjIsax{5z* z`14TytN~pEx(4(i(1$=DKCIjpA+Q0BaQULg(DL2wsi|b;N@F8S+wID{{&rd&`lG$t zct(@k%4M1{3$7a80=(#)q}{x7q47%oy_SFfF2p*cehSi%e@!7YW$ny*m1P5Jqok8P zhG}?ZMk>VvM}Hu2z0s`G8*W_$+c)*&;hKbXkug>qxWY>9Br`5Ufxa z|9mW&X&%?rTBAt!Pv@jF#RwDhNnOCakvg&>L=)X2A z55`m2=E-Rcw<*+?>?@?}Rql_aKgy2NdJ=^K`uryn)b-$}^4m%2JiyPS2gYj!x_|Yz zSh`w`Zm643D_@K!hn-!aYF;G#ax7tHR$Y_Z=D|;;9&4QO7UhHvCk$aW96JPxW-e3)(pwxk2{9ZAN!FN z?B+Pr=%0<#L%#91UyD=078N#SpNdN3U;>5fQ3&YDCrk_Tc3J2cWYnsgqdo4}=cF0ydvU73(n%a% zsluQra;SU_ZZzg;cvC-;g{ZD!m9ye4vM3MUR962ZPcXoa_K@aK-dH#Q2<5x!%oa@V z$I4yMhgls>iRA|&D&E6g{ZX#Wyspqk!EmNr#l$Ntz5$5`o7E!OpOKmHX@axP1245tozy`Q7)^C~27WqDtbF`Pok-(pmCuoGMzCQQmWS zEbYCBccv2WPhggY&z&fNN-X7mFFP;>QPH6^wibN+z7)~ipA52olD+G3jiywp^4KS5 zn9yel1??iJ=cn&aGtfZdNR%d>p)$3f1)(mMcgGV=nz^cz5|(Q1W;sQmbKwaagjnF2 z1*hE*Nu<-O%moCj8^mw`fe+F++Vvl`k4g`D=a1E4%V}Sw+zz*A&0=GAY%|_1<1!vn zJQaTGjO_ThgB2SpV_bTjGy~lS)7yEG-L(@@xs1 zsNcwk>DU{paRQY)Wb%x&_@I=6JJ<=_$=`R=xmbyt*qhf^zf1a)=np}^7t@a#-FE!Y zc}za}i80@1omP5IX*kL{PztZB$zl{kwthI0sahw)@%`J8END7TKRTBk4N}f@Nrzgq z@#}8{CY{Hn`lL>hK{S4^BycAr#lc!1n>){?cyqCJph(xuPP7+~F)@2Y8J^j2+@8Rq zWTu@`r}L-;T0!?F^R#wW12YJ?v8)l|2}Sv>{f8du7LtDXnJ~2$IsfvfQjNE0NLJ+W z!8uHQl${)V=F%3>PD)s*GMJJ#>8Z4NFSRj;@RZstMoSLjU79>@^KB@rS#x>)e3 zovR|65l%X`Ix2pq&ACnQ4?40VKh+7@s-%ucUSn(4mp?PHR>ntXQkQePe?C8I2o>zH zV}onzv4y5!cH9rmn21!Q$d4QG^Q;uvE~jZPI(}<)MTKY*fjmzl;3Ivhm>B^(MvxpB^VCIPANI6 zY+iLKqL@kY`WiglX!o;J*vjh3gAqoO8Exk8P9WBMID0c8c${Znqpdj3)UhYr_~kr{ zxIadq44)1LE~aX)j1y?jbHPyimGa4s&k89Lyf?+)=%D@M_oPtr`;&~CB4E7tJzVoV zg)~NT&KUdneJLW@IZx9!Ja~hPfw9xez+?Z2SHZC(vb$$f2i|Ya^1@-|Ir*T8&m778 z>MZY^vr&o%6kc?Ix>bt_G_btZL(TW6DV;iL?>ZWEdT)XZS`sa_??b~7LZ=azO2i?8 zycZPYVCk02R3zlGkehd@vKaU4n1zOImYEJ>9U{vYhS2qulEEV%GSiz{bJR z@Od-t7_WGe;stx42GkzguIj+<{D>3fostynRzpWnc_AtIer>k; zlPT7IGR4E6O!3XwcC$!vlr|E~uj92F5_I8p;oMq)mDuQbtW9G!b`a;}JhoDfRiMmH zDBIZHu*5HKhQmTQ_L{LR^JnklhCDv;RNC8lBm^hWaYw6`)0B=Yqp?$@@V&#N%)XeI zbV8mVPE0t~0nCG2E9-U}{k(j)b-B^Ro%sTPf=_kK6@tI);plgRTTd)}vL}`~V(V|C zMmMiqY&84$lUJtX&t}>kHjrDsInG)%oLH=OWX#4Xw)b{mH|i6W4|y5ht#iwYX~5;;LDTt7a{(nzguU*5ayJi>qcWu7S0<2G-&l zh|Br#>k^}Q;$d6^595!1Sb9GGw1@H6Jd8i!VO-{iaWNmpC5tor=IaupDA_l0$-aq8 z_Dx)}Z%UcPRr^g`vTx#&eG`}Lo4920mwg+Lr#Rzpu3vE-{KHzKe_bU0ky7;*xzAm+ZT5qs)F+f>$HBsF&YIX?`Ek z|4?MA)9I8VXAUzqfrV12OXVqHI_7za)#ytcvXMDmh~q1)m#doJ7p^{{x!0&-)RkI{DbE{y zFOJ21@fWCt)CRQ%6SOLb+ld!uyO*RV{w{S+<28YXqSP^4;JLRuLWtW_YSio)6#L~x z_Znv{)kFBE+XWN#U+eb~>!H^QE$tk2ZD}n5UFWFd+%2ed8XnjCtudY(w?V)NjI4he z=rvkvQxR32_VBCoq==@O)EJm#H zH~f$`)r>x5WDWN`KlG+jU03fnisk-7_jo;_TAjrk*Ldu>!#;1u5VwTNkk*YfJm6x4 zpv!pIXNOxXV14vjL7?|mk?IqFg6bdlBE_OYuf^2=u8%4Ask+i)L>*+=P&Vd~f|Ply zzBWN=%Ew}%92FjI>HNncS)KSzL@4f?G>lE%`FVmHF|qH1CX_Si4P752)brt}>0>I^ zB+|`yc=55cyiMP^_w4*2+dqPPV>9^CUc!BsPWf+b5__Af>ke(jw`nwQyrs98ZR?M3 zQ>uTa10k%G34BCfknW{zPw!UCx#z7t}!Sn95i|1T*#af=xHcfxX+;%3BD^53(8bmSdM|B#Em0W!W3;CnPsjOI^056Lqe< zqkbH-!KDYw`jJfch~#y0+|>z&NlF(~(BLb+u?`=gQK|YJobYv8@G4NbKapHN93YAl zl*4}c6A9`a7#Qo2JDY5n!GrxT-@}ab(25!|bCu{DC`g2csE-DnqIqKl27Wqvn(V$| zB2gP0(oYV1$QVt#m=PiQSj?n31GIB28s^S8^sd5w^dd33SYi0Y1oF61f6mw=4aW zzuTsUqbNmBO0##|Y>2)~^}b=8Ey6Pi5GF18 zz+I^8g={`@t{Ix!s1I>@?>T>vLVPMUS*2QLZkdimtysO#JUAN?IzQ2@9S%CjspA;! zw$ce6`I(Z{*9qX~(3tYmmw92qy2e!IQ5j(mfNrqa$s3fUyhTx;!K^={B^%q-oG^Kh zV@4KslLbTo9y|jX56mr@PP*%@7Qc+hMg$*Z>{lkIq78J1q0m4iRYKg_;1eEucFrZDXegicXN|(4bQOpf1^}Z9G<>>9g7CZ;A((aefL$?lrdW}?doi_Gqx;N1}3#^YK z7DwvXTjt4kD}JtQyM4Ch?qE+H<7=7$IyGEFuGQ1nHig4Tj?yT<+#Ui!)>Z4+ zD9|2u3Reic<9On3Eiv;{7FE3gh@=K^^74q{N&PVF&_V%obS)}gTt$34MyR%Vs-y0z z^`nCgG`z)2IkuBOR=)fXJocdS-I>&g7T{rAhDQxJ=9ka#u&gQ0K*id45cI1!x(n3n3yV)VrYvV|ckQRh zpi8@34pJZk**>2*wm)hELj`}YDjN!Du@5ry;FoC7VyS~gOAx+yCJ^)+G)gBtX>fMn zMjbyYTh9}gdK>b*XNoAUo-~oFcJn!%rueyy?yfmnP0}A^J=c|PGD~-v3k9D-`?TXZ z2d#oH(jIT$uiCDS)x~gJ*uC9~kl2L|E8Q7JnlqAaE2a%gaT}KWRirsQgI`|AAq-b` zf{_D~yByK#xl<-GQmr}$seIuqjXD=%eJNX}BVA0P#LtA`WKq6fg#NIZ`L(jQd##_$ z>AojDFM)l-u84ncQ$5&ZPX{q1!>BG1w%gw$G%;GDM9(pH%9Qm}%(HjL$%rqoo(+%o zw$V&ydC$&c>lED?;RSj*Q!Azf&6q|0`gRDQFpi9y_L3?TG%o1^2} zV5sw<2q{H4Q#~VOSZb9~Z%51xN}B7Ye7O{HT+l8ke#Q>U0Z-PZ8{I?reLFfvK{^e5 z4Ssk8K1C2`-^&6W_GFS74F*ru;LJ%7MaM`o>Ap46b&{}l*Q7hFQ}^e!v`S2UmbQnl zq_4-cJv{x&a&+QB)_*P4?<93J5E1O1bAf=O7i`$r4b@q9ibU*3?>SU$$^wH(Fl~#j{HTgLSEfm2`tYn%lj^^rQi$NR zd7y$OOo~u-U4(&a9ifc#ikbcfKSQL}K}xr9DhN)KhQkw?h5&Bw@BaR~uUDgJXPPIS z;WV&E0%j4VN7D7}E&NQpbiq-CKg)A_0|)wI0QC~a(qip{nG)7(#TnC@L3J#5k#%%e zzfeMRe79=R;3tI3Yo^0@h|TmhLm91o`|Sht0!gvX7AG*|N(7h(DRTt3dynZLLKD5n z-f<5IShDQ2@Or>9s&XF5Oc77gmOVdcBw$)PV46<2aLai5*e)g%d!9D((I71d+Vg}U zU4R>DZ1yCH zpv&s@GLgzKxy(`%sGL}q%A7PG&%x4NX&f{Ei;ZK5HX?1D{+OEQf-4Pf>7@Mpv8(3WR2E?ix+0S1g9-5|WOcLzg|;DGK)xJwq~e{Y2X8V6jL>Qf z9&Eij*xK3O-rd=c=z0<0=Zl{ebZ&wk^p78?n{^e>_q))2z2&Lg5$gjDm{|GM8HR_2 zc(90-zx$6o_Hw6q@b2UX;U%Z?$vM2O&Fxx! z{pG=de9t-0zu4aRbLE4{y#1}(-p14Oo|LNEtbBStum1eyvxDsyQuOLrqEO+_YA<&- zo^I`l%y?dkt=i6dZR5}Nko5Lg(iG={57sv}icV7E2;=TV#+FpwGZFMB@tz($e^x(` zMmdN7=dIWEt?v=V^uvjKMl{@$(th$@c73Pzd`s4{Non>E_O@!z&oqrOU#|aYYvVw~ z`AJ+B{MQp%>fI-yj}jTeyeg^u^1Vq%okWu@don7c($4nA84@OfVpKAG!Gk7)U_6Ke zV!*W;2KN1lDYXDEYEQO``Qe-db%d%dYDrTa+sWaB+OzeS&x`&yiCeGj9TeU8ycFB} z2jfLKo2dR$r2o6;rP_-+%UK>?@X`5fW_|ACFAtvXMtyCJy|MfJg-jxx)$YG1&F;Q* z*n8(B*sL9Fo%@E(?fs4V&dcZPlEH7zPxIng?R9-~Yky;J`vpt$=})BH-jGCJ{ES4b zo}Wr6gXUoS;Mvx>4e1Fr)p=F5`EpO|^1M#>WNT;d{Ks`t-rlTyd`<$X$NIsZ%z69g zHaH5f^W@wDX!*~pT;}bqbzY0Ul)g~6*PK_1ANIBn-qT}V%jzLwP0X~wD@6nJ(jgZ9 zp7g(+9huO!zu!K1UEg?G+mWFkX8J6Dz!T2TzTet|Gy%CrIsG()z1FV_d~n?1J08?F zHn#Tn>l?eZz5T8Fvt3ErF4pO)?moy+7CY4=^Z#2;>*wK~`{^m!bxp z0vT_Je0zGiHpYeucBs|?k5YLC@IXCu1^w~c2O+KCcq|W@ij~_pi)+)O1q(pmL8(5)#`Mxy!FP}Ww z+CSLZETjkcde}G`WW9{X8%0%u0lyEG&jY2OrmZ6vdgOh(Pj(PFegDPQmIzMO$?1OB zTCbaE_2F0wEz~pV{x7lkefnN@{rT?Z*0VEj(L~Q{uj(SsiU_t}bfr>?7ke`2A4FXs zX4<3m7b3{X9I(A}fT~>m`DsP$+}V5r{n1#Z$I0r%Qt^7srKqGY6nmEi(%x6 zG&DVfUScLHW>`;9(wY2Zoa=j-ca1l&ad;!UtB=RioY|;EEpT2E`FQ9}$iDXW*|gcH zkBjt=#yOo_56rZh3sKSeIREJG_PVEMzj9FAbmh^&Fm5h?Ccbf$r~93R_lCU`hG=8_ zx8GF0I!oieQzX{CT79GTOosK7qW-`9S;=3>f`;Mp+jCNH$Gh6Ng#T&613EjL4c;c} z@-u`*=jx3x=?~6*II{Dxj6Fr6?6FK&eC(GK9uo;+yBzK;np%rw zHf;^1SD)$gZ-0lr(o#+8`xCexbD5UMVNn>S$NerA@wtL>677|MLFEDmaZcjF^KuF0 zwkf2*D;^Zn_B&`VV;YFgQx*$m^G#>?ARylQ2{twQ#sd zKdYgDk35$8qfn=hphEgcTZdj9aadVMCCYa1E=95;OD5o^@>Yoyv{Lgh(>=-&n#vFK zV{z#b7UWzxq3#~#ro`f?HemROV%83<9yDsr%{Gi#(~}^ehBVIhZ0hfhvao8MNkxlT zsFQ{dRs-8~@TmAMz52n6>#V;ZD?3N2;lmhHy7;h>YIjmoK~3>PBdVW0Qy)|sHG@2> zI)cpOLJ7y5FCc)aO4KDRGnLEuyQ)8Hl_~txhC`@83ABO8^*B519Pc*&ssP?IV?Zr| zGE{&Og$|XVc%gO0Ov2dDln>u(g&~Qi##`YT@aF?76BbISRdn zYXK`%bHXPjU%lm-rhmKY(>b^);}$o7j=P=4Y@lo>{&L!4w6o}G*J5^@9p+{U-Pc}D zD-Y7Mfv3m@V_E{!PS3R?<>*|!4E@C2TjS*pQw>@=Qzo4pcQL)w-8QMGxS`x zHnwH>D9Fels*q*r|J>;PwWB%Mt3>QnLt{&!w^-JdNx_&RzM}X}Ty`rU-!UIxUV&a$ z^e=Gf5w5mnaFS|Tp4Svp;~HtP+JM${Bpzg*SY{Ae_`HNK`v=*}UPsmie+3mavzqFg zhB9%*JVn^3}U{@4kX}n^`;U zVnhq|K%!d)`T9Wt0Jp0;LU+GU!O) zG7zX=3=Y9Q{F;AP`FD+fAM)=v{QIp8*uf!JY@kj4#Y`QnQiL%047p;Op6Aa-qu*$$ z+CNdXTf@W+)U*X=i0G7ih45=+E5C4NXe7Q#w#r+wXrW33gsS{{V_>-~23jyJPy$D{ zBC0_wD|LZXWkH0BR90=vSgq2jUbQJpbyCfGvWoYw5OT=9o#tqmLgQtsk*}-54I!qx+{mAF+VTlG zhjts<$(IDd?YyfH<+ggvH1hpXQ{y%Ww}oX_e^Cc{tJA3?*ajL)BoHZ5ehhkF1~p=} zXVL*hY(GX{Jb0Jsf_4+6(!gT$N~gOHm}7txf(tONwqSG)d$s(BG=&#IV)D=+;So4g=L)3-GC`uE zLbZ(7AO)m-^V|VF8qdxrDWqil5;nk$GPx$t7BJg4m*Mf;eYRX^z(7uVMPZH>Q$tRtkV9(s?ouA@BR@N(x;qxqqDxb{0Ye1o8FTKr8!tN!4~_|q&8uvs!1?7iI{jI0ER2gTljnJkfNRzm@n$z4^&mSdVW&s7L! z$9)V-0c6~z7#Y}z;$va`iH{v{X+shnsIuTVC^Ejx8#-C&lrYzb$MaIauqRZzJg4L; z&|U@sI~auhkjL>;m~aB~%aK{dR5V+R5YEa|jnVLk&>SGdOKz#fn_%3}@fWl4B>}Nb zlD``~i;=Mh*mP-eT3#5P;yDXPaxH+hLmA7@8hUl%#HiH6%tZ#2dYGAFy(8+>?s5b1 zcBFv#c_c6L@H^7r4!UgbxNM;5Bk)?FyclHYei?P-ov1VJRS`J`Fx0qXzz$Y}W;Q6g zJF+HgFRT^wjkkvo-ejGG-tJ|Q8aqgb19vk*S#Pk#py4BxdBR?E(g6ukPAk7?RxUJG z<=!&R3<+cguOI}eRDyeDSl-+B4|j0%0ja&M6Hx@9w~erxrGbvlFNRQK6!5vb((a0 zf_FK6`pzVdKEx^#5nMXd4S;khC$m_HLVnark17>@$7!HkyKq`!J;oaV1|QF zY^}XJo&YwP#+#3MXvzjH%kZvFGO9Oa!KhqnHZl>ZVBx;hge#FG-Iumu@I4g7rIooR zJalwgZ+f`8l^h1{CF-i1SS{3O4>bL`(xh_B%H_2-}HiFmyB!RDT=QS z1JK=u0M?qI0{Ikho&N#pM&c^KmxC_qDo-&V)wGDHekIV9Pj!MX3$4?VPSI*fCasp8 z!CVp$y$DMrJ4f2+i7*7w4WM0=_Q=gxYF?@1- zL@DgeukmM{76E2%gU&+YK>B?P2A(&G^V~0uZF%NNe=KvN?5ht^HbM7obEui@GXf#C z6^Qd`bHTG%P`s5u=uvCCnLC3bda6hpSKt^WOv{0zWs;A8^1d4MrfWC)mm1U{$e#=?}1euyplv!eS=*G7} z%{Wmyz`o24mw_Z&OyKgBIBCOQSt9?2=Z1~L#_@4OK~+t@&}>WJYUedIQ*zsFp&v@e zI;=^4huXyj+W@A$TmbEa7n&V;6||nGSSU!X7jYl7D1U5wsm2Nm1wl>f1%DQl@fKqY z63$FBSjdxEvX;N<8oP7N*k&Hsp?tqq{uRNn%1k$5HZQeL5-jME5WhA7&l*ONz*u_d zS-IXUOzy$g`Ee2KJ?nw4mdx-T&T zB|5sBSBeFL=O+SnorP){cNZ(1H1r9}z`t!#(c(C6P6;O1%`^)u$b|ytfVW3qa6;`C zg$dq(4EI8K*84||=*{8Sh?O4`^c?BNB&xQhkWFY+B=$4wKTHI;R2IMVJOYY&JQx#pA(%` zR81K#Gm3)bPzctu1&myPpg@a+emIhKh}L4#y+GhSEpq9-0R^`Ldr#K!oPbaFpBeP5 zwvJSpzDs^|tXw6$y@^K!P}47hm|!7xTxcH4P&@9+pR6ggERp>O{{B&(ksqBNE+JB> z=^@ga!j~PYKP7d?9 zYhGcT7Gqm(&+u&6)3Gh*6xO3-Po`V_xd?ex!m!~`Od4lO!EPUQgYr%DNB5TmF)J@R zv>}^M46|7$z!-4O5p@F5jI2ekH1(8JbIrH30sw0D3;zVfDLSwK}=NvXSvFU}_I^box?9n14qKO>=LdH-z6a#q#% zB+x9Dn~)aSK@Kv;%$6DkDZ)%v!xS*1%IgF4+KbHrwv||8M3$C6fQDF=MzYPrsNpZD zqqbD~sBIQ-0zJbmpNxl5TRCkTQ#6E=Szis}?Dn&o4XQXsIh8qy4Ej9L7F7_;Epw{1dC4c4b-(jfO{M_$Wx*%ZFdy2SCrnMC2~V& zd(Kz1kBDI#yJ`Ac*#LXV?z2q&!t9abi-tjD9Cy00_ocY)L=I6vd1`YdsCH=~cx z;EEEAIyIOg6|%JQpN*hPEbGUc_&G_DGWjsg#4 zJEd>cK@eA%ey_EUmOc`PZj+nKHVQAJwU+{OCg9mhd2$ z&MN)_!FABq0fFA9-6L8WGY^lDefYvhrG_i*g#zX|k@2|8xIPwqz&wzTQ+2Jl#PI5u z@pn~!P?_=rVP@Wd#wi8hn@w($XeWt_T|G2`s94acn^eZBZ8F^qTdWy?CNq+(md@7# zxSil6x{VvqB@j&yOjnxah~oEnF$qH9TtvwA9ok>{fw?|_Ip6O-=bT_tvtzoVOc9rt z8Aqh)aK2|a4`d6r`U256t0c^i7TNcye1gJSB7HN?SY-EX5AeF{7p=;L)~ftllYbB8 z-#3-3t#7_&-1`fyN0m#h4TQRHZTDm|c%@~2?ptQ!d!hBJGSzCd(jyGn%Z%|_S>z8^ zVEW0FLXq%QAJgA$!nK~QKRREt>E_7sWob$=ndTN8N>!ojdKrI`Vil<@le%@%7y5JA zC&~VGnj{{yYHlc_64{xT0_by?GSw-if-sOH#Y{1fU}*I;?Lzhm zT?L5UHhs($MS(LgZNj|rX`t$zk&Y#GW*y|+qFML*DZQ@feVYayFH8q)t7==i_*A8Zs>G{O6!*Vj&bJ)D%aR4_uEyu6+C#gsLY9LFYG$l zQI%o)5PrN;jvJ@dDD4AGe9EHkY{0n0EIS4-g0c*yoKchnsb?WVpbN0*_zwdp)^SR6 zW3-h37MX>&<;d-y%u!du6Ghw{H{^fyEn&oP*`cpi&zw{hyF%RFm=5+vJuQv2Z%8v^ zgqNKpFx?m%85~PrLH*))n+pdaYMCk=ZgLg1&t6iDF6Txn9QaKnwx75z6LIdNaT+#8 zUsm5@Bu?aGnT+_=aek7Gq(ek0?vJP7b=K}Ul)O%e+Bj_~}#jCAM7mVxV@$deqJy!V(h0U+6C^^Y(C^=P@oGjaEn z$PwGqnJnBj%z@NTd-Msg9`#8oIQglGNoc z$JGDn4SDnV_fJujeCtec=`!3@ymD06q=Ar7>}zA<7^Swvv!N=Xwvr_jFy$$oU`OBN|>N{i1=$&Y@ z1G+JVA0fQtWiIkthubs}eOi=FdPRAq$KkDdPk2Qwby&Uf3vbMe1_qsw6(#8Q$u3c^ zD~&xzZ$w6|BYwY7;bd*-$g@ThqP8Kf-!o%4{2|{g;O$-{$;UqhT$vmVxRhz@$SB)wuxjh&5o(`mAb2RQ|hW zYbyMG!<#v#JAO&lLl=UNCn^)q2NKU$&@&c67 z29bj<`4onYz=W+s;}UQ8uXBk@aYpoIm0{+vzAb?Yr=f=;T6PdnwV+^#ALfy`DEKE^Z~Ym}0R9XQ(L8JG9W&IE@ar9Hzo6Cu=A06Yp(tQf7e#QD1^L=ttPhWEqRHn zcwB^r#|5bCw$e^lN+N%St~+EIwYsC60?4h$vO~p{-er(-`F8x&3I#dhMKWfWzl30Y zrKNYDSM_(*fi=88T)oaJjQb^YBO-cDocIIV4*bcV)LSNn_ZmrOlzTpU%XC|jeY!St zr}Fd%yrdlVTHi+(6ubCT$}0z6d*-r_mJ%EF#DP<(*|t=1yDOD+h!BJqTFB%`uP!dP zju1cMih3B5QuB9%aYAJQh%lTYP^k*lOnPu6Kiev96{Hf>a*&2V3S*U413Se%wt-^2 zHk&Qr9Hmq7>V^TepnWpML4jc&I5FEqmx8e?o{`>6Ha_N&8 zlE{8gQ|0_)Oh&A+K@B7Cs9~`rW&((1R^aX4hU&u~G<5Wmrb=!K_@NgXVre!WYWfO4Q606n*73>L|l4)Kxjj^ zVY^b;Zu>>>_9AAbc$ni$wbCV+8u|w$FlYl0}LjuKOQa++isssgn=Qce>^MT$MXO&?Gx4txc%j z7AVC{rBbqCIL`pS+mkBP+$qT}88r~g+{lE6s@YQ6kc+JC^k|1*<%?$gM*_% z_Ri{-XHQyRd&91^y4nrm*oXBIh;g4=G2%d^0dH%qDC|I_o9TR~g~R!%HiESXV^<;m zuVQAHB|E#V+Rj+_D*TITF`=rYW!E?&3PO0^@50`I`1kf=x>wfV88c1@{W$E`R!XRT zw7x=>x&nx3aYXz$pNJhb0c^@xop;F8*IH^*ZHZ+q^Gs}6n~RVdgLyPNtq59BK~;rPkQW6;#^In=qHLX32)H{~ zKYjtt)-^?Jnwd5PR=^4dUjVK1!}jD>iaqb6I10kYDcN`I3a2esY*PX^bO9cw)({Y$ zG$%WsRd9e1QZ_R5Ar-@J6mVSs3kBJ(RtmgmAL2y^?k2D7_qDx)5xA^i16`&SG6Tw4 z$Km*urB3x0uyvGmTCSzN6k~{ih*rvYhqItT$)dwh;v0GwMHuI0c7?vIlvqvJ9?+Xu zh3$%lupO7HiJy{LogTK$8ADS~DTWwn3Kb4Jh!-C6 zt_NHuYrT;l;`ozPN+=dLb4f|i9XB%r&1$ogzfp;bUpmm@@OuWPL!`MC-BLt2ej;OZ z1$PGaj42JxE0P{--m{J}^s6CJq$jJi!Sjs0RU-;onRlZZc6pqVS3XzLPlQ;?D|ap3 z+1Nz6EKSNQ2O`R?N;DAAoWUB*?IXn|TxaVCFF7Au6s|{_*I!2I$g9IP+FDiC-@Kf9 zs-7mn8Wob86{=|{&psT0)+>s0o9_0^o5%Yr$BRiIYR8nWzI<& ze!Mjy9M5zsT=s|8!OK8iJe(tUc~vlC1uL>>U5PQ%;kww$AZTP=*UrhhPtxI5Z#clg zClM%H&M0WoRo3N)?zU;XRiNe=LI^KLY@Duo2B|3`O<`)3ExRR+qFCN_S~SdjHkorC zht$o0$*78Q2&p*N%sb}txuHq%e7LIDMx8Y}bz+ts=^d()ey;h;l*PF@VBACM+ZiR0WP{8V7C&CfOSkEW}jiSzFxOeL54|_)!YTJz5!|KfjtMrSQkklbvJ#UmhZ)i~(>{E9v?9r5iU>NA z7RV%a2fJ1{Q{BY?DzHsxQECR5c4r;hPI5LS&rgP}BWkW%K{Ppx!t^Bv8SGLVhGmMw zuU`MF!P+%7`+CA}&??2;mm$DLOGn~tE3)e~BnkkSSjjoN8xbrOpJz$()W)a zKs$E`ca(>?Mt*Q?dL2vP9cI~KH+}Hq38vK*P(;v7^HFD*KR6l=Av*}|__TX;+I`R( zbS*MmOgugG;KR2gGIM<3!H~Z^kMlrfg5W@Of1|cjxqoizyaDe7=wruC=>Fl%T2B@h zjkJ{y)hW*nBb4^)oZ?8f6AgdNl;Am)DIwAZn|9i(0(_1693TYtjFy`Gp&WI!Wl?kQ z8!)D|RM<*f(HMO!t^5WRAl3MhO#sO?gwnxfeK<>-Q---Uyl$9IaIU^Fqf}093kHV( z%8Cyu)d?t)v{k?*xN&2Seccf37aA>BEv5>ycI99t_D+qcmIX>2a84&sgIy)p4WjCL zW7@ETj1>WgsG5nI@y-@7Za|4xbK0lsg8P}WpgZl_AT+Ju!J({QZ>V8?Q&V;58De-8 zt`NuQE)21g_0wK%UJKKHu3rT$*N;8q+$K~}rFWSJ8#^M`+aODVAjGVHVzvXn;rI`Y zH)(s+HHmiF$=y@ep}eQ06U1n=b2q97hMw6Mv9xDzAV>p(7`Hnl$I&6Mz7{ETl9>-U zXO+7p^dPH+(DMB#DOZ(+68cKNo%r{>@pa5gCBlmt<1Yq$LubU5h*17Ckx5OkUT%$h zbHluR+@}i2f<-KavuhbnN3&FT7JEj@S_q< zBP_)_v*D#uTix{ROX)uJv7YF7T0QOyZFA4a;ocxF=wzl9`0hle7F_1BUaP^0u1B|@ zG<{z(48AyikX;#vOi$_$(>YI0h->e$3*M~ffj==P_u3doy|%32bf-!95G{${;7_q- z@!5>-^>W?Ov=)0A4Ac;_cP@}1;}nm@2UMD7aIAV;(}uxiOaRRyx1|B&E59|M2vGYD zhq_dsOgg!7h5Rcz6aFJ#(Nl?dKv5_PJRc#DMOF;Q+`X3$2dXTjG==~v;35n#)pTMt z;*}y*xWc%5mKN5}<$~w#Z@tWV6nrhlym`vRtk=O(c|9fuui_|Bj)0khxm%8pK!c^( zUJ6gLvcf$Pxght$C^m&GLr{5G2_UX7RRWy}w4o;*QIXj}vz?f2MY=DG5kfbl*CPUT z(CGC6^#Lbm(dqF=Mk={@)YzWvMz@@w!3jpM@IG?Q7}EGMw_9JmAUhAsiVmM~G^r zvEz^wxyK66Kx$ZWB+SKLwA@XWbY;}65Kz>%sCorgY{K;;qJyuM*4Z8UqS1J8!%&$< z@JOg7l($g+4hp_25fWUjI*pFz0s_^KUZNl91iQwFD0`*XlBBcLd?5J(9ig>x-(?Gd z{gxqwXAFnh%6tLiB;{HOwUhQaBkDQce82{&H<$)lJqjOaiVcIn4eJd3zR*KUD|P}C zSb9eiyMt-P!q0My>DB2{Ok$%<86^+p32Nq^IEU^Z5Ad`LPMGW-3#Xyk;Q>{WJWFzal3V#*iGetC5 z2xs~oGFNMH1c;QGXN{ze77Wq3htO&Pt_A+BU$1G=%;n;I0YhEb-$Of;JE{+A z?nobJdhNpv%spqRBaFtWYIACJe&Ed0p?S(;e0jUlaqbrOxact@<(paKKHk|_t$gkX zE|Y?J)Ip|C1Ok_Fqzm^bKK+zJ(ciFCx{`(S;=4wcO^m4;6&V*iSygF3T<{hH&oWvz z0yJHQ87&$7Yt;Q@tMI}$+lt(;6$t#Awe+@H{=&QY3<2|s0az7zrvTzoM~SW`A)s&7 z7lGh{0(XQs-eOKRYuo^ACydBNgUev2(m&lX-{m`5FzmPj`fgiau-o1YB?CA<1Dj!Xu;C8Y&9lxP*8sfbb6oVpfMA3F76 zO#Q~G->7Y_BJ>YGr?9Ey8D{rs_B0PY2Amk_+M3VJ8$#Q8)-_RCUUdbyJ4Pr4S~gyq zl(I_cLjt0Kp_;cv_6^kdaDF*Z!;7!Af&=b@OsHIW9ye?M=+<3I-E)p4Ug_C(cQDXP2*Fnm!MJXYr?a!w>*I8;dskXCt`w<)zg6{+cv?M9heuiB%KI|tmEGy- zeVg6K-I_@LvKq1*XHX%cD)V^E9_KC@cQokQd+sTvq_p63O~Ir`67!ki#*;UV31hV! z7EQJuUsL*e**m2XgR8hXC-8jdGsDLGGI3?o6I3V@&08vUl_SGh(Md@cl(*rQ?RO*G z4wb?+aY$>M$WIM-MZ@=%WrNB^;iC;TdGcc;;>k3bn9XfZa%L-Aa427Q@_wNv5p&e1 zSV1xgV%8~oF`>w)*=c!N`o>WQEcPw#UEo>?wYlQ+2}G<>H4ja0Cfgr-x^_cSO#J41 zr6gm_TP3C{K+y4p^`OGlfu}ULP-oiSz4mxbLLvAdgC%6)kUDTUz^yahEK|q($=1e( z8+0q4bSR3CeTbDe$Wz`3YDaf1LLz(l5|IwJ?JIdMRx(wcaRyb=0t|u72iIfHM&97+ zM;+1AV~VK6Zf<4g~E3cGR9Y zz@eKhmuPV>11Z;jGSmP?#@HR;%8#c&)+V>lVT4vh7Nx8LojO)|7*;m-!}hq@D3s{O zKHEOzg+;+N(Veuvj2dC=Fh-9#v-F;)T3Obc_ZYs?CQ6ScqAWYOrjyW^A~{tJPt!N_ z06jWxPF@e(5oti(K0wiaha>A=2_4JH1OnZ@u=B>V+Wx3XR~z1i1rH}L<7)@i>dl3_ zi8}WK$8X8U-d;`sYsaw!R#^v)rY%4|(+S01G9L)6OsjdC)SJeZ%MhL!0vNd7VxZVr zkK(~Yr#~XgUZO+$`Z$H!*VSbFgof1?L`8~Y}c)tzlWA`Z7f(<%=;m2 zmU#Yp>Zw*h>+V5%$BFRA}^bxK?Mgv-+E(ze8ZEkEiGV8Rfgy1n60OmXJ z)cpz|ooufNgzJz?^81Q^aqKc0)ElkVNFS*;b+0)Z41$Hl3@~#-i!=kXFc8R{WdYV* z9TV_^<0>I|#x)>L?5g0rDQcZ+Vm)lN;53ZWi{r6J(kG1u1xqC@8Y!r(FF7Gecu8s> z0SYf@?>ZI&^hp`b?bD3$*6CF#z(p1++60!`1uH_MwVM&*R(!C&TX4E<4Lv`NJXl~* zrSY_z@;xx?oHrbj6wUb+)!-CZ#TH@;6*~>@=YHy81lk=f$CzJ~8)?L2K2NVFG|sg1 zX=l1Mq+>;mnQd%=_({1^p20*rAgX}oi0yR^&CKC}^KG}}&zfeaB0Ir^#;e0Ur(JWL z+M}I;of0b%`pps2DXQB}p8W%1*|}K29Xn171l4Wu&K0~mXL^~2J3KEbhlg2?8wJtS z3fL<8y5F9vmpDp~uO?Dohi}HwZiklRrJGknpg`r#XAw06Mmaa2r^n5#8_I{N!k=^3 zFOJa@+^rHC4Jdy#=Yi!285?kz9Rk}T(WS4>l8P^V+1IUtmqeG6P|VV_GJF-F*PQ!& zSmoKk)bRNUIn>-#ve?iwP#U(3ay263Z_N)gZWVvl@aLht>z#_Wdmhd7!`3^8A!%52!h>u>eL9V?cW^)3 z=mz#j=deA<;f2981Yt;^b@{g;*hc?U{$iA0NM6am*OjTH zVHcT~=xOy+{Dt@S+?C(jonf`pqbrQR>{WTtb{UCQ^=A!P3>#cPrU|Kw?*Ph-Qowdc zOM<$944|!-b07pM)-dxCa)VgOw4CNaBvXBAo?y_7R*q^l0K~?47Qo|_;g+?SZi)xk zX6GfsvPTJG+wF16UV11p=HOJnUp3JQQGu12+1Uy+LvkL2;C%SzIK@7GzMx~eyjDUj z&5eSHuI&B~R?1|m9nTiDys`jfKMi_@EVinnIh1RChkFy&8LjyM*la@(YVgwz<@$wn z_g6ORBwCz0!?oApoTe_c>*F+fj=vpIEwFoin7x75DsnPg;g*S+FEkBps~HY>5LF+z z4#uKVvuwz?*SYpn>kQg2F45NxK1Hny(OT~PdAWc?_z`YH(-X)viFy~rnR24f`3V|e zgw<6RUMf=NMMR5`*PXI&p62_VUMpQg495#eQxb8|T~5;G=upaoAGFO}lC~QC&XDIk z(hTOxW!?byQ*Ee4=Mk(6gCEnMG91&q#uQ9abuXsBtD7RQ$Rx(tc8gAPv424cH8?s+ zaL4a>5$?Bg=Pb=5g?%5n>8APZ`ot(8V$&k+$gAj`12pffKoh9OYcVAVMlsR%oc6uN#prTD@Yh=Y8{d5Glo_MYgt>sVOWAui;~C2H*yIGE zVx3WVA!6SvGA}L${58`??Iqp})NWgM&lxO5mNK-V2csFE-*E;)6On^Zh!6zxB^ zVhsB!k99F0Gjjh{UPr3!TR|{~tk=gWY!K@q>TtFDVl?PyxgKMB7Ed~DZxibsyo&Ow zu!8vE;IyMB{`G1t;jn3WS$VhfY&&gz_sw_y+@G?hzlEWr$6ES%L-xA5dRaZG19bm5 z#X{{`2~-+4SmvP)G~KP-7F^mh*eMSZOB8$`EBa#d@i(i#^V}({PbvJDJs%2x8D%&? zkg+{fmqJP|0-OXK$M!d3tY}256bAMP;96f^m`8-MJhFGXG^}ed0eg{kf*UbbyvVw| z9t=-AQar3uxz&-Lq6aPY<$~(fW{;Urep@j!?T$OKeFGE>bsKP135n-m##&aqgqsy- z>6B@mC5f~36s9$m*oBGZGT=RhwXENpTuyje$0yxtP#bvQ@(^Hk8cwiox;1t6F~$Ug zG|Ywy+B~P>9p(cWI|lX$MR^0tcPqY|Bq(e$(x~2iGVO1edOI+qAk&^W6%eaI%%smi~w3q_Y=L#sYY6eR4iyif8s&4@{uP z2~jH0nB<28kh^09^8tT^JMJat1*7VfamscQXz^afU$f!9wQt9SlJo4PnB$XxQp___ zj8kFS@kntg(4xb>`)6q(;=I}e772>olNTLVT$?tANqC%6*E0|0aoKm?anrbWl$SWC z-Qt6ILLxP`Y&b4mp7REq-2kNRoPKN^<6VilYr7s3gX5N!acY{BXdYF2KB8?Wp^!k; z{agHy8(+*CjbUs&2c9;jSoDZKZ=CFj%sDWfRGXcZ%0VCe9d4SnqYhy z5Z|0muwlG$CXp&WIyrqu4J>?tfAnt8%xFTjYtwr>SrojGo+U(_#LzGpAGO?e_g-d= z=i&(N3)p{VjDj<9?@OqYe}(mRAoxz%OQhrdreQy%&5a}JPpRFqc;(ZpCWfu~)8teE zhW64l@_!&=>mg#T%;+y8EG-qVMa5cFN`8=;KTDZ&u`j;MpY7gLnPx;Z9v;ayv$mf? zOCR%;@Sg9ZA^_;PHY&egfL%m?vJ@U$B?)no9SZx^MW?uW`4td6sVg7ot=%|Qv=KQc#aJQH7OvZd!Uf9$857`hS?+<#djlQ z+{gKEVjlHej~Z{`V-%t3X-8P)uD9CZ)LLBOsmk9%M4|#{Qe6F`VPic2$A09{bC_Ej zkHIjlblL+7*nww=n+DVvy`A=Qa3sy#K{vNuF^0V}RD6*KwVnwu+FYUmb13iR!&jKf zLQm!4xXK2!xMRHnCiD1ZH?~npd(}WZLf~Js&TOV> z&r^v&_o!O==ZO#JDI+e+2>8hirZfWtR96TFlknc5eoEBSBL&Hr>5|?!O$U8B(7NJ! zPguaUp+E0emv+dxQc%NwXdbjq7yeG^Mjnc7y2r<_Z(*6C;C7_w+mczOa%;n!1ldW4 zu+PLeicq`DzoWzy;eM$kU+wx8$FI(?T%qX!5;^sstC&ZJsti?ZKuUygkT!|T&N!rw zkbh-Rcw8*wxqbxn{L+oW*WvwwSQzwBbIqIsd^9NmpH=>cllZ#18R>#->|kRUmxNn( zEy)LgDBH*V(;O~Oi*go^=;Fki9%&^gAh^4$3rSo49m>Csw7tv>*`XxiuZu4?6%_$O z?PA^K%B<4OVVWX(H!_vD@2hJ`$2>*RFRPk1F9}gk>!mqr-pH=%^lerAPJaV2PXcxYOu?}>O@xJ52`?GxSv8+O)9NR{g zUIq*#BS7YmS)dK?*0BQ1vX{Tx15MFdvhtS^T}vmWG^(1+-MBcP;K1DTcM1Dv^HI-a*``y~d5jXPf z5gYy7D2?IgC~?65ksXT(a7>3CKWrjxpa;h|Th>o%p5p_7+EGXuR zPaS!mp+nO@9@tLT$UM>8P+1xZ=7R~uV)cvOfW7F3`F)A$5W!7pI5|W2_P7z#i^yu@ zWGnymF|rmvDyhCN@`{-hz1_J&3v-T5Af+yHXN-xSV#S(wmWGM?B%rcPb;m7-v@3>z zC{2z_jCjhr74g(NsLl*UnfFqJK-wRQ+jDB|glKtI~7W{e|WeWHa7n)Sz zqxTzc$C8F_7iuU}gI;BQP(sJ&#<_wkUlBfef7C=Bggisj9vn5^g=s8Q1iPQsX!u}i zWH+UP#^xZa#E>HaVi{9@Ft9#{gz%WT}@1zXx;#e2e4$QUK9*XkRgS)%F~8z zC*etVjAW>pL@*$qli>8DrSc4L%5u*1!-qw~gBF#iR+T?P)Ck@X)ePaMz|SWnB<}L; zOmf+wtx*f3sL`ubowVI+cSqPHzz2V?(GUJ<<~_w8@FEXJ)!{~UDI%#l73ABY`G=Q{ zDbzBtHF*mJQYwn5((1ec?i#_-LXUgFNWLv!G(4zp&l$m@u_UHcdnxI5pn}rH5n&fj z3lQmE$j2QV++`y7?e?X!Wwo}nD)$mLdt6I0wE>NZGf5T>y5(seLrB$TY7i!4$)K|e z1xwBfH{{cxsK9bLfrlcgm+WbW*JxQOTG$QXJQt#_jZA+g_hfn+=-DhdVGpNWXf(rh zw9XZ%j7PzuIc6D{jNai6?wQqq$w`V%0cEyQaGg)FbNtWj7+sBn$arZ-&T#R@0 zkxL2WFnP?Cz_AI+Ov{v36!JpW`bbp>_#0I1<`q9^^cmk_#!!s3S%vj*SYGpvb^T65 z@oL0TMLVqZcRkqpa9W!IX3hXt3Yb^)I-mnBiIIWyk^Wl$L~6IMuf34qEq>KG4amLO7I z7Tc22lTntL0{%4FJP^4Vz(*Dulp(`3?+tY*ugSTQXYx%Q&v|Uj5z`C94N!F&UJRf{ zcxMH@g9)Crk3hV}J;3qT4WLEVn_(gnvIw{7fY*+Eynv|T$amoS(+`u$qQerFL_N=t z$g6-Qg>cepwYXSNH1X0HA=h&3Vem7L6`;CcLScfJBg-*umj_&YDLd%ALt3FX95qKW zHbE~qS-mZ2^HR}7FIa#LIt`lO&l<)~bSFZ7fI}>mNmMo#mbZ;pD_?|Vw@vjdEvQ|B z8?;eG_gVdwRn*#&fATu;_Biokx#0Pl8%MfoCjWbCApEq&^3kyq{mNi4^3;E$bv$sf{~r-)5_A;DQ{{x|%=koG+< zAdJh$GF#?4SS}d#@lzYnDCE4ZL(XaK23)1G(c5Xrwo&2(4o}=T;pS^ z=$5u3b=3%Yky?0iN%~C0h%WMMYVH@)7T?^`+ZF+Qah2>^dnqN#1j#z`p%~{g_`9XP zsiy(k!VEBk3IoEfb2()g!#VzNw}U!PRU_6!48i*RJ0!<_a~b9~(#TY;@GC10MPlT9 z8r$d>s1B$Zp!L5&VMg=OXb7oVqg_msE((yf1#GwFVT=^15mN$8&6D_|0T3;Rm=dm! z5q28AEUzpZmAc^Sw{tNjVH}mx=!lZn=ss=M0A9|_8DiS`hM_Zb)3>Jm7C`G@*vqCe zTKaj%EHdOdvuwGHz?8D1;E$OX${T^%ovR^gU^GKSLnK}yoXh);n<+w8by}uDpI1I2 z4ZgcKMMR=SoUX$rtIQkUEJ>sJ=eZ1AfWN4edUcgs`fKZ0aV{@;kg*9% zglE|yf=^cNC=K^rdfK>tYQ8z7n~){56ejo&6g%e*>uPE`eai-H6b^>%$t2b?Dx$P3 z8rRfN(VLV|??vfpPNEOUS0G}A6yE$haWJcwx@G;X?Qd*vZ|a5df{}8U^cC0pe(BXTsyU2_5z+XtEHYulBZ<7^9ix8QVBM7mYRaiagP zuh3pr{H=|RwXeUH9?)~8`MCf>|9a6d$y|G(z2I5)PVsrgU5kB6(ZB5ZXZ>YwBQB4< z2w7Xra5A>~KFEs2=c3fMv z$wmGjo~6ZiL06T{FSmHm^A4E@($pi}q9&4{@P{WEKNdn1YJO!`pblP8J;9kW^e)w^bV+aAlT2H@AIw$;MrPLazTiLNG!#0+ZA z-1ki~pCe2cx0$wq*(wkk*pMppRahLT#ZL2=N}*^7*%Kb~aTg1Es(gZizT)54d~dxk zQakkU1ZE`PS@pH6ee|j#uLUg$yL%=Tx^1w-7G6KC#wsIH#9$ zU2tRYKvsXRiiTUp8g2|aL)EP01O+x7He+$heI&xHae?*qf*$ZC+SA7}7Dd`-DKjki(VSav(~&8jeUhFHKA zC79}jPHNXnw3odmsg{kN8W?QuZLE;NRgJv`;q$1Qj1i>-4j+5^AnUUThH}Fz+>2B73#i2CjEPN%7ZC!Ej@6ooApLhC>FAi_?qVvNiYxL5)7z!Azk0&ISb6$u zgx4@;y?j!(Qc*9Yf0JVUZG@nm{K=(L@^|~NmtmabSnEjH9qiDQMlmU;`@@m$oU4aA z`PPA17#QGtOvO+{L@~aY4)76!!SnnOeyRo1W2I?&INzXpQ=YPcc+yaU8QwI zlAADV(oU}`!ZU=o>L*U)S<+ift6x^7Z-G{b6N`qse@*GFWrFU1Z;w$oLcFi>^e+B@ z>Mr2yty?IB#!4YBU#|@J#x~WKK@0r6aVRs*C`tVhKT};I_5$~EN2>Cq z5BOw^sIMfb&Gwble4VD|m(&#kXVSdY=%-JI$6YBcVF(uau-5Gy_KxW?qJ+Md(pn&% z$dC9nr>Q_<*C~Ox#p%H@jlW|`u47cr6PIMW{x$!u^6#4T;kN?4MZBm~YZn2+t~tz( zX)2=EaLKVT7JYe!MD^`C4_G5~ufro4P@W`XkZUzv1r6b>`J8Nesc6dE6Il)Lb8gt5 zo60_JoW?GzAIKW^R(Bs77D54&x0BpoOCYeiM(?64exL&|_%M@9U0oDTnmPle8rrNd8(V1ov@r6|@n& z_Zv{lPkSwtn^@2!S~kLNZ;Jqw(Vb+`;Qblc_jS86=iGLJzH)t#HIh~XyXTcM=K!}c zcgJX0-x?laHuaY-I^@cb(hO<8HLQN|Z(n>_ZH|Ujd~BzUM>=hd-w7!4>qk~j{fY&L z%=LA^O~3w1s-{QCl2zN`@dB#0Gt}i7j|`*L`Fa_*#d!|Yun1pFPq2SEK>*$^KSAWf zB#QR;SwX=Omo-#Y$=iy#IhzOx zZqPQP91XTvz%+Mc_BRS5#J`#aV_PYc`OYb&K|jc$a-_lqCz~nfjN{vh7uZ6*t~llz zVw9GQX1XaD9!jVm1Ct6x0&qS}y7Gpo4HJyVM4_*JONs4!KG10`_cw$lJo+_6mo9l6 z?iBF&&^M2=iONt_>SsZ(i44OG4v2d9%K`LNh`B4thmN7{=qnKHus|xmipyBLS2xD6IbnFR2d)Z$N&>C7$AdNHuUucU3Zt=xQkp7m-1_;-cHRjJ)2ewQsA|lB>Jj^}B$OiS8Phty+0=rT911h;d^-eTVn|F!!%4%+ zI7OzU%R)ntX8zQ1Mv?=`hi-AQ0OYx9$iY?6#dhOFQnXgLdv^77xy{qw3++Vy$uMZE z8N5`a0#H^n&$k7Uj0$*xUjl4uK=u8=l?YJDkkkd>cy)xMB+6%Z;eK*GGN?wY{s%EuV zP#$-)hJPmsIB#7jQ0RbL16v2Z(pJw-Qs8#>RX@wRUk&L6K1u!Wp<9ay~7K9sRu6vFjBYWiTF|zxh zxLYQdJg!|o%Y*h!nMzj-#<~I)jwA4^Yd9eG8deR}sRv5cRkcl%F*0*qXi<}0bdPS= z&SL?tkJ?Jp2^=|exe6}<+V0U@3Ol}3lc{mx96*S094gGHIcl?WPma*V-k5GV#bnsb}9)q(Eot3ZYl_`x+nL z;}j!;^tNvKszfG*hRD}d^Y)YXrLah5H<-rH8Mb@2O3#xV4(qQGMLhXV{w7?Ug19c? z9ZuYCJ7T^rFt&AQ;)|0F4ru0D*nX~*(3ceHnCXUvyH~^xp>8U|&}gyM+U+tuau0o7 zIk?8A(<42oy9er~TFwU>U-@tfcdU*Oa^RHLr(R2&rgJnra%~BIz*hN?=~|#g$4JX0 zy1dUh8EtL;CKT#Xk65erb0rP(;l_9XTYPu8Y5C&krOQRE@Py&cMX$5&pTh{R_&6l6 zjLEhZLWHrT^6C4NsN`E6PsANpoXsciO<}72lhTB;-hUq#v-pSaOQ3@@Q5~^60Ypzw zt9{#8FOg-Z7wb^2UoKM)C~=fXKOAM86%uvXV-go|*{+7$GUsi*A%qOhQzgopUn1$Z^Kl?WOVH(Tx8;%HI4tt|Pe` zL`x#E?;96MU2V7RZrjansXZP~`)EAiCZRu)kO@#tdA>P31ylieVr{NhMG}3!ALh)z zI{(PTy*DB=UjgjT!*hs=xcSz6xkN_Bf@x8sj$VNp!LG+z-xA`g84ptm3^q+i?+2R4 zicQv{%9~iD7q<7p1+sTA-O+YpBUc-yqbjr8T{K9Xi`|v?z7u5AnjI-FIw=$Q* zZ3l+^J3RYZ06yQen!Fw6%A<6N{cA_Ks^{m|3Ytw&<5A;)RJ5rgHXd&+x80(7^}I2y ztTou$5BmVYWng0M8G)+4&>g3i#c7d!zhJH{vlq^j({oTQ54+1aF^EsIpGwBlK_vV_!C$8W>q^rR z0?D*Ia&8Nr5UW* zbPxGB=wR4Oc?4DRIm??C-8$;$;eA~TqiDFW?WC2_kK}b+ly0mTngNG)Ecs`NJT;?ufGH=VPtN<+rtST1ozwQ@ zv-80@E=w74i9f2#HPVl4nOOPEM_zmED$FC@;(5x!qT`g~$R=?xul@H&KTf6+iS)RD ziRWeZ&dUW)%CYT_2om~q&-1eFL?ajR0zoEoKBu6TX>5D^>nzfG zgsim+_iG=cMJ;CQ@A^^xcP+$DRC3b){o2WA>0}!>n1v!0*=asC575KyGnxGA=TGR% znmX}8yaJtc^};!-4z+DIDgb>os9?z&&e$cUu}<$FqQz2<+GXQRqNO^#^U;7`cRwEN zYlDWgy~l>VV`6I?LT8Xi!>)6+8wNVU`C-6V5e z=#ymY;io~3M8U%^spM>#Mw9+(7Wg{OPJTMe;?c5e)+QM3^e&2n3AvN6#yz%q2BLRN zf~R(ZFa~^jKE#;EZ?MT9Pds}#kSGJ_3Ef&gCk>z2E7#?9v-$-OW2GjRapzQ*@>R?u zre4#fzQ2TP^&Qck6sh!RU1Le|AMvx?k({&*_~?$)@l8_1r{^P#aFN$);e71D&_6q; zrT2NnhFlBEqp`0hUjAOe!n=MY7#FCV`_ttR)tcnaTjyhG%jHIl!CQ3f@PMXTd0C`1 z?<-_nZ(ywoTu7HO=q(V1)_Gf0IHId5-X^H0?z`iLuH?+&AmSU_6Ln>nh^gG@6tFDx zREE)ClhhmS_kg0`yH#WNKk;|i#{t8>cNy#s+qdB^O`^3~yhwnxN-`$loS=O-(@HOS zI2cXQnE{tMm3T)gWEVwYokx&%daIxg2VsS@DAwO<*#Bc4m*7WOAq9c*tc~7m9D@Rt zfu=VTntI?`f{qa)MK9ucVR?8Y;*BwYdOarthh;4a4kkYs=rybvUks~x1Bkb$qszeK-hZa5Tzt+!> zeDlHNS;{G8t#0^dyV|aPv!RdPd|fajwh;K_yte*XSNKyK2N`byQ>@RpVR!Q0 zYUClz0d5=5bWZl0g80o}cyQfMF3#*U8$ssnkD^%`A!p?aTl8EgB}t4;Th5nWEIYy` zT~9~wwtMx5*4%!e2neXn7{#Gahx^>~YC-$vjmJNZ^ZU|1x(cVNbk#!>|9bpnvsme<;~s|C<5-{oj7|;O~t@r45T%g@ne`f=h3HnZfLEyj)?9oAs5)KnQ{S4w* zw{uw6Q^wA7EbY4bs=I?0a#P8(_Nk5U_ht(*efW0l=d)$l$W3a1MV4yWp2&yD2U>E7 z;p4LL-4bVDf{q6}EQ&N|GL5`Ph%JgBf8;~+K|bkjH;R1n&gX01TrYTzq{RW$P^>0i zN!t^Ph$jf0l>vARc)Fte(y~{rU3lJ1c&fNRUW5M7LjJQB!uW7$Q(;>R-@oOWp)k+< z*VedeV<~o=6;ysVT}vKymB!-y4hoOhU^#Ww^!Q46J@<=D=d|z;gNuCAe#pDX9Gv*9 zsocMgx&3S^@W{7ZF6`Ze{-IS|I(DBr#TA&o+xIZyRb_AM?KxPtgpPyIm(v~HSW+f!Q*|gmYyDn7_>pZM`Go6H|-Rsy>n2Hnb_$0)e!?zIGWO2{e#x$K{k#PpfCc$( zP^Vp!ZDKQ8<4BRlj_YPNp5BC}6{>xj*(op#*^bHSo|TDLP?#-j$Didd>tK$#sV|jO z?mH!yzV>E`dK8=z@=+_>`mHrsFCL9zyxkSsb65F*x0TWc@W#<*c-5D&}qJRn6KQ9;# zVcpU*-mmF0V6CU4wl;>o)r2S>0omFis>QY(DvZi>R(0_>Qg4dI#Bw2NAFRaMwA$S# znt}r4k!?{0v^*m@o?Id^=xs7y5n-9`jLzIEn5Wt4QLpVdmQyR@V+%-}Z={JqV2jN} zGSemfyb@FdA=^q|jykrQFscGJ8?2(LCn(j(dV*q$M}RsRcVWE^?FG;I|7egBga!^( z9?wP`4mK9MFXDHuXS#S{1$n!hNV*|&pmNpj{Z#Zc8Q-JBv%{>WLh4!86041!?IwRT zNFNcM5Fs7b3I_Hr>jlr4dg%bVQhiX1%6!CG2vl>g$isne29%JL1qE~z5L+e8gddHk z{ZmeQ%y>Mza(x^)jpyyEF2k9fhss%`@Eez_i>*&k89oY^Zj)<+B?&eIgL z!G_RmXu2PRtwoWm57Gn7SUzqC?m0HOf3y)`I_%3pd`k+qe>5Co zBa&P1%TbQ4iS)doOHUU4sUVwm?q0_ZUH&0F?hbOb7z5K+-=Py~g1rwim&58zBkodS zHBUaOMp#Yp^U^PDEvVSZ3tk%);{N<+$4$iI2%)p8le&nLcva|A#apq(g!AkiF z^!Xn*k|_gca&;%tO3Xm%LFF=mWnWw;30zm97)qM9C@O~+Ujq}3}YzYgcQ#bBc{ifPg7 zi&nl87gX(oq|pi9Qzgg!f`@(3Murp~&vU)rs4w*OHW?1zc{4Z)NyN1Q;x?=?lcQj8NR$ZSsw=++oDd!z{NwgYo)VVf6_jMds%UR^mJe0703O6 zan{Ed1q8mA$gscFntBq=qcn!um;tmmAf(wDw-b&>WuQD48VR!TLVjRdS#`qWVy^@% z{{rW72*CgvB0SpXMwBE8A+GFQuGL`SXM+<>OnTStD5UnXAHnPiYXt+1Q9KwoN7A*q z!8}fnrM+3ab-1YRUMqp~Q@p-f4Tz`1e&NQnnow$ScN%Q+b#gQ<4z?Y@=T9I$QtS+s zBl`Z$xL0JkmBcyZhRvmb+!Su>8dM&JwnZV1bw08aAJx6VazSYX zk}u%LEhS)_3azCNd#7!QsRZPA931w4Tpzh!Vwfp5O5nT7C%1%f;<#5LzC7u8zqor- znS}EF8;Yn>{qiFPZVewbtnw^kBuGZg35JBHfCL?c=#hG~cujale0Pi1kQ}lUr zBNw|$_g;y7c-d86TlBAJ$hpj>H5C+Z&B1~e%b^r4-ugwdY%AUO2uw*RlMJ;!&j54$GO1c94?SVWv&HPC<&9a?S+uF`CPg}Z_<99$sfIW zVQcrwTYY^7P2XVR2E1A`{IXHx_H-`EW~+s@#!;CM330#49}Z%DtvV}0e>hO3Zl~sa zQ?l~AA1jIaK&YcbsRAD>Pq#>>7~|lQ+;sLz&IY$g_Pt-?R06vedG}gDS|}7L$aRx( zvA&(r)aC<1o%fi@nAd`G6~IdH)EDS!uctx2oAC|}gs=;%9;pjNTHqyd?3f#w_5^h+ z89D5f<%PwMBS}yHxRIHz0eNP+;w&W^&V2N!;#O`Dww#gLpISyhTbWMs-bTj4-ykC? z*;|IPvgL736UHW@=rY@hJZX<&X||R?&0u^&WQxI3ZqJ!W(G~WmJSfs@?K*QZgr|6l z$+IJv8K&s<%yo&MsTbTWm|}Zzr-1VYV|nmX1e8%(& zt&IXZzHIwK^>HKPQJmKuXHWjkgr#ukYYEc!*nZ}R7Z(UpjnZPz z$5o%|0Bad|8QPe~Me-p%pC=enJgD6QDn{}91)SBTg~?tNhSIX}NJUzq{TU#dOt(W$ksojzX8sK|vdkKPs zrsdJj4Pf0k6ara2duV{QKbcT?2if<{^4|XSLQR=|gK^uP)D;~xz#^*XN?>8XpSc`D zbTQz1?m;4d^=pR7=yniNy4R)M^jWB!Tfbtk*>5-*Jblb7JXMg+m5cBu#cuRc;xzL< zosCzC%6}SxAkiJAuUHJ~cdWOk*CHsc1j-k?6Wq0!fSZky8u1X*wWY&Rv@R!#aD1x{ z!B_=8KF%Ujtdn)@l|4<->w=R|?dMF~e*NhUvF3CLqrxTfNA{{_?66%SCOePDRo;nJ zjg8$f@o5=Qq)LL+Qw0s7osZkQJk4=L5-T0({lpfoP7z4$ZWLaRWw9Sc?zxnnK;Lgt zHzPc-F(9IWB=P6%pN8XWU^N&@l7E_FALzgtjK{GmC^oE!^6&-18T>IQ*&QS{o3WAg z3nVxE-Qbc7{dpMZJ%qFYWIhdc8epYfz+$nKHcGzX-K{0 z+rsxM4SL_+=#W)h#EtZ0b2NvOb>~mLl~AQeAU|ZIv)@-Q4|Pa&o|6@U?+s7eJ!tCE z0(CRNscr5g$VUZ!Z&qrgrX)R_j#TrY^0t%0>UH>)Nh`Lfao@FJN2m=p?J{fLSa0&$ zK@dRYXD)ZOf4+cLmHBvO?n$hsN!J^!Ch~b0P>A(--z?9bSznUHuHvxj6|b+u77_mK=aM!Tb3sDV&yW(GMA)l-p}3zGz{G{cdQ+__!FyKNm3^`?h}5 z!UNTTlwVojkHJ>4+hmNeOw6TsK8|9Q1(k<=*FSVzAWG_pc`-vhanV`A%c(R9*=134W^X!2t<} ze>^^Vk%dTbkwpb;E!Wi^+fMj_+HbO6Fq+k{>$FF>>bhaqqTtv$GxBuU9(U4npePMi+TE}PD-`Vd#$sQW7kU;KEUpVvvu*IS9qdrBo1^Xbp8 zV^1S&2@PC6zxe>vwl8CwF`76WG@)3JZ={k~9IR#}#F|DVfqePK`f|oCi%pC%YnUnlgR)lonRWEDtI`LMRVSm5r9^5%%8KG=)wzeo5;y2(!&BqlW<@E-gEH^Wy7MWk z^w1ycVp#4NtI%ZUZ705`Z?=oaD-L={VCU4K#SKTb&1(%h?m=l902h zE&$;f+Vr)=$@D{f4$;3Z9u?M6qB{copzDb&w)q^O>7U0hT}!Z%6zEkxusZFxj672N zH9jPx$U-ncY;C#)oiMe7pC0OPb@8PDds>Mbjr~oJuA_%XC{Bt6Aa7FP`jwx;fhXAu zE(_F<5DY8_xb8OQdAFa{2FWMG3hXOWIdfniL86tw=UwF@748Q&twuHiOy(l~f;0=$ z=l!6UJLo5IIbpAx?2mDFGT;Qw@9sCkC-$*W?c{@-0s6sNBs1o95b3)AG4z4VXhb@1 z_>bOT-qeH+7)i}{RhvZ!*AOedjiOY?mq@nMXdvm@d^!ZYDQsJ}11o#|Qh=@$5Dh_e zBe>)dy&lLh)&V}$62SUPw@hlKv@&*#su9*CQnIZ(ktWsU3=I8J3Lp~UO5y+x>ub(L zq259R-g2gEf2B!Vw+~KrwCo(;ZBYy?q*fD|lp|rf$5Uea;!eRpVn~}D>iU)UuxfBa z-v!u{Jo8*b)IBFZ+Ec4Rv!|{I^me8v8>p*piivgT!T2oh$`0kn7DHh*Xbu3CixL|J zBRz2gp_X`F$m<|vU+hT$@-oQ*f864bEVMiyo?^qmK8Nqhs#0cA|4h7HtY)7xSfZ@| zf{&~^JHa<>&Q=2bvD;1@bp~F4+~G@Z?0jG*sOG+%zobdsX)}Mr0n9=*(%vQ{$3?nR zAm5JLgDH$a>4dnTlFGX|k|vDo^CXpwkY45LfES@j1`%-r)}8N!WBF6oZ@qy%F=<4aq0p-TDpQ1`*8ok zm9K7f^<;1cbNA4BmvLO~H+i~FCr@r2{60BLIG@8fi+6t;R+P;Vu69~+Hd|UIE(h@d zlvVc3WkGfSu5&Y@+lIr(CcHD;Cwr(6|1_W(BF~vuSk;R|6bwZlB^O##*4_}>%jqa> zr}24*gEC;$j-Xgy_*?TMGEgfr$J^l1nVvy|r>i2MJ+rB30XZ+wzvmFzHWyyMoB?JX z+4;!RzT3I{t+-^}ZZnv%9{kN#x;!i%LdRu$0>9K#54{mF5#0=&U(K<3N-qjaF%Zi`ao295)>3 zwMTB)7H7d|@q2_o)1bj*G!!jx&+xim%QVNi&CHknZ4MRGpUgSA7B zNyi~zCPW>3#!X@C?%#|{5#GAFFhvDP5A8=hj$lR^(uEd> z5G^wCwKsserq}iSg~D?=I=NIzVrSBZcA+1wGf?^tGw+-kO9;D@0XJGtxiWGIzvq^C7;rp|pz3QG<1u?pK4}A&10PPkicJR5B7;=;f%+rE zevz>vw%#JXU#6Z4B; zYRWI}&H^`poSDWB`S+=HI_#f%W|sn@;&Fih%!Jp2Dp#xo=w-JVTn;q8cMZ~tZtEIe zU@yB!YSxbp7zQfk5TuZ$ow%*Smu4>6zLL{CjtY5seEcryhvthpvBiKlZc%udLq95up@kFYB-4l-unFyM4 zWMkFDW(vP0%M`U}dj?>TyA6V+u2t{Xow4`cBrcKHN2E zGt<$v3aE_8bF=f^4Mm9F{~~lzzDdevzwA6WH+Bk!_VgTkwhA=1h*k^iu;Xtnmgnph zKq>fd7dZNYvI-So?QP0A$X+?{SKMc0{h&+1V54`Nb7Y$Qm^zS=Ksl^dHy+W{Q+y4{g`vaANEPT|Ki zg73yLVeF?{A-G=T6vB9^)z3;$DP#h<*_~NlktWAV0|s_DoXq`$6MxY{JPgEF{9u_! zFFNNoLm(+42a|$gq$qhS1@pSW{iu3}ywyeK(UE&N+$I{A@sZh??D7=MHFEbWzUj0W%+R$N;K8=du`KUn8x&z z4zg#cJPO3|^J8o|;;P5(^R6}yR)bRrnk8q^>NlL$q=eY7Q3_forkc!bas%OJVTyQ5 zE?GU0d!5N2*`Y{wlAGjlZz#(+;e~=-fNx`dQ2^YvYVIZ!#hR;{#dlKi_tYTJM~rt) zPmKh&95BS?Bi0h;`KQQt2idv(7~7pw*pN^cvgnYn8W|){?QA>P@4B=oPVO@VQ;4P% zR_|cq*Uw@04i$0h#>jhqd7B-JK!ti5tPZ?Vq3My8K%8JeYL#_7!7%coWL}cUYT}bY zZ0uuZ`p0<6Ap{4Wc`w8+1DW?Xji{t4>8is_@Jj-L@UgEF2A@G^H z-Gg2|bXv3EdZu$g`S5pq{NeFc14s@=B@o}DfYP_PR}>Um3n_j~l%2Fs8#hX3AK4;g zqvV(?sZ}D+6>-!!Fg!ETR=u7rch<46 zHG9CdY4_gj5k=WfD$AD6TGmpnuC4_tuhx>jeWPGx@3$x9{cN0%^}s84=kn`lsj=ov z?GX-GEp{CIBL>|bte>;f3%}QY#oMod|GvO9m;cg2%p&Ubu*0Ydb+T+=bTybwMdk_if7MU~$KlU{Yvra=z|P z*VlaHubj@I*YRR-uk~#~GImzaji3VwH|6aDOTy_+0p@G_o5tM9aEvJ~Fj-j6$X>P6 z2o{DylL`@&@$JBtR+%Sd%MYND%xs-6qoKM%p-?$&!6ojU$dCW z$RCYgAU%p7U=xVeBAM4$-$*5u=Pd^LDSnHuE3qJy6lw_$`vYYs$E^1l{7w60x;1%aI_k+L81vl=(wQ~7KR8qw|xV4Xh-q!xf zy(IbY&f?*kEBEZF2^BUybDBzZcw-`m8mYu|w zVGlPOXwpUq(uFysD^=)5B3-;!Co6ouOZnr@O=Xlq?%q@)S!DmFB1k0A_+VkRpx*<{ zZAL}TVOc?!Kw*bSID()XQ)+D7t^9>VudK7scgi7K`hvzG5_jW1qwck5JE#pg`bbHVxZIkSeq_X+F zX6Si>AN-Mx$TI0kSeNSjzJX8fBVTwu5~&N?)5TxS2JPuRtq(zW@#PBO8xc+@nUTSaB#DQ=VMfET2TO zwLl7Q2=b-!C4qSB=;vDj4%$`p;GGgnyPlgRn$=e@%~$R6GgdC0DaL3KArQcSAlLSa zGua&~O+PyYlY{caAt~U3cGxz9vKsB!vaah@4+zSw@V46tFzl(gX9ySB6KQcyhMts} zG;{*LAjLSKh56?-Q!oq{4TZ9?845i4{e<;_ZOSkXdU1`aa&B;C*`o3jFMm%M!(c*>13!%Jf;2qLWQ@ zT*hKq6*8!`#N7_|ygN>&sGA8)e!ctGAUB!YE(@5buV36GhxN(qfhMpFOiI0j?eKA8M!ElBL|^j#+mSIM54U zRtYInnjhBf7O@BQf>j^w3}fhK!55ag0c9@|ApNu(%)7m>dJ4QEL2%wD3Ecxe0>g1~ zC;%UOW({fC>)4=9)?tB#D>BE=SJ`J8gPAYGwE%);o}CQeEf06_lB1o z4R^W@_w-idp0s?gl1tmGI&YyEJwCXI_$=VuaFl}{F7(6U3!b07$4R+dLpp3ewi1vd zIIaYic4mqsqd#;ntFvCWNWXYLquCzt*q3@mVGdJpT;vES1EJnvMWS&n7Zk}t9CTz) z2<>jmz!N(qp4?>b7ib>8i{>4L;h(fwVBS-{D4=qi#FHK0EsL)QtN5X6t5N-6Yds{@ zfhPXX?c|%7@&a>XXC{}=s^cDeV#8TF#U+QRn-VR}U5IF zF544ijIAyPHpp}yw0;~;Tm5N0p-R0~Pi)#l5i%g3av&;FB2O;uOkCyxlPv!iZ~5Mu z&t*=&d}+g+6&0y?R{UCu1GD3tX6Yl>EZ++>2O+WAlGL>8Wrv-H*+IZF9?N$Eru%Q{ zptkNMjU6^d0I*^B=+t`ZyW(r%T{Q&76;nG+PZk&8_2X4G9X#jPXG0OhAW>yLrxMD( zNkufNgNe7Lv=g)*Y_BWBy}b++C;G^NOhpkWz!feHjE+j3d@S7_Y3QKm115Vn2&{*a z>WOL#FFd2ZY{K%VhwadX?AyP%sr*mfQ?aT>Y7vWZYa@X^v#J(}BpnRS{8PJvf;QWM ztz|G-p#CW@pG9WF!j*&}^XF>fQapw%Y0J?pOl!!wX)Es`*XZp;7RrUq1SYeSu?*B8sqB z0%pYHCBP}gqtQ`g`vn87Txzs9Blel_EDAuylhZL^(w%QzU_;F+96xz4{0s8__-C|{^>;zOUB;SC`8iR7ejiMtX>RHhS@W1 z{$hBJWviVr#GbxQ4I}oImcgxaG{DyTYI51KuRNR#(|+ft7b7fJ?L9gY!>xSG*z+2g zw#k`n_I-EUuj<;D0uBGg`HPfINQ7sn8jX4wLWM;_75fI`_Ek+c`CAvXQ~u0;uqQRH z-0}#uX$;%>?!|aGe0TMrXM^a2?9O}Z!o!>~##v-&ToVgLk(;`Mk8yMU!Xuz9kdUhn zD8;cXLZX4xMy761$QoeNmX(g=b{$?m=wx`K`-d7`TsSuATpT*GuP`22HPk~?hK;1w zyQgs89gW7r(YUhLOH0O8mK2$vz?KOzKD+pHHJba`<=iKizq9{e&E2|0c(}QR zZE60}qXyi%WX8ay%XVZ+oZAFFd1e=e2N+E_Rt@^&v_F#4i|k2z6t;mom+juUjOIBf zY8>Ar8j3<0LJ^vdJtF)9SO}cBeec}W35%dL?UO8yt#OfG7?t-8a&)+261aUyE5Nx8 z{T5pfcW05-Ipf>?p*45sS`jUptz^$j5Lbmd^Uwnb*Pw)l1^49W@!YzTDZ20d8Q^G; zBUi*_Teo1 z)QvDde&u958*Dv%*V7Sq5`&Si2RS^B?>{~qR0u?5640_E?CpM>4Rua%>n4JASm_v6b55XZUbgF- z6Yp)Zq_JzY0;m%~mKVTryL3IMfjmQXpsffGdRPi=kh?lMKe_ba?VCb8E)(_7^MFi( z)43taq1o3^rlFWF>0ItS0I-dg9HHSg}1~tI(?`<^oC>#7dV~O}v8X z8|wx$Qn!TIjmtxR$2*{YYvl?!8bIgAKEG3dRPqts0y>p(a@T!kP-PJi{-k|cvo@c= zT$T5KGT=^IrwHp?vu1Mt+a;%<*Tu{6I?9r3l!s5|sSJwCG3&3u^|~L}TjXr|aEL`n z@*>sqaA087e`~eKi-0&8+NF4aNgrc<8-=C>Ay?T|k~Z2@9Xo}!^~X{70ztjM$HqT( ziU9KnjLR^l4+xq5lJEc+WFlh4A{kC~c&Z%mfag+0=0su9zwVG*W7TXTrH?){M323@ z)h}ox1!9=5zeRq~_;je~7e&jDB4TOyKjPI-vTamjtv;$OP4a`zm7eUUg8S z6Po}X0NG9d-9J(iJ#h&)P|kwqW(LF1eK$i`_q~JTYSp)Cyj>q3@Th(fM7)6i{zU|4&%F-opwgd-o0cr!u+ ze>2cyd}as*xB8OXtEkz_7YGbyawj^$WtU^$yKWAc{W(~VdUEC2UAvud$XrM1t3hvQ z3-J!ZHGXn=YPW&VF^|8`Y)NtZQmed8{T>XMpM#mrmjsbs7EOnoDBucqL$qW{B}@_G zCS884GB;j&NMjNVJ8&r>c0<3)CP-iQO(A8P?xo8d`gm1za?N*EPQ?sAd07TV_EY63 zn&}h?D$0x7yu!BO;$^otdR|`~qN^I|E3?~|GBUTi9Am=hPRBHuoBQ+V zVohh&UfC&?4eA4{Nd7*&vJt=fs{7_<=rtl z15}fE?u$#SDf=sjzV$@%*$)>x%Vz_4$i%B8Iie3u{VAJ>J5f39eBN7K2ogLx^+px(H;UZ zz44KMGnRwq)-{OjBQSU4+?+))UMW5}wzd?z>9QF^eEG5nAZ~9G(Ta`ou5Uw2WiMLu zMP-zLI=2V?vRTHUl7q(=Ct~sK;_*{Nxg9g8H&L$CsyKVUa&?tbN$9SEGy9y|4K9YrA zOB0mvw~zId{gsB%j)=hORyG--Y%+S#zR))``VYVT?cCox(H>RxgVT1^nLaoh_J8~P z-+lf2-=5moVi$_vbZiZusCNCp7B6G#U_7Bcdiz^@k>5Ion|mO4-qu}hS3&1R(8^`0 ze_Xsw;oNzSTSVUiUE7KrKX&(vYH~R}OS`jib%2rs*l zX`f(jU0#h$F#1_F_eu3j`~Q{w|Jwfler~?<-Mf{F`aM^Ae^z~q$-Ghkqxs79R-aVI zbGIr;v{oh==hLcf9jiKf(;kn9@84WPCZ1b1zLz9bV@9$pso$JitAhOUS;gU}%5mmz zgGO`;{Ay4q^lYTV{1HgYf8L%;Mz%UfMp4ADwY>mBi)c}4w}3};Uwv*Xkq@sT3+=qH zD|_3HyGB2+W*RKXycUqv09x*ck=*K9&u7NwZpUPo)i}W9hyDZm=Fa*q$!_qu3R-s7PQX9a!$HgD zJ`UE)fsVW9`NGEhW6SE$Sq=={U*tR0y3Bw<_jISmMub ze;V27wijD`^uiXc6?LQ`K+ZoGBe_l`~CP?O%Myzkjmk)<@%pX%RI3Ku0~G zX#ahT0|WaKgNNP8dy|d42P{-EaLpUlqc2l6Q0)KP3O|ZtJl8BKMK-IFJdP7&EU=J5 zif&bdKTc~;7VgG6x2gd*O6+G!HGz!~gB0n;9n#jTnG_f+)u3>KwmZlj7&moqf@%N* zS$CcRt_obP25&|YKgOO1Iho!utcO4Lf@7%B!RhdWn%$?>;B4;mN=Y|Z57+!V*S+-3 z#8aOyRFR|OGox5J=z}%4tE#khy_QI~5==Za&b(~oBJZf#1#r~qSi4Q!s5@>K_IRlv zDJtwG`1yF5W&NgmcDhM>V2!tAqvll;w<;wY;m_e9BBzk`h=8OK3>($Xd=GeN5^6$Q z!S#lfyq8S0U(jLme z;7awfQpKhUxX*)QK&4r&Q=FUtJkwCwQ>r4P%PlZ9S{bvtgx$0~cf}4_MZEp6GF&2t z*|ip}2$y(p(9^oB(;|M1`;e~?vwp1@2;$gzcR;7q^5LJn3^WuzVvs!(D%W5bfRv1P z&Xe{j6A;}I2+L+XT4CzQ!@spQWmi>R@u5H3;rWYh7i#^x8nn#uqetF3m1g5$1?&&H#vv9{>AkS3*DUMG(sIXRNk+g(gf}FX9J^c{bHfyN#Sq>X0 zelJ#r^bC|yvfC4{`Q{W0I+9$n>vP!BG*(0&<;Ky6Q=}j)TN&X;?Fi2qfHijaopl7g z?niw9ObYX2^#KfXg-}7gK*l6xoP?-HzvNG=&v$Eel9^|#Go*1}U%Qn&Dtv6n zL?9|MF&wDK zW6sR@J>ZlHiWV6UhaZAJ%xfa@HkJ5Zzj!paO_49Hnun4r@g#t{*dDl54P5>Sza>(y z{r5-zt@%rPo=VBAqMdx{ypMMtjXpMW*?C#+qs*4GG}Cl>Z=p)Dh^pDNSNo1=csUuC zy@myp@qS(~5>{q>4cChUw1-?pF0D_YbF-;uA`^wy&=s8jC~JlmS0jT-@@imJu=y=i zkxa{)^yCyf&MQtx7Xp|GwpN_b(Kx@WAqc;3y4W>+gJ@50-kLBlUwLk=4TgAx#^EWG zGgBzCL+mGDCP?cd3lR8H531B%@DlgX(th)h zv-wuz!Q6w&#S2?vjqG7!XSX#xr|E6oGTMaaR_)1F;`m2BgpuD4Rx!#XQExRtC0EFp zqHFOZde$&ya+1XD+UxzIH1;YPaBQO}@Z2l~(rJ`;WHDcr>B*MKji)0VtXiv~b=ga# zZwZ|YVOWpu=QsuB$&eqVk=<;qYNj@`1GuBzQaHTH-0J`?+M`zO!Bii#p2KGPwA=dj z;QKe<9lUt_?C{06Z(ba|c+whjp!fH2!)QktG4jQgr3$FK6h-+BU0;{vyn_`#rfwPvp1ZJC|7m5l*_Y0 zYpZXg0JNd^`79FS2YpP73&>?`w*WAVgfmTs-4qpKCu06@6(wOpSsWe7Tx&gFaldbS z@Lj!|fs}d9RW8M&l-u*$8O{^%S_ZjgTJXo+-g$W&Jk5cv;VuSliO?)kIz{EQpDjVq zql}$gR*i=&(+THO8H0kutc_|6{5JQ66OX%tA;nRondgSzi47)f04SziEV>i9s>1m4 z4zuEter^3rIqMx~GB*^&F~hf%xA4nxVqSD72nrb=P7$`y#{OYZPx8EdN|yfN)nO^c;4h@8be!Lq$d!h4Ve+^Wf%L7ik)|9*9u+sHaroegWk)Fv)q z&$SnnCu?ASAUontRnK^Jyc)bk-a8xoU_W)j#0IpjJm^^i^mm0l35gyqPJ(H}onXK@ zTMmdj8vpY@{qxDt%}!(pcE`(3hAh)rEQxE-Tge))b2WFImE?(sOqeMPb`{3aWW(s? zpy_a$nBl-}HgrH3do6;wdivtgS2hlSOt~3g;$sM%gK>Sk5hbz>(g-hP--nr-ag)hJ zsiTIzm5GlroeW*Lj&Hu^Xaz$+f7ZxE#mfX^f+SU*x2qbJkJrVohkx7zS9fuQy~PDu z-{*v|^VPeeEduv$>?3ilwLM!3x3ygZsjfV^Y!8mcPyW+7;>i#%EmhVEiNRY13AJ|Q z9`87SMnLxT50OQIPj6Mk5#YND@~>#QVmi}N#P=1jg9y&P6r3tUbWe>kF-POWVy@g~ zNk@a(aE!hEiNF!fV9@$s`F2MA=%QDhDlr+JgI1V~K*zf!Q{_cx?DFf0bnWRp0A}-a z;s_S6*mvJ@fc?$CFkYw{pTRzxSA}%q?*_A~^wPa*L>Joy(8HSB5KbKoI!B{!G*!0= z)F%d`{Xq<@-<7-J`;Af?!oG8Rh&!_d5wOixcqoB0o4WPGE7Yg!eDUy5#hj^fsg;49 zPWhrks1{*+DSC=7=lh$ed)baKRwFsslX}D*y;)e8?ib9_*hxJ5E(@@N7#D#Tb?-rK zgGt9PJ)z={(+5Aa5amBLc03%V7#Vys>5BN^B70XpO5(w@ai!hqarYDfTG;TYlC=lR z?&9+T+1TK7*d27*RNH`?jE7gMD#Z>~^OC~F2Vq`-p#T>^K>y5>xettG4(?j9i`n2C zCv7A!kToGTV76syM;?}Ma@jX_Sj1#Pu{+~pOuG$sz}ZH%EaW|e7`G5j+t|?nR-y!r zHFHtt!D$-X6@X|*sE4@5KH%X9cRJ|3Z(pUvBldi-MWu_kYVb*?lHS`Y>`8ybExbCe zvzkaO81Y%dMn5+6ZUJJ|+K<)b<2LrRjG01ssBQ48to6|P+qe(b?2&&Q6CpsG6shRJ0(N8eVx8mk3n#rJ9#$S~-Ck*AuouKG>Ec z3TdFvvEvvbaiA@@~-)2 z#bCrmjyrrZO37LbE;+{_c2)iDnYx&|8xwSgB{Sa6Gj?;~N^Of>|6A<(X(pt@)f%AE zd&KxDs*(%pR#hv=@ryRbjBFm28suUe!Eyb&_PF!D9jaC@_ThN}B$scXG_ib6YSxmf z5F#2Q|2p`K%VQhJh8I$r*56qxys~BADNMpvz$a^y&r8nZ%C%Fkwx)&j^k{d`6E%0m zmj!Cu+$#Mrc8+Z(`FN&w>lTNDBtqh84hQJXYz;f$4rjN7aqU3_dnOHq{W>Ta7GEhm z2LS4Yc@L8Y{Tw{#01^CXvPLGgKi)s>F!4_3P${y-775#7CMi`ok8xcSuk5N1UAbJv zhYdMCfs^dLJgpuccF#=IGKsX` zwe2(16A3_8eV)1dIXxHgywBQI=V;2ReP->I@t>4T2|(Q)e><*ZCA&$WF)FMI3iFdS zu&93PtbguuJtDr*T9*TTdGbsbRmNp{xoC89XwpO9NsLe6XraChUWX%t8`drWnP|!E z)X`XztJT&sI=Z^1*|@jeA0Ao1e5{?k8WV?_soTzlSh}h*w>M{{4b^p*Kq|$s=!*-E ze7OA3X1XNs?Fry&1p`QY!!6;^ccqa7RRTLnjCGH@3_rC-=w-X#;B$Ysnvm%i69r(d zS^!d`HQ7+*YY^z*m^|GRrN<5LR;349V|w0g6ulaq43%6YV6O!F?9f}vX>2EVQ7fAz zz+HYp5}x9Vt`ah#Q_4mi5kq~fA(VnNEsC{-;@x90H4plOs!+Kr^V%vwS?F93D0wIX z=vWh7BGK((3Ak3#2LltsckSLe-yOEm>=WzGV1pgOanU$pd)@?&7ws1~UX#S5fBGGc z7xU!t;nRahCuo)eXi$`nef`zf7=Uv$pm=eU#%3Hq3JHjL3!y>QyS(r%i`oXVgRgq% zGS+ptSG=lUTl0k=75*TfC(;+>jTO6HOydn>&KlF{gn)sf^K+k%t>+&VUCEu&)_@jH zYK!2l;)c*^*RUy->Q_2meH9{C5 zyRPJJM$oWe-WnZz_j(ZneP)M4H)_r6|EDc&HpQ>;`$`%8O1CravTU`Hmh_ygmtSRV6G=ypt48J}T1a__^d z=Qc;3Ax9Ad*%&_Ve*G1`W}Zx!$c(s-T_jDN%O=TprNp}{$YT?xyYp(Wd2mJ1_v1=y zuQ2r~8u9nj!P#Ug{js(7nM^rx;5JHZbfqpRK&#Myf6vrID?usSL*+pfNqE zGI@eBxUi02lw7ORbpw%Zr*+!3&)xdnA6nA^w+FjO#a4~6Nl|wvhdd1@d021xf1?5; zKMd+ZG)*$WoTGVqgvDrsD+x*51*|Q`aRtxwg6|Q6!jhBThSQAd@-JO*0Au5BwW>=! z7jIyz)rtcnFGQEpx4OO-+JvcA<+tZna5t~2acyda@KO`%dF&_bD3-}_wqzSNhC|+F zB9F#TX^g>-GaVcaUR8OV2-Th4MB1AT63DO_jcldzEt?qci!l3K*DL{Y&Bq$(K_>=p zUbj1eOS=&m$=wqe$6-W`HqT;3GRF|OmD#j%T_hGmhLcLKHZPtX`uK7>>43&18ID{t z$a2Np?o`r|K{x~7AgGV~!{Nl;#!s`%zS%5srOymhEV-L1`(nuwu4$`@eE9YM^3P(C zEIUb_l;mM^q4$;BJ&$8BY%Q-BtK`6@QzrgeOU|87d+4-OOPuK#Tg^(1yy0Ayn%5kO zsftH1DDpW!GIhD(__j^54-1`cyAWptY7!_06NBp;t|e8~P8F_lR0f|6A0ox`UP5En zSkeo=+0|fj*~L5I?c^w97ddHPK!u(B`p-B!oFr#7)L(G)2&&{SXOBXsgI8?!DJUXR zD6!ciCL;IAIj}W?5Ap;6Cu18|(@pxLq>sY+SQ^P~`)+U_Mm^tCD)fCcvhi7}85xAB zldJ5PhbEcB*J(F)y@YU;yABi)<%)^mRh3lB1~f8B($+3K zww9ESu9~8iWg~C7?cw8)cqqGnSNv``TI7+NMPM5#2;z3gLTipiBH8=FYql;Ns@`?e zU9#`sx+4)`n}<*vm^KUV0V(5s6)X5Jtn6AKuRKoUff1l9=_-#n0nxHzJnZ{=a#cty zXP3oFt-dWr9+0)~axGSA1YA#~Z(UnG|LL-lo|r_Tjo5eSXv|Fqn;UJNeW9zcAl{Qe zbzWte-hnL9?*f?El=-;Zo3xKY8nw4$6dv|Z<$$Pa6S2|Pj=M0ttzUCtgdRujk6jtY zmbubCtLjs@LfBv0a@%j21{E#sbl~)-RSiSfnmZ}OfBEO%eTDmxc-H-(ZHXZiHp+60 zgJ@^@NdE~`p~P?%4h&s31t`9O2Xv`I(ZMgcTorl`F%hq}N~!F3 z6L~Z)EO{0H({r2`&5l#NPS%xiCnP&!l9$I8&&wg&Z&yl;!wWN`3m?LxwTe6+>a0*& z)GDBMYA-0rTdqQq2G{V}9OUx=QAvE-aKu^?gJc=1-1N5MvSmCJM9OhgDNeP_SXPpeC^w!0xL|qN)F;+t=P^_$= zTK)DFE$dFZt$|FIy(C{CxLOsHg(~`+!>HvSK)#t^mU<(X**E?6hc_LYgx}O03*P`^ z(51OwUO#x`Ia%MBEci}h@eP-(p=x{6r9O<;e;2lsfA>E*I337->hDpzPd6*Mrh^j* zR{UoS5Qfg83HRTpHkHwxD?w^zV|FvUENbhM>b?E{VE?b?e)iMc?Vn^+{u%vc=6`ZS z#9KeL-?bmi-RBR3IAzJr!%ED3$-=3LRuA$%Vf{<02AHuM2wpE+7T zh1OBm96|T^fEq|Y;*+0#n)~#p;i*05@KmmXM%4JrXSZbuM3-eJ9-O`%WoFXP4EI1b z3kE6&lQh-}$Yh#Gc1>oOiiZF~1 zqv+OKE*w643rC`5THY{FR6X~z-rOg>uk8QVa|^v=?g(|AI(a{w`^@B^ulVvT0y&1qYJjH=wm6-s^87qm0;q)Ro#o2W7T~|ro zRRoFHFZu=sKW}K@Zy(xP_HFzmaV9MzpbmwGp(bmKOXu$V?rT{&34rFggeA(#|Vfkq#!baJsjlNBg+Eh z3^gytpPjq6_*U{Z>EuiRd?62c)X~A5Rql~O@FSba6afkLDfB8vy9#T4p7DLV^5^kY zTxx!iDOZJX@^zQTc>%Q^AP41jj&Iz^waaRBRV2ybd)0^*D$j;zs(`eiMn>u=CR`)$ zI+~4waTiP?tP)J(E;b?ZpZ(oul%MdqwiV9Hb_a)HA7PC@2ZIP%v`HSF;9-itK*%GhkXGiBb*z=@BBjFu6z!8~hjlus zK&;5^JdziSqb4~*=?Kb+m*OCVeo7G#dhIJ&wd3)x;5Kz%n)f3(l|ZB29$)2k2M)r* z>7Vr5q6c29z8p?_oe+C}^Hr-2o8H!Ra9N=>dSK~4;Jt7bKZUk83*co8BncTK>`U;| z!CSmQVtgU$mvr-B`yBUX04$axEajq?sTVluZ}x=%c+r`VR8d4IlL@KVhr1=`pyKy; zD3<#RLNxi1QeM$u++EQ5ToeNalEQwKZfWD#TV<#O=MyUFaE}5VYu*Jh*6w(S50!hM zZ^${#hf}TdDknqF11@GH%T*rbA{<2ob+dVB<*LoK| z|2*Xv__Sx2{G?aeb5y6+ZMzSuv+0AwN3ZO{0Sq5JuIjhX##71Oi@oaHWs%K9rk=EQ z4XW*78J>P%cS9Vz9#@k4{GpuSdPokhkvEC^3c6>1k7_6!{)Mpa(aoj0Y^K!7rImCcbEHVN zRjaL5A6+ZM!tzbyU#o3Pt}_gmEhL2KLz~KDYv0-V>*6BPBDV&zr+x6?L8~<#_v}vp zkPqVO8Nno)*ZIem{hPEe?BKtjIr!Q=d8{tHosS)BvlhWfN>CnZhJKY%TdKAu!&Y9% z+mrT{Sl;hsBaxkQ3#a^M?$`V&>dC5)yV8D3XqLGq|Ha%d@}b2$+MMulQJ|w?c zv~{_6j)=YACj{^oynKkfBKM)Zw9 zY>pmcbM&wlhT-or{>H#yC&T0Rc^5H$94Sn7^r8wL!W+S;NEsAZPdTPzXzElS6{a?Yw>%#Cs*KA{ididV&!MnD-(j& zx(5g^$Yun-X=u&I)?D@~XYlApuIU<&NDk{yP=^q-MbM*poy@Z-wrQCJeUSh|;)&#n z{Wi(h{`;fMBw7hXN5*0Tq*wq!dGaP}-)F2pm#vnAViM_K6k;bh&)XKP zBv)McEv&2EX#Ey=h%G~tc0Sc4H@xshZFjjy>kYg4g%)A+py1MKXI=b&7rDS&0J23L zw4rv@3u}8QAM(T@HXKoTqL7*iuZaWR<1g%)dJUt=d9VGGhO@U>S8piaeU5dZ7h&0@}KQ;e(!$& zKI5RLmyvidx7bgrpZ!GI(qUM;cx%1!7au7oCeVB3A+Fl(eLu8e?J8af`K7VHyph<5 zNVcAkV;CNcQGuQkyK&j?Iz)-{^cLzGN4(1F!}| zC&+8DFith>0`Yw>`z-H0YsvsSefliV+;UYYBnxh9IqR;L=$PQ2py6bjB@bzj(E_DU z$6W+M?#n&)3xO}0Fz)&}n=01Q^*gFK{HA;$x+;r@$rmP5N^G}fcEK|Hect|%<<=cx zn&%Q~wcCT$wo*yP>>J3QXW0p5)pjPicl053tUBsn zeZAj|m5?r>STi&fc`~4r54;ZCaHNYsf@4U?>Ad}1#Fxv;=qTvO9LlxB{p{|&mgxg~ zH9k|pe}i`p0QoLyE150;u`AQm*e&;qcD$5~T{t_8M)HbHBli7_MU*Q}Q0!Ryx$wB# zeVYsRa)C^)To-sJMneijUI*g7XV`UT?!?c9r=9#T_S?LRy_^9U1NwzqC~ z6y3%SuP(gKwGpxkP(C0&7aE3R3Rx$s&)RyHyGi~r7( zbj1lTupDEkm>D3_n{ChFCz^o*oZ70WhZipSICrZF^VGNxgAzT<8;1=X<}NPn#e;@3 zQ$Emv*#`}rcZ;(zvdE#h0HjrsQtfdCFQQHNQk20YhsYz8(wP3leR+}&> zo(rV5TWqBz@t&8u!K#~#W55p_D`O9!(*7U;QuZMm4kLJz$KG*7njU}t4t-uR71r^7 z8f@1KMxN0QC@sihzv$^fa^14hF!Nn6IjFvt`q`0tIn&>;_MFL~`o6vaj9qg#6n)Tw z`?Ylz8~A7my?4VoaHN{=ySTIB#PM{*u?Sqbx4#}pnCP#0jMNyuaEAeW#J)=zB`94j z35UlOD`-If9KIRch1HzG@W8>t6qK3I1xO0k<$e(fXR)6=j^k=QneHRhP)|=Z14i`| zM<^`lST|;XZ-^)^DVu1m51OOp@ZOQcbH-xZp12s}H{EHy5Q^6wD%N)bQkLn}@N}10 zw&JYTcKhNG7=&SPr(yBB*iUgQcSV}Oj&yEGqF52EblEnTyCJz9)>s3^aUK9-wd87( z*_HC@Mt#*i6?)_nR!Hg-yZswOM(+0ubGI_I>Pi&!yh&jZ z_ntUK0dScEO6Hf8N?7(}Fq~dMfFoCI+s^kR{8HbYiL*`)9nn<+x)Up5CxN9Rdo`hy zZq^d3t(TpG&jILH`bEY^=iL4pud3X_`u!@1uY>q~5dWkzZ8=-@Ci=jcqi2=?eX%7m z@{AQ-qh5ynel^M75KE5GTe6?xQ7aq0coQ~Uj8L0K6)@tHMmJQR0y!b3OIjjd2UB42 zy&DQK#H|##p0!jpa;S)CP)q%s=!Sm76(G+%8`wi(k74m&kp=b6@ zemBcOVLDw2#&yZ=r00qe=O91s6ilA`*9tU!M({NqUyK{VikxW(`m)h|sj$ws-Sx+& z8^qPMF}+Q%yde~#j~J?_gRd^?8=NjuiNn^#rj(5=zZy-3E}+;orejV9i=d=NS_etR zUHiBX zHiwmjFdS`g=}y}Tk)>kuGIS9_+RFVvlubj*JZ+(P!4ELK;$Sfy*ZKq`zR}CnY2dlz zY(%uS&&@cSobDJ?O*Mtjzt%u%zBTw}AK7%2;RMEXU5`t#S+ij-_ltmSx8xIcn?HC$ zZV|@tvqV;w>|cyq6 zBppNjhQhRR(pKZ%c0@1iiCk9%MpjyJG5a}t;)yf${VvijdK!xDII7I!#>b(gf!R*p`zKU564&bM zo*2X}R3N}&H}CUQ2G+|{BSjma?jBnznZpa&@RJi>Co-+`Hxd-)5o-wvWqGzb`3-3V zMjO1#=}6f)?VZlL-@B(=7`VmZ$~XY7;^6EHBRbvEDqvpp>mYvQx%qRhmmCHIoE*Ut z(Lkv0)kZU+BwP z+ehp_x~9`Ib@w`k`sAhG%SOqj>eA$?pE}TXBBeE?o@6V5RF7cm81+?R9N!&y;=1h3 zgup6?P(CPGvL}SbIy3k4Dj2XeWNgwcu4GenaqaH-NpfplaYO_9PRS+1t^NK-qI<4- zLGJuyJ!@3IToU_5f_42f7OA?YBJ-i^=xiH4Z;bi5o^kC#ZqER|1`RNz0c+(5 zt$Bt8u~Sb$hMwiq{^Jk$gF*gD8}VpfjU+*Cg7?wP-{~$Pgw@I6uyue9XI9i5G&CTR zhm;?11?Bc}zhhR%;G}KX>3jISi@MNqZDjP>P`>>{o}8c4nT-sz^Bz!oB>|8-H_0`G zhDAck4MdU^wAI%IVKLe6vl3A(FEk8?bo_EDF6+0VEOzJ$NwY7d%`;c#Tu(Qkp%sFt)>Jodyyb5z%WzBn(s)`Q?qcN<7o*PeKK z`ISt6^VdA5VVq#&+YFNAiN!u0T%`#h>0x;KPe#?5Op#XmbU6+6xfP|jw|35l?wPa! z_&CNe&~r%ciw?m?SCt1ieGb-2@yCip#7OF!R6l8>_gz#5OI#cr^ww z2`e4tn*)saY!e!Gt|eBMoz_fXhi1}{?9r^IUGDpuWQTfMYkd)3m@d^6(N_D7ki%c} zJ;m6~3BNX?I3c(CbiQB0k4J10t!1rfX%H7lznpRluoomJ7f*B)B zx+iLIq*#tG_gx0VOD*zXzhH1lA$_&&x zRGC-uzs?>yYr`hbNUQ53&a@a~3&GI(-I>R>J(^As5?)i#zLzNDME+QLj7ffMn@^tLlq2+#P{tqE6Wrl+EQ9#oBs~Vx z26OC*f~;A6+a8}{Xx;5MqH4#YVYy!{JU05X2?o~FU-!Jd`{~Sl2ll)_8Y;x?J={O;!gh~p}g&;u|K{Rlt(07 zH9jX}VR4;zl5Oy5@LckL*{7O`J5SAEUJ5+8!SYfmyGw+cty1~G1Le(bqfq;_*3)n- zk%J;wZeOrK+tg~(#?l{t_T*#QvLALJ>=~Q(#}lVe-QZpg-nS77)7piy6U_s?fsf_psy#+WAa6@_PbZXb&F-~4I$WVqPzipiML{;HeEyR0rsuz-D9~hqiW;5 ze`;e>6Psh!Vyc0M0l-wo09?d4e50T5os#jVvuQvG8MRP*nG6E*9?Uc2gRALa3fYY6-b zVy|N^QD@s`JJ((<0USNnQA{ z*szUUE(vTT8e4RjOUA>L5lh#YO^;Y1m<=$EBuwiWQ9IryFq3?V z7m4gkOJF=cxP8|m9}g~{be1CtE{FBg-cUy5I5F}ftdaI`7?UgB_FBk(T<`hmxQNk= z`{fY%xClcH%QVA=?!%9Tao@BepDSTLF_?~ctwvw3U!I*6_uA?o7U8Phv6`5NAiv$$ zUdyU}v-{9tU1(a74+;q9uADfhFqt~^K*jzR3jl06I$?!H3}C0n6R($M$X8tC)j(=X zW>T?!ANs$dh1t*{Q=P*yz~pX&P2FR=0i)@v&lJ%p@gy_BDYt|)EKrvEX#)hUIpRy| zk*Rpxj?XW=2NF>EVYiPRoQZ8tl*3 znfh@ufukRKJhw0QZw=RS)xK8bh@BFfnWdsu99}OFbVTAx?ZfAG2%XpRUL&r;@~dvtKpl0v#$2-jJa^YG zbLLerai)=&SN5S98zq}!T8@y}Cc{dJGkNTyZq#s;#+!-C*)+FV%`n7H(M^A(F}frc z6oPCLPSG+XCRrBfvuMu6Tls@kljnsTEyw9tNQ|$D+Zn^tKL0=*5TfkY1##K^VvrSV zfeE$~@oz-~UHjyR@g00#&zM(U6Wk?nF^eKJokA_5Qz;_&e33@ZA7}g;troKeO^x_9 zae>^$KA~#wj}1RWJI?QVs0lVQ4oQuuHk7aP1siULmK_Mg%HaBA=KcE_n*NV67`|G_ zw3|QKNioa6nUM5hurt6ay z0cSSIG{u|3XrpR330sOEXFZ<~@d>CL`EG7W=vztme@yO0ifjT1GMg2bidyhz<*S`K ztQY5YD9c6dQV!BL*BV-I0tSgqjnYWr2qUVV^P0eSo>|(941mDr*{=&V*Tg+dJK7}y z^eEt2BN}eu5fs`aD5~%xT`jmUW&Y$BU?p)bKmM`d8KCB4KmH@k^%wc0ki13Ob6~~F z?aq3Q#a0y+oQ&l0&~luXkXMQ)-9!6Eb>NrOd^a*ML@n(M3u~ep$xcsFjP^o??`iY6 zUcgMUvDsK61c&ESKHxO;7G256ko)v+cF(;cwgAaRx~Fpr_$hq*E(4<7iq53KapGN0 zq%2yDQ_#CY%KLB}NfPb3Sx7#H?Xvk88ywYR$fY#CldER&?xD&T-E<`=ZmDd#aJKm- z?SK=qTDZ!wt0dhhJ`^76rhJZgGzCncwhrw>DFmOkPV&9dR*t2dZK0Vq;err~6Xetc z2b1N9PFV4-z_7W$LGrjZ(M)HfR|^Wjw)o@rG1+1eXt0cbA_R*;t{q*+PW#x!BB|W9 zo%9V8Re^|Hu#^nEVug;5>s6laUx(Bo%cX}%_Pkq(Jb&{WMRR)3ZT|8wS=S2bLt1O@ zPu?W)U>x!-2jv5*a}^68<{5z9S=@3WWs~Fvnyn&pc5ZnFqx*e{q)}h$m>4?gonjqG zvjr{z@~*f8+8U%PD;7l%#R5l1;tgEh?8nDzfS_?WPRc9>KyZeIgtmVMqz5j7bKkRx z)R|1i^F)TvWpCOJ>Rk5`oDdYSsu=SnN^jqRamBU@Y91!NLa7y6X}J%HBHuUPJ%#V2 z29#+bd{oTrv2**2o!LYm>^{C2_p72fuhMGSjoD`2WuuAnRZu4<=^NWuVVDE{@RW8b zk>6S82c4o^`!dqK&N2-yZ z(=t4q>U0;kf{&WRa6XW;wXc>4!(zlqgh9H7=m)!4iM!XD1&=a_fuFh%kwGV6zDT>K-C@tSvs$!c)6%{!T2Zky(i4O~_8clM9$qDE6=q;q4lC#Hw;Ms{@JmM%>m2U(-miy~aV;O*m5m z-hwA@&4O(ea@aCEs|mH{s;zyRu&;Z{Il)NWsOkA-`yv$6@GcznXHu2jQQfT0A35Wx z++Dj=vT=VVxSE?+8One0VgMIhAlKcw5QeyRcjT*s*zPp0VN0C3*JpvFgr1(`PQEThx2NQzt4R<)JpAvx$#YH$vaab>yYE;eOlD2 z8;tv-3+=sDndD)>c%HL6W_R+4SeWXP#^FLyTVgroMv2Zf=QWJERB_arVs`>_wXSP; zWn9v2HS7%(R(QI9GqD=3(sbI>)makM;MNjG*JqgM0+?|J(q@9;`7m(|U9k&%PVE$~ zJ(0ppgwq6^QuPd!H}IV%pDj*iG_h6^zzyqaV&#%b$@rMAHtrsAT*Y(U`Lp^oeWMA< zHGW{}G%ODT-6A)UykI++elAzWT~8<>kWRQ;G`aaNS4cN=ZoiBHmLX6I%{J)_46Ltc z+hkHWG)}Y6I2-D>;;#;Q>cf|F-o7@KNOR)MB$8moC)#piXggO(;)C&dZ@zFB*ChHh z?G_O#CM;zRe8+dnmNqSCxo_HbM)!a0x~T~cVV9qc#-*uFq4YYinQ^Lz1P47AD04AS zGHkUz1&*Hp{qdoS*o#2u^vD5t{Q{z1ukFZ1fi{!mnS1?$PYY6DZ8@4zqIY zb>G*j)q(L7rC$5-#duO}i&Xne6h^4F>dKNjCmUG59CPG+HaK*}p=X2l<@99`uWZ2v zl^zdFQ_QOO=vLX`W@JzhsKWiVRg^VZgF)byMgI7@&Bm2lD|W5He)k31mI0w}+6JdR zi$_+yR%l#W)oB)^hj<`7RKHc{BC5wu1pw=^C0Lt&)LB zFz0i$#W(Gp62~HGR^v62FVSdq{uRez=-Bzm8DA~4jjE3g+bJcK@lgQoqw?j#a=|bwKK7yr z1NoF%kL7O~vY49OM`V7*SR>+Unf+SA+(2q40S#Tx>{iysS&`-6{8(f;W4_ZJi}5sb z>n6aZMwz;9=0-9)5hS>9`o_v}KJWYBLv(J*#|O5A{K>wi z&DU2646RPf@t6zNBxqerq+2W0fU99IB>*G6l*$AefpyRZ>Gv9JyJ5Kd909VSKb&cH zE))?D=|)hoU9yd(4B^%z1^cFOq85R&;nYT@mknRaJjt3*K%69M*6oB+oNa$!l)gV> zHL+bZJZAnp>5k=|V|K69DzbpwVA4qws$7~D611-;KFI`k0721N_R*P7G{-Zs6)$f% zF6W2xfZrG|^>K=lYYY)CJx2>9FQ1evIfs3v6ag-B*|{ERxq|~isWU7VDZV%=U_@&{ zn;SQc84u5z%@;KYC4b1MLd4>7EU7$h6&FP)|GY+@VXUIyzry}0EoE=jS@s4v_|D3V zr*g25`*1`%d{386Q#pcb;ks#U`C(O{zi=J){23;^P1DCk1rGvt$i`5@0bhILsDjI z&j8=C9RZ1B%_ZmKTRZ(7+lezVY!f=3jP?$@5dt@$tfK`)(=qo%UU)ot-_+Sx@ngy7 z;knY6X5{0Tdr2(Mxt-=gw~f^d3eBJU?C9=J!cs7rEETn*7cHl(^Q0+V1>vG| zkV@l6TofS{f*>`;SqHQ=`vX^Qv9a%XbYaY-Eu@@lzKcb6z!^>wTZN*=P}60z;A%fQ zLo}-MAU+k*Jfugf$o2}JZj(p0xhIrN4y>g#0eAwHAI~-Y)=SMz0kYN%@Kz1_SFh8S zl;%p@q+bT{%7#V~z5E!b9T)_Aur=2GM~o*z6_{L*v>a)i4mNWx4x8~ZI+EpY?ni+a ztqHG}S4#po#kD{W+)K}jm|eNqiZt!}d6#^{yyAe2wGx|l;@r=h{An}!+~j|=nZC#65^h}0Ch4p| zN!N=AmtM!7XAHWnl;C02iLNA+gTZ=YlenMP9V6UxzUVIZCy;)%Hm@J8V#0u2*g$LfJpyiKS{^vVk{kN0YC4c7_} z{j1;Peu3PB(?s#xfud7})uI_sz|*KU9W)#=_|@D+B{j~EgN&Zs*p#+Bm1@FmF>Fh6 z@vxqdZ08V=7StOxp9;d)oN{@r)%TVNT3*&s54JBtzf+kErsw`;G43IHQJnnnk>onx zAH?1HMV@k&9sT|oG0<_7zFH`1FU;Za_T~8Ts5VDmB$BGR97{m9P}EYY%*I%{t`+Od z#`b9zROfn;JC>`s>*7WW1)G%b`r!syoJNG;sEf~P2lt}~tX#`@#;9C(;K^VLOKHXO z5u|B2IJHh@Kju+LNQbQtO^*-w@y_)2#|N|?!8dl2TkoL{GdiqRMrrI3kW%99I;Z-piEr4-@Sz527NN>mthRiw+ zmGpVHy5uz=zT<;vh}p-w^o$Pz?;)s*dhPjy1B3X?iH`u6K2kEb;+QP@ZRiVD4dUfF zHeu0EW*1^<2*2gS?&5cl>Huyffpr0AI6n z@dzo4t_iI~(Ok{*BC9JM+~MaopKHIc4HtCBA)1RXi+nMG?HLQu7^QY*fanlQMLlY@ zYPzyb(XYCWRNf>V0h6nrEfBE<6`Crjkv}QC=A?0PDUsh~^j|XiuNnO>8U3#r{XhKu zf0pM#uOO`abROL*vN!ZsJ@-K^4f?s>Bo{bvnfB;hTF>x5KH$V4i%gwFh2N@rUf+{ zj}0<%QEXILDk+bTF-)n0XM)pKZ#|I@Pp5qvmh*n>?w5;w-n6VE64-~LS%_tFx42tD zHLNT?3p8^yJEN4Ed2h~pX*uTc!fHWzT8biLUj?>`a)IjyE6c(>CQ)15i_u{WpX<^| zO&&+-wuzAMvTMn9yQbZv=6vC{kWRo3lKZXHi+02(CFszB_I%in@Px8eWU`r+jG^zM znvElFB3KN(%o)h&$zb)A9c9;;d;7-F9+-`Q*}2ZXjs8jJ+bUj27iy}P@6M=+k4>vzo&i4YVl%#?-5eyTg8h}QT7H$ z1JrUe#@J>`!%2(lt^uT>o3<%kmw`z?Cpj&s16h3RNevgDnJ8#RWvV>`U?DDKcg&OU zxWdL;8-{qI*#xjRbOf8S4KWRym6e2X?6^|E;OZ*=!w-z+P`Y$_VfARY9hC|u(FQmoPbeo*|=_rA`S(d|$8oH}r(5e7d~QkB|j@;>{{ z7p^wDRy5r$Sp&+W2ey;t4*Ll8B*JZ{Tqjxc4WMysbG2|$gj|QT`0H`2Hp%GN1jAUR zo|Zu9+yv{rVU=v{q+*#ot&O;l2B-5%J;?>OHwq6LSi0iS%ngyEpx|xt$qbF=bwHlU zo3Qu7PlZhoba;B!tWyUI zzBaYjgcvkMXG~EV2)m4UGw14UJHem(2aPMOtTgw`zpwz;{)h}oC2L~_ki172>-9?U z)3|Fx)6d<>h^{SX98u5x(UPjiaA1wlRgYl$k-3Sz*SEc8-wm}_khLDW+r`hWI#;`1 z{h8m&cHs8lpWl}DkzzTQ33*mC21}YH@qSM1s>th3WZU)afSLg!*NPc+`N%ipoN3Ep zimkHnxI$wt2>xlg?^2O-5hARN<>VdL4mu-)gx;y_(>dZHDVBrxZDAa`T`FGM-z)oj zZL6Q|p^Z9S8-ze(-`hoy^%j5JwrbIs(O`N^siEzPr{%X+*|w#yN7(=D9j@5|pR`;JC_?p~vF_X*`cR`7I<+$opbk-|b_e*2?My*G!#I zsv!zooo!mT?*}; z;BvuNJ`df&NK?JTdb~>$aSHejLmy4p zi|3D#4Wq^l{yZq}mrra}(m#T0%147f*MbV00J=rmr|*r7p^uBS&yFq?1f1C~^I^Jr&Z~=@H9BPHBA^UPmzfc+Z7M&1GijzgoH`R;cb}3LMspGRHXLMdl+NxdQ zrGqnOUd+oNUSTkU-i};`NQZRReaOx%l8!+QM+lLAM8RGl0@?UtkvxvrJDx&czpYZIB!u3_K@#Wr_D!y^jb=mF0syQlJj&tD$0;+-Cz+E4_I0AzUd zY>&^%eD0zYURE2gP9O6z8dJALK|KO)MZ4Bqq_PTl+JA$yer~^T;lJ_4;Gm3E@C-yaG>85f-31a%5`HDRF8Jy!GKr#{614>|c8{HV~O>gwlyFZXuL|!FB%08ofX!-ugyYqksrB|YGc+?S1*maLjpcVl z=wv#Xwe|jH+kk?8@3{P^SS-(#txz$G17<*p{)JKGk^X2nz+Nf&Z_2PZ)C6R^m9vWN zbA`NBgPMe{keZsStS=L?mJ?%!aX$?>jvIyTnC-z1EaAX+IzykE~OqG z*uUOitYZ6JTiBOHmy^F6x-2`P<@b%8)1uLP_(yq4gbFcw(;`y7Akh?Aa#6f+W-J=wyR&u%ZNKTP?Qn{WU z!{5MwOT%ms4#v;##e_sI6%OTUh#glwp_f9&J0Ds_Ijap$-0Pg9tE&ZEPN5{pe-%pI z^nHb|_yKQN>%}=|SZl?M*Q<>g0J0iABlpNXU$|?mbtkZ5>O(K;OB)slQ53a9I{Y$daQ&}z=UQYZrO1rEeo0OO={p$P9_qENW);sZ{>9HwXUhEFgix$*uy=;t&iG9p5r zg^w^&9&5%azphnezQ1^F#BPK4FC^QKD}Zg1X&g9kfSA0=#1UAy&~aFV4@c4DJFMjd z_m~^bWN~@%e#9OO&?QkEvXnZD)HMGyo!Q6jz@aH728)bvOJ-lh_L~d%&z=kU|APT-Sz@&N4Aqllv1Dl%7StHDS+O$9TazA}U4 zF(u>^Qo{L@emmA%Xgrz4MuDA*b+-wpCu-GWK=<5I%iys9OP-^)6jZ{E^9jB>+nz~D zVGS;VA?qDa>HR*ExdLlkdNWHa8(Jf*HcPsT*NG$G+EtvVy0SQ$_Ph`*L`8VOS>Thw zVPz94g(HJrHhU}>t8a46D4XBy+YEYXegN3xnwP&+mYWy-m^q>9&y(jX#+)Jla5zBU zyCc$9BrAn@)o?!;i^P7(*B z*mi{cZ#gL6LJr)S0E&Pe2Y!E|ySvQSptY9KOa6bw|9yTltmf0#4j}XT3EzWtbi=`D zEMFT3oS5(&N%{sOaT50PmjL76;J45(PcawtOMQw#B|+UH3~cq?uQ9kOMtpfMw6Dg> zX*bcD5`HQxu|d!ak(h5o}xd* zD+P8i3;54@qy_3pnqf+Wc#>_vl9(sjNilpgp`oUCrzws8q^9@F&`*-gV8Bf+lA+bl z2Mm2VvPkAtzbn#bfE6dJ=(Htl_^pokYh@0jPx5{Ovn0-!8Hr|`+Khi#O>fWeckC;Y z$D}0UUVnPh?^}1d?_MsHgGQ~^gRw0wxt%DhsUM|c#au@z2}Wbwk{B)@uE4n4W@DIm z)05VInS|iE+4mZ_$45{5IQT>Oqy++4@hFL|fe|VTt;Yb{cEZF1<^YPm7F9q(GjIV|wf_W+j5~MTN6Xe4sc`(-eI~ntBCw8Zu3Vg@*Q=PaMb383i^cJj$ zk3bzw%A#}k{{G{i9`C<;egFBxyZa9xeA`j|F!3Vn`NO>zPiC;a{kzZi&tbdIo)KFq z8fQ&c3r5xCPo;{F_zyO-8aFL3DplK)&Lee+0;$V$slX-{Q$h8o&b$5@i&!z%Gpp36 z?d766pvl{_(z@Q|qQZ)%dUJ0u!q>Me-n{O~sOfbjYk`ddLi#`dt+EXPeL+xb;zGxy z>x6Z-@VxJR4-iMyO_F0P%RfVF`OjQ^eR=`-KRXAI3s`~R$tu$Cl|3|1KQXYTBx=C9 zO!S!-)~I`DPoTCk=t44R7-nd@q?)?qWFGXhE?V)i$7$v-m$}_h^4m^OTATBQdtJR$ zytjLup7{Be@fgI;k|OO|an=mzd$oX{6swD~+Bo@)n+Z$#kqT~S5LB|UoIM-#_)}s) zIFln3%g-^#fNByJo`xSRL4OF()h~-s#teZ@Ym@8Ookaqrc16$mZ5Y z6tAL5Xce<0;0eyQTB0eUn_C{y(}rudTY27Nw@gA#ZH>?^c1BYC>%SPoa%T@t-f+9+ z8n>b7{zjNWX+*Od{**QF8t@-oiO4bZj!F(@H)Wwx_|lsXRFGT88o zHMa;(?l3k$x`mka(C@qBYHl4^<>rby+T6$?KjK^^Mt`UjAgqzkT>=wGeqP9>GU)2( z{g967p)gF2(?9#_fOPU{b?2^v=eB~nU-pk|?i(l;(`eR9@C;%L{GHLo5qK_-5W?C1 zeOVoSdH7~HIQVi5FGXK^XjS`MFdrV{jiv_!TV}i+Kw@azfZGuJG7$XYKf9w5wj6(l zmm=|SbT~Ovdulnv$#lt?eXN9n#h@u-S*a^PYNyl1I{||V9lZG~qTfu!gi$|QA zd)7H^4e-T>(%n*(7TCX?&6GP5{?Ls$lFc~o{3OeCL1BLTf#eUBQIxSly z&u@&{l^+;_ZW5o!Min5hTMm&LBXkR+bhOC3O86ofihNP~ifiSBH@qchd2Ho02M~D% zxJF{cJNe-mo{*Y8n)HujCcD61B+u37NuIvqjb&R%2>VeIv|6QCLf)E6m^{opU-(EIB7`lp9+E{%FKJkv}OAX^Zb)36BbwCQ`l$pkm3mxfo?0 z)>ks-iAqMFdoXYr9B`}5{3*t@nA5X5<{yw_gt4AfK8Q$*8Iwpa;>4w&_!=-2Z0T2{)jXNO&e}*a|g74s-epqbOOa6bwD-Vv3n0m;{Fx=jC1^@3BV^|2- zB5h$5kpPxKCAARZba1gK3Wr-OiKJLTdC*BWMM2CLazM88(`oEP=E-2IF$!1V$`Iov zAOENtcmR8F?x3yoGCc0_w3B4CbC4X6NiZ}u=}IQDJx{9ksMSdtLm{t(G=`8wfTCFC zMvPUUr%?+;cgMPbVbq)&c>Mo%zOU!2Aw@ymS3#817 z))R>XMiyXR&{!{ML}&w%Jt;Z$b8*2}_9ZLtsRp+_a?>hKjLDx=f*+5l`|Pe&d135= zjC|?N(?Dw*^?GOpy*xU?I(l&U4*RG$hzK5^7(u^nHvkFX)zLe|>AN&4?7FgJuT(yy zkZ@&GawhZr)WWEgqKn?tFhC)-ykN8$OzU9@IM z^wx63B9HpJNBAAn+<8<^3UHI6J4Au-%h<_@e3A~JHWP-ZRlVcG>Ej2si{Pm#1~III zI?~9oJ;b*iTNhi}AtuTW#U?mQ{8ML&me#T4WhD0oZ>$*^w*-zN+m3E3y5d*`lAD-gGhbJ`#CBHdF|2!F_Rk@n6)z6f*2D>AC z&1s+Wr!lx+-z9BRd6uw-FdZE6z3M0;t2y_$$HJWpD)MO#z8>O?|MkFj->=`QUw`tU z^b>yEn~miBKzXinLDC^T_(YE8#ntfvKGSRN>pp8FS)(0eEBpFj@J4r<`~5%2@LF<= znewN6e1(HIb01xtJf!;C2NHj^01%Yfz)_oQefBH)rUP|mMs-=#?_G5(kk|lul%JIv zp`mNdBGia>^$CiIcpEho3Tx=gH8!1`<$%V%>_&UX+!%VxA@pKA^t*d`?<35;lYS<# z9jxo7IQ+?laD--NKd@wv-;|s|H_$v(~pa<&*13}vlm1(*sK6E5CbH7#rkc}M}zSih13vrt;Ti+4<3_#|3hMd zRP(bIjOu7-acrAcl+92lHdSG^8QYHL@@R~i>lYj1tM?2~f7J;4I#)->JaXhu&sr#d z_sjB8ccQ?BIidyP6`rnN#s5E9RUadSX)W$s0q`W0YH)qVaxz*4lr0B&r~k*w2oop! z_Z9!&=KnkV|1}C&K=paaenaPY0W^a3+5mZ+Vi{vWdR%ZR(RKpMJ;fhccLWjQt0^`e zHUvBatIAONh^Hc5hCJG@bpojMxPhKU|e8-3P zf39g)*)-Hu2q_?`3z409!z$zrMdl8rx7$ zM4@;XfG_yG5}IE80`Ly+fdxKJM%fhbG#8jvZ1{U;DmyLXRn+YUn;vi>e5bxx55VWl z6_z%dyp%Z&(-{K_{h$3w*$@_^SlA29>-TmLcY^qu^>+Xdl0CKyBX^IQ&5_WL8Vm6R zy%td`&S03}CBe_AQ6SnE>z=}Wus>NJ;gISZBe*)`9&COjuZOJNW7Oe)uULW;4k zXO)E$~5pUNv=j3D=wr=!uYzA;BqG9ZsL9p7z^*`f;ZwiRPzAu$W_9>3&`okW4 zbToI>{yniF$$sSCC*U2@ zRJhDpdR_T1+Ap7+afY*=qjZ=%dvqcDNC9~Op1E6&c#Qfg&wcZJT3qI(PeGM7#G_8` zj(UF9;8=K0SuS%StEbk1R+_v$i$Ry__ly*YL#juzL9_wr;}4}{srlinHDy?^)P;0jK72b{qL=m8^snfRMtg>Z(j%)y zh11(h&)ep_u$Mu+GU9Ewf_2`d@}0G7*!9`Jbf5%Uj^vHfnhV`)7&qK3!wE~~t6?4> z9ld}!)*!Mfy7q-59>+Dyr9xCPYOIypxY>glV2x7=1Eg7k`}na2Nk7a;WaBcFO!7D* z*gY3X=(GW3ikfJQA2V!{oUxT_18iv8&l4FPi=fSl5n(X{64HMZoJ$m@hG3s$#aEvd z-s1v^<539>i8_+pC!SGBo}TDee5?fFB%tvJLT1iJX%YrOIWq_x&e*Tp6qT}|;QR&H zjS7OQtt4zh8uniD|117~%l||EpYs2Sjdn%<4aQP@{?Xlou8j;MyYC1l_LGCTk02cT z(2i;|mz*hvb-|jHv_%$rEO9H8>>+>^3l$4V z_s^XQ*sdLROV`=P*BPXd$q!0^sJq3DR)F-<+pLKVH=~uOhZ|MvS#EgbHeTSNz~FAj z?IVh(;tQ^&a}RK5OsjnsWQ=jpnQH)DKr+{$>lQakR_XFu=flf3X~8V+7ZNk1LF93gW9PsGN{wNM#<9IQx>z zWfqMXRjsq9{<#Lyilj;R1RXRnkho(UOU7sCp7BYRc)^|9o^0zl>g@U(=dqA&#FkSx z^cExFsXhs`nP!>s-AKex*>aw9R3s*!yz)JZ1G-OT*o03mORky9+lgZeSDX!;x6p|5 zyF_-V7FsFFLFdF?tltSI&ue8fNHZFI1CT;%E1_z}bu1FWyY>aOw zjko3tO;fRvKE^gP2FrXmak`&Y<_* zSEqGVGzS^?prZ}Ejb4&*$-}UUoU;eyf@0 zy%GhGU>MakDya4q~E+qc_?BlV2&Xo?w<9>Z%- zM*PLNv!q`RIjeD6$Zp-Mc{updnnFAS39xWt^CcE;3?~EjijYjh=VNq+B|$v@UlC33 zjCxcaF5OmnTq+>#SQSj&O^}GV|?gqaT|Qd9*OuW0Rx@9t|hmD#L87UB8Uc&u)>NbgL&qf0;k zU^?_vxv&1iKg(UzgohV^Qpw8=Qr#08*<(v2;rg64B)GJ)BWPC3EtGeg)7+pUnEa z!)?MK;$IT^ZRZJ!G__{YnVyuLLwt(Pdz@c&?CMUYztiu1i5}}0K0NInPGwky_V%Q9 zIl*qW(SS63tu-*~C^rDeM}fwz5cXhTY^F%wqg!Oo4)h!Wb)-FE)(7?6wsyP}H+O|kGQ6pmH%Emp)_GzwwPefzo%mXmR# z?3)Qju6ku$`=o+iOF4R$d_p#s!>f6U@qcOZo!+3wX3D;2ZPlht9N%>q?zBju7~?is zjdFml%R^RiU+ZLVBg@We-98WQ*xKnQCCtNNC#Ys>9pb0KWC~wmSgGu!)(6;nc7 zqy)-aH%Y=bf3{s+PavkS*mgRU?_jrQQO)eD2^QZ@d~}E}GUS7Mb=~GYHFTlO%3{e( zApe36`L{+3f-;fSQx>Wo*Cx{kAM0{RQJe5Y8gXVzx;m|bt@Ktl2l=#6g;TPrbdiX4*!N%}{KGv=?xE>teh&C@I zC{@>{a3cp;Tb!qAOjW{4W{~eNFmVU;rMnTZ5*=0J>cgm+gk13?i zu-4?+u4Y0WZw1mALze>8Nsxx-*h8%ckV3`tE)fv89%}Kle*c}q4IrEyiwdOV6Jl;! zujyn^D24k6M>Puu*p_(GHHIe0faS zr4Wv~+)1F08<9doBs3o~=cwcMK{|k%)%1M9A@;2c5@VlsJ*CZ@Wqg_vYI#k*px8|5^@4yy0Rs4OiiIhg z-)xN>rh|IrnqtWTz9>STS8cU1sSj?)G-%@3Rj`U6}ZpDCFOk0otZsR~{~xpv0;ti35-;deAwD-(Q} z#MH6|o>4dIsZT(Dq;1unN24(0W`?*9%elTh+#*!;rI)6T!cCL?PStw|~ zsIR9&o=>v&MH?V|EfOxFSqnD$r)7LiyUhg>SOs3j@L)KdD5FOE`zK|Jnq>)ZO0=SH z%hB+xGvR`%(;f9X$6Q)>%5ep!cyL(K^OGanWe!H2BOEGqXsxw^Ywy}HJ>8`@YwOrr zdR#6`C~=K#2pDI<>isF@#2@mdWgOq0yIPJ93vB*vlWC)g{l8m5kH?r26=*)u%+&Qk-DdF79FC0iy)#yj4HvB^GXeB7Q=v@tV_jn3^4Sa5RP9PuE zcq?p$Y}9sYs9evxCuz~JJ_AG<6!Q;MNGxl~0%EX&rCsj1GQ@C_>ZVfsbi9Edj#F98 zs=UHK3{zvOW>Pan_6s=@Dxw~IgBlt0r3a~PJ0bBH_F(@Uh`Ule5RN8uvEk2xUvN87 zcTiY4!X3+lP|JB5epmys<@eQ+Cpv%NPp4P*+ zp(pgmHcy)60YPhOQWcXBftvubTrMYX=Kjh4eOZl>^9Wm2_zbzwY00u>?2ZP1@A|Qj zIKI^cdJ^<26O1xlG3E`5H+UnbHYnBL4GXanl$0P>gZ0>WYr%&m_+|hYs>4g*dVsad zhjd?^OQrj|!cr@EED};;gxgDeOo`ipG~>IZhsfz)&B_UIgJnCVy+Qpv4=kIm^QdtR z77EtEODf}>jFF$Z2LGiJjfkGkSNId!`*ypWt*i#c=L#tH$^ah>;BD>D)hU34AB?9o z{atVjof#AcA1fY6DTr2{KyNF`tuq=>^vk8(KD1by04LW@%T7yo+*4eS6STsEi*!X? z(EH`fM7^@_3M!27#k{o^evG@&cm|#fNveU7lqcI|BV((B7IHjIYw*Q78o)J>)sVkG zb`R!0)3445-gYtHbcSq4o${#j^_N!v#|lJ}n%?pBN%;J1;|TpoWl_(~5qAw?NIHjI zfSX^g<>%?}_fUoN?e%XH`Qh^50pZ|JHbl6mJ6{N@a*`wQiji4VLu9Whcb0F|%d@|; zHthG;Ys0>)ZN@Yb;4SE#0CyPkXqdm@l3(0zDDRUCZD2AlgMd=(F}#1^KP0&=Cur2N z?M(W>?#>yoEgsOu=}cmg0AKqGwd}9Zt=>kN1lsq`+$;4~jb)Yst2OHVDDlZ^;3}|} z`gx`Mz}U5#X1-I_9nAu4UOxwU%&&#gt!p$~pqAxUPZ4>R=4P zu>I>L2l#DqR4#L`yJL^7yy8SSByyIXd!6Q*Y}pxKjyb1sJuYH2tT9#-SMmS0e(uaI z;^zTvh894|%77FjSS^9{5rZ_x%Su^Xn}3{6neg!J1d4Z5XqljH*Q7t(y`hg;)%>aO zgSpBIJec4v15UYwvFI9i6@tUkM?|@R=1+D2y)h1*K`cGwzov=#a7(PhdtgB5p58k{ zKGBSK;;s;Z6-p{P$CE*)PbXLK*I8p)Q5d#HEc3G6o&nfO455o3`UD~?-z^KIYgEQ2 zqTL+|X?8E&2VMiX1Yb=oQmc%YLG4E3;TS_Ud^-({MdGd38#tk*1ljthrfn5Bo$?Iu z8o`RchhAz|yJlI8#;n1zZq)pf@F?G^F%^tz5x9JB$Spth70=;3Paew!*{Xh%@P4Do zM^6Ukz3XFf_q#a8g~>d9s3xg$N`*54uFCy#A4U9u$&=_x;uUy3SU1(SiQ>8-b^1KK z(Po|yan{>8$ZQKjY|HmmQ2*tP)keCaj#J_97{9zsiaVNB*jk3Csu|G4dWjUhK(PN-Dniw_ zzI$AB5s65~U zl|0!v8VHA1K#Gw@ScuL z*$0iP%E$e~zkc&qeRS12REaz%hG&6n^m>?Hav>*EdRfz9E^*r6r zm!(Qq1a){!dvoULafnQYN_OlhRiCHkFiP%+ld+cL6JK2zLrD>Xx`-Wkr`>F@zDV~x zC#75js1ka2AA1WAXLW7oQl!dA4->MSV|V#@7O`=wbA-?N<(FU1buUPrcAm|EU*3K2 z;Q7P7y?eX6|4uRGxeVVw-2D@!KscnO=o0s#XzKO3N1XMm|Jz3#uqQVkpsI_YTAZig zy-*c1@c~HRaKdQuSH_HPI+o4w@GQJOEfYB$jCtUWF%1r(DQsQ9e~KwU*`%m7pH^4X zx3~3k2dUGyiV_Mc>`6g~;v2KXESX1n2e)7DhQx{a=#APIW$JPZPTWq^9bN`1+~qGj z?@?P42kU)jyi{Axaz9_ki*rwUx<8(a6?8uyOAx&1F{Dxn8w@6kJY zP#zw$cP@;3W35OpAqM!k-+yQ2v;RCMl!r;OA)#L)C;9dQXpTZ#pc=;vh-9(|)U9Me zLhl{B+WE0Z@Brbv4iUZ(_|#di6yFoox(;j2^lI+EIp9V3&~?|w{c_Cds84_M+v&XH0@TMc+PAqUdGkGZZz120z!^+ICic=FwK7E`R9aRNzs+-=p8<>kiW+C4+W&-AAEnebsc+T2(b}I-}sd8E~!` zy_SLe*zE*_j&IcFMH-hknrXS(Wu#2@-@+YSG!H2^hAR7VLNT<&NA*Y%5Bf(otoMC< zxEYD()#jpBGIg<)1X0H*%6VRyCo14vkvtkl;^2^VoHRQ4?VV;IIm}UOHRgd=Yrw|* zG4B>STXUblMXC)&a;pMS9HtaRB%yWhH6(MU;}M9Bif?h;xWb<_04|e#>MnkA?oNaI zy1`-80f#Bq-ApYdpmJKlpRSRv{PGB0wINP-i>SYbO-q--ERl)Pcwocl;4r*V8>xhk zjC%LlqX500;yB{GQCr)?ZNwU`qEl7f6xA2 zN8wb`E8Ls;PVZXZyvo3+D3<-)t;Y00MCQR{a1^xEKd*TZRb_Tp&WpiJ?Z)rk*n7Ww zGg5OKcDYc%&s$k-Ze~nU!&=Ee+e>d}Z0vgtUL>sJ3nNEz>w5*B)~!Jd5!SUowsFs? zJuF@C!u;-FqFy?qy}UYZ>Mpm&ndWjEj9lVs?WgN`Q+LU}Grm~0c_nZK`k5d5I_Lk4 zsZ1f=Z)(rDmZ^qz)CA-xF+G2Y<6h(4)59PBXtfJ(SL5NaSNx@MVRg(CrEC1T>%aH> z_r85R{wj_Y=?C_n_$sZ#&5EaeXh3ZK$*dj*|ldYZMvxxS$_T zIDg1t4afG*^=G!@^adU$FIaB4QCt}lN_@H2)U=8l(9tJD0F zof#mWvPgV_Q0SkGY3~8Gsf%i3Y3$}8!>R5j+Lmc0ido`RN_k2hT7#Ab2HzdpzWi9E z!a+CtFU!xy6|VO1jcq)SP+4MezRE#_kJmiqPVGHXBXG(R?3dBgKL&+$gH55jp!U5` z*(~d+96Yll-Ni`2dcL6z-HMY+@WGlmuJKft8hZbKAV(O)WsuI)p!Ke^(NNS zZObsArzY-_GVel)goM00c(N8X!5#y{HoCoapNa1|YMp>~!jR>`U}7zohz%_^n~v-= zP^HyAgTb~oTh^~j3Gp73eC#;kOM=?Xo#Tu+T4nyKte+``Bf^$5JjY5|wjFgLfk$-a zdjOV7kK(AIAlNwZr9s%pgP=7mZ*5!jsdEkW_pFV?)%#Y75_=kN`?dX&HMs38+S`74 z*Zl;t&Z`(HgLK`FO#&19T!$Qe4;jqM!0GhN?LMy<_nue2S08l+5du`zLjLzDxWqiU z!IaJHJv&SIEMy4;M!S6PaUl43s2cI6 zdW;q_V0F}ERD`7jUE4g8LnmsHvcf#%n!p(kRRWg58k~q=4P<@9uzGrV4tb?o(*}&y z1CxhdI-_23$X7M2^FbC8YI&TSkgYlwBUbP+plv#j7upT0nI#A5*l!%R3ay~-7d;!I zf|-f=u~sL@eNnoMUTibQ{nV`lqyi^aXOK0^g>kyR{$?qMCew|?VnHH#;AUXY%adBs zEdzfn59>_)fWBpJf?neE?k`4N`g!ZixoKS#kGGN7+T!tXRw0Krrlvf@GjGg1EWA9n zo_p2)9kL2=CQQE_hi51^B3q8^Qx)2F+D6hwwOjUEbSG!8d)>*q*9E+DSlcIO`}hmf zhTQINM`H7uopZ3V|2A-jB#3~V&1=8-^*p-KOr`;y>Gfvr^t*qMNw-2x6&&F0=eGae z@!zlg_ZxI9sC+=)jVmZFz>n+sZIKCSb-3JIBC0dJRnqi~fZ>%l9K`_;$WW+hlY5#) z*;^x0pID)3VQ{Bg%88BN2>8dds|6zTJT~^J_K!|@v9+kE zYnH zd5phXPKWBOX2NwxpGp2klQf5H(mtjfr-#yOL}5Z^dJ;ufFI-QYH5h9=R-#3R;In9~ zs41)z5J^_pa)5G>#c>L*(n_T5MK_(vkIB$s2|By#?0_z``0+gS*G5pbqOH{+YD`Yn@v>H#cF`zm@IgVo>Pc6M+_Ys@RKfwR57m)J)(Pk@7Hf@O+|dRzq#Fk z^`5dQ(XVW8rWYO^j}8Y~(<7&wX|hD1&peFlT9dE%u?X-iZX>v7lN9WAB`|%@tp;1` z9OUTt<#Yyt{A|5}@RWPA0r`p$)iW(^boS|mOF6CU`0=!|+X(81Zk4?D1y-@@;anJI z1Mt)9LgS4Lj-ygwrvqEkW=eQhsYZ{gJRZ4d^Pfn==(EC+T`iS%2gyk=eQAtpt@_8k z@;N-ZLZd6=JOtI%@l={s#|Oi~VU%T!Z1pyUr(1O(BE>C_kB7r_Ihk%Y0; zD=W1%hN&X8x5n04tu1poKRaEqj{da4xp)WV>`x>|>MO@q24mBiPhO+N9 z`-dPftNKkc_C*Fd7%`^vIH_$ff%N7<*!8wSo=sh~#om|Uy&^sr9^U}mF*?!y;k!_w z1+NHDMm@mtIKto|NrUEMP!&Nba;ya9Zsy0C-Z)D9*k1$*kB{yiRGQRD1Wvqq4!y2s9Wj7n@DU5wZ7710sL)GDW0n@c>8rx6p7PrU)a zH9MNmUX<|;J?17-N!Ocv{b;;1eI#20vc`C6d}4p6)|OBAd(gl=oBPc#bC-X)eTsi) zbC-U(W5gYBch2Un{9<$H+_hh%YPtAJ*h$ST{4xp6)L$m9GWpA~?as=%kMTPh(Aimc z2s_=3o!g#C-7_AZ>JSkCr-D89<$1CQ&}zhJ3Tjc*-yw&?HPbMOm|J$%l}3M&r)mCV z63FWUCboq<>_X&0ZwnYsmEhaV7CCQ&V(5f@>iLXe3t9~>;l3Zcn%?F3?ys0yG9-F&m8T5T5SRjo# zL#QjUlKxMe3|=wPW+D8ycTglOEc{V^gfv^^50yIBNXqv(yV1@JK%r%y4=twyjuF3{ zU?Q`J^Ox(y-`H?8xqo~xI7CQ1ic#hk`J+JdG_tXzd3wqx@gHjU?aAx^ckt)i|6k{% zTXk$$E9Wjxx;;zp_7Hn|ZrKS1p}uMyOi%dZHbTo8bEm<5ZFjFZEpnEKC_3>q(AaS5 zR|2FZF?{%1P3!rK0(#JlG*XhUD-&!#mnNL_Uc9iS+q!6IX8+}D%{Dpo7eO}@)Pua@ z&R_nT_KfzP^tj9)8a7Sj{0>X^NpgaWH=qvr6`qY$oO2O@h|er5e6nsWe2&WHfuy$bD+Gwc((6zvKL;* zT<~ZRyZw?AcaKl;z9;)v zE3_W|1pht6p}Zwes9YHuY~Wn8W05pt)6bJcfI1SR-lQD#bd)X*aqoc>5WYD9-9X-j`9xu^W^FvNeY&+z54O!qTq~DPu!>^z+lQy#!hA(| zgTe-yWLVwhh8nA$5{pGXWuzmLi;K3?_AC7^d@ z+yxTHX?ze9d=&=rrG8%Vnb7;ODm%bBE57YVlfJc*L!Kf(OJ}1z;+WzExJ2tEYJwYx z@)OR*Nm|AssVoY3osumdd0X?k=}|hIXdyuwb{O;Yb$+kkB=$k4drTwI!*Ja!WlQDr z$G3u`C{s*mneQ~%$D`+c6tmBF2HrULi~fDf6Z7MtNLxeNduax6Mrmh&vTV&FGJuy8 zG5qhs2M=1RlMnh+o*eT{08yA>9~+A{e$#o;>?I^@#73l*ie)7*lFLwzJUy93ZF$!_k&YlH{Ubd0$j^vCxgG~l57f@n zL`nx%6R8V!ntbY(bv`%cNc_u;=7i0oOV)=dE{BlEhW(%4!f@DV#)Ny{zdxM}sYvkh zLi80HxLoVCoKOsrV3L~kRv?Xl1#6BbM+O@XP;JyV%gc_%`dM6Nb-UycRjnrsib>se zz3v;_dxGyI%H`E4=WfK#Ye!-_)VeW?q$1v&O~J`lAJHpOwq_DmssV-CUWG0i7~e1z zBPDo<-ITBs3DB+1;zDc&PUQo}1+VItNk#4iGV2#Nw(<2f>5-o%q~S?9-7{U0?(tEL z6s6)<*vz5mBRIPJPMuh+Gq^}Q=f+tTp)*|mgS&u zh>4qtb6c#$`rw2nEZ2|APIzEZ=Ok=gbuOd~YtAR%GCK~;j(OJu#|ddUsU7mIc!D1$ zUvs4Z>-$C5MT;V}lM52Z;e4r@A7#m@_uHCY7Sx-hXR40Z!^xW_oNHjKcl?E5prv1V zQ3OP*IUtcqLc{+{%Dz#Fbj6d|zk<(?jEA8yNi6>$?JSJu!Y6l&D(C$5xp zafGls2+<@{-a&``kSfojCk=;QD3A!U1XY^^*basbz*)W0jVAxXmPA9g*pvcqg)!&r znonj^*kke48n;Zz6#HP^zcrg87rz&wciGp@<7xpR% zSL$S}Xx3_0YnhJ)C_crmUzLjGPu4!u8_?sC&AM2fWWk?31^dJ0n!Y=YFDFhq4{J>* zH9r8H(Yvwa0Q&F!Gc^)_1_gcI)-XxcdQ+34kdI}{xUnf-Yy1R|gdihMI)Y(vG zDaY?4M;71fqA}uTEVquy5lKzg>?!?Lq{FHA%x$lyH2H;22|JN69&(RL1jbtmKRZby)QJ>4+A?ssDs6SdLE+^ ze1z-z*9+2*6wd2pFn!z6@*v4=I$=2f-Q54U=t{fgp^pfN6@c^d(LYT)^%8+$4E#lH zsE#gS~YM`PuYeI48q z4(#M>z-SD`wz0$H%z%#b@NkH=$C4A6HJ6>1O7l(U^7uyKRmzied?IIw8~ka?eE5_z zE4%d<$Y9TfEL<0^AQc{1Qqa@>NyMz;78=;B^Le4V>{Brx^a8rA^nO^=yZmM~;78I+ zyaC?T!ryl7jnjPo+d5^x{CUzH`+7g0*la)e3yOu4LRSx+^mPU&f(IxfYz1`F$;J{$ zzQ#8q3DGaT*4G0|!6{MvhGOWZ^IG7`=|Q?Kb7lTX4m}SENYdbIMKUg5&X~Gjxu=fb zPX4i5^eCx2JHXH?el~zsJWd7O&N=iWcNXigrnnX7LZ>mp{zW7+21Tvw{CEV9(Eh&hwP?c_H6yuH zym{DS#ZeEn;Do80w<77MWPr9ce=?i2aLyr0y>#{tS3RCNN-O9HMI$C7hUX3&17T%joxJk%sD72kfHl{D4&wmk?z2l&nRcD?^=ZZic{)Xe zL&7(H0sz0RXgg~AO9ZrHTp^ugY`Wi%W$DtYW%9A-RcbgYsQk|I>LXnY0ra5eN0faA zAV&wpD-5{Lt$YTn%Hgr>(@DRlJcvYcGSm(rTnVEm67jJ#>Ai0_E=4pQeZ|$(rA)O9 zL>iPC^KHsZ=f>&n1L0UI&brc(?X|PAs8>CpM9|Nfg!hl8niE*jfS&ZHZ_8e~wKVLb zRL}cIReBNH>-g32AhER*$Xf}Aw_g<_B;|2aHu%kqfr_Tw+y=-mm?|Ht2o&SSML6C} zXH*LgPDD}mu@aQTH%pV+%CkL5(IH$8yHg`Bm6XEOX5jm!BnnXUSg%3N_?6xZ5Dr@x zgQ2L;rtuMUy(T_uG7OzxVvYQ6bvPKXvB|B46CNyey}`oK6Q*`TKK}CHmG(lIiyA4T zp3j_Xo{)Su@NuQ4FB0``)U6%XBEjQ6V6bZd-*&p(3w6FwiJD1pb$4;fdt267$|vVi zxR$Q4s6 z6&L8R*PGN9fJtW4&OsJod6F9n`t6^`v0;->1$J!=(eCz0oUIrJ!#blJ+lhYh?Ec+& zOGzl##89aumc7#V^t)BAcEEQjVw39Ym(>PHiF(f0US_VT`Jz(s>w-QfUC_5JV76th z-WdaF5{1-S&NZydokjTZE*8x32O$iHVbq0N3r1v>V{O~8L?X>*bX{ zBSSLnwcDM~JNYFzJA1O{57R-~lGc4}3)`Y!S8%D~xRlKqJ!Zx`UaY+ZBiE7DLwU))L?2B9i0Hd&U!G>^y5W3<6~H>j`WK84!dbxfH%* z?$YGQ%KGNO{@L}HI2jEN-%4xy>V)sI!k@bbT zaHM!|*rhIx5NKmAIDLv|8buX8kq-t(N4ACl+4S3{WJHSfVj+_A6OBvsmnd5!Wn+sI z?!&`%GS9KOajmg%6T$?y)h8W2oHTaAF=)$D&g$FO5?8$E5488U>ao3Rf5sqZdlnsf zGZ~Jp)(e|KN{w(cfl#hY5Da(`|Nl%E94(ObVXHCJH(d-0q7EYw*%`mo3%v#E0|IB} z;=0$all7r~Z~yC8co;}mdKTkt_&!vtP6pPvZ(NLj^Ov|>CTVLK11Ex!D$kDdVtRr0 zIHfE*qdP22!ei=EQ1{NfxU>muB{Iif)%YvJuSykol|Ow~!-B@2tx)Y%PJH65I=zx3 z1h;^A_DP)3!5R)tVLhlHp*RVFWevR;j~!Yu2+i4#!mU{0&vz-274I6GdZ)fWrm@T9 zd}H0tF>B0jny{Y3aRy(WB%L2-B;*%>OnQeUjTuF}8;nKZSPn%CZ3?F#iDf#xNNhP# z-93N=cXF?fy`DAP6KHb6(b*-gUMp(j`F9ng0O*U8O6$&veT6Axc+(V#;PT`c?|VFY zczlS+kzJee-oS?IEwtH=N4XSg#rWOPi-C;8tX#(<7t3Wqt``hdWTaa`?Pk$w{n{l< zi|GVcj9d@KC|dD4;m&iM<91`+7|dLp0JW27IV3;QllNBe_YE7}g~@w~UMv+#9VgSd z-`HSWePw^Q=azjRuA8-;gHf?2*^NLraJUyu$EbzvGqgjM#4R2UW+hN%if2_AR_CrG zgftvV4A1tC52oEWm2dp)k+4qYj(c1V<+iqJXdFQRmC9Eob#=eNR@Dr8rko#Lgg)vs ze$3o8cP8JqU&ZHuyFt3|tav=v7=d$|g1guY!)(5ynVnU}TF&8N+c`j)1|?7%75W2b+vhwAuy)z5d^?~p zoOZYMK%R1n!)&)z;q-6X5BFX_b`NaAzFsl563=EDALmmhaO0rpeLRt^(|;FU1ah|% z@fn|m^YTxAEmt-7`L8CkMQv8}&Co3Mvg{+h3Es%LMq6!p3h%U3Ni)_K-j?7reD1AR z-}l2D$iK~vb5Jy@n@E`veE3D34<^OMA0x+;?&)1@QSsv8vYFSnk-EndAV+QiQLE8? zv7q#{FFu@h*H%6S;|woUvEW^=aQ@%;gv*u0FpN~}Hw`#B81BLcAFh%y?Se1p0@Kem!fxoE7gAaAHYurL+urGyVZnf{eQKRtM2N><0N-jsJhSSF&va1 zJ}w4jJH)D+Od;p1?h*6}>`5Zzu^Ml)07SmeLD74}k$nTu6d*uTlh=c2RgiYe1*%Pd zbVFlZgTMC%GN0n30en9h^mxU17!q>%TUc4yUW@Z~dNV+ql#NVw!N_1yzlOp++bWW8go+j{dvLQGSQF5G{479(H993uT~66$`|dO z`&fL@Ub9YkV;8nxst)X99~>W9DeOP{mVt-XJdLvL`_+nOXD$AyD_Xk%^S!O5t>q+b z^F^ZU47|Ai(z*wKZIdSCl_Rebf^`;u!|YR>8+5FQOVO>w%D0zj9k#V0yy+ZuhsneL zCJ{I=_~%jo#KAR!wq}c5xXCElMuT~Td+2@~;3IJ@A?{p%H372iSx!7ulU5Q(Tb26i zI7zDk9!set;bLt)WBh_0K#%u!|Mjn5-G=vs$482L#X?i&t!LtK+9{I7+_pP;3JXoK z+$OHov@2!;$crXAPgF5CYWjukwMs2w4BMX^>zhD^M(M*w#w4*`2-)5bR3sZnI|Z$f zNk6H{=Ma^bsF`B=;Q~BzGsdTBMQ{>7q)8v)4RI=DL368C3zy zmIZm#lEg9o+KRXbaKwf4NN2+{R~6aoUIosDj*HHfhe1*iOXTzV{Buc2DzecG4kc1O z4|g6EyKsgzJrg&cYH!JRW5{v+-W|El#)5~UQn^W`qu!Pf#VPU&lXBy-cprt9#8Fzd zRm}tx8=l$i*M;UHg-wS-s`3D$@AVn*#W)^?uX*n*xG)hE=R5qxDlCzrytPr1ctE^Hd0uu}e*>=Eonod}DP14ho-c@zPpoKuXVr3#vdPQ_B8J&HGEz!LjMuD>FgmqjlVvaqNNGx_Xg9~a+e*~yeXN(pZ2=wzIi=3WTO`_rfbDWt|o_c z1!XPY0UZInmXcOH`8^^h^S)k8evi$XuH80!(GYg*JwnwEFg(Jj4l6_c(#p0a+MT6} zQIwTMXKdVF3i4zW^s|2V9ZDbc9!K2k0>WIORw3~_OMj&;X8-MA;s(BcBRIr@iNP=j z29T5R-__`^xb6CH|0tJa{pYe>?7Hjs|1g_wH?MpZiBt(7_19x4#C?Micum{SozTumr{6PM_-b933RIoS=Yr(HXdC z4pN@za!vyE6^A0+h_kY^cc!wg+{f0aKfF76gE^ru+btB2QRz4I+lbY>E-a6jcvH}m zWBBLoH*zm33CgG+iL|s+7wwuu)w7`B~1dQ`ghi)Nl`0QJM! zOgEIN>rQhs|0TcuP>RmohIAg9!q{&F<;rRFEgM);65I^LUc7d=9iXp8$PF|OI?3-) zvvROjxff!LrJ^F5L+~NIjYpId-s zk_w}cRzu&Aj(M5D@?KBm zBbW;$ABPx}M!n3qO~r~w-prW0IAb48caPlhTO)}D*~p+M!?LjOcmz(@uO?DnTlm~K z{#X(tJ(HUL!yiLketKf97aH#0b}*p8bsn`qJ$gvrYt&KI0UxgQ3rn?Mx^DY6xSw#$ zB^9<%d9Jv0)ue4*etcgy2>}^Mm$9rSQoB=YlP;K94a)a5?JBv_cjR&<7~Rlq=-~im zxyoHLEhev3sGH=#YOSXA;8qP(anrxoLC@wZx%EM(Ceb;J$yIthS-?ItVdinm|F*OB zblh@;o)!{A?L}uGqO@l!%Et{S&Od3%Q;>bx>HYGZ?KwWlx$_rZ#?s4r>XfZu+6fnN zDOO$!N}r)bumc8tHrM`!*;(L`kc^x@{ZNYA;a{Ikk6YfFP55yDCB-*BoTW6abTang zD89GHOY[)jCG@DyAa*cfr#w%X&^JM$o)tl?p&Tcvb`}x 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

    aXd~6I7it1DJ66y_6`$HcInQEw{rL8m`5c$|h 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
  1. rE8y9jQNH#)lk%i)OT}5owvyJdCX)(u~ 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

    9j$vOs=KEewal*8 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 - - - - \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/BarcodeFormat.java b/zxing/src/main/java/com/google/zxing/BarcodeFormat.java deleted file mode 100644 index 7f6a0ef..0000000 --- a/zxing/src/main/java/com/google/zxing/BarcodeFormat.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Enumerates barcode formats known to this package. Please keep alphabetized. - * - * @author Sean Owen - */ -public enum BarcodeFormat { - - /** Aztec 2D barcode format. */ - AZTEC, - - /** CODABAR 1D format. */ - CODABAR, - - /** Code 39 1D format. */ - CODE_39, - - /** Code 93 1D format. */ - CODE_93, - - /** Code 128 1D format. */ - CODE_128, - - /** Data Matrix 2D barcode format. */ - DATA_MATRIX, - - /** EAN-8 1D format. */ - EAN_8, - - /** EAN-13 1D format. */ - EAN_13, - - /** ITF (Interleaved Two of Five) 1D format. */ - ITF, - - /** MaxiCode 2D barcode format. */ - MAXICODE, - - /** PDF417 format. */ - PDF_417, - - /** QR Code 2D barcode format. */ - QR_CODE, - - /** RSS 14 */ - RSS_14, - - /** RSS EXPANDED */ - RSS_EXPANDED, - - /** UPC-A 1D format. */ - UPC_A, - - /** UPC-E 1D format. */ - UPC_E, - - /** UPC/EAN extension format. Not a stand-alone format. */ - UPC_EAN_EXTENSION - -} diff --git a/zxing/src/main/java/com/google/zxing/Binarizer.java b/zxing/src/main/java/com/google/zxing/Binarizer.java deleted file mode 100644 index 02af083..0000000 --- a/zxing/src/main/java/com/google/zxing/Binarizer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.common.BitArray; -import com.google.zxing.common.BitMatrix; - -/** - * This class hierarchy provides a set of methods to convert luminance data to 1 bit data. - * It allows the algorithm to vary polymorphically, for example allowing a very expensive - * thresholding technique for servers and a fast one for mobile. It also permits the implementation - * to vary, e.g. a JNI version for Android and a Java fallback version for other platforms. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public abstract class Binarizer { - - private final LuminanceSource source; - - protected Binarizer(LuminanceSource source) { - this.source = source; - } - - public final LuminanceSource getLuminanceSource() { - return source; - } - - /** - * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return - * cached data. Callers should assume this method is expensive and call it as seldom as possible. - * This method is intended for decoding 1D barcodes and may choose to apply sharpening. - * For callers which only examine one row of pixels at a time, the same BitArray should be reused - * and passed in with each call for performance. However it is legal to keep more than one row - * at a time if needed. - * - * @param y The row to fetch, which must be in [0, bitmap height) - * @param row An optional preallocated array. If null or too small, it will be ignored. - * If used, the Binarizer will call BitArray.clear(). Always use the returned object. - * @return The array of bits for this row (true means black). - * @throws NotFoundException if row can't be binarized - */ - public abstract BitArray getBlackRow(int y, BitArray row) throws NotFoundException; - - /** - * Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive - * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or - * may not apply sharpening. Therefore, a row from this matrix may not be identical to one - * fetched using getBlackRow(), so don't mix and match between them. - * - * @return The 2D array of bits for the image (true means black). - * @throws NotFoundException if image can't be binarized to make a matrix - */ - public abstract BitMatrix getBlackMatrix() throws NotFoundException; - - /** - * Creates a new object with the same type as this Binarizer implementation, but with pristine - * state. This is needed because Binarizer implementations may be stateful, e.g. keeping a cache - * of 1 bit data. See Effective Java for why we can't use Java's clone() method. - * - * @param source The LuminanceSource this Binarizer will operate on. - * @return A new concrete Binarizer implementation object. - */ - public abstract Binarizer createBinarizer(LuminanceSource source); - - public final int getWidth() { - return source.getWidth(); - } - - public final int getHeight() { - return source.getHeight(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/BinaryBitmap.java b/zxing/src/main/java/com/google/zxing/BinaryBitmap.java deleted file mode 100644 index c1ef8a1..0000000 --- a/zxing/src/main/java/com/google/zxing/BinaryBitmap.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.common.BitArray; -import com.google.zxing.common.BitMatrix; - -/** - * This class is the core bitmap class used by ZXing to represent 1 bit data. Reader objects - * accept a BinaryBitmap and attempt to decode it. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class BinaryBitmap { - - private final Binarizer binarizer; - private BitMatrix matrix; - - public BinaryBitmap(Binarizer binarizer) { - if (binarizer == null) { - throw new IllegalArgumentException("Binarizer must be non-null."); - } - this.binarizer = binarizer; - } - - /** - * @return The width of the bitmap. - */ - public int getWidth() { - return binarizer.getWidth(); - } - - /** - * @return The height of the bitmap. - */ - public int getHeight() { - return binarizer.getHeight(); - } - - /** - * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return - * cached data. Callers should assume this method is expensive and call it as seldom as possible. - * This method is intended for decoding 1D barcodes and may choose to apply sharpening. - * - * @param y The row to fetch, which must be in [0, bitmap height) - * @param row An optional preallocated array. If null or too small, it will be ignored. - * If used, the Binarizer will call BitArray.clear(). Always use the returned object. - * @return The array of bits for this row (true means black). - * @throws NotFoundException if row can't be binarized - */ - public BitArray getBlackRow(int y, BitArray row) throws NotFoundException { - return binarizer.getBlackRow(y, row); - } - - /** - * Converts a 2D array of luminance data to 1 bit. As above, assume this method is expensive - * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or - * may not apply sharpening. Therefore, a row from this matrix may not be identical to one - * fetched using getBlackRow(), so don't mix and match between them. - * - * @return The 2D array of bits for the image (true means black). - * @throws NotFoundException if image can't be binarized to make a matrix - */ - public BitMatrix getBlackMatrix() throws NotFoundException { - // The matrix is created on demand the first time it is requested, then cached. There are two - // reasons for this: - // 1. This work will never be done if the caller only installs 1D Reader objects, or if a - // 1D Reader finds a barcode before the 2D Readers run. - // 2. This work will only be done once even if the caller installs multiple 2D Readers. - if (matrix == null) { - matrix = binarizer.getBlackMatrix(); - } - return matrix; - } - - /** - * @return Whether this bitmap can be cropped. - */ - public boolean isCropSupported() { - return binarizer.getLuminanceSource().isCropSupported(); - } - - /** - * Returns a new object with cropped image data. Implementations may keep a reference to the - * original data rather than a copy. Only callable if isCropSupported() is true. - * - * @param left The left coordinate, which must be in [0,getWidth()) - * @param top The top coordinate, which must be in [0,getHeight()) - * @param width The width of the rectangle to crop. - * @param height The height of the rectangle to crop. - * @return A cropped version of this object. - */ - public BinaryBitmap crop(int left, int top, int width, int height) { - LuminanceSource newSource = binarizer.getLuminanceSource().crop(left, top, width, height); - return new BinaryBitmap(binarizer.createBinarizer(newSource)); - } - - /** - * @return Whether this bitmap supports counter-clockwise rotation. - */ - public boolean isRotateSupported() { - return binarizer.getLuminanceSource().isRotateSupported(); - } - - /** - * Returns a new object with rotated image data by 90 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - public BinaryBitmap rotateCounterClockwise() { - LuminanceSource newSource = binarizer.getLuminanceSource().rotateCounterClockwise(); - return new BinaryBitmap(binarizer.createBinarizer(newSource)); - } - - /** - * Returns a new object with rotated image data by 45 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - public BinaryBitmap rotateCounterClockwise45() { - LuminanceSource newSource = binarizer.getLuminanceSource().rotateCounterClockwise45(); - return new BinaryBitmap(binarizer.createBinarizer(newSource)); - } - - @Override - public String toString() { - try { - return getBlackMatrix().toString(); - } catch (NotFoundException e) { - return ""; - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/ChecksumException.java b/zxing/src/main/java/com/google/zxing/ChecksumException.java deleted file mode 100644 index c5acbe3..0000000 --- a/zxing/src/main/java/com/google/zxing/ChecksumException.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Thrown when a barcode was successfully detected and decoded, but - * was not returned because its checksum feature failed. - * - * @author Sean Owen - */ -public final class ChecksumException extends ReaderException { - - private static final ChecksumException INSTANCE = new ChecksumException(); - static { - INSTANCE.setStackTrace(NO_TRACE); // since it's meaningless - } - - private ChecksumException() { - // do nothing - } - - private ChecksumException(Throwable cause) { - super(cause); - } - - public static ChecksumException getChecksumInstance() { - return isStackTrace ? new ChecksumException() : INSTANCE; - } - - public static ChecksumException getChecksumInstance(Throwable cause) { - return isStackTrace ? new ChecksumException(cause) : INSTANCE; - } -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/DecodeHintType.java b/zxing/src/main/java/com/google/zxing/DecodeHintType.java deleted file mode 100644 index a665869..0000000 --- a/zxing/src/main/java/com/google/zxing/DecodeHintType.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import java.util.List; - -/** - * Encapsulates a type of hint that a caller may pass to a barcode reader to help it - * more quickly or accurately decode it. It is up to implementations to decide what, - * if anything, to do with the information that is supplied. - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - * @see Reader#decode(BinaryBitmap,java.util.Map) - */ -public enum DecodeHintType { - - /** - * Unspecified, application-specific hint. Maps to an unspecified {@link Object}. - */ - OTHER(Object.class), - - /** - * Image is a pure monochrome image of a barcode. Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - PURE_BARCODE(Void.class), - - /** - * Image is known to be of one of a few possible formats. - * Maps to a {@link List} of {@link BarcodeFormat}s. - */ - POSSIBLE_FORMATS(List.class), - - /** - * Spend more time to try to find a barcode; optimize for accuracy, not speed. - * Doesn't matter what it maps to; use {@link Boolean#TRUE}. - */ - TRY_HARDER(Void.class), - - /** - * Specifies what character encoding to use when decoding, where applicable (type String) - */ - CHARACTER_SET(String.class), - - /** - * Allowed lengths of encoded data -- reject anything else. Maps to an {@code int[]}. - */ - ALLOWED_LENGTHS(int[].class), - - /** - * Assume Code 39 codes employ a check digit. Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - ASSUME_CODE_39_CHECK_DIGIT(Void.class), - - /** - * Assume the barcode is being processed as a GS1 barcode, and modify behavior as needed. - * For example this affects FNC1 handling for Code 128 (aka GS1-128). Doesn't matter what it maps to; - * use {@link Boolean#TRUE}. - */ - ASSUME_GS1(Void.class), - - /** - * If true, return the start and end digits in a Codabar barcode instead of stripping them. They - * are alpha, whereas the rest are numeric. By default, they are stripped, but this causes them - * to not be. Doesn't matter what it maps to; use {@link Boolean#TRUE}. - */ - RETURN_CODABAR_START_END(Void.class), - - /** - * The caller needs to be notified via callback when a possible {@link ResultPoint} - * is found. Maps to a {@link ResultPointCallback}. - */ - NEED_RESULT_POINT_CALLBACK(ResultPointCallback.class), - - - /** - * Allowed extension lengths for EAN or UPC barcodes. Other formats will ignore this. - * Maps to an {@code int[]} of the allowed extension lengths, for example [2], [5], or [2, 5]. - * If it is optional to have an extension, do not set this hint. If this is set, - * and a UPC or EAN barcode is found but an extension is not, then no result will be returned - * at all. - */ - ALLOWED_EAN_EXTENSIONS(int[].class), - - // End of enumeration values. - ; - - /** - * Data type the hint is expecting. - * Among the possible values the {@link Void} stands out as being used for - * hints that do not expect a value to be supplied (flag hints). Such hints - * will possibly have their value ignored, or replaced by a - * {@link Boolean#TRUE}. Hint suppliers should probably use - * {@link Boolean#TRUE} as directed by the actual hint documentation. - */ - private final Class valueType; - - DecodeHintType(Class valueType) { - this.valueType = valueType; - } - - public Class getValueType() { - return valueType; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/Dimension.java b/zxing/src/main/java/com/google/zxing/Dimension.java deleted file mode 100644 index b3a2486..0000000 --- a/zxing/src/main/java/com/google/zxing/Dimension.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Simply encapsulates a width and height. - */ -public final class Dimension { - - private final int width; - private final int height; - - public Dimension(int width, int height) { - if (width < 0 || height < 0) { - throw new IllegalArgumentException(); - } - this.width = width; - this.height = height; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - @Override - public boolean equals(Object other) { - if (other instanceof Dimension) { - Dimension d = (Dimension) other; - return width == d.width && height == d.height; - } - return false; - } - - @Override - public int hashCode() { - return width * 32713 + height; - } - - @Override - public String toString() { - return width + "x" + height; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/EncodeHintType.java b/zxing/src/main/java/com/google/zxing/EncodeHintType.java deleted file mode 100644 index eb7938e..0000000 --- a/zxing/src/main/java/com/google/zxing/EncodeHintType.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * These are a set of hints that you may pass to Writers to specify their behavior. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public enum EncodeHintType { - - /** - * Specifies what degree of error correction to use, for example in QR Codes. - * Type depends on the encoder. For example for QR codes it's type - * {@link com.google.zxing.qrcode.decoder.ErrorCorrectionLevel ErrorCorrectionLevel}. - * For Aztec it is of type {@link Integer}, representing the minimal percentage of error correction words. - * For PDF417 it is of type {@link Integer}, valid values being 0 to 8. - * In all cases, it can also be a {@link String} representation of the desired value as well. - * Note: an Aztec symbol should have a minimum of 25% EC words. - */ - ERROR_CORRECTION, - - /** - * Specifies what character encoding to use where applicable (type {@link String}) - */ - CHARACTER_SET, - - /** - * Specifies the matrix shape for Data Matrix (type {@link com.google.zxing.datamatrix.encoder.SymbolShapeHint}) - */ - DATA_MATRIX_SHAPE, - - /** - * Specifies a minimum barcode size (type {@link Dimension}). Only applicable to Data Matrix now. - * - * @deprecated use width/height params in - * {@link com.google.zxing.datamatrix.DataMatrixWriter#encode(String, BarcodeFormat, int, int)} - */ - @Deprecated - MIN_SIZE, - - /** - * Specifies a maximum barcode size (type {@link Dimension}). Only applicable to Data Matrix now. - * - * @deprecated without replacement - */ - @Deprecated - MAX_SIZE, - - /** - * Specifies margin, in pixels, to use when generating the barcode. The meaning can vary - * by format; for example it controls margin before and after the barcode horizontally for - * most 1D formats. (Type {@link Integer}, or {@link String} representation of the integer value). - */ - MARGIN, - - /** - * Specifies whether to use compact mode for PDF417 (type {@link Boolean}, or "true" or "false" - * {@link String} value). - */ - PDF417_COMPACT, - - /** - * Specifies what compaction mode to use for PDF417 (type - * {@link com.google.zxing.pdf417.encoder.Compaction Compaction} or {@link String} value of one of its - * enum values). - */ - PDF417_COMPACTION, - - /** - * Specifies the minimum and maximum number of rows and columns for PDF417 (type - * {@link com.google.zxing.pdf417.encoder.Dimensions Dimensions}). - */ - PDF417_DIMENSIONS, - - /** - * Specifies the required number of layers for an Aztec code. - * A negative number (-1, -2, -3, -4) specifies a compact Aztec code. - * 0 indicates to use the minimum number of layers (the default). - * A positive number (1, 2, .. 32) specifies a normal (non-compact) Aztec code. - * (Type {@link Integer}, or {@link String} representation of the integer value). - */ - AZTEC_LAYERS, -} diff --git a/zxing/src/main/java/com/google/zxing/FormatException.java b/zxing/src/main/java/com/google/zxing/FormatException.java deleted file mode 100644 index b046b82..0000000 --- a/zxing/src/main/java/com/google/zxing/FormatException.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Thrown when a barcode was successfully detected, but some aspect of - * the content did not conform to the barcode's format rules. This could have - * been due to a mis-detection. - * - * @author Sean Owen - */ -public final class FormatException extends ReaderException { - - private static final FormatException INSTANCE = new FormatException(); - static { - INSTANCE.setStackTrace(NO_TRACE); // since it's meaningless - } - - private FormatException() { - } - - private FormatException(Throwable cause) { - super(cause); - } - - public static FormatException getFormatInstance() { - return isStackTrace ? new FormatException() : INSTANCE; - } - - public static FormatException getFormatInstance(Throwable cause) { - return isStackTrace ? new FormatException(cause) : INSTANCE; - } -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/InvertedLuminanceSource.java b/zxing/src/main/java/com/google/zxing/InvertedLuminanceSource.java deleted file mode 100644 index edaa119..0000000 --- a/zxing/src/main/java/com/google/zxing/InvertedLuminanceSource.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * A wrapper implementation of {@link LuminanceSource} which inverts the luminances it returns -- black becomes - * white and vice versa, and each value becomes (255-value). - * - * @author Sean Owen - */ -public final class InvertedLuminanceSource extends LuminanceSource { - - private final LuminanceSource delegate; - - public InvertedLuminanceSource(LuminanceSource delegate) { - super(delegate.getWidth(), delegate.getHeight()); - this.delegate = delegate; - } - - @Override - public byte[] getRow(int y, byte[] row) { - row = delegate.getRow(y, row); - int width = getWidth(); - for (int i = 0; i < width; i++) { - row[i] = (byte) (255 - (row[i] & 0xFF)); - } - return row; - } - - @Override - public byte[] getMatrix() { - byte[] matrix = delegate.getMatrix(); - int length = getWidth() * getHeight(); - byte[] invertedMatrix = new byte[length]; - for (int i = 0; i < length; i++) { - invertedMatrix[i] = (byte) (255 - (matrix[i] & 0xFF)); - } - return invertedMatrix; - } - - @Override - public boolean isCropSupported() { - return delegate.isCropSupported(); - } - - @Override - public LuminanceSource crop(int left, int top, int width, int height) { - return new InvertedLuminanceSource(delegate.crop(left, top, width, height)); - } - - @Override - public boolean isRotateSupported() { - return delegate.isRotateSupported(); - } - - /** - * @return original delegate {@link LuminanceSource} since invert undoes itself - */ - @Override - public LuminanceSource invert() { - return delegate; - } - - @Override - public LuminanceSource rotateCounterClockwise() { - return new InvertedLuminanceSource(delegate.rotateCounterClockwise()); - } - - @Override - public LuminanceSource rotateCounterClockwise45() { - return new InvertedLuminanceSource(delegate.rotateCounterClockwise45()); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/LuminanceSource.java b/zxing/src/main/java/com/google/zxing/LuminanceSource.java deleted file mode 100644 index 1946d02..0000000 --- a/zxing/src/main/java/com/google/zxing/LuminanceSource.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * The purpose of this class hierarchy is to abstract different bitmap implementations across - * platforms into a standard interface for requesting greyscale luminance values. The interface - * only provides immutable methods; therefore crop and rotation create copies. This is to ensure - * that one Reader does not modify the original luminance source and leave it in an unknown state - * for other Readers in the chain. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public abstract class LuminanceSource { - - private final int width; - private final int height; - - protected LuminanceSource(int width, int height) { - this.width = width; - this.height = height; - } - - /** - * Fetches one row of luminance data from the underlying platform's bitmap. Values range from - * 0 (black) to 255 (white). Because Java does not have an unsigned byte type, callers will have - * to bitwise and with 0xff for each value. It is preferable for implementations of this method - * to only fetch this row rather than the whole image, since no 2D Readers may be installed and - * getMatrix() may never be called. - * - * @param y The row to fetch, which must be in [0,getHeight()) - * @param row An optional preallocated array. If null or too small, it will be ignored. - * Always use the returned object, and ignore the .length of the array. - * @return An array containing the luminance data. - */ - public abstract byte[] getRow(int y, byte[] row); - - /** - * Fetches luminance data for the underlying bitmap. Values should be fetched using: - * {@code int luminance = array[y * width + x] & 0xff} - * - * @return A row-major 2D array of luminance values. Do not use result.length as it may be - * larger than width * height bytes on some platforms. Do not modify the contents - * of the result. - */ - public abstract byte[] getMatrix(); - - /** - * @return The width of the bitmap. - */ - public final int getWidth() { - return width; - } - - /** - * @return The height of the bitmap. - */ - public final int getHeight() { - return height; - } - - /** - * @return Whether this subclass supports cropping. - */ - public boolean isCropSupported() { - return false; - } - - /** - * Returns a new object with cropped image data. Implementations may keep a reference to the - * original data rather than a copy. Only callable if isCropSupported() is true. - * - * @param left The left coordinate, which must be in [0,getWidth()) - * @param top The top coordinate, which must be in [0,getHeight()) - * @param width The width of the rectangle to crop. - * @param height The height of the rectangle to crop. - * @return A cropped version of this object. - */ - public LuminanceSource crop(int left, int top, int width, int height) { - throw new UnsupportedOperationException("This luminance source does not support cropping."); - } - - /** - * @return Whether this subclass supports counter-clockwise rotation. - */ - public boolean isRotateSupported() { - return false; - } - - /** - * @return a wrapper of this {@code LuminanceSource} which inverts the luminances it returns -- black becomes - * white and vice versa, and each value becomes (255-value). - */ - public LuminanceSource invert() { - return new InvertedLuminanceSource(this); - } - - /** - * Returns a new object with rotated image data by 90 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - public LuminanceSource rotateCounterClockwise() { - throw new UnsupportedOperationException("This luminance source does not support rotation by 90 degrees."); - } - - /** - * Returns a new object with rotated image data by 45 degrees counterclockwise. - * Only callable if {@link #isRotateSupported()} is true. - * - * @return A rotated version of this object. - */ - public LuminanceSource rotateCounterClockwise45() { - throw new UnsupportedOperationException("This luminance source does not support rotation by 45 degrees."); - } - - @Override - public final String toString() { - byte[] row = new byte[width]; - StringBuilder result = new StringBuilder(height * (width + 1)); - for (int y = 0; y < height; y++) { - row = getRow(y, row); - for (int x = 0; x < width; x++) { - int luminance = row[x] & 0xFF; - char c; - if (luminance < 0x40) { - c = '#'; - } else if (luminance < 0x80) { - c = '+'; - } else if (luminance < 0xC0) { - c = '.'; - } else { - c = ' '; - } - result.append(c); - } - result.append('\n'); - } - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/MultiFormatReader.java b/zxing/src/main/java/com/google/zxing/MultiFormatReader.java deleted file mode 100644 index fe6f4ce..0000000 --- a/zxing/src/main/java/com/google/zxing/MultiFormatReader.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.aztec.AztecReader; -import com.google.zxing.datamatrix.DataMatrixReader; -import com.google.zxing.maxicode.MaxiCodeReader; -import com.google.zxing.oned.MultiFormatOneDReader; -import com.google.zxing.pdf417.PDF417Reader; -import com.google.zxing.qrcode.QRCodeReader; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - -/** - * MultiFormatReader is a convenience class and the main entry point into the library for most uses. - * By default it attempts to decode all barcode formats that the library supports. Optionally, you - * can provide a hints object to request different behavior, for example only decoding QR codes. - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class MultiFormatReader implements Reader { - - private Map hints; - private Reader[] readers; - - /** - * This version of decode honors the intent of Reader.decode(BinaryBitmap) in that it - * passes null as a hint to the decoders. However, that makes it inefficient to call repeatedly. - * Use setHints() followed by decodeWithState() for continuous scan applications. - * - * @param image The pixel data to decode - * @return The contents of the image - * @throws NotFoundException Any errors which occurred - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException { - setHints(null); - return decodeInternal(image); - } - - /** - * Decode an image using the hints provided. Does not honor existing state. - * - * @param image The pixel data to decode - * @param hints The hints to use, clearing the previous state. - * @return The contents of the image - * @throws NotFoundException Any errors which occurred - */ - @Override - public Result decode(BinaryBitmap image, Map hints) throws NotFoundException { - setHints(hints); - return decodeInternal(image); - } - - /** - * Decode an image using the state set up by calling setHints() previously. Continuous scan - * clients will get a large speed increase by using this instead of decode(). - * - * @param image The pixel data to decode - * @return The contents of the image - * @throws NotFoundException Any errors which occurred - */ - public Result decodeWithState(BinaryBitmap image) throws NotFoundException { - // Make sure to set up the default state so we don't crash - if (readers == null) { - setHints(null); - } - return decodeInternal(image); - } - - /** - * This method adds state to the MultiFormatReader. By setting the hints once, subsequent calls - * to decodeWithState(image) can reuse the same set of readers without reallocating memory. This - * is important for performance in continuous scan clients. - * - * @param hints The set of hints to use for subsequent calls to decode(image) - */ - public void setHints(Map hints) { - this.hints = hints; - - boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - @SuppressWarnings("unchecked") - Collection formats = - hints == null ? null : (Collection) hints.get(DecodeHintType.POSSIBLE_FORMATS); - Collection readers = new ArrayList<>(); - if (formats != null) { - boolean addOneDReader = - formats.contains(BarcodeFormat.UPC_A) || - formats.contains(BarcodeFormat.UPC_E) || - formats.contains(BarcodeFormat.EAN_13) || - formats.contains(BarcodeFormat.EAN_8) || - formats.contains(BarcodeFormat.CODABAR) || - formats.contains(BarcodeFormat.CODE_39) || - formats.contains(BarcodeFormat.CODE_93) || - formats.contains(BarcodeFormat.CODE_128) || - formats.contains(BarcodeFormat.ITF) || - formats.contains(BarcodeFormat.RSS_14) || - formats.contains(BarcodeFormat.RSS_EXPANDED); - // Put 1D readers upfront in "normal" mode - if (addOneDReader && !tryHarder) { - readers.add(new MultiFormatOneDReader(hints)); - } - if (formats.contains(BarcodeFormat.QR_CODE)) { - readers.add(new QRCodeReader()); - } - if (formats.contains(BarcodeFormat.DATA_MATRIX)) { - readers.add(new DataMatrixReader()); - } - if (formats.contains(BarcodeFormat.AZTEC)) { - readers.add(new AztecReader()); - } - if (formats.contains(BarcodeFormat.PDF_417)) { - readers.add(new PDF417Reader()); - } - if (formats.contains(BarcodeFormat.MAXICODE)) { - readers.add(new MaxiCodeReader()); - } - // At end in "try harder" mode - if (addOneDReader && tryHarder) { - readers.add(new MultiFormatOneDReader(hints)); - } - } - if (readers.isEmpty()) { - if (!tryHarder) { - readers.add(new MultiFormatOneDReader(hints)); - } - - readers.add(new QRCodeReader()); - readers.add(new DataMatrixReader()); - readers.add(new AztecReader()); - readers.add(new PDF417Reader()); - readers.add(new MaxiCodeReader()); - - if (tryHarder) { - readers.add(new MultiFormatOneDReader(hints)); - } - } - this.readers = readers.toArray(new Reader[readers.size()]); - } - - @Override - public void reset() { - if (readers != null) { - for (Reader reader : readers) { - reader.reset(); - } - } - } - - private Result decodeInternal(BinaryBitmap image) throws NotFoundException { - if (readers != null) { - for (Reader reader : readers) { - try { - return reader.decode(image, hints); - } catch (ReaderException re) { - // continue - } - } - } - throw NotFoundException.getNotFoundInstance(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/MultiFormatWriter.java b/zxing/src/main/java/com/google/zxing/MultiFormatWriter.java deleted file mode 100644 index 19c29a4..0000000 --- a/zxing/src/main/java/com/google/zxing/MultiFormatWriter.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.aztec.AztecWriter; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.datamatrix.DataMatrixWriter; -import com.google.zxing.oned.CodaBarWriter; -import com.google.zxing.oned.Code128Writer; -import com.google.zxing.oned.Code39Writer; -import com.google.zxing.oned.Code93Writer; -import com.google.zxing.oned.EAN13Writer; -import com.google.zxing.oned.EAN8Writer; -import com.google.zxing.oned.ITFWriter; -import com.google.zxing.oned.UPCAWriter; -import com.google.zxing.oned.UPCEWriter; -import com.google.zxing.pdf417.PDF417Writer; -import com.google.zxing.qrcode.QRCodeWriter; - -import java.util.Map; - -/** - * This is a factory class which finds the appropriate Writer subclass for the BarcodeFormat - * requested and encodes the barcode with the supplied contents. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class MultiFormatWriter implements Writer { - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height) throws WriterException { - return encode(contents, format, width, height, null); - } - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, int height, - Map hints) throws WriterException { - - Writer writer; - switch (format) { - case EAN_8: - writer = new EAN8Writer(); - break; - case UPC_E: - writer = new UPCEWriter(); - break; - case EAN_13: - writer = new EAN13Writer(); - break; - case UPC_A: - writer = new UPCAWriter(); - break; - case QR_CODE: - writer = new QRCodeWriter(); - break; - case CODE_39: - writer = new Code39Writer(); - break; - case CODE_93: - writer = new Code93Writer(); - break; - case CODE_128: - writer = new Code128Writer(); - break; - case ITF: - writer = new ITFWriter(); - break; - case PDF_417: - writer = new PDF417Writer(); - break; - case CODABAR: - writer = new CodaBarWriter(); - break; - case DATA_MATRIX: - writer = new DataMatrixWriter(); - break; - case AZTEC: - writer = new AztecWriter(); - break; - default: - throw new IllegalArgumentException("No encoder available for format " + format); - } - return writer.encode(contents, format, width, height, hints); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/NotFoundException.java b/zxing/src/main/java/com/google/zxing/NotFoundException.java deleted file mode 100644 index 863526a..0000000 --- a/zxing/src/main/java/com/google/zxing/NotFoundException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Thrown when a barcode was not found in the image. It might have been - * partially detected but could not be confirmed. - * - * @author Sean Owen - */ -public final class NotFoundException extends ReaderException { - - private static final NotFoundException INSTANCE = new NotFoundException(); - static { - INSTANCE.setStackTrace(NO_TRACE); // since it's meaningless - } - - private NotFoundException() { - // do nothing - } - - public static NotFoundException getNotFoundInstance() { - return INSTANCE; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/PlanarYUVLuminanceSource.java b/zxing/src/main/java/com/google/zxing/PlanarYUVLuminanceSource.java deleted file mode 100644 index 2049e59..0000000 --- a/zxing/src/main/java/com/google/zxing/PlanarYUVLuminanceSource.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * This object extends LuminanceSource around an array of YUV data returned from the camera driver, - * with the option to crop to a rectangle within the full data. This can be used to exclude - * superfluous pixels around the perimeter and speed up decoding. - * - * It works for any pixel format where the Y channel is planar and appears first, including - * YCbCr_420_SP and YCbCr_422_SP. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class PlanarYUVLuminanceSource extends LuminanceSource { - - private static final int THUMBNAIL_SCALE_FACTOR = 2; - - private final byte[] yuvData; - private final int dataWidth; - private final int dataHeight; - private final int left; - private final int top; - - public PlanarYUVLuminanceSource(byte[] yuvData, - int dataWidth, - int dataHeight, - int left, - int top, - int width, - int height, - boolean reverseHorizontal) { - super(width, height); - - if (left + width > dataWidth || top + height > dataHeight) { - throw new IllegalArgumentException("Crop rectangle does not fit within image data."); - } - - this.yuvData = yuvData; - this.dataWidth = dataWidth; - this.dataHeight = dataHeight; - this.left = left; - this.top = top; - if (reverseHorizontal) { - reverseHorizontal(width, height); - } - } - - @Override - public byte[] getRow(int y, byte[] row) { - if (y < 0 || y >= getHeight()) { - throw new IllegalArgumentException("Requested row is outside the image: " + y); - } - int width = getWidth(); - if (row == null || row.length < width) { - row = new byte[width]; - } - int offset = (y + top) * dataWidth + left; - System.arraycopy(yuvData, offset, row, 0, width); - return row; - } - - @Override - public byte[] getMatrix() { - int width = getWidth(); - int height = getHeight(); - - // If the caller asks for the entire underlying image, save the copy and give them the - // original data. The docs specifically warn that result.length must be ignored. - if (width == dataWidth && height == dataHeight) { - return yuvData; - } - - int area = width * height; - byte[] matrix = new byte[area]; - int inputOffset = top * dataWidth + left; - - // If the width matches the full width of the underlying data, perform a single copy. - if (width == dataWidth) { - System.arraycopy(yuvData, inputOffset, matrix, 0, area); - return matrix; - } - - // Otherwise copy one cropped row at a time. - byte[] yuv = yuvData; - for (int y = 0; y < height; y++) { - int outputOffset = y * width; - System.arraycopy(yuv, inputOffset, matrix, outputOffset, width); - inputOffset += dataWidth; - } - return matrix; - } - - @Override - public boolean isCropSupported() { - return true; - } - - @Override - public LuminanceSource crop(int left, int top, int width, int height) { - return new PlanarYUVLuminanceSource(yuvData, - dataWidth, - dataHeight, - this.left + left, - this.top + top, - width, - height, - false); - } - - public int[] renderThumbnail() { - int width = getWidth() / THUMBNAIL_SCALE_FACTOR; - int height = getHeight() / THUMBNAIL_SCALE_FACTOR; - int[] pixels = new int[width * height]; - byte[] yuv = yuvData; - int inputOffset = top * dataWidth + left; - - for (int y = 0; y < height; y++) { - int outputOffset = y * width; - for (int x = 0; x < width; x++) { - int grey = yuv[inputOffset + x * THUMBNAIL_SCALE_FACTOR] & 0xff; - pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101); - } - inputOffset += dataWidth * THUMBNAIL_SCALE_FACTOR; - } - return pixels; - } - - /** - * @return width of image from {@link #renderThumbnail()} - */ - public int getThumbnailWidth() { - return getWidth() / THUMBNAIL_SCALE_FACTOR; - } - - /** - * @return height of image from {@link #renderThumbnail()} - */ - public int getThumbnailHeight() { - return getHeight() / THUMBNAIL_SCALE_FACTOR; - } - - private void reverseHorizontal(int width, int height) { - byte[] yuvData = this.yuvData; - for (int y = 0, rowStart = top * dataWidth + left; y < height; y++, rowStart += dataWidth) { - int middle = rowStart + width / 2; - for (int x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) { - byte temp = yuvData[x1]; - yuvData[x1] = yuvData[x2]; - yuvData[x2] = temp; - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/RGBLuminanceSource.java b/zxing/src/main/java/com/google/zxing/RGBLuminanceSource.java deleted file mode 100644 index e9378c9..0000000 --- a/zxing/src/main/java/com/google/zxing/RGBLuminanceSource.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * This class is used to help decode images from files which arrive as RGB data from - * an ARGB pixel array. It does not support rotation. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Betaminos - */ -public final class RGBLuminanceSource extends LuminanceSource { - - private final byte[] luminances; - private final int dataWidth; - private final int dataHeight; - private final int left; - private final int top; - - public RGBLuminanceSource(int width, int height, int[] pixels) { - super(width, height); - - dataWidth = width; - dataHeight = height; - left = 0; - top = 0; - - // In order to measure pure decoding speed, we convert the entire image to a greyscale array - // up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. - // - // Total number of pixels suffices, can ignore shape - int size = width * height; - luminances = new byte[size]; - for (int offset = 0; offset < size; offset++) { - int pixel = pixels[offset]; - int r = (pixel >> 16) & 0xff; // red - int g2 = (pixel >> 7) & 0x1fe; // 2 * green - int b = pixel & 0xff; // blue - // Calculate green-favouring average cheaply - luminances[offset] = (byte) ((r + g2 + b) / 4); - } - } - - private RGBLuminanceSource(byte[] pixels, - int dataWidth, - int dataHeight, - int left, - int top, - int width, - int height) { - super(width, height); - if (left + width > dataWidth || top + height > dataHeight) { - throw new IllegalArgumentException("Crop rectangle does not fit within image data."); - } - this.luminances = pixels; - this.dataWidth = dataWidth; - this.dataHeight = dataHeight; - this.left = left; - this.top = top; - } - - @Override - public byte[] getRow(int y, byte[] row) { - if (y < 0 || y >= getHeight()) { - throw new IllegalArgumentException("Requested row is outside the image: " + y); - } - int width = getWidth(); - if (row == null || row.length < width) { - row = new byte[width]; - } - int offset = (y + top) * dataWidth + left; - System.arraycopy(luminances, offset, row, 0, width); - return row; - } - - @Override - public byte[] getMatrix() { - int width = getWidth(); - int height = getHeight(); - - // If the caller asks for the entire underlying image, save the copy and give them the - // original data. The docs specifically warn that result.length must be ignored. - if (width == dataWidth && height == dataHeight) { - return luminances; - } - - int area = width * height; - byte[] matrix = new byte[area]; - int inputOffset = top * dataWidth + left; - - // If the width matches the full width of the underlying data, perform a single copy. - if (width == dataWidth) { - System.arraycopy(luminances, inputOffset, matrix, 0, area); - return matrix; - } - - // Otherwise copy one cropped row at a time. - byte[] rgb = luminances; - for (int y = 0; y < height; y++) { - int outputOffset = y * width; - System.arraycopy(rgb, inputOffset, matrix, outputOffset, width); - inputOffset += dataWidth; - } - return matrix; - } - - @Override - public boolean isCropSupported() { - return true; - } - - @Override - public LuminanceSource crop(int left, int top, int width, int height) { - return new RGBLuminanceSource(luminances, - dataWidth, - dataHeight, - this.left + left, - this.top + top, - width, - height); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/Reader.java b/zxing/src/main/java/com/google/zxing/Reader.java deleted file mode 100644 index 7208c94..0000000 --- a/zxing/src/main/java/com/google/zxing/Reader.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import java.util.Map; - -/** - * Implementations of this interface can decode an image of a barcode in some format into - * the String it encodes. For example, {@link com.google.zxing.qrcode.QRCodeReader} can - * decode a QR code. The decoder may optionally receive hints from the caller which may help - * it decode more quickly or accurately. - * - * See {@link MultiFormatReader}, which attempts to determine what barcode - * format is present within the image as well, and then decodes it accordingly. - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - */ -public interface Reader { - - /** - * Locates and decodes a barcode in some format within an image. - * - * @param image image of barcode to decode - * @return String which the barcode encodes - * @throws NotFoundException if no potential barcode is found - * @throws ChecksumException if a potential barcode is found but does not pass its checksum - * @throws FormatException if a potential barcode is found but format is invalid - */ - Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException; - - /** - * Locates and decodes a barcode in some format within an image. This method also accepts - * hints, each possibly associated to some data, which may help the implementation decode. - * - * @param image image of barcode to decode - * @param hints passed as a {@link java.util.Map} from {@link DecodeHintType} - * to arbitrary data. The - * meaning of the data depends upon the hint type. The implementation may or may not do - * anything with these hints. - * @return String which the barcode encodes - * @throws NotFoundException if no potential barcode is found - * @throws ChecksumException if a potential barcode is found but does not pass its checksum - * @throws FormatException if a potential barcode is found but format is invalid - */ - Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, ChecksumException, FormatException; - - /** - * Resets any internal state the implementation has after a decode, to prepare it - * for reuse. - */ - void reset(); - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/ReaderException.java b/zxing/src/main/java/com/google/zxing/ReaderException.java deleted file mode 100644 index 5f2c12e..0000000 --- a/zxing/src/main/java/com/google/zxing/ReaderException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * The general exception class throw when something goes wrong during decoding of a barcode. - * This includes, but is not limited to, failing checksums / error correction algorithms, being - * unable to locate finder timing patterns, and so on. - * - * @author Sean Owen - */ -public abstract class ReaderException extends Exception { - - // disable stack traces when not running inside test units - protected static final boolean isStackTrace = - System.getProperty("surefire.test.class.path") != null; - protected static final StackTraceElement[] NO_TRACE = new StackTraceElement[0]; - - ReaderException() { - // do nothing - } - - ReaderException(Throwable cause) { - super(cause); - } - - // Prevent stack traces from being taken - // srowen says: huh, my IDE is saying this is not an override. native methods can't be overridden? - // This, at least, does not hurt. Because we use a singleton pattern here, it doesn't matter anyhow. - @Override - public final Throwable fillInStackTrace() { - return null; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/Result.java b/zxing/src/main/java/com/google/zxing/Result.java deleted file mode 100644 index 7c98006..0000000 --- a/zxing/src/main/java/com/google/zxing/Result.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import java.util.EnumMap; -import java.util.Map; - -/** - *

    Encapsulates the result of decoding a barcode within an image.

    - * - * @author Sean Owen - */ -public final class Result { - - private final String text; - private final byte[] rawBytes; - private ResultPoint[] resultPoints; - private final BarcodeFormat format; - private Map resultMetadata; - private final long timestamp; - - public Result(String text, - byte[] rawBytes, - ResultPoint[] resultPoints, - BarcodeFormat format) { - this(text, rawBytes, resultPoints, format, System.currentTimeMillis()); - } - - public Result(String text, - byte[] rawBytes, - ResultPoint[] resultPoints, - BarcodeFormat format, - long timestamp) { - this.text = text; - this.rawBytes = rawBytes; - this.resultPoints = resultPoints; - this.format = format; - this.resultMetadata = null; - this.timestamp = timestamp; - } - - /** - * @return raw text encoded by the barcode - */ - public String getText() { - return text; - } - - /** - * @return raw bytes encoded by the barcode, if applicable, otherwise {@code null} - */ - public byte[] getRawBytes() { - return rawBytes; - } - - /** - * @return points related to the barcode in the image. These are typically points - * identifying finder patterns or the corners of the barcode. The exact meaning is - * specific to the type of barcode that was decoded. - */ - public ResultPoint[] getResultPoints() { - return resultPoints; - } - - /** - * @return {@link BarcodeFormat} representing the format of the barcode that was decoded - */ - public BarcodeFormat getBarcodeFormat() { - return format; - } - - /** - * @return {@link Map} mapping {@link ResultMetadataType} keys to values. May be - * {@code null}. This contains optional metadata about what was detected about the barcode, - * like orientation. - */ - public Map getResultMetadata() { - return resultMetadata; - } - - public void putMetadata(ResultMetadataType type, Object value) { - if (resultMetadata == null) { - resultMetadata = new EnumMap<>(ResultMetadataType.class); - } - resultMetadata.put(type, value); - } - - public void putAllMetadata(Map metadata) { - if (metadata != null) { - if (resultMetadata == null) { - resultMetadata = metadata; - } else { - resultMetadata.putAll(metadata); - } - } - } - - public void addResultPoints(ResultPoint[] newPoints) { - ResultPoint[] oldPoints = resultPoints; - if (oldPoints == null) { - resultPoints = newPoints; - } else if (newPoints != null && newPoints.length > 0) { - ResultPoint[] allPoints = new ResultPoint[oldPoints.length + newPoints.length]; - System.arraycopy(oldPoints, 0, allPoints, 0, oldPoints.length); - System.arraycopy(newPoints, 0, allPoints, oldPoints.length, newPoints.length); - resultPoints = allPoints; - } - } - - public long getTimestamp() { - return timestamp; - } - - @Override - public String toString() { - return text; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/ResultMetadataType.java b/zxing/src/main/java/com/google/zxing/ResultMetadataType.java deleted file mode 100644 index eac968b..0000000 --- a/zxing/src/main/java/com/google/zxing/ResultMetadataType.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Represents some type of metadata about the result of the decoding that the decoder - * wishes to communicate back to the caller. - * - * @author Sean Owen - */ -public enum ResultMetadataType { - - /** - * Unspecified, application-specific metadata. Maps to an unspecified {@link Object}. - */ - OTHER, - - /** - * Denotes the likely approximate orientation of the barcode in the image. This value - * is given as degrees rotated clockwise from the normal, upright orientation. - * For example a 1D barcode which was found by reading top-to-bottom would be - * said to have orientation "90". This key maps to an {@link Integer} whose - * value is in the range [0,360). - */ - ORIENTATION, - - /** - *

    2D barcode formats typically encode text, but allow for a sort of 'byte mode' - * which is sometimes used to encode binary data. While {@link Result} makes available - * the complete raw bytes in the barcode for these formats, it does not offer the bytes - * from the byte segments alone.

    - * - *

    This maps to a {@link java.util.List} of byte arrays corresponding to the - * raw bytes in the byte segments in the barcode, in order.

    - */ - BYTE_SEGMENTS, - - /** - * Error correction level used, if applicable. The value type depends on the - * format, but is typically a String. - */ - ERROR_CORRECTION_LEVEL, - - /** - * For some periodicals, indicates the issue number as an {@link Integer}. - */ - ISSUE_NUMBER, - - /** - * For some products, indicates the suggested retail price in the barcode as a - * formatted {@link String}. - */ - SUGGESTED_PRICE , - - /** - * For some products, the possible country of manufacture as a {@link String} denoting the - * ISO country code. Some map to multiple possible countries, like "US/CA". - */ - POSSIBLE_COUNTRY, - - /** - * For some products, the extension text - */ - UPC_EAN_EXTENSION, - - /** - * PDF417-specific metadata - */ - PDF417_EXTRA_METADATA, - - /** - * If the code format supports structured append and the current scanned code is part of one then the - * sequence number is given with it. - */ - STRUCTURED_APPEND_SEQUENCE, - - /** - * If the code format supports structured append and the current scanned code is part of one then the - * parity is given with it. - */ - STRUCTURED_APPEND_PARITY, - -} diff --git a/zxing/src/main/java/com/google/zxing/ResultPoint.java b/zxing/src/main/java/com/google/zxing/ResultPoint.java deleted file mode 100644 index 920cd24..0000000 --- a/zxing/src/main/java/com/google/zxing/ResultPoint.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.common.detector.MathUtils; - -/** - *

    Encapsulates a point of interest in an image containing a barcode. Typically, this - * would be the location of a finder pattern or the corner of the barcode, for example.

    - * - * @author Sean Owen - */ -public class ResultPoint { - - private final float x; - private final float y; - - public ResultPoint(float x, float y) { - this.x = x; - this.y = y; - } - - public final float getX() { - return x; - } - - public final float getY() { - return y; - } - - @Override - public final boolean equals(Object other) { - if (other instanceof ResultPoint) { - ResultPoint otherPoint = (ResultPoint) other; - return x == otherPoint.x && y == otherPoint.y; - } - return false; - } - - @Override - public final int hashCode() { - return 31 * Float.floatToIntBits(x) + Float.floatToIntBits(y); - } - - @Override - public final String toString() { - StringBuilder result = new StringBuilder(25); - result.append('('); - result.append(x); - result.append(','); - result.append(y); - result.append(')'); - return result.toString(); - } - - /** - * Orders an array of three ResultPoints in an order [A,B,C] such that AB is less than AC - * and BC is less than AC, and the angle between BC and BA is less than 180 degrees. - * - * @param patterns array of three {@code ResultPoint} to order - */ - public static void orderBestPatterns(ResultPoint[] patterns) { - - // Find distances between pattern centers - float zeroOneDistance = distance(patterns[0], patterns[1]); - float oneTwoDistance = distance(patterns[1], patterns[2]); - float zeroTwoDistance = distance(patterns[0], patterns[2]); - - ResultPoint pointA; - ResultPoint pointB; - ResultPoint pointC; - // Assume one closest to other two is B; A and C will just be guesses at first - if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { - pointB = patterns[0]; - pointA = patterns[1]; - pointC = patterns[2]; - } else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { - pointB = patterns[1]; - pointA = patterns[0]; - pointC = patterns[2]; - } else { - pointB = patterns[2]; - pointA = patterns[0]; - pointC = patterns[1]; - } - - // Use cross product to figure out whether A and C are correct or flipped. - // This asks whether BC x BA has a positive z component, which is the arrangement - // we want for A, B, C. If it's negative, then we've got it flipped around and - // should swap A and C. - if (crossProductZ(pointA, pointB, pointC) < 0.0f) { - ResultPoint temp = pointA; - pointA = pointC; - pointC = temp; - } - - patterns[0] = pointA; - patterns[1] = pointB; - patterns[2] = pointC; - } - - - /** - * @param pattern1 first pattern - * @param pattern2 second pattern - * @return distance between two points - */ - public static float distance(ResultPoint pattern1, ResultPoint pattern2) { - return MathUtils.distance(pattern1.x, pattern1.y, pattern2.x, pattern2.y); - } - - /** - * Returns the z component of the cross product between vectors BC and BA. - */ - private static float crossProductZ(ResultPoint pointA, - ResultPoint pointB, - ResultPoint pointC) { - float bX = pointB.x; - float bY = pointB.y; - return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); - } - - -} diff --git a/zxing/src/main/java/com/google/zxing/ResultPointCallback.java b/zxing/src/main/java/com/google/zxing/ResultPointCallback.java deleted file mode 100644 index 0c85410..0000000 --- a/zxing/src/main/java/com/google/zxing/ResultPointCallback.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * Callback which is invoked when a possible result point (significant - * point in the barcode image such as a corner) is found. - * - * @see DecodeHintType#NEED_RESULT_POINT_CALLBACK - */ -public interface ResultPointCallback { - - void foundPossibleResultPoint(ResultPoint point); - -} diff --git a/zxing/src/main/java/com/google/zxing/Writer.java b/zxing/src/main/java/com/google/zxing/Writer.java deleted file mode 100644 index f405fd8..0000000 --- a/zxing/src/main/java/com/google/zxing/Writer.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * The base class for all objects which encode/generate a barcode image. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public interface Writer { - - /** - * Encode a barcode using the default settings. - * - * @param contents The contents to encode in the barcode - * @param format The barcode format to generate - * @param width The preferred width in pixels - * @param height The preferred height in pixels - * @return {@link BitMatrix} representing encoded barcode image - * @throws WriterException if contents cannot be encoded legally in a format - */ - BitMatrix encode(String contents, BarcodeFormat format, int width, int height) - throws WriterException; - - /** - * @param contents The contents to encode in the barcode - * @param format The barcode format to generate - * @param width The preferred width in pixels - * @param height The preferred height in pixels - * @param hints Additional parameters to supply to the encoder - * @return {@link BitMatrix} representing encoded barcode image - * @throws WriterException if contents cannot be encoded legally in a format - */ - BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) - throws WriterException; - -} diff --git a/zxing/src/main/java/com/google/zxing/WriterException.java b/zxing/src/main/java/com/google/zxing/WriterException.java deleted file mode 100644 index c61800b..0000000 --- a/zxing/src/main/java/com/google/zxing/WriterException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing; - -/** - * A base class which covers the range of exceptions which may occur when encoding a barcode using - * the Writer framework. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class WriterException extends Exception { - - public WriterException() { - } - - public WriterException(String message) { - super(message); - } - - public WriterException(Throwable cause) { - super(cause); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/AztecDetectorResult.java b/zxing/src/main/java/com/google/zxing/aztec/AztecDetectorResult.java deleted file mode 100644 index 8341578..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/AztecDetectorResult.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec; - -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DetectorResult; - -/** - *

    Extends {@link DetectorResult} with more information specific to the Aztec format, - * like the number of layers and whether it's compact.

    - * - * @author Sean Owen - */ -public final class AztecDetectorResult extends DetectorResult { - - private final boolean compact; - private final int nbDatablocks; - private final int nbLayers; - - public AztecDetectorResult(BitMatrix bits, - ResultPoint[] points, - boolean compact, - int nbDatablocks, - int nbLayers) { - super(bits, points); - this.compact = compact; - this.nbDatablocks = nbDatablocks; - this.nbLayers = nbLayers; - } - - public int getNbLayers() { - return nbLayers; - } - - public int getNbDatablocks() { - return nbDatablocks; - } - - public boolean isCompact() { - return compact; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/AztecReader.java b/zxing/src/main/java/com/google/zxing/aztec/AztecReader.java deleted file mode 100644 index d56e3f6..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/AztecReader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.aztec.decoder.Decoder; -import com.google.zxing.aztec.detector.Detector; -import com.google.zxing.common.DecoderResult; - -import java.util.List; -import java.util.Map; - -/** - * This implementation can detect and decode Aztec codes in an image. - * - * @author David Olivier - */ -public final class AztecReader implements Reader { - - /** - * Locates and decodes a Data Matrix code in an image. - * - * @return a String representing the content encoded by the Data Matrix code - * @throws NotFoundException if a Data Matrix code cannot be found - * @throws FormatException if a Data Matrix code cannot be decoded - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, FormatException { - return decode(image, null); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, FormatException { - - NotFoundException notFoundException = null; - FormatException formatException = null; - Detector detector = new Detector(image.getBlackMatrix()); - ResultPoint[] points = null; - DecoderResult decoderResult = null; - try { - AztecDetectorResult detectorResult = detector.detect(false); - points = detectorResult.getPoints(); - decoderResult = new Decoder().decode(detectorResult); - } catch (NotFoundException e) { - notFoundException = e; - } catch (FormatException e) { - formatException = e; - } - if (decoderResult == null) { - try { - AztecDetectorResult detectorResult = detector.detect(true); - points = detectorResult.getPoints(); - decoderResult = new Decoder().decode(detectorResult); - } catch (NotFoundException | FormatException e) { - if (notFoundException != null) { - throw notFoundException; - } - if (formatException != null) { - throw formatException; - } - throw e; - } - } - - if (hints != null) { - ResultPointCallback rpcb = (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - if (rpcb != null) { - for (ResultPoint point : points) { - rpcb.foundPossibleResultPoint(point); - } - } - } - - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, BarcodeFormat.AZTEC); - - List byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType.BYTE_SEGMENTS, byteSegments); - } - String ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, ecLevel); - } - - return result; - } - - @Override - public void reset() { - // do nothing - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/AztecWriter.java b/zxing/src/main/java/com/google/zxing/aztec/AztecWriter.java deleted file mode 100644 index 508d327..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/AztecWriter.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.aztec.encoder.AztecCode; -import com.google.zxing.aztec.encoder.Encoder; -import com.google.zxing.common.BitMatrix; - -import java.nio.charset.Charset; -import java.util.Map; - -/** - * Renders an Aztec code as a {@link BitMatrix}. - */ -public final class AztecWriter implements Writer { - - private static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) { - return encode(contents, format, width, height, null); - } - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map hints) { - Charset charset = DEFAULT_CHARSET; - int eccPercent = Encoder.DEFAULT_EC_PERCENT; - int layers = Encoder.DEFAULT_AZTEC_LAYERS; - if (hints != null) { - if (hints.containsKey(EncodeHintType.CHARACTER_SET)) { - charset = Charset.forName(hints.get(EncodeHintType.CHARACTER_SET).toString()); - } - if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) { - eccPercent = Integer.parseInt(hints.get(EncodeHintType.ERROR_CORRECTION).toString()); - } - if (hints.containsKey(EncodeHintType.AZTEC_LAYERS)) { - layers = Integer.parseInt(hints.get(EncodeHintType.AZTEC_LAYERS).toString()); - } - } - return encode(contents, format, width, height, charset, eccPercent, layers); - } - - private static BitMatrix encode(String contents, BarcodeFormat format, - int width, int height, - Charset charset, int eccPercent, int layers) { - if (format != BarcodeFormat.AZTEC) { - throw new IllegalArgumentException("Can only encode AZTEC, but got " + format); - } - AztecCode aztec = Encoder.encode(contents.getBytes(charset), eccPercent, layers); - return renderResult(aztec, width, height); - } - - private static BitMatrix renderResult(AztecCode code, int width, int height) { - BitMatrix input = code.getMatrix(); - if (input == null) { - throw new IllegalStateException(); - } - int inputWidth = input.getWidth(); - int inputHeight = input.getHeight(); - int outputWidth = Math.max(width, inputWidth); - int outputHeight = Math.max(height, inputHeight); - - int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight); - int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; - int topPadding = (outputHeight - (inputHeight * multiple)) / 2; - - BitMatrix output = new BitMatrix(outputWidth, outputHeight); - - for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { - // Write the contents of this row of the barcode - for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (input.get(inputX, inputY)) { - output.setRegion(outputX, outputY, multiple, multiple); - } - } - } - return output; - } -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/decoder/Decoder.java b/zxing/src/main/java/com/google/zxing/aztec/decoder/Decoder.java deleted file mode 100644 index 20affb5..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/decoder/Decoder.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.aztec.AztecDetectorResult; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; -import com.google.zxing.common.reedsolomon.ReedSolomonException; - -import java.util.Arrays; - -/** - *

    The main class which implements Aztec Code decoding -- as opposed to locating and extracting - * the Aztec Code from an image.

    - * - * @author David Olivier - */ -public final class Decoder { - - private enum Table { - UPPER, - LOWER, - MIXED, - DIGIT, - PUNCT, - BINARY - } - - private static final String[] UPPER_TABLE = { - "CTRL_PS", " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "CTRL_LL", "CTRL_ML", "CTRL_DL", "CTRL_BS" - }; - - private static final String[] LOWER_TABLE = { - "CTRL_PS", " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", - "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "CTRL_US", "CTRL_ML", "CTRL_DL", "CTRL_BS" - }; - - private static final String[] MIXED_TABLE = { - "CTRL_PS", " ", "\1", "\2", "\3", "\4", "\5", "\6", "\7", "\b", "\t", "\n", - "\13", "\f", "\r", "\33", "\34", "\35", "\36", "\37", "@", "\\", "^", "_", - "`", "|", "~", "\177", "CTRL_LL", "CTRL_UL", "CTRL_PL", "CTRL_BS" - }; - - private static final String[] PUNCT_TABLE = { - "", "\r", "\r\n", ". ", ", ", ": ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", - "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "[", "]", "{", "}", "CTRL_UL" - }; - - private static final String[] DIGIT_TABLE = { - "CTRL_PS", " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ",", ".", "CTRL_UL", "CTRL_US" - }; - - private AztecDetectorResult ddata; - - public DecoderResult decode(AztecDetectorResult detectorResult) throws FormatException { - ddata = detectorResult; - BitMatrix matrix = detectorResult.getBits(); - boolean[] rawbits = extractBits(matrix); - boolean[] correctedBits = correctBits(rawbits); - byte[] rawBytes = convertBoolArrayToByteArray(correctedBits); - String result = getEncodedData(correctedBits); - return new DecoderResult(rawBytes, result, null, null); - } - - // This method is used for testing the high-level encoder - public static String highLevelDecode(boolean[] correctedBits) { - return getEncodedData(correctedBits); - } - - /** - * Gets the string encoded in the aztec code bits - * - * @return the decoded string - */ - private static String getEncodedData(boolean[] correctedBits) { - int endIndex = correctedBits.length; - Table latchTable = Table.UPPER; // table most recently latched to - Table shiftTable = Table.UPPER; // table to use for the next read - StringBuilder result = new StringBuilder(20); - int index = 0; - while (index < endIndex) { - if (shiftTable == Table.BINARY) { - if (endIndex - index < 5) { - break; - } - int length = readCode(correctedBits, index, 5); - index += 5; - if (length == 0) { - if (endIndex - index < 11) { - break; - } - length = readCode(correctedBits, index, 11) + 31; - index += 11; - } - for (int charCount = 0; charCount < length; charCount++) { - if (endIndex - index < 8) { - index = endIndex; // Force outer loop to exit - break; - } - int code = readCode(correctedBits, index, 8); - result.append((char) code); - index += 8; - } - // Go back to whatever mode we had been in - shiftTable = latchTable; - } else { - int size = shiftTable == Table.DIGIT ? 4 : 5; - if (endIndex - index < size) { - break; - } - int code = readCode(correctedBits, index, size); - index += size; - String str = getCharacter(shiftTable, code); - if (str.startsWith("CTRL_")) { - // Table changes - shiftTable = getTable(str.charAt(5)); - if (str.charAt(6) == 'L') { - latchTable = shiftTable; - } - } else { - result.append(str); - // Go back to whatever mode we had been in - shiftTable = latchTable; - } - } - } - return result.toString(); - } - - /** - * gets the table corresponding to the char passed - */ - private static Table getTable(char t) { - switch (t) { - case 'L': - return Table.LOWER; - case 'P': - return Table.PUNCT; - case 'M': - return Table.MIXED; - case 'D': - return Table.DIGIT; - case 'B': - return Table.BINARY; - case 'U': - default: - return Table.UPPER; - } - } - - /** - * Gets the character (or string) corresponding to the passed code in the given table - * - * @param table the table used - * @param code the code of the character - */ - private static String getCharacter(Table table, int code) { - switch (table) { - case UPPER: - return UPPER_TABLE[code]; - case LOWER: - return LOWER_TABLE[code]; - case MIXED: - return MIXED_TABLE[code]; - case PUNCT: - return PUNCT_TABLE[code]; - case DIGIT: - return DIGIT_TABLE[code]; - default: - // Should not reach here. - throw new IllegalStateException("Bad table"); - } - } - - /** - *

    Performs RS error correction on an array of bits.

    - * - * @return the corrected array - * @throws FormatException if the input contains too many errors - */ - private boolean[] correctBits(boolean[] rawbits) throws FormatException { - GenericGF gf; - int codewordSize; - - if (ddata.getNbLayers() <= 2) { - codewordSize = 6; - gf = GenericGF.AZTEC_DATA_6; - } else if (ddata.getNbLayers() <= 8) { - codewordSize = 8; - gf = GenericGF.AZTEC_DATA_8; - } else if (ddata.getNbLayers() <= 22) { - codewordSize = 10; - gf = GenericGF.AZTEC_DATA_10; - } else { - codewordSize = 12; - gf = GenericGF.AZTEC_DATA_12; - } - - int numDataCodewords = ddata.getNbDatablocks(); - int numCodewords = rawbits.length / codewordSize; - if (numCodewords < numDataCodewords) { - throw FormatException.getFormatInstance(); - } - int offset = rawbits.length % codewordSize; - int numECCodewords = numCodewords - numDataCodewords; - - int[] dataWords = new int[numCodewords]; - for (int i = 0; i < numCodewords; i++, offset += codewordSize) { - dataWords[i] = readCode(rawbits, offset, codewordSize); - } - - try { - ReedSolomonDecoder rsDecoder = new ReedSolomonDecoder(gf); - rsDecoder.decode(dataWords, numECCodewords); - } catch (ReedSolomonException ex) { - throw FormatException.getFormatInstance(ex); - } - - // Now perform the unstuffing operation. - // First, count how many bits are going to be thrown out as stuffing - int mask = (1 << codewordSize) - 1; - int stuffedBits = 0; - for (int i = 0; i < numDataCodewords; i++) { - int dataWord = dataWords[i]; - if (dataWord == 0 || dataWord == mask) { - throw FormatException.getFormatInstance(); - } else if (dataWord == 1 || dataWord == mask - 1) { - stuffedBits++; - } - } - // Now, actually unpack the bits and remove the stuffing - boolean[] correctedBits = new boolean[numDataCodewords * codewordSize - stuffedBits]; - int index = 0; - for (int i = 0; i < numDataCodewords; i++) { - int dataWord = dataWords[i]; - if (dataWord == 1 || dataWord == mask - 1) { - // next codewordSize-1 bits are all zeros or all ones - Arrays.fill(correctedBits, index, index + codewordSize - 1, dataWord > 1); - index += codewordSize - 1; - } else { - for (int bit = codewordSize - 1; bit >= 0; --bit) { - correctedBits[index++] = (dataWord & (1 << bit)) != 0; - } - } - } - return correctedBits; - } - - /** - * Gets the array of bits from an Aztec Code matrix - * - * @return the array of bits - */ - boolean[] extractBits(BitMatrix matrix) { - boolean compact = ddata.isCompact(); - int layers = ddata.getNbLayers(); - int baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines - int[] alignmentMap = new int[baseMatrixSize]; - boolean[] rawbits = new boolean[totalBitsInLayer(layers, compact)]; - - if (compact) { - for (int i = 0; i < alignmentMap.length; i++) { - alignmentMap[i] = i; - } - } else { - int matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); - int origCenter = baseMatrixSize / 2; - int center = matrixSize / 2; - for (int i = 0; i < origCenter; i++) { - int newOffset = i + i / 15; - alignmentMap[origCenter - i - 1] = center - newOffset - 1; - alignmentMap[origCenter + i] = center + newOffset + 1; - } - } - for (int i = 0, rowOffset = 0; i < layers; i++) { - int rowSize = (layers - i) * 4 + (compact ? 9 : 12); - // The top-left most point of this layer is (not including alignment lines) - int low = i * 2; - // The bottom-right most point of this layer is (not including alignment lines) - int high = baseMatrixSize - 1 - low; - // We pull bits from the two 2 x rowSize columns and two rowSize x 2 rows - for (int j = 0; j < rowSize; j++) { - int columnOffset = j * 2; - for (int k = 0; k < 2; k++) { - // left column - rawbits[rowOffset + columnOffset + k] = - matrix.get(alignmentMap[low + k], alignmentMap[low + j]); - // bottom row - rawbits[rowOffset + 2 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[low + j], alignmentMap[high - k]); - // right column - rawbits[rowOffset + 4 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[high - k], alignmentMap[high - j]); - // top row - rawbits[rowOffset + 6 * rowSize + columnOffset + k] = - matrix.get(alignmentMap[high - j], alignmentMap[low + k]); - } - } - rowOffset += rowSize * 8; - } - return rawbits; - } - - /** - * Reads a code of given length and at given index in an array of bits - */ - private static int readCode(boolean[] rawbits, int startIndex, int length) { - int res = 0; - for (int i = startIndex; i < startIndex + length; i++) { - res <<= 1; - if (rawbits[i]) { - res |= 0x01; - } - } - return res; - } - - /** - * Reads a code of length 8 in an array of bits, padding with zeros - */ - private static byte readByte(boolean[] rawbits, int startIndex) { - int n = rawbits.length - startIndex; - if (n >= 8) { - return (byte) readCode(rawbits, startIndex, 8); - } - return (byte) (readCode(rawbits, startIndex, n) << (8 - n)); - } - - /** - * Packs a bit array into bytes, most significant bit first - */ - static byte[] convertBoolArrayToByteArray(boolean[] boolArr) { - byte[] byteArr = new byte[(boolArr.length + 7) / 8]; - for (int i = 0; i < byteArr.length; i++) { - byteArr[i] = readByte(boolArr, 8 * i); - } - return byteArr; - } - - private static int totalBitsInLayer(int layers, boolean compact) { - return ((compact ? 88 : 112) + 16 * layers) * layers; - } -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/detector/Detector.java b/zxing/src/main/java/com/google/zxing/aztec/detector/Detector.java deleted file mode 100644 index 5cc5c36..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/detector/Detector.java +++ /dev/null @@ -1,600 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.detector; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.aztec.AztecDetectorResult; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.GridSampler; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.common.detector.WhiteRectangleDetector; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; -import com.google.zxing.common.reedsolomon.ReedSolomonException; - -/** - * Encapsulates logic that can detect an Aztec Code in an image, even if the Aztec Code - * is rotated or skewed, or partially obscured. - * - * @author David Olivier - * @author Frank Yellin - */ -public final class Detector { - - private final BitMatrix image; - - private boolean compact; - private int nbLayers; - private int nbDataBlocks; - private int nbCenterLayers; - private int shift; - - public Detector(BitMatrix image) { - this.image = image; - } - - public AztecDetectorResult detect() throws NotFoundException { - return detect(false); - } - - /** - * Detects an Aztec Code in an image. - * - * @param isMirror if true, image is a mirror-image of original - * @return {@link AztecDetectorResult} encapsulating results of detecting an Aztec Code - * @throws NotFoundException if no Aztec Code can be found - */ - public AztecDetectorResult detect(boolean isMirror) throws NotFoundException { - - // 1. Get the center of the aztec matrix - Point pCenter = getMatrixCenter(); - - // 2. Get the center points of the four diagonal points just outside the bull's eye - // [topRight, bottomRight, bottomLeft, topLeft] - ResultPoint[] bullsEyeCorners = getBullsEyeCorners(pCenter); - - if (isMirror) { - ResultPoint temp = bullsEyeCorners[0]; - bullsEyeCorners[0] = bullsEyeCorners[2]; - bullsEyeCorners[2] = temp; - } - - // 3. Get the size of the matrix and other parameters from the bull's eye - extractParameters(bullsEyeCorners); - - // 4. Sample the grid - BitMatrix bits = sampleGrid(image, - bullsEyeCorners[shift % 4], - bullsEyeCorners[(shift + 1) % 4], - bullsEyeCorners[(shift + 2) % 4], - bullsEyeCorners[(shift + 3) % 4]); - - // 5. Get the corners of the matrix. - ResultPoint[] corners = getMatrixCornerPoints(bullsEyeCorners); - - return new AztecDetectorResult(bits, corners, compact, nbDataBlocks, nbLayers); - } - - /** - * Extracts the number of data layers and data blocks from the layer around the bull's eye. - * - * @param bullsEyeCorners the array of bull's eye corners - * @throws NotFoundException in case of too many errors or invalid parameters - */ - private void extractParameters(ResultPoint[] bullsEyeCorners) throws NotFoundException { - if (!isValid(bullsEyeCorners[0]) || !isValid(bullsEyeCorners[1]) || - !isValid(bullsEyeCorners[2]) || !isValid(bullsEyeCorners[3])) { - throw NotFoundException.getNotFoundInstance(); - } - int length = 2 * nbCenterLayers; - // Get the bits around the bull's eye - int[] sides = { - sampleLine(bullsEyeCorners[0], bullsEyeCorners[1], length), // Right side - sampleLine(bullsEyeCorners[1], bullsEyeCorners[2], length), // Bottom - sampleLine(bullsEyeCorners[2], bullsEyeCorners[3], length), // Left side - sampleLine(bullsEyeCorners[3], bullsEyeCorners[0], length) // Top - }; - - // bullsEyeCorners[shift] is the corner of the bulls'eye that has three - // orientation marks. - // sides[shift] is the row/column that goes from the corner with three - // orientation marks to the corner with two. - shift = getRotation(sides, length); - - // Flatten the parameter bits into a single 28- or 40-bit long - long parameterData = 0; - for (int i = 0; i < 4; i++) { - int side = sides[(shift + i) % 4]; - if (compact) { - // Each side of the form ..XXXXXXX. where Xs are parameter data - parameterData <<= 7; - parameterData += (side >> 1) & 0x7F; - } else { - // Each side of the form ..XXXXX.XXXXX. where Xs are parameter data - parameterData <<= 10; - parameterData += ((side >> 2) & (0x1f << 5)) + ((side >> 1) & 0x1F); - } - } - - // Corrects parameter data using RS. Returns just the data portion - // without the error correction. - int correctedData = getCorrectedParameterData(parameterData, compact); - - if (compact) { - // 8 bits: 2 bits layers and 6 bits data blocks - nbLayers = (correctedData >> 6) + 1; - nbDataBlocks = (correctedData & 0x3F) + 1; - } else { - // 16 bits: 5 bits layers and 11 bits data blocks - nbLayers = (correctedData >> 11) + 1; - nbDataBlocks = (correctedData & 0x7FF) + 1; - } - } - - private static final int[] EXPECTED_CORNER_BITS = { - 0xee0, // 07340 XXX .XX X.. ... - 0x1dc, // 00734 ... XXX .XX X.. - 0x83b, // 04073 X.. ... XXX .XX - 0x707, // 03407 .XX X.. ... XXX - }; - - private static int getRotation(int[] sides, int length) throws NotFoundException { - // In a normal pattern, we expect to See - // ** .* D A - // * * - // - // . * - // .. .. C B - // - // Grab the 3 bits from each of the sides the form the locator pattern and concatenate - // into a 12-bit integer. Start with the bit at A - int cornerBits = 0; - for (int side : sides) { - // XX......X where X's are orientation marks - int t = ((side >> (length - 2)) << 1) + (side & 1); - cornerBits = (cornerBits << 3) + t; - } - // Mov the bottom bit to the top, so that the three bits of the locator pattern at A are - // together. cornerBits is now: - // 3 orientation bits at A || 3 orientation bits at B || ... || 3 orientation bits at D - cornerBits = ((cornerBits & 1) << 11) + (cornerBits >> 1); - // The result shift indicates which element of BullsEyeCorners[] goes into the top-left - // corner. Since the four rotation values have a Hamming distance of 8, we - // can easily tolerate two errors. - for (int shift = 0; shift < 4; shift++) { - if (Integer.bitCount(cornerBits ^ EXPECTED_CORNER_BITS[shift]) <= 2) { - return shift; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Corrects the parameter bits using Reed-Solomon algorithm. - * - * @param parameterData parameter bits - * @param compact true if this is a compact Aztec code - * @throws NotFoundException if the array contains too many errors - */ - private static int getCorrectedParameterData(long parameterData, boolean compact) throws NotFoundException { - int numCodewords; - int numDataCodewords; - - if (compact) { - numCodewords = 7; - numDataCodewords = 2; - } else { - numCodewords = 10; - numDataCodewords = 4; - } - - int numECCodewords = numCodewords - numDataCodewords; - int[] parameterWords = new int[numCodewords]; - for (int i = numCodewords - 1; i >= 0; --i) { - parameterWords[i] = (int) parameterData & 0xF; - parameterData >>= 4; - } - try { - ReedSolomonDecoder rsDecoder = new ReedSolomonDecoder(GenericGF.AZTEC_PARAM); - rsDecoder.decode(parameterWords, numECCodewords); - } catch (ReedSolomonException ignored) { - throw NotFoundException.getNotFoundInstance(); - } - // Toss the error correction. Just return the data as an integer - int result = 0; - for (int i = 0; i < numDataCodewords; i++) { - result = (result << 4) + parameterWords[i]; - } - return result; - } - - /** - * Finds the corners of a bull-eye centered on the passed point. - * This returns the centers of the diagonal points just outside the bull's eye - * Returns [topRight, bottomRight, bottomLeft, topLeft] - * - * @param pCenter Center point - * @return The corners of the bull-eye - * @throws NotFoundException If no valid bull-eye can be found - */ - private ResultPoint[] getBullsEyeCorners(Point pCenter) throws NotFoundException { - - Point pina = pCenter; - Point pinb = pCenter; - Point pinc = pCenter; - Point pind = pCenter; - - boolean color = true; - - for (nbCenterLayers = 1; nbCenterLayers < 9; nbCenterLayers++) { - Point pouta = getFirstDifferent(pina, color, 1, -1); - Point poutb = getFirstDifferent(pinb, color, 1, 1); - Point poutc = getFirstDifferent(pinc, color, -1, 1); - Point poutd = getFirstDifferent(pind, color, -1, -1); - - //d a - // - //c b - - if (nbCenterLayers > 2) { - float q = distance(poutd, pouta) * nbCenterLayers / (distance(pind, pina) * (nbCenterLayers + 2)); - if (q < 0.75 || q > 1.25 || !isWhiteOrBlackRectangle(pouta, poutb, poutc, poutd)) { - break; - } - } - - pina = pouta; - pinb = poutb; - pinc = poutc; - pind = poutd; - - color = !color; - } - - if (nbCenterLayers != 5 && nbCenterLayers != 7) { - throw NotFoundException.getNotFoundInstance(); - } - - compact = nbCenterLayers == 5; - - // Expand the square by .5 pixel in each direction so that we're on the border - // between the white square and the black square - ResultPoint pinax = new ResultPoint(pina.getX() + 0.5f, pina.getY() - 0.5f); - ResultPoint pinbx = new ResultPoint(pinb.getX() + 0.5f, pinb.getY() + 0.5f); - ResultPoint pincx = new ResultPoint(pinc.getX() - 0.5f, pinc.getY() + 0.5f); - ResultPoint pindx = new ResultPoint(pind.getX() - 0.5f, pind.getY() - 0.5f); - - // Expand the square so that its corners are the centers of the points - // just outside the bull's eye. - return expandSquare(new ResultPoint[]{pinax, pinbx, pincx, pindx}, - 2 * nbCenterLayers - 3, - 2 * nbCenterLayers); - } - - /** - * Finds a candidate center point of an Aztec code from an image - * - * @return the center point - */ - private Point getMatrixCenter() { - - ResultPoint pointA; - ResultPoint pointB; - ResultPoint pointC; - ResultPoint pointD; - - //Get a white rectangle that can be the border of the matrix in center bull's eye or - try { - - ResultPoint[] cornerPoints = new WhiteRectangleDetector(image).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - - } catch (NotFoundException e) { - - // This exception can be in case the initial rectangle is white - // In that case, surely in the bull's eye, we try to expand the rectangle. - int cx = image.getWidth() / 2; - int cy = image.getHeight() / 2; - pointA = getFirstDifferent(new Point(cx + 7, cy - 7), false, 1, -1).toResultPoint(); - pointB = getFirstDifferent(new Point(cx + 7, cy + 7), false, 1, 1).toResultPoint(); - pointC = getFirstDifferent(new Point(cx - 7, cy + 7), false, -1, 1).toResultPoint(); - pointD = getFirstDifferent(new Point(cx - 7, cy - 7), false, -1, -1).toResultPoint(); - - } - - //Compute the center of the rectangle - int cx = MathUtils.round((pointA.getX() + pointD.getX() + pointB.getX() + pointC.getX()) / 4.0f); - int cy = MathUtils.round((pointA.getY() + pointD.getY() + pointB.getY() + pointC.getY()) / 4.0f); - - // Redetermine the white rectangle starting from previously computed center. - // This will ensure that we end up with a white rectangle in center bull's eye - // in order to compute a more accurate center. - try { - ResultPoint[] cornerPoints = new WhiteRectangleDetector(image, 15, cx, cy).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - } catch (NotFoundException e) { - // This exception can be in case the initial rectangle is white - // In that case we try to expand the rectangle. - pointA = getFirstDifferent(new Point(cx + 7, cy - 7), false, 1, -1).toResultPoint(); - pointB = getFirstDifferent(new Point(cx + 7, cy + 7), false, 1, 1).toResultPoint(); - pointC = getFirstDifferent(new Point(cx - 7, cy + 7), false, -1, 1).toResultPoint(); - pointD = getFirstDifferent(new Point(cx - 7, cy - 7), false, -1, -1).toResultPoint(); - } - - // Recompute the center of the rectangle - cx = MathUtils.round((pointA.getX() + pointD.getX() + pointB.getX() + pointC.getX()) / 4.0f); - cy = MathUtils.round((pointA.getY() + pointD.getY() + pointB.getY() + pointC.getY()) / 4.0f); - - return new Point(cx, cy); - } - - /** - * Gets the Aztec code corners from the bull's eye corners and the parameters. - * - * @param bullsEyeCorners the array of bull's eye corners - * @return the array of aztec code corners - */ - private ResultPoint[] getMatrixCornerPoints(ResultPoint[] bullsEyeCorners) { - return expandSquare(bullsEyeCorners, 2 * nbCenterLayers, getDimension()); - } - - /** - * Creates a BitMatrix by sampling the provided image. - * topLeft, topRight, bottomRight, and bottomLeft are the centers of the squares on the - * diagonal just outside the bull's eye. - */ - private BitMatrix sampleGrid(BitMatrix image, - ResultPoint topLeft, - ResultPoint topRight, - ResultPoint bottomRight, - ResultPoint bottomLeft) throws NotFoundException { - - GridSampler sampler = GridSampler.getInstance(); - int dimension = getDimension(); - - float low = dimension / 2.0f - nbCenterLayers; - float high = dimension / 2.0f + nbCenterLayers; - - return sampler.sampleGrid(image, - dimension, - dimension, - low, low, // topleft - high, low, // topright - high, high, // bottomright - low, high, // bottomleft - topLeft.getX(), topLeft.getY(), - topRight.getX(), topRight.getY(), - bottomRight.getX(), bottomRight.getY(), - bottomLeft.getX(), bottomLeft.getY()); - } - - /** - * Samples a line. - * - * @param p1 start point (inclusive) - * @param p2 end point (exclusive) - * @param size number of bits - * @return the array of bits as an int (first bit is high-order bit of result) - */ - private int sampleLine(ResultPoint p1, ResultPoint p2, int size) { - int result = 0; - - float d = distance(p1, p2); - float moduleSize = d / size; - float px = p1.getX(); - float py = p1.getY(); - float dx = moduleSize * (p2.getX() - p1.getX()) / d; - float dy = moduleSize * (p2.getY() - p1.getY()) / d; - for (int i = 0; i < size; i++) { - if (image.get(MathUtils.round(px + i * dx), MathUtils.round(py + i * dy))) { - result |= 1 << (size - i - 1); - } - } - return result; - } - - /** - * @return true if the border of the rectangle passed in parameter is compound of white points only - * or black points only - */ - private boolean isWhiteOrBlackRectangle(Point p1, - Point p2, - Point p3, - Point p4) { - - int corr = 3; - - p1 = new Point(p1.getX() - corr, p1.getY() + corr); - p2 = new Point(p2.getX() - corr, p2.getY() - corr); - p3 = new Point(p3.getX() + corr, p3.getY() - corr); - p4 = new Point(p4.getX() + corr, p4.getY() + corr); - - int cInit = getColor(p4, p1); - - if (cInit == 0) { - return false; - } - - int c = getColor(p1, p2); - - if (c != cInit) { - return false; - } - - c = getColor(p2, p3); - - if (c != cInit) { - return false; - } - - c = getColor(p3, p4); - - return c == cInit; - - } - - /** - * Gets the color of a segment - * - * @return 1 if segment more than 90% black, -1 if segment is more than 90% white, 0 else - */ - private int getColor(Point p1, Point p2) { - float d = distance(p1, p2); - float dx = (p2.getX() - p1.getX()) / d; - float dy = (p2.getY() - p1.getY()) / d; - int error = 0; - - float px = p1.getX(); - float py = p1.getY(); - - boolean colorModel = image.get(p1.getX(), p1.getY()); - - for (int i = 0; i < d; i++) { - px += dx; - py += dy; - if (image.get(MathUtils.round(px), MathUtils.round(py)) != colorModel) { - error++; - } - } - - float errRatio = error / d; - - if (errRatio > 0.1f && errRatio < 0.9f) { - return 0; - } - - return (errRatio <= 0.1f) == colorModel ? 1 : -1; - } - - /** - * Gets the coordinate of the first point with a different color in the given direction - */ - private Point getFirstDifferent(Point init, boolean color, int dx, int dy) { - int x = init.getX() + dx; - int y = init.getY() + dy; - - while (isValid(x, y) && image.get(x, y) == color) { - x += dx; - y += dy; - } - - x -= dx; - y -= dy; - - while (isValid(x, y) && image.get(x, y) == color) { - x += dx; - } - x -= dx; - - while (isValid(x, y) && image.get(x, y) == color) { - y += dy; - } - y -= dy; - - return new Point(x, y); - } - - /** - * Expand the square represented by the corner points by pushing out equally in all directions - * - * @param cornerPoints the corners of the square, which has the bull's eye at its center - * @param oldSide the original length of the side of the square in the target bit matrix - * @param newSide the new length of the size of the square in the target bit matrix - * @return the corners of the expanded square - */ - private static ResultPoint[] expandSquare(ResultPoint[] cornerPoints, float oldSide, float newSide) { - float ratio = newSide / (2 * oldSide); - float dx = cornerPoints[0].getX() - cornerPoints[2].getX(); - float dy = cornerPoints[0].getY() - cornerPoints[2].getY(); - float centerx = (cornerPoints[0].getX() + cornerPoints[2].getX()) / 2.0f; - float centery = (cornerPoints[0].getY() + cornerPoints[2].getY()) / 2.0f; - - ResultPoint result0 = new ResultPoint(centerx + ratio * dx, centery + ratio * dy); - ResultPoint result2 = new ResultPoint(centerx - ratio * dx, centery - ratio * dy); - - dx = cornerPoints[1].getX() - cornerPoints[3].getX(); - dy = cornerPoints[1].getY() - cornerPoints[3].getY(); - centerx = (cornerPoints[1].getX() + cornerPoints[3].getX()) / 2.0f; - centery = (cornerPoints[1].getY() + cornerPoints[3].getY()) / 2.0f; - ResultPoint result1 = new ResultPoint(centerx + ratio * dx, centery + ratio * dy); - ResultPoint result3 = new ResultPoint(centerx - ratio * dx, centery - ratio * dy); - - return new ResultPoint[]{result0, result1, result2, result3}; - } - - private boolean isValid(int x, int y) { - return x >= 0 && x < image.getWidth() && y > 0 && y < image.getHeight(); - } - - private boolean isValid(ResultPoint point) { - int x = MathUtils.round(point.getX()); - int y = MathUtils.round(point.getY()); - return isValid(x, y); - } - - private static float distance(Point a, Point b) { - return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); - } - - private static float distance(ResultPoint a, ResultPoint b) { - return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); - } - - private int getDimension() { - if (compact) { - return 4 * nbLayers + 11; - } - if (nbLayers <= 4) { - return 4 * nbLayers + 15; - } - return 4 * nbLayers + 2 * ((nbLayers - 4) / 8 + 1) + 15; - } - - static final class Point { - private final int x; - private final int y; - - ResultPoint toResultPoint() { - return new ResultPoint(getX(), getY()); - } - - Point(int x, int y) { - this.x = x; - this.y = y; - } - - int getX() { - return x; - } - - int getY() { - return y; - } - - @Override - public String toString() { - return "<" + x + ' ' + y + '>'; - } - } -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/AztecCode.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/AztecCode.java deleted file mode 100644 index e813b6b..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/AztecCode.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitMatrix; - -/** - * Aztec 2D code representation - * - * @author Rustam Abdullaev - */ -public final class AztecCode { - - private boolean compact; - private int size; - private int layers; - private int codeWords; - private BitMatrix matrix; - - /** - * @return {@code true} if compact instead of full mode - */ - public boolean isCompact() { - return compact; - } - - public void setCompact(boolean compact) { - this.compact = compact; - } - - /** - * @return size in pixels (width and height) - */ - public int getSize() { - return size; - } - - public void setSize(int size) { - this.size = size; - } - - /** - * @return number of levels - */ - public int getLayers() { - return layers; - } - - public void setLayers(int layers) { - this.layers = layers; - } - - /** - * @return number of data codewords - */ - public int getCodeWords() { - return codeWords; - } - - public void setCodeWords(int codeWords) { - this.codeWords = codeWords; - } - - /** - * @return the symbol image - */ - public BitMatrix getMatrix() { - return matrix; - } - - public void setMatrix(BitMatrix matrix) { - this.matrix = matrix; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/BinaryShiftToken.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/BinaryShiftToken.java deleted file mode 100644 index 637ba63..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/BinaryShiftToken.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitArray; - -final class BinaryShiftToken extends Token { - - private final short binaryShiftStart; - private final short binaryShiftByteCount; - - BinaryShiftToken(Token previous, - int binaryShiftStart, - int binaryShiftByteCount) { - super(previous); - this.binaryShiftStart = (short) binaryShiftStart; - this.binaryShiftByteCount = (short) binaryShiftByteCount; - } - - @Override - public void appendTo(BitArray bitArray, byte[] text) { - for (int i = 0; i < binaryShiftByteCount; i++) { - if (i == 0 || (i == 31 && binaryShiftByteCount <= 62)) { - // We need a header before the first character, and before - // character 31 when the total byte code is <= 62 - bitArray.appendBits(31, 5); // BINARY_SHIFT - if (binaryShiftByteCount > 62) { - bitArray.appendBits(binaryShiftByteCount - 31, 16); - } else if (i == 0) { - // 1 <= binaryShiftByteCode <= 62 - bitArray.appendBits(Math.min(binaryShiftByteCount, 31), 5); - } else { - // 32 <= binaryShiftCount <= 62 and i == 31 - bitArray.appendBits(binaryShiftByteCount - 31, 5); - } - } - bitArray.appendBits(text[binaryShiftStart + i], 8); - } - } - - @Override - public String toString() { - return "<" + binaryShiftStart + "::" + (binaryShiftStart + binaryShiftByteCount - 1) + '>'; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/Encoder.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/Encoder.java deleted file mode 100644 index 518daec..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/Encoder.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitArray; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonEncoder; - -/** - * Generates Aztec 2D barcodes. - * - * @author Rustam Abdullaev - */ -public final class Encoder { - - public static final int DEFAULT_EC_PERCENT = 33; // default minimal percentage of error check words - public static final int DEFAULT_AZTEC_LAYERS = 0; - private static final int MAX_NB_BITS = 32; - private static final int MAX_NB_BITS_COMPACT = 4; - - private static final int[] WORD_SIZE = { - 4, 6, 6, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 - }; - - private Encoder() { - } - - /** - * Encodes the given binary content as an Aztec symbol - * - * @param data input data string - * @return Aztec symbol matrix with metadata - */ - public static AztecCode encode(byte[] data) { - return encode(data, DEFAULT_EC_PERCENT, DEFAULT_AZTEC_LAYERS); - } - - /** - * Encodes the given binary content as an Aztec symbol - * - * @param data input data string - * @param minECCPercent minimal percentage of error check words (According to ISO/IEC 24778:2008, - * a minimum of 23% + 3 words is recommended) - * @param userSpecifiedLayers if non-zero, a user-specified value for the number of layers - * @return Aztec symbol matrix with metadata - */ - public static AztecCode encode(byte[] data, int minECCPercent, int userSpecifiedLayers) { - // High-level encode - BitArray bits = new HighLevelEncoder(data).encode(); - - // stuff bits and choose symbol size - int eccBits = bits.getSize() * minECCPercent / 100 + 11; - int totalSizeBits = bits.getSize() + eccBits; - boolean compact; - int layers; - int totalBitsInLayer; - int wordSize; - BitArray stuffedBits; - if (userSpecifiedLayers != DEFAULT_AZTEC_LAYERS) { - compact = userSpecifiedLayers < 0; - layers = Math.abs(userSpecifiedLayers); - if (layers > (compact ? MAX_NB_BITS_COMPACT : MAX_NB_BITS)) { - throw new IllegalArgumentException( - String.format("Illegal value %s for layers", userSpecifiedLayers)); - } - totalBitsInLayer = totalBitsInLayer(layers, compact); - wordSize = WORD_SIZE[layers]; - int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); - stuffedBits = stuffBits(bits, wordSize); - if (stuffedBits.getSize() + eccBits > usableBitsInLayers) { - throw new IllegalArgumentException("Data to large for user specified layer"); - } - if (compact && stuffedBits.getSize() > wordSize * 64) { - // Compact format only allows 64 data words, though C4 can hold more words than that - throw new IllegalArgumentException("Data to large for user specified layer"); - } - } else { - wordSize = 0; - stuffedBits = null; - // We look at the possible table sizes in the order Compact1, Compact2, Compact3, - // Compact4, Normal4,... Normal(i) for i < 4 isn't typically used since Compact(i+1) - // is the same size, but has more data. - for (int i = 0; ; i++) { - if (i > MAX_NB_BITS) { - throw new IllegalArgumentException("Data too large for an Aztec code"); - } - compact = i <= 3; - layers = compact ? i + 1 : i; - totalBitsInLayer = totalBitsInLayer(layers, compact); - if (totalSizeBits > totalBitsInLayer) { - continue; - } - // [Re]stuff the bits if this is the first opportunity, or if the - // wordSize has changed - if (wordSize != WORD_SIZE[layers]) { - wordSize = WORD_SIZE[layers]; - stuffedBits = stuffBits(bits, wordSize); - } - int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); - if (compact && stuffedBits.getSize() > wordSize * 64) { - // Compact format only allows 64 data words, though C4 can hold more words than that - continue; - } - if (stuffedBits.getSize() + eccBits <= usableBitsInLayers) { - break; - } - } - } - BitArray messageBits = generateCheckWords(stuffedBits, totalBitsInLayer, wordSize); - - // generate mode message - int messageSizeInWords = stuffedBits.getSize() / wordSize; - BitArray modeMessage = generateModeMessage(compact, layers, messageSizeInWords); - - // allocate symbol - int baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines - int[] alignmentMap = new int[baseMatrixSize]; - int matrixSize; - if (compact) { - // no alignment marks in compact mode, alignmentMap is a no-op - matrixSize = baseMatrixSize; - for (int i = 0; i < alignmentMap.length; i++) { - alignmentMap[i] = i; - } - } else { - matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); - int origCenter = baseMatrixSize / 2; - int center = matrixSize / 2; - for (int i = 0; i < origCenter; i++) { - int newOffset = i + i / 15; - alignmentMap[origCenter - i - 1] = center - newOffset - 1; - alignmentMap[origCenter + i] = center + newOffset + 1; - } - } - BitMatrix matrix = new BitMatrix(matrixSize); - - // draw data bits - for (int i = 0, rowOffset = 0; i < layers; i++) { - int rowSize = (layers - i) * 4 + (compact ? 9 : 12); - for (int j = 0; j < rowSize; j++) { - int columnOffset = j * 2; - for (int k = 0; k < 2; k++) { - if (messageBits.get(rowOffset + columnOffset + k)) { - matrix.set(alignmentMap[i * 2 + k], alignmentMap[i * 2 + j]); - } - if (messageBits.get(rowOffset + rowSize * 2 + columnOffset + k)) { - matrix.set(alignmentMap[i * 2 + j], alignmentMap[baseMatrixSize - 1 - i * 2 - k]); - } - if (messageBits.get(rowOffset + rowSize * 4 + columnOffset + k)) { - matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - k], alignmentMap[baseMatrixSize - 1 - i * 2 - j]); - } - if (messageBits.get(rowOffset + rowSize * 6 + columnOffset + k)) { - matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - j], alignmentMap[i * 2 + k]); - } - } - } - rowOffset += rowSize * 8; - } - - // draw mode message - drawModeMessage(matrix, compact, matrixSize, modeMessage); - - // draw alignment marks - if (compact) { - drawBullsEye(matrix, matrixSize / 2, 5); - } else { - drawBullsEye(matrix, matrixSize / 2, 7); - for (int i = 0, j = 0; i < baseMatrixSize / 2 - 1; i += 15, j += 16) { - for (int k = (matrixSize / 2) & 1; k < matrixSize; k += 2) { - matrix.set(matrixSize / 2 - j, k); - matrix.set(matrixSize / 2 + j, k); - matrix.set(k, matrixSize / 2 - j); - matrix.set(k, matrixSize / 2 + j); - } - } - } - - AztecCode aztec = new AztecCode(); - aztec.setCompact(compact); - aztec.setSize(matrixSize); - aztec.setLayers(layers); - aztec.setCodeWords(messageSizeInWords); - aztec.setMatrix(matrix); - return aztec; - } - - private static void drawBullsEye(BitMatrix matrix, int center, int size) { - for (int i = 0; i < size; i += 2) { - for (int j = center - i; j <= center + i; j++) { - matrix.set(j, center - i); - matrix.set(j, center + i); - matrix.set(center - i, j); - matrix.set(center + i, j); - } - } - matrix.set(center - size, center - size); - matrix.set(center - size + 1, center - size); - matrix.set(center - size, center - size + 1); - matrix.set(center + size, center - size); - matrix.set(center + size, center - size + 1); - matrix.set(center + size, center + size - 1); - } - - static BitArray generateModeMessage(boolean compact, int layers, int messageSizeInWords) { - BitArray modeMessage = new BitArray(); - if (compact) { - modeMessage.appendBits(layers - 1, 2); - modeMessage.appendBits(messageSizeInWords - 1, 6); - modeMessage = generateCheckWords(modeMessage, 28, 4); - } else { - modeMessage.appendBits(layers - 1, 5); - modeMessage.appendBits(messageSizeInWords - 1, 11); - modeMessage = generateCheckWords(modeMessage, 40, 4); - } - return modeMessage; - } - - private static void drawModeMessage(BitMatrix matrix, boolean compact, int matrixSize, BitArray modeMessage) { - int center = matrixSize / 2; - if (compact) { - for (int i = 0; i < 7; i++) { - int offset = center - 3 + i; - if (modeMessage.get(i)) { - matrix.set(offset, center - 5); - } - if (modeMessage.get(i + 7)) { - matrix.set(center + 5, offset); - } - if (modeMessage.get(20 - i)) { - matrix.set(offset, center + 5); - } - if (modeMessage.get(27 - i)) { - matrix.set(center - 5, offset); - } - } - } else { - for (int i = 0; i < 10; i++) { - int offset = center - 5 + i + i / 5; - if (modeMessage.get(i)) { - matrix.set(offset, center - 7); - } - if (modeMessage.get(i + 10)) { - matrix.set(center + 7, offset); - } - if (modeMessage.get(29 - i)) { - matrix.set(offset, center + 7); - } - if (modeMessage.get(39 - i)) { - matrix.set(center - 7, offset); - } - } - } - } - - private static BitArray generateCheckWords(BitArray bitArray, int totalBits, int wordSize) { - // bitArray is guaranteed to be a multiple of the wordSize, so no padding needed - int messageSizeInWords = bitArray.getSize() / wordSize; - ReedSolomonEncoder rs = new ReedSolomonEncoder(getGF(wordSize)); - int totalWords = totalBits / wordSize; - int[] messageWords = bitsToWords(bitArray, wordSize, totalWords); - rs.encode(messageWords, totalWords - messageSizeInWords); - int startPad = totalBits % wordSize; - BitArray messageBits = new BitArray(); - messageBits.appendBits(0, startPad); - for (int messageWord : messageWords) { - messageBits.appendBits(messageWord, wordSize); - } - return messageBits; - } - - private static int[] bitsToWords(BitArray stuffedBits, int wordSize, int totalWords) { - int[] message = new int[totalWords]; - int i; - int n; - for (i = 0, n = stuffedBits.getSize() / wordSize; i < n; i++) { - int value = 0; - for (int j = 0; j < wordSize; j++) { - value |= stuffedBits.get(i * wordSize + j) ? (1 << wordSize - j - 1) : 0; - } - message[i] = value; - } - return message; - } - - private static GenericGF getGF(int wordSize) { - switch (wordSize) { - case 4: - return GenericGF.AZTEC_PARAM; - case 6: - return GenericGF.AZTEC_DATA_6; - case 8: - return GenericGF.AZTEC_DATA_8; - case 10: - return GenericGF.AZTEC_DATA_10; - case 12: - return GenericGF.AZTEC_DATA_12; - default: - throw new IllegalArgumentException("Unsupported word size " + wordSize); - } - } - - static BitArray stuffBits(BitArray bits, int wordSize) { - BitArray out = new BitArray(); - - int n = bits.getSize(); - int mask = (1 << wordSize) - 2; - for (int i = 0; i < n; i += wordSize) { - int word = 0; - for (int j = 0; j < wordSize; j++) { - if (i + j >= n || bits.get(i + j)) { - word |= 1 << (wordSize - 1 - j); - } - } - if ((word & mask) == mask) { - out.appendBits(word & mask, wordSize); - i--; - } else if ((word & mask) == 0) { - out.appendBits(word | 1, wordSize); - i--; - } else { - out.appendBits(word, wordSize); - } - } - return out; - } - - private static int totalBitsInLayer(int layers, boolean compact) { - return ((compact ? 88 : 112) + 16 * layers) * layers; - } -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java deleted file mode 100644 index bd867e3..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -/** - * This produces nearly optimal encodings of text into the first-level of - * encoding used by Aztec code. - * - * It uses a dynamic algorithm. For each prefix of the string, it determines - * a set of encodings that could lead to this prefix. We repeatedly add a - * character and generate a new set of optimal encodings until we have read - * through the entire input. - * - * @author Frank Yellin - * @author Rustam Abdullaev - */ -public final class HighLevelEncoder { - - static final String[] MODE_NAMES = {"UPPER", "LOWER", "DIGIT", "MIXED", "PUNCT"}; - - static final int MODE_UPPER = 0; // 5 bits - static final int MODE_LOWER = 1; // 5 bits - static final int MODE_DIGIT = 2; // 4 bits - static final int MODE_MIXED = 3; // 5 bits - static final int MODE_PUNCT = 4; // 5 bits - - // The Latch Table shows, for each pair of Modes, the optimal method for - // getting from one mode to another. In the worst possible case, this can - // be up to 14 bits. In the best possible case, we are already there! - // The high half-word of each entry gives the number of bits. - // The low half-word of each entry are the actual bits necessary to change - static final int[][] LATCH_TABLE = { - { - 0, - (5 << 16) + 28, // UPPER -> LOWER - (5 << 16) + 30, // UPPER -> DIGIT - (5 << 16) + 29, // UPPER -> MIXED - (10 << 16) + (29 << 5) + 30, // UPPER -> MIXED -> PUNCT - }, - { - (9 << 16) + (30 << 4) + 14, // LOWER -> DIGIT -> UPPER - 0, - (5 << 16) + 30, // LOWER -> DIGIT - (5 << 16) + 29, // LOWER -> MIXED - (10 << 16) + (29 << 5) + 30, // LOWER -> MIXED -> PUNCT - }, - { - (4 << 16) + 14, // DIGIT -> UPPER - (9 << 16) + (14 << 5) + 28, // DIGIT -> UPPER -> LOWER - 0, - (9 << 16) + (14 << 5) + 29, // DIGIT -> UPPER -> MIXED - (14 << 16) + (14 << 10) + (29 << 5) + 30, - // DIGIT -> UPPER -> MIXED -> PUNCT - }, - { - (5 << 16) + 29, // MIXED -> UPPER - (5 << 16) + 28, // MIXED -> LOWER - (10 << 16) + (29 << 5) + 30, // MIXED -> UPPER -> DIGIT - 0, - (5 << 16) + 30, // MIXED -> PUNCT - }, - { - (5 << 16) + 31, // PUNCT -> UPPER - (10 << 16) + (31 << 5) + 28, // PUNCT -> UPPER -> LOWER - (10 << 16) + (31 << 5) + 30, // PUNCT -> UPPER -> DIGIT - (10 << 16) + (31 << 5) + 29, // PUNCT -> UPPER -> MIXED - 0, - }, - }; - - // A reverse mapping from [mode][char] to the encoding for that character - // in that mode. An entry of 0 indicates no mapping exists. - private static final int[][] CHAR_MAP = new int[5][256]; - static { - CHAR_MAP[MODE_UPPER][' '] = 1; - for (int c = 'A'; c <= 'Z'; c++) { - CHAR_MAP[MODE_UPPER][c] = c - 'A' + 2; - } - CHAR_MAP[MODE_LOWER][' '] = 1; - for (int c = 'a'; c <= 'z'; c++) { - CHAR_MAP[MODE_LOWER][c] = c - 'a' + 2; - } - CHAR_MAP[MODE_DIGIT][' '] = 1; - for (int c = '0'; c <= '9'; c++) { - CHAR_MAP[MODE_DIGIT][c] = c - '0' + 2; - } - CHAR_MAP[MODE_DIGIT][','] = 12; - CHAR_MAP[MODE_DIGIT]['.'] = 13; - int[] mixedTable = { - '\0', ' ', '\1', '\2', '\3', '\4', '\5', '\6', '\7', '\b', '\t', '\n', - '\13', '\f', '\r', '\33', '\34', '\35', '\36', '\37', '@', '\\', '^', - '_', '`', '|', '~', '\177' - }; - for (int i = 0; i < mixedTable.length; i++) { - CHAR_MAP[MODE_MIXED][mixedTable[i]] = i; - } - int[] punctTable = { - '\0', '\r', '\0', '\0', '\0', '\0', '!', '\'', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', - '[', ']', '{', '}' - }; - for (int i = 0; i < punctTable.length; i++) { - if (punctTable[i] > 0) { - CHAR_MAP[MODE_PUNCT][punctTable[i]] = i; - } - } - } - - // A map showing the available shift codes. (The shifts to BINARY are not - // shown - static final int[][] SHIFT_TABLE = new int[6][6]; // mode shift codes, per table - static { - for (int[] table : SHIFT_TABLE) { - Arrays.fill(table, -1); - } - SHIFT_TABLE[MODE_UPPER][MODE_PUNCT] = 0; - - SHIFT_TABLE[MODE_LOWER][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_LOWER][MODE_UPPER] = 28; - - SHIFT_TABLE[MODE_MIXED][MODE_PUNCT] = 0; - - SHIFT_TABLE[MODE_DIGIT][MODE_PUNCT] = 0; - SHIFT_TABLE[MODE_DIGIT][MODE_UPPER] = 15; - } - - private final byte[] text; - - public HighLevelEncoder(byte[] text) { - this.text = text; - } - - /** - * @return text represented by this encoder encoded as a {@link BitArray} - */ - public BitArray encode() { - Collection states = Collections.singletonList(State.INITIAL_STATE); - for (int index = 0; index < text.length; index++) { - int pairCode; - int nextChar = index + 1 < text.length ? text[index + 1] : 0; - switch (text[index]) { - case '\r': - pairCode = nextChar == '\n' ? 2 : 0; - break; - case '.' : - pairCode = nextChar == ' ' ? 3 : 0; - break; - case ',' : - pairCode = nextChar == ' ' ? 4 : 0; - break; - case ':' : - pairCode = nextChar == ' ' ? 5 : 0; - break; - default: - pairCode = 0; - } - if (pairCode > 0) { - // We have one of the four special PUNCT pairs. Treat them specially. - // Get a new set of states for the two new characters. - states = updateStateListForPair(states, index, pairCode); - index++; - } else { - // Get a new set of states for the new character. - states = updateStateListForChar(states, index); - } - } - // We are left with a set of states. Find the shortest one. - State minState = Collections.min(states, new Comparator() { - @Override - public int compare(State a, State b) { - return a.getBitCount() - b.getBitCount(); - } - }); - // Convert it to a bit array, and return. - return minState.toBitArray(text); - } - - // We update a set of states for a new character by updating each state - // for the new character, merging the results, and then removing the - // non-optimal states. - private Collection updateStateListForChar(Iterable states, int index) { - Collection result = new LinkedList<>(); - for (State state : states) { - updateStateForChar(state, index, result); - } - return simplifyStates(result); - } - - // Return a set of states that represent the possible ways of updating this - // state for the next character. The resulting set of states are added to - // the "result" list. - private void updateStateForChar(State state, int index, Collection result) { - char ch = (char) (text[index] & 0xFF); - boolean charInCurrentTable = CHAR_MAP[state.getMode()][ch] > 0; - State stateNoBinary = null; - for (int mode = 0; mode <= MODE_PUNCT; mode++) { - int charInMode = CHAR_MAP[mode][ch]; - if (charInMode > 0) { - if (stateNoBinary == null) { - // Only create stateNoBinary the first time it's required. - stateNoBinary = state.endBinaryShift(index); - } - // Try generating the character by latching to its mode - if (!charInCurrentTable || mode == state.getMode() || mode == MODE_DIGIT) { - // If the character is in the current table, we don't want to latch to - // any other mode except possibly digit (which uses only 4 bits). Any - // other latch would be equally successful *after* this character, and - // so wouldn't save any bits. - State latchState = stateNoBinary.latchAndAppend(mode, charInMode); - result.add(latchState); - } - // Try generating the character by switching to its mode. - if (!charInCurrentTable && SHIFT_TABLE[state.getMode()][mode] >= 0) { - // It never makes sense to temporarily shift to another mode if the - // character exists in the current mode. That can never save bits. - State shiftState = stateNoBinary.shiftAndAppend(mode, charInMode); - result.add(shiftState); - } - } - } - if (state.getBinaryShiftByteCount() > 0 || CHAR_MAP[state.getMode()][ch] == 0) { - // It's never worthwhile to go into binary shift mode if you're not already - // in binary shift mode, and the character exists in your current mode. - // That can never save bits over just outputting the char in the current mode. - State binaryState = state.addBinaryShiftChar(index); - result.add(binaryState); - } - } - - private static Collection updateStateListForPair(Iterable states, int index, int pairCode) { - Collection result = new LinkedList<>(); - for (State state : states) { - updateStateForPair(state, index, pairCode, result); - } - return simplifyStates(result); - } - - private static void updateStateForPair(State state, int index, int pairCode, Collection result) { - State stateNoBinary = state.endBinaryShift(index); - // Possibility 1. Latch to MODE_PUNCT, and then append this code - result.add(stateNoBinary.latchAndAppend(MODE_PUNCT, pairCode)); - if (state.getMode() != MODE_PUNCT) { - // Possibility 2. Shift to MODE_PUNCT, and then append this code. - // Every state except MODE_PUNCT (handled above) can shift - result.add(stateNoBinary.shiftAndAppend(MODE_PUNCT, pairCode)); - } - if (pairCode == 3 || pairCode == 4) { - // both characters are in DIGITS. Sometimes better to just add two digits - State digitState = stateNoBinary - .latchAndAppend(MODE_DIGIT, 16 - pairCode) // period or comma in DIGIT - .latchAndAppend(MODE_DIGIT, 1); // space in DIGIT - result.add(digitState); - } - if (state.getBinaryShiftByteCount() > 0) { - // It only makes sense to do the characters as binary if we're already - // in binary mode. - State binaryState = state.addBinaryShiftChar(index).addBinaryShiftChar(index + 1); - result.add(binaryState); - } - } - - private static Collection simplifyStates(Iterable states) { - List result = new LinkedList<>(); - for (State newState : states) { - boolean add = true; - for (Iterator iterator = result.iterator(); iterator.hasNext();) { - State oldState = iterator.next(); - if (oldState.isBetterThanOrEqualTo(newState)) { - add = false; - break; - } - if (newState.isBetterThanOrEqualTo(oldState)) { - iterator.remove(); - } - } - if (add) { - result.add(newState); - } - } - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/SimpleToken.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/SimpleToken.java deleted file mode 100644 index 047d962..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/SimpleToken.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitArray; - -final class SimpleToken extends Token { - - // For normal words, indicates value and bitCount - private final short value; - private final short bitCount; - - SimpleToken(Token previous, int value, int bitCount) { - super(previous); - this.value = (short) value; - this.bitCount = (short) bitCount; - } - - @Override - void appendTo(BitArray bitArray, byte[] text) { - bitArray.appendBits(value, bitCount); - } - - @Override - public String toString() { - int value = this.value & ((1 << bitCount) - 1); - value |= 1 << bitCount; - return '<' + Integer.toBinaryString(value | (1 << bitCount)).substring(1) + '>'; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/State.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/State.java deleted file mode 100644 index 927da63..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/State.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import java.util.Deque; -import java.util.LinkedList; - -import com.google.zxing.common.BitArray; - -/** - * State represents all information about a sequence necessary to generate the current output. - * Note that a state is immutable. - */ -final class State { - - static final State INITIAL_STATE = new State(Token.EMPTY, HighLevelEncoder.MODE_UPPER, 0, 0); - - // The current mode of the encoding (or the mode to which we'll return if - // we're in Binary Shift mode. - private final int mode; - // The list of tokens that we output. If we are in Binary Shift mode, this - // token list does *not* yet included the token for those bytes - private final Token token; - // If non-zero, the number of most recent bytes that should be output - // in Binary Shift mode. - private final int binaryShiftByteCount; - // The total number of bits generated (including Binary Shift). - private final int bitCount; - - private State(Token token, int mode, int binaryBytes, int bitCount) { - this.token = token; - this.mode = mode; - this.binaryShiftByteCount = binaryBytes; - this.bitCount = bitCount; - // Make sure we match the token - //int binaryShiftBitCount = (binaryShiftByteCount * 8) + - // (binaryShiftByteCount == 0 ? 0 : - // binaryShiftByteCount <= 31 ? 10 : - // binaryShiftByteCount <= 62 ? 20 : 21); - //assert this.bitCount == token.getTotalBitCount() + binaryShiftBitCount; - } - - int getMode() { - return mode; - } - - Token getToken() { - return token; - } - - int getBinaryShiftByteCount() { - return binaryShiftByteCount; - } - - int getBitCount() { - return bitCount; - } - - // Create a new state representing this state with a latch to a (not - // necessary different) mode, and then a code. - State latchAndAppend(int mode, int value) { - //assert binaryShiftByteCount == 0; - int bitCount = this.bitCount; - Token token = this.token; - if (mode != this.mode) { - int latch = HighLevelEncoder.LATCH_TABLE[this.mode][mode]; - token = token.add(latch & 0xFFFF, latch >> 16); - bitCount += latch >> 16; - } - int latchModeBitCount = mode == HighLevelEncoder.MODE_DIGIT ? 4 : 5; - token = token.add(value, latchModeBitCount); - return new State(token, mode, 0, bitCount + latchModeBitCount); - } - - // Create a new state representing this state, with a temporary shift - // to a different mode to output a single value. - State shiftAndAppend(int mode, int value) { - //assert binaryShiftByteCount == 0 && this.mode != mode; - Token token = this.token; - int thisModeBitCount = this.mode == HighLevelEncoder.MODE_DIGIT ? 4 : 5; - // Shifts exist only to UPPER and PUNCT, both with tokens size 5. - token = token.add(HighLevelEncoder.SHIFT_TABLE[this.mode][mode], thisModeBitCount); - token = token.add(value, 5); - return new State(token, this.mode, 0, this.bitCount + thisModeBitCount + 5); - } - - // Create a new state representing this state, but an additional character - // output in Binary Shift mode. - State addBinaryShiftChar(int index) { - Token token = this.token; - int mode = this.mode; - int bitCount = this.bitCount; - if (this.mode == HighLevelEncoder.MODE_PUNCT || this.mode == HighLevelEncoder.MODE_DIGIT) { - //assert binaryShiftByteCount == 0; - int latch = HighLevelEncoder.LATCH_TABLE[mode][HighLevelEncoder.MODE_UPPER]; - token = token.add(latch & 0xFFFF, latch >> 16); - bitCount += latch >> 16; - mode = HighLevelEncoder.MODE_UPPER; - } - int deltaBitCount = - (binaryShiftByteCount == 0 || binaryShiftByteCount == 31) ? 18 : - (binaryShiftByteCount == 62) ? 9 : 8; - State result = new State(token, mode, binaryShiftByteCount + 1, bitCount + deltaBitCount); - if (result.binaryShiftByteCount == 2047 + 31) { - // The string is as long as it's allowed to be. We should end it. - result = result.endBinaryShift(index + 1); - } - return result; - } - - // Create the state identical to this one, but we are no longer in - // Binary Shift mode. - State endBinaryShift(int index) { - if (binaryShiftByteCount == 0) { - return this; - } - Token token = this.token; - token = token.addBinaryShift(index - binaryShiftByteCount, binaryShiftByteCount); - //assert token.getTotalBitCount() == this.bitCount; - return new State(token, mode, 0, this.bitCount); - } - - // Returns true if "this" state is better (or equal) to be in than "that" - // state under all possible circumstances. - boolean isBetterThanOrEqualTo(State other) { - int mySize = this.bitCount + (HighLevelEncoder.LATCH_TABLE[this.mode][other.mode] >> 16); - if (other.binaryShiftByteCount > 0 && - (this.binaryShiftByteCount == 0 || this.binaryShiftByteCount > other.binaryShiftByteCount)) { - mySize += 10; // Cost of entering Binary Shift mode. - } - return mySize <= other.bitCount; - } - - BitArray toBitArray(byte[] text) { - // Reverse the tokens, so that they are in the order that they should - // be output - Deque symbols = new LinkedList<>(); - for (Token token = endBinaryShift(text.length).token; token != null; token = token.getPrevious()) { - symbols.addFirst(token); - } - BitArray bitArray = new BitArray(); - // Add each token to the result. - for (Token symbol : symbols) { - symbol.appendTo(bitArray, text); - } - //assert bitArray.getSize() == this.bitCount; - return bitArray; - } - - @Override - public String toString() { - return String.format("%s bits=%d bytes=%d", HighLevelEncoder.MODE_NAMES[mode], bitCount, binaryShiftByteCount); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/aztec/encoder/Token.java b/zxing/src/main/java/com/google/zxing/aztec/encoder/Token.java deleted file mode 100644 index 62d336e..0000000 --- a/zxing/src/main/java/com/google/zxing/aztec/encoder/Token.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.aztec.encoder; - -import com.google.zxing.common.BitArray; - -abstract class Token { - - static final Token EMPTY = new SimpleToken(null, 0, 0); - - private final Token previous; - - Token(Token previous) { - this.previous = previous; - } - - final Token getPrevious() { - return previous; - } - - final Token add(int value, int bitCount) { - return new SimpleToken(this, value, bitCount); - } - - final Token addBinaryShift(int start, int byteCount) { - //int bitCount = (byteCount * 8) + (byteCount <= 31 ? 10 : byteCount <= 62 ? 20 : 21); - return new BinaryShiftToken(this, start, byteCount); - } - - abstract void appendTo(BitArray bitArray, byte[] text); - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/AbstractDoCoMoResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/AbstractDoCoMoResultParser.java deleted file mode 100644 index 3d2c1d2..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/AbstractDoCoMoResultParser.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - *
    - * - *

    Thanks to Jeff Griffin for proposing rewrite of these classes that relies less - * on exception-based mechanisms during parsing.

    - * - * @author Sean Owen - */ -abstract class AbstractDoCoMoResultParser extends ResultParser { - - static String[] matchDoCoMoPrefixedField(String prefix, String rawText, boolean trim) { - return matchPrefixedField(prefix, rawText, ';', trim); - } - - static String matchSingleDoCoMoPrefixedField(String prefix, String rawText, boolean trim) { - return matchSinglePrefixedField(prefix, rawText, ';', trim); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java deleted file mode 100644 index cf7f96e..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.ArrayList; -import java.util.List; - -/** - * Implements KDDI AU's address book format. See - * - * http://www.au.kddi.com/ezfactory/tec/two_dimensions/index.html. - * (Thanks to Yuzo for translating!) - * - * @author Sean Owen - */ -public final class AddressBookAUResultParser extends ResultParser { - - @Override - public AddressBookParsedResult parse(Result result) { - String rawText = getMassagedText(result); - // MEMORY is mandatory; seems like a decent indicator, as does end-of-record separator CR/LF - if (!rawText.contains("MEMORY") || !rawText.contains("\r\n")) { - return null; - } - - // NAME1 and NAME2 have specific uses, namely written name and pronunciation, respectively. - // Therefore we treat them specially instead of as an array of names. - String name = matchSinglePrefixedField("NAME1:", rawText, '\r', true); - String pronunciation = matchSinglePrefixedField("NAME2:", rawText, '\r', true); - - String[] phoneNumbers = matchMultipleValuePrefix("TEL", 3, rawText, true); - String[] emails = matchMultipleValuePrefix("MAIL", 3, rawText, true); - String note = matchSinglePrefixedField("MEMORY:", rawText, '\r', false); - String address = matchSinglePrefixedField("ADD:", rawText, '\r', true); - String[] addresses = address == null ? null : new String[] {address}; - return new AddressBookParsedResult(maybeWrap(name), - null, - pronunciation, - phoneNumbers, - null, - emails, - null, - null, - note, - addresses, - null, - null, - null, - null, - null, - null); - } - - private static String[] matchMultipleValuePrefix(String prefix, - int max, - String rawText, - boolean trim) { - List values = null; - for (int i = 1; i <= max; i++) { - String value = matchSinglePrefixedField(prefix + i + ':', rawText, '\r', trim); - if (value == null) { - break; - } - if (values == null) { - values = new ArrayList<>(max); // lazy init - } - values.add(value); - } - if (values == null) { - return null; - } - return values.toArray(new String[values.size()]); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java deleted file mode 100644 index cb2e19b..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - * Implements the "MECARD" address book entry format. - * - * Supported keys: N, SOUND, TEL, EMAIL, NOTE, ADR, BDAY, URL, plus ORG - * Unsupported keys: TEL-AV, NICKNAME - * - * Except for TEL, multiple values for keys are also not supported; - * the first one found takes precedence. - * - * Our understanding of the MECARD format is based on this document: - * - * http://www.mobicode.org.tw/files/OMIA%20Mobile%20Bar%20Code%20Standard%20v3.2.1.doc - * - * @author Sean Owen - */ -public final class AddressBookDoCoMoResultParser extends AbstractDoCoMoResultParser { - - @Override - public AddressBookParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("MECARD:")) { - return null; - } - String[] rawName = matchDoCoMoPrefixedField("N:", rawText, true); - if (rawName == null) { - return null; - } - String name = parseName(rawName[0]); - String pronunciation = matchSingleDoCoMoPrefixedField("SOUND:", rawText, true); - String[] phoneNumbers = matchDoCoMoPrefixedField("TEL:", rawText, true); - String[] emails = matchDoCoMoPrefixedField("EMAIL:", rawText, true); - String note = matchSingleDoCoMoPrefixedField("NOTE:", rawText, false); - String[] addresses = matchDoCoMoPrefixedField("ADR:", rawText, true); - String birthday = matchSingleDoCoMoPrefixedField("BDAY:", rawText, true); - if (!isStringOfDigits(birthday, 8)) { - // No reason to throw out the whole card because the birthday is formatted wrong. - birthday = null; - } - String[] urls = matchDoCoMoPrefixedField("URL:", rawText, true); - - // Although ORG may not be strictly legal in MECARD, it does exist in VCARD and we might as well - // honor it when found in the wild. - String org = matchSingleDoCoMoPrefixedField("ORG:", rawText, true); - - return new AddressBookParsedResult(maybeWrap(name), - null, - pronunciation, - phoneNumbers, - null, - emails, - null, - null, - note, - addresses, - null, - org, - birthday, - null, - urls, - null); - } - - private static String parseName(String name) { - int comma = name.indexOf((int) ','); - if (comma >= 0) { - // Format may be last,first; switch it around - return name.substring(comma + 1) + ' ' + name.substring(0, comma); - } - return name; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/AddressBookParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/AddressBookParsedResult.java deleted file mode 100644 index 51e009c..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/AddressBookParsedResult.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes contact information, like that in an address book - * entry. - * - * @author Sean Owen - */ -public final class AddressBookParsedResult extends ParsedResult { - - private final String[] names; - private final String[] nicknames; - private final String pronunciation; - private final String[] phoneNumbers; - private final String[] phoneTypes; - private final String[] emails; - private final String[] emailTypes; - private final String instantMessenger; - private final String note; - private final String[] addresses; - private final String[] addressTypes; - private final String org; - private final String birthday; - private final String title; - private final String[] urls; - private final String[] geo; - - public AddressBookParsedResult(String[] names, - String[] phoneNumbers, - String[] phoneTypes, - String[] emails, - String[] emailTypes, - String[] addresses, - String[] addressTypes) { - this(names, - null, - null, - phoneNumbers, - phoneTypes, - emails, - emailTypes, - null, - null, - addresses, - addressTypes, - null, - null, - null, - null, - null); - } - - public AddressBookParsedResult(String[] names, - String[] nicknames, - String pronunciation, - String[] phoneNumbers, - String[] phoneTypes, - String[] emails, - String[] emailTypes, - String instantMessenger, - String note, - String[] addresses, - String[] addressTypes, - String org, - String birthday, - String title, - String[] urls, - String[] geo) { - super(ParsedResultType.ADDRESSBOOK); - this.names = names; - this.nicknames = nicknames; - this.pronunciation = pronunciation; - this.phoneNumbers = phoneNumbers; - this.phoneTypes = phoneTypes; - this.emails = emails; - this.emailTypes = emailTypes; - this.instantMessenger = instantMessenger; - this.note = note; - this.addresses = addresses; - this.addressTypes = addressTypes; - this.org = org; - this.birthday = birthday; - this.title = title; - this.urls = urls; - this.geo = geo; - } - - public String[] getNames() { - return names; - } - - public String[] getNicknames() { - return nicknames; - } - - /** - * In Japanese, the name is written in kanji, which can have multiple readings. Therefore a hint - * is often provided, called furigana, which spells the name phonetically. - * - * @return The pronunciation of the getNames() field, often in hiragana or katakana. - */ - public String getPronunciation() { - return pronunciation; - } - - public String[] getPhoneNumbers() { - return phoneNumbers; - } - - /** - * @return optional descriptions of the type of each phone number. It could be like "HOME", but, - * there is no guaranteed or standard format. - */ - public String[] getPhoneTypes() { - return phoneTypes; - } - - public String[] getEmails() { - return emails; - } - - /** - * @return optional descriptions of the type of each e-mail. It could be like "WORK", but, - * there is no guaranteed or standard format. - */ - public String[] getEmailTypes() { - return emailTypes; - } - - public String getInstantMessenger() { - return instantMessenger; - } - - public String getNote() { - return note; - } - - public String[] getAddresses() { - return addresses; - } - - /** - * @return optional descriptions of the type of each e-mail. It could be like "WORK", but, - * there is no guaranteed or standard format. - */ - public String[] getAddressTypes() { - return addressTypes; - } - - public String getTitle() { - return title; - } - - public String getOrg() { - return org; - } - - public String[] getURLs() { - return urls; - } - - /** - * @return birthday formatted as yyyyMMdd (e.g. 19780917) - */ - public String getBirthday() { - return birthday; - } - - /** - * @return a location as a latitude/longitude pair - */ - public String[] getGeo() { - return geo; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(100); - maybeAppend(names, result); - maybeAppend(nicknames, result); - maybeAppend(pronunciation, result); - maybeAppend(title, result); - maybeAppend(org, result); - maybeAppend(addresses, result); - maybeAppend(phoneNumbers, result); - maybeAppend(emails, result); - maybeAppend(instantMessenger, result); - maybeAppend(urls, result); - maybeAppend(birthday, result); - maybeAppend(geo, result); - maybeAppend(note, result); - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/BizcardResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/BizcardResultParser.java deleted file mode 100644 index 1d588d4..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/BizcardResultParser.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.ArrayList; -import java.util.List; - -/** - * Implements the "BIZCARD" address book entry format, though this has been - * largely reverse-engineered from examples observed in the wild -- still - * looking for a definitive reference. - * - * @author Sean Owen - */ -public final class BizcardResultParser extends AbstractDoCoMoResultParser { - - // Yes, we extend AbstractDoCoMoResultParser since the format is very much - // like the DoCoMo MECARD format, but this is not technically one of - // DoCoMo's proposed formats - - @Override - public AddressBookParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("BIZCARD:")) { - return null; - } - String firstName = matchSingleDoCoMoPrefixedField("N:", rawText, true); - String lastName = matchSingleDoCoMoPrefixedField("X:", rawText, true); - String fullName = buildName(firstName, lastName); - String title = matchSingleDoCoMoPrefixedField("T:", rawText, true); - String org = matchSingleDoCoMoPrefixedField("C:", rawText, true); - String[] addresses = matchDoCoMoPrefixedField("A:", rawText, true); - String phoneNumber1 = matchSingleDoCoMoPrefixedField("B:", rawText, true); - String phoneNumber2 = matchSingleDoCoMoPrefixedField("M:", rawText, true); - String phoneNumber3 = matchSingleDoCoMoPrefixedField("F:", rawText, true); - String email = matchSingleDoCoMoPrefixedField("E:", rawText, true); - - return new AddressBookParsedResult(maybeWrap(fullName), - null, - null, - buildPhoneNumbers(phoneNumber1, phoneNumber2, phoneNumber3), - null, - maybeWrap(email), - null, - null, - null, - addresses, - null, - org, - null, - title, - null, - null); - } - - private static String[] buildPhoneNumbers(String number1, - String number2, - String number3) { - List numbers = new ArrayList<>(3); - if (number1 != null) { - numbers.add(number1); - } - if (number2 != null) { - numbers.add(number2); - } - if (number3 != null) { - numbers.add(number3); - } - int size = numbers.size(); - if (size == 0) { - return null; - } - return numbers.toArray(new String[size]); - } - - private static String buildName(String firstName, String lastName) { - if (firstName == null) { - return lastName; - } else { - return lastName == null ? firstName : firstName + ' ' + lastName; - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java deleted file mode 100644 index a729239..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - * @author Sean Owen - */ -public final class BookmarkDoCoMoResultParser extends AbstractDoCoMoResultParser { - - @Override - public URIParsedResult parse(Result result) { - String rawText = result.getText(); - if (!rawText.startsWith("MEBKM:")) { - return null; - } - String title = matchSingleDoCoMoPrefixedField("TITLE:", rawText, true); - String[] rawUri = matchDoCoMoPrefixedField("URL:", rawText, true); - if (rawUri == null) { - return null; - } - String uri = rawUri[0]; - return URIResultParser.isBasicallyValidURI(uri) ? new URIParsedResult(uri, title) : null; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/CalendarParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/CalendarParsedResult.java deleted file mode 100644 index 0bca993..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/CalendarParsedResult.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.Locale; -import java.util.TimeZone; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Represents a parsed result that encodes a calendar event at a certain time, optionally - * with attendees and a location. - * - * @author Sean Owen - */ -public final class CalendarParsedResult extends ParsedResult { - - private static final Pattern RFC2445_DURATION = - Pattern.compile("P(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?"); - private static final long[] RFC2445_DURATION_FIELD_UNITS = { - 7 * 24 * 60 * 60 * 1000L, // 1 week - 24 * 60 * 60 * 1000L, // 1 day - 60 * 60 * 1000L, // 1 hour - 60 * 1000L, // 1 minute - 1000L, // 1 second - }; - - private static final Pattern DATE_TIME = Pattern.compile("[0-9]{8}(T[0-9]{6}Z?)?"); - - private final String summary; - private final Date start; - private final boolean startAllDay; - private final Date end; - private final boolean endAllDay; - private final String location; - private final String organizer; - private final String[] attendees; - private final String description; - private final double latitude; - private final double longitude; - - public CalendarParsedResult(String summary, - String startString, - String endString, - String durationString, - String location, - String organizer, - String[] attendees, - String description, - double latitude, - double longitude) { - super(ParsedResultType.CALENDAR); - this.summary = summary; - - try { - this.start = parseDate(startString); - } catch (ParseException pe) { - throw new IllegalArgumentException(pe.toString()); - } - - if (endString == null) { - long durationMS = parseDurationMS(durationString); - end = durationMS < 0L ? null : new Date(start.getTime() + durationMS); - } else { - try { - this.end = parseDate(endString); - } catch (ParseException pe) { - throw new IllegalArgumentException(pe.toString()); - } - } - - this.startAllDay = startString.length() == 8; - this.endAllDay = endString != null && endString.length() == 8; - - this.location = location; - this.organizer = organizer; - this.attendees = attendees; - this.description = description; - this.latitude = latitude; - this.longitude = longitude; - } - - public String getSummary() { - return summary; - } - - /** - * @return start time - */ - public Date getStart() { - return start; - } - - /** - * @return true if start time was specified as a whole day - */ - public boolean isStartAllDay() { - return startAllDay; - } - - /** - * @return event end {@link Date}, or {@code null} if event has no duration - * @see #getStart() - */ - public Date getEnd() { - return end; - } - - /** - * @return true if end time was specified as a whole day - */ - public boolean isEndAllDay() { - return endAllDay; - } - - public String getLocation() { - return location; - } - - public String getOrganizer() { - return organizer; - } - - public String[] getAttendees() { - return attendees; - } - - public String getDescription() { - return description; - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(100); - maybeAppend(summary, result); - maybeAppend(format(startAllDay, start), result); - maybeAppend(format(endAllDay, end), result); - maybeAppend(location, result); - maybeAppend(organizer, result); - maybeAppend(attendees, result); - maybeAppend(description, result); - return result.toString(); - } - - /** - * Parses a string as a date. RFC 2445 allows the start and end fields to be of type DATE (e.g. 20081021) - * or DATE-TIME (e.g. 20081021T123000 for local time, or 20081021T123000Z for UTC). - * - * @param when The string to parse - * @throws ParseException if not able to parse as a date - */ - private static Date parseDate(String when) throws ParseException { - if (!DATE_TIME.matcher(when).matches()) { - throw new ParseException(when, 0); - } - if (when.length() == 8) { - // Show only year/month/day - return buildDateFormat().parse(when); - } else { - // The when string can be local time, or UTC if it ends with a Z - Date date; - if (when.length() == 16 && when.charAt(15) == 'Z') { - date = buildDateTimeFormat().parse(when.substring(0, 15)); - Calendar calendar = new GregorianCalendar(); - long milliseconds = date.getTime(); - // Account for time zone difference - milliseconds += calendar.get(Calendar.ZONE_OFFSET); - // Might need to correct for daylight savings time, but use target time since - // now might be in DST but not then, or vice versa - calendar.setTime(new Date(milliseconds)); - milliseconds += calendar.get(Calendar.DST_OFFSET); - date = new Date(milliseconds); - } else { - date = buildDateTimeFormat().parse(when); - } - return date; - } - } - - private static String format(boolean allDay, Date date) { - if (date == null) { - return null; - } - DateFormat format = allDay - ? DateFormat.getDateInstance(DateFormat.MEDIUM) - : DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); - return format.format(date); - } - - private static long parseDurationMS(CharSequence durationString) { - if (durationString == null) { - return -1L; - } - Matcher m = RFC2445_DURATION.matcher(durationString); - if (!m.matches()) { - return -1L; - } - long durationMS = 0L; - for (int i = 0; i < RFC2445_DURATION_FIELD_UNITS.length; i++) { - String fieldValue = m.group(i + 1); - if (fieldValue != null) { - durationMS += RFC2445_DURATION_FIELD_UNITS[i] * Integer.parseInt(fieldValue); - } - } - return durationMS; - } - - private static DateFormat buildDateFormat() { - DateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); - // For dates without a time, for purposes of interacting with Android, the resulting timestamp - // needs to be midnight of that day in GMT. See: - // http://code.google.com/p/android/issues/detail?id=8330 - format.setTimeZone(TimeZone.getTimeZone("GMT")); - return format; - } - - private static DateFormat buildDateTimeFormat() { - return new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/EmailAddressParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/EmailAddressParsedResult.java deleted file mode 100644 index a5bcd44..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/EmailAddressParsedResult.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes an email message including recipients, subject - * and body text. - * - * @author Sean Owen - */ -public final class EmailAddressParsedResult extends ParsedResult { - - private final String[] tos; - private final String[] ccs; - private final String[] bccs; - private final String subject; - private final String body; - - EmailAddressParsedResult(String to) { - this(new String[] {to}, null, null, null, null); - } - - EmailAddressParsedResult(String[] tos, - String[] ccs, - String[] bccs, - String subject, - String body) { - super(ParsedResultType.EMAIL_ADDRESS); - this.tos = tos; - this.ccs = ccs; - this.bccs = bccs; - this.subject = subject; - this.body = body; - } - - /** - * @return first elements of {@link #getTos()} or {@code null} if none - * @deprecated use {@link #getTos()} - */ - @Deprecated - public String getEmailAddress() { - return tos == null || tos.length == 0 ? null : tos[0]; - } - - public String[] getTos() { - return tos; - } - - public String[] getCCs() { - return ccs; - } - - public String[] getBCCs() { - return bccs; - } - - public String getSubject() { - return subject; - } - - public String getBody() { - return body; - } - - /** - * @return "mailto:" - * @deprecated without replacement - */ - @Deprecated - public String getMailtoURI() { - return "mailto:"; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(30); - maybeAppend(tos, result); - maybeAppend(ccs, result); - maybeAppend(bccs, result); - maybeAppend(subject, result); - maybeAppend(body, result); - return result.toString(); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/EmailAddressResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/EmailAddressResultParser.java deleted file mode 100644 index 18c4f7a..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/EmailAddressResultParser.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.Map; -import java.util.regex.Pattern; - -/** - * Represents a result that encodes an e-mail address, either as a plain address - * like "joe@example.org" or a mailto: URL like "mailto:joe@example.org". - * - * @author Sean Owen - */ -public final class EmailAddressResultParser extends ResultParser { - - private static final Pattern COMMA = Pattern.compile(","); - - @Override - public EmailAddressParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (rawText.startsWith("mailto:") || rawText.startsWith("MAILTO:")) { - // If it starts with mailto:, assume it is definitely trying to be an email address - String hostEmail = rawText.substring(7); - int queryStart = hostEmail.indexOf('?'); - if (queryStart >= 0) { - hostEmail = hostEmail.substring(0, queryStart); - } - try { - hostEmail = urlDecode(hostEmail); - } catch (IllegalArgumentException iae) { - return null; - } - String[] tos = null; - if (!hostEmail.isEmpty()) { - tos = COMMA.split(hostEmail); - } - Map nameValues = parseNameValuePairs(rawText); - String[] ccs = null; - String[] bccs = null; - String subject = null; - String body = null; - if (nameValues != null) { - if (tos == null) { - String tosString = nameValues.get("to"); - if (tosString != null) { - tos = COMMA.split(tosString); - } - } - String ccString = nameValues.get("cc"); - if (ccString != null) { - ccs = COMMA.split(ccString); - } - String bccString = nameValues.get("bcc"); - if (bccString != null) { - bccs = COMMA.split(bccString); - } - subject = nameValues.get("subject"); - body = nameValues.get("body"); - } - return new EmailAddressParsedResult(tos, ccs, bccs, subject, body); - } else { - if (!EmailDoCoMoResultParser.isBasicallyValidEmailAddress(rawText)) { - return null; - } - return new EmailAddressParsedResult(rawText); - } - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/EmailDoCoMoResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/EmailDoCoMoResultParser.java deleted file mode 100644 index fc4c284..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/EmailDoCoMoResultParser.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.regex.Pattern; - -/** - * Implements the "MATMSG" email message entry format. - * - * Supported keys: TO, SUB, BODY - * - * @author Sean Owen - */ -public final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser { - - private static final Pattern ATEXT_ALPHANUMERIC = Pattern.compile("[a-zA-Z0-9@.!#$%&'*+\\-/=?^_`{|}~]+"); - - @Override - public EmailAddressParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("MATMSG:")) { - return null; - } - String[] tos = matchDoCoMoPrefixedField("TO:", rawText, true); - if (tos == null) { - return null; - } - for (String to : tos) { - if (!isBasicallyValidEmailAddress(to)) { - return null; - } - } - String subject = matchSingleDoCoMoPrefixedField("SUB:", rawText, false); - String body = matchSingleDoCoMoPrefixedField("BODY:", rawText, false); - return new EmailAddressParsedResult(tos, null, null, subject, body); - } - - /** - * This implements only the most basic checking for an email address's validity -- that it contains - * an '@' and contains no characters disallowed by RFC 2822. This is an overly lenient definition of - * validity. We want to generally be lenient here since this class is only intended to encapsulate what's - * in a barcode, not "judge" it. - */ - static boolean isBasicallyValidEmailAddress(String email) { - return email != null && ATEXT_ALPHANUMERIC.matcher(email).matches() && email.indexOf('@') >= 0; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductParsedResult.java deleted file mode 100644 index 7585159..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductParsedResult.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.client.result; - -import java.util.Map; - -/** - * Represents a parsed result that encodes extended product information as encoded - * by the RSS format, like weight, price, dates, etc. - * - * @author Antonio Manuel Benjumea Conde, Servinform, S.A. - * @author Agustín Delgado, Servinform, S.A. - */ -public final class ExpandedProductParsedResult extends ParsedResult { - - public static final String KILOGRAM = "KG"; - public static final String POUND = "LB"; - - private final String rawText; - private final String productID; - private final String sscc; - private final String lotNumber; - private final String productionDate; - private final String packagingDate; - private final String bestBeforeDate; - private final String expirationDate; - private final String weight; - private final String weightType; - private final String weightIncrement; - private final String price; - private final String priceIncrement; - private final String priceCurrency; - // For AIS that not exist in this object - private final Map uncommonAIs; - - public ExpandedProductParsedResult(String rawText, - String productID, - String sscc, - String lotNumber, - String productionDate, - String packagingDate, - String bestBeforeDate, - String expirationDate, - String weight, - String weightType, - String weightIncrement, - String price, - String priceIncrement, - String priceCurrency, - Map uncommonAIs) { - super(ParsedResultType.PRODUCT); - this.rawText = rawText; - this.productID = productID; - this.sscc = sscc; - this.lotNumber = lotNumber; - this.productionDate = productionDate; - this.packagingDate = packagingDate; - this.bestBeforeDate = bestBeforeDate; - this.expirationDate = expirationDate; - this.weight = weight; - this.weightType = weightType; - this.weightIncrement = weightIncrement; - this.price = price; - this.priceIncrement = priceIncrement; - this.priceCurrency = priceCurrency; - this.uncommonAIs = uncommonAIs; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof ExpandedProductParsedResult)) { - return false; - } - - ExpandedProductParsedResult other = (ExpandedProductParsedResult) o; - - return equalsOrNull(productID, other.productID) - && equalsOrNull(sscc, other.sscc) - && equalsOrNull(lotNumber, other.lotNumber) - && equalsOrNull(productionDate, other.productionDate) - && equalsOrNull(bestBeforeDate, other.bestBeforeDate) - && equalsOrNull(expirationDate, other.expirationDate) - && equalsOrNull(weight, other.weight) - && equalsOrNull(weightType, other.weightType) - && equalsOrNull(weightIncrement, other.weightIncrement) - && equalsOrNull(price, other.price) - && equalsOrNull(priceIncrement, other.priceIncrement) - && equalsOrNull(priceCurrency, other.priceCurrency) - && equalsOrNull(uncommonAIs, other.uncommonAIs); - } - - private static boolean equalsOrNull(Object o1, Object o2) { - return o1 == null ? o2 == null : o1.equals(o2); - } - - @Override - public int hashCode() { - int hash = 0; - hash ^= hashNotNull(productID); - hash ^= hashNotNull(sscc); - hash ^= hashNotNull(lotNumber); - hash ^= hashNotNull(productionDate); - hash ^= hashNotNull(bestBeforeDate); - hash ^= hashNotNull(expirationDate); - hash ^= hashNotNull(weight); - hash ^= hashNotNull(weightType); - hash ^= hashNotNull(weightIncrement); - hash ^= hashNotNull(price); - hash ^= hashNotNull(priceIncrement); - hash ^= hashNotNull(priceCurrency); - hash ^= hashNotNull(uncommonAIs); - return hash; - } - - private static int hashNotNull(Object o) { - return o == null ? 0 : o.hashCode(); - } - - public String getRawText() { - return rawText; - } - - public String getProductID() { - return productID; - } - - public String getSscc() { - return sscc; - } - - public String getLotNumber() { - return lotNumber; - } - - public String getProductionDate() { - return productionDate; - } - - public String getPackagingDate() { - return packagingDate; - } - - public String getBestBeforeDate() { - return bestBeforeDate; - } - - public String getExpirationDate() { - return expirationDate; - } - - public String getWeight() { - return weight; - } - - public String getWeightType() { - return weightType; - } - - public String getWeightIncrement() { - return weightIncrement; - } - - public String getPrice() { - return price; - } - - public String getPriceIncrement() { - return priceIncrement; - } - - public String getPriceCurrency() { - return priceCurrency; - } - - public Map getUncommonAIs() { - return uncommonAIs; - } - - @Override - public String getDisplayResult() { - return String.valueOf(rawText); - } -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductResultParser.java deleted file mode 100644 index a64aec2..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ExpandedProductResultParser.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.client.result; - -import java.util.HashMap; -import java.util.Map; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.Result; - -/** - * Parses strings of digits that represent a RSS Extended code. - * - * @author Antonio Manuel Benjumea Conde, Servinform, S.A. - * @author Agustín Delgado, Servinform, S.A. - */ -public final class ExpandedProductResultParser extends ResultParser { - - @Override - public ExpandedProductParsedResult parse(Result result) { - BarcodeFormat format = result.getBarcodeFormat(); - if (format != BarcodeFormat.RSS_EXPANDED) { - // ExtendedProductParsedResult NOT created. Not a RSS Expanded barcode - return null; - } - String rawText = getMassagedText(result); - - String productID = null; - String sscc = null; - String lotNumber = null; - String productionDate = null; - String packagingDate = null; - String bestBeforeDate = null; - String expirationDate = null; - String weight = null; - String weightType = null; - String weightIncrement = null; - String price = null; - String priceIncrement = null; - String priceCurrency = null; - Map uncommonAIs = new HashMap<>(); - - int i = 0; - - while (i < rawText.length()) { - String ai = findAIvalue(i, rawText); - if (ai == null) { - // Error. Code doesn't match with RSS expanded pattern - // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern - return null; - } - i += ai.length() + 2; - String value = findValue(i, rawText); - i += value.length(); - - switch (ai) { - case "00": - sscc = value; - break; - case "01": - productID = value; - break; - case "10": - lotNumber = value; - break; - case "11": - productionDate = value; - break; - case "13": - packagingDate = value; - break; - case "15": - bestBeforeDate = value; - break; - case "17": - expirationDate = value; - break; - case "3100": - case "3101": - case "3102": - case "3103": - case "3104": - case "3105": - case "3106": - case "3107": - case "3108": - case "3109": - weight = value; - weightType = ExpandedProductParsedResult.KILOGRAM; - weightIncrement = ai.substring(3); - break; - case "3200": - case "3201": - case "3202": - case "3203": - case "3204": - case "3205": - case "3206": - case "3207": - case "3208": - case "3209": - weight = value; - weightType = ExpandedProductParsedResult.POUND; - weightIncrement = ai.substring(3); - break; - case "3920": - case "3921": - case "3922": - case "3923": - price = value; - priceIncrement = ai.substring(3); - break; - case "3930": - case "3931": - case "3932": - case "3933": - if (value.length() < 4) { - // The value must have more of 3 symbols (3 for currency and - // 1 at least for the price) - // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern - return null; - } - price = value.substring(3); - priceCurrency = value.substring(0, 3); - priceIncrement = ai.substring(3); - break; - default: - // No match with common AIs - uncommonAIs.put(ai, value); - break; - } - } - - return new ExpandedProductParsedResult(rawText, - productID, - sscc, - lotNumber, - productionDate, - packagingDate, - bestBeforeDate, - expirationDate, - weight, - weightType, - weightIncrement, - price, - priceIncrement, - priceCurrency, - uncommonAIs); - } - - private static String findAIvalue(int i, String rawText) { - char c = rawText.charAt(i); - // First character must be a open parenthesis.If not, ERROR - if (c != '(') { - return null; - } - - CharSequence rawTextAux = rawText.substring(i + 1); - - StringBuilder buf = new StringBuilder(); - for (int index = 0; index < rawTextAux.length(); index++) { - char currentChar = rawTextAux.charAt(index); - if (currentChar == ')') { - return buf.toString(); - } else if (currentChar >= '0' && currentChar <= '9') { - buf.append(currentChar); - } else { - return null; - } - } - return buf.toString(); - } - - private static String findValue(int i, String rawText) { - StringBuilder buf = new StringBuilder(); - String rawTextAux = rawText.substring(i); - - for (int index = 0; index < rawTextAux.length(); index++) { - char c = rawTextAux.charAt(index); - if (c == '(') { - // We look for a new AI. If it doesn't exist (ERROR), we coninue - // with the iteration - if (findAIvalue(index, rawTextAux) == null) { - buf.append('('); - } else { - break; - } - } else { - buf.append(c); - } - } - return buf.toString(); - } -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/GeoParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/GeoParsedResult.java deleted file mode 100644 index 3a2cae6..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/GeoParsedResult.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes a geographic coordinate, with latitude, - * longitude and altitude. - * - * @author Sean Owen - */ -public final class GeoParsedResult extends ParsedResult { - - private final double latitude; - private final double longitude; - private final double altitude; - private final String query; - - GeoParsedResult(double latitude, double longitude, double altitude, String query) { - super(ParsedResultType.GEO); - this.latitude = latitude; - this.longitude = longitude; - this.altitude = altitude; - this.query = query; - } - - public String getGeoURI() { - StringBuilder result = new StringBuilder(); - result.append("geo:"); - result.append(latitude); - result.append(','); - result.append(longitude); - if (altitude > 0) { - result.append(','); - result.append(altitude); - } - if (query != null) { - result.append('?'); - result.append(query); - } - return result.toString(); - } - - /** - * @return latitude in degrees - */ - public double getLatitude() { - return latitude; - } - - /** - * @return longitude in degrees - */ - public double getLongitude() { - return longitude; - } - - /** - * @return altitude in meters. If not specified, in the geo URI, returns 0.0 - */ - public double getAltitude() { - return altitude; - } - - /** - * @return query string associated with geo URI or null if none exists - */ - public String getQuery() { - return query; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(20); - result.append(latitude); - result.append(", "); - result.append(longitude); - if (altitude > 0.0) { - result.append(", "); - result.append(altitude); - result.append('m'); - } - if (query != null) { - result.append(" ("); - result.append(query); - result.append(')'); - } - return result.toString(); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/GeoResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/GeoResultParser.java deleted file mode 100644 index fb9cb07..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/GeoResultParser.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Parses a "geo:" URI result, which specifies a location on the surface of - * the Earth as well as an optional altitude above the surface. See - * - * http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00. - * - * @author Sean Owen - */ -public final class GeoResultParser extends ResultParser { - - private static final Pattern GEO_URL_PATTERN = - Pattern.compile("geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?", Pattern.CASE_INSENSITIVE); - - @Override - public GeoParsedResult parse(Result result) { - CharSequence rawText = getMassagedText(result); - Matcher matcher = GEO_URL_PATTERN.matcher(rawText); - if (!matcher.matches()) { - return null; - } - - String query = matcher.group(4); - - double latitude; - double longitude; - double altitude; - try { - latitude = Double.parseDouble(matcher.group(1)); - if (latitude > 90.0 || latitude < -90.0) { - return null; - } - longitude = Double.parseDouble(matcher.group(2)); - if (longitude > 180.0 || longitude < -180.0) { - return null; - } - if (matcher.group(3) == null) { - altitude = 0.0; - } else { - altitude = Double.parseDouble(matcher.group(3)); - if (altitude < 0.0) { - return null; - } - } - } catch (NumberFormatException ignored) { - return null; - } - return new GeoParsedResult(latitude, longitude, altitude, query); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/ISBNParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/ISBNParsedResult.java deleted file mode 100644 index ebf11c5..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ISBNParsedResult.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes a product ISBN number. - * - * @author jbreiden@google.com (Jeff Breidenbach) - */ -public final class ISBNParsedResult extends ParsedResult { - - private final String isbn; - - ISBNParsedResult(String isbn) { - super(ParsedResultType.ISBN); - this.isbn = isbn; - } - - public String getISBN() { - return isbn; - } - - @Override - public String getDisplayResult() { - return isbn; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ISBNResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/ISBNResultParser.java deleted file mode 100644 index e957dd0..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ISBNResultParser.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.Result; - -/** - * Parses strings of digits that represent a ISBN. - * - * @author jbreiden@google.com (Jeff Breidenbach) - */ -public final class ISBNResultParser extends ResultParser { - - /** - * See ISBN-13 For Dummies - */ - @Override - public ISBNParsedResult parse(Result result) { - BarcodeFormat format = result.getBarcodeFormat(); - if (format != BarcodeFormat.EAN_13) { - return null; - } - String rawText = getMassagedText(result); - int length = rawText.length(); - if (length != 13) { - return null; - } - if (!rawText.startsWith("978") && !rawText.startsWith("979")) { - return null; - } - - return new ISBNParsedResult(rawText); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/ParsedResult.java deleted file mode 100644 index 17660e2..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ParsedResult.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - *

    Abstract class representing the result of decoding a barcode, as more than - * a String -- as some type of structured data. This might be a subclass which represents - * a URL, or an e-mail address. {@link ResultParser#parseResult(com.google.zxing.Result)} will turn a raw - * decoded string into the most appropriate type of structured representation.

    - * - *

    Thanks to Jeff Griffin for proposing rewrite of these classes that relies less - * on exception-based mechanisms during parsing.

    - * - * @author Sean Owen - */ -public abstract class ParsedResult { - - private final ParsedResultType type; - - protected ParsedResult(ParsedResultType type) { - this.type = type; - } - - public final ParsedResultType getType() { - return type; - } - - public abstract String getDisplayResult(); - - @Override - public final String toString() { - return getDisplayResult(); - } - - public static void maybeAppend(String value, StringBuilder result) { - if (value != null && !value.isEmpty()) { - // Don't add a newline before the first value - if (result.length() > 0) { - result.append('\n'); - } - result.append(value); - } - } - - public static void maybeAppend(String[] values, StringBuilder result) { - if (values != null) { - for (String value : values) { - maybeAppend(value, result); - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ParsedResultType.java b/zxing/src/main/java/com/google/zxing/client/result/ParsedResultType.java deleted file mode 100644 index c74d545..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ParsedResultType.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents the type of data encoded by a barcode -- from plain text, to a - * URI, to an e-mail address, etc. - * - * @author Sean Owen - */ -public enum ParsedResultType { - - ADDRESSBOOK, - EMAIL_ADDRESS, - PRODUCT, - URI, - TEXT, - GEO, - TEL, - SMS, - CALENDAR, - WIFI, - ISBN, - VIN, - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ProductParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/ProductParsedResult.java deleted file mode 100644 index 66a5c9b..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ProductParsedResult.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes a product by an identifier of some kind. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class ProductParsedResult extends ParsedResult { - - private final String productID; - private final String normalizedProductID; - - ProductParsedResult(String productID) { - this(productID, productID); - } - - ProductParsedResult(String productID, String normalizedProductID) { - super(ParsedResultType.PRODUCT); - this.productID = productID; - this.normalizedProductID = normalizedProductID; - } - - public String getProductID() { - return productID; - } - - public String getNormalizedProductID() { - return normalizedProductID; - } - - @Override - public String getDisplayResult() { - return productID; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/ProductResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/ProductResultParser.java deleted file mode 100644 index bed1a7d..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ProductResultParser.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.Result; -import com.google.zxing.oned.UPCEReader; - -/** - * Parses strings of digits that represent a UPC code. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class ProductResultParser extends ResultParser { - - // Treat all UPC and EAN variants as UPCs, in the sense that they are all product barcodes. - @Override - public ProductParsedResult parse(Result result) { - BarcodeFormat format = result.getBarcodeFormat(); - if (!(format == BarcodeFormat.UPC_A || format == BarcodeFormat.UPC_E || - format == BarcodeFormat.EAN_8 || format == BarcodeFormat.EAN_13)) { - return null; - } - String rawText = getMassagedText(result); - if (!isStringOfDigits(rawText, rawText.length())) { - return null; - } - // Not actually checking the checksum again here - - String normalizedProductID; - // Expand UPC-E for purposes of searching - if (format == BarcodeFormat.UPC_E && rawText.length() == 8) { - normalizedProductID = UPCEReader.convertUPCEtoUPCA(rawText); - } else { - normalizedProductID = rawText; - } - - return new ProductParsedResult(rawText, normalizedProductID); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/ResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/ResultParser.java deleted file mode 100644 index c86f1f7..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/ResultParser.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -/** - *

    Abstract class representing the result of decoding a barcode, as more than - * a String -- as some type of structured data. This might be a subclass which represents - * a URL, or an e-mail address. {@link #parseResult(Result)} will turn a raw - * decoded string into the most appropriate type of structured representation.

    - * - *

    Thanks to Jeff Griffin for proposing rewrite of these classes that relies less - * on exception-based mechanisms during parsing.

    - * - * @author Sean Owen - */ -public abstract class ResultParser { - - private static final ResultParser[] PARSERS = { - new BookmarkDoCoMoResultParser(), - new AddressBookDoCoMoResultParser(), - new EmailDoCoMoResultParser(), - new AddressBookAUResultParser(), - new VCardResultParser(), - new BizcardResultParser(), - new VEventResultParser(), - new EmailAddressResultParser(), - new SMTPResultParser(), - new TelResultParser(), - new SMSMMSResultParser(), - new SMSTOMMSTOResultParser(), - new GeoResultParser(), - new WifiResultParser(), - new URLTOResultParser(), - new URIResultParser(), - new ISBNResultParser(), - new ProductResultParser(), - new ExpandedProductResultParser(), - new VINResultParser(), - }; - - private static final Pattern DIGITS = Pattern.compile("\\d+"); - private static final Pattern AMPERSAND = Pattern.compile("&"); - private static final Pattern EQUALS = Pattern.compile("="); - private static final String BYTE_ORDER_MARK = "\ufeff"; - - /** - * Attempts to parse the raw {@link Result}'s contents as a particular type - * of information (email, URL, etc.) and return a {@link ParsedResult} encapsulating - * the result of parsing. - * - * @param theResult the raw {@link Result} to parse - * @return {@link ParsedResult} encapsulating the parsing result - */ - public abstract ParsedResult parse(Result theResult); - - protected static String getMassagedText(Result result) { - String text = result.getText(); - if (text.startsWith(BYTE_ORDER_MARK)) { - text = text.substring(1); - } - return text; - } - - public static ParsedResult parseResult(Result theResult) { - for (ResultParser parser : PARSERS) { - ParsedResult result = parser.parse(theResult); - if (result != null) { - return result; - } - } - return new TextParsedResult(theResult.getText(), null); - } - - protected static void maybeAppend(String value, StringBuilder result) { - if (value != null) { - result.append('\n'); - result.append(value); - } - } - - protected static void maybeAppend(String[] value, StringBuilder result) { - if (value != null) { - for (String s : value) { - result.append('\n'); - result.append(s); - } - } - } - - protected static String[] maybeWrap(String value) { - return value == null ? null : new String[] { value }; - } - - protected static String unescapeBackslash(String escaped) { - int backslash = escaped.indexOf('\\'); - if (backslash < 0) { - return escaped; - } - int max = escaped.length(); - StringBuilder unescaped = new StringBuilder(max - 1); - unescaped.append(escaped.toCharArray(), 0, backslash); - boolean nextIsEscaped = false; - for (int i = backslash; i < max; i++) { - char c = escaped.charAt(i); - if (nextIsEscaped || c != '\\') { - unescaped.append(c); - nextIsEscaped = false; - } else { - nextIsEscaped = true; - } - } - return unescaped.toString(); - } - - protected static int parseHexDigit(char c) { - if (c >= '0' && c <= '9') { - return c - '0'; - } - if (c >= 'a' && c <= 'f') { - return 10 + (c - 'a'); - } - if (c >= 'A' && c <= 'F') { - return 10 + (c - 'A'); - } - return -1; - } - - protected static boolean isStringOfDigits(CharSequence value, int length) { - return value != null && length > 0 && length == value.length() && DIGITS.matcher(value).matches(); - } - - protected static boolean isSubstringOfDigits(CharSequence value, int offset, int length) { - if (value == null || length <= 0) { - return false; - } - int max = offset + length; - return value.length() >= max && DIGITS.matcher(value.subSequence(offset, max)).matches(); - } - - static Map parseNameValuePairs(String uri) { - int paramStart = uri.indexOf('?'); - if (paramStart < 0) { - return null; - } - Map result = new HashMap<>(3); - for (String keyValue : AMPERSAND.split(uri.substring(paramStart + 1))) { - appendKeyValue(keyValue, result); - } - return result; - } - - private static void appendKeyValue(CharSequence keyValue, Map result) { - String[] keyValueTokens = EQUALS.split(keyValue, 2); - if (keyValueTokens.length == 2) { - String key = keyValueTokens[0]; - String value = keyValueTokens[1]; - try { - value = urlDecode(value); - result.put(key, value); - } catch (IllegalArgumentException iae) { - // continue; invalid data such as an escape like %0t - } - } - } - - static String urlDecode(String encoded) { - try { - return URLDecoder.decode(encoded, "UTF-8"); - } catch (UnsupportedEncodingException uee) { - throw new IllegalStateException(uee); // can't happen - } - } - - static String[] matchPrefixedField(String prefix, String rawText, char endChar, boolean trim) { - List matches = null; - int i = 0; - int max = rawText.length(); - while (i < max) { - i = rawText.indexOf(prefix, i); - if (i < 0) { - break; - } - i += prefix.length(); // Skip past this prefix we found to start - int start = i; // Found the start of a match here - boolean more = true; - while (more) { - i = rawText.indexOf(endChar, i); - if (i < 0) { - // No terminating end character? uh, done. Set i such that loop terminates and break - i = rawText.length(); - more = false; - } else if (countPrecedingBackslashes(rawText, i) % 2 != 0) { - // semicolon was escaped (odd count of preceding backslashes) so continue - i++; - } else { - // found a match - if (matches == null) { - matches = new ArrayList<>(3); // lazy init - } - String element = unescapeBackslash(rawText.substring(start, i)); - if (trim) { - element = element.trim(); - } - if (!element.isEmpty()) { - matches.add(element); - } - i++; - more = false; - } - } - } - if (matches == null || matches.isEmpty()) { - return null; - } - return matches.toArray(new String[matches.size()]); - } - - private static int countPrecedingBackslashes(CharSequence s, int pos) { - int count = 0; - for (int i = pos - 1; i >= 0; i--) { - if (s.charAt(i) == '\\') { - count++; - } else { - break; - } - } - return count; - } - - static String matchSinglePrefixedField(String prefix, String rawText, char endChar, boolean trim) { - String[] matches = matchPrefixedField(prefix, rawText, endChar, trim); - return matches == null ? null : matches[0]; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java deleted file mode 100644 index a8d65d3..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - *

    Parses an "sms:" URI result, which specifies a number to SMS. - * See RFC 5724 on this.

    - * - *

    This class supports "via" syntax for numbers, which is not part of the spec. - * For example "+12125551212;via=+12124440101" may appear as a number. - * It also supports a "subject" query parameter, which is not mentioned in the spec. - * These are included since they were mentioned in earlier IETF drafts and might be - * used.

    - * - *

    This actually also parses URIs starting with "mms:" and treats them all the same way, - * and effectively converts them to an "sms:" URI for purposes of forwarding to the platform.

    - * - * @author Sean Owen - */ -public final class SMSMMSResultParser extends ResultParser { - - @Override - public SMSParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!(rawText.startsWith("sms:") || rawText.startsWith("SMS:") || - rawText.startsWith("mms:") || rawText.startsWith("MMS:"))) { - return null; - } - - // Check up front if this is a URI syntax string with query arguments - Map nameValuePairs = parseNameValuePairs(rawText); - String subject = null; - String body = null; - boolean querySyntax = false; - if (nameValuePairs != null && !nameValuePairs.isEmpty()) { - subject = nameValuePairs.get("subject"); - body = nameValuePairs.get("body"); - querySyntax = true; - } - - // Drop sms, query portion - int queryStart = rawText.indexOf('?', 4); - String smsURIWithoutQuery; - // If it's not query syntax, the question mark is part of the subject or message - if (queryStart < 0 || !querySyntax) { - smsURIWithoutQuery = rawText.substring(4); - } else { - smsURIWithoutQuery = rawText.substring(4, queryStart); - } - - int lastComma = -1; - int comma; - List numbers = new ArrayList<>(1); - List vias = new ArrayList<>(1); - while ((comma = smsURIWithoutQuery.indexOf(',', lastComma + 1)) > lastComma) { - String numberPart = smsURIWithoutQuery.substring(lastComma + 1, comma); - addNumberVia(numbers, vias, numberPart); - lastComma = comma; - } - addNumberVia(numbers, vias, smsURIWithoutQuery.substring(lastComma + 1)); - - return new SMSParsedResult(numbers.toArray(new String[numbers.size()]), - vias.toArray(new String[vias.size()]), - subject, - body); - } - - private static void addNumberVia(Collection numbers, - Collection vias, - String numberPart) { - int numberEnd = numberPart.indexOf(';'); - if (numberEnd < 0) { - numbers.add(numberPart); - vias.add(null); - } else { - numbers.add(numberPart.substring(0, numberEnd)); - String maybeVia = numberPart.substring(numberEnd + 1); - String via; - if (maybeVia.startsWith("via=")) { - via = maybeVia.substring(4); - } else { - via = null; - } - vias.add(via); - } - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/SMSParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/SMSParsedResult.java deleted file mode 100644 index 176078e..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/SMSParsedResult.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes an SMS message, including recipients, subject - * and body text. - * - * @author Sean Owen - */ -public final class SMSParsedResult extends ParsedResult { - - private final String[] numbers; - private final String[] vias; - private final String subject; - private final String body; - - public SMSParsedResult(String number, - String via, - String subject, - String body) { - super(ParsedResultType.SMS); - this.numbers = new String[] {number}; - this.vias = new String[] {via}; - this.subject = subject; - this.body = body; - } - - public SMSParsedResult(String[] numbers, - String[] vias, - String subject, - String body) { - super(ParsedResultType.SMS); - this.numbers = numbers; - this.vias = vias; - this.subject = subject; - this.body = body; - } - - public String getSMSURI() { - StringBuilder result = new StringBuilder(); - result.append("sms:"); - boolean first = true; - for (int i = 0; i < numbers.length; i++) { - if (first) { - first = false; - } else { - result.append(','); - } - result.append(numbers[i]); - if (vias != null && vias[i] != null) { - result.append(";via="); - result.append(vias[i]); - } - } - boolean hasBody = body != null; - boolean hasSubject = subject != null; - if (hasBody || hasSubject) { - result.append('?'); - if (hasBody) { - result.append("body="); - result.append(body); - } - if (hasSubject) { - if (hasBody) { - result.append('&'); - } - result.append("subject="); - result.append(subject); - } - } - return result.toString(); - } - - public String[] getNumbers() { - return numbers; - } - - public String[] getVias() { - return vias; - } - - public String getSubject() { - return subject; - } - - public String getBody() { - return body; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(100); - maybeAppend(numbers, result); - maybeAppend(subject, result); - maybeAppend(body, result); - return result.toString(); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/SMSTOMMSTOResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/SMSTOMMSTOResultParser.java deleted file mode 100644 index 0760565..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/SMSTOMMSTOResultParser.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - *

    Parses an "smsto:" URI result, whose format is not standardized but appears to be like: - * {@code smsto:number(:body)}.

    - * - *

    This actually also parses URIs starting with "smsto:", "mmsto:", "SMSTO:", and - * "MMSTO:", and treats them all the same way, and effectively converts them to an "sms:" URI - * for purposes of forwarding to the platform.

    - * - * @author Sean Owen - */ -public final class SMSTOMMSTOResultParser extends ResultParser { - - @Override - public SMSParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!(rawText.startsWith("smsto:") || rawText.startsWith("SMSTO:") || - rawText.startsWith("mmsto:") || rawText.startsWith("MMSTO:"))) { - return null; - } - // Thanks to dominik.wild for suggesting this enhancement to support - // smsto:number:body URIs - String number = rawText.substring(6); - String body = null; - int bodyStart = number.indexOf(':'); - if (bodyStart >= 0) { - body = number.substring(bodyStart + 1); - number = number.substring(0, bodyStart); - } - return new SMSParsedResult(number, null, null, body); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/SMTPResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/SMTPResultParser.java deleted file mode 100644 index 3279ceb..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/SMTPResultParser.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - *

    Parses an "smtp:" URI result, whose format is not standardized but appears to be like: - * {@code smtp[:subject[:body]]}.

    - * - * @author Sean Owen - */ -public final class SMTPResultParser extends ResultParser { - - @Override - public EmailAddressParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!(rawText.startsWith("smtp:") || rawText.startsWith("SMTP:"))) { - return null; - } - String emailAddress = rawText.substring(5); - String subject = null; - String body = null; - int colon = emailAddress.indexOf(':'); - if (colon >= 0) { - subject = emailAddress.substring(colon + 1); - emailAddress = emailAddress.substring(0, colon); - colon = subject.indexOf(':'); - if (colon >= 0) { - body = subject.substring(colon + 1); - subject = subject.substring(0, colon); - } - } - return new EmailAddressParsedResult(new String[] {emailAddress}, - null, - null, - subject, - body); - } -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/TelParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/TelParsedResult.java deleted file mode 100644 index fb606f2..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/TelParsedResult.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes a telephone number. - * - * @author Sean Owen - */ -public final class TelParsedResult extends ParsedResult { - - private final String number; - private final String telURI; - private final String title; - - public TelParsedResult(String number, String telURI, String title) { - super(ParsedResultType.TEL); - this.number = number; - this.telURI = telURI; - this.title = title; - } - - public String getNumber() { - return number; - } - - public String getTelURI() { - return telURI; - } - - public String getTitle() { - return title; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(20); - maybeAppend(number, result); - maybeAppend(title, result); - return result.toString(); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/TelResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/TelResultParser.java deleted file mode 100644 index e4bca1f..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/TelResultParser.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - * Parses a "tel:" URI result, which specifies a phone number. - * - * @author Sean Owen - */ -public final class TelResultParser extends ResultParser { - - @Override - public TelParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("tel:") && !rawText.startsWith("TEL:")) { - return null; - } - // Normalize "TEL:" to "tel:" - String telURI = rawText.startsWith("TEL:") ? "tel:" + rawText.substring(4) : rawText; - // Drop tel, query portion - int queryStart = rawText.indexOf('?', 4); - String number = queryStart < 0 ? rawText.substring(4) : rawText.substring(4, queryStart); - return new TelParsedResult(number, telURI, null); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/TextParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/TextParsedResult.java deleted file mode 100644 index 9cc408e..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/TextParsedResult.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * A simple result type encapsulating a string that has no further - * interpretation. - * - * @author Sean Owen - */ -public final class TextParsedResult extends ParsedResult { - - private final String text; - private final String language; - - public TextParsedResult(String text, String language) { - super(ParsedResultType.TEXT); - this.text = text; - this.language = language; - } - - public String getText() { - return text; - } - - public String getLanguage() { - return language; - } - - @Override - public String getDisplayResult() { - return text; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/URIParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/URIParsedResult.java deleted file mode 100644 index e26e361..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/URIParsedResult.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import java.util.regex.Pattern; - -/** - * A simple result type encapsulating a URI that has no further interpretation. - * - * @author Sean Owen - */ -public final class URIParsedResult extends ParsedResult { - - private static final Pattern USER_IN_HOST = Pattern.compile(":/*([^/@]+)@[^/]+"); - - private final String uri; - private final String title; - - public URIParsedResult(String uri, String title) { - super(ParsedResultType.URI); - this.uri = massageURI(uri); - this.title = title; - } - - public String getURI() { - return uri; - } - - public String getTitle() { - return title; - } - - /** - * @return true if the URI contains suspicious patterns that may suggest it intends to - * mislead the user about its true nature. At the moment this looks for the presence - * of user/password syntax in the host/authority portion of a URI which may be used - * in attempts to make the URI's host appear to be other than it is. Example: - * http://yourbank.com@phisher.com This URI connects to phisher.com but may appear - * to connect to yourbank.com at first glance. - */ - public boolean isPossiblyMaliciousURI() { - return USER_IN_HOST.matcher(uri).find(); - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(30); - maybeAppend(title, result); - maybeAppend(uri, result); - return result.toString(); - } - - /** - * Transforms a string that represents a URI into something more proper, by adding or canonicalizing - * the protocol. - */ - private static String massageURI(String uri) { - uri = uri.trim(); - int protocolEnd = uri.indexOf(':'); - if (protocolEnd < 0 || isColonFollowedByPortNumber(uri, protocolEnd)) { - // No protocol, or found a colon, but it looks like it is after the host, so the protocol is still missing, - // so assume http - uri = "http://" + uri; - } - return uri; - } - - private static boolean isColonFollowedByPortNumber(String uri, int protocolEnd) { - int start = protocolEnd + 1; - int nextSlash = uri.indexOf('/', start); - if (nextSlash < 0) { - nextSlash = uri.length(); - } - return ResultParser.isSubstringOfDigits(uri, start, nextSlash - start); - } - - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/URIResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/URIResultParser.java deleted file mode 100644 index 2b0feef..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/URIResultParser.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Tries to parse results that are a URI of some kind. - * - * @author Sean Owen - */ -public final class URIResultParser extends ResultParser { - - // See http://www.ietf.org/rfc/rfc2396.txt - private static final Pattern URL_WITH_PROTOCOL_PATTERN = Pattern.compile("[a-zA-Z][a-zA-Z0-9+-.]+:"); - private static final Pattern URL_WITHOUT_PROTOCOL_PATTERN = Pattern.compile( - "([a-zA-Z0-9\\-]+\\.)+[a-zA-Z]{2,}" + // host name elements - "(:\\d{1,5})?" + // maybe port - "(/|\\?|$)"); // query, path or nothing - - @Override - public URIParsedResult parse(Result result) { - String rawText = getMassagedText(result); - // We specifically handle the odd "URL" scheme here for simplicity and add "URI" for fun - // Assume anything starting this way really means to be a URI - if (rawText.startsWith("URL:") || rawText.startsWith("URI:")) { - return new URIParsedResult(rawText.substring(4).trim(), null); - } - rawText = rawText.trim(); - return isBasicallyValidURI(rawText) ? new URIParsedResult(rawText, null) : null; - } - - static boolean isBasicallyValidURI(String uri) { - if (uri.contains(" ")) { - // Quick hack check for a common case - return false; - } - Matcher m = URL_WITH_PROTOCOL_PATTERN.matcher(uri); - if (m.find() && m.start() == 0) { // match at start only - return true; - } - m = URL_WITHOUT_PROTOCOL_PATTERN.matcher(uri); - return m.find() && m.start() == 0; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/URLTOResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/URLTOResultParser.java deleted file mode 100644 index fd25900..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/URLTOResultParser.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - * Parses the "URLTO" result format, which is of the form "URLTO:[title]:[url]". - * This seems to be used sometimes, but I am not able to find documentation - * on its origin or official format? - * - * @author Sean Owen - */ -public final class URLTOResultParser extends ResultParser { - - @Override - public URIParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("urlto:") && !rawText.startsWith("URLTO:")) { - return null; - } - int titleEnd = rawText.indexOf(':', 6); - if (titleEnd < 0) { - return null; - } - String title = titleEnd <= 6 ? null : rawText.substring(6, titleEnd); - String uri = rawText.substring(titleEnd + 1); - return new URIParsedResult(uri, title); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/VCardResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/VCardResultParser.java deleted file mode 100644 index ad571ad..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/VCardResultParser.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.io.ByteArrayOutputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Parses contact information formatted according to the VCard (2.1) format. This is not a complete - * implementation but should parse information as commonly encoded in 2D barcodes. - * - * @author Sean Owen - */ -public final class VCardResultParser extends ResultParser { - - private static final Pattern BEGIN_VCARD = Pattern.compile("BEGIN:VCARD", Pattern.CASE_INSENSITIVE); - private static final Pattern VCARD_LIKE_DATE = Pattern.compile("\\d{4}-?\\d{2}-?\\d{2}"); - private static final Pattern CR_LF_SPACE_TAB = Pattern.compile("\r\n[ \t]"); - private static final Pattern NEWLINE_ESCAPE = Pattern.compile("\\\\[nN]"); - private static final Pattern VCARD_ESCAPES = Pattern.compile("\\\\([,;\\\\])"); - private static final Pattern EQUALS = Pattern.compile("="); - private static final Pattern SEMICOLON = Pattern.compile(";"); - private static final Pattern UNESCAPED_SEMICOLONS = Pattern.compile("(?> names = matchVCardPrefixedField("FN", rawText, true, false); - if (names == null) { - // If no display names found, look for regular name fields and format them - names = matchVCardPrefixedField("N", rawText, true, false); - formatNames(names); - } - List nicknameString = matchSingleVCardPrefixedField("NICKNAME", rawText, true, false); - String[] nicknames = nicknameString == null ? null : COMMA.split(nicknameString.get(0)); - List> phoneNumbers = matchVCardPrefixedField("TEL", rawText, true, false); - List> emails = matchVCardPrefixedField("EMAIL", rawText, true, false); - List note = matchSingleVCardPrefixedField("NOTE", rawText, false, false); - List> addresses = matchVCardPrefixedField("ADR", rawText, true, true); - List org = matchSingleVCardPrefixedField("ORG", rawText, true, true); - List birthday = matchSingleVCardPrefixedField("BDAY", rawText, true, false); - if (birthday != null && !isLikeVCardDate(birthday.get(0))) { - birthday = null; - } - List title = matchSingleVCardPrefixedField("TITLE", rawText, true, false); - List> urls = matchVCardPrefixedField("URL", rawText, true, false); - List instantMessenger = matchSingleVCardPrefixedField("IMPP", rawText, true, false); - List geoString = matchSingleVCardPrefixedField("GEO", rawText, true, false); - String[] geo = geoString == null ? null : SEMICOLON_OR_COMMA.split(geoString.get(0)); - if (geo != null && geo.length != 2) { - geo = null; - } - return new AddressBookParsedResult(toPrimaryValues(names), - nicknames, - null, - toPrimaryValues(phoneNumbers), - toTypes(phoneNumbers), - toPrimaryValues(emails), - toTypes(emails), - toPrimaryValue(instantMessenger), - toPrimaryValue(note), - toPrimaryValues(addresses), - toTypes(addresses), - toPrimaryValue(org), - toPrimaryValue(birthday), - toPrimaryValue(title), - toPrimaryValues(urls), - geo); - } - - static List> matchVCardPrefixedField(CharSequence prefix, - String rawText, - boolean trim, - boolean parseFieldDivider) { - List> matches = null; - int i = 0; - int max = rawText.length(); - - while (i < max) { - - // At start or after newline, match prefix, followed by optional metadata - // (led by ;) ultimately ending in colon - Matcher matcher = Pattern.compile("(?:^|\n)" + prefix + "(?:;([^:]*))?:", - Pattern.CASE_INSENSITIVE).matcher(rawText); - if (i > 0) { - i--; // Find from i-1 not i since looking at the preceding character - } - if (!matcher.find(i)) { - break; - } - i = matcher.end(0); // group 0 = whole pattern; end(0) is past final colon - - String metadataString = matcher.group(1); // group 1 = metadata substring - List metadata = null; - boolean quotedPrintable = false; - String quotedPrintableCharset = null; - if (metadataString != null) { - for (String metadatum : SEMICOLON.split(metadataString)) { - if (metadata == null) { - metadata = new ArrayList<>(1); - } - metadata.add(metadatum); - String[] metadatumTokens = EQUALS.split(metadatum, 2); - if (metadatumTokens.length > 1) { - String key = metadatumTokens[0]; - String value = metadatumTokens[1]; - if ("ENCODING".equalsIgnoreCase(key) && "QUOTED-PRINTABLE".equalsIgnoreCase(value)) { - quotedPrintable = true; - } else if ("CHARSET".equalsIgnoreCase(key)) { - quotedPrintableCharset = value; - } - } - } - } - - int matchStart = i; // Found the start of a match here - - while ((i = rawText.indexOf('\n', i)) >= 0) { // Really, end in \r\n - if (i < rawText.length() - 1 && // But if followed by tab or space, - (rawText.charAt(i + 1) == ' ' || // this is only a continuation - rawText.charAt(i + 1) == '\t')) { - i += 2; // Skip \n and continutation whitespace - } else if (quotedPrintable && // If preceded by = in quoted printable - ((i >= 1 && rawText.charAt(i - 1) == '=') || // this is a continuation - (i >= 2 && rawText.charAt(i - 2) == '='))) { - i++; // Skip \n - } else { - break; - } - } - - if (i < 0) { - // No terminating end character? uh, done. Set i such that loop terminates and break - i = max; - } else if (i > matchStart) { - // found a match - if (matches == null) { - matches = new ArrayList<>(1); // lazy init - } - if (i >= 1 && rawText.charAt(i - 1) == '\r') { - i--; // Back up over \r, which really should be there - } - String element = rawText.substring(matchStart, i); - if (trim) { - element = element.trim(); - } - if (quotedPrintable) { - element = decodeQuotedPrintable(element, quotedPrintableCharset); - if (parseFieldDivider) { - element = UNESCAPED_SEMICOLONS.matcher(element).replaceAll("\n").trim(); - } - } else { - if (parseFieldDivider) { - element = UNESCAPED_SEMICOLONS.matcher(element).replaceAll("\n").trim(); - } - element = CR_LF_SPACE_TAB.matcher(element).replaceAll(""); - element = NEWLINE_ESCAPE.matcher(element).replaceAll("\n"); - element = VCARD_ESCAPES.matcher(element).replaceAll("$1"); - } - if (metadata == null) { - List match = new ArrayList<>(1); - match.add(element); - matches.add(match); - } else { - metadata.add(0, element); - matches.add(metadata); - } - i++; - } else { - i++; - } - - } - - return matches; - } - - private static String decodeQuotedPrintable(CharSequence value, String charset) { - int length = value.length(); - StringBuilder result = new StringBuilder(length); - ByteArrayOutputStream fragmentBuffer = new ByteArrayOutputStream(); - for (int i = 0; i < length; i++) { - char c = value.charAt(i); - switch (c) { - case '\r': - case '\n': - break; - case '=': - if (i < length - 2) { - char nextChar = value.charAt(i + 1); - if (nextChar != '\r' && nextChar != '\n') { - char nextNextChar = value.charAt(i + 2); - int firstDigit = parseHexDigit(nextChar); - int secondDigit = parseHexDigit(nextNextChar); - if (firstDigit >= 0 && secondDigit >= 0) { - fragmentBuffer.write((firstDigit << 4) + secondDigit); - } // else ignore it, assume it was incorrectly encoded - i += 2; - } - } - break; - default: - maybeAppendFragment(fragmentBuffer, charset, result); - result.append(c); - } - } - maybeAppendFragment(fragmentBuffer, charset, result); - return result.toString(); - } - - private static void maybeAppendFragment(ByteArrayOutputStream fragmentBuffer, - String charset, - StringBuilder result) { - if (fragmentBuffer.size() > 0) { - byte[] fragmentBytes = fragmentBuffer.toByteArray(); - String fragment; - if (charset == null) { - fragment = new String(fragmentBytes, Charset.forName("UTF-8")); - } else { - try { - fragment = new String(fragmentBytes, charset); - } catch (UnsupportedEncodingException e) { - fragment = new String(fragmentBytes, Charset.forName("UTF-8")); - } - } - fragmentBuffer.reset(); - result.append(fragment); - } - } - - static List matchSingleVCardPrefixedField(CharSequence prefix, - String rawText, - boolean trim, - boolean parseFieldDivider) { - List> values = matchVCardPrefixedField(prefix, rawText, trim, parseFieldDivider); - return values == null || values.isEmpty() ? null : values.get(0); - } - - private static String toPrimaryValue(List list) { - return list == null || list.isEmpty() ? null : list.get(0); - } - - private static String[] toPrimaryValues(Collection> lists) { - if (lists == null || lists.isEmpty()) { - return null; - } - List result = new ArrayList<>(lists.size()); - for (List list : lists) { - String value = list.get(0); - if (value != null && !value.isEmpty()) { - result.add(value); - } - } - return result.toArray(new String[lists.size()]); - } - - private static String[] toTypes(Collection> lists) { - if (lists == null || lists.isEmpty()) { - return null; - } - List result = new ArrayList<>(lists.size()); - for (List list : lists) { - String type = null; - for (int i = 1; i < list.size(); i++) { - String metadatum = list.get(i); - int equals = metadatum.indexOf('='); - if (equals < 0) { - // take the whole thing as a usable label - type = metadatum; - break; - } - if ("TYPE".equalsIgnoreCase(metadatum.substring(0, equals))) { - type = metadatum.substring(equals + 1); - break; - } - } - result.add(type); - } - return result.toArray(new String[lists.size()]); - } - - private static boolean isLikeVCardDate(CharSequence value) { - return value == null || VCARD_LIKE_DATE.matcher(value).matches(); - } - - /** - * Formats name fields of the form "Public;John;Q.;Reverend;III" into a form like - * "Reverend John Q. Public III". - * - * @param names name values to format, in place - */ - private static void formatNames(Iterable> names) { - if (names != null) { - for (List list : names) { - String name = list.get(0); - String[] components = new String[5]; - int start = 0; - int end; - int componentIndex = 0; - while (componentIndex < components.length - 1 && (end = name.indexOf(';', start)) >= 0) { - components[componentIndex] = name.substring(start, end); - componentIndex++; - start = end + 1; - } - components[componentIndex] = name.substring(start); - StringBuilder newName = new StringBuilder(100); - maybeAppendComponent(components, 3, newName); - maybeAppendComponent(components, 1, newName); - maybeAppendComponent(components, 2, newName); - maybeAppendComponent(components, 0, newName); - maybeAppendComponent(components, 4, newName); - list.set(0, newName.toString().trim()); - } - } - } - - private static void maybeAppendComponent(String[] components, int i, StringBuilder newName) { - if (components[i] != null && !components[i].isEmpty()) { - if (newName.length() > 0) { - newName.append(' '); - } - newName.append(components[i]); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/VEventResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/VEventResultParser.java deleted file mode 100644 index f6b2f39..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/VEventResultParser.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -import java.util.List; - -/** - * Partially implements the iCalendar format's "VEVENT" format for specifying a - * calendar event. See RFC 2445. This supports SUMMARY, LOCATION, GEO, DTSTART and DTEND fields. - * - * @author Sean Owen - */ -public final class VEventResultParser extends ResultParser { - - @Override - public CalendarParsedResult parse(Result result) { - String rawText = getMassagedText(result); - int vEventStart = rawText.indexOf("BEGIN:VEVENT"); - if (vEventStart < 0) { - return null; - } - - String summary = matchSingleVCardPrefixedField("SUMMARY", rawText, true); - String start = matchSingleVCardPrefixedField("DTSTART", rawText, true); - if (start == null) { - return null; - } - String end = matchSingleVCardPrefixedField("DTEND", rawText, true); - String duration = matchSingleVCardPrefixedField("DURATION", rawText, true); - String location = matchSingleVCardPrefixedField("LOCATION", rawText, true); - String organizer = stripMailto(matchSingleVCardPrefixedField("ORGANIZER", rawText, true)); - - String[] attendees = matchVCardPrefixedField("ATTENDEE", rawText, true); - if (attendees != null) { - for (int i = 0; i < attendees.length; i++) { - attendees[i] = stripMailto(attendees[i]); - } - } - String description = matchSingleVCardPrefixedField("DESCRIPTION", rawText, true); - - String geoString = matchSingleVCardPrefixedField("GEO", rawText, true); - double latitude; - double longitude; - if (geoString == null) { - latitude = Double.NaN; - longitude = Double.NaN; - } else { - int semicolon = geoString.indexOf(';'); - if (semicolon < 0) { - return null; - } - try { - latitude = Double.parseDouble(geoString.substring(0, semicolon)); - longitude = Double.parseDouble(geoString.substring(semicolon + 1)); - } catch (NumberFormatException ignored) { - return null; - } - } - - try { - return new CalendarParsedResult(summary, - start, - end, - duration, - location, - organizer, - attendees, - description, - latitude, - longitude); - } catch (IllegalArgumentException ignored) { - return null; - } - } - - private static String matchSingleVCardPrefixedField(CharSequence prefix, - String rawText, - boolean trim) { - List values = VCardResultParser.matchSingleVCardPrefixedField(prefix, rawText, trim, false); - return values == null || values.isEmpty() ? null : values.get(0); - } - - private static String[] matchVCardPrefixedField(CharSequence prefix, String rawText, boolean trim) { - List> values = VCardResultParser.matchVCardPrefixedField(prefix, rawText, trim, false); - if (values == null || values.isEmpty()) { - return null; - } - int size = values.size(); - String[] result = new String[size]; - for (int i = 0; i < size; i++) { - result[i] = values.get(i).get(0); - } - return result; - } - - private static String stripMailto(String s) { - if (s != null && (s.startsWith("mailto:") || s.startsWith("MAILTO:"))) { - s = s.substring(7); - } - return s; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/VINParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/VINParsedResult.java deleted file mode 100644 index 79f722d..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/VINParsedResult.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2014 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes a Vehicle Identification Number (VIN). - */ -public final class VINParsedResult extends ParsedResult { - - private final String vin; - private final String worldManufacturerID; - private final String vehicleDescriptorSection; - private final String vehicleIdentifierSection; - private final String countryCode; - private final String vehicleAttributes; - private final int modelYear; - private final char plantCode; - private final String sequentialNumber; - - public VINParsedResult(String vin, - String worldManufacturerID, - String vehicleDescriptorSection, - String vehicleIdentifierSection, - String countryCode, - String vehicleAttributes, - int modelYear, - char plantCode, - String sequentialNumber) { - super(ParsedResultType.VIN); - this.vin = vin; - this.worldManufacturerID = worldManufacturerID; - this.vehicleDescriptorSection = vehicleDescriptorSection; - this.vehicleIdentifierSection = vehicleIdentifierSection; - this.countryCode = countryCode; - this.vehicleAttributes = vehicleAttributes; - this.modelYear = modelYear; - this.plantCode = plantCode; - this.sequentialNumber = sequentialNumber; - } - - public String getVIN() { - return vin; - } - - public String getWorldManufacturerID() { - return worldManufacturerID; - } - - public String getVehicleDescriptorSection() { - return vehicleDescriptorSection; - } - - public String getVehicleIdentifierSection() { - return vehicleIdentifierSection; - } - - public String getCountryCode() { - return countryCode; - } - - public String getVehicleAttributes() { - return vehicleAttributes; - } - - public int getModelYear() { - return modelYear; - } - - public char getPlantCode() { - return plantCode; - } - - public String getSequentialNumber() { - return sequentialNumber; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(50); - result.append(worldManufacturerID).append(' '); - result.append(vehicleDescriptorSection).append(' '); - result.append(vehicleIdentifierSection).append('\n'); - if (countryCode != null) { - result.append(countryCode).append(' '); - } - result.append(modelYear).append(' '); - result.append(plantCode).append(' '); - result.append(sequentialNumber).append('\n'); - return result.toString(); - } -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/VINResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/VINResultParser.java deleted file mode 100644 index 0d1314c..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/VINResultParser.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright 2014 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.Result; - -import java.util.regex.Pattern; - -/** - * Detects a result that is likely a vehicle identification number. - * - * @author Sean Owen - */ -public final class VINResultParser extends ResultParser { - - private static final Pattern IOQ = Pattern.compile("[IOQ]"); - private static final Pattern AZ09 = Pattern.compile("[A-Z0-9]{17}"); - - @Override - public VINParsedResult parse(Result result) { - if (result.getBarcodeFormat() != BarcodeFormat.CODE_39) { - return null; - } - String rawText = result.getText(); - rawText = IOQ.matcher(rawText).replaceAll("").trim(); - if (!AZ09.matcher(rawText).matches()) { - return null; - } - try { - if (!checkChecksum(rawText)) { - return null; - } - String wmi = rawText.substring(0, 3); - return new VINParsedResult(rawText, - wmi, - rawText.substring(3, 9), - rawText.substring(9, 17), - countryCode(wmi), - rawText.substring(3, 8), - modelYear(rawText.charAt(9)), - rawText.charAt(10), - rawText.substring(11)); - } catch (IllegalArgumentException iae) { - return null; - } - } - - private static boolean checkChecksum(CharSequence vin) { - int sum = 0; - for (int i = 0; i < vin.length(); i++) { - sum += vinPositionWeight(i + 1) * vinCharValue(vin.charAt(i)); - } - char checkChar = vin.charAt(8); - char expectedCheckChar = checkChar(sum % 11); - return checkChar == expectedCheckChar; - } - - private static int vinCharValue(char c) { - if (c >= 'A' && c <= 'I') { - return (c - 'A') + 1; - } - if (c >= 'J' && c <= 'R') { - return (c - 'J') + 1; - } - if (c >= 'S' && c <= 'Z') { - return (c - 'S') + 2; - } - if (c >= '0' && c <= '9') { - return c - '0'; - } - throw new IllegalArgumentException(); - } - - private static int vinPositionWeight(int position) { - if (position >= 1 && position <= 7) { - return 9 - position; - } - if (position == 8) { - return 10; - } - if (position == 9) { - return 0; - } - if (position >= 10 && position <= 17) { - return 19 - position; - } - throw new IllegalArgumentException(); - } - - private static char checkChar(int remainder) { - if (remainder < 10) { - return (char) ('0' + remainder); - } - if (remainder == 10) { - return 'X'; - } - throw new IllegalArgumentException(); - } - - private static int modelYear(char c) { - if (c >= 'E' && c <= 'H') { - return (c - 'E') + 1984; - } - if (c >= 'J' && c <= 'N') { - return (c - 'J') + 1988; - } - if (c == 'P') { - return 1993; - } - if (c >= 'R' && c <= 'T') { - return (c - 'R') + 1994; - } - if (c >= 'V' && c <= 'Y') { - return (c - 'V') + 1997; - } - if (c >= '1' && c <= '9') { - return (c - '1') + 2001; - } - if (c >= 'A' && c <= 'D') { - return (c - 'A') + 2010; - } - throw new IllegalArgumentException(); - } - - private static String countryCode(CharSequence wmi) { - char c1 = wmi.charAt(0); - char c2 = wmi.charAt(1); - switch (c1) { - case '1': - case '4': - case '5': - return "US"; - case '2': - return "CA"; - case '3': - if (c2 >= 'A' && c2 <= 'W') { - return "MX"; - } - break; - case '9': - if ((c2 >= 'A' && c2 <= 'E') || (c2 >= '3' && c2 <= '9')) { - return "BR"; - } - break; - case 'J': - if (c2 >= 'A' && c2 <= 'T') { - return "JP"; - } - break; - case 'K': - if (c2 >= 'L' && c2 <= 'R') { - return "KO"; - } - break; - case 'L': - return "CN"; - case 'M': - if (c2 >= 'A' && c2 <= 'E') { - return "IN"; - } - break; - case 'S': - if (c2 >= 'A' && c2 <= 'M') { - return "UK"; - } - if (c2 >= 'N' && c2 <= 'T') { - return "DE"; - } - break; - case 'V': - if (c2 >= 'F' && c2 <= 'R') { - return "FR"; - } - if (c2 >= 'S' && c2 <= 'W') { - return "ES"; - } - break; - case 'W': - return "DE"; - case 'X': - if (c2 == '0' || (c2 >= '3' && c2 <= '9')) { - return "RU"; - } - break; - case 'Z': - if (c2 >= 'A' && c2 <= 'R') { - return "IT"; - } - break; - } - return null; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/client/result/WifiParsedResult.java b/zxing/src/main/java/com/google/zxing/client/result/WifiParsedResult.java deleted file mode 100644 index 44c937a..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/WifiParsedResult.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -/** - * Represents a parsed result that encodes wifi network information, like SSID and password. - * - * @author Vikram Aggarwal - */ -public final class WifiParsedResult extends ParsedResult { - - private final String ssid; - private final String networkEncryption; - private final String password; - private final boolean hidden; - - public WifiParsedResult(String networkEncryption, String ssid, String password) { - this(networkEncryption, ssid, password, false); - } - - public WifiParsedResult(String networkEncryption, String ssid, String password, boolean hidden) { - super(ParsedResultType.WIFI); - this.ssid = ssid; - this.networkEncryption = networkEncryption; - this.password = password; - this.hidden = hidden; - } - - public String getSsid() { - return ssid; - } - - public String getNetworkEncryption() { - return networkEncryption; - } - - public String getPassword() { - return password; - } - - public boolean isHidden() { - return hidden; - } - - @Override - public String getDisplayResult() { - StringBuilder result = new StringBuilder(80); - maybeAppend(ssid, result); - maybeAppend(networkEncryption, result); - maybeAppend(password, result); - maybeAppend(Boolean.toString(hidden), result); - return result.toString(); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/client/result/WifiResultParser.java b/zxing/src/main/java/com/google/zxing/client/result/WifiResultParser.java deleted file mode 100644 index b62151c..0000000 --- a/zxing/src/main/java/com/google/zxing/client/result/WifiResultParser.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.client.result; - -import com.google.zxing.Result; - -/** - *

    Parses a WIFI configuration string. Strings will be of the form:

    - * - *

    {@code WIFI:T:[network type];S:[network SSID];P:[network password];H:[hidden?];;}

    - * - *

    The fields can appear in any order. Only "S:" is required.

    - * - * @author Vikram Aggarwal - * @author Sean Owen - */ -public final class WifiResultParser extends ResultParser { - - @Override - public WifiParsedResult parse(Result result) { - String rawText = getMassagedText(result); - if (!rawText.startsWith("WIFI:")) { - return null; - } - String ssid = matchSinglePrefixedField("S:", rawText, ';', false); - if (ssid == null || ssid.isEmpty()) { - return null; - } - String pass = matchSinglePrefixedField("P:", rawText, ';', false); - String type = matchSinglePrefixedField("T:", rawText, ';', false); - if (type == null) { - type = "nopass"; - } - boolean hidden = Boolean.parseBoolean(matchSinglePrefixedField("H:", rawText, ';', false)); - return new WifiParsedResult(type, ssid, pass, hidden); - } -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/common/BitArray.java b/zxing/src/main/java/com/google/zxing/common/BitArray.java deleted file mode 100644 index 2905b18..0000000 --- a/zxing/src/main/java/com/google/zxing/common/BitArray.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import java.util.Arrays; - -/** - *

    A simple, fast array of bits, represented compactly by an array of ints internally.

    - * - * @author Sean Owen - */ -public final class BitArray implements Cloneable { - - private int[] bits; - private int size; - - public BitArray() { - this.size = 0; - this.bits = new int[1]; - } - - public BitArray(int size) { - this.size = size; - this.bits = makeArray(size); - } - - // For testing only - BitArray(int[] bits, int size) { - this.bits = bits; - this.size = size; - } - - public int getSize() { - return size; - } - - public int getSizeInBytes() { - return (size + 7) / 8; - } - - private void ensureCapacity(int size) { - if (size > bits.length * 32) { - int[] newBits = makeArray(size); - System.arraycopy(bits, 0, newBits, 0, bits.length); - this.bits = newBits; - } - } - - /** - * @param i bit to get - * @return true iff bit i is set - */ - public boolean get(int i) { - return (bits[i / 32] & (1 << (i & 0x1F))) != 0; - } - - /** - * Sets bit i. - * - * @param i bit to set - */ - public void set(int i) { - bits[i / 32] |= 1 << (i & 0x1F); - } - - /** - * Flips bit i. - * - * @param i bit to set - */ - public void flip(int i) { - bits[i / 32] ^= 1 << (i & 0x1F); - } - - /** - * @param from first bit to check - * @return index of first bit that is set, starting from the given index, or size if none are set - * at or beyond this given index - * @see #getNextUnset(int) - */ - public int getNextSet(int from) { - if (from >= size) { - return size; - } - int bitsOffset = from / 32; - int currentBits = bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & 0x1F)) - 1); - while (currentBits == 0) { - if (++bitsOffset == bits.length) { - return size; - } - currentBits = bits[bitsOffset]; - } - int result = (bitsOffset * 32) + Integer.numberOfTrailingZeros(currentBits); - return result > size ? size : result; - } - - /** - * @param from index to start looking for unset bit - * @return index of next unset bit, or {@code size} if none are unset until the end - * @see #getNextSet(int) - */ - public int getNextUnset(int from) { - if (from >= size) { - return size; - } - int bitsOffset = from / 32; - int currentBits = ~bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & 0x1F)) - 1); - while (currentBits == 0) { - if (++bitsOffset == bits.length) { - return size; - } - currentBits = ~bits[bitsOffset]; - } - int result = (bitsOffset * 32) + Integer.numberOfTrailingZeros(currentBits); - return result > size ? size : result; - } - - /** - * Sets a block of 32 bits, starting at bit i. - * - * @param i first bit to set - * @param newBits the new value of the next 32 bits. Note again that the least-significant bit - * corresponds to bit i, the next-least-significant to i+1, and so on. - */ - public void setBulk(int i, int newBits) { - bits[i / 32] = newBits; - } - - /** - * Sets a range of bits. - * - * @param start start of range, inclusive. - * @param end end of range, exclusive - */ - public void setRange(int start, int end) { - if (end < start || start < 0 || end > size) { - throw new IllegalArgumentException(); - } - if (end == start) { - return; - } - end--; // will be easier to treat this as the last actually set bit -- inclusive - int firstInt = start / 32; - int lastInt = end / 32; - for (int i = firstInt; i <= lastInt; i++) { - int firstBit = i > firstInt ? 0 : start & 0x1F; - int lastBit = i < lastInt ? 31 : end & 0x1F; - // Ones from firstBit to lastBit, inclusive - int mask = (2 << lastBit) - (1 << firstBit); - bits[i] |= mask; - } - } - - /** - * Clears all bits (sets to false). - */ - public void clear() { - int max = bits.length; - for (int i = 0; i < max; i++) { - bits[i] = 0; - } - } - - /** - * Efficient method to check if a range of bits is set, or not set. - * - * @param start start of range, inclusive. - * @param end end of range, exclusive - * @param value if true, checks that bits in range are set, otherwise checks that they are not set - * @return true iff all bits are set or not set in range, according to value argument - * @throws IllegalArgumentException if end is less than start or the range is not contained in the array - */ - public boolean isRange(int start, int end, boolean value) { - if (end < start || start < 0 || end > size) { - throw new IllegalArgumentException(); - } - if (end == start) { - return true; // empty range matches - } - end--; // will be easier to treat this as the last actually set bit -- inclusive - int firstInt = start / 32; - int lastInt = end / 32; - for (int i = firstInt; i <= lastInt; i++) { - int firstBit = i > firstInt ? 0 : start & 0x1F; - int lastBit = i < lastInt ? 31 : end & 0x1F; - // Ones from firstBit to lastBit, inclusive - int mask = (2 << lastBit) - (1 << firstBit); - - // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, - // equals the mask, or we're looking for 0s and the masked portion is not all 0s - if ((bits[i] & mask) != (value ? mask : 0)) { - return false; - } - } - return true; - } - - public void appendBit(boolean bit) { - ensureCapacity(size + 1); - if (bit) { - bits[size / 32] |= 1 << (size & 0x1F); - } - size++; - } - - /** - * Appends the least-significant bits, from value, in order from most-significant to - * least-significant. For example, appending 6 bits from 0x000001E will append the bits - * 0, 1, 1, 1, 1, 0 in that order. - * - * @param value {@code int} containing bits to append - * @param numBits bits from value to append - */ - public void appendBits(int value, int numBits) { - if (numBits < 0 || numBits > 32) { - throw new IllegalArgumentException("Num bits must be between 0 and 32"); - } - ensureCapacity(size + numBits); - for (int numBitsLeft = numBits; numBitsLeft > 0; numBitsLeft--) { - appendBit(((value >> (numBitsLeft - 1)) & 0x01) == 1); - } - } - - public void appendBitArray(BitArray other) { - int otherSize = other.size; - ensureCapacity(size + otherSize); - for (int i = 0; i < otherSize; i++) { - appendBit(other.get(i)); - } - } - - public void xor(BitArray other) { - if (size != other.size) { - throw new IllegalArgumentException("Sizes don't match"); - } - for (int i = 0; i < bits.length; i++) { - // The last int could be incomplete (i.e. not have 32 bits in - // it) but there is no problem since 0 XOR 0 == 0. - bits[i] ^= other.bits[i]; - } - } - - /** - * - * @param bitOffset first bit to start writing - * @param array array to write into. Bytes are written most-significant byte first. This is the opposite - * of the internal representation, which is exposed by {@link #getBitArray()} - * @param offset position in array to start writing - * @param numBytes how many bytes to write - */ - public void toBytes(int bitOffset, byte[] array, int offset, int numBytes) { - for (int i = 0; i < numBytes; i++) { - int theByte = 0; - for (int j = 0; j < 8; j++) { - if (get(bitOffset)) { - theByte |= 1 << (7 - j); - } - bitOffset++; - } - array[offset + i] = (byte) theByte; - } - } - - /** - * @return underlying array of ints. The first element holds the first 32 bits, and the least - * significant bit is bit 0. - */ - public int[] getBitArray() { - return bits; - } - - /** - * Reverses all bits in the array. - */ - public void reverse() { - int[] newBits = new int[bits.length]; - // reverse all int's first - int len = (size - 1) / 32; - int oldBitsLen = len + 1; - for (int i = 0; i < oldBitsLen; i++) { - long x = (long) bits[i]; - x = ((x >> 1) & 0x55555555L) | ((x & 0x55555555L) << 1); - x = ((x >> 2) & 0x33333333L) | ((x & 0x33333333L) << 2); - x = ((x >> 4) & 0x0f0f0f0fL) | ((x & 0x0f0f0f0fL) << 4); - x = ((x >> 8) & 0x00ff00ffL) | ((x & 0x00ff00ffL) << 8); - x = ((x >> 16) & 0x0000ffffL) | ((x & 0x0000ffffL) << 16); - newBits[len - i] = (int) x; - } - // now correct the int's if the bit size isn't a multiple of 32 - if (size != oldBitsLen * 32) { - int leftOffset = oldBitsLen * 32 - size; - int currentInt = newBits[0] >>> leftOffset; - for (int i = 1; i < oldBitsLen; i++) { - int nextInt = newBits[i]; - currentInt |= nextInt << (32 - leftOffset); - newBits[i - 1] = currentInt; - currentInt = nextInt >>> leftOffset; - } - newBits[oldBitsLen - 1] = currentInt; - } - bits = newBits; - } - - private static int[] makeArray(int size) { - return new int[(size + 31) / 32]; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof BitArray)) { - return false; - } - BitArray other = (BitArray) o; - return size == other.size && Arrays.equals(bits, other.bits); - } - - @Override - public int hashCode() { - return 31 * size + Arrays.hashCode(bits); - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(size); - for (int i = 0; i < size; i++) { - if ((i & 0x07) == 0) { - result.append(' '); - } - result.append(get(i) ? 'X' : '.'); - } - return result.toString(); - } - - @Override - public BitArray clone() { - return new BitArray(bits.clone(), size); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/BitMatrix.java b/zxing/src/main/java/com/google/zxing/common/BitMatrix.java deleted file mode 100644 index 0bfb54d..0000000 --- a/zxing/src/main/java/com/google/zxing/common/BitMatrix.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import java.util.Arrays; - -/** - *

    Represents a 2D matrix of bits. In function arguments below, and throughout the common - * module, x is the column position, and y is the row position. The ordering is always x, y. - * The origin is at the top-left.

    - * - *

    Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins - * with a new int. This is done intentionally so that we can copy out a row into a BitArray very - * efficiently.

    - * - *

    The ordering of bits is row-major. Within each int, the least significant bits are used first, - * meaning they represent lower x values. This is compatible with BitArray's implementation.

    - * - * @author Sean Owen - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class BitMatrix implements Cloneable { - - private final int width; - private final int height; - private final int rowSize; - private final int[] bits; - - // A helper to construct a square matrix. - public BitMatrix(int dimension) { - this(dimension, dimension); - } - - public BitMatrix(int width, int height) { - if (width < 1 || height < 1) { - throw new IllegalArgumentException("Both dimensions must be greater than 0"); - } - this.width = width; - this.height = height; - this.rowSize = (width + 31) / 32; - bits = new int[rowSize * height]; - } - - private BitMatrix(int width, int height, int rowSize, int[] bits) { - this.width = width; - this.height = height; - this.rowSize = rowSize; - this.bits = bits; - } - - public static BitMatrix parse(String stringRepresentation, String setString, String unsetString) { - if (stringRepresentation == null) { - throw new IllegalArgumentException(); - } - - boolean[] bits = new boolean[stringRepresentation.length()]; - int bitsPos = 0; - int rowStartPos = 0; - int rowLength = -1; - int nRows = 0; - int pos = 0; - while (pos < stringRepresentation.length()) { - if (stringRepresentation.charAt(pos) == '\n' || - stringRepresentation.charAt(pos) == '\r') { - if (bitsPos > rowStartPos) { - if (rowLength == -1) { - rowLength = bitsPos - rowStartPos; - } else if (bitsPos - rowStartPos != rowLength) { - throw new IllegalArgumentException("row lengths do not match"); - } - rowStartPos = bitsPos; - nRows++; - } - pos++; - } else if (stringRepresentation.substring(pos, pos + setString.length()).equals(setString)) { - pos += setString.length(); - bits[bitsPos] = true; - bitsPos++; - } else if (stringRepresentation.substring(pos, pos + unsetString.length()).equals(unsetString)) { - pos += unsetString.length(); - bits[bitsPos] = false; - bitsPos++; - } else { - throw new IllegalArgumentException( - "illegal character encountered: " + stringRepresentation.substring(pos)); - } - } - - // no EOL at end? - if (bitsPos > rowStartPos) { - if (rowLength == -1) { - rowLength = bitsPos - rowStartPos; - } else if (bitsPos - rowStartPos != rowLength) { - throw new IllegalArgumentException("row lengths do not match"); - } - nRows++; - } - - BitMatrix matrix = new BitMatrix(rowLength, nRows); - for (int i = 0; i < bitsPos; i++) { - if (bits[i]) { - matrix.set(i % rowLength, i / rowLength); - } - } - return matrix; - } - - /** - *

    Gets the requested bit, where true means black.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - * @return value of given bit in matrix - */ - public boolean get(int x, int y) { - int offset = y * rowSize + (x / 32); - return ((bits[offset] >>> (x & 0x1f)) & 1) != 0; - } - - /** - *

    Sets the given bit to true.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - */ - public void set(int x, int y) { - int offset = y * rowSize + (x / 32); - bits[offset] |= 1 << (x & 0x1f); - } - - public void unset(int x, int y) { - int offset = y * rowSize + (x / 32); - bits[offset] &= ~(1 << (x & 0x1f)); - } - - /** - *

    Flips the given bit.

    - * - * @param x The horizontal component (i.e. which column) - * @param y The vertical component (i.e. which row) - */ - public void flip(int x, int y) { - int offset = y * rowSize + (x / 32); - bits[offset] ^= 1 << (x & 0x1f); - } - - /** - * Exclusive-or (XOR): Flip the bit in this {@code BitMatrix} if the corresponding - * mask bit is set. - * - * @param mask XOR mask - */ - public void xor(BitMatrix mask) { - if (width != mask.getWidth() || height != mask.getHeight() - || rowSize != mask.getRowSize()) { - throw new IllegalArgumentException("input matrix dimensions do not match"); - } - BitArray rowArray = new BitArray(width / 32 + 1); - for (int y = 0; y < height; y++) { - int offset = y * rowSize; - int[] row = mask.getRow(y, rowArray).getBitArray(); - for (int x = 0; x < rowSize; x++) { - bits[offset + x] ^= row[x]; - } - } - } - - /** - * Clears all bits (sets to false). - */ - public void clear() { - int max = bits.length; - for (int i = 0; i < max; i++) { - bits[i] = 0; - } - } - - /** - *

    Sets a square region of the bit matrix to true.

    - * - * @param left The horizontal position to begin at (inclusive) - * @param top The vertical position to begin at (inclusive) - * @param width The width of the region - * @param height The height of the region - */ - public void setRegion(int left, int top, int width, int height) { - if (top < 0 || left < 0) { - throw new IllegalArgumentException("Left and top must be nonnegative"); - } - if (height < 1 || width < 1) { - throw new IllegalArgumentException("Height and width must be at least 1"); - } - int right = left + width; - int bottom = top + height; - if (bottom > this.height || right > this.width) { - throw new IllegalArgumentException("The region must fit inside the matrix"); - } - for (int y = top; y < bottom; y++) { - int offset = y * rowSize; - for (int x = left; x < right; x++) { - bits[offset + (x / 32)] |= 1 << (x & 0x1f); - } - } - } - - /** - * A fast method to retrieve one row of data from the matrix as a BitArray. - * - * @param y The row to retrieve - * @param row An optional caller-allocated BitArray, will be allocated if null or too small - * @return The resulting BitArray - this reference should always be used even when passing - * your own row - */ - public BitArray getRow(int y, BitArray row) { - if (row == null || row.getSize() < width) { - row = new BitArray(width); - } else { - row.clear(); - } - int offset = y * rowSize; - for (int x = 0; x < rowSize; x++) { - row.setBulk(x * 32, bits[offset + x]); - } - return row; - } - - /** - * @param y row to set - * @param row {@link BitArray} to copy from - */ - public void setRow(int y, BitArray row) { - System.arraycopy(row.getBitArray(), 0, bits, y * rowSize, rowSize); - } - - /** - * Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees - */ - public void rotate180() { - int width = getWidth(); - int height = getHeight(); - BitArray topRow = new BitArray(width); - BitArray bottomRow = new BitArray(width); - for (int i = 0; i < (height + 1) / 2; i++) { - topRow = getRow(i, topRow); - bottomRow = getRow(height - 1 - i, bottomRow); - topRow.reverse(); - bottomRow.reverse(); - setRow(i, bottomRow); - setRow(height - 1 - i, topRow); - } - } - - /** - * This is useful in detecting the enclosing rectangle of a 'pure' barcode. - * - * @return {@code left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white - */ - public int[] getEnclosingRectangle() { - int left = width; - int top = height; - int right = -1; - int bottom = -1; - - for (int y = 0; y < height; y++) { - for (int x32 = 0; x32 < rowSize; x32++) { - int theBits = bits[y * rowSize + x32]; - if (theBits != 0) { - if (y < top) { - top = y; - } - if (y > bottom) { - bottom = y; - } - if (x32 * 32 < left) { - int bit = 0; - while ((theBits << (31 - bit)) == 0) { - bit++; - } - if ((x32 * 32 + bit) < left) { - left = x32 * 32 + bit; - } - } - if (x32 * 32 + 31 > right) { - int bit = 31; - while ((theBits >>> bit) == 0) { - bit--; - } - if ((x32 * 32 + bit) > right) { - right = x32 * 32 + bit; - } - } - } - } - } - - int width = right - left; - int height = bottom - top; - - if (width < 0 || height < 0) { - return null; - } - - return new int[] {left, top, width, height}; - } - - /** - * This is useful in detecting a corner of a 'pure' barcode. - * - * @return {@code x,y} coordinate of top-left-most 1 bit, or null if it is all white - */ - public int[] getTopLeftOnBit() { - int bitsOffset = 0; - while (bitsOffset < bits.length && bits[bitsOffset] == 0) { - bitsOffset++; - } - if (bitsOffset == bits.length) { - return null; - } - int y = bitsOffset / rowSize; - int x = (bitsOffset % rowSize) * 32; - - int theBits = bits[bitsOffset]; - int bit = 0; - while ((theBits << (31 - bit)) == 0) { - bit++; - } - x += bit; - return new int[] {x, y}; - } - - public int[] getBottomRightOnBit() { - int bitsOffset = bits.length - 1; - while (bitsOffset >= 0 && bits[bitsOffset] == 0) { - bitsOffset--; - } - if (bitsOffset < 0) { - return null; - } - - int y = bitsOffset / rowSize; - int x = (bitsOffset % rowSize) * 32; - - int theBits = bits[bitsOffset]; - int bit = 31; - while ((theBits >>> bit) == 0) { - bit--; - } - x += bit; - - return new int[] {x, y}; - } - - /** - * @return The width of the matrix - */ - public int getWidth() { - return width; - } - - /** - * @return The height of the matrix - */ - public int getHeight() { - return height; - } - - /** - * @return The row size of the matrix - */ - public int getRowSize() { - return rowSize; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof BitMatrix)) { - return false; - } - BitMatrix other = (BitMatrix) o; - return width == other.width && height == other.height && rowSize == other.rowSize && - Arrays.equals(bits, other.bits); - } - - @Override - public int hashCode() { - int hash = width; - hash = 31 * hash + width; - hash = 31 * hash + height; - hash = 31 * hash + rowSize; - hash = 31 * hash + Arrays.hashCode(bits); - return hash; - } - - /** - * @return string representation using "X" for set and " " for unset bits - */ - @Override - public String toString() { - return toString("X ", " "); - } - - /** - * @param setString representation of a set bit - * @param unsetString representation of an unset bit - * @return string representation of entire matrix utilizing given strings - */ - public String toString(String setString, String unsetString) { - return toString(setString, unsetString, "\n"); - } - - /** - * @param setString representation of a set bit - * @param unsetString representation of an unset bit - * @param lineSeparator newline character in string representation - * @return string representation of entire matrix utilizing given strings and line separator - * @deprecated call {@link #toString(String,String)} only, which uses \n line separator always - */ - @Deprecated - public String toString(String setString, String unsetString, String lineSeparator) { - StringBuilder result = new StringBuilder(height * (width + 1)); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - result.append(get(x, y) ? setString : unsetString); - } - result.append(lineSeparator); - } - return result.toString(); - } - - @Override - public BitMatrix clone() { - return new BitMatrix(width, height, rowSize, bits.clone()); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/BitSource.java b/zxing/src/main/java/com/google/zxing/common/BitSource.java deleted file mode 100644 index 45a3858..0000000 --- a/zxing/src/main/java/com/google/zxing/common/BitSource.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -/** - *

    This provides an easy abstraction to read bits at a time from a sequence of bytes, where the - * number of bits read is not often a multiple of 8.

    - * - *

    This class is thread-safe but not reentrant -- unless the caller modifies the bytes array - * it passed in, in which case all bets are off.

    - * - * @author Sean Owen - */ -public final class BitSource { - - private final byte[] bytes; - private int byteOffset; - private int bitOffset; - - /** - * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. - * Bits are read within a byte from most-significant to least-significant bit. - */ - public BitSource(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}. - */ - public int getBitOffset() { - return bitOffset; - } - - /** - * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. - */ - public int getByteOffset() { - return byteOffset; - } - - /** - * @param numBits number of bits to read - * @return int representing the bits read. The bits will appear as the least-significant - * bits of the int - * @throws IllegalArgumentException if numBits isn't in [1,32] or more than is available - */ - public int readBits(int numBits) { - if (numBits < 1 || numBits > 32 || numBits > available()) { - throw new IllegalArgumentException(String.valueOf(numBits)); - } - - int result = 0; - - // First, read remainder from current byte - if (bitOffset > 0) { - int bitsLeft = 8 - bitOffset; - int toRead = numBits < bitsLeft ? numBits : bitsLeft; - int bitsToNotRead = bitsLeft - toRead; - int mask = (0xFF >> (8 - toRead)) << bitsToNotRead; - result = (bytes[byteOffset] & mask) >> bitsToNotRead; - numBits -= toRead; - bitOffset += toRead; - if (bitOffset == 8) { - bitOffset = 0; - byteOffset++; - } - } - - // Next read whole bytes - if (numBits > 0) { - while (numBits >= 8) { - result = (result << 8) | (bytes[byteOffset] & 0xFF); - byteOffset++; - numBits -= 8; - } - - // Finally read a partial byte - if (numBits > 0) { - int bitsToNotRead = 8 - numBits; - int mask = (0xFF >> bitsToNotRead) << bitsToNotRead; - result = (result << numBits) | ((bytes[byteOffset] & mask) >> bitsToNotRead); - bitOffset += numBits; - } - } - - return result; - } - - /** - * @return number of bits that can be read successfully - */ - public int available() { - return 8 * (bytes.length - byteOffset) - bitOffset; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/CharacterSetECI.java b/zxing/src/main/java/com/google/zxing/common/CharacterSetECI.java deleted file mode 100644 index 7c3853c..0000000 --- a/zxing/src/main/java/com/google/zxing/common/CharacterSetECI.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.FormatException; - -import java.util.HashMap; -import java.util.Map; - -/** - * Encapsulates a Character Set ECI, according to "Extended Channel Interpretations" 5.3.1.1 - * of ISO 18004. - * - * @author Sean Owen - */ -public enum CharacterSetECI { - - // Enum name is a Java encoding valid for java.lang and java.io - Cp437(new int[]{0,2}), - ISO8859_1(new int[]{1,3}, "ISO-8859-1"), - ISO8859_2(4, "ISO-8859-2"), - ISO8859_3(5, "ISO-8859-3"), - ISO8859_4(6, "ISO-8859-4"), - ISO8859_5(7, "ISO-8859-5"), - ISO8859_6(8, "ISO-8859-6"), - ISO8859_7(9, "ISO-8859-7"), - ISO8859_8(10, "ISO-8859-8"), - ISO8859_9(11, "ISO-8859-9"), - ISO8859_10(12, "ISO-8859-10"), - ISO8859_11(13, "ISO-8859-11"), - ISO8859_13(15, "ISO-8859-13"), - ISO8859_14(16, "ISO-8859-14"), - ISO8859_15(17, "ISO-8859-15"), - ISO8859_16(18, "ISO-8859-16"), - SJIS(20, "Shift_JIS"), - Cp1250(21, "windows-1250"), - Cp1251(22, "windows-1251"), - Cp1252(23, "windows-1252"), - Cp1256(24, "windows-1256"), - UnicodeBigUnmarked(25, "UTF-16BE", "UnicodeBig"), - UTF8(26, "UTF-8"), - ASCII(new int[] {27, 170}, "US-ASCII"), - Big5(28), - GB18030(29, "GB2312", "EUC_CN", "GBK"), - EUC_KR(30, "EUC-KR"); - - private static final Map VALUE_TO_ECI = new HashMap<>(); - private static final Map NAME_TO_ECI = new HashMap<>(); - static { - for (CharacterSetECI eci : values()) { - for (int value : eci.values) { - VALUE_TO_ECI.put(value, eci); - } - NAME_TO_ECI.put(eci.name(), eci); - for (String name : eci.otherEncodingNames) { - NAME_TO_ECI.put(name, eci); - } - } - } - - private final int[] values; - private final String[] otherEncodingNames; - - CharacterSetECI(int value) { - this(new int[] {value}); - } - - CharacterSetECI(int value, String... otherEncodingNames) { - this.values = new int[] {value}; - this.otherEncodingNames = otherEncodingNames; - } - - CharacterSetECI(int[] values, String... otherEncodingNames) { - this.values = values; - this.otherEncodingNames = otherEncodingNames; - } - - public int getValue() { - return values[0]; - } - - /** - * @param value character set ECI value - * @return {@code CharacterSetECI} representing ECI of given value, or null if it is legal but - * unsupported - * @throws FormatException if ECI value is invalid - */ - public static CharacterSetECI getCharacterSetECIByValue(int value) throws FormatException { - if (value < 0 || value >= 900) { - throw FormatException.getFormatInstance(); - } - return VALUE_TO_ECI.get(value); - } - - /** - * @param name character set ECI encoding name - * @return CharacterSetECI representing ECI for character encoding, or null if it is legal - * but unsupported - */ - public static CharacterSetECI getCharacterSetECIByName(String name) { - return NAME_TO_ECI.get(name); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/DecoderResult.java b/zxing/src/main/java/com/google/zxing/common/DecoderResult.java deleted file mode 100644 index bfeaced..0000000 --- a/zxing/src/main/java/com/google/zxing/common/DecoderResult.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import java.util.List; - -/** - *

    Encapsulates the result of decoding a matrix of bits. This typically - * applies to 2D barcode formats. For now it contains the raw bytes obtained, - * as well as a String interpretation of those bytes, if applicable.

    - * - * @author Sean Owen - */ -public final class DecoderResult { - - private final byte[] rawBytes; - private final String text; - private final List byteSegments; - private final String ecLevel; - private Integer errorsCorrected; - private Integer erasures; - private Object other; - private final int structuredAppendParity; - private final int structuredAppendSequenceNumber; - - public DecoderResult(byte[] rawBytes, - String text, - List byteSegments, - String ecLevel) { - this(rawBytes, text, byteSegments, ecLevel, -1, -1); - } - - public DecoderResult(byte[] rawBytes, - String text, - List byteSegments, - String ecLevel, - int saSequence, - int saParity) { - this.rawBytes = rawBytes; - this.text = text; - this.byteSegments = byteSegments; - this.ecLevel = ecLevel; - this.structuredAppendParity = saParity; - this.structuredAppendSequenceNumber = saSequence; - } - - public byte[] getRawBytes() { - return rawBytes; - } - - public String getText() { - return text; - } - - public List getByteSegments() { - return byteSegments; - } - - public String getECLevel() { - return ecLevel; - } - - public Integer getErrorsCorrected() { - return errorsCorrected; - } - - public void setErrorsCorrected(Integer errorsCorrected) { - this.errorsCorrected = errorsCorrected; - } - - public Integer getErasures() { - return erasures; - } - - public void setErasures(Integer erasures) { - this.erasures = erasures; - } - - public Object getOther() { - return other; - } - - public void setOther(Object other) { - this.other = other; - } - - public boolean hasStructuredAppend() { - return structuredAppendParity >= 0 && structuredAppendSequenceNumber >= 0; - } - - public int getStructuredAppendParity() { - return structuredAppendParity; - } - - public int getStructuredAppendSequenceNumber() { - return structuredAppendSequenceNumber; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/common/DefaultGridSampler.java b/zxing/src/main/java/com/google/zxing/common/DefaultGridSampler.java deleted file mode 100644 index 0ef0fbe..0000000 --- a/zxing/src/main/java/com/google/zxing/common/DefaultGridSampler.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.NotFoundException; - -/** - * @author Sean Owen - */ -public final class DefaultGridSampler extends GridSampler { - - @Override - public BitMatrix sampleGrid(BitMatrix image, - int dimensionX, - int dimensionY, - float p1ToX, float p1ToY, - float p2ToX, float p2ToY, - float p3ToX, float p3ToY, - float p4ToX, float p4ToY, - float p1FromX, float p1FromY, - float p2FromX, float p2FromY, - float p3FromX, float p3FromY, - float p4FromX, float p4FromY) throws NotFoundException { - - PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral( - p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, - p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY); - - return sampleGrid(image, dimensionX, dimensionY, transform); - } - - @Override - public BitMatrix sampleGrid(BitMatrix image, - int dimensionX, - int dimensionY, - PerspectiveTransform transform) throws NotFoundException { - if (dimensionX <= 0 || dimensionY <= 0) { - throw NotFoundException.getNotFoundInstance(); - } - BitMatrix bits = new BitMatrix(dimensionX, dimensionY); - float[] points = new float[2 * dimensionX]; - for (int y = 0; y < dimensionY; y++) { - int max = points.length; - float iValue = (float) y + 0.5f; - for (int x = 0; x < max; x += 2) { - points[x] = (float) (x / 2) + 0.5f; - points[x + 1] = iValue; - } - transform.transformPoints(points); - // Quick check to see if points transformed to something inside the image; - // sufficient to check the endpoints - checkAndNudgePoints(image, points); - try { - for (int x = 0; x < max; x += 2) { - if (image.get((int) points[x], (int) points[x + 1])) { - // Black(-ish) pixel - bits.set(x / 2, y); - } - } - } catch (ArrayIndexOutOfBoundsException aioobe) { - // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting - // transform gets "twisted" such that it maps a straight line of points to a set of points - // whose endpoints are in bounds, but others are not. There is probably some mathematical - // way to detect this about the transformation that I don't know yet. - // This results in an ugly runtime exception despite our clever checks above -- can't have - // that. We could check each point's coordinates but that feels duplicative. We settle for - // catching and wrapping ArrayIndexOutOfBoundsException. - throw NotFoundException.getNotFoundInstance(); - } - } - return bits; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/DetectorResult.java b/zxing/src/main/java/com/google/zxing/common/DetectorResult.java deleted file mode 100644 index 0f3cf15..0000000 --- a/zxing/src/main/java/com/google/zxing/common/DetectorResult.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.ResultPoint; - -/** - *

    Encapsulates the result of detecting a barcode in an image. This includes the raw - * matrix of black/white pixels corresponding to the barcode, and possibly points of interest - * in the image, like the location of finder patterns or corners of the barcode in the image.

    - * - * @author Sean Owen - */ -public class DetectorResult { - - private final BitMatrix bits; - private final ResultPoint[] points; - - public DetectorResult(BitMatrix bits, ResultPoint[] points) { - this.bits = bits; - this.points = points; - } - - public final BitMatrix getBits() { - return bits; - } - - public final ResultPoint[] getPoints() { - return points; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java b/zxing/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java deleted file mode 100644 index 1856744..0000000 --- a/zxing/src/main/java/com/google/zxing/common/GlobalHistogramBinarizer.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.Binarizer; -import com.google.zxing.LuminanceSource; -import com.google.zxing.NotFoundException; - -/** - * This Binarizer implementation uses the old ZXing global histogram approach. It is suitable - * for low-end mobile devices which don't have enough CPU or memory to use a local thresholding - * algorithm. However, because it picks a global black point, it cannot handle difficult shadows - * and gradients. - * - * Faster mobile devices and all desktop applications should probably use HybridBinarizer instead. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ -public class GlobalHistogramBinarizer extends Binarizer { - - private static final int LUMINANCE_BITS = 5; - private static final int LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; - private static final int LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; - private static final byte[] EMPTY = new byte[0]; - - private byte[] luminances; - private final int[] buckets; - - public GlobalHistogramBinarizer(LuminanceSource source) { - super(source); - luminances = EMPTY; - buckets = new int[LUMINANCE_BUCKETS]; - } - - // Applies simple sharpening to the row data to improve performance of the 1D Readers. - @Override - public BitArray getBlackRow(int y, BitArray row) throws NotFoundException { - LuminanceSource source = getLuminanceSource(); - int width = source.getWidth(); - if (row == null || row.getSize() < width) { - row = new BitArray(width); - } else { - row.clear(); - } - - initArrays(width); - byte[] localLuminances = source.getRow(y, luminances); - int[] localBuckets = buckets; - for (int x = 0; x < width; x++) { - localBuckets[(localLuminances[x] & 0xff) >> LUMINANCE_SHIFT]++; - } - int blackPoint = estimateBlackPoint(localBuckets); - - if (width < 3) { - // Special case for very small images - for (int x = 0; x < width; x++) { - if ((localLuminances[x] & 0xff) < blackPoint) { - row.set(x); - } - } - } else { - int left = localLuminances[0] & 0xff; - int center = localLuminances[1] & 0xff; - for (int x = 1; x < width - 1; x++) { - int right = localLuminances[x + 1] & 0xff; - // A simple -1 4 -1 box filter with a weight of 2. - if (((center * 4) - left - right) / 2 < blackPoint) { - row.set(x); - } - left = center; - center = right; - } - } - return row; - } - - // Does not sharpen the data, as this call is intended to only be used by 2D Readers. - @Override - public BitMatrix getBlackMatrix() throws NotFoundException { - LuminanceSource source = getLuminanceSource(); - int width = source.getWidth(); - int height = source.getHeight(); - BitMatrix matrix = new BitMatrix(width, height); - - // Quickly calculates the histogram by sampling four rows from the image. This proved to be - // more robust on the blackbox tests than sampling a diagonal as we used to do. - initArrays(width); - int[] localBuckets = buckets; - for (int y = 1; y < 5; y++) { - int row = height * y / 5; - byte[] localLuminances = source.getRow(row, luminances); - int right = (width * 4) / 5; - for (int x = width / 5; x < right; x++) { - int pixel = localLuminances[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; - } - } - int blackPoint = estimateBlackPoint(localBuckets); - - // We delay reading the entire image luminance until the black point estimation succeeds. - // Although we end up reading four rows twice, it is consistent with our motto of - // "fail quickly" which is necessary for continuous scanning. - byte[] localLuminances = source.getMatrix(); - for (int y = 0; y < height; y++) { - int offset = y * width; - for (int x = 0; x < width; x++) { - int pixel = localLuminances[offset + x] & 0xff; - if (pixel < blackPoint) { - matrix.set(x, y); - } - } - } - - return matrix; - } - - @Override - public Binarizer createBinarizer(LuminanceSource source) { - return new GlobalHistogramBinarizer(source); - } - - private void initArrays(int luminanceSize) { - if (luminances.length < luminanceSize) { - luminances = new byte[luminanceSize]; - } - for (int x = 0; x < LUMINANCE_BUCKETS; x++) { - buckets[x] = 0; - } - } - - private static int estimateBlackPoint(int[] buckets) throws NotFoundException { - // Find the tallest peak in the histogram. - int numBuckets = buckets.length; - int maxBucketCount = 0; - int firstPeak = 0; - int firstPeakSize = 0; - for (int x = 0; x < numBuckets; x++) { - if (buckets[x] > firstPeakSize) { - firstPeak = x; - firstPeakSize = buckets[x]; - } - if (buckets[x] > maxBucketCount) { - maxBucketCount = buckets[x]; - } - } - - // Find the second-tallest peak which is somewhat far from the tallest peak. - int secondPeak = 0; - int secondPeakScore = 0; - for (int x = 0; x < numBuckets; x++) { - int distanceToBiggest = x - firstPeak; - // Encourage more distant second peaks by multiplying by square of distance. - int score = buckets[x] * distanceToBiggest * distanceToBiggest; - if (score > secondPeakScore) { - secondPeak = x; - secondPeakScore = score; - } - } - - // Make sure firstPeak corresponds to the black peak. - if (firstPeak > secondPeak) { - int temp = firstPeak; - firstPeak = secondPeak; - secondPeak = temp; - } - - // If there is too little contrast in the image to pick a meaningful black point, throw rather - // than waste time trying to decode the image, and risk false positives. - if (secondPeak - firstPeak <= numBuckets / 16) { - throw NotFoundException.getNotFoundInstance(); - } - - // Find a valley between them that is low and closer to the white peak. - int bestValley = secondPeak - 1; - int bestValleyScore = -1; - for (int x = secondPeak - 1; x > firstPeak; x--) { - int fromFirst = x - firstPeak; - int score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); - if (score > bestValleyScore) { - bestValley = x; - bestValleyScore = score; - } - } - - return bestValley << LUMINANCE_SHIFT; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/GridSampler.java b/zxing/src/main/java/com/google/zxing/common/GridSampler.java deleted file mode 100644 index 849588f..0000000 --- a/zxing/src/main/java/com/google/zxing/common/GridSampler.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.NotFoundException; - -/** - * Implementations of this class can, given locations of finder patterns for a QR code in an - * image, sample the right points in the image to reconstruct the QR code, accounting for - * perspective distortion. It is abstracted since it is relatively expensive and should be allowed - * to take advantage of platform-specific optimized implementations, like Sun's Java Advanced - * Imaging library, but which may not be available in other environments such as J2ME, and vice - * versa. - * - * The implementation used can be controlled by calling {@link #setGridSampler(GridSampler)} - * with an instance of a class which implements this interface. - * - * @author Sean Owen - */ -public abstract class GridSampler { - - private static GridSampler gridSampler = new DefaultGridSampler(); - - /** - * Sets the implementation of GridSampler used by the library. One global - * instance is stored, which may sound problematic. But, the implementation provided - * ought to be appropriate for the entire platform, and all uses of this library - * in the whole lifetime of the JVM. For instance, an Android activity can swap in - * an implementation that takes advantage of native platform libraries. - * - * @param newGridSampler The platform-specific object to install. - */ - public static void setGridSampler(GridSampler newGridSampler) { - gridSampler = newGridSampler; - } - - /** - * @return the current implementation of GridSampler - */ - public static GridSampler getInstance() { - return gridSampler; - } - - /** - * Samples an image for a rectangular matrix of bits of the given dimension. The sampling - * transformation is determined by the coordinates of 4 points, in the original and transformed - * image space. - * - * @param image image to sample - * @param dimensionX width of {@link BitMatrix} to sample from image - * @param dimensionY height of {@link BitMatrix} to sample from image - * @param p1ToX point 1 preimage X - * @param p1ToY point 1 preimage Y - * @param p2ToX point 2 preimage X - * @param p2ToY point 2 preimage Y - * @param p3ToX point 3 preimage X - * @param p3ToY point 3 preimage Y - * @param p4ToX point 4 preimage X - * @param p4ToY point 4 preimage Y - * @param p1FromX point 1 image X - * @param p1FromY point 1 image Y - * @param p2FromX point 2 image X - * @param p2FromY point 2 image Y - * @param p3FromX point 3 image X - * @param p3FromY point 3 image Y - * @param p4FromX point 4 image X - * @param p4FromY point 4 image Y - * @return {@link BitMatrix} representing a grid of points sampled from the image within a region - * defined by the "from" parameters - * @throws NotFoundException if image can't be sampled, for example, if the transformation defined - * by the given points is invalid or results in sampling outside the image boundaries - */ - public abstract BitMatrix sampleGrid(BitMatrix image, - int dimensionX, - int dimensionY, - float p1ToX, float p1ToY, - float p2ToX, float p2ToY, - float p3ToX, float p3ToY, - float p4ToX, float p4ToY, - float p1FromX, float p1FromY, - float p2FromX, float p2FromY, - float p3FromX, float p3FromY, - float p4FromX, float p4FromY) throws NotFoundException; - - public abstract BitMatrix sampleGrid(BitMatrix image, - int dimensionX, - int dimensionY, - PerspectiveTransform transform) throws NotFoundException; - - /** - *

    Checks a set of points that have been transformed to sample points on an image against - * the image's dimensions to see if the point are even within the image.

    - * - *

    This method will actually "nudge" the endpoints back onto the image if they are found to be - * barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder - * patterns in an image where the QR Code runs all the way to the image border.

    - * - *

    For efficiency, the method will check points from either end of the line until one is found - * to be within the image. Because the set of points are assumed to be linear, this is valid.

    - * - * @param image image into which the points should map - * @param points actual points in x1,y1,...,xn,yn form - * @throws NotFoundException if an endpoint is lies outside the image boundaries - */ - protected static void checkAndNudgePoints(BitMatrix image, - float[] points) throws NotFoundException { - int width = image.getWidth(); - int height = image.getHeight(); - // Check and nudge points from start until we see some that are OK: - boolean nudged = true; - for (int offset = 0; offset < points.length && nudged; offset += 2) { - int x = (int) points[offset]; - int y = (int) points[offset + 1]; - if (x < -1 || x > width || y < -1 || y > height) { - throw NotFoundException.getNotFoundInstance(); - } - nudged = false; - if (x == -1) { - points[offset] = 0.0f; - nudged = true; - } else if (x == width) { - points[offset] = width - 1; - nudged = true; - } - if (y == -1) { - points[offset + 1] = 0.0f; - nudged = true; - } else if (y == height) { - points[offset + 1] = height - 1; - nudged = true; - } - } - // Check and nudge points from end: - nudged = true; - for (int offset = points.length - 2; offset >= 0 && nudged; offset -= 2) { - int x = (int) points[offset]; - int y = (int) points[offset + 1]; - if (x < -1 || x > width || y < -1 || y > height) { - throw NotFoundException.getNotFoundInstance(); - } - nudged = false; - if (x == -1) { - points[offset] = 0.0f; - nudged = true; - } else if (x == width) { - points[offset] = width - 1; - nudged = true; - } - if (y == -1) { - points[offset + 1] = 0.0f; - nudged = true; - } else if (y == height) { - points[offset + 1] = height - 1; - nudged = true; - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/HybridBinarizer.java b/zxing/src/main/java/com/google/zxing/common/HybridBinarizer.java deleted file mode 100644 index de2934d..0000000 --- a/zxing/src/main/java/com/google/zxing/common/HybridBinarizer.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import com.google.zxing.Binarizer; -import com.google.zxing.LuminanceSource; -import com.google.zxing.NotFoundException; - -/** - * This class implements a local thresholding algorithm, which while slower than the - * GlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for - * high frequency images of barcodes with black data on white backgrounds. For this application, - * it does a much better job than a global blackpoint with severe shadows and gradients. - * However it tends to produce artifacts on lower frequency images and is therefore not - * a good general purpose binarizer for uses outside ZXing. - * - * This class extends GlobalHistogramBinarizer, using the older histogram approach for 1D readers, - * and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already - * inherently local, and only fails for horizontal gradients. We can revisit that problem later, - * but for now it was not a win to use local blocks for 1D. - * - * This Binarizer is the default for the unit tests and the recommended class for library users. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class HybridBinarizer extends GlobalHistogramBinarizer { - - // This class uses 5x5 blocks to compute local luminance, where each block is 8x8 pixels. - // So this is the smallest dimension in each axis we can accept. - private static final int BLOCK_SIZE_POWER = 3; - private static final int BLOCK_SIZE = 1 << BLOCK_SIZE_POWER; // ...0100...00 - private static final int BLOCK_SIZE_MASK = BLOCK_SIZE - 1; // ...0011...11 - private static final int MINIMUM_DIMENSION = BLOCK_SIZE * 5; - private static final int MIN_DYNAMIC_RANGE = 24; - - private BitMatrix matrix; - - public HybridBinarizer(LuminanceSource source) { - super(source); - } - - /** - * Calculates the final BitMatrix once for all requests. This could be called once from the - * constructor instead, but there are some advantages to doing it lazily, such as making - * profiling easier, and not doing heavy lifting when callers don't expect it. - */ - @Override - public BitMatrix getBlackMatrix() throws NotFoundException { - if (matrix != null) { - return matrix; - } - LuminanceSource source = getLuminanceSource(); - int width = source.getWidth(); - int height = source.getHeight(); - if (width >= MINIMUM_DIMENSION && height >= MINIMUM_DIMENSION) { - byte[] luminances = source.getMatrix(); - int subWidth = width >> BLOCK_SIZE_POWER; - if ((width & BLOCK_SIZE_MASK) != 0) { - subWidth++; - } - int subHeight = height >> BLOCK_SIZE_POWER; - if ((height & BLOCK_SIZE_MASK) != 0) { - subHeight++; - } - int[][] blackPoints = calculateBlackPoints(luminances, subWidth, subHeight, width, height); - - BitMatrix newMatrix = new BitMatrix(width, height); - calculateThresholdForBlock(luminances, subWidth, subHeight, width, height, blackPoints, newMatrix); - matrix = newMatrix; - } else { - // If the image is too small, fall back to the global histogram approach. - matrix = super.getBlackMatrix(); - } - return matrix; - } - - @Override - public Binarizer createBinarizer(LuminanceSource source) { - return new HybridBinarizer(source); - } - - /** - * For each block in the image, calculate the average black point using a 5x5 grid - * of the blocks around it. Also handles the corner cases (fractional blocks are computed based - * on the last pixels in the row/column which are also used in the previous block). - */ - private static void calculateThresholdForBlock(byte[] luminances, - int subWidth, - int subHeight, - int width, - int height, - int[][] blackPoints, - BitMatrix matrix) { - for (int y = 0; y < subHeight; y++) { - int yoffset = y << BLOCK_SIZE_POWER; - int maxYOffset = height - BLOCK_SIZE; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - for (int x = 0; x < subWidth; x++) { - int xoffset = x << BLOCK_SIZE_POWER; - int maxXOffset = width - BLOCK_SIZE; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - int left = cap(x, 2, subWidth - 3); - int top = cap(y, 2, subHeight - 3); - int sum = 0; - for (int z = -2; z <= 2; z++) { - int[] blackRow = blackPoints[top + z]; - sum += blackRow[left - 2] + blackRow[left - 1] + blackRow[left] + blackRow[left + 1] + blackRow[left + 2]; - } - int average = sum / 25; - thresholdBlock(luminances, xoffset, yoffset, average, width, matrix); - } - } - } - - private static int cap(int value, int min, int max) { - return value < min ? min : value > max ? max : value; - } - - /** - * Applies a single threshold to a block of pixels. - */ - private static void thresholdBlock(byte[] luminances, - int xoffset, - int yoffset, - int threshold, - int stride, - BitMatrix matrix) { - for (int y = 0, offset = yoffset * stride + xoffset; y < BLOCK_SIZE; y++, offset += stride) { - for (int x = 0; x < BLOCK_SIZE; x++) { - // Comparison needs to be <= so that black == 0 pixels are black even if the threshold is 0. - if ((luminances[offset + x] & 0xFF) <= threshold) { - matrix.set(xoffset + x, yoffset + y); - } - } - } - } - - /** - * Calculates a single black point for each block of pixels and saves it away. - * See the following thread for a discussion of this algorithm: - * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 - */ - private static int[][] calculateBlackPoints(byte[] luminances, - int subWidth, - int subHeight, - int width, - int height) { - int[][] blackPoints = new int[subHeight][subWidth]; - for (int y = 0; y < subHeight; y++) { - int yoffset = y << BLOCK_SIZE_POWER; - int maxYOffset = height - BLOCK_SIZE; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - for (int x = 0; x < subWidth; x++) { - int xoffset = x << BLOCK_SIZE_POWER; - int maxXOffset = width - BLOCK_SIZE; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - int sum = 0; - int min = 0xFF; - int max = 0; - for (int yy = 0, offset = yoffset * width + xoffset; yy < BLOCK_SIZE; yy++, offset += width) { - for (int xx = 0; xx < BLOCK_SIZE; xx++) { - int pixel = luminances[offset + xx] & 0xFF; - sum += pixel; - // still looking for good contrast - if (pixel < min) { - min = pixel; - } - if (pixel > max) { - max = pixel; - } - } - // short-circuit min/max tests once dynamic range is met - if (max - min > MIN_DYNAMIC_RANGE) { - // finish the rest of the rows quickly - for (yy++, offset += width; yy < BLOCK_SIZE; yy++, offset += width) { - for (int xx = 0; xx < BLOCK_SIZE; xx++) { - sum += luminances[offset + xx] & 0xFF; - } - } - } - } - - // The default estimate is the average of the values in the block. - int average = sum >> (BLOCK_SIZE_POWER * 2); - if (max - min <= MIN_DYNAMIC_RANGE) { - // If variation within the block is low, assume this is a block with only light or only - // dark pixels. In that case we do not want to use the average, as it would divide this - // low contrast area into black and white pixels, essentially creating data out of noise. - // - // The default assumption is that the block is light/background. Since no estimate for - // the level of dark pixels exists locally, use half the min for the block. - average = min / 2; - - if (y > 0 && x > 0) { - // Correct the "white background" assumption for blocks that have neighbors by comparing - // the pixels in this block to the previously calculated black points. This is based on - // the fact that dark barcode symbology is always surrounded by some amount of light - // background for which reasonable black point estimates were made. The bp estimated at - // the boundaries is used for the interior. - - // The (min < bp) is arbitrary but works better than other heuristics that were tried. - int averageNeighborBlackPoint = - (blackPoints[y - 1][x] + (2 * blackPoints[y][x - 1]) + blackPoints[y - 1][x - 1]) / 4; - if (min < averageNeighborBlackPoint) { - average = averageNeighborBlackPoint; - } - } - } - blackPoints[y][x] = average; - } - } - return blackPoints; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/PerspectiveTransform.java b/zxing/src/main/java/com/google/zxing/common/PerspectiveTransform.java deleted file mode 100644 index 8ddfa7f..0000000 --- a/zxing/src/main/java/com/google/zxing/common/PerspectiveTransform.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -/** - *

    This class implements a perspective transform in two dimensions. Given four source and four - * destination points, it will compute the transformation implied between them. The code is based - * directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56.

    - * - * @author Sean Owen - */ -public final class PerspectiveTransform { - - private final float a11; - private final float a12; - private final float a13; - private final float a21; - private final float a22; - private final float a23; - private final float a31; - private final float a32; - private final float a33; - - private PerspectiveTransform(float a11, float a21, float a31, - float a12, float a22, float a32, - float a13, float a23, float a33) { - this.a11 = a11; - this.a12 = a12; - this.a13 = a13; - this.a21 = a21; - this.a22 = a22; - this.a23 = a23; - this.a31 = a31; - this.a32 = a32; - this.a33 = a33; - } - - public static PerspectiveTransform quadrilateralToQuadrilateral(float x0, float y0, - float x1, float y1, - float x2, float y2, - float x3, float y3, - float x0p, float y0p, - float x1p, float y1p, - float x2p, float y2p, - float x3p, float y3p) { - - PerspectiveTransform qToS = quadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); - PerspectiveTransform sToQ = squareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); - return sToQ.times(qToS); - } - - public void transformPoints(float[] points) { - int max = points.length; - float a11 = this.a11; - float a12 = this.a12; - float a13 = this.a13; - float a21 = this.a21; - float a22 = this.a22; - float a23 = this.a23; - float a31 = this.a31; - float a32 = this.a32; - float a33 = this.a33; - for (int i = 0; i < max; i += 2) { - float x = points[i]; - float y = points[i + 1]; - float denominator = a13 * x + a23 * y + a33; - points[i] = (a11 * x + a21 * y + a31) / denominator; - points[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } - } - - public void transformPoints(float[] xValues, float[] yValues) { - int n = xValues.length; - for (int i = 0; i < n; i ++) { - float x = xValues[i]; - float y = yValues[i]; - float denominator = a13 * x + a23 * y + a33; - xValues[i] = (a11 * x + a21 * y + a31) / denominator; - yValues[i] = (a12 * x + a22 * y + a32) / denominator; - } - } - - public static PerspectiveTransform squareToQuadrilateral(float x0, float y0, - float x1, float y1, - float x2, float y2, - float x3, float y3) { - float dx3 = x0 - x1 + x2 - x3; - float dy3 = y0 - y1 + y2 - y3; - if (dx3 == 0.0f && dy3 == 0.0f) { - // Affine - return new PerspectiveTransform(x1 - x0, x2 - x1, x0, - y1 - y0, y2 - y1, y0, - 0.0f, 0.0f, 1.0f); - } else { - float dx1 = x1 - x2; - float dx2 = x3 - x2; - float dy1 = y1 - y2; - float dy2 = y3 - y2; - float denominator = dx1 * dy2 - dx2 * dy1; - float a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - float a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return new PerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, - y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, - a13, a23, 1.0f); - } - } - - public static PerspectiveTransform quadrilateralToSquare(float x0, float y0, - float x1, float y1, - float x2, float y2, - float x3, float y3) { - // Here, the adjoint serves as the inverse: - return squareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3).buildAdjoint(); - } - - PerspectiveTransform buildAdjoint() { - // Adjoint is the transpose of the cofactor matrix: - return new PerspectiveTransform(a22 * a33 - a23 * a32, - a23 * a31 - a21 * a33, - a21 * a32 - a22 * a31, - a13 * a32 - a12 * a33, - a11 * a33 - a13 * a31, - a12 * a31 - a11 * a32, - a12 * a23 - a13 * a22, - a13 * a21 - a11 * a23, - a11 * a22 - a12 * a21); - } - - PerspectiveTransform times(PerspectiveTransform other) { - return new PerspectiveTransform(a11 * other.a11 + a21 * other.a12 + a31 * other.a13, - a11 * other.a21 + a21 * other.a22 + a31 * other.a23, - a11 * other.a31 + a21 * other.a32 + a31 * other.a33, - a12 * other.a11 + a22 * other.a12 + a32 * other.a13, - a12 * other.a21 + a22 * other.a22 + a32 * other.a23, - a12 * other.a31 + a22 * other.a32 + a32 * other.a33, - a13 * other.a11 + a23 * other.a12 + a33 * other.a13, - a13 * other.a21 + a23 * other.a22 + a33 * other.a23, - a13 * other.a31 + a23 * other.a32 + a33 * other.a33); - - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/StringUtils.java b/zxing/src/main/java/com/google/zxing/common/StringUtils.java deleted file mode 100644 index 318df27..0000000 --- a/zxing/src/main/java/com/google/zxing/common/StringUtils.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common; - -import java.nio.charset.Charset; -import java.util.Map; - -import com.google.zxing.DecodeHintType; - -/** - * Common string-related functions. - * - * @author Sean Owen - * @author Alex Dupre - */ -public final class StringUtils { - - private static final String PLATFORM_DEFAULT_ENCODING = Charset.defaultCharset().name(); - public static final String SHIFT_JIS = "SJIS"; - public static final String GB2312 = "GB2312"; - private static final String EUC_JP = "EUC_JP"; - private static final String UTF8 = "UTF8"; - private static final String ISO88591 = "ISO8859_1"; - private static final boolean ASSUME_SHIFT_JIS = - SHIFT_JIS.equalsIgnoreCase(PLATFORM_DEFAULT_ENCODING) || - EUC_JP.equalsIgnoreCase(PLATFORM_DEFAULT_ENCODING); - - private StringUtils() {} - - /** - * @param bytes bytes encoding a string, whose encoding should be guessed - * @param hints decode hints if applicable - * @return name of guessed encoding; at the moment will only guess one of: - * {@link #SHIFT_JIS}, {@link #UTF8}, {@link #ISO88591}, or the platform - * default encoding if none of these can possibly be correct - */ - public static String guessEncoding(byte[] bytes, Map hints) { - if (hints != null && hints.containsKey(DecodeHintType.CHARACTER_SET)) { - return hints.get(DecodeHintType.CHARACTER_SET).toString(); - } - // For now, merely tries to distinguish ISO-8859-1, UTF-8 and Shift_JIS, - // which should be by far the most common encodings. - int length = bytes.length; - boolean canBeISO88591 = true; - boolean canBeShiftJIS = true; - boolean canBeUTF8 = true; - int utf8BytesLeft = 0; - //int utf8LowChars = 0; - int utf2BytesChars = 0; - int utf3BytesChars = 0; - int utf4BytesChars = 0; - int sjisBytesLeft = 0; - //int sjisLowChars = 0; - int sjisKatakanaChars = 0; - //int sjisDoubleBytesChars = 0; - int sjisCurKatakanaWordLength = 0; - int sjisCurDoubleBytesWordLength = 0; - int sjisMaxKatakanaWordLength = 0; - int sjisMaxDoubleBytesWordLength = 0; - //int isoLowChars = 0; - //int isoHighChars = 0; - int isoHighOther = 0; - - boolean utf8bom = bytes.length > 3 && - bytes[0] == (byte) 0xEF && - bytes[1] == (byte) 0xBB && - bytes[2] == (byte) 0xBF; - - for (int i = 0; - i < length && (canBeISO88591 || canBeShiftJIS || canBeUTF8); - i++) { - - int value = bytes[i] & 0xFF; - - // UTF-8 stuff - if (canBeUTF8) { - if (utf8BytesLeft > 0) { - if ((value & 0x80) == 0) { - canBeUTF8 = false; - } else { - utf8BytesLeft--; - } - } else if ((value & 0x80) != 0) { - if ((value & 0x40) == 0) { - canBeUTF8 = false; - } else { - utf8BytesLeft++; - if ((value & 0x20) == 0) { - utf2BytesChars++; - } else { - utf8BytesLeft++; - if ((value & 0x10) == 0) { - utf3BytesChars++; - } else { - utf8BytesLeft++; - if ((value & 0x08) == 0) { - utf4BytesChars++; - } else { - canBeUTF8 = false; - } - } - } - } - } //else { - //utf8LowChars++; - //} - } - - // ISO-8859-1 stuff - if (canBeISO88591) { - if (value > 0x7F && value < 0xA0) { - canBeISO88591 = false; - } else if (value > 0x9F) { - if (value < 0xC0 || value == 0xD7 || value == 0xF7) { - isoHighOther++; - } //else { - //isoHighChars++; - //} - } //else { - //isoLowChars++; - //} - } - - // Shift_JIS stuff - if (canBeShiftJIS) { - if (sjisBytesLeft > 0) { - if (value < 0x40 || value == 0x7F || value > 0xFC) { - canBeShiftJIS = false; - } else { - sjisBytesLeft--; - } - } else if (value == 0x80 || value == 0xA0 || value > 0xEF) { - canBeShiftJIS = false; - } else if (value > 0xA0 && value < 0xE0) { - sjisKatakanaChars++; - sjisCurDoubleBytesWordLength = 0; - sjisCurKatakanaWordLength++; - if (sjisCurKatakanaWordLength > sjisMaxKatakanaWordLength) { - sjisMaxKatakanaWordLength = sjisCurKatakanaWordLength; - } - } else if (value > 0x7F) { - sjisBytesLeft++; - //sjisDoubleBytesChars++; - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength++; - if (sjisCurDoubleBytesWordLength > sjisMaxDoubleBytesWordLength) { - sjisMaxDoubleBytesWordLength = sjisCurDoubleBytesWordLength; - } - } else { - //sjisLowChars++; - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength = 0; - } - } - } - - if (canBeUTF8 && utf8BytesLeft > 0) { - canBeUTF8 = false; - } - if (canBeShiftJIS && sjisBytesLeft > 0) { - canBeShiftJIS = false; - } - - // Easy -- if there is BOM or at least 1 valid not-single byte character (and no evidence it can't be UTF-8), done - if (canBeUTF8 && (utf8bom || utf2BytesChars + utf3BytesChars + utf4BytesChars > 0)) { - return UTF8; - } - // Easy -- if assuming Shift_JIS or at least 3 valid consecutive not-ascii characters (and no evidence it can't be), done - if (canBeShiftJIS && (ASSUME_SHIFT_JIS || sjisMaxKatakanaWordLength >= 3 || sjisMaxDoubleBytesWordLength >= 3)) { - return SHIFT_JIS; - } - // Distinguishing Shift_JIS and ISO-8859-1 can be a little tough for short words. The crude heuristic is: - // - If we saw - // - only two consecutive katakana chars in the whole text, or - // - at least 10% of bytes that could be "upper" not-alphanumeric Latin1, - // - then we conclude Shift_JIS, else ISO-8859-1 - if (canBeISO88591 && canBeShiftJIS) { - return (sjisMaxKatakanaWordLength == 2 && sjisKatakanaChars == 2) || isoHighOther * 10 >= length - ? SHIFT_JIS : ISO88591; - } - - // Otherwise, try in order ISO-8859-1, Shift JIS, UTF-8 and fall back to default platform encoding - if (canBeISO88591) { - return ISO88591; - } - if (canBeShiftJIS) { - return SHIFT_JIS; - } - if (canBeUTF8) { - return UTF8; - } - // Otherwise, we take a wild guess with platform encoding - return PLATFORM_DEFAULT_ENCODING; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/detector/MathUtils.java b/zxing/src/main/java/com/google/zxing/common/detector/MathUtils.java deleted file mode 100644 index ec7080d..0000000 --- a/zxing/src/main/java/com/google/zxing/common/detector/MathUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.detector; - -/** - * General math-related and numeric utility functions. - */ -public final class MathUtils { - - private MathUtils() { - } - - /** - * Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its - * argument to the nearest int, where x.5 rounds up to x+1. Semantics of this shortcut - * differ slightly from {@link Math#round(float)} in that half rounds down for negative - * values. -2.5 rounds to -3, not -2. For purposes here it makes no difference. - * - * @param d real value to round - * @return nearest {@code int} - */ - public static int round(float d) { - return (int) (d + (d < 0.0f ? -0.5f : 0.5f)); - } - - /** - * @param aX point A x coordinate - * @param aY point A y coordinate - * @param bX point B x coordinate - * @param bY point B y coordinate - * @return Euclidean distance between points A and B - */ - public static float distance(float aX, float aY, float bX, float bY) { - float xDiff = aX - bX; - float yDiff = aY - bY; - return (float) Math.sqrt(xDiff * xDiff + yDiff * yDiff); - } - - /** - * @param aX point A x coordinate - * @param aY point A y coordinate - * @param bX point B x coordinate - * @param bY point B y coordinate - * @return Euclidean distance between points A and B - */ - public static float distance(int aX, int aY, int bX, int bY) { - int xDiff = aX - bX; - int yDiff = aY - bY; - return (float) Math.sqrt(xDiff * xDiff + yDiff * yDiff); - } - - /** - * @param array values to sum - * @return sum of values in array - */ - public static int sum(int[] array) { - int count = 0; - for (int a : array) { - count += a; - } - return count; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/detector/MonochromeRectangleDetector.java b/zxing/src/main/java/com/google/zxing/common/detector/MonochromeRectangleDetector.java deleted file mode 100644 index 6f58452..0000000 --- a/zxing/src/main/java/com/google/zxing/common/detector/MonochromeRectangleDetector.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.detector; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; - -/** - *

    A somewhat generic detector that looks for a barcode-like rectangular region within an image. - * It looks within a mostly white region of an image for a region of black and white, but mostly - * black. It returns the four corners of the region, as best it can determine.

    - * - * @author Sean Owen - */ -public final class MonochromeRectangleDetector { - - private static final int MAX_MODULES = 32; - - private final BitMatrix image; - - public MonochromeRectangleDetector(BitMatrix image) { - this.image = image; - } - - /** - *

    Detects a rectangular region of black and white -- mostly black -- with a region of mostly - * white, in an image.

    - * - * @return {@link ResultPoint}[] describing the corners of the rectangular region. The first and - * last points are opposed on the diagonal, as are the second and third. The first point will be - * the topmost point and the last, the bottommost. The second point will be leftmost and the - * third, the rightmost - * @throws NotFoundException if no Data Matrix Code can be found - */ - public ResultPoint[] detect() throws NotFoundException { - int height = image.getHeight(); - int width = image.getWidth(); - int halfHeight = height / 2; - int halfWidth = width / 2; - int deltaY = Math.max(1, height / (MAX_MODULES * 8)); - int deltaX = Math.max(1, width / (MAX_MODULES * 8)); - - int top = 0; - int bottom = height; - int left = 0; - int right = width; - ResultPoint pointA = findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, -deltaY, top, bottom, halfWidth / 2); - top = (int) pointA.getY() - 1; - ResultPoint pointB = findCornerFromCenter(halfWidth, -deltaX, left, right, - halfHeight, 0, top, bottom, halfHeight / 2); - left = (int) pointB.getX() - 1; - ResultPoint pointC = findCornerFromCenter(halfWidth, deltaX, left, right, - halfHeight, 0, top, bottom, halfHeight / 2); - right = (int) pointC.getX() + 1; - ResultPoint pointD = findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, deltaY, top, bottom, halfWidth / 2); - bottom = (int) pointD.getY() + 1; - - // Go try to find point A again with better information -- might have been off at first. - pointA = findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, -deltaY, top, bottom, halfWidth / 4); - - return new ResultPoint[] { pointA, pointB, pointC, pointD }; - } - - /** - * Attempts to locate a corner of the barcode by scanning up, down, left or right from a center - * point which should be within the barcode. - * - * @param centerX center's x component (horizontal) - * @param deltaX same as deltaY but change in x per step instead - * @param left minimum value of x - * @param right maximum value of x - * @param centerY center's y component (vertical) - * @param deltaY change in y per step. If scanning up this is negative; down, positive; - * left or right, 0 - * @param top minimum value of y to search through (meaningless when di == 0) - * @param bottom maximum value of y - * @param maxWhiteRun maximum run of white pixels that can still be considered to be within - * the barcode - * @return a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found - * @throws NotFoundException if such a point cannot be found - */ - private ResultPoint findCornerFromCenter(int centerX, - int deltaX, - int left, - int right, - int centerY, - int deltaY, - int top, - int bottom, - int maxWhiteRun) throws NotFoundException { - int[] lastRange = null; - for (int y = centerY, x = centerX; - y < bottom && y >= top && x < right && x >= left; - y += deltaY, x += deltaX) { - int[] range; - if (deltaX == 0) { - // horizontal slices, up and down - range = blackWhiteRange(y, maxWhiteRun, left, right, true); - } else { - // vertical slices, left and right - range = blackWhiteRange(x, maxWhiteRun, top, bottom, false); - } - if (range == null) { - if (lastRange == null) { - throw NotFoundException.getNotFoundInstance(); - } - // lastRange was found - if (deltaX == 0) { - int lastY = y - deltaY; - if (lastRange[0] < centerX) { - if (lastRange[1] > centerX) { - // straddle, choose one or the other based on direction - return new ResultPoint(lastRange[deltaY > 0 ? 0 : 1], lastY); - } - return new ResultPoint(lastRange[0], lastY); - } else { - return new ResultPoint(lastRange[1], lastY); - } - } else { - int lastX = x - deltaX; - if (lastRange[0] < centerY) { - if (lastRange[1] > centerY) { - return new ResultPoint(lastX, lastRange[deltaX < 0 ? 0 : 1]); - } - return new ResultPoint(lastX, lastRange[0]); - } else { - return new ResultPoint(lastX, lastRange[1]); - } - } - } - lastRange = range; - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Computes the start and end of a region of pixels, either horizontally or vertically, that could - * be part of a Data Matrix barcode. - * - * @param fixedDimension if scanning horizontally, this is the row (the fixed vertical location) - * where we are scanning. If scanning vertically it's the column, the fixed horizontal location - * @param maxWhiteRun largest run of white pixels that can still be considered part of the - * barcode region - * @param minDim minimum pixel location, horizontally or vertically, to consider - * @param maxDim maximum pixel location, horizontally or vertically, to consider - * @param horizontal if true, we're scanning left-right, instead of up-down - * @return int[] with start and end of found range, or null if no such range is found - * (e.g. only white was found) - */ - private int[] blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, boolean horizontal) { - - int center = (minDim + maxDim) / 2; - - // Scan left/up first - int start = center; - while (start >= minDim) { - if (horizontal ? image.get(start, fixedDimension) : image.get(fixedDimension, start)) { - start--; - } else { - int whiteRunStart = start; - do { - start--; - } while (start >= minDim && !(horizontal ? image.get(start, fixedDimension) : - image.get(fixedDimension, start))); - int whiteRunSize = whiteRunStart - start; - if (start < minDim || whiteRunSize > maxWhiteRun) { - start = whiteRunStart; - break; - } - } - } - start++; - - // Then try right/down - int end = center; - while (end < maxDim) { - if (horizontal ? image.get(end, fixedDimension) : image.get(fixedDimension, end)) { - end++; - } else { - int whiteRunStart = end; - do { - end++; - } while (end < maxDim && !(horizontal ? image.get(end, fixedDimension) : - image.get(fixedDimension, end))); - int whiteRunSize = end - whiteRunStart; - if (end >= maxDim || whiteRunSize > maxWhiteRun) { - end = whiteRunStart; - break; - } - } - } - end--; - - return end > start ? new int[]{start, end} : null; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java b/zxing/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java deleted file mode 100644 index 9e0cce0..0000000 --- a/zxing/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.detector; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; - -/** - *

    - * Detects a candidate barcode-like rectangular region within an image. It - * starts around the center of the image, increases the size of the candidate - * region until it finds a white rectangular region. By keeping track of the - * last black points it encountered, it determines the corners of the barcode. - *

    - * - * @author David Olivier - */ -public final class WhiteRectangleDetector { - - private static final int INIT_SIZE = 10; - private static final int CORR = 1; - - private final BitMatrix image; - private final int height; - private final int width; - private final int leftInit; - private final int rightInit; - private final int downInit; - private final int upInit; - - public WhiteRectangleDetector(BitMatrix image) throws NotFoundException { - this(image, INIT_SIZE, image.getWidth() / 2, image.getHeight() / 2); - } - - /** - * @param image barcode image to find a rectangle in - * @param initSize initial size of search area around center - * @param x x position of search center - * @param y y position of search center - * @throws NotFoundException if image is too small to accommodate {@code initSize} - */ - public WhiteRectangleDetector(BitMatrix image, int initSize, int x, int y) throws NotFoundException { - this.image = image; - height = image.getHeight(); - width = image.getWidth(); - int halfsize = initSize / 2; - leftInit = x - halfsize; - rightInit = x + halfsize; - upInit = y - halfsize; - downInit = y + halfsize; - if (upInit < 0 || leftInit < 0 || downInit >= height || rightInit >= width) { - throw NotFoundException.getNotFoundInstance(); - } - } - - /** - *

    - * Detects a candidate barcode-like rectangular region within an image. It - * starts around the center of the image, increases the size of the candidate - * region until it finds a white rectangular region. - *

    - * - * @return {@link ResultPoint}[] describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - * @throws NotFoundException if no Data Matrix Code can be found - */ - public ResultPoint[] detect() throws NotFoundException { - - int left = leftInit; - int right = rightInit; - int up = upInit; - int down = downInit; - boolean sizeExceeded = false; - boolean aBlackPointFoundOnBorder = true; - boolean atLeastOneBlackPointFoundOnBorder = false; - - boolean atLeastOneBlackPointFoundOnRight = false; - boolean atLeastOneBlackPointFoundOnBottom = false; - boolean atLeastOneBlackPointFoundOnLeft = false; - boolean atLeastOneBlackPointFoundOnTop = false; - - while (aBlackPointFoundOnBorder) { - - aBlackPointFoundOnBorder = false; - - // ..... - // . | - // ..... - boolean rightBorderNotWhite = true; - while ((rightBorderNotWhite || !atLeastOneBlackPointFoundOnRight) && right < width) { - rightBorderNotWhite = containsBlackPoint(up, down, right, false); - if (rightBorderNotWhite) { - right++; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnRight = true; - } else if (!atLeastOneBlackPointFoundOnRight) { - right++; - } - } - - if (right >= width) { - sizeExceeded = true; - break; - } - - // ..... - // . . - // .___. - boolean bottomBorderNotWhite = true; - while ((bottomBorderNotWhite || !atLeastOneBlackPointFoundOnBottom) && down < height) { - bottomBorderNotWhite = containsBlackPoint(left, right, down, true); - if (bottomBorderNotWhite) { - down++; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnBottom = true; - } else if (!atLeastOneBlackPointFoundOnBottom) { - down++; - } - } - - if (down >= height) { - sizeExceeded = true; - break; - } - - // ..... - // | . - // ..... - boolean leftBorderNotWhite = true; - while ((leftBorderNotWhite || !atLeastOneBlackPointFoundOnLeft) && left >= 0) { - leftBorderNotWhite = containsBlackPoint(up, down, left, false); - if (leftBorderNotWhite) { - left--; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnLeft = true; - } else if (!atLeastOneBlackPointFoundOnLeft) { - left--; - } - } - - if (left < 0) { - sizeExceeded = true; - break; - } - - // .___. - // . . - // ..... - boolean topBorderNotWhite = true; - while ((topBorderNotWhite || !atLeastOneBlackPointFoundOnTop) && up >= 0) { - topBorderNotWhite = containsBlackPoint(left, right, up, true); - if (topBorderNotWhite) { - up--; - aBlackPointFoundOnBorder = true; - atLeastOneBlackPointFoundOnTop = true; - } else if (!atLeastOneBlackPointFoundOnTop) { - up--; - } - } - - if (up < 0) { - sizeExceeded = true; - break; - } - - if (aBlackPointFoundOnBorder) { - atLeastOneBlackPointFoundOnBorder = true; - } - - } - - if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { - - int maxSize = right - left; - - ResultPoint z = null; - for (int i = 1; i < maxSize; i++) { - z = getBlackPointOnSegment(left, down - i, left + i, down); - if (z != null) { - break; - } - } - - if (z == null) { - throw NotFoundException.getNotFoundInstance(); - } - - ResultPoint t = null; - //go down right - for (int i = 1; i < maxSize; i++) { - t = getBlackPointOnSegment(left, up + i, left + i, up); - if (t != null) { - break; - } - } - - if (t == null) { - throw NotFoundException.getNotFoundInstance(); - } - - ResultPoint x = null; - //go down left - for (int i = 1; i < maxSize; i++) { - x = getBlackPointOnSegment(right, up + i, right - i, up); - if (x != null) { - break; - } - } - - if (x == null) { - throw NotFoundException.getNotFoundInstance(); - } - - ResultPoint y = null; - //go up left - for (int i = 1; i < maxSize; i++) { - y = getBlackPointOnSegment(right, down - i, right - i, down); - if (y != null) { - break; - } - } - - if (y == null) { - throw NotFoundException.getNotFoundInstance(); - } - - return centerEdges(y, z, x, t); - - } else { - throw NotFoundException.getNotFoundInstance(); - } - } - - private ResultPoint getBlackPointOnSegment(float aX, float aY, float bX, float bY) { - int dist = MathUtils.round(MathUtils.distance(aX, aY, bX, bY)); - float xStep = (bX - aX) / dist; - float yStep = (bY - aY) / dist; - - for (int i = 0; i < dist; i++) { - int x = MathUtils.round(aX + i * xStep); - int y = MathUtils.round(aY + i * yStep); - if (image.get(x, y)) { - return new ResultPoint(x, y); - } - } - return null; - } - - /** - * recenters the points of a constant distance towards the center - * - * @param y bottom most point - * @param z left most point - * @param x right most point - * @param t top most point - * @return {@link ResultPoint}[] describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - */ - private ResultPoint[] centerEdges(ResultPoint y, ResultPoint z, - ResultPoint x, ResultPoint t) { - - // - // t t - // z x - // x OR z - // y y - // - - float yi = y.getX(); - float yj = y.getY(); - float zi = z.getX(); - float zj = z.getY(); - float xi = x.getX(); - float xj = x.getY(); - float ti = t.getX(); - float tj = t.getY(); - - if (yi < width / 2.0f) { - return new ResultPoint[]{ - new ResultPoint(ti - CORR, tj + CORR), - new ResultPoint(zi + CORR, zj + CORR), - new ResultPoint(xi - CORR, xj - CORR), - new ResultPoint(yi + CORR, yj - CORR)}; - } else { - return new ResultPoint[]{ - new ResultPoint(ti + CORR, tj + CORR), - new ResultPoint(zi + CORR, zj - CORR), - new ResultPoint(xi - CORR, xj + CORR), - new ResultPoint(yi - CORR, yj - CORR)}; - } - } - - /** - * Determines whether a segment contains a black point - * - * @param a min value of the scanned coordinate - * @param b max value of the scanned coordinate - * @param fixed value of fixed coordinate - * @param horizontal set to true if scan must be horizontal, false if vertical - * @return true if a black point has been found, else false. - */ - private boolean containsBlackPoint(int a, int b, int fixed, boolean horizontal) { - - if (horizontal) { - for (int x = a; x <= b; x++) { - if (image.get(x, fixed)) { - return true; - } - } - } else { - for (int y = a; y <= b; y++) { - if (image.get(fixed, y)) { - return true; - } - } - } - - return false; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGF.java b/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGF.java deleted file mode 100644 index c0146bb..0000000 --- a/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGF.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.reedsolomon; - -/** - *

    This class contains utility methods for performing mathematical operations over - * the Galois Fields. Operations use a given primitive polynomial in calculations.

    - * - *

    Throughout this package, elements of the GF are represented as an {@code int} - * for convenience and speed (but at the cost of memory). - *

    - * - * @author Sean Owen - * @author David Olivier - */ -public final class GenericGF { - - public static final GenericGF AZTEC_DATA_12 = new GenericGF(0x1069, 4096, 1); // x^12 + x^6 + x^5 + x^3 + 1 - public static final GenericGF AZTEC_DATA_10 = new GenericGF(0x409, 1024, 1); // x^10 + x^3 + 1 - public static final GenericGF AZTEC_DATA_6 = new GenericGF(0x43, 64, 1); // x^6 + x + 1 - public static final GenericGF AZTEC_PARAM = new GenericGF(0x13, 16, 1); // x^4 + x + 1 - public static final GenericGF QR_CODE_FIELD_256 = new GenericGF(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 - public static final GenericGF DATA_MATRIX_FIELD_256 = new GenericGF(0x012D, 256, 1); // x^8 + x^5 + x^3 + x^2 + 1 - public static final GenericGF AZTEC_DATA_8 = DATA_MATRIX_FIELD_256; - public static final GenericGF MAXICODE_FIELD_64 = AZTEC_DATA_6; - - private final int[] expTable; - private final int[] logTable; - private final GenericGFPoly zero; - private final GenericGFPoly one; - private final int size; - private final int primitive; - private final int generatorBase; - - /** - * Create a representation of GF(size) using the given primitive polynomial. - * - * @param primitive irreducible polynomial whose coefficients are represented by - * the bits of an int, where the least-significant bit represents the constant - * coefficient - * @param size the size of the field - * @param b the factor b in the generator polynomial can be 0- or 1-based - * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). - * In most cases it should be 1, but for QR code it is 0. - */ - public GenericGF(int primitive, int size, int b) { - this.primitive = primitive; - this.size = size; - this.generatorBase = b; - - expTable = new int[size]; - logTable = new int[size]; - int x = 1; - for (int i = 0; i < size; i++) { - expTable[i] = x; - x *= 2; // we're assuming the generator alpha is 2 - if (x >= size) { - x ^= primitive; - x &= size - 1; - } - } - for (int i = 0; i < size - 1; i++) { - logTable[expTable[i]] = i; - } - // logTable[0] == 0 but this should never be used - zero = new GenericGFPoly(this, new int[]{0}); - one = new GenericGFPoly(this, new int[]{1}); - } - - GenericGFPoly getZero() { - return zero; - } - - GenericGFPoly getOne() { - return one; - } - - /** - * @return the monomial representing coefficient * x^degree - */ - GenericGFPoly buildMonomial(int degree, int coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient == 0) { - return zero; - } - int[] coefficients = new int[degree + 1]; - coefficients[0] = coefficient; - return new GenericGFPoly(this, coefficients); - } - - /** - * Implements both addition and subtraction -- they are the same in GF(size). - * - * @return sum/difference of a and b - */ - static int addOrSubtract(int a, int b) { - return a ^ b; - } - - /** - * @return 2 to the power of a in GF(size) - */ - int exp(int a) { - return expTable[a]; - } - - /** - * @return base 2 log of a in GF(size) - */ - int log(int a) { - if (a == 0) { - throw new IllegalArgumentException(); - } - return logTable[a]; - } - - /** - * @return multiplicative inverse of a - */ - int inverse(int a) { - if (a == 0) { - throw new ArithmeticException(); - } - return expTable[size - logTable[a] - 1]; - } - - /** - * @return product of a and b in GF(size) - */ - int multiply(int a, int b) { - if (a == 0 || b == 0) { - return 0; - } - return expTable[(logTable[a] + logTable[b]) % (size - 1)]; - } - - public int getSize() { - return size; - } - - public int getGeneratorBase() { - return generatorBase; - } - - @Override - public String toString() { - return "GF(0x" + Integer.toHexString(primitive) + ',' + size + ')'; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGFPoly.java b/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGFPoly.java deleted file mode 100644 index 8887e0e..0000000 --- a/zxing/src/main/java/com/google/zxing/common/reedsolomon/GenericGFPoly.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.reedsolomon; - -/** - *

    Represents a polynomial whose coefficients are elements of a GF. - * Instances of this class are immutable.

    - * - *

    Much credit is due to William Rucklidge since portions of this code are an indirect - * port of his C++ Reed-Solomon implementation.

    - * - * @author Sean Owen - */ -final class GenericGFPoly { - - private final GenericGF field; - private final int[] coefficients; - - /** - * @param field the {@link GenericGF} instance representing the field to use - * to perform computations - * @param coefficients coefficients as ints representing elements of GF(size), arranged - * from most significant (highest-power term) coefficient to least significant - * @throws IllegalArgumentException if argument is null or empty, - * or if leading coefficient is 0 and this is not a - * constant polynomial (that is, it is not the monomial "0") - */ - GenericGFPoly(GenericGF field, int[] coefficients) { - if (coefficients.length == 0) { - throw new IllegalArgumentException(); - } - this.field = field; - int coefficientsLength = coefficients.length; - if (coefficientsLength > 1 && coefficients[0] == 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - int firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) { - this.coefficients = new int[]{0}; - } else { - this.coefficients = new int[coefficientsLength - firstNonZero]; - System.arraycopy(coefficients, - firstNonZero, - this.coefficients, - 0, - this.coefficients.length); - } - } else { - this.coefficients = coefficients; - } - } - - int[] getCoefficients() { - return coefficients; - } - - /** - * @return degree of this polynomial - */ - int getDegree() { - return coefficients.length - 1; - } - - /** - * @return true iff this polynomial is the monomial "0" - */ - boolean isZero() { - return coefficients[0] == 0; - } - - /** - * @return coefficient of x^degree term in this polynomial - */ - int getCoefficient(int degree) { - return coefficients[coefficients.length - 1 - degree]; - } - - /** - * @return evaluation of this polynomial at a given point - */ - int evaluateAt(int a) { - if (a == 0) { - // Just return the x^0 coefficient - return getCoefficient(0); - } - int size = coefficients.length; - if (a == 1) { - // Just the sum of the coefficients - int result = 0; - for (int coefficient : coefficients) { - result = GenericGF.addOrSubtract(result, coefficient); - } - return result; - } - int result = coefficients[0]; - for (int i = 1; i < size; i++) { - result = GenericGF.addOrSubtract(field.multiply(a, result), coefficients[i]); - } - return result; - } - - GenericGFPoly addOrSubtract(GenericGFPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - if (isZero()) { - return other; - } - if (other.isZero()) { - return this; - } - - int[] smallerCoefficients = this.coefficients; - int[] largerCoefficients = other.coefficients; - if (smallerCoefficients.length > largerCoefficients.length) { - int[] temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - int[] sumDiff = new int[largerCoefficients.length]; - int lengthDiff = largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - System.arraycopy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - - for (int i = lengthDiff; i < largerCoefficients.length; i++) { - sumDiff[i] = GenericGF.addOrSubtract(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - - return new GenericGFPoly(field, sumDiff); - } - - GenericGFPoly multiply(GenericGFPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - if (isZero() || other.isZero()) { - return field.getZero(); - } - int[] aCoefficients = this.coefficients; - int aLength = aCoefficients.length; - int[] bCoefficients = other.coefficients; - int bLength = bCoefficients.length; - int[] product = new int[aLength + bLength - 1]; - for (int i = 0; i < aLength; i++) { - int aCoeff = aCoefficients[i]; - for (int j = 0; j < bLength; j++) { - product[i + j] = GenericGF.addOrSubtract(product[i + j], - field.multiply(aCoeff, bCoefficients[j])); - } - } - return new GenericGFPoly(field, product); - } - - GenericGFPoly multiply(int scalar) { - if (scalar == 0) { - return field.getZero(); - } - if (scalar == 1) { - return this; - } - int size = coefficients.length; - int[] product = new int[size]; - for (int i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], scalar); - } - return new GenericGFPoly(field, product); - } - - GenericGFPoly multiplyByMonomial(int degree, int coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient == 0) { - return field.getZero(); - } - int size = coefficients.length; - int[] product = new int[size + degree]; - for (int i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], coefficient); - } - return new GenericGFPoly(field, product); - } - - GenericGFPoly[] divide(GenericGFPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - if (other.isZero()) { - throw new IllegalArgumentException("Divide by 0"); - } - - GenericGFPoly quotient = field.getZero(); - GenericGFPoly remainder = this; - - int denominatorLeadingTerm = other.getCoefficient(other.getDegree()); - int inverseDenominatorLeadingTerm = field.inverse(denominatorLeadingTerm); - - while (remainder.getDegree() >= other.getDegree() && !remainder.isZero()) { - int degreeDifference = remainder.getDegree() - other.getDegree(); - int scale = field.multiply(remainder.getCoefficient(remainder.getDegree()), inverseDenominatorLeadingTerm); - GenericGFPoly term = other.multiplyByMonomial(degreeDifference, scale); - GenericGFPoly iterationQuotient = field.buildMonomial(degreeDifference, scale); - quotient = quotient.addOrSubtract(iterationQuotient); - remainder = remainder.addOrSubtract(term); - } - - return new GenericGFPoly[] { quotient, remainder }; - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(8 * getDegree()); - for (int degree = getDegree(); degree >= 0; degree--) { - int coefficient = getCoefficient(degree); - if (coefficient != 0) { - if (coefficient < 0) { - result.append(" - "); - coefficient = -coefficient; - } else { - if (result.length() > 0) { - result.append(" + "); - } - } - if (degree == 0 || coefficient != 1) { - int alphaPower = field.log(coefficient); - if (alphaPower == 0) { - result.append('1'); - } else if (alphaPower == 1) { - result.append('a'); - } else { - result.append("a^"); - result.append(alphaPower); - } - } - if (degree != 0) { - if (degree == 1) { - result.append('x'); - } else { - result.append("x^"); - result.append(degree); - } - } - } - } - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java b/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java deleted file mode 100644 index 19127e0..0000000 --- a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.reedsolomon; - -/** - *

    Implements Reed-Solomon decoding, as the name implies.

    - * - *

    The algorithm will not be explained here, but the following references were helpful - * in creating this implementation:

    - * - * - * - *

    Much credit is due to William Rucklidge since portions of this code are an indirect - * port of his C++ Reed-Solomon implementation.

    - * - * @author Sean Owen - * @author William Rucklidge - * @author sanfordsquires - */ -public final class ReedSolomonDecoder { - - private final GenericGF field; - - public ReedSolomonDecoder(GenericGF field) { - this.field = field; - } - - /** - *

    Decodes given set of received codewords, which include both data and error-correction - * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place, - * in the input.

    - * - * @param received data and error-correction codewords - * @param twoS number of error-correction codewords available - * @throws ReedSolomonException if decoding fails for any reason - */ - public void decode(int[] received, int twoS) throws ReedSolomonException { - GenericGFPoly poly = new GenericGFPoly(field, received); - int[] syndromeCoefficients = new int[twoS]; - boolean noError = true; - for (int i = 0; i < twoS; i++) { - int eval = poly.evaluateAt(field.exp(i + field.getGeneratorBase())); - syndromeCoefficients[syndromeCoefficients.length - 1 - i] = eval; - if (eval != 0) { - noError = false; - } - } - if (noError) { - return; - } - GenericGFPoly syndrome = new GenericGFPoly(field, syndromeCoefficients); - GenericGFPoly[] sigmaOmega = - runEuclideanAlgorithm(field.buildMonomial(twoS, 1), syndrome, twoS); - GenericGFPoly sigma = sigmaOmega[0]; - GenericGFPoly omega = sigmaOmega[1]; - int[] errorLocations = findErrorLocations(sigma); - int[] errorMagnitudes = findErrorMagnitudes(omega, errorLocations); - for (int i = 0; i < errorLocations.length; i++) { - int position = received.length - 1 - field.log(errorLocations[i]); - if (position < 0) { - throw new ReedSolomonException("Bad error location"); - } - received[position] = GenericGF.addOrSubtract(received[position], errorMagnitudes[i]); - } - } - - private GenericGFPoly[] runEuclideanAlgorithm(GenericGFPoly a, GenericGFPoly b, int R) - throws ReedSolomonException { - // Assume a's degree is >= b's - if (a.getDegree() < b.getDegree()) { - GenericGFPoly temp = a; - a = b; - b = temp; - } - - GenericGFPoly rLast = a; - GenericGFPoly r = b; - GenericGFPoly tLast = field.getZero(); - GenericGFPoly t = field.getOne(); - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.getDegree() >= R / 2) { - GenericGFPoly rLastLast = rLast; - GenericGFPoly tLastLast = tLast; - rLast = r; - tLast = t; - - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.isZero()) { - // Oops, Euclidean algorithm already terminated? - throw new ReedSolomonException("r_{i-1} was zero"); - } - r = rLastLast; - GenericGFPoly q = field.getZero(); - int denominatorLeadingTerm = rLast.getCoefficient(rLast.getDegree()); - int dltInverse = field.inverse(denominatorLeadingTerm); - while (r.getDegree() >= rLast.getDegree() && !r.isZero()) { - int degreeDiff = r.getDegree() - rLast.getDegree(); - int scale = field.multiply(r.getCoefficient(r.getDegree()), dltInverse); - q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale)); - r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); - } - - t = q.multiply(tLast).addOrSubtract(tLastLast); - - if (r.getDegree() >= rLast.getDegree()) { - throw new IllegalStateException("Division algorithm failed to reduce polynomial?"); - } - } - - int sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero == 0) { - throw new ReedSolomonException("sigmaTilde(0) was zero"); - } - - int inverse = field.inverse(sigmaTildeAtZero); - GenericGFPoly sigma = t.multiply(inverse); - GenericGFPoly omega = r.multiply(inverse); - return new GenericGFPoly[]{sigma, omega}; - } - - private int[] findErrorLocations(GenericGFPoly errorLocator) throws ReedSolomonException { - // This is a direct application of Chien's search - int numErrors = errorLocator.getDegree(); - if (numErrors == 1) { // shortcut - return new int[] { errorLocator.getCoefficient(1) }; - } - int[] result = new int[numErrors]; - int e = 0; - for (int i = 1; i < field.getSize() && e < numErrors; i++) { - if (errorLocator.evaluateAt(i) == 0) { - result[e] = field.inverse(i); - e++; - } - } - if (e != numErrors) { - throw new ReedSolomonException("Error locator degree does not match number of roots"); - } - return result; - } - - private int[] findErrorMagnitudes(GenericGFPoly errorEvaluator, int[] errorLocations) { - // This is directly applying Forney's Formula - int s = errorLocations.length; - int[] result = new int[s]; - for (int i = 0; i < s; i++) { - int xiInverse = field.inverse(errorLocations[i]); - int denominator = 1; - for (int j = 0; j < s; j++) { - if (i != j) { - //denominator = field.multiply(denominator, - // GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); - // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. - // Below is a funny-looking workaround from Steven Parkes - int term = field.multiply(errorLocations[j], xiInverse); - int termPlus1 = (term & 0x1) == 0 ? term | 1 : term & ~1; - denominator = field.multiply(denominator, termPlus1); - } - } - result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), - field.inverse(denominator)); - if (field.getGeneratorBase() != 0) { - result[i] = field.multiply(result[i], xiInverse); - } - } - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java b/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java deleted file mode 100644 index ff813cb..0000000 --- a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.reedsolomon; - -import java.util.ArrayList; -import java.util.List; - -/** - *

    Implements Reed-Solomon enbcoding, as the name implies.

    - * - * @author Sean Owen - * @author William Rucklidge - */ -public final class ReedSolomonEncoder { - - private final GenericGF field; - private final List cachedGenerators; - - public ReedSolomonEncoder(GenericGF field) { - this.field = field; - this.cachedGenerators = new ArrayList<>(); - cachedGenerators.add(new GenericGFPoly(field, new int[]{1})); - } - - private GenericGFPoly buildGenerator(int degree) { - if (degree >= cachedGenerators.size()) { - GenericGFPoly lastGenerator = cachedGenerators.get(cachedGenerators.size() - 1); - for (int d = cachedGenerators.size(); d <= degree; d++) { - GenericGFPoly nextGenerator = lastGenerator.multiply( - new GenericGFPoly(field, new int[] { 1, field.exp(d - 1 + field.getGeneratorBase()) })); - cachedGenerators.add(nextGenerator); - lastGenerator = nextGenerator; - } - } - return cachedGenerators.get(degree); - } - - public void encode(int[] toEncode, int ecBytes) { - if (ecBytes == 0) { - throw new IllegalArgumentException("No error correction bytes"); - } - int dataBytes = toEncode.length - ecBytes; - if (dataBytes <= 0) { - throw new IllegalArgumentException("No data bytes provided"); - } - GenericGFPoly generator = buildGenerator(ecBytes); - int[] infoCoefficients = new int[dataBytes]; - System.arraycopy(toEncode, 0, infoCoefficients, 0, dataBytes); - GenericGFPoly info = new GenericGFPoly(field, infoCoefficients); - info = info.multiplyByMonomial(ecBytes, 1); - GenericGFPoly remainder = info.divide(generator)[1]; - int[] coefficients = remainder.getCoefficients(); - int numZeroCoefficients = ecBytes - coefficients.length; - for (int i = 0; i < numZeroCoefficients; i++) { - toEncode[dataBytes + i] = 0; - } - System.arraycopy(coefficients, 0, toEncode, dataBytes + numZeroCoefficients, coefficients.length); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonException.java b/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonException.java deleted file mode 100644 index d5b45a6..0000000 --- a/zxing/src/main/java/com/google/zxing/common/reedsolomon/ReedSolomonException.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.common.reedsolomon; - -/** - *

    Thrown when an exception occurs during Reed-Solomon decoding, such as when - * there are too many errors to correct.

    - * - * @author Sean Owen - */ -public final class ReedSolomonException extends Exception { - - public ReedSolomonException(String message) { - super(message); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixReader.java b/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixReader.java deleted file mode 100644 index e02d766..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixReader.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.datamatrix.decoder.Decoder; -import com.google.zxing.datamatrix.detector.Detector; - -import java.util.List; -import java.util.Map; - -/** - * This implementation can detect and decode Data Matrix codes in an image. - * - * @author bbrown@google.com (Brian Brown) - */ -public final class DataMatrixReader implements Reader { - - private static final ResultPoint[] NO_POINTS = new ResultPoint[0]; - - private final Decoder decoder = new Decoder(); - - /** - * Locates and decodes a Data Matrix code in an image. - * - * @return a String representing the content encoded by the Data Matrix code - * @throws NotFoundException if a Data Matrix code cannot be found - * @throws FormatException if a Data Matrix code cannot be decoded - * @throws ChecksumException if error correction fails - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException { - return decode(image, null); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, ChecksumException, FormatException { - DecoderResult decoderResult; - ResultPoint[] points; - if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { - BitMatrix bits = extractPureBits(image.getBlackMatrix()); - decoderResult = decoder.decode(bits); - points = NO_POINTS; - } else { - DetectorResult detectorResult = new Detector(image.getBlackMatrix()).detect(); - decoderResult = decoder.decode(detectorResult.getBits()); - points = detectorResult.getPoints(); - } - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, - BarcodeFormat.DATA_MATRIX); - List byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType.BYTE_SEGMENTS, byteSegments); - } - String ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, ecLevel); - } - return result; - } - - @Override - public void reset() { - // do nothing - } - - /** - * This method detects a code in a "pure" image -- that is, pure monochrome image - * which contains only an unrotated, unskewed, image of a code, with some white border - * around it. This is a specialized method that works exceptionally fast in this special - * case. - * - * @see com.google.zxing.qrcode.QRCodeReader#extractPureBits(BitMatrix) - */ - private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException { - - int[] leftTopBlack = image.getTopLeftOnBit(); - int[] rightBottomBlack = image.getBottomRightOnBit(); - if (leftTopBlack == null || rightBottomBlack == null) { - throw NotFoundException.getNotFoundInstance(); - } - - int moduleSize = moduleSize(leftTopBlack, image); - - int top = leftTopBlack[1]; - int bottom = rightBottomBlack[1]; - int left = leftTopBlack[0]; - int right = rightBottomBlack[0]; - - int matrixWidth = (right - left + 1) / moduleSize; - int matrixHeight = (bottom - top + 1) / moduleSize; - if (matrixWidth <= 0 || matrixHeight <= 0) { - throw NotFoundException.getNotFoundInstance(); - } - - // Push in the "border" by half the module width so that we start - // sampling in the middle of the module. Just in case the image is a - // little off, this will help recover. - int nudge = moduleSize / 2; - top += nudge; - left += nudge; - - // Now just read off the bits - BitMatrix bits = new BitMatrix(matrixWidth, matrixHeight); - for (int y = 0; y < matrixHeight; y++) { - int iOffset = top + y * moduleSize; - for (int x = 0; x < matrixWidth; x++) { - if (image.get(left + x * moduleSize, iOffset)) { - bits.set(x, y); - } - } - } - return bits; - } - - private static int moduleSize(int[] leftTopBlack, BitMatrix image) throws NotFoundException { - int width = image.getWidth(); - int x = leftTopBlack[0]; - int y = leftTopBlack[1]; - while (x < width && image.get(x, y)) { - x++; - } - if (x == width) { - throw NotFoundException.getNotFoundInstance(); - } - - int moduleSize = x - leftTopBlack[0]; - if (moduleSize == 0) { - throw NotFoundException.getNotFoundInstance(); - } - return moduleSize; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixWriter.java b/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixWriter.java deleted file mode 100644 index 32bf3f6..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/DataMatrixWriter.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.datamatrix.encoder.DefaultPlacement; -import com.google.zxing.Dimension; -import com.google.zxing.datamatrix.encoder.ErrorCorrection; -import com.google.zxing.datamatrix.encoder.HighLevelEncoder; -import com.google.zxing.datamatrix.encoder.SymbolInfo; -import com.google.zxing.datamatrix.encoder.SymbolShapeHint; -import com.google.zxing.qrcode.encoder.ByteMatrix; - -import java.util.Map; - -/** - * This object renders a Data Matrix code as a BitMatrix 2D array of greyscale values. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Guillaume Le Biller Added to zxing lib. - */ -public final class DataMatrixWriter implements Writer { - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) { - return encode(contents, format, width, height, null); - } - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map hints) { - - if (contents.isEmpty()) { - throw new IllegalArgumentException("Found empty contents"); - } - - if (format != BarcodeFormat.DATA_MATRIX) { - throw new IllegalArgumentException("Can only encode DATA_MATRIX, but got " + format); - } - - if (width < 0 || height < 0) { - throw new IllegalArgumentException("Requested dimensions are too small: " + width + 'x' + height); - } - - // Try to get force shape & min / max size - SymbolShapeHint shape = SymbolShapeHint.FORCE_NONE; - Dimension minSize = null; - Dimension maxSize = null; - if (hints != null) { - SymbolShapeHint requestedShape = (SymbolShapeHint) hints.get(EncodeHintType.DATA_MATRIX_SHAPE); - if (requestedShape != null) { - shape = requestedShape; - } - @SuppressWarnings("deprecation") - Dimension requestedMinSize = (Dimension) hints.get(EncodeHintType.MIN_SIZE); - if (requestedMinSize != null) { - minSize = requestedMinSize; - } - @SuppressWarnings("deprecation") - Dimension requestedMaxSize = (Dimension) hints.get(EncodeHintType.MAX_SIZE); - if (requestedMaxSize != null) { - maxSize = requestedMaxSize; - } - } - - - //1. step: Data encodation - String encoded = HighLevelEncoder.encodeHighLevel(contents, shape, minSize, maxSize); - - SymbolInfo symbolInfo = SymbolInfo.lookup(encoded.length(), shape, minSize, maxSize, true); - - //2. step: ECC generation - String codewords = ErrorCorrection.encodeECC200(encoded, symbolInfo); - - //3. step: Module placement in Matrix - DefaultPlacement placement = - new DefaultPlacement(codewords, symbolInfo.getSymbolDataWidth(), symbolInfo.getSymbolDataHeight()); - placement.place(); - - //4. step: low-level encoding - return encodeLowLevel(placement, symbolInfo); - } - - /** - * Encode the given symbol info to a bit matrix. - * - * @param placement The DataMatrix placement. - * @param symbolInfo The symbol info to encode. - * @return The bit matrix generated. - */ - private static BitMatrix encodeLowLevel(DefaultPlacement placement, SymbolInfo symbolInfo) { - int symbolWidth = symbolInfo.getSymbolDataWidth(); - int symbolHeight = symbolInfo.getSymbolDataHeight(); - - ByteMatrix matrix = new ByteMatrix(symbolInfo.getSymbolWidth(), symbolInfo.getSymbolHeight()); - - int matrixY = 0; - - for (int y = 0; y < symbolHeight; y++) { - // Fill the top edge with alternate 0 / 1 - int matrixX; - if ((y % symbolInfo.matrixHeight) == 0) { - matrixX = 0; - for (int x = 0; x < symbolInfo.getSymbolWidth(); x++) { - matrix.set(matrixX, matrixY, (x % 2) == 0); - matrixX++; - } - matrixY++; - } - matrixX = 0; - for (int x = 0; x < symbolWidth; x++) { - // Fill the right edge with full 1 - if ((x % symbolInfo.matrixWidth) == 0) { - matrix.set(matrixX, matrixY, true); - matrixX++; - } - matrix.set(matrixX, matrixY, placement.getBit(x, y)); - matrixX++; - // Fill the right edge with alternate 0 / 1 - if ((x % symbolInfo.matrixWidth) == symbolInfo.matrixWidth - 1) { - matrix.set(matrixX, matrixY, (y % 2) == 0); - matrixX++; - } - } - matrixY++; - // Fill the bottom edge with full 1 - if ((y % symbolInfo.matrixHeight) == symbolInfo.matrixHeight - 1) { - matrixX = 0; - for (int x = 0; x < symbolInfo.getSymbolWidth(); x++) { - matrix.set(matrixX, matrixY, true); - matrixX++; - } - matrixY++; - } - } - - return convertByteMatrixToBitMatrix(matrix); - } - - /** - * Convert the ByteMatrix to BitMatrix. - * - * @param matrix The input matrix. - * @return The output matrix. - */ - private static BitMatrix convertByteMatrixToBitMatrix(ByteMatrix matrix) { - int matrixWidgth = matrix.getWidth(); - int matrixHeight = matrix.getHeight(); - - BitMatrix output = new BitMatrix(matrixWidgth, matrixHeight); - output.clear(); - for (int i = 0; i < matrixWidgth; i++) { - for (int j = 0; j < matrixHeight; j++) { - // Zero is white in the bytematrix - if (matrix.get(i, j) == 1) { - output.set(i, j); - } - } - } - - return output; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/BitMatrixParser.java b/zxing/src/main/java/com/google/zxing/datamatrix/decoder/BitMatrixParser.java deleted file mode 100644 index f7cf636..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; - -/** - * @author bbrown@google.com (Brian Brown) - */ -final class BitMatrixParser { - - private final BitMatrix mappingBitMatrix; - private final BitMatrix readMappingMatrix; - private final Version version; - - /** - * @param bitMatrix {@link BitMatrix} to parse - * @throws FormatException if dimension is < 8 or > 144 or not 0 mod 2 - */ - BitMatrixParser(BitMatrix bitMatrix) throws FormatException { - int dimension = bitMatrix.getHeight(); - if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) { - throw FormatException.getFormatInstance(); - } - - version = readVersion(bitMatrix); - this.mappingBitMatrix = extractDataRegion(bitMatrix); - this.readMappingMatrix = new BitMatrix(this.mappingBitMatrix.getWidth(), this.mappingBitMatrix.getHeight()); - } - - Version getVersion() { - return version; - } - - /** - *

    Creates the version object based on the dimension of the original bit matrix from - * the datamatrix code.

    - * - *

    See ISO 16022:2006 Table 7 - ECC 200 symbol attributes

    - * - * @param bitMatrix Original {@link BitMatrix} including alignment patterns - * @return {@link Version} encapsulating the Data Matrix Code's "version" - * @throws FormatException if the dimensions of the mapping matrix are not valid - * Data Matrix dimensions. - */ - private static Version readVersion(BitMatrix bitMatrix) throws FormatException { - int numRows = bitMatrix.getHeight(); - int numColumns = bitMatrix.getWidth(); - return Version.getVersionForDimensions(numRows, numColumns); - } - - /** - *

    Reads the bits in the {@link BitMatrix} representing the mapping matrix (No alignment patterns) - * in the correct order in order to reconstitute the codewords bytes contained within the - * Data Matrix Code.

    - * - * @return bytes encoded within the Data Matrix Code - * @throws FormatException if the exact number of bytes expected is not read - */ - byte[] readCodewords() throws FormatException { - - byte[] result = new byte[version.getTotalCodewords()]; - int resultOffset = 0; - - int row = 4; - int column = 0; - - int numRows = mappingBitMatrix.getHeight(); - int numColumns = mappingBitMatrix.getWidth(); - - boolean corner1Read = false; - boolean corner2Read = false; - boolean corner3Read = false; - boolean corner4Read = false; - - // Read all of the codewords - do { - // Check the four corner cases - if ((row == numRows) && (column == 0) && !corner1Read) { - result[resultOffset++] = (byte) readCorner1(numRows, numColumns); - row -= 2; - column += 2; - corner1Read = true; - } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { - result[resultOffset++] = (byte) readCorner2(numRows, numColumns); - row -= 2; - column += 2; - corner2Read = true; - } else if ((row == numRows + 4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { - result[resultOffset++] = (byte) readCorner3(numRows, numColumns); - row -= 2; - column += 2; - corner3Read = true; - } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { - result[resultOffset++] = (byte) readCorner4(numRows, numColumns); - row -= 2; - column += 2; - corner4Read = true; - } else { - // Sweep upward diagonally to the right - do { - if ((row < numRows) && (column >= 0) && !readMappingMatrix.get(column, row)) { - result[resultOffset++] = (byte) readUtah(row, column, numRows, numColumns); - } - row -= 2; - column += 2; - } while ((row >= 0) && (column < numColumns)); - row += 1; - column += 3; - - // Sweep downward diagonally to the left - do { - if ((row >= 0) && (column < numColumns) && !readMappingMatrix.get(column, row)) { - result[resultOffset++] = (byte) readUtah(row, column, numRows, numColumns); - } - row += 2; - column -= 2; - } while ((row < numRows) && (column >= 0)); - row += 3; - column += 1; - } - } while ((row < numRows) || (column < numColumns)); - - if (resultOffset != version.getTotalCodewords()) { - throw FormatException.getFormatInstance(); - } - return result; - } - - /** - *

    Reads a bit of the mapping matrix accounting for boundary wrapping.

    - * - * @param row Row to read in the mapping matrix - * @param column Column to read in the mapping matrix - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return value of the given bit in the mapping matrix - */ - boolean readModule(int row, int column, int numRows, int numColumns) { - // Adjust the row and column indices based on boundary wrapping - if (row < 0) { - row += numRows; - column += 4 - ((numRows + 4) & 0x07); - } - if (column < 0) { - column += numColumns; - row += 4 - ((numColumns + 4) & 0x07); - } - readMappingMatrix.set(column, row); - return mappingBitMatrix.get(column, row); - } - - /** - *

    Reads the 8 bits of the standard Utah-shaped pattern.

    - * - *

    See ISO 16022:2006, 5.8.1 Figure 6

    - * - * @param row Current row in the mapping matrix, anchored at the 8th bit (LSB) of the pattern - * @param column Current column in the mapping matrix, anchored at the 8th bit (LSB) of the pattern - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the utah shape - */ - int readUtah(int row, int column, int numRows, int numColumns) { - int currentByte = 0; - if (readModule(row - 2, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 2, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - - /** - *

    Reads the 8 bits of the special corner condition 1.

    - * - *

    See ISO 16022:2006, Figure F.3

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 1 - */ - int readCorner1(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - - /** - *

    Reads the 8 bits of the special corner condition 2.

    - * - *

    See ISO 16022:2006, Figure F.4

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 2 - */ - int readCorner2(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 4, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - - /** - *

    Reads the 8 bits of the special corner condition 3.

    - * - *

    See ISO 16022:2006, Figure F.5

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 3 - */ - int readCorner3(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - - /** - *

    Reads the 8 bits of the special corner condition 4.

    - * - *

    See ISO 16022:2006, Figure F.6

    - * - * @param numRows Number of rows in the mapping matrix - * @param numColumns Number of columns in the mapping matrix - * @return byte from the Corner condition 4 - */ - int readCorner4(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - - /** - *

    Extracts the data region from a {@link BitMatrix} that contains - * alignment patterns.

    - * - * @param bitMatrix Original {@link BitMatrix} with alignment patterns - * @return BitMatrix that has the alignment patterns removed - */ - BitMatrix extractDataRegion(BitMatrix bitMatrix) { - int symbolSizeRows = version.getSymbolSizeRows(); - int symbolSizeColumns = version.getSymbolSizeColumns(); - - if (bitMatrix.getHeight() != symbolSizeRows) { - throw new IllegalArgumentException("Dimension of bitMarix must match the version size"); - } - - int dataRegionSizeRows = version.getDataRegionSizeRows(); - int dataRegionSizeColumns = version.getDataRegionSizeColumns(); - - int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; - int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; - - int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; - int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; - - BitMatrix bitMatrixWithoutAlignment = new BitMatrix(sizeDataRegionColumn, sizeDataRegionRow); - for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { - int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; - for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { - int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; - for (int i = 0; i < dataRegionSizeRows; ++i) { - int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; - int writeRowOffset = dataRegionRowOffset + i; - for (int j = 0; j < dataRegionSizeColumns; ++j) { - int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; - if (bitMatrix.get(readColumnOffset, readRowOffset)) { - int writeColumnOffset = dataRegionColumnOffset + j; - bitMatrixWithoutAlignment.set(writeColumnOffset, writeRowOffset); - } - } - } - } - } - return bitMatrixWithoutAlignment; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DataBlock.java b/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DataBlock.java deleted file mode 100644 index 35edd42..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DataBlock.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.decoder; - -/** - *

    Encapsulates a block of data within a Data Matrix Code. Data Matrix Codes may split their data into - * multiple blocks, each of which is a unit of data and error-correction codewords. Each - * is represented by an instance of this class.

    - * - * @author bbrown@google.com (Brian Brown) - */ -final class DataBlock { - - private final int numDataCodewords; - private final byte[] codewords; - - private DataBlock(int numDataCodewords, byte[] codewords) { - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - } - - /** - *

    When Data Matrix Codes use multiple data blocks, they actually interleave the bytes of each of them. - * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This - * method will separate the data into original blocks.

    - * - * @param rawCodewords bytes as read directly from the Data Matrix Code - * @param version version of the Data Matrix Code - * @return DataBlocks containing original bytes, "de-interleaved" from representation in the - * Data Matrix Code - */ - static DataBlock[] getDataBlocks(byte[] rawCodewords, - Version version) { - // Figure out the number and size of data blocks used by this version - Version.ECBlocks ecBlocks = version.getECBlocks(); - - // First count the total number of data blocks - int totalBlocks = 0; - Version.ECB[] ecBlockArray = ecBlocks.getECBlocks(); - for (Version.ECB ecBlock : ecBlockArray) { - totalBlocks += ecBlock.getCount(); - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - DataBlock[] result = new DataBlock[totalBlocks]; - int numResultBlocks = 0; - for (Version.ECB ecBlock : ecBlockArray) { - for (int i = 0; i < ecBlock.getCount(); i++) { - int numDataCodewords = ecBlock.getDataCodewords(); - int numBlockCodewords = ecBlocks.getECCodewords() + numDataCodewords; - result[numResultBlocks++] = new DataBlock(numDataCodewords, new byte[numBlockCodewords]); - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 less byte. Figure out where these start. - // TODO(bbrown): There is only one case where there is a difference for Data Matrix for size 144 - int longerBlocksTotalCodewords = result[0].codewords.length; - //int shorterBlocksTotalCodewords = longerBlocksTotalCodewords - 1; - - int longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks.getECCodewords(); - int shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; - // The last elements of result may be 1 element shorter for 144 matrix - // first fill out as many elements as all of them have minus 1 - int rawCodewordsOffset = 0; - for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (int j = 0; j < numResultBlocks; j++) { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - - // Fill out the last data block in the longer ones - boolean specialVersion = version.getVersionNumber() == 24; - int numLongerBlocks = specialVersion ? 8 : numResultBlocks; - for (int j = 0; j < numLongerBlocks; j++) { - result[j].codewords[longerBlocksNumDataCodewords - 1] = rawCodewords[rawCodewordsOffset++]; - } - - // Now add in error correction blocks - int max = result[0].codewords.length; - for (int i = longerBlocksNumDataCodewords; i < max; i++) { - for (int j = 0; j < numResultBlocks; j++) { - int jOffset = specialVersion ? (j + 8) % numResultBlocks : j; - int iOffset = specialVersion && jOffset > 7 ? i - 1 : i; - result[jOffset].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - - if (rawCodewordsOffset != rawCodewords.length) { - throw new IllegalArgumentException(); - } - - return result; - } - - int getNumDataCodewords() { - return numDataCodewords; - } - - byte[] getCodewords() { - return codewords; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java b/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java deleted file mode 100644 index 16f2ecb..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.common.BitSource; -import com.google.zxing.common.DecoderResult; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - *

    Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes - * in one Data Matrix Code. This class decodes the bits back into text.

    - * - *

    See ISO 16022:2006, 5.2.1 - 5.2.9.2

    - * - * @author bbrown@google.com (Brian Brown) - * @author Sean Owen - */ -final class DecodedBitStreamParser { - - private enum Mode { - PAD_ENCODE, // Not really a mode - ASCII_ENCODE, - C40_ENCODE, - TEXT_ENCODE, - ANSIX12_ENCODE, - EDIFACT_ENCODE, - BASE256_ENCODE - } - - /** - * See ISO 16022:2006, Annex C Table C.1 - * The C40 Basic Character Set (*'s used for placeholders for the shift values) - */ - private static final char[] C40_BASIC_SET_CHARS = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' - }; - - private static final char[] C40_SHIFT2_SET_CHARS = { - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', - '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' - }; - - /** - * See ISO 16022:2006, Annex C Table C.2 - * The Text Basic Character Set (*'s used for placeholders for the shift values) - */ - private static final char[] TEXT_BASIC_SET_CHARS = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' - }; - - // Shift 2 for Text is the same encoding as C40 - private static final char[] TEXT_SHIFT2_SET_CHARS = C40_SHIFT2_SET_CHARS; - - private static final char[] TEXT_SHIFT3_SET_CHARS = { - '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (char) 127 - }; - - private DecodedBitStreamParser() { - } - - static DecoderResult decode(byte[] bytes) throws FormatException { - BitSource bits = new BitSource(bytes); - StringBuilder result = new StringBuilder(100); - StringBuilder resultTrailer = new StringBuilder(0); - List byteSegments = new ArrayList<>(1); - Mode mode = Mode.ASCII_ENCODE; - do { - if (mode == Mode.ASCII_ENCODE) { - mode = decodeAsciiSegment(bits, result, resultTrailer); - } else { - switch (mode) { - case C40_ENCODE: - decodeC40Segment(bits, result); - break; - case TEXT_ENCODE: - decodeTextSegment(bits, result); - break; - case ANSIX12_ENCODE: - decodeAnsiX12Segment(bits, result); - break; - case EDIFACT_ENCODE: - decodeEdifactSegment(bits, result); - break; - case BASE256_ENCODE: - decodeBase256Segment(bits, result, byteSegments); - break; - default: - throw FormatException.getFormatInstance(); - } - mode = Mode.ASCII_ENCODE; - } - } while (mode != Mode.PAD_ENCODE && bits.available() > 0); - if (resultTrailer.length() > 0) { - result.append(resultTrailer); - } - return new DecoderResult(bytes, result.toString(), byteSegments.isEmpty() ? null : byteSegments, null); - } - - /** - * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 - */ - private static Mode decodeAsciiSegment(BitSource bits, - StringBuilder result, - StringBuilder resultTrailer) throws FormatException { - boolean upperShift = false; - do { - int oneByte = bits.readBits(8); - if (oneByte == 0) { - throw FormatException.getFormatInstance(); - } else if (oneByte <= 128) { // ASCII data (ASCII value + 1) - if (upperShift) { - oneByte += 128; - //upperShift = false; - } - result.append((char) (oneByte - 1)); - return Mode.ASCII_ENCODE; - } else if (oneByte == 129) { // Pad - return Mode.PAD_ENCODE; - } else if (oneByte <= 229) { // 2-digit data 00-99 (Numeric Value + 130) - int value = oneByte - 130; - if (value < 10) { // pad with '0' for single digit values - result.append('0'); - } - result.append(value); - } else if (oneByte == 230) { // Latch to C40 encodation - return Mode.C40_ENCODE; - } else if (oneByte == 231) { // Latch to Base 256 encodation - return Mode.BASE256_ENCODE; - } else if (oneByte == 232) { - // FNC1 - result.append((char) 29); // translate as ASCII 29 - } else if (oneByte == 233 || oneByte == 234) { - // Structured Append, Reader Programming - // Ignore these symbols for now - //throw ReaderException.getInstance(); - } else if (oneByte == 235) { // Upper Shift (shift to Extended ASCII) - upperShift = true; - } else if (oneByte == 236) { // 05 Macro - result.append("[)>\u001E05\u001D"); - resultTrailer.insert(0, "\u001E\u0004"); - } else if (oneByte == 237) { // 06 Macro - result.append("[)>\u001E06\u001D"); - resultTrailer.insert(0, "\u001E\u0004"); - } else if (oneByte == 238) { // Latch to ANSI X12 encodation - return Mode.ANSIX12_ENCODE; - } else if (oneByte == 239) { // Latch to Text encodation - return Mode.TEXT_ENCODE; - } else if (oneByte == 240) { // Latch to EDIFACT encodation - return Mode.EDIFACT_ENCODE; - } else if (oneByte == 241) { // ECI Character - // TODO(bbrown): I think we need to support ECI - //throw ReaderException.getInstance(); - // Ignore this symbol for now - } else if (oneByte >= 242) { // Not to be used in ASCII encodation - // ... but work around encoders that end with 254, latch back to ASCII - if (oneByte != 254 || bits.available() != 0) { - throw FormatException.getFormatInstance(); - } - } - } while (bits.available() > 0); - return Mode.ASCII_ENCODE; - } - - /** - * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 - */ - private static void decodeC40Segment(BitSource bits, StringBuilder result) throws FormatException { - // Three C40 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time - boolean upperShift = false; - - int[] cValues = new int[3]; - int shift = 0; - - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() == 8) { - return; - } - int firstByte = bits.readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits.readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else if (cValue < C40_BASIC_SET_CHARS.length) { - char c40char = C40_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result.append((char) (c40char + 128)); - upperShift = false; - } else { - result.append(c40char); - } - } else { - throw FormatException.getFormatInstance(); - } - break; - case 1: - if (upperShift) { - result.append((char) (cValue + 128)); - upperShift = false; - } else { - result.append((char) cValue); - } - shift = 0; - break; - case 2: - if (cValue < C40_SHIFT2_SET_CHARS.length) { - char c40char = C40_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result.append((char) (c40char + 128)); - upperShift = false; - } else { - result.append(c40char); - } - } else if (cValue == 27) { // FNC1 - result.append((char) 29); // translate as ASCII 29 - } else if (cValue == 30) { // Upper Shift - upperShift = true; - } else { - throw FormatException.getFormatInstance(); - } - shift = 0; - break; - case 3: - if (upperShift) { - result.append((char) (cValue + 224)); - upperShift = false; - } else { - result.append((char) (cValue + 96)); - } - shift = 0; - break; - default: - throw FormatException.getFormatInstance(); - } - } - } while (bits.available() > 0); - } - - /** - * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 - */ - private static void decodeTextSegment(BitSource bits, StringBuilder result) throws FormatException { - // Three Text values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time - boolean upperShift = false; - - int[] cValues = new int[3]; - int shift = 0; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() == 8) { - return; - } - int firstByte = bits.readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits.readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else if (cValue < TEXT_BASIC_SET_CHARS.length) { - char textChar = TEXT_BASIC_SET_CHARS[cValue]; - if (upperShift) { - result.append((char) (textChar + 128)); - upperShift = false; - } else { - result.append(textChar); - } - } else { - throw FormatException.getFormatInstance(); - } - break; - case 1: - if (upperShift) { - result.append((char) (cValue + 128)); - upperShift = false; - } else { - result.append((char) cValue); - } - shift = 0; - break; - case 2: - // Shift 2 for Text is the same encoding as C40 - if (cValue < TEXT_SHIFT2_SET_CHARS.length) { - char textChar = TEXT_SHIFT2_SET_CHARS[cValue]; - if (upperShift) { - result.append((char) (textChar + 128)); - upperShift = false; - } else { - result.append(textChar); - } - } else if (cValue == 27) { // FNC1 - result.append((char) 29); // translate as ASCII 29 - } else if (cValue == 30) { // Upper Shift - upperShift = true; - } else { - throw FormatException.getFormatInstance(); - } - shift = 0; - break; - case 3: - if (cValue < TEXT_SHIFT3_SET_CHARS.length) { - char textChar = TEXT_SHIFT3_SET_CHARS[cValue]; - if (upperShift) { - result.append((char) (textChar + 128)); - upperShift = false; - } else { - result.append(textChar); - } - shift = 0; - } else { - throw FormatException.getFormatInstance(); - } - break; - default: - throw FormatException.getFormatInstance(); - } - } - } while (bits.available() > 0); - } - - /** - * See ISO 16022:2006, 5.2.7 - */ - private static void decodeAnsiX12Segment(BitSource bits, - StringBuilder result) throws FormatException { - // Three ANSI X12 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - - int[] cValues = new int[3]; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits.available() == 8) { - return; - } - int firstByte = bits.readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits.readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - if (cValue == 0) { // X12 segment terminator - result.append('\r'); - } else if (cValue == 1) { // X12 segment separator * - result.append('*'); - } else if (cValue == 2) { // X12 sub-element separator > - result.append('>'); - } else if (cValue == 3) { // space - result.append(' '); - } else if (cValue < 14) { // 0 - 9 - result.append((char) (cValue + 44)); - } else if (cValue < 40) { // A - Z - result.append((char) (cValue + 51)); - } else { - throw FormatException.getFormatInstance(); - } - } - } while (bits.available() > 0); - } - - private static void parseTwoBytes(int firstByte, int secondByte, int[] result) { - int fullBitValue = (firstByte << 8) + secondByte - 1; - int temp = fullBitValue / 1600; - result[0] = temp; - fullBitValue -= temp * 1600; - temp = fullBitValue / 40; - result[1] = temp; - result[2] = fullBitValue - temp * 40; - } - - /** - * See ISO 16022:2006, 5.2.8 and Annex C Table C.3 - */ - private static void decodeEdifactSegment(BitSource bits, StringBuilder result) { - do { - // If there is only two or less bytes left then it will be encoded as ASCII - if (bits.available() <= 16) { - return; - } - - for (int i = 0; i < 4; i++) { - int edifactValue = bits.readBits(6); - - // Check for the unlatch character - if (edifactValue == 0x1F) { // 011111 - // Read rest of byte, which should be 0, and stop - int bitsLeft = 8 - bits.getBitOffset(); - if (bitsLeft != 8) { - bits.readBits(bitsLeft); - } - return; - } - - if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit - edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value - } - result.append((char) edifactValue); - } - } while (bits.available() > 0); - } - - /** - * See ISO 16022:2006, 5.2.9 and Annex B, B.2 - */ - private static void decodeBase256Segment(BitSource bits, - StringBuilder result, - Collection byteSegments) - throws FormatException { - // Figure out how long the Base 256 Segment is. - int codewordPosition = 1 + bits.getByteOffset(); // position is 1-indexed - int d1 = unrandomize255State(bits.readBits(8), codewordPosition++); - int count; - if (d1 == 0) { // Read the remainder of the symbol - count = bits.available() / 8; - } else if (d1 < 250) { - count = d1; - } else { - count = 250 * (d1 - 249) + unrandomize255State(bits.readBits(8), codewordPosition++); - } - - // We're seeing NegativeArraySizeException errors from users. - if (count < 0) { - throw FormatException.getFormatInstance(); - } - - byte[] bytes = new byte[count]; - for (int i = 0; i < count; i++) { - // Have seen this particular error in the wild, such as at - // http://www.bcgen.com/demo/IDAutomationStreamingDataMatrix.aspx?MODE=3&D=Fred&PFMT=3&PT=F&X=0.3&O=0&LM=0.2 - if (bits.available() < 8) { - throw FormatException.getFormatInstance(); - } - bytes[i] = (byte) unrandomize255State(bits.readBits(8), codewordPosition++); - } - byteSegments.add(bytes); - try { - result.append(new String(bytes, "ISO8859_1")); - } catch (UnsupportedEncodingException uee) { - throw new IllegalStateException("Platform does not support required encoding: " + uee); - } - } - - /** - * See ISO 16022:2006, Annex B, B.2 - */ - private static int unrandomize255State(int randomizedBase256Codeword, - int base256CodewordPosition) { - int pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; - int tempVariable = randomizedBase256Codeword - pseudoRandomNumber; - return tempVariable >= 0 ? tempVariable : tempVariable + 256; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Decoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Decoder.java deleted file mode 100644 index 7a1ad6b..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Decoder.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.decoder; - -import com.google.zxing.ChecksumException; -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; -import com.google.zxing.common.reedsolomon.ReedSolomonException; - -/** - *

    The main class which implements Data Matrix Code decoding -- as opposed to locating and extracting - * the Data Matrix Code from an image.

    - * - * @author bbrown@google.com (Brian Brown) - */ -public final class Decoder { - - private final ReedSolomonDecoder rsDecoder; - - public Decoder() { - rsDecoder = new ReedSolomonDecoder(GenericGF.DATA_MATRIX_FIELD_256); - } - - /** - *

    Convenience method that can decode a Data Matrix Code represented as a 2D array of booleans. - * "true" is taken to mean a black module.

    - * - * @param image booleans representing white/black Data Matrix Code modules - * @return text and bytes encoded within the Data Matrix Code - * @throws FormatException if the Data Matrix Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - public DecoderResult decode(boolean[][] image) throws FormatException, ChecksumException { - int dimension = image.length; - BitMatrix bits = new BitMatrix(dimension); - for (int i = 0; i < dimension; i++) { - for (int j = 0; j < dimension; j++) { - if (image[i][j]) { - bits.set(j, i); - } - } - } - return decode(bits); - } - - /** - *

    Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken - * to mean a black module.

    - * - * @param bits booleans representing white/black Data Matrix Code modules - * @return text and bytes encoded within the Data Matrix Code - * @throws FormatException if the Data Matrix Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - public DecoderResult decode(BitMatrix bits) throws FormatException, ChecksumException { - - // Construct a parser and read version, error-correction level - BitMatrixParser parser = new BitMatrixParser(bits); - Version version = parser.getVersion(); - - // Read codewords - byte[] codewords = parser.readCodewords(); - // Separate into data blocks - DataBlock[] dataBlocks = DataBlock.getDataBlocks(codewords, version); - - int dataBlocksCount = dataBlocks.length; - - // Count total number of data bytes - int totalBytes = 0; - for (DataBlock db : dataBlocks) { - totalBytes += db.getNumDataCodewords(); - } - byte[] resultBytes = new byte[totalBytes]; - - // Error-correct and copy data blocks together into a stream of bytes - for (int j = 0; j < dataBlocksCount; j++) { - DataBlock dataBlock = dataBlocks[j]; - byte[] codewordBytes = dataBlock.getCodewords(); - int numDataCodewords = dataBlock.getNumDataCodewords(); - correctErrors(codewordBytes, numDataCodewords); - for (int i = 0; i < numDataCodewords; i++) { - // De-interlace data blocks. - resultBytes[i * dataBlocksCount + j] = codewordBytes[i]; - } - } - - // Decode the contents of that stream of bytes - return DecodedBitStreamParser.decode(resultBytes); - } - - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place using Reed-Solomon error correction.

    - * - * @param codewordBytes data and error correction codewords - * @param numDataCodewords number of codewords that are data bytes - * @throws ChecksumException if error correction fails - */ - private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException { - int numCodewords = codewordBytes.length; - // First read into an array of ints - int[] codewordsInts = new int[numCodewords]; - for (int i = 0; i < numCodewords; i++) { - codewordsInts[i] = codewordBytes[i] & 0xFF; - } - int numECCodewords = codewordBytes.length - numDataCodewords; - try { - rsDecoder.decode(codewordsInts, numECCodewords); - } catch (ReedSolomonException ignored) { - throw ChecksumException.getChecksumInstance(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (int i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = (byte) codewordsInts[i]; - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Version.java b/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Version.java deleted file mode 100644 index fff9e17..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/decoder/Version.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.decoder; - -import com.google.zxing.FormatException; - -/** - * The Version object encapsulates attributes about a particular - * size Data Matrix Code. - * - * @author bbrown@google.com (Brian Brown) - */ -public final class Version { - - private static final Version[] VERSIONS = buildVersions(); - - private final int versionNumber; - private final int symbolSizeRows; - private final int symbolSizeColumns; - private final int dataRegionSizeRows; - private final int dataRegionSizeColumns; - private final ECBlocks ecBlocks; - private final int totalCodewords; - - private Version(int versionNumber, - int symbolSizeRows, - int symbolSizeColumns, - int dataRegionSizeRows, - int dataRegionSizeColumns, - ECBlocks ecBlocks) { - this.versionNumber = versionNumber; - this.symbolSizeRows = symbolSizeRows; - this.symbolSizeColumns = symbolSizeColumns; - this.dataRegionSizeRows = dataRegionSizeRows; - this.dataRegionSizeColumns = dataRegionSizeColumns; - this.ecBlocks = ecBlocks; - - // Calculate the total number of codewords - int total = 0; - int ecCodewords = ecBlocks.getECCodewords(); - ECB[] ecbArray = ecBlocks.getECBlocks(); - for (ECB ecBlock : ecbArray) { - total += ecBlock.getCount() * (ecBlock.getDataCodewords() + ecCodewords); - } - this.totalCodewords = total; - } - - public int getVersionNumber() { - return versionNumber; - } - - public int getSymbolSizeRows() { - return symbolSizeRows; - } - - public int getSymbolSizeColumns() { - return symbolSizeColumns; - } - - public int getDataRegionSizeRows() { - return dataRegionSizeRows; - } - - public int getDataRegionSizeColumns() { - return dataRegionSizeColumns; - } - - public int getTotalCodewords() { - return totalCodewords; - } - - ECBlocks getECBlocks() { - return ecBlocks; - } - - /** - *

    Deduces version information from Data Matrix dimensions.

    - * - * @param numRows Number of rows in modules - * @param numColumns Number of columns in modules - * @return Version for a Data Matrix Code of those dimensions - * @throws FormatException if dimensions do correspond to a valid Data Matrix size - */ - public static Version getVersionForDimensions(int numRows, int numColumns) throws FormatException { - if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { - throw FormatException.getFormatInstance(); - } - - for (Version version : VERSIONS) { - if (version.symbolSizeRows == numRows && version.symbolSizeColumns == numColumns) { - return version; - } - } - - throw FormatException.getFormatInstance(); - } - - /** - *

    Encapsulates a set of error-correction blocks in one symbol version. Most versions will - * use blocks of differing sizes within one version, so, this encapsulates the parameters for - * each set of blocks. It also holds the number of error-correction codewords per block since it - * will be the same across all blocks within one version.

    - */ - static final class ECBlocks { - private final int ecCodewords; - private final ECB[] ecBlocks; - - private ECBlocks(int ecCodewords, ECB ecBlocks) { - this.ecCodewords = ecCodewords; - this.ecBlocks = new ECB[] { ecBlocks }; - } - - private ECBlocks(int ecCodewords, ECB ecBlocks1, ECB ecBlocks2) { - this.ecCodewords = ecCodewords; - this.ecBlocks = new ECB[] { ecBlocks1, ecBlocks2 }; - } - - int getECCodewords() { - return ecCodewords; - } - - ECB[] getECBlocks() { - return ecBlocks; - } - } - - /** - *

    Encapsualtes the parameters for one error-correction block in one symbol version. - * This includes the number of data codewords, and the number of times a block with these - * parameters is used consecutively in the Data Matrix code version's format.

    - */ - static final class ECB { - private final int count; - private final int dataCodewords; - - private ECB(int count, int dataCodewords) { - this.count = count; - this.dataCodewords = dataCodewords; - } - - int getCount() { - return count; - } - - int getDataCodewords() { - return dataCodewords; - } - } - - @Override - public String toString() { - return String.valueOf(versionNumber); - } - - /** - * See ISO 16022:2006 5.5.1 Table 7 - */ - private static Version[] buildVersions() { - return new Version[]{ - new Version(1, 10, 10, 8, 8, - new ECBlocks(5, new ECB(1, 3))), - new Version(2, 12, 12, 10, 10, - new ECBlocks(7, new ECB(1, 5))), - new Version(3, 14, 14, 12, 12, - new ECBlocks(10, new ECB(1, 8))), - new Version(4, 16, 16, 14, 14, - new ECBlocks(12, new ECB(1, 12))), - new Version(5, 18, 18, 16, 16, - new ECBlocks(14, new ECB(1, 18))), - new Version(6, 20, 20, 18, 18, - new ECBlocks(18, new ECB(1, 22))), - new Version(7, 22, 22, 20, 20, - new ECBlocks(20, new ECB(1, 30))), - new Version(8, 24, 24, 22, 22, - new ECBlocks(24, new ECB(1, 36))), - new Version(9, 26, 26, 24, 24, - new ECBlocks(28, new ECB(1, 44))), - new Version(10, 32, 32, 14, 14, - new ECBlocks(36, new ECB(1, 62))), - new Version(11, 36, 36, 16, 16, - new ECBlocks(42, new ECB(1, 86))), - new Version(12, 40, 40, 18, 18, - new ECBlocks(48, new ECB(1, 114))), - new Version(13, 44, 44, 20, 20, - new ECBlocks(56, new ECB(1, 144))), - new Version(14, 48, 48, 22, 22, - new ECBlocks(68, new ECB(1, 174))), - new Version(15, 52, 52, 24, 24, - new ECBlocks(42, new ECB(2, 102))), - new Version(16, 64, 64, 14, 14, - new ECBlocks(56, new ECB(2, 140))), - new Version(17, 72, 72, 16, 16, - new ECBlocks(36, new ECB(4, 92))), - new Version(18, 80, 80, 18, 18, - new ECBlocks(48, new ECB(4, 114))), - new Version(19, 88, 88, 20, 20, - new ECBlocks(56, new ECB(4, 144))), - new Version(20, 96, 96, 22, 22, - new ECBlocks(68, new ECB(4, 174))), - new Version(21, 104, 104, 24, 24, - new ECBlocks(56, new ECB(6, 136))), - new Version(22, 120, 120, 18, 18, - new ECBlocks(68, new ECB(6, 175))), - new Version(23, 132, 132, 20, 20, - new ECBlocks(62, new ECB(8, 163))), - new Version(24, 144, 144, 22, 22, - new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))), - new Version(25, 8, 18, 6, 16, - new ECBlocks(7, new ECB(1, 5))), - new Version(26, 8, 32, 6, 14, - new ECBlocks(11, new ECB(1, 10))), - new Version(27, 12, 26, 10, 24, - new ECBlocks(14, new ECB(1, 16))), - new Version(28, 12, 36, 10, 16, - new ECBlocks(18, new ECB(1, 22))), - new Version(29, 16, 36, 14, 16, - new ECBlocks(24, new ECB(1, 32))), - new Version(30, 16, 48, 14, 22, - new ECBlocks(28, new ECB(1, 49))) - }; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/detector/Detector.java b/zxing/src/main/java/com/google/zxing/datamatrix/detector/Detector.java deleted file mode 100644 index 3c2db43..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/detector/Detector.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.detector; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.common.GridSampler; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.common.detector.WhiteRectangleDetector; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - *

    Encapsulates logic that can detect a Data Matrix Code in an image, even if the Data Matrix Code - * is rotated or skewed, or partially obscured.

    - * - * @author Sean Owen - */ -public final class Detector { - - private final BitMatrix image; - private final WhiteRectangleDetector rectangleDetector; - - public Detector(BitMatrix image) throws NotFoundException { - this.image = image; - rectangleDetector = new WhiteRectangleDetector(image); - } - - /** - *

    Detects a Data Matrix Code in an image.

    - * - * @return {@link DetectorResult} encapsulating results of detecting a Data Matrix Code - * @throws NotFoundException if no Data Matrix Code can be found - */ - public DetectorResult detect() throws NotFoundException { - - ResultPoint[] cornerPoints = rectangleDetector.detect(); - ResultPoint pointA = cornerPoints[0]; - ResultPoint pointB = cornerPoints[1]; - ResultPoint pointC = cornerPoints[2]; - ResultPoint pointD = cornerPoints[3]; - - // Point A and D are across the diagonal from one another, - // as are B and C. Figure out which are the solid black lines - // by counting transitions - List transitions = new ArrayList<>(4); - transitions.add(transitionsBetween(pointA, pointB)); - transitions.add(transitionsBetween(pointA, pointC)); - transitions.add(transitionsBetween(pointB, pointD)); - transitions.add(transitionsBetween(pointC, pointD)); - Collections.sort(transitions, new ResultPointsAndTransitionsComparator()); - - // Sort by number of transitions. First two will be the two solid sides; last two - // will be the two alternating black/white sides - ResultPointsAndTransitions lSideOne = transitions.get(0); - ResultPointsAndTransitions lSideTwo = transitions.get(1); - - // Figure out which point is their intersection by tallying up the number of times we see the - // endpoints in the four endpoints. One will show up twice. - Map pointCount = new HashMap<>(); - increment(pointCount, lSideOne.getFrom()); - increment(pointCount, lSideOne.getTo()); - increment(pointCount, lSideTwo.getFrom()); - increment(pointCount, lSideTwo.getTo()); - - ResultPoint maybeTopLeft = null; - ResultPoint bottomLeft = null; - ResultPoint maybeBottomRight = null; - for (Map.Entry entry : pointCount.entrySet()) { - ResultPoint point = entry.getKey(); - Integer value = entry.getValue(); - if (value == 2) { - bottomLeft = point; // this is definitely the bottom left, then -- end of two L sides - } else { - // Otherwise it's either top left or bottom right -- just assign the two arbitrarily now - if (maybeTopLeft == null) { - maybeTopLeft = point; - } else { - maybeBottomRight = point; - } - } - } - - if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) { - throw NotFoundException.getNotFoundInstance(); - } - - // Bottom left is correct but top left and bottom right might be switched - ResultPoint[] corners = { maybeTopLeft, bottomLeft, maybeBottomRight }; - // Use the dot product trick to sort them out - ResultPoint.orderBestPatterns(corners); - - // Now we know which is which: - ResultPoint bottomRight = corners[0]; - bottomLeft = corners[1]; - ResultPoint topLeft = corners[2]; - - // Which point didn't we find in relation to the "L" sides? that's the top right corner - ResultPoint topRight; - if (!pointCount.containsKey(pointA)) { - topRight = pointA; - } else if (!pointCount.containsKey(pointB)) { - topRight = pointB; - } else if (!pointCount.containsKey(pointC)) { - topRight = pointC; - } else { - topRight = pointD; - } - - // Next determine the dimension by tracing along the top or right side and counting black/white - // transitions. Since we start inside a black module, we should see a number of transitions - // equal to 1 less than the code dimension. Well, actually 2 less, because we are going to - // end on a black module: - - // The top right point is actually the corner of a module, which is one of the two black modules - // adjacent to the white module at the top right. Tracing to that corner from either the top left - // or bottom right should work here. - - int dimensionTop = transitionsBetween(topLeft, topRight).getTransitions(); - int dimensionRight = transitionsBetween(bottomRight, topRight).getTransitions(); - - if ((dimensionTop & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionTop++; - } - dimensionTop += 2; - - if ((dimensionRight & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionRight++; - } - dimensionRight += 2; - - BitMatrix bits; - ResultPoint correctedTopRight; - - // Rectanguar symbols are 6x16, 6x28, 10x24, 10x32, 14x32, or 14x44. If one dimension is more - // than twice the other, it's certainly rectangular, but to cut a bit more slack we accept it as - // rectangular if the bigger side is at least 7/4 times the other: - if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { - // The matrix is rectangular - - correctedTopRight = - correctTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight, dimensionTop, dimensionRight); - if (correctedTopRight == null) { - correctedTopRight = topRight; - } - - dimensionTop = transitionsBetween(topLeft, correctedTopRight).getTransitions(); - dimensionRight = transitionsBetween(bottomRight, correctedTopRight).getTransitions(); - - if ((dimensionTop & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionTop++; - } - - if ((dimensionRight & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionRight++; - } - - bits = sampleGrid(image, topLeft, bottomLeft, bottomRight, correctedTopRight, dimensionTop, dimensionRight); - - } else { - // The matrix is square - - int dimension = Math.min(dimensionRight, dimensionTop); - // correct top right point to match the white module - correctedTopRight = correctTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension); - if (correctedTopRight == null) { - correctedTopRight = topRight; - } - - // Redetermine the dimension using the corrected top right point - int dimensionCorrected = Math.max(transitionsBetween(topLeft, correctedTopRight).getTransitions(), - transitionsBetween(bottomRight, correctedTopRight).getTransitions()); - dimensionCorrected++; - if ((dimensionCorrected & 0x01) == 1) { - dimensionCorrected++; - } - - bits = sampleGrid(image, - topLeft, - bottomLeft, - bottomRight, - correctedTopRight, - dimensionCorrected, - dimensionCorrected); - } - - return new DetectorResult(bits, new ResultPoint[]{topLeft, bottomLeft, bottomRight, correctedTopRight}); - } - - /** - * Calculates the position of the white top right module using the output of the rectangle detector - * for a rectangular matrix - */ - private ResultPoint correctTopRightRectangular(ResultPoint bottomLeft, - ResultPoint bottomRight, - ResultPoint topLeft, - ResultPoint topRight, - int dimensionTop, - int dimensionRight) { - - float corr = distance(bottomLeft, bottomRight) / (float) dimensionTop; - int norm = distance(topLeft, topRight); - float cos = (topRight.getX() - topLeft.getX()) / norm; - float sin = (topRight.getY() - topLeft.getY()) / norm; - - ResultPoint c1 = new ResultPoint(topRight.getX() + corr * cos, topRight.getY() + corr * sin); - - corr = distance(bottomLeft, topLeft) / (float) dimensionRight; - norm = distance(bottomRight, topRight); - cos = (topRight.getX() - bottomRight.getX()) / norm; - sin = (topRight.getY() - bottomRight.getY()) / norm; - - ResultPoint c2 = new ResultPoint(topRight.getX() + corr * cos, topRight.getY() + corr * sin); - - if (!isValid(c1)) { - if (isValid(c2)) { - return c2; - } - return null; - } - if (!isValid(c2)) { - return c1; - } - - int l1 = Math.abs(dimensionTop - transitionsBetween(topLeft, c1).getTransitions()) + - Math.abs(dimensionRight - transitionsBetween(bottomRight, c1).getTransitions()); - int l2 = Math.abs(dimensionTop - transitionsBetween(topLeft, c2).getTransitions()) + - Math.abs(dimensionRight - transitionsBetween(bottomRight, c2).getTransitions()); - - if (l1 <= l2) { - return c1; - } - - return c2; - } - - /** - * Calculates the position of the white top right module using the output of the rectangle detector - * for a square matrix - */ - private ResultPoint correctTopRight(ResultPoint bottomLeft, - ResultPoint bottomRight, - ResultPoint topLeft, - ResultPoint topRight, - int dimension) { - - float corr = distance(bottomLeft, bottomRight) / (float) dimension; - int norm = distance(topLeft, topRight); - float cos = (topRight.getX() - topLeft.getX()) / norm; - float sin = (topRight.getY() - topLeft.getY()) / norm; - - ResultPoint c1 = new ResultPoint(topRight.getX() + corr * cos, topRight.getY() + corr * sin); - - corr = distance(bottomLeft, topLeft) / (float) dimension; - norm = distance(bottomRight, topRight); - cos = (topRight.getX() - bottomRight.getX()) / norm; - sin = (topRight.getY() - bottomRight.getY()) / norm; - - ResultPoint c2 = new ResultPoint(topRight.getX() + corr * cos, topRight.getY() + corr * sin); - - if (!isValid(c1)) { - if (isValid(c2)) { - return c2; - } - return null; - } - if (!isValid(c2)) { - return c1; - } - - int l1 = Math.abs(transitionsBetween(topLeft, c1).getTransitions() - - transitionsBetween(bottomRight, c1).getTransitions()); - int l2 = Math.abs(transitionsBetween(topLeft, c2).getTransitions() - - transitionsBetween(bottomRight, c2).getTransitions()); - - return l1 <= l2 ? c1 : c2; - } - - private boolean isValid(ResultPoint p) { - return p.getX() >= 0 && p.getX() < image.getWidth() && p.getY() > 0 && p.getY() < image.getHeight(); - } - - private static int distance(ResultPoint a, ResultPoint b) { - return MathUtils.round(ResultPoint.distance(a, b)); - } - - /** - * Increments the Integer associated with a key by one. - */ - private static void increment(Map table, ResultPoint key) { - Integer value = table.get(key); - table.put(key, value == null ? 1 : value + 1); - } - - private static BitMatrix sampleGrid(BitMatrix image, - ResultPoint topLeft, - ResultPoint bottomLeft, - ResultPoint bottomRight, - ResultPoint topRight, - int dimensionX, - int dimensionY) throws NotFoundException { - - GridSampler sampler = GridSampler.getInstance(); - - return sampler.sampleGrid(image, - dimensionX, - dimensionY, - 0.5f, - 0.5f, - dimensionX - 0.5f, - 0.5f, - dimensionX - 0.5f, - dimensionY - 0.5f, - 0.5f, - dimensionY - 0.5f, - topLeft.getX(), - topLeft.getY(), - topRight.getX(), - topRight.getY(), - bottomRight.getX(), - bottomRight.getY(), - bottomLeft.getX(), - bottomLeft.getY()); - } - - /** - * Counts the number of black/white transitions between two points, using something like Bresenham's algorithm. - */ - private ResultPointsAndTransitions transitionsBetween(ResultPoint from, ResultPoint to) { - // See QR Code Detector, sizeOfBlackWhiteBlackRun() - int fromX = (int) from.getX(); - int fromY = (int) from.getY(); - int toX = (int) to.getX(); - int toY = (int) to.getY(); - boolean steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) { - int temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - int dx = Math.abs(toX - fromX); - int dy = Math.abs(toY - fromY); - int error = -dx / 2; - int ystep = fromY < toY ? 1 : -1; - int xstep = fromX < toX ? 1 : -1; - int transitions = 0; - boolean inBlack = image.get(steep ? fromY : fromX, steep ? fromX : fromY); - for (int x = fromX, y = fromY; x != toX; x += xstep) { - boolean isBlack = image.get(steep ? y : x, steep ? x : y); - if (isBlack != inBlack) { - transitions++; - inBlack = isBlack; - } - error += dy; - if (error > 0) { - if (y == toY) { - break; - } - y += ystep; - error -= dx; - } - } - return new ResultPointsAndTransitions(from, to, transitions); - } - - /** - * Simply encapsulates two points and a number of transitions between them. - */ - private static final class ResultPointsAndTransitions { - - private final ResultPoint from; - private final ResultPoint to; - private final int transitions; - - private ResultPointsAndTransitions(ResultPoint from, ResultPoint to, int transitions) { - this.from = from; - this.to = to; - this.transitions = transitions; - } - - ResultPoint getFrom() { - return from; - } - - ResultPoint getTo() { - return to; - } - - public int getTransitions() { - return transitions; - } - - @Override - public String toString() { - return from + "/" + to + '/' + transitions; - } - } - - /** - * Orders ResultPointsAndTransitions by number of transitions, ascending. - */ - private static final class ResultPointsAndTransitionsComparator - implements Comparator, Serializable { - @Override - public int compare(ResultPointsAndTransitions o1, ResultPointsAndTransitions o2) { - return o1.getTransitions() - o2.getTransitions(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ASCIIEncoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ASCIIEncoder.java deleted file mode 100644 index b9cb72b..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ASCIIEncoder.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class ASCIIEncoder implements Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.ASCII_ENCODATION; - } - - @Override - public void encode(EncoderContext context) { - //step B - int n = HighLevelEncoder.determineConsecutiveDigitCount(context.getMessage(), context.pos); - if (n >= 2) { - context.writeCodeword(encodeASCIIDigits(context.getMessage().charAt(context.pos), - context.getMessage().charAt(context.pos + 1))); - context.pos += 2; - } else { - char c = context.getCurrentChar(); - int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - switch (newMode) { - case HighLevelEncoder.BASE256_ENCODATION: - context.writeCodeword(HighLevelEncoder.LATCH_TO_BASE256); - context.signalEncoderChange(HighLevelEncoder.BASE256_ENCODATION); - return; - case HighLevelEncoder.C40_ENCODATION: - context.writeCodeword(HighLevelEncoder.LATCH_TO_C40); - context.signalEncoderChange(HighLevelEncoder.C40_ENCODATION); - return; - case HighLevelEncoder.X12_ENCODATION: - context.writeCodeword(HighLevelEncoder.LATCH_TO_ANSIX12); - context.signalEncoderChange(HighLevelEncoder.X12_ENCODATION); - break; - case HighLevelEncoder.TEXT_ENCODATION: - context.writeCodeword(HighLevelEncoder.LATCH_TO_TEXT); - context.signalEncoderChange(HighLevelEncoder.TEXT_ENCODATION); - break; - case HighLevelEncoder.EDIFACT_ENCODATION: - context.writeCodeword(HighLevelEncoder.LATCH_TO_EDIFACT); - context.signalEncoderChange(HighLevelEncoder.EDIFACT_ENCODATION); - break; - default: - throw new IllegalStateException("Illegal mode: " + newMode); - } - } else if (HighLevelEncoder.isExtendedASCII(c)) { - context.writeCodeword(HighLevelEncoder.UPPER_SHIFT); - context.writeCodeword((char) (c - 128 + 1)); - context.pos++; - } else { - context.writeCodeword((char) (c + 1)); - context.pos++; - } - - } - } - - private static char encodeASCIIDigits(char digit1, char digit2) { - if (HighLevelEncoder.isDigit(digit1) && HighLevelEncoder.isDigit(digit2)) { - int num = (digit1 - 48) * 10 + (digit2 - 48); - return (char) (num + 130); - } - throw new IllegalArgumentException("not digits: " + digit1 + digit2); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java deleted file mode 100644 index b66e485..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class Base256Encoder implements Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.BASE256_ENCODATION; - } - - @Override - public void encode(EncoderContext context) { - StringBuilder buffer = new StringBuilder(); - buffer.append('\0'); //Initialize length field - while (context.hasMoreCharacters()) { - char c = context.getCurrentChar(); - buffer.append(c); - - context.pos++; - - int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - int dataCount = buffer.length() - 1; - int lengthFieldSize = 1; - int currentSize = context.getCodewordCount() + dataCount + lengthFieldSize; - context.updateSymbolInfo(currentSize); - boolean mustPad = (context.getSymbolInfo().getDataCapacity() - currentSize) > 0; - if (context.hasMoreCharacters() || mustPad) { - if (dataCount <= 249) { - buffer.setCharAt(0, (char) dataCount); - } else if (dataCount > 249 && dataCount <= 1555) { - buffer.setCharAt(0, (char) ((dataCount / 250) + 249)); - buffer.insert(1, (char) (dataCount % 250)); - } else { - throw new IllegalStateException( - "Message length not in valid ranges: " + dataCount); - } - } - for (int i = 0, c = buffer.length(); i < c; i++) { - context.writeCodeword(randomize255State( - buffer.charAt(i), context.getCodewordCount() + 1)); - } - } - - private static char randomize255State(char ch, int codewordPosition) { - int pseudoRandom = ((149 * codewordPosition) % 255) + 1; - int tempVariable = ch + pseudoRandom; - if (tempVariable <= 255) { - return (char) tempVariable; - } else { - return (char) (tempVariable - 256); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java deleted file mode 100644 index acd02f6..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -class C40Encoder implements Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.C40_ENCODATION; - } - - @Override - public void encode(EncoderContext context) { - //step C - StringBuilder buffer = new StringBuilder(); - while (context.hasMoreCharacters()) { - char c = context.getCurrentChar(); - context.pos++; - - int lastCharSize = encodeChar(c, buffer); - - int unwritten = (buffer.length() / 3) * 2; - - int curCodewordCount = context.getCodewordCount() + unwritten; - context.updateSymbolInfo(curCodewordCount); - int available = context.getSymbolInfo().getDataCapacity() - curCodewordCount; - - if (!context.hasMoreCharacters()) { - //Avoid having a single C40 value in the last triplet - StringBuilder removed = new StringBuilder(); - if ((buffer.length() % 3) == 2) { - if (available < 2 || available > 2) { - lastCharSize = backtrackOneCharacter(context, buffer, removed, - lastCharSize); - } - } - while ((buffer.length() % 3) == 1 - && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { - lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize); - } - break; - } - - int count = buffer.length(); - if ((count % 3) == 0) { - int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - } - handleEOD(context, buffer); - } - - private int backtrackOneCharacter(EncoderContext context, - StringBuilder buffer, StringBuilder removed, int lastCharSize) { - int count = buffer.length(); - buffer.delete(count - lastCharSize, count); - context.pos--; - char c = context.getCurrentChar(); - lastCharSize = encodeChar(c, removed); - context.resetSymbolInfo(); //Deal with possible reduction in symbol size - return lastCharSize; - } - - static void writeNextTriplet(EncoderContext context, StringBuilder buffer) { - context.writeCodewords(encodeToCodewords(buffer, 0)); - buffer.delete(0, 3); - } - - /** - * Handle "end of data" situations - * - * @param context the encoder context - * @param buffer the buffer with the remaining encoded characters - */ - void handleEOD(EncoderContext context, StringBuilder buffer) { - int unwritten = (buffer.length() / 3) * 2; - int rest = buffer.length() % 3; - - int curCodewordCount = context.getCodewordCount() + unwritten; - context.updateSymbolInfo(curCodewordCount); - int available = context.getSymbolInfo().getDataCapacity() - curCodewordCount; - - if (rest == 2) { - buffer.append('\0'); //Shift 1 - while (buffer.length() >= 3) { - writeNextTriplet(context, buffer); - } - if (context.hasMoreCharacters()) { - context.writeCodeword(HighLevelEncoder.C40_UNLATCH); - } - } else if (available == 1 && rest == 1) { - while (buffer.length() >= 3) { - writeNextTriplet(context, buffer); - } - if (context.hasMoreCharacters()) { - context.writeCodeword(HighLevelEncoder.C40_UNLATCH); - } - // else no unlatch - context.pos--; - } else if (rest == 0) { - while (buffer.length() >= 3) { - writeNextTriplet(context, buffer); - } - if (available > 0 || context.hasMoreCharacters()) { - context.writeCodeword(HighLevelEncoder.C40_UNLATCH); - } - } else { - throw new IllegalStateException("Unexpected case. Please report!"); - } - context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); - } - - int encodeChar(char c, StringBuilder sb) { - if (c == ' ') { - sb.append('\3'); - return 1; - } else if (c >= '0' && c <= '9') { - sb.append((char) (c - 48 + 4)); - return 1; - } else if (c >= 'A' && c <= 'Z') { - sb.append((char) (c - 65 + 14)); - return 1; - } else if (c >= '\0' && c <= '\u001f') { - sb.append('\0'); //Shift 1 Set - sb.append(c); - return 2; - } else if (c >= '!' && c <= '/') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 33)); - return 2; - } else if (c >= ':' && c <= '@') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 58 + 15)); - return 2; - } else if (c >= '[' && c <= '_') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 91 + 22)); - return 2; - } else if (c >= '\u0060' && c <= '\u007f') { - sb.append('\2'); //Shift 3 Set - sb.append((char) (c - 96)); - return 2; - } else if (c >= '\u0080') { - sb.append("\1\u001e"); //Shift 2, Upper Shift - int len = 2; - len += encodeChar((char) (c - 128), sb); - return len; - } else { - throw new IllegalArgumentException("Illegal character: " + c); - } - } - - private static String encodeToCodewords(CharSequence sb, int startPos) { - char c1 = sb.charAt(startPos); - char c2 = sb.charAt(startPos + 1); - char c3 = sb.charAt(startPos + 2); - int v = (1600 * c1) + (40 * c2) + c3 + 1; - char cw1 = (char) (v / 256); - char cw2 = (char) (v % 256); - return new String(new char[] {cw1, cw2}); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DataMatrixSymbolInfo144.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DataMatrixSymbolInfo144.java deleted file mode 100644 index 3146353..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DataMatrixSymbolInfo144.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class DataMatrixSymbolInfo144 extends SymbolInfo { - - DataMatrixSymbolInfo144() { - super(false, 1558, 620, 22, 22, 36, -1, 62); - } - - @Override - public int getInterleavedBlockCount() { - return 10; - } - - @Override - public int getDataLengthForInterleavedBlock(int index) { - return (index <= 8) ? 156 : 155; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DefaultPlacement.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DefaultPlacement.java deleted file mode 100644 index dc5045c..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/DefaultPlacement.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -import java.util.Arrays; - -/** - * Symbol Character Placement Program. Adapted from Annex M.1 in ISO/IEC 16022:2000(E). - */ -public class DefaultPlacement { - - private final CharSequence codewords; - private final int numrows; - private final int numcols; - private final byte[] bits; - - /** - * Main constructor - * - * @param codewords the codewords to place - * @param numcols the number of columns - * @param numrows the number of rows - */ - public DefaultPlacement(CharSequence codewords, int numcols, int numrows) { - this.codewords = codewords; - this.numcols = numcols; - this.numrows = numrows; - this.bits = new byte[numcols * numrows]; - Arrays.fill(this.bits, (byte) -1); //Initialize with "not set" value - } - - final int getNumrows() { - return numrows; - } - - final int getNumcols() { - return numcols; - } - - final byte[] getBits() { - return bits; - } - - public final boolean getBit(int col, int row) { - return bits[row * numcols + col] == 1; - } - - final void setBit(int col, int row, boolean bit) { - bits[row * numcols + col] = (byte) (bit ? 1 : 0); - } - - final boolean hasBit(int col, int row) { - return bits[row * numcols + col] >= 0; - } - - public final void place() { - int pos = 0; - int row = 4; - int col = 0; - - do { - /* repeatedly first check for one of the special corner cases, then... */ - if ((row == numrows) && (col == 0)) { - corner1(pos++); - } - if ((row == numrows - 2) && (col == 0) && ((numcols % 4) != 0)) { - corner2(pos++); - } - if ((row == numrows - 2) && (col == 0) && (numcols % 8 == 4)) { - corner3(pos++); - } - if ((row == numrows + 4) && (col == 2) && ((numcols % 8) == 0)) { - corner4(pos++); - } - /* sweep upward diagonally, inserting successive characters... */ - do { - if ((row < numrows) && (col >= 0) && !hasBit(col, row)) { - utah(row, col, pos++); - } - row -= 2; - col += 2; - } while (row >= 0 && (col < numcols)); - row++; - col += 3; - - /* and then sweep downward diagonally, inserting successive characters, ... */ - do { - if ((row >= 0) && (col < numcols) && !hasBit(col, row)) { - utah(row, col, pos++); - } - row += 2; - col -= 2; - } while ((row < numrows) && (col >= 0)); - row += 3; - col++; - - /* ...until the entire array is scanned */ - } while ((row < numrows) || (col < numcols)); - - /* Lastly, if the lower righthand corner is untouched, fill in fixed pattern */ - if (!hasBit(numcols - 1, numrows - 1)) { - setBit(numcols - 1, numrows - 1, true); - setBit(numcols - 2, numrows - 2, true); - } - } - - private void module(int row, int col, int pos, int bit) { - if (row < 0) { - row += numrows; - col += 4 - ((numrows + 4) % 8); - } - if (col < 0) { - col += numcols; - row += 4 - ((numcols + 4) % 8); - } - // Note the conversion: - int v = codewords.charAt(pos); - v &= 1 << (8 - bit); - setBit(col, row, v != 0); - } - - /** - * Places the 8 bits of a utah-shaped symbol character in ECC200. - * - * @param row the row - * @param col the column - * @param pos character position - */ - private void utah(int row, int col, int pos) { - module(row - 2, col - 2, pos, 1); - module(row - 2, col - 1, pos, 2); - module(row - 1, col - 2, pos, 3); - module(row - 1, col - 1, pos, 4); - module(row - 1, col, pos, 5); - module(row, col - 2, pos, 6); - module(row, col - 1, pos, 7); - module(row, col, pos, 8); - } - - private void corner1(int pos) { - module(numrows - 1, 0, pos, 1); - module(numrows - 1, 1, pos, 2); - module(numrows - 1, 2, pos, 3); - module(0, numcols - 2, pos, 4); - module(0, numcols - 1, pos, 5); - module(1, numcols - 1, pos, 6); - module(2, numcols - 1, pos, 7); - module(3, numcols - 1, pos, 8); - } - - private void corner2(int pos) { - module(numrows - 3, 0, pos, 1); - module(numrows - 2, 0, pos, 2); - module(numrows - 1, 0, pos, 3); - module(0, numcols - 4, pos, 4); - module(0, numcols - 3, pos, 5); - module(0, numcols - 2, pos, 6); - module(0, numcols - 1, pos, 7); - module(1, numcols - 1, pos, 8); - } - - private void corner3(int pos) { - module(numrows - 3, 0, pos, 1); - module(numrows - 2, 0, pos, 2); - module(numrows - 1, 0, pos, 3); - module(0, numcols - 2, pos, 4); - module(0, numcols - 1, pos, 5); - module(1, numcols - 1, pos, 6); - module(2, numcols - 1, pos, 7); - module(3, numcols - 1, pos, 8); - } - - private void corner4(int pos) { - module(numrows - 1, 0, pos, 1); - module(numrows - 1, numcols - 1, pos, 2); - module(0, numcols - 3, pos, 3); - module(0, numcols - 2, pos, 4); - module(0, numcols - 1, pos, 5); - module(1, numcols - 3, pos, 6); - module(1, numcols - 2, pos, 7); - module(1, numcols - 1, pos, 8); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java deleted file mode 100644 index dbb3f13..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class EdifactEncoder implements Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.EDIFACT_ENCODATION; - } - - @Override - public void encode(EncoderContext context) { - //step F - StringBuilder buffer = new StringBuilder(); - while (context.hasMoreCharacters()) { - char c = context.getCurrentChar(); - encodeChar(c, buffer); - context.pos++; - - int count = buffer.length(); - if (count >= 4) { - context.writeCodewords(encodeToCodewords(buffer, 0)); - buffer.delete(0, 4); - - int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); - break; - } - } - } - buffer.append((char) 31); //Unlatch - handleEOD(context, buffer); - } - - /** - * Handle "end of data" situations - * - * @param context the encoder context - * @param buffer the buffer with the remaining encoded characters - */ - private static void handleEOD(EncoderContext context, CharSequence buffer) { - try { - int count = buffer.length(); - if (count == 0) { - return; //Already finished - } - if (count == 1) { - //Only an unlatch at the end - context.updateSymbolInfo(); - int available = context.getSymbolInfo().getDataCapacity() - context.getCodewordCount(); - int remaining = context.getRemainingCharacters(); - if (remaining == 0 && available <= 2) { - return; //No unlatch - } - } - - if (count > 4) { - throw new IllegalStateException("Count must not exceed 4"); - } - int restChars = count - 1; - String encoded = encodeToCodewords(buffer, 0); - boolean endOfSymbolReached = !context.hasMoreCharacters(); - boolean restInAscii = endOfSymbolReached && restChars <= 2; - - if (restChars <= 2) { - context.updateSymbolInfo(context.getCodewordCount() + restChars); - int available = context.getSymbolInfo().getDataCapacity() - context.getCodewordCount(); - if (available >= 3) { - restInAscii = false; - context.updateSymbolInfo(context.getCodewordCount() + encoded.length()); - //available = context.symbolInfo.dataCapacity - context.getCodewordCount(); - } - } - - if (restInAscii) { - context.resetSymbolInfo(); - context.pos -= restChars; - } else { - context.writeCodewords(encoded); - } - } finally { - context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); - } - } - - private static void encodeChar(char c, StringBuilder sb) { - if (c >= ' ' && c <= '?') { - sb.append(c); - } else if (c >= '@' && c <= '^') { - sb.append((char) (c - 64)); - } else { - HighLevelEncoder.illegalCharacter(c); - } - } - - private static String encodeToCodewords(CharSequence sb, int startPos) { - int len = sb.length() - startPos; - if (len == 0) { - throw new IllegalStateException("StringBuilder must not be empty"); - } - char c1 = sb.charAt(startPos); - char c2 = len >= 2 ? sb.charAt(startPos + 1) : 0; - char c3 = len >= 3 ? sb.charAt(startPos + 2) : 0; - char c4 = len >= 4 ? sb.charAt(startPos + 3) : 0; - - int v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; - char cw1 = (char) ((v >> 16) & 255); - char cw2 = (char) ((v >> 8) & 255); - char cw3 = (char) (v & 255); - StringBuilder res = new StringBuilder(3); - res.append(cw1); - if (len >= 2) { - res.append(cw2); - } - if (len >= 3) { - res.append(cw3); - } - return res.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Encoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Encoder.java deleted file mode 100644 index 7a91e1e..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/Encoder.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -interface Encoder { - - int getEncodingMode(); - - void encode(EncoderContext context); - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java deleted file mode 100644 index ba92278..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/EncoderContext.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -import com.google.zxing.Dimension; - -import java.nio.charset.Charset; - -final class EncoderContext { - - private final String msg; - private SymbolShapeHint shape; - private Dimension minSize; - private Dimension maxSize; - private final StringBuilder codewords; - int pos; - private int newEncoding; - private SymbolInfo symbolInfo; - private int skipAtEnd; - - EncoderContext(String msg) { - //From this point on Strings are not Unicode anymore! - byte[] msgBinary = msg.getBytes(Charset.forName("ISO-8859-1")); - StringBuilder sb = new StringBuilder(msgBinary.length); - for (int i = 0, c = msgBinary.length; i < c; i++) { - char ch = (char) (msgBinary[i] & 0xff); - if (ch == '?' && msg.charAt(i) != '?') { - throw new IllegalArgumentException("Message contains characters outside ISO-8859-1 encoding."); - } - sb.append(ch); - } - this.msg = sb.toString(); //Not Unicode here! - shape = SymbolShapeHint.FORCE_NONE; - this.codewords = new StringBuilder(msg.length()); - newEncoding = -1; - } - - public void setSymbolShape(SymbolShapeHint shape) { - this.shape = shape; - } - - public void setSizeConstraints(Dimension minSize, Dimension maxSize) { - this.minSize = minSize; - this.maxSize = maxSize; - } - - public String getMessage() { - return this.msg; - } - - public void setSkipAtEnd(int count) { - this.skipAtEnd = count; - } - - public char getCurrentChar() { - return msg.charAt(pos); - } - - public char getCurrent() { - return msg.charAt(pos); - } - - public StringBuilder getCodewords() { - return codewords; - } - - public void writeCodewords(String codewords) { - this.codewords.append(codewords); - } - - public void writeCodeword(char codeword) { - this.codewords.append(codeword); - } - - public int getCodewordCount() { - return this.codewords.length(); - } - - public int getNewEncoding() { - return newEncoding; - } - - public void signalEncoderChange(int encoding) { - this.newEncoding = encoding; - } - - public void resetEncoderSignal() { - this.newEncoding = -1; - } - - public boolean hasMoreCharacters() { - return pos < getTotalMessageCharCount(); - } - - private int getTotalMessageCharCount() { - return msg.length() - skipAtEnd; - } - - public int getRemainingCharacters() { - return getTotalMessageCharCount() - pos; - } - - public SymbolInfo getSymbolInfo() { - return symbolInfo; - } - - public void updateSymbolInfo() { - updateSymbolInfo(getCodewordCount()); - } - - public void updateSymbolInfo(int len) { - if (this.symbolInfo == null || len > this.symbolInfo.getDataCapacity()) { - this.symbolInfo = SymbolInfo.lookup(len, shape, minSize, maxSize, true); - } - } - - public void resetSymbolInfo() { - this.symbolInfo = null; - } -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ErrorCorrection.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ErrorCorrection.java deleted file mode 100644 index d389334..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/ErrorCorrection.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -/** - * Error Correction Code for ECC200. - */ -public final class ErrorCorrection { - - /** - * Lookup table which factors to use for which number of error correction codewords. - * See FACTORS. - */ - private static final int[] FACTOR_SETS - = {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68}; - - /** - * Precomputed polynomial factors for ECC 200. - */ - private static final int[][] FACTORS = { - {228, 48, 15, 111, 62}, - {23, 68, 144, 134, 240, 92, 254}, - {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, - {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, - {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, - {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, - {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, - {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, - {52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, - 254, 124, 12, 181, 184, 96, 50, 193}, - {211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, - 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255}, - {245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, - 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, - 225, 98, 81, 112}, - {77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, - 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, - 248, 202, 69, 50, 150, 177, 226, 5, 9, 5}, - {245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, - 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, - 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19}, - {175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, - 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, - 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, - 155, 43, 203, 107, 233, 53, 143, 46}, - {242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, - 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, - 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, - 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204}, - {220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, - 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, - 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, - 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, - 96, 103, 82, 186}}; - - private static final int MODULO_VALUE = 0x12D; - - private static final int[] LOG; - private static final int[] ALOG; - - static { - //Create log and antilog table - LOG = new int[256]; - ALOG = new int[255]; - - int p = 1; - for (int i = 0; i < 255; i++) { - ALOG[i] = p; - LOG[p] = i; - p *= 2; - if (p >= 256) { - p ^= MODULO_VALUE; - } - } - } - - private ErrorCorrection() { - } - - /** - * Creates the ECC200 error correction for an encoded message. - * - * @param codewords the codewords - * @param symbolInfo information about the symbol to be encoded - * @return the codewords with interleaved error correction. - */ - public static String encodeECC200(String codewords, SymbolInfo symbolInfo) { - if (codewords.length() != symbolInfo.getDataCapacity()) { - throw new IllegalArgumentException( - "The number of codewords does not match the selected symbol"); - } - StringBuilder sb = new StringBuilder(symbolInfo.getDataCapacity() + symbolInfo.getErrorCodewords()); - sb.append(codewords); - int blockCount = symbolInfo.getInterleavedBlockCount(); - if (blockCount == 1) { - String ecc = createECCBlock(codewords, symbolInfo.getErrorCodewords()); - sb.append(ecc); - } else { - sb.setLength(sb.capacity()); - int[] dataSizes = new int[blockCount]; - int[] errorSizes = new int[blockCount]; - int[] startPos = new int[blockCount]; - for (int i = 0; i < blockCount; i++) { - dataSizes[i] = symbolInfo.getDataLengthForInterleavedBlock(i + 1); - errorSizes[i] = symbolInfo.getErrorLengthForInterleavedBlock(i + 1); - startPos[i] = 0; - if (i > 0) { - startPos[i] = startPos[i - 1] + dataSizes[i]; - } - } - for (int block = 0; block < blockCount; block++) { - StringBuilder temp = new StringBuilder(dataSizes[block]); - for (int d = block; d < symbolInfo.getDataCapacity(); d += blockCount) { - temp.append(codewords.charAt(d)); - } - String ecc = createECCBlock(temp.toString(), errorSizes[block]); - int pos = 0; - for (int e = block; e < errorSizes[block] * blockCount; e += blockCount) { - sb.setCharAt(symbolInfo.getDataCapacity() + e, ecc.charAt(pos++)); - } - } - } - return sb.toString(); - - } - - private static String createECCBlock(CharSequence codewords, int numECWords) { - return createECCBlock(codewords, 0, codewords.length(), numECWords); - } - - private static String createECCBlock(CharSequence codewords, int start, int len, int numECWords) { - int table = -1; - for (int i = 0; i < FACTOR_SETS.length; i++) { - if (FACTOR_SETS[i] == numECWords) { - table = i; - break; - } - } - if (table < 0) { - throw new IllegalArgumentException( - "Illegal number of error correction codewords specified: " + numECWords); - } - int[] poly = FACTORS[table]; - char[] ecc = new char[numECWords]; - for (int i = 0; i < numECWords; i++) { - ecc[i] = 0; - } - for (int i = start; i < start + len; i++) { - int m = ecc[numECWords - 1] ^ codewords.charAt(i); - for (int k = numECWords - 1; k > 0; k--) { - if (m != 0 && poly[k] != 0) { - ecc[k] = (char) (ecc[k - 1] ^ ALOG[(LOG[m] + LOG[poly[k]]) % 255]); - } else { - ecc[k] = ecc[k - 1]; - } - } - if (m != 0 && poly[0] != 0) { - ecc[0] = (char) ALOG[(LOG[m] + LOG[poly[0]]) % 255]; - } else { - ecc[0] = 0; - } - } - char[] eccReversed = new char[numECWords]; - for (int i = 0; i < numECWords; i++) { - eccReversed[i] = ecc[numECWords - i - 1]; - } - return String.valueOf(eccReversed); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/HighLevelEncoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/HighLevelEncoder.java deleted file mode 100644 index b7a70ec..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/HighLevelEncoder.java +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -import com.google.zxing.Dimension; - -import java.util.Arrays; - -/** - * DataMatrix ECC 200 data encoder following the algorithm described in ISO/IEC 16022:200(E) in - * annex S. - */ -public final class HighLevelEncoder { - - /** - * Padding character - */ - private static final char PAD = 129; - /** - * mode latch to C40 encodation mode - */ - static final char LATCH_TO_C40 = 230; - /** - * mode latch to Base 256 encodation mode - */ - static final char LATCH_TO_BASE256 = 231; - /** - * FNC1 Codeword - */ - //private static final char FNC1 = 232; - /** - * Structured Append Codeword - */ - //private static final char STRUCTURED_APPEND = 233; - /** - * Reader Programming - */ - //private static final char READER_PROGRAMMING = 234; - /** - * Upper Shift - */ - static final char UPPER_SHIFT = 235; - /** - * 05 Macro - */ - private static final char MACRO_05 = 236; - /** - * 06 Macro - */ - private static final char MACRO_06 = 237; - /** - * mode latch to ANSI X.12 encodation mode - */ - static final char LATCH_TO_ANSIX12 = 238; - /** - * mode latch to Text encodation mode - */ - static final char LATCH_TO_TEXT = 239; - /** - * mode latch to EDIFACT encodation mode - */ - static final char LATCH_TO_EDIFACT = 240; - /** - * ECI character (Extended Channel Interpretation) - */ - //private static final char ECI = 241; - - /** - * Unlatch from C40 encodation - */ - static final char C40_UNLATCH = 254; - /** - * Unlatch from X12 encodation - */ - static final char X12_UNLATCH = 254; - - /** - * 05 Macro header - */ - private static final String MACRO_05_HEADER = "[)>\u001E05\u001D"; - /** - * 06 Macro header - */ - private static final String MACRO_06_HEADER = "[)>\u001E06\u001D"; - /** - * Macro trailer - */ - private static final String MACRO_TRAILER = "\u001E\u0004"; - - static final int ASCII_ENCODATION = 0; - static final int C40_ENCODATION = 1; - static final int TEXT_ENCODATION = 2; - static final int X12_ENCODATION = 3; - static final int EDIFACT_ENCODATION = 4; - static final int BASE256_ENCODATION = 5; - - private HighLevelEncoder() { - } - - /* - * Converts the message to a byte array using the default encoding (cp437) as defined by the - * specification - * - * @param msg the message - * @return the byte array of the message - */ - - /* - public static byte[] getBytesForMessage(String msg) { - return msg.getBytes(Charset.forName("cp437")); //See 4.4.3 and annex B of ISO/IEC 15438:2001(E) - } - */ - - private static char randomize253State(char ch, int codewordPosition) { - int pseudoRandom = ((149 * codewordPosition) % 253) + 1; - int tempVariable = ch + pseudoRandom; - return (char) (tempVariable <= 254 ? tempVariable : tempVariable - 254); - } - - /** - * Performs message encoding of a DataMatrix message using the algorithm described in annex P - * of ISO/IEC 16022:2000(E). - * - * @param msg the message - * @return the encoded message (the char values range from 0 to 255) - */ - public static String encodeHighLevel(String msg) { - return encodeHighLevel(msg, SymbolShapeHint.FORCE_NONE, null, null); - } - - /** - * Performs message encoding of a DataMatrix message using the algorithm described in annex P - * of ISO/IEC 16022:2000(E). - * - * @param msg the message - * @param shape requested shape. May be {@code SymbolShapeHint.FORCE_NONE}, - * {@code SymbolShapeHint.FORCE_SQUARE} or {@code SymbolShapeHint.FORCE_RECTANGLE}. - * @param minSize the minimum symbol size constraint or null for no constraint - * @param maxSize the maximum symbol size constraint or null for no constraint - * @return the encoded message (the char values range from 0 to 255) - */ - public static String encodeHighLevel(String msg, - SymbolShapeHint shape, - Dimension minSize, - Dimension maxSize) { - //the codewords 0..255 are encoded as Unicode characters - Encoder[] encoders = { - new ASCIIEncoder(), new C40Encoder(), new TextEncoder(), - new X12Encoder(), new EdifactEncoder(), new Base256Encoder() - }; - - EncoderContext context = new EncoderContext(msg); - context.setSymbolShape(shape); - context.setSizeConstraints(minSize, maxSize); - - if (msg.startsWith(MACRO_05_HEADER) && msg.endsWith(MACRO_TRAILER)) { - context.writeCodeword(MACRO_05); - context.setSkipAtEnd(2); - context.pos += MACRO_05_HEADER.length(); - } else if (msg.startsWith(MACRO_06_HEADER) && msg.endsWith(MACRO_TRAILER)) { - context.writeCodeword(MACRO_06); - context.setSkipAtEnd(2); - context.pos += MACRO_06_HEADER.length(); - } - - int encodingMode = ASCII_ENCODATION; //Default mode - while (context.hasMoreCharacters()) { - encoders[encodingMode].encode(context); - if (context.getNewEncoding() >= 0) { - encodingMode = context.getNewEncoding(); - context.resetEncoderSignal(); - } - } - int len = context.getCodewordCount(); - context.updateSymbolInfo(); - int capacity = context.getSymbolInfo().getDataCapacity(); - if (len < capacity) { - if (encodingMode != ASCII_ENCODATION && encodingMode != BASE256_ENCODATION) { - context.writeCodeword('\u00fe'); //Unlatch (254) - } - } - //Padding - StringBuilder codewords = context.getCodewords(); - if (codewords.length() < capacity) { - codewords.append(PAD); - } - while (codewords.length() < capacity) { - codewords.append(randomize253State(PAD, codewords.length() + 1)); - } - - return context.getCodewords().toString(); - } - - static int lookAheadTest(CharSequence msg, int startpos, int currentMode) { - if (startpos >= msg.length()) { - return currentMode; - } - float[] charCounts; - //step J - if (currentMode == ASCII_ENCODATION) { - charCounts = new float[]{0, 1, 1, 1, 1, 1.25f}; - } else { - charCounts = new float[]{1, 2, 2, 2, 2, 2.25f}; - charCounts[currentMode] = 0; - } - - int charsProcessed = 0; - while (true) { - //step K - if ((startpos + charsProcessed) == msg.length()) { - int min = Integer.MAX_VALUE; - byte[] mins = new byte[6]; - int[] intCharCounts = new int[6]; - min = findMinimums(charCounts, intCharCounts, min, mins); - int minCount = getMinimumCount(mins); - - if (intCharCounts[ASCII_ENCODATION] == min) { - return ASCII_ENCODATION; - } - if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { - return BASE256_ENCODATION; - } - if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { - return EDIFACT_ENCODATION; - } - if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { - return TEXT_ENCODATION; - } - if (minCount == 1 && mins[X12_ENCODATION] > 0) { - return X12_ENCODATION; - } - return C40_ENCODATION; - } - - char c = msg.charAt(startpos + charsProcessed); - charsProcessed++; - - //step L - if (isDigit(c)) { - charCounts[ASCII_ENCODATION] += 0.5; - } else if (isExtendedASCII(c)) { - charCounts[ASCII_ENCODATION] = (int) Math.ceil(charCounts[ASCII_ENCODATION]); - charCounts[ASCII_ENCODATION] += 2; - } else { - charCounts[ASCII_ENCODATION] = (int) Math.ceil(charCounts[ASCII_ENCODATION]); - charCounts[ASCII_ENCODATION]++; - } - - //step M - if (isNativeC40(c)) { - charCounts[C40_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[C40_ENCODATION] += 8.0f / 3.0f; - } else { - charCounts[C40_ENCODATION] += 4.0f / 3.0f; - } - - //step N - if (isNativeText(c)) { - charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; - } else { - charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; - } - - //step O - if (isNativeX12(c)) { - charCounts[X12_ENCODATION] += 2.0f / 3.0f; - } else if (isExtendedASCII(c)) { - charCounts[X12_ENCODATION] += 13.0f / 3.0f; - } else { - charCounts[X12_ENCODATION] += 10.0f / 3.0f; - } - - //step P - if (isNativeEDIFACT(c)) { - charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; - } else if (isExtendedASCII(c)) { - charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; - } else { - charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; - } - - // step Q - if (isSpecialB256(c)) { - charCounts[BASE256_ENCODATION] += 4; - } else { - charCounts[BASE256_ENCODATION]++; - } - - //step R - if (charsProcessed >= 4) { - int[] intCharCounts = new int[6]; - byte[] mins = new byte[6]; - findMinimums(charCounts, intCharCounts, Integer.MAX_VALUE, mins); - int minCount = getMinimumCount(mins); - - if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] - && intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { - return ASCII_ENCODATION; - } - if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] - || (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + mins[EDIFACT_ENCODATION]) == 0) { - return BASE256_ENCODATION; - } - if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { - return EDIFACT_ENCODATION; - } - if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { - return TEXT_ENCODATION; - } - if (minCount == 1 && mins[X12_ENCODATION] > 0) { - return X12_ENCODATION; - } - if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[BASE256_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[EDIFACT_ENCODATION] - && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { - if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { - return C40_ENCODATION; - } - if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { - int p = startpos + charsProcessed + 1; - while (p < msg.length()) { - char tc = msg.charAt(p); - if (isX12TermSep(tc)) { - return X12_ENCODATION; - } - if (!isNativeX12(tc)) { - break; - } - p++; - } - return C40_ENCODATION; - } - } - } - } - } - - private static int findMinimums(float[] charCounts, int[] intCharCounts, int min, byte[] mins) { - Arrays.fill(mins, (byte) 0); - for (int i = 0; i < 6; i++) { - intCharCounts[i] = (int) Math.ceil(charCounts[i]); - int current = intCharCounts[i]; - if (min > current) { - min = current; - Arrays.fill(mins, (byte) 0); - } - if (min == current) { - mins[i]++; - - } - } - return min; - } - - private static int getMinimumCount(byte[] mins) { - int minCount = 0; - for (int i = 0; i < 6; i++) { - minCount += mins[i]; - } - return minCount; - } - - static boolean isDigit(char ch) { - return ch >= '0' && ch <= '9'; - } - - static boolean isExtendedASCII(char ch) { - return ch >= 128 && ch <= 255; - } - - private static boolean isNativeC40(char ch) { - return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); - } - - private static boolean isNativeText(char ch) { - return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); - } - - private static boolean isNativeX12(char ch) { - return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); - } - - private static boolean isX12TermSep(char ch) { - return (ch == '\r') //CR - || (ch == '*') - || (ch == '>'); - } - - private static boolean isNativeEDIFACT(char ch) { - return ch >= ' ' && ch <= '^'; - } - - private static boolean isSpecialB256(char ch) { - return false; //TODO NOT IMPLEMENTED YET!!! - } - - /** - * Determines the number of consecutive characters that are encodable using numeric compaction. - * - * @param msg the message - * @param startpos the start position within the message - * @return the requested character count - */ - public static int determineConsecutiveDigitCount(CharSequence msg, int startpos) { - int count = 0; - int len = msg.length(); - int idx = startpos; - if (idx < len) { - char ch = msg.charAt(idx); - while (isDigit(ch) && idx < len) { - count++; - idx++; - if (idx < len) { - ch = msg.charAt(idx); - } - } - } - return count; - } - - static void illegalCharacter(char c) { - String hex = Integer.toHexString(c); - hex = "0000".substring(0, 4 - hex.length()) + hex; - throw new IllegalArgumentException("Illegal character: " + c + " (0x" + hex + ')'); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolInfo.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolInfo.java deleted file mode 100644 index 2cb956c..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolInfo.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -import com.google.zxing.Dimension; - -/** - * Symbol info table for DataMatrix. - * - * @version $Id$ - */ -public class SymbolInfo { - - static final SymbolInfo[] PROD_SYMBOLS = { - new SymbolInfo(false, 3, 5, 8, 8, 1), - new SymbolInfo(false, 5, 7, 10, 10, 1), - /*rect*/new SymbolInfo(true, 5, 7, 16, 6, 1), - new SymbolInfo(false, 8, 10, 12, 12, 1), - /*rect*/new SymbolInfo(true, 10, 11, 14, 6, 2), - new SymbolInfo(false, 12, 12, 14, 14, 1), - /*rect*/new SymbolInfo(true, 16, 14, 24, 10, 1), - - new SymbolInfo(false, 18, 14, 16, 16, 1), - new SymbolInfo(false, 22, 18, 18, 18, 1), - /*rect*/new SymbolInfo(true, 22, 18, 16, 10, 2), - new SymbolInfo(false, 30, 20, 20, 20, 1), - /*rect*/new SymbolInfo(true, 32, 24, 16, 14, 2), - new SymbolInfo(false, 36, 24, 22, 22, 1), - new SymbolInfo(false, 44, 28, 24, 24, 1), - /*rect*/new SymbolInfo(true, 49, 28, 22, 14, 2), - - new SymbolInfo(false, 62, 36, 14, 14, 4), - new SymbolInfo(false, 86, 42, 16, 16, 4), - new SymbolInfo(false, 114, 48, 18, 18, 4), - new SymbolInfo(false, 144, 56, 20, 20, 4), - new SymbolInfo(false, 174, 68, 22, 22, 4), - - new SymbolInfo(false, 204, 84, 24, 24, 4, 102, 42), - new SymbolInfo(false, 280, 112, 14, 14, 16, 140, 56), - new SymbolInfo(false, 368, 144, 16, 16, 16, 92, 36), - new SymbolInfo(false, 456, 192, 18, 18, 16, 114, 48), - new SymbolInfo(false, 576, 224, 20, 20, 16, 144, 56), - new SymbolInfo(false, 696, 272, 22, 22, 16, 174, 68), - new SymbolInfo(false, 816, 336, 24, 24, 16, 136, 56), - new SymbolInfo(false, 1050, 408, 18, 18, 36, 175, 68), - new SymbolInfo(false, 1304, 496, 20, 20, 36, 163, 62), - new DataMatrixSymbolInfo144(), - }; - - private static SymbolInfo[] symbols = PROD_SYMBOLS; - - /** - * Overrides the symbol info set used by this class. Used for testing purposes. - * - * @param override the symbol info set to use - */ - public static void overrideSymbolSet(SymbolInfo[] override) { - symbols = override; - } - - private final boolean rectangular; - private final int dataCapacity; - private final int errorCodewords; - public final int matrixWidth; - public final int matrixHeight; - private final int dataRegions; - private final int rsBlockData; - private final int rsBlockError; - - public SymbolInfo(boolean rectangular, int dataCapacity, int errorCodewords, - int matrixWidth, int matrixHeight, int dataRegions) { - this(rectangular, dataCapacity, errorCodewords, matrixWidth, matrixHeight, dataRegions, - dataCapacity, errorCodewords); - } - - SymbolInfo(boolean rectangular, int dataCapacity, int errorCodewords, - int matrixWidth, int matrixHeight, int dataRegions, - int rsBlockData, int rsBlockError) { - this.rectangular = rectangular; - this.dataCapacity = dataCapacity; - this.errorCodewords = errorCodewords; - this.matrixWidth = matrixWidth; - this.matrixHeight = matrixHeight; - this.dataRegions = dataRegions; - this.rsBlockData = rsBlockData; - this.rsBlockError = rsBlockError; - } - - public static SymbolInfo lookup(int dataCodewords) { - return lookup(dataCodewords, SymbolShapeHint.FORCE_NONE, true); - } - - public static SymbolInfo lookup(int dataCodewords, SymbolShapeHint shape) { - return lookup(dataCodewords, shape, true); - } - - public static SymbolInfo lookup(int dataCodewords, boolean allowRectangular, boolean fail) { - SymbolShapeHint shape = allowRectangular - ? SymbolShapeHint.FORCE_NONE : SymbolShapeHint.FORCE_SQUARE; - return lookup(dataCodewords, shape, fail); - } - - private static SymbolInfo lookup(int dataCodewords, SymbolShapeHint shape, boolean fail) { - return lookup(dataCodewords, shape, null, null, fail); - } - - public static SymbolInfo lookup(int dataCodewords, - SymbolShapeHint shape, - Dimension minSize, - Dimension maxSize, - boolean fail) { - for (SymbolInfo symbol : symbols) { - if (shape == SymbolShapeHint.FORCE_SQUARE && symbol.rectangular) { - continue; - } - if (shape == SymbolShapeHint.FORCE_RECTANGLE && !symbol.rectangular) { - continue; - } - if (minSize != null - && (symbol.getSymbolWidth() < minSize.getWidth() - || symbol.getSymbolHeight() < minSize.getHeight())) { - continue; - } - if (maxSize != null - && (symbol.getSymbolWidth() > maxSize.getWidth() - || symbol.getSymbolHeight() > maxSize.getHeight())) { - continue; - } - if (dataCodewords <= symbol.dataCapacity) { - return symbol; - } - } - if (fail) { - throw new IllegalArgumentException( - "Can't find a symbol arrangement that matches the message. Data codewords: " - + dataCodewords); - } - return null; - } - - final int getHorizontalDataRegions() { - switch (dataRegions) { - case 1: - return 1; - case 2: - return 2; - case 4: - return 2; - case 16: - return 4; - case 36: - return 6; - default: - throw new IllegalStateException("Cannot handle this number of data regions"); - } - } - - final int getVerticalDataRegions() { - switch (dataRegions) { - case 1: - return 1; - case 2: - return 1; - case 4: - return 2; - case 16: - return 4; - case 36: - return 6; - default: - throw new IllegalStateException("Cannot handle this number of data regions"); - } - } - - public final int getSymbolDataWidth() { - return getHorizontalDataRegions() * matrixWidth; - } - - public final int getSymbolDataHeight() { - return getVerticalDataRegions() * matrixHeight; - } - - public final int getSymbolWidth() { - return getSymbolDataWidth() + (getHorizontalDataRegions() * 2); - } - - public final int getSymbolHeight() { - return getSymbolDataHeight() + (getVerticalDataRegions() * 2); - } - - public int getCodewordCount() { - return dataCapacity + errorCodewords; - } - - public int getInterleavedBlockCount() { - return dataCapacity / rsBlockData; - } - - public final int getDataCapacity() { - return dataCapacity; - } - - public final int getErrorCodewords() { - return errorCodewords; - } - - public int getDataLengthForInterleavedBlock(int index) { - return rsBlockData; - } - - public final int getErrorLengthForInterleavedBlock(int index) { - return rsBlockError; - } - - @Override - public final String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(rectangular ? "Rectangular Symbol:" : "Square Symbol:"); - sb.append(" data region ").append(matrixWidth).append('x').append(matrixHeight); - sb.append(", symbol size ").append(getSymbolWidth()).append('x').append(getSymbolHeight()); - sb.append(", symbol data size ").append(getSymbolDataWidth()).append('x').append(getSymbolDataHeight()); - sb.append(", codewords ").append(dataCapacity).append('+').append(errorCodewords); - return sb.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolShapeHint.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolShapeHint.java deleted file mode 100644 index 58739b8..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/SymbolShapeHint.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -/** - * Enumeration for DataMatrix symbol shape hint. It can be used to force square or rectangular - * symbols. - */ -public enum SymbolShapeHint { - - FORCE_NONE, - FORCE_SQUARE, - FORCE_RECTANGLE, - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/TextEncoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/TextEncoder.java deleted file mode 100644 index 19af016..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/TextEncoder.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class TextEncoder extends C40Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.TEXT_ENCODATION; - } - - @Override - int encodeChar(char c, StringBuilder sb) { - if (c == ' ') { - sb.append('\3'); - return 1; - } - if (c >= '0' && c <= '9') { - sb.append((char) (c - 48 + 4)); - return 1; - } - if (c >= 'a' && c <= 'z') { - sb.append((char) (c - 97 + 14)); - return 1; - } - if (c >= '\0' && c <= '\u001f') { - sb.append('\0'); //Shift 1 Set - sb.append(c); - return 2; - } - if (c >= '!' && c <= '/') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 33)); - return 2; - } - if (c >= ':' && c <= '@') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 58 + 15)); - return 2; - } - if (c >= '[' && c <= '_') { - sb.append('\1'); //Shift 2 Set - sb.append((char) (c - 91 + 22)); - return 2; - } - if (c == '\u0060') { - sb.append('\2'); //Shift 3 Set - sb.append((char) (c - 96)); - return 2; - } - if (c >= 'A' && c <= 'Z') { - sb.append('\2'); //Shift 3 Set - sb.append((char) (c - 65 + 1)); - return 2; - } - if (c >= '{' && c <= '\u007f') { - sb.append('\2'); //Shift 3 Set - sb.append((char) (c - 123 + 27)); - return 2; - } - if (c >= '\u0080') { - sb.append("\1\u001e"); //Shift 2, Upper Shift - int len = 2; - len += encodeChar((char) (c - 128), sb); - return len; - } - HighLevelEncoder.illegalCharacter(c); - return -1; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java b/zxing/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java deleted file mode 100644 index 0184bec..0000000 --- a/zxing/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2006-2007 Jeremias Maerki. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.datamatrix.encoder; - -final class X12Encoder extends C40Encoder { - - @Override - public int getEncodingMode() { - return HighLevelEncoder.X12_ENCODATION; - } - - @Override - public void encode(EncoderContext context) { - //step C - StringBuilder buffer = new StringBuilder(); - while (context.hasMoreCharacters()) { - char c = context.getCurrentChar(); - context.pos++; - - encodeChar(c, buffer); - - int count = buffer.length(); - if ((count % 3) == 0) { - writeNextTriplet(context, buffer); - - int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); - if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); - break; - } - } - } - handleEOD(context, buffer); - } - - @Override - int encodeChar(char c, StringBuilder sb) { - if (c == '\r') { - sb.append('\0'); - } else if (c == '*') { - sb.append('\1'); - } else if (c == '>') { - sb.append('\2'); - } else if (c == ' ') { - sb.append('\3'); - } else if (c >= '0' && c <= '9') { - sb.append((char) (c - 48 + 4)); - } else if (c >= 'A' && c <= 'Z') { - sb.append((char) (c - 65 + 14)); - } else { - HighLevelEncoder.illegalCharacter(c); - } - return 1; - } - - @Override - void handleEOD(EncoderContext context, StringBuilder buffer) { - context.updateSymbolInfo(); - int available = context.getSymbolInfo().getDataCapacity() - context.getCodewordCount(); - int count = buffer.length(); - context.pos -= count; - if (context.getRemainingCharacters() > 1 || available > 1 || - context.getRemainingCharacters() != available) { - context.writeCodeword(HighLevelEncoder.X12_UNLATCH); - } - if (context.getNewEncoding() < 0) { - context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); - } - } -} diff --git a/zxing/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java b/zxing/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java deleted file mode 100644 index 6eb3b95..0000000 --- a/zxing/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.maxicode; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.maxicode.decoder.Decoder; - -import java.util.Map; - -/** - * This implementation can detect and decode a MaxiCode in an image. - */ -public final class MaxiCodeReader implements Reader { - - private static final ResultPoint[] NO_POINTS = new ResultPoint[0]; - private static final int MATRIX_WIDTH = 30; - private static final int MATRIX_HEIGHT = 33; - - private final Decoder decoder = new Decoder(); - - /* - Decoder getDecoder() { - return decoder; - } - */ - - /** - * Locates and decodes a MaxiCode in an image. - * - * @return a String representing the content encoded by the MaxiCode - * @throws NotFoundException if a MaxiCode cannot be found - * @throws FormatException if a MaxiCode cannot be decoded - * @throws ChecksumException if error correction fails - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException { - return decode(image, null); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, ChecksumException, FormatException { - DecoderResult decoderResult; - if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { - BitMatrix bits = extractPureBits(image.getBlackMatrix()); - decoderResult = decoder.decode(bits, hints); - } else { - throw NotFoundException.getNotFoundInstance(); - } - - ResultPoint[] points = NO_POINTS; - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, BarcodeFormat.MAXICODE); - - String ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, ecLevel); - } - return result; - } - - @Override - public void reset() { - // do nothing - } - - /** - * This method detects a code in a "pure" image -- that is, pure monochrome image - * which contains only an unrotated, unskewed, image of a code, with some white border - * around it. This is a specialized method that works exceptionally fast in this special - * case. - * - * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) - * @see com.google.zxing.qrcode.QRCodeReader#extractPureBits(BitMatrix) - */ - private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException { - - int[] enclosingRectangle = image.getEnclosingRectangle(); - if (enclosingRectangle == null) { - throw NotFoundException.getNotFoundInstance(); - } - - int left = enclosingRectangle[0]; - int top = enclosingRectangle[1]; - int width = enclosingRectangle[2]; - int height = enclosingRectangle[3]; - - // Now just read off the bits - BitMatrix bits = new BitMatrix(MATRIX_WIDTH, MATRIX_HEIGHT); - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int iy = top + (y * height + height / 2) / MATRIX_HEIGHT; - for (int x = 0; x < MATRIX_WIDTH; x++) { - int ix = left + (x * width + width / 2 + (y & 0x01) * width / 2) / MATRIX_WIDTH; - if (image.get(ix, iy)) { - bits.set(x, y); - } - } - } - return bits; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/maxicode/decoder/BitMatrixParser.java b/zxing/src/main/java/com/google/zxing/maxicode/decoder/BitMatrixParser.java deleted file mode 100644 index be18a7e..0000000 --- a/zxing/src/main/java/com/google/zxing/maxicode/decoder/BitMatrixParser.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.maxicode.decoder; - -import com.google.zxing.common.BitMatrix; - -/** - * @author mike32767 - * @author Manuel Kasten - */ -final class BitMatrixParser { - - private static final int[][] BITNR = { - {121,120,127,126,133,132,139,138,145,144,151,150,157,156,163,162,169,168,175,174,181,180,187,186,193,192,199,198, -2, -2}, - {123,122,129,128,135,134,141,140,147,146,153,152,159,158,165,164,171,170,177,176,183,182,189,188,195,194,201,200,816, -3}, - {125,124,131,130,137,136,143,142,149,148,155,154,161,160,167,166,173,172,179,178,185,184,191,190,197,196,203,202,818,817}, - {283,282,277,276,271,270,265,264,259,258,253,252,247,246,241,240,235,234,229,228,223,222,217,216,211,210,205,204,819, -3}, - {285,284,279,278,273,272,267,266,261,260,255,254,249,248,243,242,237,236,231,230,225,224,219,218,213,212,207,206,821,820}, - {287,286,281,280,275,274,269,268,263,262,257,256,251,250,245,244,239,238,233,232,227,226,221,220,215,214,209,208,822, -3}, - {289,288,295,294,301,300,307,306,313,312,319,318,325,324,331,330,337,336,343,342,349,348,355,354,361,360,367,366,824,823}, - {291,290,297,296,303,302,309,308,315,314,321,320,327,326,333,332,339,338,345,344,351,350,357,356,363,362,369,368,825, -3}, - {293,292,299,298,305,304,311,310,317,316,323,322,329,328,335,334,341,340,347,346,353,352,359,358,365,364,371,370,827,826}, - {409,408,403,402,397,396,391,390, 79, 78, -2, -2, 13, 12, 37, 36, 2, -1, 44, 43,109,108,385,384,379,378,373,372,828, -3}, - {411,410,405,404,399,398,393,392, 81, 80, 40, -2, 15, 14, 39, 38, 3, -1, -1, 45,111,110,387,386,381,380,375,374,830,829}, - {413,412,407,406,401,400,395,394, 83, 82, 41, -3, -3, -3, -3, -3, 5, 4, 47, 46,113,112,389,388,383,382,377,376,831, -3}, - {415,414,421,420,427,426,103,102, 55, 54, 16, -3, -3, -3, -3, -3, -3, -3, 20, 19, 85, 84,433,432,439,438,445,444,833,832}, - {417,416,423,422,429,428,105,104, 57, 56, -3, -3, -3, -3, -3, -3, -3, -3, 22, 21, 87, 86,435,434,441,440,447,446,834, -3}, - {419,418,425,424,431,430,107,106, 59, 58, -3, -3, -3, -3, -3, -3, -3, -3, -3, 23, 89, 88,437,436,443,442,449,448,836,835}, - {481,480,475,474,469,468, 48, -2, 30, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 0, 53, 52,463,462,457,456,451,450,837, -3}, - {483,482,477,476,471,470, 49, -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1,465,464,459,458,453,452,839,838}, - {485,484,479,478,473,472, 51, 50, 31, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 1, -2, 42,467,466,461,460,455,454,840, -3}, - {487,486,493,492,499,498, 97, 96, 61, 60, -3, -3, -3, -3, -3, -3, -3, -3, -3, 26, 91, 90,505,504,511,510,517,516,842,841}, - {489,488,495,494,501,500, 99, 98, 63, 62, -3, -3, -3, -3, -3, -3, -3, -3, 28, 27, 93, 92,507,506,513,512,519,518,843, -3}, - {491,490,497,496,503,502,101,100, 65, 64, 17, -3, -3, -3, -3, -3, -3, -3, 18, 29, 95, 94,509,508,515,514,521,520,845,844}, - {559,558,553,552,547,546,541,540, 73, 72, 32, -3, -3, -3, -3, -3, -3, 10, 67, 66,115,114,535,534,529,528,523,522,846, -3}, - {561,560,555,554,549,548,543,542, 75, 74, -2, -1, 7, 6, 35, 34, 11, -2, 69, 68,117,116,537,536,531,530,525,524,848,847}, - {563,562,557,556,551,550,545,544, 77, 76, -2, 33, 9, 8, 25, 24, -1, -2, 71, 70,119,118,539,538,533,532,527,526,849, -3}, - {565,564,571,570,577,576,583,582,589,588,595,594,601,600,607,606,613,612,619,618,625,624,631,630,637,636,643,642,851,850}, - {567,566,573,572,579,578,585,584,591,590,597,596,603,602,609,608,615,614,621,620,627,626,633,632,639,638,645,644,852, -3}, - {569,568,575,574,581,580,587,586,593,592,599,598,605,604,611,610,617,616,623,622,629,628,635,634,641,640,647,646,854,853}, - {727,726,721,720,715,714,709,708,703,702,697,696,691,690,685,684,679,678,673,672,667,666,661,660,655,654,649,648,855, -3}, - {729,728,723,722,717,716,711,710,705,704,699,698,693,692,687,686,681,680,675,674,669,668,663,662,657,656,651,650,857,856}, - {731,730,725,724,719,718,713,712,707,706,701,700,695,694,689,688,683,682,677,676,671,670,665,664,659,658,653,652,858, -3}, - {733,732,739,738,745,744,751,750,757,756,763,762,769,768,775,774,781,780,787,786,793,792,799,798,805,804,811,810,860,859}, - {735,734,741,740,747,746,753,752,759,758,765,764,771,770,777,776,783,782,789,788,795,794,801,800,807,806,813,812,861, -3}, - {737,736,743,742,749,748,755,754,761,760,767,766,773,772,779,778,785,784,791,790,797,796,803,802,809,808,815,814,863,862} - }; - - private final BitMatrix bitMatrix; - - /** - * @param bitMatrix {@link BitMatrix} to parse - */ - BitMatrixParser(BitMatrix bitMatrix) { - this.bitMatrix = bitMatrix; - } - - byte[] readCodewords() { - byte[] result = new byte[144]; - int height = bitMatrix.getHeight(); - int width = bitMatrix.getWidth(); - for (int y = 0; y < height; y++) { - int[] bitnrRow = BITNR[y]; - for (int x = 0; x < width; x++) { - int bit = bitnrRow[x]; - if (bit >= 0 && bitMatrix.get(x, y)) { - result[bit / 6] |= (byte) (1 << (5 - (bit % 6))); - } - } - } - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/maxicode/decoder/DecodedBitStreamParser.java b/zxing/src/main/java/com/google/zxing/maxicode/decoder/DecodedBitStreamParser.java deleted file mode 100644 index 0e59dbd..0000000 --- a/zxing/src/main/java/com/google/zxing/maxicode/decoder/DecodedBitStreamParser.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.maxicode.decoder; - -import com.google.zxing.common.DecoderResult; -import java.text.DecimalFormat; -import java.text.NumberFormat; - -/** - *

    MaxiCodes can encode text or structured information as bits in one of several modes, - * with multiple character sets in one code. This class decodes the bits back into text.

    - * - * @author mike32767 - * @author Manuel Kasten - */ -final class DecodedBitStreamParser { - - private static final char SHIFTA = '\uFFF0'; - private static final char SHIFTB = '\uFFF1'; - private static final char SHIFTC = '\uFFF2'; - private static final char SHIFTD = '\uFFF3'; - private static final char SHIFTE = '\uFFF4'; - private static final char TWOSHIFTA = '\uFFF5'; - private static final char THREESHIFTA = '\uFFF6'; - private static final char LATCHA = '\uFFF7'; - private static final char LATCHB = '\uFFF8'; - private static final char LOCK = '\uFFF9'; - private static final char ECI = '\uFFFA'; - private static final char NS = '\uFFFB'; - private static final char PAD = '\uFFFC'; - private static final char FS = '\u001C'; - private static final char GS = '\u001D'; - private static final char RS = '\u001E'; - - private static final String[] SETS = { - "\nABCDEFGHIJKLMNOPQRSTUVWXYZ" + ECI + FS + GS + RS + NS + ' ' + PAD + - "\"#$%&'()*+,-./0123456789:" + SHIFTB + SHIFTC + SHIFTD + SHIFTE + LATCHB, - "`abcdefghijklmnopqrstuvwxyz" + ECI + FS + GS + RS + NS + '{' + PAD + - "}~\u007F;<=>?[\\]^_ ,./:@!|" + PAD + TWOSHIFTA + THREESHIFTA + PAD + - SHIFTA + SHIFTC + SHIFTD + SHIFTE + LATCHA, - "\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA" + - ECI + FS + GS + RS + - "\u00DB\u00DC\u00DD\u00DE\u00DF\u00AA\u00AC\u00B1\u00B2\u00B3\u00B5\u00B9\u00BA\u00BC\u00BD\u00BE\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089" + - LATCHA + ' ' + LOCK + SHIFTD + SHIFTE + LATCHB, - "\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA" + - ECI + FS + GS + RS + NS + - "\u00FB\u00FC\u00FD\u00FE\u00FF\u00A1\u00A8\u00AB\u00AF\u00B0\u00B4\u00B7\u00B8\u00BB\u00BF\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094" + - LATCHA + ' ' + SHIFTC + LOCK + SHIFTE + LATCHB, - "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\n\u000B\u000C\r\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A" + - ECI + PAD + PAD + '\u001B' + NS + FS + GS + RS + - "\u001F\u009F\u00A0\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A9\u00AD\u00AE\u00B6\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E" + - LATCHA + ' ' + SHIFTC + SHIFTD + LOCK + LATCHB, - "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\n\u000B\u000C\r\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u0020\u0021\"\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" - }; - - private DecodedBitStreamParser() { - } - - static DecoderResult decode(byte[] bytes, int mode) { - StringBuilder result = new StringBuilder(144); - switch (mode) { - case 2: - case 3: - String postcode; - if (mode == 2) { - int pc = getPostCode2(bytes); - NumberFormat df = new DecimalFormat("0000000000".substring(0, getPostCode2Length(bytes))); - postcode = df.format(pc); - } else { - postcode = getPostCode3(bytes); - } - NumberFormat threeDigits = new DecimalFormat("000"); - String country = threeDigits.format(getCountry(bytes)); - String service = threeDigits.format(getServiceClass(bytes)); - result.append(getMessage(bytes, 10, 84)); - if (result.toString().startsWith("[)>" + RS + "01" + GS)) { - result.insert(9, postcode + GS + country + GS + service + GS); - } else { - result.insert(0, postcode + GS + country + GS + service + GS); - } - break; - case 4: - result.append(getMessage(bytes, 1, 93)); - break; - case 5: - result.append(getMessage(bytes, 1, 77)); - break; - } - return new DecoderResult(bytes, result.toString(), null, String.valueOf(mode)); - } - - private static int getBit(int bit, byte[] bytes) { - bit--; - return (bytes[bit / 6] & (1 << (5 - (bit % 6)))) == 0 ? 0 : 1; - } - - private static int getInt(byte[] bytes, byte[] x) { - if (x.length == 0) { - throw new IllegalArgumentException(); - } - int val = 0; - for (int i = 0; i < x.length; i++) { - val += getBit(x[i], bytes) << (x.length - i - 1); - } - return val; - } - - private static int getCountry(byte[] bytes) { - return getInt(bytes, new byte[] {53, 54, 43, 44, 45, 46, 47, 48, 37, 38}); - } - - private static int getServiceClass(byte[] bytes) { - return getInt(bytes, new byte[] {55, 56, 57, 58, 59, 60, 49, 50, 51, 52}); - } - - private static int getPostCode2Length(byte[] bytes) { - return getInt(bytes, new byte[] {39, 40, 41, 42, 31, 32}); - } - - private static int getPostCode2(byte[] bytes) { - return getInt(bytes, new byte[] {33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 19, - 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2}); - } - - private static String getPostCode3(byte[] bytes) { - return String.valueOf( - new char[] { - SETS[0].charAt(getInt(bytes, new byte[] {39, 40, 41, 42, 31, 32})), - SETS[0].charAt(getInt(bytes, new byte[] {33, 34, 35, 36, 25, 26})), - SETS[0].charAt(getInt(bytes, new byte[] {27, 28, 29, 30, 19, 20})), - SETS[0].charAt(getInt(bytes, new byte[] {21, 22, 23, 24, 13, 14})), - SETS[0].charAt(getInt(bytes, new byte[] {15, 16, 17, 18, 7, 8})), - SETS[0].charAt(getInt(bytes, new byte[] { 9, 10, 11, 12, 1, 2})), - } - ); - } - - private static String getMessage(byte[] bytes, int start, int len) { - StringBuilder sb = new StringBuilder(); - int shift = -1; - int set = 0; - int lastset = 0; - for (int i = start; i < start + len; i++) { - char c = SETS[set].charAt(bytes[i]); - switch (c) { - case LATCHA: - set = 0; - shift = -1; - break; - case LATCHB: - set = 1; - shift = -1; - break; - case SHIFTA: - case SHIFTB: - case SHIFTC: - case SHIFTD: - case SHIFTE: - lastset = set; - set = c - SHIFTA; - shift = 1; - break; - case TWOSHIFTA: - lastset = set; - set = 0; - shift = 2; - break; - case THREESHIFTA: - lastset = set; - set = 0; - shift = 3; - break; - case NS: - int nsval = (bytes[++i] << 24) + (bytes[++i] << 18) + (bytes[++i] << 12) + (bytes[++i] << 6) + bytes[++i]; - sb.append(new DecimalFormat("000000000").format(nsval)); - break; - case LOCK: - shift = -1; - break; - default: - sb.append(c); - } - if (shift-- == 0) { - set = lastset; - } - } - while (sb.length() > 0 && sb.charAt(sb.length() - 1) == PAD) { - sb.setLength(sb.length() - 1); - } - return sb.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/maxicode/decoder/Decoder.java b/zxing/src/main/java/com/google/zxing/maxicode/decoder/Decoder.java deleted file mode 100644 index f7836f4..0000000 --- a/zxing/src/main/java/com/google/zxing/maxicode/decoder/Decoder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.maxicode.decoder; - -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; -import com.google.zxing.common.reedsolomon.ReedSolomonException; - -import java.util.Map; - -/** - *

    The main class which implements MaxiCode decoding -- as opposed to locating and extracting - * the MaxiCode from an image.

    - * - * @author Manuel Kasten - */ -public final class Decoder { - - private static final int ALL = 0; - private static final int EVEN = 1; - private static final int ODD = 2; - - private final ReedSolomonDecoder rsDecoder; - - public Decoder() { - rsDecoder = new ReedSolomonDecoder(GenericGF.MAXICODE_FIELD_64); - } - - public DecoderResult decode(BitMatrix bits) throws ChecksumException, FormatException { - return decode(bits, null); - } - - public DecoderResult decode(BitMatrix bits, - Map hints) throws FormatException, ChecksumException { - BitMatrixParser parser = new BitMatrixParser(bits); - byte[] codewords = parser.readCodewords(); - - correctErrors(codewords, 0, 10, 10, ALL); - int mode = codewords[0] & 0x0F; - byte[] datawords; - switch (mode) { - case 2: - case 3: - case 4: - correctErrors(codewords, 20, 84, 40, EVEN); - correctErrors(codewords, 20, 84, 40, ODD); - datawords = new byte[94]; - break; - case 5: - correctErrors(codewords, 20, 68, 56, EVEN); - correctErrors(codewords, 20, 68, 56, ODD); - datawords = new byte[78]; - break; - default: - throw FormatException.getFormatInstance(); - } - - System.arraycopy(codewords, 0, datawords, 0, 10); - System.arraycopy(codewords, 20, datawords, 10, datawords.length - 10); - - return DecodedBitStreamParser.decode(datawords, mode); - } - - private void correctErrors(byte[] codewordBytes, - int start, - int dataCodewords, - int ecCodewords, - int mode) throws ChecksumException { - int codewords = dataCodewords + ecCodewords; - - // in EVEN or ODD mode only half the codewords - int divisor = mode == ALL ? 1 : 2; - - // First read into an array of ints - int[] codewordsInts = new int[codewords / divisor]; - for (int i = 0; i < codewords; i++) { - if ((mode == ALL) || (i % 2 == (mode - 1))) { - codewordsInts[i / divisor] = codewordBytes[i + start] & 0xFF; - } - } - try { - rsDecoder.decode(codewordsInts, ecCodewords / divisor); - } catch (ReedSolomonException ignored) { - throw ChecksumException.getChecksumInstance(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (int i = 0; i < dataCodewords; i++) { - if ((mode == ALL) || (i % 2 == (mode - 1))) { - codewordBytes[i + start] = (byte) codewordsInts[i / divisor]; - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/ByQuadrantReader.java b/zxing/src/main/java/com/google/zxing/multi/ByQuadrantReader.java deleted file mode 100644 index 06e4b1a..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/ByQuadrantReader.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; - -import java.util.Map; - -/** - * This class attempts to decode a barcode from an image, not by scanning the whole image, - * but by scanning subsets of the image. This is important when there may be multiple barcodes in - * an image, and detecting a barcode may find parts of multiple barcode and fail to decode - * (e.g. QR Codes). Instead this scans the four quadrants of the image -- and also the center - * 'quadrant' to cover the case where a barcode is found in the center. - * - * @see GenericMultipleBarcodeReader - */ -public final class ByQuadrantReader implements Reader { - - private final Reader delegate; - - public ByQuadrantReader(Reader delegate) { - this.delegate = delegate; - } - - @Override - public Result decode(BinaryBitmap image) - throws NotFoundException, ChecksumException, FormatException { - return decode(image, null); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, ChecksumException, FormatException { - - int width = image.getWidth(); - int height = image.getHeight(); - int halfWidth = width / 2; - int halfHeight = height / 2; - - try { - // No need to call makeAbsolute as results will be relative to original top left here - return delegate.decode(image.crop(0, 0, halfWidth, halfHeight), hints); - } catch (NotFoundException re) { - // continue - } - - try { - Result result = delegate.decode(image.crop(halfWidth, 0, halfWidth, halfHeight), hints); - makeAbsolute(result.getResultPoints(), halfWidth, 0); - return result; - } catch (NotFoundException re) { - // continue - } - - try { - Result result = delegate.decode(image.crop(0, halfHeight, halfWidth, halfHeight), hints); - makeAbsolute(result.getResultPoints(), 0, halfHeight); - return result; - } catch (NotFoundException re) { - // continue - } - - try { - Result result = delegate.decode(image.crop(halfWidth, halfHeight, halfWidth, halfHeight), hints); - makeAbsolute(result.getResultPoints(), halfWidth, halfHeight); - return result; - } catch (NotFoundException re) { - // continue - } - - int quarterWidth = halfWidth / 2; - int quarterHeight = halfHeight / 2; - BinaryBitmap center = image.crop(quarterWidth, quarterHeight, halfWidth, halfHeight); - Result result = delegate.decode(center, hints); - makeAbsolute(result.getResultPoints(), quarterWidth, quarterHeight); - return result; - } - - @Override - public void reset() { - delegate.reset(); - } - - private static void makeAbsolute(ResultPoint[] points, int leftOffset, int topOffset) { - if (points != null) { - for (int i = 0; i < points.length; i++) { - ResultPoint relative = points[i]; - points[i] = new ResultPoint(relative.getX() + leftOffset, relative.getY() + topOffset); - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java b/zxing/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java deleted file mode 100644 index b90dc0e..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - *

    Attempts to locate multiple barcodes in an image by repeatedly decoding portion of the image. - * After one barcode is found, the areas left, above, right and below the barcode's - * {@link ResultPoint}s are scanned, recursively.

    - * - *

    A caller may want to also employ {@link ByQuadrantReader} when attempting to find multiple - * 2D barcodes, like QR Codes, in an image, where the presence of multiple barcodes might prevent - * detecting any one of them.

    - * - *

    That is, instead of passing a {@link Reader} a caller might pass - * {@code new ByQuadrantReader(reader)}.

    - * - * @author Sean Owen - */ -public final class GenericMultipleBarcodeReader implements MultipleBarcodeReader { - - private static final int MIN_DIMENSION_TO_RECUR = 100; - private static final int MAX_DEPTH = 4; - - private final Reader delegate; - - public GenericMultipleBarcodeReader(Reader delegate) { - this.delegate = delegate; - } - - @Override - public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException { - return decodeMultiple(image, null); - } - - @Override - public Result[] decodeMultiple(BinaryBitmap image, Map hints) - throws NotFoundException { - List results = new ArrayList<>(); - doDecodeMultiple(image, hints, results, 0, 0, 0); - if (results.isEmpty()) { - throw NotFoundException.getNotFoundInstance(); - } - return results.toArray(new Result[results.size()]); - } - - private void doDecodeMultiple(BinaryBitmap image, - Map hints, - List results, - int xOffset, - int yOffset, - int currentDepth) { - if (currentDepth > MAX_DEPTH) { - return; - } - - Result result; - try { - result = delegate.decode(image, hints); - } catch (ReaderException ignored) { - return; - } - boolean alreadyFound = false; - for (Result existingResult : results) { - if (existingResult.getText().equals(result.getText())) { - alreadyFound = true; - break; - } - } - if (!alreadyFound) { - results.add(translateResultPoints(result, xOffset, yOffset)); - } - ResultPoint[] resultPoints = result.getResultPoints(); - if (resultPoints == null || resultPoints.length == 0) { - return; - } - int width = image.getWidth(); - int height = image.getHeight(); - float minX = width; - float minY = height; - float maxX = 0.0f; - float maxY = 0.0f; - for (ResultPoint point : resultPoints) { - if (point == null) { - continue; - } - float x = point.getX(); - float y = point.getY(); - if (x < minX) { - minX = x; - } - if (y < minY) { - minY = y; - } - if (x > maxX) { - maxX = x; - } - if (y > maxY) { - maxY = y; - } - } - - // Decode left of barcode - if (minX > MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image.crop(0, 0, (int) minX, height), - hints, results, - xOffset, yOffset, - currentDepth + 1); - } - // Decode above barcode - if (minY > MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image.crop(0, 0, width, (int) minY), - hints, results, - xOffset, yOffset, - currentDepth + 1); - } - // Decode right of barcode - if (maxX < width - MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image.crop((int) maxX, 0, width - (int) maxX, height), - hints, results, - xOffset + (int) maxX, yOffset, - currentDepth + 1); - } - // Decode below barcode - if (maxY < height - MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image.crop(0, (int) maxY, width, height - (int) maxY), - hints, results, - xOffset, yOffset + (int) maxY, - currentDepth + 1); - } - } - - private static Result translateResultPoints(Result result, int xOffset, int yOffset) { - ResultPoint[] oldResultPoints = result.getResultPoints(); - if (oldResultPoints == null) { - return result; - } - ResultPoint[] newResultPoints = new ResultPoint[oldResultPoints.length]; - for (int i = 0; i < oldResultPoints.length; i++) { - ResultPoint oldPoint = oldResultPoints[i]; - if (oldPoint != null) { - newResultPoints[i] = new ResultPoint(oldPoint.getX() + xOffset, oldPoint.getY() + yOffset); - } - } - Result newResult = new Result(result.getText(), result.getRawBytes(), newResultPoints, result.getBarcodeFormat()); - newResult.putAllMetadata(result.getResultMetadata()); - return newResult; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/MultipleBarcodeReader.java b/zxing/src/main/java/com/google/zxing/multi/MultipleBarcodeReader.java deleted file mode 100644 index a358727..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/MultipleBarcodeReader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; - -import java.util.Map; - -/** - * Implementation of this interface attempt to read several barcodes from one image. - * - * @see com.google.zxing.Reader - * @author Sean Owen - */ -public interface MultipleBarcodeReader { - - Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException; - - Result[] decodeMultiple(BinaryBitmap image, - Map hints) throws NotFoundException; - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java b/zxing/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java deleted file mode 100644 index 083fcf3..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi.qrcode; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.multi.MultipleBarcodeReader; -import com.google.zxing.multi.qrcode.detector.MultiDetector; -import com.google.zxing.qrcode.QRCodeReader; -import com.google.zxing.qrcode.decoder.QRCodeDecoderMetaData; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Collections; -import java.util.Comparator; - -/** - * This implementation can detect and decode multiple QR Codes in an image. - * - * @author Sean Owen - * @author Hannes Erven - */ -public final class QRCodeMultiReader extends QRCodeReader implements MultipleBarcodeReader { - - private static final Result[] EMPTY_RESULT_ARRAY = new Result[0]; - private static final ResultPoint[] NO_POINTS = new ResultPoint[0]; - - @Override - public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException { - return decodeMultiple(image, null); - } - - @Override - public Result[] decodeMultiple(BinaryBitmap image, Map hints) throws NotFoundException { - List results = new ArrayList<>(); - DetectorResult[] detectorResults = new MultiDetector(image.getBlackMatrix()).detectMulti(hints); - for (DetectorResult detectorResult : detectorResults) { - try { - DecoderResult decoderResult = getDecoder().decode(detectorResult.getBits(), hints); - ResultPoint[] points = detectorResult.getPoints(); - // If the code was mirrored: swap the bottom-left and the top-right points. - if (decoderResult.getOther() instanceof QRCodeDecoderMetaData) { - ((QRCodeDecoderMetaData) decoderResult.getOther()).applyMirroredCorrection(points); - } - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, - BarcodeFormat.QR_CODE); - List byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType.BYTE_SEGMENTS, byteSegments); - } - String ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, ecLevel); - } - if (decoderResult.hasStructuredAppend()) { - result.putMetadata(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE, - decoderResult.getStructuredAppendSequenceNumber()); - result.putMetadata(ResultMetadataType.STRUCTURED_APPEND_PARITY, - decoderResult.getStructuredAppendParity()); - } - results.add(result); - } catch (ReaderException re) { - // ignore and continue - } - } - if (results.isEmpty()) { - return EMPTY_RESULT_ARRAY; - } else { - results = processStructuredAppend(results); - return results.toArray(new Result[results.size()]); - } - } - - private static List processStructuredAppend(List results) { - boolean hasSA = false; - - // first, check, if there is at least on SA result in the list - for (Result result : results) { - if (result.getResultMetadata().containsKey(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE)) { - hasSA = true; - break; - } - } - if (!hasSA) { - return results; - } - - // it is, second, split the lists and built a new result list - List newResults = new ArrayList<>(); - List saResults = new ArrayList<>(); - for (Result result : results) { - newResults.add(result); - if (result.getResultMetadata().containsKey(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE)) { - saResults.add(result); - } - } - // sort and concatenate the SA list items - Collections.sort(saResults, new SAComparator()); - StringBuilder concatedText = new StringBuilder(); - int rawBytesLen = 0; - int byteSegmentLength = 0; - for (Result saResult : saResults) { - concatedText.append(saResult.getText()); - rawBytesLen += saResult.getRawBytes().length; - if (saResult.getResultMetadata().containsKey(ResultMetadataType.BYTE_SEGMENTS)) { - @SuppressWarnings("unchecked") - Iterable byteSegments = - (Iterable) saResult.getResultMetadata().get(ResultMetadataType.BYTE_SEGMENTS); - for (byte[] segment : byteSegments) { - byteSegmentLength += segment.length; - } - } - } - byte[] newRawBytes = new byte[rawBytesLen]; - byte[] newByteSegment = new byte[byteSegmentLength]; - int newRawBytesIndex = 0; - int byteSegmentIndex = 0; - for (Result saResult : saResults) { - System.arraycopy(saResult.getRawBytes(), 0, newRawBytes, newRawBytesIndex, saResult.getRawBytes().length); - newRawBytesIndex += saResult.getRawBytes().length; - if (saResult.getResultMetadata().containsKey(ResultMetadataType.BYTE_SEGMENTS)) { - @SuppressWarnings("unchecked") - Iterable byteSegments = - (Iterable) saResult.getResultMetadata().get(ResultMetadataType.BYTE_SEGMENTS); - for (byte[] segment : byteSegments) { - System.arraycopy(segment, 0, newByteSegment, byteSegmentIndex, segment.length); - byteSegmentIndex += segment.length; - } - } - } - Result newResult = new Result(concatedText.toString(), newRawBytes, NO_POINTS, BarcodeFormat.QR_CODE); - if (byteSegmentLength > 0) { - Collection byteSegmentList = new ArrayList<>(); - byteSegmentList.add(newByteSegment); - newResult.putMetadata(ResultMetadataType.BYTE_SEGMENTS, byteSegmentList); - } - newResults.add(newResult); - return newResults; - } - - private static final class SAComparator implements Comparator, Serializable { - @Override - public int compare(Result a, Result b) { - int aNumber = (int) a.getResultMetadata().get(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE); - int bNumber = (int) b.getResultMetadata().get(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE); - if (aNumber < bNumber) { - return -1; - } - if (aNumber > bNumber) { - return 1; - } - return 0; - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java b/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java deleted file mode 100644 index 9b24210..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi.qrcode.detector; - -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.ReaderException; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.qrcode.detector.Detector; -import com.google.zxing.qrcode.detector.FinderPatternInfo; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - *

    Encapsulates logic that can detect one or more QR Codes in an image, even if the QR Code - * is rotated or skewed, or partially obscured.

    - * - * @author Sean Owen - * @author Hannes Erven - */ -public final class MultiDetector extends Detector { - - private static final DetectorResult[] EMPTY_DETECTOR_RESULTS = new DetectorResult[0]; - - public MultiDetector(BitMatrix image) { - super(image); - } - - public DetectorResult[] detectMulti(Map hints) throws NotFoundException { - BitMatrix image = getImage(); - ResultPointCallback resultPointCallback = - hints == null ? null : (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - MultiFinderPatternFinder finder = new MultiFinderPatternFinder(image, resultPointCallback); - FinderPatternInfo[] infos = finder.findMulti(hints); - - if (infos.length == 0) { - throw NotFoundException.getNotFoundInstance(); - } - - List result = new ArrayList<>(); - for (FinderPatternInfo info : infos) { - try { - result.add(processFinderPatternInfo(info)); - } catch (ReaderException e) { - // ignore - } - } - if (result.isEmpty()) { - return EMPTY_DETECTOR_RESULTS; - } else { - return result.toArray(new DetectorResult[result.size()]); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java b/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java deleted file mode 100644 index 6ec4bc4..0000000 --- a/zxing/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.multi.qrcode.detector; - -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.qrcode.detector.FinderPattern; -import com.google.zxing.qrcode.detector.FinderPatternFinder; -import com.google.zxing.qrcode.detector.FinderPatternInfo; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -/** - *

    This class attempts to find finder patterns in a QR Code. Finder patterns are the square - * markers at three corners of a QR Code.

    - * - *

    This class is thread-safe but not reentrant. Each thread must allocate its own object. - * - *

    In contrast to {@link FinderPatternFinder}, this class will return an array of all possible - * QR code locations in the image.

    - * - *

    Use the TRY_HARDER hint to ask for a more thorough detection.

    - * - * @author Sean Owen - * @author Hannes Erven - */ -final class MultiFinderPatternFinder extends FinderPatternFinder { - - private static final FinderPatternInfo[] EMPTY_RESULT_ARRAY = new FinderPatternInfo[0]; - - // TODO MIN_MODULE_COUNT and MAX_MODULE_COUNT would be great hints to ask the user for - // since it limits the number of regions to decode - - // max. legal count of modules per QR code edge (177) - private static final float MAX_MODULE_COUNT_PER_EDGE = 180; - // min. legal count per modules per QR code edge (11) - private static final float MIN_MODULE_COUNT_PER_EDGE = 9; - - /** - * More or less arbitrary cutoff point for determining if two finder patterns might belong - * to the same code if they differ less than DIFF_MODSIZE_CUTOFF_PERCENT percent in their - * estimated modules sizes. - */ - private static final float DIFF_MODSIZE_CUTOFF_PERCENT = 0.05f; - - /** - * More or less arbitrary cutoff point for determining if two finder patterns might belong - * to the same code if they differ less than DIFF_MODSIZE_CUTOFF pixels/module in their - * estimated modules sizes. - */ - private static final float DIFF_MODSIZE_CUTOFF = 0.5f; - - - /** - * A comparator that orders FinderPatterns by their estimated module size. - */ - private static final class ModuleSizeComparator implements Comparator, Serializable { - @Override - public int compare(FinderPattern center1, FinderPattern center2) { - float value = center2.getEstimatedModuleSize() - center1.getEstimatedModuleSize(); - return value < 0.0 ? -1 : value > 0.0 ? 1 : 0; - } - } - - /** - *

    Creates a finder that will search the image for three finder patterns.

    - * - * @param image image to search - */ - MultiFinderPatternFinder(BitMatrix image) { - super(image); - } - - MultiFinderPatternFinder(BitMatrix image, ResultPointCallback resultPointCallback) { - super(image, resultPointCallback); - } - - /** - * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are - * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module - * size differs from the average among those patterns the least - * @throws NotFoundException if 3 such finder patterns do not exist - */ - private FinderPattern[][] selectMutipleBestPatterns() throws NotFoundException { - List possibleCenters = getPossibleCenters(); - int size = possibleCenters.size(); - - if (size < 3) { - // Couldn't find enough finder patterns - throw NotFoundException.getNotFoundInstance(); - } - - /* - * Begin HE modifications to safely detect multiple codes of equal size - */ - if (size == 3) { - return new FinderPattern[][]{ - new FinderPattern[]{ - possibleCenters.get(0), - possibleCenters.get(1), - possibleCenters.get(2) - } - }; - } - - // Sort by estimated module size to speed up the upcoming checks - Collections.sort(possibleCenters, new ModuleSizeComparator()); - - /* - * Now lets start: build a list of tuples of three finder locations that - * - feature similar module sizes - * - are placed in a distance so the estimated module count is within the QR specification - * - have similar distance between upper left/right and left top/bottom finder patterns - * - form a triangle with 90° angle (checked by comparing top right/bottom left distance - * with pythagoras) - * - * Note: we allow each point to be used for more than one code region: this might seem - * counterintuitive at first, but the performance penalty is not that big. At this point, - * we cannot make a good quality decision whether the three finders actually represent - * a QR code, or are just by chance layouted so it looks like there might be a QR code there. - * So, if the layout seems right, lets have the decoder try to decode. - */ - - List results = new ArrayList<>(); // holder for the results - - for (int i1 = 0; i1 < (size - 2); i1++) { - FinderPattern p1 = possibleCenters.get(i1); - if (p1 == null) { - continue; - } - - for (int i2 = i1 + 1; i2 < (size - 1); i2++) { - FinderPattern p2 = possibleCenters.get(i2); - if (p2 == null) { - continue; - } - - // Compare the expected module sizes; if they are really off, skip - float vModSize12 = (p1.getEstimatedModuleSize() - p2.getEstimatedModuleSize()) / - Math.min(p1.getEstimatedModuleSize(), p2.getEstimatedModuleSize()); - float vModSize12A = Math.abs(p1.getEstimatedModuleSize() - p2.getEstimatedModuleSize()); - if (vModSize12A > DIFF_MODSIZE_CUTOFF && vModSize12 >= DIFF_MODSIZE_CUTOFF_PERCENT) { - // break, since elements are ordered by the module size deviation there cannot be - // any more interesting elements for the given p1. - break; - } - - for (int i3 = i2 + 1; i3 < size; i3++) { - FinderPattern p3 = possibleCenters.get(i3); - if (p3 == null) { - continue; - } - - // Compare the expected module sizes; if they are really off, skip - float vModSize23 = (p2.getEstimatedModuleSize() - p3.getEstimatedModuleSize()) / - Math.min(p2.getEstimatedModuleSize(), p3.getEstimatedModuleSize()); - float vModSize23A = Math.abs(p2.getEstimatedModuleSize() - p3.getEstimatedModuleSize()); - if (vModSize23A > DIFF_MODSIZE_CUTOFF && vModSize23 >= DIFF_MODSIZE_CUTOFF_PERCENT) { - // break, since elements are ordered by the module size deviation there cannot be - // any more interesting elements for the given p1. - break; - } - - FinderPattern[] test = {p1, p2, p3}; - ResultPoint.orderBestPatterns(test); - - // Calculate the distances: a = topleft-bottomleft, b=topleft-topright, c = diagonal - FinderPatternInfo info = new FinderPatternInfo(test); - float dA = ResultPoint.distance(info.getTopLeft(), info.getBottomLeft()); - float dC = ResultPoint.distance(info.getTopRight(), info.getBottomLeft()); - float dB = ResultPoint.distance(info.getTopLeft(), info.getTopRight()); - - // Check the sizes - float estimatedModuleCount = (dA + dB) / (p1.getEstimatedModuleSize() * 2.0f); - if (estimatedModuleCount > MAX_MODULE_COUNT_PER_EDGE || - estimatedModuleCount < MIN_MODULE_COUNT_PER_EDGE) { - continue; - } - - // Calculate the difference of the edge lengths in percent - float vABBC = Math.abs((dA - dB) / Math.min(dA, dB)); - if (vABBC >= 0.1f) { - continue; - } - - // Calculate the diagonal length by assuming a 90° angle at topleft - float dCpy = (float) Math.sqrt(dA * dA + dB * dB); - // Compare to the real distance in % - float vPyC = Math.abs((dC - dCpy) / Math.min(dC, dCpy)); - - if (vPyC >= 0.1f) { - continue; - } - - // All tests passed! - results.add(test); - } // end iterate p3 - } // end iterate p2 - } // end iterate p1 - - if (!results.isEmpty()) { - return results.toArray(new FinderPattern[results.size()][]); - } - - // Nothing found! - throw NotFoundException.getNotFoundInstance(); - } - - public FinderPatternInfo[] findMulti(Map hints) throws NotFoundException { - boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - boolean pureBarcode = hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE); - BitMatrix image = getImage(); - int maxI = image.getHeight(); - int maxJ = image.getWidth(); - // We are looking for black/white/black/white/black modules in - // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far - - // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the - // image, and then account for the center being 3 modules in size. This gives the smallest - // number of pixels the center could be, so skip this often. When trying harder, look for all - // QR versions regardless of how dense they are. - int iSkip = (int) (maxI / (MAX_MODULES * 4.0f) * 3); - if (iSkip < MIN_SKIP || tryHarder) { - iSkip = MIN_SKIP; - } - - int[] stateCount = new int[5]; - for (int i = iSkip - 1; i < maxI; i += iSkip) { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - int currentState = 0; - for (int j = 0; j < maxJ; j++) { - if (image.get(j, i)) { - // Black pixel - if ((currentState & 1) == 1) { // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } else { // White pixel - if ((currentState & 1) == 0) { // Counting black pixels - if (currentState == 4) { // A winner? - if (foundPatternCross(stateCount) && handlePossibleCenter(stateCount, i, j, pureBarcode)) { // Yes - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } else { // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } else { - stateCount[++currentState]++; - } - } else { // Counting white pixels - stateCount[currentState]++; - } - } - } // for j=... - - if (foundPatternCross(stateCount)) { - handlePossibleCenter(stateCount, i, maxJ, pureBarcode); - } // end if foundPatternCross - } // for i=iSkip-1 ... - FinderPattern[][] patternInfo = selectMutipleBestPatterns(); - List result = new ArrayList<>(); - for (FinderPattern[] pattern : patternInfo) { - ResultPoint.orderBestPatterns(pattern); - result.add(new FinderPatternInfo(pattern)); - } - - if (result.isEmpty()) { - return EMPTY_RESULT_ARRAY; - } else { - return result.toArray(new FinderPatternInfo[result.size()]); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/CodaBarReader.java b/zxing/src/main/java/com/google/zxing/oned/CodaBarReader.java deleted file mode 100644 index 6daff2a..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/CodaBarReader.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.Map; - -/** - *

    Decodes Codabar barcodes.

    - * - * @author Bas Vijfwinkel - * @author David Walker - */ -public final class CodaBarReader extends OneDReader { - - // These values are critical for determining how permissive the decoding - // will be. All stripe sizes must be within the window these define, as - // compared to the average stripe size. - private static final float MAX_ACCEPTABLE = 2.0f; - private static final float PADDING = 1.5f; - - private static final String ALPHABET_STRING = "0123456789-$:/.+ABCD"; - static final char[] ALPHABET = ALPHABET_STRING.toCharArray(); - - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of - * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. - */ - static final int[] CHARACTER_ENCODINGS = { - 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9 - 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD - }; - - // minimal number of characters that should be present (inclusing start and stop characters) - // under normal circumstances this should be set to 3, but can be set higher - // as a last-ditch attempt to reduce false positives. - private static final int MIN_CHARACTER_LENGTH = 3; - - // official start and end patterns - private static final char[] STARTEND_ENCODING = {'A', 'B', 'C', 'D'}; - // some codabar generator allow the codabar string to be closed by every - // character. This will cause lots of false positives! - - // some industries use a checksum standard but this is not part of the original codabar standard - // for more information see : http://www.mecsw.com/specs/codabar.html - - // Keep some instance variables to avoid reallocations - private final StringBuilder decodeRowResult; - private int[] counters; - private int counterLength; - - public CodaBarReader() { - decodeRowResult = new StringBuilder(20); - counters = new int[80]; - counterLength = 0; - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) throws NotFoundException { - - Arrays.fill(counters, 0); - setCounters(row); - int startOffset = findStartPattern(); - int nextStart = startOffset; - - decodeRowResult.setLength(0); - do { - int charOffset = toNarrowWidePattern(nextStart); - if (charOffset == -1) { - throw NotFoundException.getNotFoundInstance(); - } - // Hack: We store the position in the alphabet table into a - // StringBuilder, so that we can access the decoded patterns in - // validatePattern. We'll translate to the actual characters later. - decodeRowResult.append((char) charOffset); - nextStart += 8; - // Stop as soon as we see the end character. - if (decodeRowResult.length() > 1 && - arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) { - break; - } - } while (nextStart < counterLength); // no fixed end pattern so keep on reading while data is available - - // Look for whitespace after pattern: - int trailingWhitespace = counters[nextStart - 1]; - int lastPatternSize = 0; - for (int i = -8; i < -1; i++) { - lastPatternSize += counters[nextStart + i]; - } - - // We need to see whitespace equal to 50% of the last pattern size, - // otherwise this is probably a false positive. The exception is if we are - // at the end of the row. (I.e. the barcode barely fits.) - if (nextStart < counterLength && trailingWhitespace < lastPatternSize / 2) { - throw NotFoundException.getNotFoundInstance(); - } - - validatePattern(startOffset); - - // Translate character table offsets to actual characters. - for (int i = 0; i < decodeRowResult.length(); i++) { - decodeRowResult.setCharAt(i, ALPHABET[decodeRowResult.charAt(i)]); - } - // Ensure a valid start and end character - char startchar = decodeRowResult.charAt(0); - if (!arrayContains(STARTEND_ENCODING, startchar)) { - throw NotFoundException.getNotFoundInstance(); - } - char endchar = decodeRowResult.charAt(decodeRowResult.length() - 1); - if (!arrayContains(STARTEND_ENCODING, endchar)) { - throw NotFoundException.getNotFoundInstance(); - } - - // remove stop/start characters character and check if a long enough string is contained - if (decodeRowResult.length() <= MIN_CHARACTER_LENGTH) { - // Almost surely a false positive ( start + stop + at least 1 character) - throw NotFoundException.getNotFoundInstance(); - } - - if (hints == null || !hints.containsKey(DecodeHintType.RETURN_CODABAR_START_END)) { - decodeRowResult.deleteCharAt(decodeRowResult.length() - 1); - decodeRowResult.deleteCharAt(0); - } - - int runningCount = 0; - for (int i = 0; i < startOffset; i++) { - runningCount += counters[i]; - } - float left = (float) runningCount; - for (int i = startOffset; i < nextStart - 1; i++) { - runningCount += counters[i]; - } - float right = (float) runningCount; - return new Result( - decodeRowResult.toString(), - null, - new ResultPoint[]{ - new ResultPoint(left, (float) rowNumber), - new ResultPoint(right, (float) rowNumber)}, - BarcodeFormat.CODABAR); - } - - void validatePattern(int start) throws NotFoundException { - // First, sum up the total size of our four categories of stripe sizes; - int[] sizes = {0, 0, 0, 0}; - int[] counts = {0, 0, 0, 0}; - int end = decodeRowResult.length() - 1; - - // We break out of this loop in the middle, in order to handle - // inter-character spaces properly. - int pos = start; - for (int i = 0; true; i++) { - int pattern = CHARACTER_ENCODINGS[decodeRowResult.charAt(i)]; - for (int j = 6; j >= 0; j--) { - // Even j = bars, while odd j = spaces. Categories 2 and 3 are for - // long stripes, while 0 and 1 are for short stripes. - int category = (j & 1) + (pattern & 1) * 2; - sizes[category] += counters[pos + j]; - counts[category]++; - pattern >>= 1; - } - if (i >= end) { - break; - } - // We ignore the inter-character space - it could be of any size. - pos += 8; - } - - // Calculate our allowable size thresholds using fixed-point math. - float[] maxes = new float[4]; - float[] mins = new float[4]; - // Define the threshold of acceptability to be the midpoint between the - // average small stripe and the average large stripe. No stripe lengths - // should be on the "wrong" side of that line. - for (int i = 0; i < 2; i++) { - mins[i] = 0.0f; // Accept arbitrarily small "short" stripes. - mins[i + 2] = ((float) sizes[i] / counts[i] + (float) sizes[i + 2] / counts[i + 2]) / 2.0f; - maxes[i] = mins[i + 2]; - maxes[i + 2] = (sizes[i + 2] * MAX_ACCEPTABLE + PADDING) / counts[i + 2]; - } - - // Now verify that all of the stripes are within the thresholds. - pos = start; - for (int i = 0; true; i++) { - int pattern = CHARACTER_ENCODINGS[decodeRowResult.charAt(i)]; - for (int j = 6; j >= 0; j--) { - // Even j = bars, while odd j = spaces. Categories 2 and 3 are for - // long stripes, while 0 and 1 are for short stripes. - int category = (j & 1) + (pattern & 1) * 2; - int size = counters[pos + j]; - if (size < mins[category] || size > maxes[category]) { - throw NotFoundException.getNotFoundInstance(); - } - pattern >>= 1; - } - if (i >= end) { - break; - } - pos += 8; - } - } - - /** - * Records the size of all runs of white and black pixels, starting with white. - * This is just like recordPattern, except it records all the counters, and - * uses our builtin "counters" member for storage. - * @param row row to count from - */ - private void setCounters(BitArray row) throws NotFoundException { - counterLength = 0; - // Start from the first white bit. - int i = row.getNextUnset(0); - int end = row.getSize(); - if (i >= end) { - throw NotFoundException.getNotFoundInstance(); - } - boolean isWhite = true; - int count = 0; - while (i < end) { - if (row.get(i) ^ isWhite) { // that is, exactly one is true - count++; - } else { - counterAppend(count); - count = 1; - isWhite = !isWhite; - } - i++; - } - counterAppend(count); - } - - private void counterAppend(int e) { - counters[counterLength] = e; - counterLength++; - if (counterLength >= counters.length) { - int[] temp = new int[counterLength * 2]; - System.arraycopy(counters, 0, temp, 0, counterLength); - counters = temp; - } - } - - private int findStartPattern() throws NotFoundException { - for (int i = 1; i < counterLength; i += 2) { - int charOffset = toNarrowWidePattern(i); - if (charOffset != -1 && arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) { - // Look for whitespace before start pattern, >= 50% of width of start pattern - // We make an exception if the whitespace is the first element. - int patternSize = 0; - for (int j = i; j < i + 7; j++) { - patternSize += counters[j]; - } - if (i == 1 || counters[i - 1] >= patternSize / 2) { - return i; - } - } - } - throw NotFoundException.getNotFoundInstance(); - } - - static boolean arrayContains(char[] array, char key) { - if (array != null) { - for (char c : array) { - if (c == key) { - return true; - } - } - } - return false; - } - - // Assumes that counters[position] is a bar. - private int toNarrowWidePattern(int position) { - int end = position + 7; - if (end >= counterLength) { - return -1; - } - - int[] theCounters = counters; - - int maxBar = 0; - int minBar = Integer.MAX_VALUE; - for (int j = position; j < end; j += 2) { - int currentCounter = theCounters[j]; - if (currentCounter < minBar) { - minBar = currentCounter; - } - if (currentCounter > maxBar) { - maxBar = currentCounter; - } - } - int thresholdBar = (minBar + maxBar) / 2; - - int maxSpace = 0; - int minSpace = Integer.MAX_VALUE; - for (int j = position + 1; j < end; j += 2) { - int currentCounter = theCounters[j]; - if (currentCounter < minSpace) { - minSpace = currentCounter; - } - if (currentCounter > maxSpace) { - maxSpace = currentCounter; - } - } - int thresholdSpace = (minSpace + maxSpace) / 2; - - int bitmask = 1 << 7; - int pattern = 0; - for (int i = 0; i < 7; i++) { - int threshold = (i & 1) == 0 ? thresholdBar : thresholdSpace; - bitmask >>= 1; - if (theCounters[position + i] > threshold) { - pattern |= bitmask; - } - } - - for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return i; - } - } - return -1; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/CodaBarWriter.java b/zxing/src/main/java/com/google/zxing/oned/CodaBarWriter.java deleted file mode 100644 index d27a166..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/CodaBarWriter.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -/** - * This class renders CodaBar as {@code boolean[]}. - * - * @author dsbnatut@gmail.com (Kazuki Nishiura) - */ -public final class CodaBarWriter extends OneDimensionalCodeWriter { - - private static final char[] START_END_CHARS = {'A', 'B', 'C', 'D'}; - private static final char[] ALT_START_END_CHARS = {'T', 'N', '*', 'E'}; - private static final char[] CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED = {'/', ':', '+', '.'}; - private static final char DEFAULT_GUARD = START_END_CHARS[0]; - - @Override - public boolean[] encode(String contents) { - - if (contents.length() < 2) { - // Can't have a start/end guard, so tentatively add default guards - contents = DEFAULT_GUARD + contents + DEFAULT_GUARD; - } else { - // Verify input and calculate decoded length. - char firstChar = Character.toUpperCase(contents.charAt(0)); - char lastChar = Character.toUpperCase(contents.charAt(contents.length() - 1)); - boolean startsNormal = CodaBarReader.arrayContains(START_END_CHARS, firstChar); - boolean endsNormal = CodaBarReader.arrayContains(START_END_CHARS, lastChar); - boolean startsAlt = CodaBarReader.arrayContains(ALT_START_END_CHARS, firstChar); - boolean endsAlt = CodaBarReader.arrayContains(ALT_START_END_CHARS, lastChar); - if (startsNormal) { - if (!endsNormal) { - throw new IllegalArgumentException("Invalid start/end guards: " + contents); - } - // else already has valid start/end - } else if (startsAlt) { - if (!endsAlt) { - throw new IllegalArgumentException("Invalid start/end guards: " + contents); - } - // else already has valid start/end - } else { - // Doesn't start with a guard - if (endsNormal || endsAlt) { - throw new IllegalArgumentException("Invalid start/end guards: " + contents); - } - // else doesn't end with guard either, so add a default - contents = DEFAULT_GUARD + contents + DEFAULT_GUARD; - } - } - - // The start character and the end character are decoded to 10 length each. - int resultLength = 20; - for (int i = 1; i < contents.length() - 1; i++) { - if (Character.isDigit(contents.charAt(i)) || contents.charAt(i) == '-' || contents.charAt(i) == '$') { - resultLength += 9; - } else if (CodaBarReader.arrayContains(CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED, contents.charAt(i))) { - resultLength += 10; - } else { - throw new IllegalArgumentException("Cannot encode : '" + contents.charAt(i) + '\''); - } - } - // A blank is placed between each character. - resultLength += contents.length() - 1; - - boolean[] result = new boolean[resultLength]; - int position = 0; - for (int index = 0; index < contents.length(); index++) { - char c = Character.toUpperCase(contents.charAt(index)); - if (index == 0 || index == contents.length() - 1) { - // The start/end chars are not in the CodaBarReader.ALPHABET. - switch (c) { - case 'T': - c = 'A'; - break; - case 'N': - c = 'B'; - break; - case '*': - c = 'C'; - break; - case 'E': - c = 'D'; - break; - } - } - int code = 0; - for (int i = 0; i < CodaBarReader.ALPHABET.length; i++) { - // Found any, because I checked above. - if (c == CodaBarReader.ALPHABET[i]) { - code = CodaBarReader.CHARACTER_ENCODINGS[i]; - break; - } - } - boolean color = true; - int counter = 0; - int bit = 0; - while (bit < 7) { // A character consists of 7 digit. - result[position] = color; - position++; - if (((code >> (6 - bit)) & 1) == 0 || counter == 1) { - color = !color; // Flip the color. - bit++; - counter = 0; - } else { - counter++; - } - } - if (index < contents.length() - 1) { - result[position] = false; - position++; - } - } - return result; - } -} - diff --git a/zxing/src/main/java/com/google/zxing/oned/Code128Reader.java b/zxing/src/main/java/com/google/zxing/oned/Code128Reader.java deleted file mode 100644 index 1eee8cf..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code128Reader.java +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - *

    Decodes Code 128 barcodes.

    - * - * @author Sean Owen - */ -public final class Code128Reader extends OneDReader { - - static final int[][] CODE_PATTERNS = { - {2, 1, 2, 2, 2, 2}, // 0 - {2, 2, 2, 1, 2, 2}, - {2, 2, 2, 2, 2, 1}, - {1, 2, 1, 2, 2, 3}, - {1, 2, 1, 3, 2, 2}, - {1, 3, 1, 2, 2, 2}, // 5 - {1, 2, 2, 2, 1, 3}, - {1, 2, 2, 3, 1, 2}, - {1, 3, 2, 2, 1, 2}, - {2, 2, 1, 2, 1, 3}, - {2, 2, 1, 3, 1, 2}, // 10 - {2, 3, 1, 2, 1, 2}, - {1, 1, 2, 2, 3, 2}, - {1, 2, 2, 1, 3, 2}, - {1, 2, 2, 2, 3, 1}, - {1, 1, 3, 2, 2, 2}, // 15 - {1, 2, 3, 1, 2, 2}, - {1, 2, 3, 2, 2, 1}, - {2, 2, 3, 2, 1, 1}, - {2, 2, 1, 1, 3, 2}, - {2, 2, 1, 2, 3, 1}, // 20 - {2, 1, 3, 2, 1, 2}, - {2, 2, 3, 1, 1, 2}, - {3, 1, 2, 1, 3, 1}, - {3, 1, 1, 2, 2, 2}, - {3, 2, 1, 1, 2, 2}, // 25 - {3, 2, 1, 2, 2, 1}, - {3, 1, 2, 2, 1, 2}, - {3, 2, 2, 1, 1, 2}, - {3, 2, 2, 2, 1, 1}, - {2, 1, 2, 1, 2, 3}, // 30 - {2, 1, 2, 3, 2, 1}, - {2, 3, 2, 1, 2, 1}, - {1, 1, 1, 3, 2, 3}, - {1, 3, 1, 1, 2, 3}, - {1, 3, 1, 3, 2, 1}, // 35 - {1, 1, 2, 3, 1, 3}, - {1, 3, 2, 1, 1, 3}, - {1, 3, 2, 3, 1, 1}, - {2, 1, 1, 3, 1, 3}, - {2, 3, 1, 1, 1, 3}, // 40 - {2, 3, 1, 3, 1, 1}, - {1, 1, 2, 1, 3, 3}, - {1, 1, 2, 3, 3, 1}, - {1, 3, 2, 1, 3, 1}, - {1, 1, 3, 1, 2, 3}, // 45 - {1, 1, 3, 3, 2, 1}, - {1, 3, 3, 1, 2, 1}, - {3, 1, 3, 1, 2, 1}, - {2, 1, 1, 3, 3, 1}, - {2, 3, 1, 1, 3, 1}, // 50 - {2, 1, 3, 1, 1, 3}, - {2, 1, 3, 3, 1, 1}, - {2, 1, 3, 1, 3, 1}, - {3, 1, 1, 1, 2, 3}, - {3, 1, 1, 3, 2, 1}, // 55 - {3, 3, 1, 1, 2, 1}, - {3, 1, 2, 1, 1, 3}, - {3, 1, 2, 3, 1, 1}, - {3, 3, 2, 1, 1, 1}, - {3, 1, 4, 1, 1, 1}, // 60 - {2, 2, 1, 4, 1, 1}, - {4, 3, 1, 1, 1, 1}, - {1, 1, 1, 2, 2, 4}, - {1, 1, 1, 4, 2, 2}, - {1, 2, 1, 1, 2, 4}, // 65 - {1, 2, 1, 4, 2, 1}, - {1, 4, 1, 1, 2, 2}, - {1, 4, 1, 2, 2, 1}, - {1, 1, 2, 2, 1, 4}, - {1, 1, 2, 4, 1, 2}, // 70 - {1, 2, 2, 1, 1, 4}, - {1, 2, 2, 4, 1, 1}, - {1, 4, 2, 1, 1, 2}, - {1, 4, 2, 2, 1, 1}, - {2, 4, 1, 2, 1, 1}, // 75 - {2, 2, 1, 1, 1, 4}, - {4, 1, 3, 1, 1, 1}, - {2, 4, 1, 1, 1, 2}, - {1, 3, 4, 1, 1, 1}, - {1, 1, 1, 2, 4, 2}, // 80 - {1, 2, 1, 1, 4, 2}, - {1, 2, 1, 2, 4, 1}, - {1, 1, 4, 2, 1, 2}, - {1, 2, 4, 1, 1, 2}, - {1, 2, 4, 2, 1, 1}, // 85 - {4, 1, 1, 2, 1, 2}, - {4, 2, 1, 1, 1, 2}, - {4, 2, 1, 2, 1, 1}, - {2, 1, 2, 1, 4, 1}, - {2, 1, 4, 1, 2, 1}, // 90 - {4, 1, 2, 1, 2, 1}, - {1, 1, 1, 1, 4, 3}, - {1, 1, 1, 3, 4, 1}, - {1, 3, 1, 1, 4, 1}, - {1, 1, 4, 1, 1, 3}, // 95 - {1, 1, 4, 3, 1, 1}, - {4, 1, 1, 1, 1, 3}, - {4, 1, 1, 3, 1, 1}, - {1, 1, 3, 1, 4, 1}, - {1, 1, 4, 1, 3, 1}, // 100 - {3, 1, 1, 1, 4, 1}, - {4, 1, 1, 1, 3, 1}, - {2, 1, 1, 4, 1, 2}, - {2, 1, 1, 2, 1, 4}, - {2, 1, 1, 2, 3, 2}, // 105 - {2, 3, 3, 1, 1, 1, 2} - }; - - private static final float MAX_AVG_VARIANCE = 0.25f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.7f; - - private static final int CODE_SHIFT = 98; - - private static final int CODE_CODE_C = 99; - private static final int CODE_CODE_B = 100; - private static final int CODE_CODE_A = 101; - - private static final int CODE_FNC_1 = 102; - private static final int CODE_FNC_2 = 97; - private static final int CODE_FNC_3 = 96; - private static final int CODE_FNC_4_A = 101; - private static final int CODE_FNC_4_B = 100; - - private static final int CODE_START_A = 103; - private static final int CODE_START_B = 104; - private static final int CODE_START_C = 105; - private static final int CODE_STOP = 106; - - private static int[] findStartPattern(BitArray row) throws NotFoundException { - int width = row.getSize(); - int rowOffset = row.getNextSet(0); - - int counterPosition = 0; - int[] counters = new int[6]; - int patternStart = rowOffset; - boolean isWhite = false; - int patternLength = counters.length; - - for (int i = rowOffset; i < width; i++) { - if (row.get(i) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - float bestVariance = MAX_AVG_VARIANCE; - int bestMatch = -1; - for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) { - float variance = patternMatchVariance(counters, CODE_PATTERNS[startCode], - MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = startCode; - } - } - // Look for whitespace before start pattern, >= 50% of width of start pattern - if (bestMatch >= 0 && - row.isRange(Math.max(0, patternStart - (i - patternStart) / 2), patternStart, false)) { - return new int[]{patternStart, i, bestMatch}; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, patternLength - 2); - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static int decodeCode(BitArray row, int[] counters, int rowOffset) - throws NotFoundException { - recordPattern(row, rowOffset, counters); - float bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - for (int d = 0; d < CODE_PATTERNS.length; d++) { - int[] pattern = CODE_PATTERNS[d]; - float variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = d; - } - } - // TODO We're overlooking the fact that the STOP pattern has 7 values, not 6. - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException.getNotFoundInstance(); - } - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, FormatException, ChecksumException { - - boolean convertFNC1 = hints != null && hints.containsKey(DecodeHintType.ASSUME_GS1); - - int[] startPatternInfo = findStartPattern(row); - int startCode = startPatternInfo[2]; - - List rawCodes = new ArrayList<>(20); - rawCodes.add((byte) startCode); - - int codeSet; - switch (startCode) { - case CODE_START_A: - codeSet = CODE_CODE_A; - break; - case CODE_START_B: - codeSet = CODE_CODE_B; - break; - case CODE_START_C: - codeSet = CODE_CODE_C; - break; - default: - throw FormatException.getFormatInstance(); - } - - boolean done = false; - boolean isNextShifted = false; - - StringBuilder result = new StringBuilder(20); - - int lastStart = startPatternInfo[0]; - int nextStart = startPatternInfo[1]; - int[] counters = new int[6]; - - int lastCode = 0; - int code = 0; - int checksumTotal = startCode; - int multiplier = 0; - boolean lastCharacterWasPrintable = true; - boolean upperMode = false; - boolean shiftUpperMode = false; - - while (!done) { - - boolean unshift = isNextShifted; - isNextShifted = false; - - // Save off last code - lastCode = code; - - // Decode another code from image - code = decodeCode(row, counters, nextStart); - - rawCodes.add((byte) code); - - // Remember whether the last code was printable or not (excluding CODE_STOP) - if (code != CODE_STOP) { - lastCharacterWasPrintable = true; - } - - // Add to checksum computation (if not CODE_STOP of course) - if (code != CODE_STOP) { - multiplier++; - checksumTotal += multiplier * code; - } - - // Advance to where the next code will to start - lastStart = nextStart; - for (int counter : counters) { - nextStart += counter; - } - - // Take care of illegal start codes - switch (code) { - case CODE_START_A: - case CODE_START_B: - case CODE_START_C: - throw FormatException.getFormatInstance(); - } - - switch (codeSet) { - - case CODE_CODE_A: - if (code < 64) { - if (shiftUpperMode == upperMode) { - result.append((char) (' ' + code)); - } else { - result.append((char) (' ' + code + 128)); - } - shiftUpperMode = false; - } else if (code < 96) { - if (shiftUpperMode == upperMode) { - result.append((char) (code - 64)); - } else { - result.append((char) (code + 64)); - } - shiftUpperMode = false; - } else { - // Don't let CODE_STOP, which always appears, affect whether whether we think the last - // code was printable or not. - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - if (convertFNC1) { - if (result.length() == 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result.append("]C1"); - } else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result.append((char) 29); - } - } - break; - case CODE_FNC_2: - case CODE_FNC_3: - // do nothing? - break; - case CODE_FNC_4_A: - if (!upperMode && shiftUpperMode) { - upperMode = true; - shiftUpperMode = false; - } else if (upperMode && shiftUpperMode) { - upperMode = false; - shiftUpperMode = false; - } else { - shiftUpperMode = true; - } - break; - case CODE_SHIFT: - isNextShifted = true; - codeSet = CODE_CODE_B; - break; - case CODE_CODE_B: - codeSet = CODE_CODE_B; - break; - case CODE_CODE_C: - codeSet = CODE_CODE_C; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - case CODE_CODE_B: - if (code < 96) { - if (shiftUpperMode == upperMode) { - result.append((char) (' ' + code)); - } else { - result.append((char) (' ' + code + 128)); - } - shiftUpperMode = false; - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - if (convertFNC1) { - if (result.length() == 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result.append("]C1"); - } else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result.append((char) 29); - } - } - break; - case CODE_FNC_2: - case CODE_FNC_3: - // do nothing? - break; - case CODE_FNC_4_B: - if (!upperMode && shiftUpperMode) { - upperMode = true; - shiftUpperMode = false; - } else if (upperMode && shiftUpperMode) { - upperMode = false; - shiftUpperMode = false; - } else { - shiftUpperMode = true; - } - break; - case CODE_SHIFT: - isNextShifted = true; - codeSet = CODE_CODE_A; - break; - case CODE_CODE_A: - codeSet = CODE_CODE_A; - break; - case CODE_CODE_C: - codeSet = CODE_CODE_C; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - case CODE_CODE_C: - if (code < 100) { - if (code < 10) { - result.append('0'); - } - result.append(code); - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - if (convertFNC1) { - if (result.length() == 0) { - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result.append("]C1"); - } else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result.append((char) 29); - } - } - break; - case CODE_CODE_A: - codeSet = CODE_CODE_A; - break; - case CODE_CODE_B: - codeSet = CODE_CODE_B; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - } - - // Unshift back to another code set if we were shifted - if (unshift) { - codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; - } - - } - - int lastPatternSize = nextStart - lastStart; - - // Check for ample whitespace following pattern, but, to do this we first need to remember that - // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left - // to read off. Would be slightly better to properly read. Here we just skip it: - nextStart = row.getNextUnset(nextStart); - if (!row.isRange(nextStart, - Math.min(row.getSize(), nextStart + (nextStart - lastStart) / 2), - false)) { - throw NotFoundException.getNotFoundInstance(); - } - - // Pull out from sum the value of the penultimate check code - checksumTotal -= multiplier * lastCode; - // lastCode is the checksum then: - if (checksumTotal % 103 != lastCode) { - throw ChecksumException.getChecksumInstance(); - } - - // Need to pull out the check digits from string - int resultLength = result.length(); - if (resultLength == 0) { - // false positive - throw NotFoundException.getNotFoundInstance(); - } - - // Only bother if the result had at least one character, and if the checksum digit happened to - // be a printable character. If it was just interpreted as a control code, nothing to remove. - if (resultLength > 0 && lastCharacterWasPrintable) { - if (codeSet == CODE_CODE_C) { - result.delete(resultLength - 2, resultLength); - } else { - result.delete(resultLength - 1, resultLength); - } - } - - float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - - int rawCodesSize = rawCodes.size(); - byte[] rawBytes = new byte[rawCodesSize]; - for (int i = 0; i < rawCodesSize; i++) { - rawBytes[i] = rawCodes.get(i); - } - - return new Result( - result.toString(), - rawBytes, - new ResultPoint[]{ - new ResultPoint(left, (float) rowNumber), - new ResultPoint(right, (float) rowNumber)}, - BarcodeFormat.CODE_128); - - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/Code128Writer.java b/zxing/src/main/java/com/google/zxing/oned/Code128Writer.java deleted file mode 100644 index 13ff1ca..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code128Writer.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - -/** - * This object renders a CODE128 code as a {@link BitMatrix}. - * - * @author erik.barbara@gmail.com (Erik Barbara) - */ -public final class Code128Writer extends OneDimensionalCodeWriter { - - private static final int CODE_START_B = 104; - private static final int CODE_START_C = 105; - private static final int CODE_CODE_B = 100; - private static final int CODE_CODE_C = 99; - private static final int CODE_STOP = 106; - - // Dummy characters used to specify control characters in input - private static final char ESCAPE_FNC_1 = '\u00f1'; - private static final char ESCAPE_FNC_2 = '\u00f2'; - private static final char ESCAPE_FNC_3 = '\u00f3'; - private static final char ESCAPE_FNC_4 = '\u00f4'; - - private static final int CODE_FNC_1 = 102; // Code A, Code B, Code C - private static final int CODE_FNC_2 = 97; // Code A, Code B - private static final int CODE_FNC_3 = 96; // Code A, Code B - private static final int CODE_FNC_4_B = 100; // Code B - - // Results of minimal lookahead for code C - private enum CType { - UNCODABLE, - ONE_DIGIT, - TWO_DIGITS, - FNC_1 - } - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.CODE_128) { - throw new IllegalArgumentException("Can only encode CODE_128, but got " + format); - } - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - int length = contents.length(); - // Check length - if (length < 1 || length > 80) { - throw new IllegalArgumentException( - "Contents length should be between 1 and 80 characters, but got " + length); - } - // Check content - for (int i = 0; i < length; i++) { - char c = contents.charAt(i); - if (c < ' ' || c > '~') { - switch (c) { - case ESCAPE_FNC_1: - case ESCAPE_FNC_2: - case ESCAPE_FNC_3: - case ESCAPE_FNC_4: - break; - default: - throw new IllegalArgumentException("Bad character in input: " + c); - } - } - } - - Collection patterns = new ArrayList<>(); // temporary storage for patterns - int checkSum = 0; - int checkWeight = 1; - int codeSet = 0; // selected code (CODE_CODE_B or CODE_CODE_C) - int position = 0; // position in contents - - while (position < length) { - //Select code to use - int newCodeSet = chooseCode(contents, position, codeSet); - - //Get the pattern index - int patternIndex; - if (newCodeSet == codeSet) { - // Encode the current character - // First handle escapes - switch (contents.charAt(position)) { - case ESCAPE_FNC_1: - patternIndex = CODE_FNC_1; - break; - case ESCAPE_FNC_2: - patternIndex = CODE_FNC_2; - break; - case ESCAPE_FNC_3: - patternIndex = CODE_FNC_3; - break; - case ESCAPE_FNC_4: - patternIndex = CODE_FNC_4_B; // FIXME if this ever outputs Code A - break; - default: - // Then handle normal characters otherwise - if (codeSet == CODE_CODE_B) { - patternIndex = contents.charAt(position) - ' '; - } else { // CODE_CODE_C - patternIndex = Integer.parseInt(contents.substring(position, position + 2)); - position++; // Also incremented below - } - } - position++; - } else { - // Should we change the current code? - // Do we have a code set? - if (codeSet == 0) { - // No, we don't have a code set - if (newCodeSet == CODE_CODE_B) { - patternIndex = CODE_START_B; - } else { - // CODE_CODE_C - patternIndex = CODE_START_C; - } - } else { - // Yes, we have a code set - patternIndex = newCodeSet; - } - codeSet = newCodeSet; - } - - // Get the pattern - patterns.add(Code128Reader.CODE_PATTERNS[patternIndex]); - - // Compute checksum - checkSum += patternIndex * checkWeight; - if (position != 0) { - checkWeight++; - } - } - - // Compute and append checksum - checkSum %= 103; - patterns.add(Code128Reader.CODE_PATTERNS[checkSum]); - - // Append stop code - patterns.add(Code128Reader.CODE_PATTERNS[CODE_STOP]); - - // Compute code width - int codeWidth = 0; - for (int[] pattern : patterns) { - for (int width : pattern) { - codeWidth += width; - } - } - - // Compute result - boolean[] result = new boolean[codeWidth]; - int pos = 0; - for (int[] pattern : patterns) { - pos += appendPattern(result, pos, pattern, true); - } - - return result; - } - - private static CType findCType(CharSequence value, int start) { - int last = value.length(); - if (start >= last) { - return CType.UNCODABLE; - } - char c = value.charAt(start); - if (c == ESCAPE_FNC_1) { - return CType.FNC_1; - } - if (c < '0' || c > '9') { - return CType.UNCODABLE; - } - if (start + 1 >= last) { - return CType.ONE_DIGIT; - } - c = value.charAt(start + 1); - if (c < '0' || c > '9') { - return CType.ONE_DIGIT; - } - return CType.TWO_DIGITS; - } - - private static int chooseCode(CharSequence value, int start, int oldCode) { - CType lookahead = findCType(value, start); - if (lookahead == CType.UNCODABLE || lookahead == CType.ONE_DIGIT) { - return CODE_CODE_B; // no choice - } - if (oldCode == CODE_CODE_C) { // can continue in code C - return oldCode; - } - if (oldCode == CODE_CODE_B) { - if (lookahead == CType.FNC_1) { - return oldCode; // can continue in code B - } - // Seen two consecutive digits, see what follows - lookahead = findCType(value, start + 2); - if (lookahead == CType.UNCODABLE || lookahead == CType.ONE_DIGIT) { - return oldCode; // not worth switching now - } - if (lookahead == CType.FNC_1) { // two digits, then FNC_1... - lookahead = findCType(value, start + 3); - if (lookahead == CType.TWO_DIGITS) { // then two more digits, switch - return CODE_CODE_C; - } else { - return CODE_CODE_B; // otherwise not worth switching - } - } - // At this point, there are at least 4 consecutive digits. - // Look ahead to choose whether to switch now or on the next round. - int index = start + 4; - while ((lookahead = findCType(value, index)) == CType.TWO_DIGITS) { - index += 2; - } - if (lookahead == CType.ONE_DIGIT) { // odd number of digits, switch later - return CODE_CODE_B; - } - return CODE_CODE_C; // even number of digits, switch now - } - // Here oldCode == 0, which means we are choosing the initial code - if (lookahead == CType.FNC_1) { // ignore FNC_1 - lookahead = findCType(value, start + 1); - } - if (lookahead == CType.TWO_DIGITS) { // at least two digits, start in code C - return CODE_CODE_C; - } - return CODE_CODE_B; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/Code39Reader.java b/zxing/src/main/java/com/google/zxing/oned/Code39Reader.java deleted file mode 100644 index 6a9a7e1..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code39Reader.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.Map; - -/** - *

    Decodes Code 39 barcodes. This does not support "Full ASCII Code 39" yet.

    - * - * @author Sean Owen - * @see Code93Reader - */ -public final class Code39Reader extends OneDReader { - - static final String ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; - // Note this lacks '*' compared to ALPHABET_STRING - private static final String CHECK_DIGIT_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"; - - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. - * The 9 least-significant bits of each int correspond to the pattern of wide and narrow, - * with 1s representing "wide" and 0s representing narrow. - */ - static final int[] CHARACTER_ENCODINGS = { - 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9 - 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J - 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T - 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, // U-* - 0x0A8, 0x0A2, 0x08A, 0x02A // $-% - }; - - static final int ASTERISK_ENCODING = CHARACTER_ENCODINGS[39]; - - private final boolean usingCheckDigit; - private final boolean extendedMode; - private final StringBuilder decodeRowResult; - private final int[] counters; - - /** - * Creates a reader that assumes all encoded data is data, and does not treat the final - * character as a check digit. It will not decoded "extended Code 39" sequences. - */ - public Code39Reader() { - this(false); - } - - /** - * Creates a reader that can be configured to check the last character as a check digit. - * It will not decoded "extended Code 39" sequences. - * - * @param usingCheckDigit if true, treat the last data character as a check digit, not - * data, and verify that the checksum passes. - */ - public Code39Reader(boolean usingCheckDigit) { - this(usingCheckDigit, false); - } - - /** - * Creates a reader that can be configured to check the last character as a check digit, - * or optionally attempt to decode "extended Code 39" sequences that are used to encode - * the full ASCII character set. - * - * @param usingCheckDigit if true, treat the last data character as a check digit, not - * data, and verify that the checksum passes. - * @param extendedMode if true, will attempt to decode extended Code 39 sequences in the - * text. - */ - public Code39Reader(boolean usingCheckDigit, boolean extendedMode) { - this.usingCheckDigit = usingCheckDigit; - this.extendedMode = extendedMode; - decodeRowResult = new StringBuilder(20); - counters = new int[9]; - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, ChecksumException, FormatException { - - int[] theCounters = counters; - Arrays.fill(theCounters, 0); - StringBuilder result = decodeRowResult; - result.setLength(0); - - int[] start = findAsteriskPattern(row, theCounters); - // Read off white space - int nextStart = row.getNextSet(start[1]); - int end = row.getSize(); - - char decodedChar; - int lastStart; - do { - recordPattern(row, nextStart, theCounters); - int pattern = toNarrowWidePattern(theCounters); - if (pattern < 0) { - throw NotFoundException.getNotFoundInstance(); - } - decodedChar = patternToChar(pattern); - result.append(decodedChar); - lastStart = nextStart; - for (int counter : theCounters) { - nextStart += counter; - } - // Read off white space - nextStart = row.getNextSet(nextStart); - } while (decodedChar != '*'); - result.setLength(result.length() - 1); // remove asterisk - - // Look for whitespace after pattern: - int lastPatternSize = 0; - for (int counter : theCounters) { - lastPatternSize += counter; - } - int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; - // If 50% of last pattern size, following last pattern, is not whitespace, fail - // (but if it's whitespace to the very end of the image, that's OK) - if (nextStart != end && (whiteSpaceAfterEnd * 2) < lastPatternSize) { - throw NotFoundException.getNotFoundInstance(); - } - - if (usingCheckDigit) { - int max = result.length() - 1; - int total = 0; - for (int i = 0; i < max; i++) { - total += CHECK_DIGIT_STRING.indexOf(decodeRowResult.charAt(i)); - } - if (result.charAt(max) != CHECK_DIGIT_STRING.charAt(total % 43)) { - throw ChecksumException.getChecksumInstance(); - } - result.setLength(max); - } - - if (result.length() == 0) { - // false positive - throw NotFoundException.getNotFoundInstance(); - } - - String resultString; - if (extendedMode) { - resultString = decodeExtended(result); - } else { - resultString = result.toString(); - } - - float left = (float) (start[1] + start[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - return new Result( - resultString, - null, - new ResultPoint[]{ - new ResultPoint(left, (float) rowNumber), - new ResultPoint(right, (float) rowNumber)}, - BarcodeFormat.CODE_39); - - } - - private static int[] findAsteriskPattern(BitArray row, int[] counters) throws NotFoundException { - int width = row.getSize(); - int rowOffset = row.getNextSet(0); - - int counterPosition = 0; - int patternStart = rowOffset; - boolean isWhite = false; - int patternLength = counters.length; - - for (int i = rowOffset; i < width; i++) { - if (row.get(i) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - // Look for whitespace before start pattern, >= 50% of width of start pattern - if (toNarrowWidePattern(counters) == ASTERISK_ENCODING && - row.isRange(Math.max(0, patternStart - ((i - patternStart) / 2)), patternStart, false)) { - return new int[]{patternStart, i}; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, patternLength - 2); - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - // For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions - // per image when using some of our blackbox images. - private static int toNarrowWidePattern(int[] counters) { - int numCounters = counters.length; - int maxNarrowCounter = 0; - int wideCounters; - do { - int minCounter = Integer.MAX_VALUE; - for (int counter : counters) { - if (counter < minCounter && counter > maxNarrowCounter) { - minCounter = counter; - } - } - maxNarrowCounter = minCounter; - wideCounters = 0; - int totalWideCountersWidth = 0; - int pattern = 0; - for (int i = 0; i < numCounters; i++) { - int counter = counters[i]; - if (counter > maxNarrowCounter) { - pattern |= 1 << (numCounters - 1 - i); - wideCounters++; - totalWideCountersWidth += counter; - } - } - if (wideCounters == 3) { - // Found 3 wide counters, but are they close enough in width? - // We can perform a cheap, conservative check to see if any individual - // counter is more than 1.5 times the average: - for (int i = 0; i < numCounters && wideCounters > 0; i++) { - int counter = counters[i]; - if (counter > maxNarrowCounter) { - wideCounters--; - // totalWideCountersWidth = 3 * average, so this checks if counter >= 3/2 * average - if ((counter * 2) >= totalWideCountersWidth) { - return -1; - } - } - } - return pattern; - } - } while (wideCounters > 3); - return -1; - } - - private static char patternToChar(int pattern) throws NotFoundException { - for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return ALPHABET_STRING.charAt(i); - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static String decodeExtended(CharSequence encoded) throws FormatException { - int length = encoded.length(); - StringBuilder decoded = new StringBuilder(length); - for (int i = 0; i < length; i++) { - char c = encoded.charAt(i); - if (c == '+' || c == '$' || c == '%' || c == '/') { - char next = encoded.charAt(i + 1); - char decodedChar = '\0'; - switch (c) { - case '+': - // +A to +Z map to a to z - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next + 32); - } else { - throw FormatException.getFormatInstance(); - } - break; - case '$': - // $A to $Z map to control codes SH to SB - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next - 64); - } else { - throw FormatException.getFormatInstance(); - } - break; - case '%': - // %A to %E map to control codes ESC to US - if (next >= 'A' && next <= 'E') { - decodedChar = (char) (next - 38); - } else if (next >= 'F' && next <= 'W') { - decodedChar = (char) (next - 11); - } else { - throw FormatException.getFormatInstance(); - } - break; - case '/': - // /A to /O map to ! to , and /Z maps to : - if (next >= 'A' && next <= 'O') { - decodedChar = (char) (next - 32); - } else if (next == 'Z') { - decodedChar = ':'; - } else { - throw FormatException.getFormatInstance(); - } - break; - } - decoded.append(decodedChar); - // bump up i again since we read two characters - i++; - } else { - decoded.append(c); - } - } - return decoded.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/Code39Writer.java b/zxing/src/main/java/com/google/zxing/oned/Code39Writer.java deleted file mode 100644 index 0c1ad1c..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code39Writer.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders a CODE39 code as a {@link BitMatrix}. - * - * @author erik.barbara@gmail.com (Erik Barbara) - */ -public final class Code39Writer extends OneDimensionalCodeWriter { - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.CODE_39) { - throw new IllegalArgumentException("Can only encode CODE_39, but got " + format); - } - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - int length = contents.length(); - if (length > 80) { - throw new IllegalArgumentException( - "Requested contents should be less than 80 digits long, but got " + length); - } - - int[] widths = new int[9]; - int codeWidth = 24 + 1 + length; - for (int i = 0; i < length; i++) { - int indexInString = Code39Reader.ALPHABET_STRING.indexOf(contents.charAt(i)); - if (indexInString < 0) { - throw new IllegalArgumentException("Bad contents: " + contents); - } - toIntArray(Code39Reader.CHARACTER_ENCODINGS[indexInString], widths); - for (int width : widths) { - codeWidth += width; - } - } - boolean[] result = new boolean[codeWidth]; - toIntArray(Code39Reader.ASTERISK_ENCODING, widths); - int pos = appendPattern(result, 0, widths, true); - int[] narrowWhite = {1}; - pos += appendPattern(result, pos, narrowWhite, false); - //append next character to byte matrix - for (int i = 0; i < length; i++) { - int indexInString = Code39Reader.ALPHABET_STRING.indexOf(contents.charAt(i)); - toIntArray(Code39Reader.CHARACTER_ENCODINGS[indexInString], widths); - pos += appendPattern(result, pos, widths, true); - pos += appendPattern(result, pos, narrowWhite, false); - } - toIntArray(Code39Reader.ASTERISK_ENCODING, widths); - appendPattern(result, pos, widths, true); - return result; - } - - private static void toIntArray(int a, int[] toReturn) { - for (int i = 0; i < 9; i++) { - int temp = a & (1 << (8 - i)); - toReturn[i] = temp == 0 ? 1 : 2; - } - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/oned/Code93Reader.java b/zxing/src/main/java/com/google/zxing/oned/Code93Reader.java deleted file mode 100644 index 66c2953..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code93Reader.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.Map; - -/** - *

    Decodes Code 93 barcodes.

    - * - * @author Sean Owen - * @see Code39Reader - */ -public final class Code93Reader extends OneDReader { - - // Note that 'abcd' are dummy characters in place of control characters. - static final String ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*"; - private static final char[] ALPHABET = ALPHABET_STRING.toCharArray(); - - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. - * The 9 least-significant bits of each int correspond to the pattern of wide and narrow. - */ - static final int[] CHARACTER_ENCODINGS = { - 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 - 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J - 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T - 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z - 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % - 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-* - }; - private static final int ASTERISK_ENCODING = CHARACTER_ENCODINGS[47]; - - private final StringBuilder decodeRowResult; - private final int[] counters; - - public Code93Reader() { - decodeRowResult = new StringBuilder(20); - counters = new int[6]; - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, ChecksumException, FormatException { - - int[] start = findAsteriskPattern(row); - // Read off white space - int nextStart = row.getNextSet(start[1]); - int end = row.getSize(); - - int[] theCounters = counters; - Arrays.fill(theCounters, 0); - StringBuilder result = decodeRowResult; - result.setLength(0); - - char decodedChar; - int lastStart; - do { - recordPattern(row, nextStart, theCounters); - int pattern = toPattern(theCounters); - if (pattern < 0) { - throw NotFoundException.getNotFoundInstance(); - } - decodedChar = patternToChar(pattern); - result.append(decodedChar); - lastStart = nextStart; - for (int counter : theCounters) { - nextStart += counter; - } - // Read off white space - nextStart = row.getNextSet(nextStart); - } while (decodedChar != '*'); - result.deleteCharAt(result.length() - 1); // remove asterisk - - int lastPatternSize = 0; - for (int counter : theCounters) { - lastPatternSize += counter; - } - - // Should be at least one more black module - if (nextStart == end || !row.get(nextStart)) { - throw NotFoundException.getNotFoundInstance(); - } - - if (result.length() < 2) { - // false positive -- need at least 2 checksum digits - throw NotFoundException.getNotFoundInstance(); - } - - checkChecksums(result); - // Remove checksum digits - result.setLength(result.length() - 2); - - String resultString = decodeExtended(result); - - float left = (float) (start[1] + start[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - return new Result( - resultString, - null, - new ResultPoint[]{ - new ResultPoint(left, (float) rowNumber), - new ResultPoint(right, (float) rowNumber)}, - BarcodeFormat.CODE_93); - - } - - private int[] findAsteriskPattern(BitArray row) throws NotFoundException { - int width = row.getSize(); - int rowOffset = row.getNextSet(0); - - Arrays.fill(counters, 0); - int[] theCounters = counters; - int patternStart = rowOffset; - boolean isWhite = false; - int patternLength = theCounters.length; - - int counterPosition = 0; - for (int i = rowOffset; i < width; i++) { - if (row.get(i) ^ isWhite) { - theCounters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (toPattern(theCounters) == ASTERISK_ENCODING) { - return new int[]{patternStart, i}; - } - patternStart += theCounters[0] + theCounters[1]; - System.arraycopy(theCounters, 2, theCounters, 0, patternLength - 2); - theCounters[patternLength - 2] = 0; - theCounters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - theCounters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static int toPattern(int[] counters) { - int max = counters.length; - int sum = 0; - for (int counter : counters) { - sum += counter; - } - int pattern = 0; - for (int i = 0; i < max; i++) { - int scaled = Math.round(counters[i] * 9.0f / sum); - if (scaled < 1 || scaled > 4) { - return -1; - } - if ((i & 0x01) == 0) { - for (int j = 0; j < scaled; j++) { - pattern = (pattern << 1) | 0x01; - } - } else { - pattern <<= scaled; - } - } - return pattern; - } - - private static char patternToChar(int pattern) throws NotFoundException { - for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return ALPHABET[i]; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static String decodeExtended(CharSequence encoded) throws FormatException { - int length = encoded.length(); - StringBuilder decoded = new StringBuilder(length); - for (int i = 0; i < length; i++) { - char c = encoded.charAt(i); - if (c >= 'a' && c <= 'd') { - if (i >= length - 1) { - throw FormatException.getFormatInstance(); - } - char next = encoded.charAt(i + 1); - char decodedChar = '\0'; - switch (c) { - case 'd': - // +A to +Z map to a to z - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next + 32); - } else { - throw FormatException.getFormatInstance(); - } - break; - case 'a': - // $A to $Z map to control codes SH to SB - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next - 64); - } else { - throw FormatException.getFormatInstance(); - } - break; - case 'b': - if (next >= 'A' && next <= 'E') { - // %A to %E map to control codes ESC to USep - decodedChar = (char) (next - 38); - } else if (next >= 'F' && next <= 'J') { - // %F to %J map to ; < = > ? - decodedChar = (char) (next - 11); - } else if (next >= 'K' && next <= 'O') { - // %K to %O map to [ \ ] ^ _ - decodedChar = (char) (next + 16); - } else if (next >= 'P' && next <= 'S') { - // %P to %S map to { | } ~ - decodedChar = (char) (next + 43); - } else if (next >= 'T' && next <= 'Z') { - // %T to %Z all map to DEL (127) - decodedChar = 127; - } else { - throw FormatException.getFormatInstance(); - } - break; - case 'c': - // /A to /O map to ! to , and /Z maps to : - if (next >= 'A' && next <= 'O') { - decodedChar = (char) (next - 32); - } else if (next == 'Z') { - decodedChar = ':'; - } else { - throw FormatException.getFormatInstance(); - } - break; - } - decoded.append(decodedChar); - // bump up i again since we read two characters - i++; - } else { - decoded.append(c); - } - } - return decoded.toString(); - } - - private static void checkChecksums(CharSequence result) throws ChecksumException { - int length = result.length(); - checkOneChecksum(result, length - 2, 20); - checkOneChecksum(result, length - 1, 15); - } - - private static void checkOneChecksum(CharSequence result, int checkPosition, int weightMax) - throws ChecksumException { - int weight = 1; - int total = 0; - for (int i = checkPosition - 1; i >= 0; i--) { - total += weight * ALPHABET_STRING.indexOf(result.charAt(i)); - if (++weight > weightMax) { - weight = 1; - } - } - if (result.charAt(checkPosition) != ALPHABET[total % 47]) { - throw ChecksumException.getChecksumInstance(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/Code93Writer.java b/zxing/src/main/java/com/google/zxing/oned/Code93Writer.java deleted file mode 100644 index 53db6ec..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/Code93Writer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2015 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders a CODE93 code as a BitMatrix - */ -public class Code93Writer extends OneDimensionalCodeWriter { - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.CODE_93) { - throw new IllegalArgumentException("Can only encode CODE_93, but got " + format); - } - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - int length = contents.length(); - if (length > 80) { - throw new IllegalArgumentException( - "Requested contents should be less than 80 digits long, but got " + length); - } - //each character is encoded by 9 of 0/1's - int[] widths = new int[9]; - - //lenght of code + 2 start/stop characters + 2 checksums, each of 9 bits, plus a termination bar - int codeWidth = (contents.length() + 2 + 2) * 9 + 1; - - boolean[] result = new boolean[codeWidth]; - - //start character (*) - toIntArray(Code93Reader.CHARACTER_ENCODINGS[47], widths); - int pos = appendPattern(result, 0, widths, true); - - for (int i = 0; i < length; i++) { - int indexInString = Code93Reader.ALPHABET_STRING.indexOf(contents.charAt(i)); - toIntArray(Code93Reader.CHARACTER_ENCODINGS[indexInString], widths); - pos += appendPattern(result, pos, widths, true); - } - - //add two checksums - int check1 = computeChecksumIndex(contents, 20); - toIntArray(Code93Reader.CHARACTER_ENCODINGS[check1], widths); - pos += appendPattern(result, pos, widths, true); - - //append the contents to reflect the first checksum added - contents += Code93Reader.ALPHABET_STRING.charAt(check1); - - int check2 = computeChecksumIndex(contents, 15); - toIntArray(Code93Reader.CHARACTER_ENCODINGS[check2], widths); - pos += appendPattern(result, pos, widths, true); - - //end character (*) - toIntArray(Code93Reader.CHARACTER_ENCODINGS[47], widths); - pos += appendPattern(result, pos, widths, true); - - //termination bar (single black bar) - result[pos] = true; - - return result; - } - - private static void toIntArray(int a, int[] toReturn) { - for (int i = 0; i < 9; i++) { - int temp = a & (1 << (8 - i)); - toReturn[i] = temp == 0 ? 0 : 1; - } - } - - protected static int appendPattern(boolean[] target, int pos, int[] pattern, boolean startColor) { - for (int bit : pattern) { - target[pos++] = bit != 0; - } - return 9; - } - - private static int computeChecksumIndex(String contents, int maxWeight) { - int weight = 1; - int total = 0; - - for (int i = contents.length() - 1; i >= 0; i--) { - int indexInString = Code93Reader.ALPHABET_STRING.indexOf(contents.charAt(i)); - total += indexInString * weight; - if (++weight > maxWeight) { - weight = 1; - } - } - return total % 47; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/EAN13Reader.java b/zxing/src/main/java/com/google/zxing/oned/EAN13Reader.java deleted file mode 100644 index c537eac..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/EAN13Reader.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - *

    Implements decoding of the EAN-13 format.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author alasdair@google.com (Alasdair Mackintosh) - */ -public final class EAN13Reader extends UPCEANReader { - - // For an EAN-13 barcode, the first digit is represented by the parities used - // to encode the next six digits, according to the table below. For example, - // if the barcode is 5 123456 789012 then the value of the first digit is - // signified by using odd for '1', even for '2', even for '3', odd for '4', - // odd for '5', and even for '6'. See http://en.wikipedia.org/wiki/EAN-13 - // - // Parity of next 6 digits - // Digit 0 1 2 3 4 5 - // 0 Odd Odd Odd Odd Odd Odd - // 1 Odd Odd Even Odd Even Even - // 2 Odd Odd Even Even Odd Even - // 3 Odd Odd Even Even Even Odd - // 4 Odd Even Odd Odd Even Even - // 5 Odd Even Even Odd Odd Even - // 6 Odd Even Even Even Odd Odd - // 7 Odd Even Odd Even Odd Even - // 8 Odd Even Odd Even Even Odd - // 9 Odd Even Even Odd Even Odd - // - // Note that the encoding for '0' uses the same parity as a UPC barcode. Hence - // a UPC barcode can be converted to an EAN-13 barcode by prepending a 0. - // - // The encoding is represented by the following array, which is a bit pattern - // using Odd = 0 and Even = 1. For example, 5 is represented by: - // - // Odd Even Even Odd Odd Even - // in binary: - // 0 1 1 0 0 1 == 0x19 - // - static final int[] FIRST_DIGIT_ENCODINGS = { - 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A - }; - - private final int[] decodeMiddleCounters; - - public EAN13Reader() { - decodeMiddleCounters = new int[4]; - } - - @Override - protected int decodeMiddle(BitArray row, - int[] startRange, - StringBuilder resultString) throws NotFoundException { - int[] counters = decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - int end = row.getSize(); - int rowOffset = startRange[1]; - - int lgPatternFound = 0; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS); - resultString.append((char) ('0' + bestMatch % 10)); - for (int counter : counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - - determineFirstDigit(resultString, lgPatternFound); - - int[] middleRange = findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN); - rowOffset = middleRange[1]; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS); - resultString.append((char) ('0' + bestMatch)); - for (int counter : counters) { - rowOffset += counter; - } - } - - return rowOffset; - } - - @Override - BarcodeFormat getBarcodeFormat() { - return BarcodeFormat.EAN_13; - } - - /** - * Based on pattern of odd-even ('L' and 'G') patterns used to encoded the explicitly-encoded - * digits in a barcode, determines the implicitly encoded first digit and adds it to the - * result string. - * - * @param resultString string to insert decoded first digit into - * @param lgPatternFound int whose bits indicates the pattern of odd/even L/G patterns used to - * encode digits - * @throws NotFoundException if first digit cannot be determined - */ - private static void determineFirstDigit(StringBuilder resultString, int lgPatternFound) - throws NotFoundException { - for (int d = 0; d < 10; d++) { - if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) { - resultString.insert(0, (char) ('0' + d)); - return; - } - } - throw NotFoundException.getNotFoundInstance(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/EAN13Writer.java b/zxing/src/main/java/com/google/zxing/oned/EAN13Writer.java deleted file mode 100644 index f3e947d..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/EAN13Writer.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders an EAN13 code as a {@link BitMatrix}. - * - * @author aripollak@gmail.com (Ari Pollak) - */ -public final class EAN13Writer extends UPCEANWriter { - - private static final int CODE_WIDTH = 3 + // start guard - (7 * 6) + // left bars - 5 + // middle guard - (7 * 6) + // right bars - 3; // end guard - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.EAN_13) { - throw new IllegalArgumentException("Can only encode EAN_13, but got " + format); - } - - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - if (contents.length() != 13) { - throw new IllegalArgumentException( - "Requested contents should be 13 digits long, but got " + contents.length()); - } - try { - if (!UPCEANReader.checkStandardUPCEANChecksum(contents)) { - throw new IllegalArgumentException("Contents do not pass checksum"); - } - } catch (FormatException ignored) { - throw new IllegalArgumentException("Illegal contents"); - } - - int firstDigit = Integer.parseInt(contents.substring(0, 1)); - int parities = EAN13Reader.FIRST_DIGIT_ENCODINGS[firstDigit]; - boolean[] result = new boolean[CODE_WIDTH]; - int pos = 0; - - pos += appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true); - - // See {@link #EAN13Reader} for a description of how the first digit & left bars are encoded - for (int i = 1; i <= 6; i++) { - int digit = Integer.parseInt(contents.substring(i, i + 1)); - if ((parities >> (6 - i) & 1) == 1) { - digit += 10; - } - pos += appendPattern(result, pos, UPCEANReader.L_AND_G_PATTERNS[digit], false); - } - - pos += appendPattern(result, pos, UPCEANReader.MIDDLE_PATTERN, false); - - for (int i = 7; i <= 12; i++) { - int digit = Integer.parseInt(contents.substring(i, i + 1)); - pos += appendPattern(result, pos, UPCEANReader.L_PATTERNS[digit], true); - } - appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true); - - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/EAN8Reader.java b/zxing/src/main/java/com/google/zxing/oned/EAN8Reader.java deleted file mode 100644 index 8d0b7e2..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/EAN8Reader.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - *

    Implements decoding of the EAN-8 format.

    - * - * @author Sean Owen - */ -public final class EAN8Reader extends UPCEANReader { - - private final int[] decodeMiddleCounters; - - public EAN8Reader() { - decodeMiddleCounters = new int[4]; - } - - @Override - protected int decodeMiddle(BitArray row, - int[] startRange, - StringBuilder result) throws NotFoundException { - int[] counters = decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - int end = row.getSize(); - int rowOffset = startRange[1]; - - for (int x = 0; x < 4 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS); - result.append((char) ('0' + bestMatch)); - for (int counter : counters) { - rowOffset += counter; - } - } - - int[] middleRange = findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN); - rowOffset = middleRange[1]; - - for (int x = 0; x < 4 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS); - result.append((char) ('0' + bestMatch)); - for (int counter : counters) { - rowOffset += counter; - } - } - - return rowOffset; - } - - @Override - BarcodeFormat getBarcodeFormat() { - return BarcodeFormat.EAN_8; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/EAN8Writer.java b/zxing/src/main/java/com/google/zxing/oned/EAN8Writer.java deleted file mode 100644 index efd807d..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/EAN8Writer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders an EAN8 code as a {@link BitMatrix}. - * - * @author aripollak@gmail.com (Ari Pollak) - */ -public final class EAN8Writer extends UPCEANWriter { - - private static final int CODE_WIDTH = 3 + // start guard - (7 * 4) + // left bars - 5 + // middle guard - (7 * 4) + // right bars - 3; // end guard - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.EAN_8) { - throw new IllegalArgumentException("Can only encode EAN_8, but got " - + format); - } - - return super.encode(contents, format, width, height, hints); - } - - /** - * @return a byte array of horizontal pixels (false = white, true = black) - */ - @Override - public boolean[] encode(String contents) { - if (contents.length() != 8) { - throw new IllegalArgumentException( - "Requested contents should be 8 digits long, but got " + contents.length()); - } - - boolean[] result = new boolean[CODE_WIDTH]; - int pos = 0; - - pos += appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true); - - for (int i = 0; i <= 3; i++) { - int digit = Integer.parseInt(contents.substring(i, i + 1)); - pos += appendPattern(result, pos, UPCEANReader.L_PATTERNS[digit], false); - } - - pos += appendPattern(result, pos, UPCEANReader.MIDDLE_PATTERN, false); - - for (int i = 4; i <= 7; i++) { - int digit = Integer.parseInt(contents.substring(i, i + 1)); - pos += appendPattern(result, pos, UPCEANReader.L_PATTERNS[digit], true); - } - appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true); - - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/EANManufacturerOrgSupport.java b/zxing/src/main/java/com/google/zxing/oned/EANManufacturerOrgSupport.java deleted file mode 100644 index e5b4392..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/EANManufacturerOrgSupport.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import java.util.ArrayList; -import java.util.List; - -/** - * Records EAN prefix to GS1 Member Organization, where the member organization - * correlates strongly with a country. This is an imperfect means of identifying - * a country of origin by EAN-13 barcode value. See - * - * http://en.wikipedia.org/wiki/List_of_GS1_country_codes. - * - * @author Sean Owen - */ -final class EANManufacturerOrgSupport { - - private final List ranges = new ArrayList<>(); - private final List countryIdentifiers = new ArrayList<>(); - - String lookupCountryIdentifier(String productCode) { - initIfNeeded(); - int prefix = Integer.parseInt(productCode.substring(0, 3)); - int max = ranges.size(); - for (int i = 0; i < max; i++) { - int[] range = ranges.get(i); - int start = range[0]; - if (prefix < start) { - return null; - } - int end = range.length == 1 ? start : range[1]; - if (prefix <= end) { - return countryIdentifiers.get(i); - } - } - return null; - } - - private void add(int[] range, String id) { - ranges.add(range); - countryIdentifiers.add(id); - } - - private synchronized void initIfNeeded() { - if (!ranges.isEmpty()) { - return; - } - add(new int[] {0,19}, "US/CA"); - add(new int[] {30,39}, "US"); - add(new int[] {60,139}, "US/CA"); - add(new int[] {300,379}, "FR"); - add(new int[] {380}, "BG"); - add(new int[] {383}, "SI"); - add(new int[] {385}, "HR"); - add(new int[] {387}, "BA"); - add(new int[] {400,440}, "DE"); - add(new int[] {450,459}, "JP"); - add(new int[] {460,469}, "RU"); - add(new int[] {471}, "TW"); - add(new int[] {474}, "EE"); - add(new int[] {475}, "LV"); - add(new int[] {476}, "AZ"); - add(new int[] {477}, "LT"); - add(new int[] {478}, "UZ"); - add(new int[] {479}, "LK"); - add(new int[] {480}, "PH"); - add(new int[] {481}, "BY"); - add(new int[] {482}, "UA"); - add(new int[] {484}, "MD"); - add(new int[] {485}, "AM"); - add(new int[] {486}, "GE"); - add(new int[] {487}, "KZ"); - add(new int[] {489}, "HK"); - add(new int[] {490,499}, "JP"); - add(new int[] {500,509}, "GB"); - add(new int[] {520}, "GR"); - add(new int[] {528}, "LB"); - add(new int[] {529}, "CY"); - add(new int[] {531}, "MK"); - add(new int[] {535}, "MT"); - add(new int[] {539}, "IE"); - add(new int[] {540,549}, "BE/LU"); - add(new int[] {560}, "PT"); - add(new int[] {569}, "IS"); - add(new int[] {570,579}, "DK"); - add(new int[] {590}, "PL"); - add(new int[] {594}, "RO"); - add(new int[] {599}, "HU"); - add(new int[] {600,601}, "ZA"); - add(new int[] {603}, "GH"); - add(new int[] {608}, "BH"); - add(new int[] {609}, "MU"); - add(new int[] {611}, "MA"); - add(new int[] {613}, "DZ"); - add(new int[] {616}, "KE"); - add(new int[] {618}, "CI"); - add(new int[] {619}, "TN"); - add(new int[] {621}, "SY"); - add(new int[] {622}, "EG"); - add(new int[] {624}, "LY"); - add(new int[] {625}, "JO"); - add(new int[] {626}, "IR"); - add(new int[] {627}, "KW"); - add(new int[] {628}, "SA"); - add(new int[] {629}, "AE"); - add(new int[] {640,649}, "FI"); - add(new int[] {690,695}, "CN"); - add(new int[] {700,709}, "NO"); - add(new int[] {729}, "IL"); - add(new int[] {730,739}, "SE"); - add(new int[] {740}, "GT"); - add(new int[] {741}, "SV"); - add(new int[] {742}, "HN"); - add(new int[] {743}, "NI"); - add(new int[] {744}, "CR"); - add(new int[] {745}, "PA"); - add(new int[] {746}, "DO"); - add(new int[] {750}, "MX"); - add(new int[] {754,755}, "CA"); - add(new int[] {759}, "VE"); - add(new int[] {760,769}, "CH"); - add(new int[] {770}, "CO"); - add(new int[] {773}, "UY"); - add(new int[] {775}, "PE"); - add(new int[] {777}, "BO"); - add(new int[] {779}, "AR"); - add(new int[] {780}, "CL"); - add(new int[] {784}, "PY"); - add(new int[] {785}, "PE"); - add(new int[] {786}, "EC"); - add(new int[] {789,790}, "BR"); - add(new int[] {800,839}, "IT"); - add(new int[] {840,849}, "ES"); - add(new int[] {850}, "CU"); - add(new int[] {858}, "SK"); - add(new int[] {859}, "CZ"); - add(new int[] {860}, "YU"); - add(new int[] {865}, "MN"); - add(new int[] {867}, "KP"); - add(new int[] {868,869}, "TR"); - add(new int[] {870,879}, "NL"); - add(new int[] {880}, "KR"); - add(new int[] {885}, "TH"); - add(new int[] {888}, "SG"); - add(new int[] {890}, "IN"); - add(new int[] {893}, "VN"); - add(new int[] {896}, "PK"); - add(new int[] {899}, "ID"); - add(new int[] {900,919}, "AT"); - add(new int[] {930,939}, "AU"); - add(new int[] {940,949}, "AZ"); - add(new int[] {955}, "MY"); - add(new int[] {958}, "MO"); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/ITFReader.java b/zxing/src/main/java/com/google/zxing/oned/ITFReader.java deleted file mode 100644 index 088f14e..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/ITFReader.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.Map; - -/** - *

    Implements decoding of the ITF format, or Interleaved Two of Five.

    - * - *

    This Reader will scan ITF barcodes of certain lengths only. - * At the moment it reads length 6, 8, 10, 12, 14, 16, 18, 20, 24, and 44 as these have appeared "in the wild". Not all - * lengths are scanned, especially shorter ones, to avoid false positives. This in turn is due to a lack of - * required checksum function.

    - * - *

    The checksum is optional and is not applied by this Reader. The consumer of the decoded - * value will have to apply a checksum if required.

    - * - *

    http://en.wikipedia.org/wiki/Interleaved_2_of_5 - * is a great reference for Interleaved 2 of 5 information.

    - * - * @author kevin.osullivan@sita.aero, SITA Lab. - */ -public final class ITFReader extends OneDReader { - - private static final float MAX_AVG_VARIANCE = 0.38f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.78f; - - private static final int W = 3; // Pixel width of a wide line - private static final int N = 1; // Pixed width of a narrow line - - /** Valid ITF lengths. Anything longer than the largest value is also allowed. */ - private static final int[] DEFAULT_ALLOWED_LENGTHS = { 6, 8, 10, 12, 14 }; - - // Stores the actual narrow line width of the image being decoded. - private int narrowLineWidth = -1; - - /** - * Start/end guard pattern. - * - * Note: The end pattern is reversed because the row is reversed before - * searching for the END_PATTERN - */ - private static final int[] START_PATTERN = {N, N, N, N}; - private static final int[] END_PATTERN_REVERSED = {N, N, W}; - - /** - * Patterns of Wide / Narrow lines to indicate each digit - */ - static final int[][] PATTERNS = { - {N, N, W, W, N}, // 0 - {W, N, N, N, W}, // 1 - {N, W, N, N, W}, // 2 - {W, W, N, N, N}, // 3 - {N, N, W, N, W}, // 4 - {W, N, W, N, N}, // 5 - {N, W, W, N, N}, // 6 - {N, N, N, W, W}, // 7 - {W, N, N, W, N}, // 8 - {N, W, N, W, N} // 9 - }; - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws FormatException, NotFoundException { - - // Find out where the Middle section (payload) starts & ends - int[] startRange = decodeStart(row); - int[] endRange = decodeEnd(row); - - StringBuilder result = new StringBuilder(20); - decodeMiddle(row, startRange[1], endRange[0], result); - String resultString = result.toString(); - - int[] allowedLengths = null; - if (hints != null) { - allowedLengths = (int[]) hints.get(DecodeHintType.ALLOWED_LENGTHS); - - } - if (allowedLengths == null) { - allowedLengths = DEFAULT_ALLOWED_LENGTHS; - } - - // To avoid false positives with 2D barcodes (and other patterns), make - // an assumption that the decoded string must be a 'standard' length if it's short - int length = resultString.length(); - boolean lengthOK = false; - int maxAllowedLength = 0; - for (int allowedLength : allowedLengths) { - if (length == allowedLength) { - lengthOK = true; - break; - } - if (allowedLength > maxAllowedLength) { - maxAllowedLength = allowedLength; - } - } - if (!lengthOK && length > maxAllowedLength) { - lengthOK = true; - } - if (!lengthOK) { - throw FormatException.getFormatInstance(); - } - - return new Result( - resultString, - null, // no natural byte representation for these barcodes - new ResultPoint[] { new ResultPoint(startRange[1], (float) rowNumber), - new ResultPoint(endRange[0], (float) rowNumber)}, - BarcodeFormat.ITF); - } - - /** - * @param row row of black/white values to search - * @param payloadStart offset of start pattern - * @param resultString {@link StringBuilder} to append decoded chars to - * @throws NotFoundException if decoding could not complete successfully - */ - private static void decodeMiddle(BitArray row, - int payloadStart, - int payloadEnd, - StringBuilder resultString) throws NotFoundException { - - // Digits are interleaved in pairs - 5 black lines for one digit, and the - // 5 - // interleaved white lines for the second digit. - // Therefore, need to scan 10 lines and then - // split these into two arrays - int[] counterDigitPair = new int[10]; - int[] counterBlack = new int[5]; - int[] counterWhite = new int[5]; - - while (payloadStart < payloadEnd) { - - // Get 10 runs of black/white. - recordPattern(row, payloadStart, counterDigitPair); - // Split them into each array - for (int k = 0; k < 5; k++) { - int twoK = 2 * k; - counterBlack[k] = counterDigitPair[twoK]; - counterWhite[k] = counterDigitPair[twoK + 1]; - } - - int bestMatch = decodeDigit(counterBlack); - resultString.append((char) ('0' + bestMatch)); - bestMatch = decodeDigit(counterWhite); - resultString.append((char) ('0' + bestMatch)); - - for (int counterDigit : counterDigitPair) { - payloadStart += counterDigit; - } - } - } - - /** - * Identify where the start of the middle / payload section starts. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'start block' and end of - * 'start block' - */ - int[] decodeStart(BitArray row) throws NotFoundException { - int endStart = skipWhiteSpace(row); - int[] startPattern = findGuardPattern(row, endStart, START_PATTERN); - - // Determine the width of a narrow line in pixels. We can do this by - // getting the width of the start pattern and dividing by 4 because its - // made up of 4 narrow lines. - this.narrowLineWidth = (startPattern[1] - startPattern[0]) / 4; - - validateQuietZone(row, startPattern[0]); - - return startPattern; - } - - /** - * The start & end patterns must be pre/post fixed by a quiet zone. This - * zone must be at least 10 times the width of a narrow line. Scan back until - * we either get to the start of the barcode or match the necessary number of - * quiet zone pixels. - * - * Note: Its assumed the row is reversed when using this method to find - * quiet zone after the end pattern. - * - * ref: http://www.barcode-1.net/i25code.html - * - * @param row bit array representing the scanned barcode. - * @param startPattern index into row of the start or end pattern. - * @throws NotFoundException if the quiet zone cannot be found - */ - private void validateQuietZone(BitArray row, int startPattern) throws NotFoundException { - - int quietCount = this.narrowLineWidth * 10; // expect to find this many pixels of quiet zone - - // if there are not so many pixel at all let's try as many as possible - quietCount = quietCount < startPattern ? quietCount : startPattern; - - for (int i = startPattern - 1; quietCount > 0 && i >= 0; i--) { - if (row.get(i)) { - break; - } - quietCount--; - } - if (quietCount != 0) { - // Unable to find the necessary number of quiet zone pixels. - throw NotFoundException.getNotFoundInstance(); - } - } - - /** - * Skip all whitespace until we get to the first black line. - * - * @param row row of black/white values to search - * @return index of the first black line. - * @throws NotFoundException Throws exception if no black lines are found in the row - */ - private static int skipWhiteSpace(BitArray row) throws NotFoundException { - int width = row.getSize(); - int endStart = row.getNextSet(0); - if (endStart == width) { - throw NotFoundException.getNotFoundInstance(); - } - - return endStart; - } - - /** - * Identify where the end of the middle / payload section ends. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'end block' and end of 'end - * block' - */ - int[] decodeEnd(BitArray row) throws NotFoundException { - - // For convenience, reverse the row and then - // search from 'the start' for the end block - row.reverse(); - try { - int endStart = skipWhiteSpace(row); - int[] endPattern = findGuardPattern(row, endStart, END_PATTERN_REVERSED); - - // The start & end patterns must be pre/post fixed by a quiet zone. This - // zone must be at least 10 times the width of a narrow line. - // ref: http://www.barcode-1.net/i25code.html - validateQuietZone(row, endPattern[0]); - - // Now recalculate the indices of where the 'endblock' starts & stops to - // accommodate - // the reversed nature of the search - int temp = endPattern[0]; - endPattern[0] = row.getSize() - endPattern[1]; - endPattern[1] = row.getSize() - temp; - - return endPattern; - } finally { - // Put the row back the right way. - row.reverse(); - } - } - - /** - * @param row row of black/white values to search - * @param rowOffset position to start search - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @return start/end horizontal offset of guard pattern, as an array of two - * ints - * @throws NotFoundException if pattern is not found - */ - private static int[] findGuardPattern(BitArray row, - int rowOffset, - int[] pattern) throws NotFoundException { - int patternLength = pattern.length; - int[] counters = new int[patternLength]; - int width = row.getSize(); - boolean isWhite = false; - - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - if (row.get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return new int[]{patternStart, x}; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, patternLength - 2); - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Attempts to decode a sequence of ITF black/white lines into single - * digit. - * - * @param counters the counts of runs of observed black/white/black/... values - * @return The decoded digit - * @throws NotFoundException if digit cannot be decoded - */ - private static int decodeDigit(int[] counters) throws NotFoundException { - float bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - int max = PATTERNS.length; - for (int i = 0; i < max; i++) { - int[] pattern = PATTERNS[i]; - float variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException.getNotFoundInstance(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/ITFWriter.java b/zxing/src/main/java/com/google/zxing/oned/ITFWriter.java deleted file mode 100644 index 1d49560..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/ITFWriter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders a ITF code as a {@link BitMatrix}. - * - * @author erik.barbara@gmail.com (Erik Barbara) - */ -public final class ITFWriter extends OneDimensionalCodeWriter { - - private static final int[] START_PATTERN = {1, 1, 1, 1}; - private static final int[] END_PATTERN = {3, 1, 1}; - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.ITF) { - throw new IllegalArgumentException("Can only encode ITF, but got " + format); - } - - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - int length = contents.length(); - if (length % 2 != 0) { - throw new IllegalArgumentException("The length of the input should be even"); - } - if (length > 80) { - throw new IllegalArgumentException( - "Requested contents should be less than 80 digits long, but got " + length); - } - boolean[] result = new boolean[9 + 9 * length]; - int pos = appendPattern(result, 0, START_PATTERN, true); - for (int i = 0; i < length; i += 2) { - int one = Character.digit(contents.charAt(i), 10); - int two = Character.digit(contents.charAt(i + 1), 10); - int[] encoding = new int[18]; - for (int j = 0; j < 5; j++) { - encoding[2 * j] = ITFReader.PATTERNS[one][j]; - encoding[2 * j + 1] = ITFReader.PATTERNS[two][j]; - } - pos += appendPattern(result, pos, encoding, true); - } - appendPattern(result, pos, END_PATTERN, true); - - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java b/zxing/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java deleted file mode 100644 index 5b0fbd9..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.common.BitArray; -import com.google.zxing.oned.rss.RSS14Reader; -import com.google.zxing.oned.rss.expanded.RSSExpandedReader; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - -/** - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ -public final class MultiFormatOneDReader extends OneDReader { - - private final OneDReader[] readers; - - public MultiFormatOneDReader(Map hints) { - @SuppressWarnings("unchecked") - Collection possibleFormats = hints == null ? null : - (Collection) hints.get(DecodeHintType.POSSIBLE_FORMATS); - boolean useCode39CheckDigit = hints != null && - hints.get(DecodeHintType.ASSUME_CODE_39_CHECK_DIGIT) != null; - Collection readers = new ArrayList<>(); - if (possibleFormats != null) { - if (possibleFormats.contains(BarcodeFormat.EAN_13) || - possibleFormats.contains(BarcodeFormat.UPC_A) || - possibleFormats.contains(BarcodeFormat.EAN_8) || - possibleFormats.contains(BarcodeFormat.UPC_E)) { - readers.add(new MultiFormatUPCEANReader(hints)); - } - if (possibleFormats.contains(BarcodeFormat.CODE_39)) { - readers.add(new Code39Reader(useCode39CheckDigit)); - } - if (possibleFormats.contains(BarcodeFormat.CODE_93)) { - readers.add(new Code93Reader()); - } - if (possibleFormats.contains(BarcodeFormat.CODE_128)) { - readers.add(new Code128Reader()); - } - if (possibleFormats.contains(BarcodeFormat.ITF)) { - readers.add(new ITFReader()); - } - if (possibleFormats.contains(BarcodeFormat.CODABAR)) { - readers.add(new CodaBarReader()); - } - if (possibleFormats.contains(BarcodeFormat.RSS_14)) { - readers.add(new RSS14Reader()); - } - if (possibleFormats.contains(BarcodeFormat.RSS_EXPANDED)) { - readers.add(new RSSExpandedReader()); - } - } - if (readers.isEmpty()) { - readers.add(new MultiFormatUPCEANReader(hints)); - readers.add(new Code39Reader()); - readers.add(new CodaBarReader()); - readers.add(new Code93Reader()); - readers.add(new Code128Reader()); - readers.add(new ITFReader()); - readers.add(new RSS14Reader()); - readers.add(new RSSExpandedReader()); - } - this.readers = readers.toArray(new OneDReader[readers.size()]); - } - - @Override - public Result decodeRow(int rowNumber, - BitArray row, - Map hints) throws NotFoundException { - for (OneDReader reader : readers) { - try { - return reader.decodeRow(rowNumber, row, hints); - } catch (ReaderException re) { - // continue - } - } - - throw NotFoundException.getNotFoundInstance(); - } - - @Override - public void reset() { - for (Reader reader : readers) { - reader.reset(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java b/zxing/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java deleted file mode 100644 index 9449f15..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.common.BitArray; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - -/** - *

    A reader that can read all available UPC/EAN formats. If a caller wants to try to - * read all such formats, it is most efficient to use this implementation rather than invoke - * individual readers.

    - * - * @author Sean Owen - */ -public final class MultiFormatUPCEANReader extends OneDReader { - - private final UPCEANReader[] readers; - - public MultiFormatUPCEANReader(Map hints) { - @SuppressWarnings("unchecked") - Collection possibleFormats = hints == null ? null : - (Collection) hints.get(DecodeHintType.POSSIBLE_FORMATS); - Collection readers = new ArrayList<>(); - if (possibleFormats != null) { - if (possibleFormats.contains(BarcodeFormat.EAN_13)) { - readers.add(new EAN13Reader()); - } else if (possibleFormats.contains(BarcodeFormat.UPC_A)) { - readers.add(new UPCAReader()); - } - if (possibleFormats.contains(BarcodeFormat.EAN_8)) { - readers.add(new EAN8Reader()); - } - if (possibleFormats.contains(BarcodeFormat.UPC_E)) { - readers.add(new UPCEReader()); - } - } - if (readers.isEmpty()) { - readers.add(new EAN13Reader()); - // UPC-A is covered by EAN-13 - readers.add(new EAN8Reader()); - readers.add(new UPCEReader()); - } - this.readers = readers.toArray(new UPCEANReader[readers.size()]); - } - - @Override - public Result decodeRow(int rowNumber, - BitArray row, - Map hints) throws NotFoundException { - // Compute this location once and reuse it on multiple implementations - int[] startGuardPattern = UPCEANReader.findStartGuardPattern(row); - for (UPCEANReader reader : readers) { - Result result; - try { - result = reader.decodeRow(rowNumber, row, startGuardPattern, hints); - } catch (ReaderException ignored) { - continue; - } - // Special case: a 12-digit code encoded in UPC-A is identical to a "0" - // followed by those 12 digits encoded as EAN-13. Each will recognize such a code, - // UPC-A as a 12-digit string and EAN-13 as a 13-digit string starting with "0". - // Individually these are correct and their readers will both read such a code - // and correctly call it EAN-13, or UPC-A, respectively. - // - // In this case, if we've been looking for both types, we'd like to call it - // a UPC-A code. But for efficiency we only run the EAN-13 decoder to also read - // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A - // result if appropriate. - // - // But, don't return UPC-A if UPC-A was not a requested format! - boolean ean13MayBeUPCA = - result.getBarcodeFormat() == BarcodeFormat.EAN_13 && - result.getText().charAt(0) == '0'; - @SuppressWarnings("unchecked") - Collection possibleFormats = - hints == null ? null : (Collection) hints.get(DecodeHintType.POSSIBLE_FORMATS); - boolean canReturnUPCA = possibleFormats == null || possibleFormats.contains(BarcodeFormat.UPC_A); - - if (ean13MayBeUPCA && canReturnUPCA) { - // Transfer the metdata across - Result resultUPCA = new Result(result.getText().substring(1), - result.getRawBytes(), - result.getResultPoints(), - BarcodeFormat.UPC_A); - resultUPCA.putAllMetadata(result.getResultMetadata()); - return resultUPCA; - } - return result; - } - - throw NotFoundException.getNotFoundInstance(); - } - - @Override - public void reset() { - for (Reader reader : readers) { - reader.reset(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/OneDReader.java b/zxing/src/main/java/com/google/zxing/oned/OneDReader.java deleted file mode 100644 index 1c7a95f..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/OneDReader.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.EnumMap; -import java.util.Map; - -/** - * Encapsulates functionality and implementation that is common to all families - * of one-dimensional barcodes. - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ -public abstract class OneDReader implements Reader { - - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, FormatException { - return decode(image, null); - } - - // Note that we don't try rotation without the try harder flag, even if rotation was supported. - @Override - public Result decode(BinaryBitmap image, - Map hints) throws NotFoundException, FormatException { - try { - return doDecode(image, hints); - } catch (NotFoundException nfe) { - boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - if (tryHarder && image.isRotateSupported()) { - BinaryBitmap rotatedImage = image.rotateCounterClockwise(); - Result result = doDecode(rotatedImage, hints); - // Record that we found it rotated 90 degrees CCW / 270 degrees CW - Map metadata = result.getResultMetadata(); - int orientation = 270; - if (metadata != null && metadata.containsKey(ResultMetadataType.ORIENTATION)) { - // But if we found it reversed in doDecode(), add in that result here: - orientation = (orientation + - (Integer) metadata.get(ResultMetadataType.ORIENTATION)) % 360; - } - result.putMetadata(ResultMetadataType.ORIENTATION, orientation); - // Update result points - ResultPoint[] points = result.getResultPoints(); - if (points != null) { - int height = rotatedImage.getHeight(); - for (int i = 0; i < points.length; i++) { - points[i] = new ResultPoint(height - points[i].getY() - 1, points[i].getX()); - } - } - return result; - } else { - throw nfe; - } - } - } - - @Override - public void reset() { - // do nothing - } - - /** - * We're going to examine rows from the middle outward, searching alternately above and below the - * middle, and farther out each time. rowStep is the number of rows between each successive - * attempt above and below the middle. So we'd scan row middle, then middle - rowStep, then - * middle + rowStep, then middle - (2 * rowStep), etc. - * rowStep is bigger as the image is taller, but is always at least 1. We've somewhat arbitrarily - * decided that moving up and down by about 1/16 of the image is pretty good; we try more of the - * image if "trying harder". - * - * @param image The image to decode - * @param hints Any hints that were requested - * @return The contents of the decoded barcode - * @throws NotFoundException Any spontaneous errors which occur - */ - private Result doDecode(BinaryBitmap image, - Map hints) throws NotFoundException { - int width = image.getWidth(); - int height = image.getHeight(); - BitArray row = new BitArray(width); - - int middle = height >> 1; - boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - int rowStep = Math.max(1, height >> (tryHarder ? 8 : 5)); - int maxLines; - if (tryHarder) { - maxLines = height; // Look at the whole image, not just the center - } else { - maxLines = 15; // 15 rows spaced 1/32 apart is roughly the middle half of the image - } - - for (int x = 0; x < maxLines; x++) { - - // Scanning from the middle out. Determine which row we're looking at next: - int rowStepsAboveOrBelow = (x + 1) / 2; - boolean isAbove = (x & 0x01) == 0; // i.e. is x even? - int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); - if (rowNumber < 0 || rowNumber >= height) { - // Oops, if we run off the top or bottom, stop - break; - } - - // Estimate black point for this row and load it: - try { - row = image.getBlackRow(rowNumber, row); - } catch (NotFoundException ignored) { - continue; - } - - // While we have the image data in a BitArray, it's fairly cheap to reverse it in place to - // handle decoding upside down barcodes. - for (int attempt = 0; attempt < 2; attempt++) { - if (attempt == 1) { // trying again? - row.reverse(); // reverse the row and continue - // This means we will only ever draw result points *once* in the life of this method - // since we want to avoid drawing the wrong points after flipping the row, and, - // don't want to clutter with noise from every single row scan -- just the scans - // that start on the center line. - if (hints != null && hints.containsKey(DecodeHintType.NEED_RESULT_POINT_CALLBACK)) { - Map newHints = new EnumMap<>(DecodeHintType.class); - newHints.putAll(hints); - newHints.remove(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - hints = newHints; - } - } - try { - // Look for a barcode - Result result = decodeRow(rowNumber, row, hints); - // We found our barcode - if (attempt == 1) { - // But it was upside down, so note that - result.putMetadata(ResultMetadataType.ORIENTATION, 180); - // And remember to flip the result points horizontally. - ResultPoint[] points = result.getResultPoints(); - if (points != null) { - points[0] = new ResultPoint(width - points[0].getX() - 1, points[0].getY()); - points[1] = new ResultPoint(width - points[1].getX() - 1, points[1].getY()); - } - } - return result; - } catch (ReaderException re) { - // continue -- just couldn't decode this row - } - } - } - - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Records the size of successive runs of white and black pixels in a row, starting at a given point. - * The values are recorded in the given array, and the number of runs recorded is equal to the size - * of the array. If the row starts on a white pixel at the given start point, then the first count - * recorded is the run of white pixels starting from that point; likewise it is the count of a run - * of black pixels if the row begin on a black pixels at that point. - * - * @param row row to count from - * @param start offset into row to start at - * @param counters array into which to record counts - * @throws NotFoundException if counters cannot be filled entirely from row before running out - * of pixels - */ - protected static void recordPattern(BitArray row, - int start, - int[] counters) throws NotFoundException { - int numCounters = counters.length; - Arrays.fill(counters, 0, numCounters, 0); - int end = row.getSize(); - if (start >= end) { - throw NotFoundException.getNotFoundInstance(); - } - boolean isWhite = !row.get(start); - int counterPosition = 0; - int i = start; - while (i < end) { - if (row.get(i) ^ isWhite) { // that is, exactly one is true - counters[counterPosition]++; - } else { - counterPosition++; - if (counterPosition == numCounters) { - break; - } else { - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - i++; - } - // If we read fully the last section of pixels and filled up our counters -- or filled - // the last counter but ran off the side of the image, OK. Otherwise, a problem. - if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) { - throw NotFoundException.getNotFoundInstance(); - } - } - - protected static void recordPatternInReverse(BitArray row, int start, int[] counters) - throws NotFoundException { - // This could be more efficient I guess - int numTransitionsLeft = counters.length; - boolean last = row.get(start); - while (start > 0 && numTransitionsLeft >= 0) { - if (row.get(--start) != last) { - numTransitionsLeft--; - last = !last; - } - } - if (numTransitionsLeft >= 0) { - throw NotFoundException.getNotFoundInstance(); - } - recordPattern(row, start + 1, counters); - } - - /** - * Determines how closely a set of observed counts of runs of black/white values matches a given - * target pattern. This is reported as the ratio of the total variance from the expected pattern - * proportions across all pattern elements, to the length of the pattern. - * - * @param counters observed counters - * @param pattern expected pattern - * @param maxIndividualVariance The most any counter can differ before we give up - * @return ratio of total variance between counters and pattern compared to total pattern size - */ - protected static float patternMatchVariance(int[] counters, - int[] pattern, - float maxIndividualVariance) { - int numCounters = counters.length; - int total = 0; - int patternLength = 0; - for (int i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this is too small - // to reliably match, so fail: - return Float.POSITIVE_INFINITY; - } - - float unitBarWidth = (float) total / patternLength; - maxIndividualVariance *= unitBarWidth; - - float totalVariance = 0.0f; - for (int x = 0; x < numCounters; x++) { - int counter = counters[x]; - float scaledPattern = pattern[x] * unitBarWidth; - float variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return Float.POSITIVE_INFINITY; - } - totalVariance += variance; - } - return totalVariance / total; - } - - /** - *

    Attempts to decode a one-dimensional barcode format given a single row of - * an image.

    - * - * @param rowNumber row number from top of the row - * @param row the black/white pixel data of the row - * @param hints decode hints - * @return {@link Result} containing encoded string and start/end of barcode - * @throws NotFoundException if no potential barcode is found - * @throws ChecksumException if a potential barcode is found but does not pass its checksum - * @throws FormatException if a potential barcode is found but format is invalid - */ - public abstract Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, ChecksumException, FormatException; - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/OneDimensionalCodeWriter.java b/zxing/src/main/java/com/google/zxing/oned/OneDimensionalCodeWriter.java deleted file mode 100644 index 190c654..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/OneDimensionalCodeWriter.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - *

    Encapsulates functionality and implementation that is common to one-dimensional barcodes.

    - * - * @author dsbnatut@gmail.com (Kazuki Nishiura) - */ -public abstract class OneDimensionalCodeWriter implements Writer { - - @Override - public final BitMatrix encode(String contents, BarcodeFormat format, int width, int height) - throws WriterException { - return encode(contents, format, width, height, null); - } - - /** - * Encode the contents following specified format. - * {@code width} and {@code height} are required size. This method may return bigger size - * {@code BitMatrix} when specified size is too small. The user can set both {@code width} and - * {@code height} to zero to get minimum size barcode. If negative value is set to {@code width} - * or {@code height}, {@code IllegalArgumentException} is thrown. - */ - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (contents.isEmpty()) { - throw new IllegalArgumentException("Found empty contents"); - } - - if (width < 0 || height < 0) { - throw new IllegalArgumentException("Negative size is not allowed. Input: " - + width + 'x' + height); - } - - int sidesMargin = getDefaultMargin(); - if (hints != null && hints.containsKey(EncodeHintType.MARGIN)) { - sidesMargin = Integer.parseInt(hints.get(EncodeHintType.MARGIN).toString()); - } - - boolean[] code = encode(contents); - return renderResult(code, width, height, sidesMargin); - } - - /** - * @return a byte array of horizontal pixels (0 = white, 1 = black) - */ - private static BitMatrix renderResult(boolean[] code, int width, int height, int sidesMargin) { - int inputWidth = code.length; - // Add quiet zone on both sides. - int fullWidth = inputWidth + sidesMargin; - int outputWidth = Math.max(width, fullWidth); - int outputHeight = Math.max(1, height); - - int multiple = outputWidth / fullWidth; - int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; - - BitMatrix output = new BitMatrix(outputWidth, outputHeight); - for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (code[inputX]) { - output.setRegion(outputX, 0, multiple, outputHeight); - } - } - return output; - } - - - /** - * @param target encode black/white pattern into this array - * @param pos position to start encoding at in {@code target} - * @param pattern lengths of black/white runs to encode - * @param startColor starting color - false for white, true for black - * @return the number of elements added to target. - */ - protected static int appendPattern(boolean[] target, int pos, int[] pattern, boolean startColor) { - boolean color = startColor; - int numAdded = 0; - for (int len : pattern) { - for (int j = 0; j < len; j++) { - target[pos++] = color; - } - numAdded += len; - color = !color; // flip color after each segment - } - return numAdded; - } - - public int getDefaultMargin() { - // CodaBar spec requires a side margin to be more than ten times wider than narrow space. - // This seems like a decent idea for a default for all formats. - return 10; - } - - /** - * Encode the contents to boolean array expression of one-dimensional barcode. - * Start code and end code should be included in result, and side margins should not be included. - * - * @param contents barcode contents to encode - * @return a {@code boolean[]} of horizontal pixels (false = white, true = black) - */ - public abstract boolean[] encode(String contents); -} - diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCAReader.java b/zxing/src/main/java/com/google/zxing/oned/UPCAReader.java deleted file mode 100644 index 62f69cc..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCAReader.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.common.BitArray; - -import java.util.Map; - -/** - *

    Implements decoding of the UPC-A format.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - */ -public final class UPCAReader extends UPCEANReader { - - private final UPCEANReader ean13Reader = new EAN13Reader(); - - @Override - public Result decodeRow(int rowNumber, - BitArray row, - int[] startGuardRange, - Map hints) - throws NotFoundException, FormatException, ChecksumException { - return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange, hints)); - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, FormatException, ChecksumException { - return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, hints)); - } - - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, FormatException { - return maybeReturnResult(ean13Reader.decode(image)); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, FormatException { - return maybeReturnResult(ean13Reader.decode(image, hints)); - } - - @Override - BarcodeFormat getBarcodeFormat() { - return BarcodeFormat.UPC_A; - } - - @Override - protected int decodeMiddle(BitArray row, int[] startRange, StringBuilder resultString) - throws NotFoundException { - return ean13Reader.decodeMiddle(row, startRange, resultString); - } - - private static Result maybeReturnResult(Result result) throws FormatException { - String text = result.getText(); - if (text.charAt(0) == '0') { - return new Result(text.substring(1), null, result.getResultPoints(), BarcodeFormat.UPC_A); - } else { - throw FormatException.getFormatInstance(); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCAWriter.java b/zxing/src/main/java/com/google/zxing/oned/UPCAWriter.java deleted file mode 100644 index 64f777d..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCAWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -import java.util.Map; - -/** - * This object renders a UPC-A code as a {@link BitMatrix}. - * - * @author qwandor@google.com (Andrew Walbran) - */ -public final class UPCAWriter implements Writer { - - private final EAN13Writer subWriter = new EAN13Writer(); - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) - throws WriterException { - return encode(contents, format, width, height, null); - } - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.UPC_A) { - throw new IllegalArgumentException("Can only encode UPC-A, but got " + format); - } - return subWriter.encode(preencode(contents), BarcodeFormat.EAN_13, width, height, hints); - } - - /** - * Transform a UPC-A code into the equivalent EAN-13 code, and add a check digit if it is not - * already present. - */ - private static String preencode(String contents) { - int length = contents.length(); - if (length == 11) { - // No check digit present, calculate it and add it - int sum = 0; - for (int i = 0; i < 11; ++i) { - sum += (contents.charAt(i) - '0') * (i % 2 == 0 ? 3 : 1); - } - contents += (1000 - sum) % 10; - } else if (length != 12) { - throw new IllegalArgumentException( - "Requested contents should be 11 or 12 digits long, but got " + contents.length()); - } - return '0' + contents; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension2Support.java b/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension2Support.java deleted file mode 100644 index 03cd35d..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension2Support.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.EnumMap; -import java.util.Map; - -/** - * @see UPCEANExtension5Support - */ -final class UPCEANExtension2Support { - - private final int[] decodeMiddleCounters = new int[4]; - private final StringBuilder decodeRowStringBuffer = new StringBuilder(); - - Result decodeRow(int rowNumber, BitArray row, int[] extensionStartRange) throws NotFoundException { - - StringBuilder result = decodeRowStringBuffer; - result.setLength(0); - int end = decodeMiddle(row, extensionStartRange, result); - - String resultString = result.toString(); - Map extensionData = parseExtensionString(resultString); - - Result extensionResult = - new Result(resultString, - null, - new ResultPoint[] { - new ResultPoint((extensionStartRange[0] + extensionStartRange[1]) / 2.0f, (float) rowNumber), - new ResultPoint((float) end, (float) rowNumber), - }, - BarcodeFormat.UPC_EAN_EXTENSION); - if (extensionData != null) { - extensionResult.putAllMetadata(extensionData); - } - return extensionResult; - } - - int decodeMiddle(BitArray row, int[] startRange, StringBuilder resultString) throws NotFoundException { - int[] counters = decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - int end = row.getSize(); - int rowOffset = startRange[1]; - - int checkParity = 0; - - for (int x = 0; x < 2 && rowOffset < end; x++) { - int bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_AND_G_PATTERNS); - resultString.append((char) ('0' + bestMatch % 10)); - for (int counter : counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - checkParity |= 1 << (1 - x); - } - if (x != 1) { - // Read off separator if not last - rowOffset = row.getNextSet(rowOffset); - rowOffset = row.getNextUnset(rowOffset); - } - } - - if (resultString.length() != 2) { - throw NotFoundException.getNotFoundInstance(); - } - - if (Integer.parseInt(resultString.toString()) % 4 != checkParity) { - throw NotFoundException.getNotFoundInstance(); - } - - return rowOffset; - } - - /** - * @param raw raw content of extension - * @return formatted interpretation of raw content as a {@link Map} mapping - * one {@link ResultMetadataType} to appropriate value, or {@code null} if not known - */ - private static Map parseExtensionString(String raw) { - if (raw.length() != 2) { - return null; - } - Map result = new EnumMap<>(ResultMetadataType.class); - result.put(ResultMetadataType.ISSUE_NUMBER, Integer.valueOf(raw)); - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java b/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java deleted file mode 100644 index ecd421e..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtension5Support.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; - -import java.util.EnumMap; -import java.util.Map; - -/** - * @see UPCEANExtension2Support - */ -final class UPCEANExtension5Support { - - private static final int[] CHECK_DIGIT_ENCODINGS = { - 0x18, 0x14, 0x12, 0x11, 0x0C, 0x06, 0x03, 0x0A, 0x09, 0x05 - }; - - private final int[] decodeMiddleCounters = new int[4]; - private final StringBuilder decodeRowStringBuffer = new StringBuilder(); - - Result decodeRow(int rowNumber, BitArray row, int[] extensionStartRange) throws NotFoundException { - - StringBuilder result = decodeRowStringBuffer; - result.setLength(0); - int end = decodeMiddle(row, extensionStartRange, result); - - String resultString = result.toString(); - Map extensionData = parseExtensionString(resultString); - - Result extensionResult = - new Result(resultString, - null, - new ResultPoint[] { - new ResultPoint((extensionStartRange[0] + extensionStartRange[1]) / 2.0f, (float) rowNumber), - new ResultPoint((float) end, (float) rowNumber), - }, - BarcodeFormat.UPC_EAN_EXTENSION); - if (extensionData != null) { - extensionResult.putAllMetadata(extensionData); - } - return extensionResult; - } - - int decodeMiddle(BitArray row, int[] startRange, StringBuilder resultString) throws NotFoundException { - int[] counters = decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - int end = row.getSize(); - int rowOffset = startRange[1]; - - int lgPatternFound = 0; - - for (int x = 0; x < 5 && rowOffset < end; x++) { - int bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_AND_G_PATTERNS); - resultString.append((char) ('0' + bestMatch % 10)); - for (int counter : counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (4 - x); - } - if (x != 4) { - // Read off separator if not last - rowOffset = row.getNextSet(rowOffset); - rowOffset = row.getNextUnset(rowOffset); - } - } - - if (resultString.length() != 5) { - throw NotFoundException.getNotFoundInstance(); - } - - int checkDigit = determineCheckDigit(lgPatternFound); - if (extensionChecksum(resultString.toString()) != checkDigit) { - throw NotFoundException.getNotFoundInstance(); - } - - return rowOffset; - } - - private static int extensionChecksum(CharSequence s) { - int length = s.length(); - int sum = 0; - for (int i = length - 2; i >= 0; i -= 2) { - sum += (int) s.charAt(i) - (int) '0'; - } - sum *= 3; - for (int i = length - 1; i >= 0; i -= 2) { - sum += (int) s.charAt(i) - (int) '0'; - } - sum *= 3; - return sum % 10; - } - - private static int determineCheckDigit(int lgPatternFound) - throws NotFoundException { - for (int d = 0; d < 10; d++) { - if (lgPatternFound == CHECK_DIGIT_ENCODINGS[d]) { - return d; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * @param raw raw content of extension - * @return formatted interpretation of raw content as a {@link Map} mapping - * one {@link ResultMetadataType} to appropriate value, or {@code null} if not known - */ - private static Map parseExtensionString(String raw) { - if (raw.length() != 5) { - return null; - } - Object value = parseExtension5String(raw); - if (value == null) { - return null; - } - Map result = new EnumMap<>(ResultMetadataType.class); - result.put(ResultMetadataType.SUGGESTED_PRICE, value); - return result; - } - - private static String parseExtension5String(String raw) { - String currency; - switch (raw.charAt(0)) { - case '0': - currency = "£"; - break; - case '5': - currency = "$"; - break; - case '9': - // Reference: http://www.jollytech.com - if ("90000".equals(raw)) { - // No suggested retail price - return null; - } - if ("99991".equals(raw)) { - // Complementary - return "0.00"; - } - if ("99990".equals(raw)) { - return "Used"; - } - // Otherwise... unknown currency? - currency = ""; - break; - default: - currency = ""; - break; - } - int rawAmount = Integer.parseInt(raw.substring(1)); - String unitsString = String.valueOf(rawAmount / 100); - int hundredths = rawAmount % 100; - String hundredthsString = hundredths < 10 ? "0" + hundredths : String.valueOf(hundredths); - return currency + unitsString + '.' + hundredthsString; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtensionSupport.java b/zxing/src/main/java/com/google/zxing/oned/UPCEANExtensionSupport.java deleted file mode 100644 index b36a581..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEANExtensionSupport.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.common.BitArray; - -final class UPCEANExtensionSupport { - - private static final int[] EXTENSION_START_PATTERN = {1,1,2}; - - private final UPCEANExtension2Support twoSupport = new UPCEANExtension2Support(); - private final UPCEANExtension5Support fiveSupport = new UPCEANExtension5Support(); - - Result decodeRow(int rowNumber, BitArray row, int rowOffset) throws NotFoundException { - int[] extensionStartRange = UPCEANReader.findGuardPattern(row, rowOffset, false, EXTENSION_START_PATTERN); - try { - return fiveSupport.decodeRow(rowNumber, row, extensionStartRange); - } catch (ReaderException ignored) { - return twoSupport.decodeRow(rowNumber, row, extensionStartRange); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEANReader.java b/zxing/src/main/java/com/google/zxing/oned/UPCEANReader.java deleted file mode 100644 index 83dfe34..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEANReader.java +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.ReaderException; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitArray; - -import java.util.Arrays; -import java.util.Map; - -/** - *

    Encapsulates functionality and implementation that is common to UPC and EAN families - * of one-dimensional barcodes.

    - * - * @author dswitkin@google.com (Daniel Switkin) - * @author Sean Owen - * @author alasdair@google.com (Alasdair Mackintosh) - */ -public abstract class UPCEANReader extends OneDReader { - - // These two values are critical for determining how permissive the decoding will be. - // We've arrived at these values through a lot of trial and error. Setting them any higher - // lets false positives creep in quickly. - private static final float MAX_AVG_VARIANCE = 0.48f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.7f; - - /** - * Start/end guard pattern. - */ - static final int[] START_END_PATTERN = {1, 1, 1,}; - - /** - * Pattern marking the middle of a UPC/EAN pattern, separating the two halves. - */ - static final int[] MIDDLE_PATTERN = {1, 1, 1, 1, 1}; - /** - * end guard pattern. - */ - static final int[] END_PATTERN = {1, 1, 1, 1, 1, 1}; - /** - * "Odd", or "L" patterns used to encode UPC/EAN digits. - */ - static final int[][] L_PATTERNS = { - {3, 2, 1, 1}, // 0 - {2, 2, 2, 1}, // 1 - {2, 1, 2, 2}, // 2 - {1, 4, 1, 1}, // 3 - {1, 1, 3, 2}, // 4 - {1, 2, 3, 1}, // 5 - {1, 1, 1, 4}, // 6 - {1, 3, 1, 2}, // 7 - {1, 2, 1, 3}, // 8 - {3, 1, 1, 2} // 9 - }; - - /** - * As above but also including the "even", or "G" patterns used to encode UPC/EAN digits. - */ - static final int[][] L_AND_G_PATTERNS; - - static { - L_AND_G_PATTERNS = new int[20][]; - System.arraycopy(L_PATTERNS, 0, L_AND_G_PATTERNS, 0, 10); - for (int i = 10; i < 20; i++) { - int[] widths = L_PATTERNS[i - 10]; - int[] reversedWidths = new int[widths.length]; - for (int j = 0; j < widths.length; j++) { - reversedWidths[j] = widths[widths.length - j - 1]; - } - L_AND_G_PATTERNS[i] = reversedWidths; - } - } - - private final StringBuilder decodeRowStringBuffer; - private final UPCEANExtensionSupport extensionReader; - private final EANManufacturerOrgSupport eanManSupport; - - protected UPCEANReader() { - decodeRowStringBuffer = new StringBuilder(20); - extensionReader = new UPCEANExtensionSupport(); - eanManSupport = new EANManufacturerOrgSupport(); - } - - static int[] findStartGuardPattern(BitArray row) throws NotFoundException { - boolean foundStart = false; - int[] startRange = null; - int nextStart = 0; - int[] counters = new int[START_END_PATTERN.length]; - while (!foundStart) { - Arrays.fill(counters, 0, START_END_PATTERN.length, 0); - startRange = findGuardPattern(row, nextStart, false, START_END_PATTERN, counters); - int start = startRange[0]; - nextStart = startRange[1]; - // Make sure there is a quiet zone at least as big as the start pattern before the barcode. - // If this check would run off the left edge of the image, do not accept this barcode, - // as it is very likely to be a false positive. - int quietStart = start - (nextStart - start); - if (quietStart >= 0) { - foundStart = row.isRange(quietStart, start, false); - } - } - return startRange; - } - - @Override - public Result decodeRow(int rowNumber, BitArray row, Map hints) - throws NotFoundException, ChecksumException, FormatException { - return decodeRow(rowNumber, row, findStartGuardPattern(row), hints); - } - - /** - *

    Like {@link #decodeRow(int, BitArray, java.util.Map)}, but - * allows caller to inform method about where the UPC/EAN start pattern is - * found. This allows this to be computed once and reused across many implementations.

    - * - * @param rowNumber row index into the image - * @param row encoding of the row of the barcode image - * @param startGuardRange start/end column where the opening start pattern was found - * @param hints optional hints that influence decoding - * @return {@link Result} encapsulating the result of decoding a barcode in the row - * @throws NotFoundException if no potential barcode is found - * @throws ChecksumException if a potential barcode is found but does not pass its checksum - * @throws FormatException if a potential barcode is found but format is invalid - */ - public Result decodeRow(int rowNumber, - BitArray row, - int[] startGuardRange, - Map hints) - throws NotFoundException, ChecksumException, FormatException { - - ResultPointCallback resultPointCallback = hints == null ? null : - (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - - if (resultPointCallback != null) { - resultPointCallback.foundPossibleResultPoint(new ResultPoint( - (startGuardRange[0] + startGuardRange[1]) / 2.0f, rowNumber - )); - } - - StringBuilder result = decodeRowStringBuffer; - result.setLength(0); - int endStart = decodeMiddle(row, startGuardRange, result); - - if (resultPointCallback != null) { - resultPointCallback.foundPossibleResultPoint(new ResultPoint( - endStart, rowNumber - )); - } - - int[] endRange = decodeEnd(row, endStart); - - if (resultPointCallback != null) { - resultPointCallback.foundPossibleResultPoint(new ResultPoint( - (endRange[0] + endRange[1]) / 2.0f, rowNumber - )); - } - - - // Make sure there is a quiet zone at least as big as the end pattern after the barcode. The - // spec might want more whitespace, but in practice this is the maximum we can count on. - int end = endRange[1]; - int quietEnd = end + (end - endRange[0]); - if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) { - throw NotFoundException.getNotFoundInstance(); - } - - String resultString = result.toString(); - // UPC/EAN should never be less than 8 chars anyway - if (resultString.length() < 8) { - throw FormatException.getFormatInstance(); - } - if (!checkChecksum(resultString)) { - throw ChecksumException.getChecksumInstance(); - } - - float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; - float right = (float) (endRange[1] + endRange[0]) / 2.0f; - BarcodeFormat format = getBarcodeFormat(); - Result decodeResult = new Result(resultString, - null, // no natural byte representation for these barcodes - new ResultPoint[]{ - new ResultPoint(left, (float) rowNumber), - new ResultPoint(right, (float) rowNumber)}, - format); - - int extensionLength = 0; - - try { - Result extensionResult = extensionReader.decodeRow(rowNumber, row, endRange[1]); - decodeResult.putMetadata(ResultMetadataType.UPC_EAN_EXTENSION, extensionResult.getText()); - decodeResult.putAllMetadata(extensionResult.getResultMetadata()); - decodeResult.addResultPoints(extensionResult.getResultPoints()); - extensionLength = extensionResult.getText().length(); - } catch (ReaderException re) { - // continue - } - - int[] allowedExtensions = - hints == null ? null : (int[]) hints.get(DecodeHintType.ALLOWED_EAN_EXTENSIONS); - if (allowedExtensions != null) { - boolean valid = false; - for (int length : allowedExtensions) { - if (extensionLength == length) { - valid = true; - break; - } - } - if (!valid) { - throw NotFoundException.getNotFoundInstance(); - } - } - - if (format == BarcodeFormat.EAN_13 || format == BarcodeFormat.UPC_A) { - String countryID = eanManSupport.lookupCountryIdentifier(resultString); - if (countryID != null) { - decodeResult.putMetadata(ResultMetadataType.POSSIBLE_COUNTRY, countryID); - } - } - - return decodeResult; - } - - /** - * @param s string of digits to check - * @return {@link #checkStandardUPCEANChecksum(CharSequence)} - * @throws FormatException if the string does not contain only digits - */ - boolean checkChecksum(String s) throws FormatException { - return checkStandardUPCEANChecksum(s); - } - - /** - * Computes the UPC/EAN checksum on a string of digits, and reports - * whether the checksum is correct or not. - * - * @param s string of digits to check - * @return true iff string of digits passes the UPC/EAN checksum algorithm - * @throws FormatException if the string does not contain only digits - */ - static boolean checkStandardUPCEANChecksum(CharSequence s) throws FormatException { - int length = s.length(); - if (length == 0) { - return false; - } - - int sum = 0; - for (int i = length - 2; i >= 0; i -= 2) { - int digit = (int) s.charAt(i) - (int) '0'; - if (digit < 0 || digit > 9) { - throw FormatException.getFormatInstance(); - } - sum += digit; - } - sum *= 3; - for (int i = length - 1; i >= 0; i -= 2) { - int digit = (int) s.charAt(i) - (int) '0'; - if (digit < 0 || digit > 9) { - throw FormatException.getFormatInstance(); - } - sum += digit; - } - return sum % 10 == 0; - } - - int[] decodeEnd(BitArray row, int endStart) throws NotFoundException { - return findGuardPattern(row, endStart, false, START_END_PATTERN); - } - - static int[] findGuardPattern(BitArray row, - int rowOffset, - boolean whiteFirst, - int[] pattern) throws NotFoundException { - return findGuardPattern(row, rowOffset, whiteFirst, pattern, new int[pattern.length]); - } - - /** - * @param row row of black/white values to search - * @param rowOffset position to start search - * @param whiteFirst if true, indicates that the pattern specifies white/black/white/... - * pixel counts, otherwise, it is interpreted as black/white/black/... - * @param pattern pattern of counts of number of black and white pixels that are being - * searched for as a pattern - * @param counters array of counters, as long as pattern, to re-use - * @return start/end horizontal offset of guard pattern, as an array of two ints - * @throws NotFoundException if pattern is not found - */ - private static int[] findGuardPattern(BitArray row, - int rowOffset, - boolean whiteFirst, - int[] pattern, - int[] counters) throws NotFoundException { - int patternLength = pattern.length; - int width = row.getSize(); - boolean isWhite = whiteFirst; - rowOffset = whiteFirst ? row.getNextUnset(rowOffset) : row.getNextSet(rowOffset); - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - if (row.get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return new int[]{patternStart, x}; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, patternLength - 2); - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Attempts to decode a single UPC/EAN-encoded digit. - * - * @param row row of black/white values to decode - * @param counters the counts of runs of observed black/white/black/... values - * @param rowOffset horizontal offset to start decoding from - * @param patterns the set of patterns to use to decode -- sometimes different encodings - * for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should - * be used - * @return horizontal offset of first pixel beyond the decoded digit - * @throws NotFoundException if digit cannot be decoded - */ - static int decodeDigit(BitArray row, int[] counters, int rowOffset, int[][] patterns) - throws NotFoundException { - recordPattern(row, rowOffset, counters); - float bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - int max = patterns.length; - for (int i = 0; i < max; i++) { - int[] pattern = patterns[i]; - float variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException.getNotFoundInstance(); - } - } - - /** - * Get the format of this decoder. - * - * @return The 1D format. - */ - abstract BarcodeFormat getBarcodeFormat(); - - /** - * Subclasses override this to decode the portion of a barcode between the start - * and end guard patterns. - * - * @param row row of black/white values to search - * @param startRange start/end offset of start guard pattern - * @param resultString {@link StringBuilder} to append decoded chars to - * @return horizontal offset of first pixel after the "middle" that was decoded - * @throws NotFoundException if decoding could not complete successfully - */ - protected abstract int decodeMiddle(BitArray row, - int[] startRange, - StringBuilder resultString) throws NotFoundException; - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEANWriter.java b/zxing/src/main/java/com/google/zxing/oned/UPCEANWriter.java deleted file mode 100644 index a39937d..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEANWriter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -/** - *

    Encapsulates functionality and implementation that is common to UPC and EAN families - * of one-dimensional barcodes.

    - * - * @author aripollak@gmail.com (Ari Pollak) - * @author dsbnatut@gmail.com (Kazuki Nishiura) - */ -public abstract class UPCEANWriter extends OneDimensionalCodeWriter { - - @Override - public int getDefaultMargin() { - // Use a different default more appropriate for UPC/EAN - return UPCEANReader.START_END_PATTERN.length; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEReader.java b/zxing/src/main/java/com/google/zxing/oned/UPCEReader.java deleted file mode 100644 index bc04d3a..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEReader.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - *

    Implements decoding of the UPC-E format.

    - *

    This is a great reference for - * UPC-E information.

    - * - * @author Sean Owen - */ -public final class UPCEReader extends UPCEANReader { - // For an UPC-E barcode, the final digit is represented by the parities used - // to encode the middle six digits, according to the table below. - // - // Parity of next 6 digits - // Digit 0 1 2 3 4 5 - // 0 Even Even Even Odd Odd Odd - // 1 Even Even Odd Even Odd Odd - // 2 Even Even Odd Odd Even Odd - // 3 Even Even Odd Odd Odd Even - // 4 Even Odd Even Even Odd Odd - // 5 Even Odd Odd Even Even Odd - // 6 Even Odd Odd Odd Even Even - // 7 Even Odd Even Odd Even Odd - // 8 Even Odd Even Odd Odd Even - // 9 Even Odd Odd Even Odd Even - // - // The encoding is represented by the following array, which is a bit pattern - // using Odd = 0 and Even = 1. For example, 5 is represented by: - // - // Odd Even Even Odd Odd Even - // in binary: - // 0 1 1 0 0 1 == 0x19 - // - static final int[] CHECK_DIGIT_ENCODINGS = { - 0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25 - }; - /** - * The pattern that marks the middle, and end, of a UPC-E pattern. - * There is no "second half" to a UPC-E barcode. - */ - private static final int[] MIDDLE_END_PATTERN = {1, 1, 1, 1, 1, 1}; - - /** - * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of - * even-odd parity encodings of digits that imply both the number system (0 or 1) - * used, and the check digit. - */ - private static final int[][] NUMSYS_AND_CHECK_DIGIT_PATTERNS = { - {0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25}, - {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} - }; - - private final int[] decodeMiddleCounters; - - public UPCEReader() { - decodeMiddleCounters = new int[4]; - } - - @Override - protected int decodeMiddle(BitArray row, int[] startRange, StringBuilder result) - throws NotFoundException { - int[] counters = decodeMiddleCounters; - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - int end = row.getSize(); - int rowOffset = startRange[1]; - - int lgPatternFound = 0; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS); - result.append((char) ('0' + bestMatch % 10)); - for (int counter : counters) { - rowOffset += counter; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - - determineNumSysAndCheckDigit(result, lgPatternFound); - - return rowOffset; - } - - @Override - protected int[] decodeEnd(BitArray row, int endStart) throws NotFoundException { - return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN); - } - - @Override - protected boolean checkChecksum(String s) throws FormatException { - return super.checkChecksum(convertUPCEtoUPCA(s)); - } - - private static void determineNumSysAndCheckDigit(StringBuilder resultString, int lgPatternFound) - throws NotFoundException { - - for (int numSys = 0; numSys <= 1; numSys++) { - for (int d = 0; d < 10; d++) { - if (lgPatternFound == NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { - resultString.insert(0, (char) ('0' + numSys)); - resultString.append((char) ('0' + d)); - return; - } - } - } - throw NotFoundException.getNotFoundInstance(); - } - - @Override - BarcodeFormat getBarcodeFormat() { - return BarcodeFormat.UPC_E; - } - - /** - * Expands a UPC-E value back into its full, equivalent UPC-A code value. - * - * @param upce UPC-E code as string of digits - * @return equivalent UPC-A code as string of digits - */ - public static String convertUPCEtoUPCA(String upce) { - char[] upceChars = new char[6]; - upce.getChars(1, 7, upceChars, 0); - StringBuilder result = new StringBuilder(12); - result.append(upce.charAt(0)); - char lastChar = upceChars[5]; - switch (lastChar) { - case '0': - case '1': - case '2': - result.append(upceChars, 0, 2); - result.append(lastChar); - result.append("0000"); - result.append(upceChars, 2, 3); - break; - case '3': - result.append(upceChars, 0, 3); - result.append("00000"); - result.append(upceChars, 3, 2); - break; - case '4': - result.append(upceChars, 0, 4); - result.append("00000"); - result.append(upceChars[4]); - break; - default: - result.append(upceChars, 0, 5); - result.append("0000"); - result.append(lastChar); - break; - } - result.append(upce.charAt(7)); - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/UPCEWriter.java b/zxing/src/main/java/com/google/zxing/oned/UPCEWriter.java deleted file mode 100644 index 85872d4..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/UPCEWriter.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned; - -import java.util.Map; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; - -/** - * This object renders an UPC-E code as a {@link BitMatrix}. - * - * @author 0979097955s@gmail.com (RX) - */ -public final class UPCEWriter extends UPCEANWriter { - - private static final int CODE_WIDTH = 3 + // start guard - (7 * 6) + // bars - 6; // end guard - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.UPC_E) { - throw new IllegalArgumentException("Can only encode UPC_E, but got " + format); - } - - return super.encode(contents, format, width, height, hints); - } - - @Override - public boolean[] encode(String contents) { - if (contents.length() != 8) { - throw new IllegalArgumentException( - "Requested contents should be 8 digits long, but got " + contents.length()); - } - - int checkDigit = Integer.parseInt(contents.substring(7, 8)); - int parities = UPCEReader.CHECK_DIGIT_ENCODINGS[checkDigit]; - boolean[] result = new boolean[CODE_WIDTH]; - int pos = 0; - - pos += appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true); - - for (int i = 1; i <= 6; i++) { - int digit = Integer.parseInt(contents.substring(i, i + 1)); - if ((parities >> (6 - i) & 1) == 1) { - digit += 10; - } - pos += appendPattern(result, pos, UPCEANReader.L_AND_G_PATTERNS[digit], false); - } - - appendPattern(result, pos, UPCEANReader.END_PATTERN, false); - - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/AbstractRSSReader.java b/zxing/src/main/java/com/google/zxing/oned/rss/AbstractRSSReader.java deleted file mode 100644 index 583817b..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/AbstractRSSReader.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -import com.google.zxing.NotFoundException; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.oned.OneDReader; - -/** - * Superclass of {@link OneDReader} implementations that read barcodes in the RSS family - * of formats. - */ -public abstract class AbstractRSSReader extends OneDReader { - - private static final float MAX_AVG_VARIANCE = 0.2f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.45f; - - private static final float MIN_FINDER_PATTERN_RATIO = 9.5f / 12.0f; - private static final float MAX_FINDER_PATTERN_RATIO = 12.5f / 14.0f; - - private final int[] decodeFinderCounters; - private final int[] dataCharacterCounters; - private final float[] oddRoundingErrors; - private final float[] evenRoundingErrors; - private final int[] oddCounts; - private final int[] evenCounts; - - protected AbstractRSSReader() { - decodeFinderCounters = new int[4]; - dataCharacterCounters = new int[8]; - oddRoundingErrors = new float[4]; - evenRoundingErrors = new float[4]; - oddCounts = new int[dataCharacterCounters.length / 2]; - evenCounts = new int[dataCharacterCounters.length / 2]; - } - - protected final int[] getDecodeFinderCounters() { - return decodeFinderCounters; - } - - protected final int[] getDataCharacterCounters() { - return dataCharacterCounters; - } - - protected final float[] getOddRoundingErrors() { - return oddRoundingErrors; - } - - protected final float[] getEvenRoundingErrors() { - return evenRoundingErrors; - } - - protected final int[] getOddCounts() { - return oddCounts; - } - - protected final int[] getEvenCounts() { - return evenCounts; - } - - protected static int parseFinderValue(int[] counters, - int[][] finderPatterns) throws NotFoundException { - for (int value = 0; value < finderPatterns.length; value++) { - if (patternMatchVariance(counters, finderPatterns[value], MAX_INDIVIDUAL_VARIANCE) < - MAX_AVG_VARIANCE) { - return value; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - /** - * @param array values to sum - * @return sum of values - * @deprecated call {@link MathUtils#sum(int[])} - */ - @Deprecated - protected static int count(int[] array) { - return MathUtils.sum(array); - } - - protected static void increment(int[] array, float[] errors) { - int index = 0; - float biggestError = errors[0]; - for (int i = 1; i < array.length; i++) { - if (errors[i] > biggestError) { - biggestError = errors[i]; - index = i; - } - } - array[index]++; - } - - protected static void decrement(int[] array, float[] errors) { - int index = 0; - float biggestError = errors[0]; - for (int i = 1; i < array.length; i++) { - if (errors[i] < biggestError) { - biggestError = errors[i]; - index = i; - } - } - array[index]--; - } - - protected static boolean isFinderPattern(int[] counters) { - int firstTwoSum = counters[0] + counters[1]; - int sum = firstTwoSum + counters[2] + counters[3]; - float ratio = (float) firstTwoSum / (float) sum; - if (ratio >= MIN_FINDER_PATTERN_RATIO && ratio <= MAX_FINDER_PATTERN_RATIO) { - // passes ratio test in spec, but see if the counts are unreasonable - int minCounter = Integer.MAX_VALUE; - int maxCounter = Integer.MIN_VALUE; - for (int counter : counters) { - if (counter > maxCounter) { - maxCounter = counter; - } - if (counter < minCounter) { - minCounter = counter; - } - } - return maxCounter < 10 * minCounter; - } - return false; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/DataCharacter.java b/zxing/src/main/java/com/google/zxing/oned/rss/DataCharacter.java deleted file mode 100644 index 0356078..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/DataCharacter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -/** - * Encapsulates a since character value in an RSS barcode, including its checksum information. - */ -public class DataCharacter { - - private final int value; - private final int checksumPortion; - - public DataCharacter(int value, int checksumPortion) { - this.value = value; - this.checksumPortion = checksumPortion; - } - - public final int getValue() { - return value; - } - - public final int getChecksumPortion() { - return checksumPortion; - } - - @Override - public final String toString() { - return value + "(" + checksumPortion + ')'; - } - - @Override - public final boolean equals(Object o) { - if (!(o instanceof DataCharacter)) { - return false; - } - DataCharacter that = (DataCharacter) o; - return value == that.value && checksumPortion == that.checksumPortion; - } - - @Override - public final int hashCode() { - return value ^ checksumPortion; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/FinderPattern.java b/zxing/src/main/java/com/google/zxing/oned/rss/FinderPattern.java deleted file mode 100644 index e9a8bf5..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/FinderPattern.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -import com.google.zxing.ResultPoint; - -/** - * Encapsulates an RSS barcode finder pattern, including its start/end position and row. - */ -public final class FinderPattern { - - private final int value; - private final int[] startEnd; - private final ResultPoint[] resultPoints; - - public FinderPattern(int value, int[] startEnd, int start, int end, int rowNumber) { - this.value = value; - this.startEnd = startEnd; - this.resultPoints = new ResultPoint[] { - new ResultPoint((float) start, (float) rowNumber), - new ResultPoint((float) end, (float) rowNumber), - }; - } - - public int getValue() { - return value; - } - - public int[] getStartEnd() { - return startEnd; - } - - public ResultPoint[] getResultPoints() { - return resultPoints; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof FinderPattern)) { - return false; - } - FinderPattern that = (FinderPattern) o; - return value == that.value; - } - - @Override - public int hashCode() { - return value; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/Pair.java b/zxing/src/main/java/com/google/zxing/oned/rss/Pair.java deleted file mode 100644 index e2371d2..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/Pair.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -final class Pair extends DataCharacter { - - private final FinderPattern finderPattern; - private int count; - - Pair(int value, int checksumPortion, FinderPattern finderPattern) { - super(value, checksumPortion); - this.finderPattern = finderPattern; - } - - FinderPattern getFinderPattern() { - return finderPattern; - } - - int getCount() { - return count; - } - - void incrementCount() { - count++; - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/RSS14Reader.java b/zxing/src/main/java/com/google/zxing/oned/rss/RSS14Reader.java deleted file mode 100644 index 31b0bd4..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/RSS14Reader.java +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitArray; -import com.google.zxing.common.detector.MathUtils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * Decodes RSS-14, including truncated and stacked variants. See ISO/IEC 24724:2006. - */ -public final class RSS14Reader extends AbstractRSSReader { - - private static final int[] OUTSIDE_EVEN_TOTAL_SUBSET = {1,10,34,70,126}; - private static final int[] INSIDE_ODD_TOTAL_SUBSET = {4,20,48,81}; - private static final int[] OUTSIDE_GSUM = {0,161,961,2015,2715}; - private static final int[] INSIDE_GSUM = {0,336,1036,1516}; - private static final int[] OUTSIDE_ODD_WIDEST = {8,6,4,3,1}; - private static final int[] INSIDE_ODD_WIDEST = {2,4,6,8}; - - private static final int[][] FINDER_PATTERNS = { - {3,8,2,1}, - {3,5,5,1}, - {3,3,7,1}, - {3,1,9,1}, - {2,7,4,1}, - {2,5,6,1}, - {2,3,8,1}, - {1,5,7,1}, - {1,3,9,1}, - }; - - private final List possibleLeftPairs; - private final List possibleRightPairs; - - public RSS14Reader() { - possibleLeftPairs = new ArrayList<>(); - possibleRightPairs = new ArrayList<>(); - } - - @Override - public Result decodeRow(int rowNumber, - BitArray row, - Map hints) throws NotFoundException { - Pair leftPair = decodePair(row, false, rowNumber, hints); - addOrTally(possibleLeftPairs, leftPair); - row.reverse(); - Pair rightPair = decodePair(row, true, rowNumber, hints); - addOrTally(possibleRightPairs, rightPair); - row.reverse(); - for (Pair left : possibleLeftPairs) { - if (left.getCount() > 1) { - for (Pair right : possibleRightPairs) { - if (right.getCount() > 1) { - if (checkChecksum(left, right)) { - return constructResult(left, right); - } - } - } - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static void addOrTally(Collection possiblePairs, Pair pair) { - if (pair == null) { - return; - } - boolean found = false; - for (Pair other : possiblePairs) { - if (other.getValue() == pair.getValue()) { - other.incrementCount(); - found = true; - break; - } - } - if (!found) { - possiblePairs.add(pair); - } - } - - @Override - public void reset() { - possibleLeftPairs.clear(); - possibleRightPairs.clear(); - } - - private static Result constructResult(Pair leftPair, Pair rightPair) { - long symbolValue = 4537077L * leftPair.getValue() + rightPair.getValue(); - String text = String.valueOf(symbolValue); - - StringBuilder buffer = new StringBuilder(14); - for (int i = 13 - text.length(); i > 0; i--) { - buffer.append('0'); - } - buffer.append(text); - - int checkDigit = 0; - for (int i = 0; i < 13; i++) { - int digit = buffer.charAt(i) - '0'; - checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; - } - checkDigit = 10 - (checkDigit % 10); - if (checkDigit == 10) { - checkDigit = 0; - } - buffer.append(checkDigit); - - ResultPoint[] leftPoints = leftPair.getFinderPattern().getResultPoints(); - ResultPoint[] rightPoints = rightPair.getFinderPattern().getResultPoints(); - return new Result( - String.valueOf(buffer.toString()), - null, - new ResultPoint[] { leftPoints[0], leftPoints[1], rightPoints[0], rightPoints[1], }, - BarcodeFormat.RSS_14); - } - - private static boolean checkChecksum(Pair leftPair, Pair rightPair) { - //int leftFPValue = leftPair.getFinderPattern().getValue(); - //int rightFPValue = rightPair.getFinderPattern().getValue(); - //if ((leftFPValue == 0 && rightFPValue == 8) || - // (leftFPValue == 8 && rightFPValue == 0)) { - //} - int checkValue = (leftPair.getChecksumPortion() + 16 * rightPair.getChecksumPortion()) % 79; - int targetCheckValue = - 9 * leftPair.getFinderPattern().getValue() + rightPair.getFinderPattern().getValue(); - if (targetCheckValue > 72) { - targetCheckValue--; - } - if (targetCheckValue > 8) { - targetCheckValue--; - } - return checkValue == targetCheckValue; - } - - private Pair decodePair(BitArray row, boolean right, int rowNumber, Map hints) { - try { - int[] startEnd = findFinderPattern(row, 0, right); - FinderPattern pattern = parseFoundFinderPattern(row, rowNumber, right, startEnd); - - ResultPointCallback resultPointCallback = hints == null ? null : - (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - - if (resultPointCallback != null) { - float center = (startEnd[0] + startEnd[1]) / 2.0f; - if (right) { - // row is actually reversed - center = row.getSize() - 1 - center; - } - resultPointCallback.foundPossibleResultPoint(new ResultPoint(center, rowNumber)); - } - - DataCharacter outside = decodeDataCharacter(row, pattern, true); - DataCharacter inside = decodeDataCharacter(row, pattern, false); - return new Pair(1597 * outside.getValue() + inside.getValue(), - outside.getChecksumPortion() + 4 * inside.getChecksumPortion(), - pattern); - } catch (NotFoundException ignored) { - return null; - } - } - - private DataCharacter decodeDataCharacter(BitArray row, FinderPattern pattern, boolean outsideChar) - throws NotFoundException { - - int[] counters = getDataCharacterCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - counters[4] = 0; - counters[5] = 0; - counters[6] = 0; - counters[7] = 0; - - if (outsideChar) { - recordPatternInReverse(row, pattern.getStartEnd()[0], counters); - } else { - recordPattern(row, pattern.getStartEnd()[1] + 1, counters); - // reverse it - for (int i = 0, j = counters.length - 1; i < j; i++, j--) { - int temp = counters[i]; - counters[i] = counters[j]; - counters[j] = temp; - } - } - - int numModules = outsideChar ? 16 : 15; - float elementWidth = (float) MathUtils.sum(counters) / (float) numModules; - - int[] oddCounts = this.getOddCounts(); - int[] evenCounts = this.getEvenCounts(); - float[] oddRoundingErrors = this.getOddRoundingErrors(); - float[] evenRoundingErrors = this.getEvenRoundingErrors(); - - for (int i = 0; i < counters.length; i++) { - float value = (float) counters[i] / elementWidth; - int count = (int) (value + 0.5f); // Round - if (count < 1) { - count = 1; - } else if (count > 8) { - count = 8; - } - int offset = i / 2; - if ((i & 0x01) == 0) { - oddCounts[offset] = count; - oddRoundingErrors[offset] = value - count; - } else { - evenCounts[offset] = count; - evenRoundingErrors[offset] = value - count; - } - } - - adjustOddEvenCounts(outsideChar, numModules); - - int oddSum = 0; - int oddChecksumPortion = 0; - for (int i = oddCounts.length - 1; i >= 0; i--) { - oddChecksumPortion *= 9; - oddChecksumPortion += oddCounts[i]; - oddSum += oddCounts[i]; - } - int evenChecksumPortion = 0; - int evenSum = 0; - for (int i = evenCounts.length - 1; i >= 0; i--) { - evenChecksumPortion *= 9; - evenChecksumPortion += evenCounts[i]; - evenSum += evenCounts[i]; - } - int checksumPortion = oddChecksumPortion + 3 * evenChecksumPortion; - - if (outsideChar) { - if ((oddSum & 0x01) != 0 || oddSum > 12 || oddSum < 4) { - throw NotFoundException.getNotFoundInstance(); - } - int group = (12 - oddSum) / 2; - int oddWidest = OUTSIDE_ODD_WIDEST[group]; - int evenWidest = 9 - oddWidest; - int vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, false); - int vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, true); - int tEven = OUTSIDE_EVEN_TOTAL_SUBSET[group]; - int gSum = OUTSIDE_GSUM[group]; - return new DataCharacter(vOdd * tEven + vEven + gSum, checksumPortion); - } else { - if ((evenSum & 0x01) != 0 || evenSum > 10 || evenSum < 4) { - throw NotFoundException.getNotFoundInstance(); - } - int group = (10 - evenSum) / 2; - int oddWidest = INSIDE_ODD_WIDEST[group]; - int evenWidest = 9 - oddWidest; - int vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, true); - int vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, false); - int tOdd = INSIDE_ODD_TOTAL_SUBSET[group]; - int gSum = INSIDE_GSUM[group]; - return new DataCharacter(vEven * tOdd + vOdd + gSum, checksumPortion); - } - - } - - private int[] findFinderPattern(BitArray row, int rowOffset, boolean rightFinderPattern) - throws NotFoundException { - - int[] counters = getDecodeFinderCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - - int width = row.getSize(); - boolean isWhite = false; - while (rowOffset < width) { - isWhite = !row.get(rowOffset); - if (rightFinderPattern == isWhite) { - // Will encounter white first when searching for right finder pattern - break; - } - rowOffset++; - } - - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - if (row.get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == 3) { - if (isFinderPattern(counters)) { - return new int[]{patternStart, x}; - } - patternStart += counters[0] + counters[1]; - counters[0] = counters[2]; - counters[1] = counters[3]; - counters[2] = 0; - counters[3] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - - } - - private FinderPattern parseFoundFinderPattern(BitArray row, int rowNumber, boolean right, int[] startEnd) - throws NotFoundException { - // Actually we found elements 2-5 - boolean firstIsBlack = row.get(startEnd[0]); - int firstElementStart = startEnd[0] - 1; - // Locate element 1 - while (firstElementStart >= 0 && firstIsBlack ^ row.get(firstElementStart)) { - firstElementStart--; - } - firstElementStart++; - int firstCounter = startEnd[0] - firstElementStart; - // Make 'counters' hold 1-4 - int[] counters = getDecodeFinderCounters(); - System.arraycopy(counters, 0, counters, 1, counters.length - 1); - counters[0] = firstCounter; - int value = parseFinderValue(counters, FINDER_PATTERNS); - int start = firstElementStart; - int end = startEnd[1]; - if (right) { - // row is actually reversed - start = row.getSize() - 1 - start; - end = row.getSize() - 1 - end; - } - return new FinderPattern(value, new int[] {firstElementStart, startEnd[1]}, start, end, rowNumber); - } - - private void adjustOddEvenCounts(boolean outsideChar, int numModules) throws NotFoundException { - - int oddSum = MathUtils.sum(getOddCounts()); - int evenSum = MathUtils.sum(getEvenCounts()); - int mismatch = oddSum + evenSum - numModules; - boolean oddParityBad = (oddSum & 0x01) == (outsideChar ? 1 : 0); - boolean evenParityBad = (evenSum & 0x01) == 1; - - boolean incrementOdd = false; - boolean decrementOdd = false; - boolean incrementEven = false; - boolean decrementEven = false; - - if (outsideChar) { - if (oddSum > 12) { - decrementOdd = true; - } else if (oddSum < 4) { - incrementOdd = true; - } - if (evenSum > 12) { - decrementEven = true; - } else if (evenSum < 4) { - incrementEven = true; - } - } else { - if (oddSum > 11) { - decrementOdd = true; - } else if (oddSum < 5) { - incrementOdd = true; - } - if (evenSum > 10) { - decrementEven = true; - } else if (evenSum < 4) { - incrementEven = true; - } - } - - /*if (mismatch == 2) { - if (!(oddParityBad && evenParityBad)) { - throw ReaderException.getInstance(); - } - decrementOdd = true; - decrementEven = true; - } else if (mismatch == -2) { - if (!(oddParityBad && evenParityBad)) { - throw ReaderException.getInstance(); - } - incrementOdd = true; - incrementEven = true; - } else */ if (mismatch == 1) { - if (oddParityBad) { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - decrementOdd = true; - } else { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - decrementEven = true; - } - } else if (mismatch == -1) { - if (oddParityBad) { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - incrementOdd = true; - } else { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - incrementEven = true; - } - } else if (mismatch == 0) { - if (oddParityBad) { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - // Both bad - if (oddSum < evenSum) { - incrementOdd = true; - decrementEven = true; - } else { - decrementOdd = true; - incrementEven = true; - } - } else { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - // Nothing to do! - } - } else { - throw NotFoundException.getNotFoundInstance(); - } - - if (incrementOdd) { - if (decrementOdd) { - throw NotFoundException.getNotFoundInstance(); - } - increment(getOddCounts(), getOddRoundingErrors()); - } - if (decrementOdd) { - decrement(getOddCounts(), getOddRoundingErrors()); - } - if (incrementEven) { - if (decrementEven) { - throw NotFoundException.getNotFoundInstance(); - } - increment(getEvenCounts(), getOddRoundingErrors()); - } - if (decrementEven) { - decrement(getEvenCounts(), getEvenRoundingErrors()); - } - - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/RSSUtils.java b/zxing/src/main/java/com/google/zxing/oned/rss/RSSUtils.java deleted file mode 100644 index fb5a1d0..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/RSSUtils.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss; - -/** Adapted from listings in ISO/IEC 24724 Appendix B and Appendix G. */ -public final class RSSUtils { - - private RSSUtils() {} - - /* - static int[] getRSSwidths(int val, int n, int elements, int maxWidth, boolean noNarrow) { - int[] widths = new int[elements]; - int bar; - int narrowMask = 0; - for (bar = 0; bar < elements - 1; bar++) { - narrowMask |= 1 << bar; - int elmWidth = 1; - int subVal; - while (true) { - subVal = combins(n - elmWidth - 1, elements - bar - 2); - if (noNarrow && (narrowMask == 0) && - (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { - subVal -= combins(n - elmWidth - (elements - bar), elements - bar - 2); - } - if (elements - bar - 1 > 1) { - int lessVal = 0; - for (int mxwElement = n - elmWidth - (elements - bar - 2); - mxwElement > maxWidth; - mxwElement--) { - lessVal += combins(n - elmWidth - mxwElement - 1, elements - bar - 3); - } - subVal -= lessVal * (elements - 1 - bar); - } else if (n - elmWidth > maxWidth) { - subVal--; - } - val -= subVal; - if (val < 0) { - break; - } - elmWidth++; - narrowMask &= ~(1 << bar); - } - val += subVal; - n -= elmWidth; - widths[bar] = elmWidth; - } - widths[bar] = n; - return widths; - } - */ - - public static int getRSSvalue(int[] widths, int maxWidth, boolean noNarrow) { - int elements = widths.length; - int n = 0; - for (int width : widths) { - n += width; - } - int val = 0; - int narrowMask = 0; - for (int bar = 0; bar < elements - 1; bar++) { - int elmWidth; - for (elmWidth = 1, narrowMask |= 1 << bar; - elmWidth < widths[bar]; - elmWidth++, narrowMask &= ~(1 << bar)) { - int subVal = combins(n - elmWidth - 1, elements - bar - 2); - if (noNarrow && (narrowMask == 0) && - (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { - subVal -= combins(n - elmWidth - (elements - bar), - elements - bar - 2); - } - if (elements - bar - 1 > 1) { - int lessVal = 0; - for (int mxwElement = n - elmWidth - (elements - bar - 2); - mxwElement > maxWidth; mxwElement--) { - lessVal += combins(n - elmWidth - mxwElement - 1, - elements - bar - 3); - } - subVal -= lessVal * (elements - 1 - bar); - } else if (n - elmWidth > maxWidth) { - subVal--; - } - val += subVal; - } - n -= elmWidth; - } - return val; - } - - private static int combins(int n, int r) { - int maxDenom; - int minDenom; - if (n - r > r) { - minDenom = r; - maxDenom = n - r; - } else { - minDenom = n - r; - maxDenom = r; - } - int val = 1; - int j = 1; - for (int i = n; i > maxDenom; i--) { - val *= i; - if (j <= minDenom) { - val /= j; - j++; - } - } - while (j <= minDenom) { - val /= j; - j++; - } - return val; - } - - /* - static int[] elements(int[] eDist, int N, int K) { - int[] widths = new int[eDist.length + 2]; - int twoK = 2 * K; - widths[0] = 1; - int i; - int minEven = 10; - int barSum = 1; - for (i = 1; i < twoK - 2; i += 2) { - widths[i] = eDist[i - 1] - widths[i - 1]; - widths[i + 1] = eDist[i] - widths[i]; - barSum += widths[i] + widths[i + 1]; - if (widths[i] < minEven) { - minEven = widths[i]; - } - } - widths[twoK - 1] = N - barSum; - if (widths[twoK - 1] < minEven) { - minEven = widths[twoK - 1]; - } - if (minEven > 1) { - for (i = 0; i < twoK; i += 2) { - widths[i] += minEven - 1; - widths[i + 1] -= minEven - 1; - } - } - return widths; - } - */ - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java deleted file mode 100644 index 293af30..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded; - -import com.google.zxing.common.BitArray; - -import java.util.List; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class BitArrayBuilder { - - private BitArrayBuilder() { - } - - static BitArray buildBitArray(List pairs) { - int charNumber = (pairs.size() * 2) - 1; - if (pairs.get(pairs.size() - 1).getRightChar() == null) { - charNumber -= 1; - } - - int size = 12 * charNumber; - - BitArray binary = new BitArray(size); - int accPos = 0; - - ExpandedPair firstPair = pairs.get(0); - int firstValue = firstPair.getRightChar().getValue(); - for (int i = 11; i >= 0; --i) { - if ((firstValue & (1 << i)) != 0) { - binary.set(accPos); - } - accPos++; - } - - for (int i = 1; i < pairs.size(); ++i) { - ExpandedPair currentPair = pairs.get(i); - - int leftValue = currentPair.getLeftChar().getValue(); - for (int j = 11; j >= 0; --j) { - if ((leftValue & (1 << j)) != 0) { - binary.set(accPos); - } - accPos++; - } - - if (currentPair.getRightChar() != null) { - int rightValue = currentPair.getRightChar().getValue(); - for (int j = 11; j >= 0; --j) { - if ((rightValue & (1 << j)) != 0) { - binary.set(accPos); - } - accPos++; - } - } - } - return binary; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedPair.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedPair.java deleted file mode 100644 index d51f8db..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedPair.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded; - -import com.google.zxing.oned.rss.DataCharacter; -import com.google.zxing.oned.rss.FinderPattern; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class ExpandedPair { - - private final boolean mayBeLast; - private final DataCharacter leftChar; - private final DataCharacter rightChar; - private final FinderPattern finderPattern; - - ExpandedPair(DataCharacter leftChar, - DataCharacter rightChar, - FinderPattern finderPattern, - boolean mayBeLast) { - this.leftChar = leftChar; - this.rightChar = rightChar; - this.finderPattern = finderPattern; - this.mayBeLast = mayBeLast; - } - - boolean mayBeLast() { - return this.mayBeLast; - } - - DataCharacter getLeftChar() { - return this.leftChar; - } - - DataCharacter getRightChar() { - return this.rightChar; - } - - FinderPattern getFinderPattern() { - return this.finderPattern; - } - - public boolean mustBeLast() { - return this.rightChar == null; - } - - @Override - public String toString() { - return - "[ " + leftChar + " , " + rightChar + " : " + - (finderPattern == null ? "null" : finderPattern.getValue()) + " ]"; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof ExpandedPair)) { - return false; - } - ExpandedPair that = (ExpandedPair) o; - return - equalsOrNull(leftChar, that.leftChar) && - equalsOrNull(rightChar, that.rightChar) && - equalsOrNull(finderPattern, that.finderPattern); - } - - private static boolean equalsOrNull(Object o1, Object o2) { - return o1 == null ? o2 == null : o1.equals(o2); - } - - @Override - public int hashCode() { - return hashNotNull(leftChar) ^ hashNotNull(rightChar) ^ hashNotNull(finderPattern); - } - - private static int hashNotNull(Object o) { - return o == null ? 0 : o.hashCode(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedRow.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedRow.java deleted file mode 100644 index 037328e..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/ExpandedRow.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.oned.rss.expanded; - -import java.util.ArrayList; -import java.util.List; - -/** - * One row of an RSS Expanded Stacked symbol, consisting of 1+ expanded pairs. - */ -final class ExpandedRow { - - private final List pairs; - private final int rowNumber; - /** Did this row of the image have to be reversed (mirrored) to recognize the pairs? */ - private final boolean wasReversed; - - ExpandedRow(List pairs, int rowNumber, boolean wasReversed) { - this.pairs = new ArrayList<>(pairs); - this.rowNumber = rowNumber; - this.wasReversed = wasReversed; - } - - List getPairs() { - return this.pairs; - } - - int getRowNumber() { - return this.rowNumber; - } - - boolean isReversed() { - return this.wasReversed; - } - - boolean isEquivalent(List otherPairs) { - return this.pairs.equals(otherPairs); - } - - @Override - public String toString() { - return "{ " + pairs + " }"; - } - - /** - * Two rows are equal if they contain the same pairs in the same order. - */ - @Override - public boolean equals(Object o) { - if (!(o instanceof ExpandedRow)) { - return false; - } - ExpandedRow that = (ExpandedRow) o; - return this.pairs.equals(that.getPairs()) && wasReversed == that.wasReversed; - } - - @Override - public int hashCode() { - return pairs.hashCode() ^ Boolean.valueOf(wasReversed).hashCode(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java deleted file mode 100644 index a803fe2..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java +++ /dev/null @@ -1,783 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Result; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitArray; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.oned.rss.AbstractRSSReader; -import com.google.zxing.oned.rss.DataCharacter; -import com.google.zxing.oned.rss.FinderPattern; -import com.google.zxing.oned.rss.RSSUtils; -import com.google.zxing.oned.rss.expanded.decoders.AbstractExpandedDecoder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Collections; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -public final class RSSExpandedReader extends AbstractRSSReader { - - private static final int[] SYMBOL_WIDEST = {7, 5, 4, 3, 1}; - private static final int[] EVEN_TOTAL_SUBSET = {4, 20, 52, 104, 204}; - private static final int[] GSUM = {0, 348, 1388, 2948, 3988}; - - private static final int[][] FINDER_PATTERNS = { - {1,8,4,1}, // A - {3,6,4,1}, // B - {3,4,6,1}, // C - {3,2,8,1}, // D - {2,6,5,1}, // E - {2,2,9,1} // F - }; - - private static final int[][] WEIGHTS = { - { 1, 3, 9, 27, 81, 32, 96, 77}, - { 20, 60, 180, 118, 143, 7, 21, 63}, - {189, 145, 13, 39, 117, 140, 209, 205}, - {193, 157, 49, 147, 19, 57, 171, 91}, - { 62, 186, 136, 197, 169, 85, 44, 132}, - {185, 133, 188, 142, 4, 12, 36, 108}, - {113, 128, 173, 97, 80, 29, 87, 50}, - {150, 28, 84, 41, 123, 158, 52, 156}, - { 46, 138, 203, 187, 139, 206, 196, 166}, - { 76, 17, 51, 153, 37, 111, 122, 155}, - { 43, 129, 176, 106, 107, 110, 119, 146}, - { 16, 48, 144, 10, 30, 90, 59, 177}, - {109, 116, 137, 200, 178, 112, 125, 164}, - { 70, 210, 208, 202, 184, 130, 179, 115}, - {134, 191, 151, 31, 93, 68, 204, 190}, - {148, 22, 66, 198, 172, 94, 71, 2}, - { 6, 18, 54, 162, 64, 192,154, 40}, - {120, 149, 25, 75, 14, 42,126, 167}, - { 79, 26, 78, 23, 69, 207,199, 175}, - {103, 98, 83, 38, 114, 131, 182, 124}, - {161, 61, 183, 127, 170, 88, 53, 159}, - { 55, 165, 73, 8, 24, 72, 5, 15}, - { 45, 135, 194, 160, 58, 174, 100, 89} - }; - - private static final int FINDER_PAT_A = 0; - private static final int FINDER_PAT_B = 1; - private static final int FINDER_PAT_C = 2; - private static final int FINDER_PAT_D = 3; - private static final int FINDER_PAT_E = 4; - private static final int FINDER_PAT_F = 5; - - private static final int[][] FINDER_PATTERN_SEQUENCES = { - { FINDER_PAT_A, FINDER_PAT_A }, - { FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B }, - { FINDER_PAT_A, FINDER_PAT_C, FINDER_PAT_B, FINDER_PAT_D }, - { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_C }, - { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_D, FINDER_PAT_F }, - { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, - { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_D }, - { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_E }, - { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, - { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, - }; - - private static final int MAX_PAIRS = 11; - - private final List pairs = new ArrayList<>(MAX_PAIRS); - private final List rows = new ArrayList<>(); - private final int [] startEnd = new int[2]; - private boolean startFromEven; - - @Override - public Result decodeRow(int rowNumber, - BitArray row, - Map hints) throws NotFoundException, FormatException { - // Rows can start with even pattern in case in prev rows there where odd number of patters. - // So lets try twice - this.pairs.clear(); - this.startFromEven = false; - try { - List pairs = decodeRow2pairs(rowNumber, row); - return constructResult(pairs); - } catch (NotFoundException e) { - // OK - } - - this.pairs.clear(); - this.startFromEven = true; - List pairs = decodeRow2pairs(rowNumber, row); - return constructResult(pairs); - } - - @Override - public void reset() { - this.pairs.clear(); - this.rows.clear(); - } - - // Not private for testing - List decodeRow2pairs(int rowNumber, BitArray row) throws NotFoundException { - try { - while (true) { - ExpandedPair nextPair = retrieveNextPair(row, this.pairs, rowNumber); - this.pairs.add(nextPair); - // exit this loop when retrieveNextPair() fails and throws - } - } catch (NotFoundException nfe) { - if (this.pairs.isEmpty()) { - throw nfe; - } - } - - // TODO: verify sequence of finder patterns as in checkPairSequence() - if (checkChecksum()) { - return this.pairs; - } - - boolean tryStackedDecode = !this.rows.isEmpty(); - boolean wasReversed = false; // TODO: deal with reversed rows - storeRow(rowNumber, wasReversed); - if (tryStackedDecode) { - // When the image is 180-rotated, then rows are sorted in wrong direction. - // Try twice with both the directions. - List ps = checkRows(false); - if (ps != null) { - return ps; - } - ps = checkRows(true); - if (ps != null) { - return ps; - } - } - - throw NotFoundException.getNotFoundInstance(); - } - - private List checkRows(boolean reverse) { - // Limit number of rows we are checking - // We use recursive algorithm with pure complexity and don't want it to take forever - // Stacked barcode can have up to 11 rows, so 25 seems reasonable enough - if (this.rows.size() > 25) { - this.rows.clear(); // We will never have a chance to get result, so clear it - return null; - } - - this.pairs.clear(); - if (reverse) { - Collections.reverse(this.rows); - } - - List ps = null; - try { - ps = checkRows(new ArrayList(), 0); - } catch (NotFoundException e) { - // OK - } - - if (reverse) { - Collections.reverse(this.rows); - } - - return ps; - } - - // Try to construct a valid rows sequence - // Recursion is used to implement backtracking - private List checkRows(List collectedRows, int currentRow) throws NotFoundException { - for (int i = currentRow; i < rows.size(); i++) { - ExpandedRow row = rows.get(i); - this.pairs.clear(); - for (ExpandedRow collectedRow : collectedRows) { - this.pairs.addAll(collectedRow.getPairs()); - } - this.pairs.addAll(row.getPairs()); - - if (!isValidSequence(this.pairs)) { - continue; - } - - if (checkChecksum()) { - return this.pairs; - } - - List rs = new ArrayList<>(); - rs.addAll(collectedRows); - rs.add(row); - try { - // Recursion: try to add more rows - return checkRows(rs, i + 1); - } catch (NotFoundException e) { - // We failed, try the next candidate - } - } - - throw NotFoundException.getNotFoundInstance(); - } - - // Whether the pairs form a valid find pattern seqience, - // either complete or a prefix - private static boolean isValidSequence(List pairs) { - for (int[] sequence : FINDER_PATTERN_SEQUENCES) { - if (pairs.size() > sequence.length) { - continue; - } - - boolean stop = true; - for (int j = 0; j < pairs.size(); j++) { - if (pairs.get(j).getFinderPattern().getValue() != sequence[j]) { - stop = false; - break; - } - } - - if (stop) { - return true; - } - } - - return false; - } - - private void storeRow(int rowNumber, boolean wasReversed) { - // Discard if duplicate above or below; otherwise insert in order by row number. - int insertPos = 0; - boolean prevIsSame = false; - boolean nextIsSame = false; - while (insertPos < this.rows.size()) { - ExpandedRow erow = this.rows.get(insertPos); - if (erow.getRowNumber() > rowNumber) { - nextIsSame = erow.isEquivalent(this.pairs); - break; - } - prevIsSame = erow.isEquivalent(this.pairs); - insertPos++; - } - if (nextIsSame || prevIsSame) { - return; - } - - // When the row was partially decoded (e.g. 2 pairs found instead of 3), - // it will prevent us from detecting the barcode. - // Try to merge partial rows - - // Check whether the row is part of an allready detected row - if (isPartialRow(this.pairs, this.rows)) { - return; - } - - this.rows.add(insertPos, new ExpandedRow(this.pairs, rowNumber, wasReversed)); - - removePartialRows(this.pairs, this.rows); - } - - // Remove all the rows that contains only specified pairs - private static void removePartialRows(List pairs, List rows) { - for (Iterator iterator = rows.iterator(); iterator.hasNext();) { - ExpandedRow r = iterator.next(); - if (r.getPairs().size() == pairs.size()) { - continue; - } - boolean allFound = true; - for (ExpandedPair p : r.getPairs()) { - boolean found = false; - for (ExpandedPair pp : pairs) { - if (p.equals(pp)) { - found = true; - break; - } - } - if (!found) { - allFound = false; - break; - } - } - if (allFound) { - // 'pairs' contains all the pairs from the row 'r' - iterator.remove(); - } - } - } - - // Returns true when one of the rows already contains all the pairs - private static boolean isPartialRow(Iterable pairs, Iterable rows) { - for (ExpandedRow r : rows) { - boolean allFound = true; - for (ExpandedPair p : pairs) { - boolean found = false; - for (ExpandedPair pp : r.getPairs()) { - if (p.equals(pp)) { - found = true; - break; - } - } - if (!found) { - allFound = false; - break; - } - } - if (allFound) { - // the row 'r' contain all the pairs from 'pairs' - return true; - } - } - return false; - } - - // Only used for unit testing - List getRows() { - return this.rows; - } - - // Not private for unit testing - static Result constructResult(List pairs) throws NotFoundException, FormatException { - BitArray binary = BitArrayBuilder.buildBitArray(pairs); - - AbstractExpandedDecoder decoder = AbstractExpandedDecoder.createDecoder(binary); - String resultingString = decoder.parseInformation(); - - ResultPoint[] firstPoints = pairs.get(0).getFinderPattern().getResultPoints(); - ResultPoint[] lastPoints = pairs.get(pairs.size() - 1).getFinderPattern().getResultPoints(); - - return new Result( - resultingString, - null, - new ResultPoint[]{firstPoints[0], firstPoints[1], lastPoints[0], lastPoints[1]}, - BarcodeFormat.RSS_EXPANDED - ); - } - - private boolean checkChecksum() { - ExpandedPair firstPair = this.pairs.get(0); - DataCharacter checkCharacter = firstPair.getLeftChar(); - DataCharacter firstCharacter = firstPair.getRightChar(); - - if (firstCharacter == null) { - return false; - } - - int checksum = firstCharacter.getChecksumPortion(); - int s = 2; - - for (int i = 1; i < this.pairs.size(); ++i) { - ExpandedPair currentPair = this.pairs.get(i); - checksum += currentPair.getLeftChar().getChecksumPortion(); - s++; - DataCharacter currentRightChar = currentPair.getRightChar(); - if (currentRightChar != null) { - checksum += currentRightChar.getChecksumPortion(); - s++; - } - } - - checksum %= 211; - - int checkCharacterValue = 211 * (s - 4) + checksum; - - return checkCharacterValue == checkCharacter.getValue(); - } - - private static int getNextSecondBar(BitArray row, int initialPos) { - int currentPos; - if (row.get(initialPos)) { - currentPos = row.getNextUnset(initialPos); - currentPos = row.getNextSet(currentPos); - } else { - currentPos = row.getNextSet(initialPos); - currentPos = row.getNextUnset(currentPos); - } - return currentPos; - } - - // not private for testing - ExpandedPair retrieveNextPair(BitArray row, List previousPairs, int rowNumber) - throws NotFoundException { - boolean isOddPattern = previousPairs.size() % 2 == 0; - if (startFromEven) { - isOddPattern = !isOddPattern; - } - - FinderPattern pattern; - - boolean keepFinding = true; - int forcedOffset = -1; - do { - this.findNextPair(row, previousPairs, forcedOffset); - pattern = parseFoundFinderPattern(row, rowNumber, isOddPattern); - if (pattern == null) { - forcedOffset = getNextSecondBar(row, this.startEnd[0]); - } else { - keepFinding = false; - } - } while (keepFinding); - - // When stacked symbol is split over multiple rows, there's no way to guess if this pair can be last or not. - // boolean mayBeLast = checkPairSequence(previousPairs, pattern); - - DataCharacter leftChar = this.decodeDataCharacter(row, pattern, isOddPattern, true); - - if (!previousPairs.isEmpty() && previousPairs.get(previousPairs.size() - 1).mustBeLast()) { - throw NotFoundException.getNotFoundInstance(); - } - - DataCharacter rightChar; - try { - rightChar = this.decodeDataCharacter(row, pattern, isOddPattern, false); - } catch (NotFoundException ignored) { - rightChar = null; - } - boolean mayBeLast = true; - return new ExpandedPair(leftChar, rightChar, pattern, mayBeLast); - } - - private void findNextPair(BitArray row, List previousPairs, int forcedOffset) - throws NotFoundException { - int[] counters = this.getDecodeFinderCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - - int width = row.getSize(); - - int rowOffset; - if (forcedOffset >= 0) { - rowOffset = forcedOffset; - } else if (previousPairs.isEmpty()) { - rowOffset = 0; - } else { - ExpandedPair lastPair = previousPairs.get(previousPairs.size() - 1); - rowOffset = lastPair.getFinderPattern().getStartEnd()[1]; - } - boolean searchingEvenPair = previousPairs.size() % 2 != 0; - if (startFromEven) { - searchingEvenPair = !searchingEvenPair; - } - - boolean isWhite = false; - while (rowOffset < width) { - isWhite = !row.get(rowOffset); - if (!isWhite) { - break; - } - rowOffset++; - } - - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - if (row.get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == 3) { - if (searchingEvenPair) { - reverseCounters(counters); - } - - if (isFinderPattern(counters)) { - this.startEnd[0] = patternStart; - this.startEnd[1] = x; - return; - } - - if (searchingEvenPair) { - reverseCounters(counters); - } - - patternStart += counters[0] + counters[1]; - counters[0] = counters[2]; - counters[1] = counters[3]; - counters[2] = 0; - counters[3] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException.getNotFoundInstance(); - } - - private static void reverseCounters(int [] counters) { - int length = counters.length; - for (int i = 0; i < length / 2; ++i) { - int tmp = counters[i]; - counters[i] = counters[length - i - 1]; - counters[length - i - 1] = tmp; - } - } - - private FinderPattern parseFoundFinderPattern(BitArray row, int rowNumber, boolean oddPattern) { - // Actually we found elements 2-5. - int firstCounter; - int start; - int end; - - if (oddPattern) { - // If pattern number is odd, we need to locate element 1 *before* the current block. - - int firstElementStart = this.startEnd[0] - 1; - // Locate element 1 - while (firstElementStart >= 0 && !row.get(firstElementStart)) { - firstElementStart--; - } - - firstElementStart++; - firstCounter = this.startEnd[0] - firstElementStart; - start = firstElementStart; - end = this.startEnd[1]; - - } else { - // If pattern number is even, the pattern is reversed, so we need to locate element 1 *after* the current block. - - start = this.startEnd[0]; - - end = row.getNextUnset(this.startEnd[1] + 1); - firstCounter = end - this.startEnd[1]; - } - - // Make 'counters' hold 1-4 - int [] counters = this.getDecodeFinderCounters(); - System.arraycopy(counters, 0, counters, 1, counters.length - 1); - - counters[0] = firstCounter; - int value; - try { - value = parseFinderValue(counters, FINDER_PATTERNS); - } catch (NotFoundException ignored) { - return null; - } - return new FinderPattern(value, new int[] {start, end}, start, end, rowNumber); - } - - DataCharacter decodeDataCharacter(BitArray row, - FinderPattern pattern, - boolean isOddPattern, - boolean leftChar) throws NotFoundException { - int[] counters = this.getDataCharacterCounters(); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - counters[4] = 0; - counters[5] = 0; - counters[6] = 0; - counters[7] = 0; - - if (leftChar) { - recordPatternInReverse(row, pattern.getStartEnd()[0], counters); - } else { - recordPattern(row, pattern.getStartEnd()[1], counters); - // reverse it - for (int i = 0, j = counters.length - 1; i < j; i++, j--) { - int temp = counters[i]; - counters[i] = counters[j]; - counters[j] = temp; - } - } //counters[] has the pixels of the module - - int numModules = 17; //left and right data characters have all the same length - float elementWidth = (float) MathUtils.sum(counters) / (float) numModules; - - // Sanity check: element width for pattern and the character should match - float expectedElementWidth = (pattern.getStartEnd()[1] - pattern.getStartEnd()[0]) / 15.0f; - if (Math.abs(elementWidth - expectedElementWidth) / expectedElementWidth > 0.3f) { - throw NotFoundException.getNotFoundInstance(); - } - - int[] oddCounts = this.getOddCounts(); - int[] evenCounts = this.getEvenCounts(); - float[] oddRoundingErrors = this.getOddRoundingErrors(); - float[] evenRoundingErrors = this.getEvenRoundingErrors(); - - for (int i = 0; i < counters.length; i++) { - float value = 1.0f * counters[i] / elementWidth; - int count = (int) (value + 0.5f); // Round - if (count < 1) { - if (value < 0.3f) { - throw NotFoundException.getNotFoundInstance(); - } - count = 1; - } else if (count > 8) { - if (value > 8.7f) { - throw NotFoundException.getNotFoundInstance(); - } - count = 8; - } - int offset = i / 2; - if ((i & 0x01) == 0) { - oddCounts[offset] = count; - oddRoundingErrors[offset] = value - count; - } else { - evenCounts[offset] = count; - evenRoundingErrors[offset] = value - count; - } - } - - adjustOddEvenCounts(numModules); - - int weightRowNumber = 4 * pattern.getValue() + (isOddPattern ? 0 : 2) + (leftChar ? 0 : 1) - 1; - - int oddSum = 0; - int oddChecksumPortion = 0; - for (int i = oddCounts.length - 1; i >= 0; i--) { - if (isNotA1left(pattern, isOddPattern, leftChar)) { - int weight = WEIGHTS[weightRowNumber][2 * i]; - oddChecksumPortion += oddCounts[i] * weight; - } - oddSum += oddCounts[i]; - } - int evenChecksumPortion = 0; - //int evenSum = 0; - for (int i = evenCounts.length - 1; i >= 0; i--) { - if (isNotA1left(pattern, isOddPattern, leftChar)) { - int weight = WEIGHTS[weightRowNumber][2 * i + 1]; - evenChecksumPortion += evenCounts[i] * weight; - } - //evenSum += evenCounts[i]; - } - int checksumPortion = oddChecksumPortion + evenChecksumPortion; - - if ((oddSum & 0x01) != 0 || oddSum > 13 || oddSum < 4) { - throw NotFoundException.getNotFoundInstance(); - } - - int group = (13 - oddSum) / 2; - int oddWidest = SYMBOL_WIDEST[group]; - int evenWidest = 9 - oddWidest; - int vOdd = RSSUtils.getRSSvalue(oddCounts, oddWidest, true); - int vEven = RSSUtils.getRSSvalue(evenCounts, evenWidest, false); - int tEven = EVEN_TOTAL_SUBSET[group]; - int gSum = GSUM[group]; - int value = vOdd * tEven + vEven + gSum; - - return new DataCharacter(value, checksumPortion); - } - - private static boolean isNotA1left(FinderPattern pattern, boolean isOddPattern, boolean leftChar) { - // A1: pattern.getValue is 0 (A), and it's an oddPattern, and it is a left char - return !(pattern.getValue() == 0 && isOddPattern && leftChar); - } - - private void adjustOddEvenCounts(int numModules) throws NotFoundException { - - int oddSum = MathUtils.sum(this.getOddCounts()); - int evenSum = MathUtils.sum(this.getEvenCounts()); - int mismatch = oddSum + evenSum - numModules; - boolean oddParityBad = (oddSum & 0x01) == 1; - boolean evenParityBad = (evenSum & 0x01) == 0; - - boolean incrementOdd = false; - boolean decrementOdd = false; - - if (oddSum > 13) { - decrementOdd = true; - } else if (oddSum < 4) { - incrementOdd = true; - } - boolean incrementEven = false; - boolean decrementEven = false; - if (evenSum > 13) { - decrementEven = true; - } else if (evenSum < 4) { - incrementEven = true; - } - - if (mismatch == 1) { - if (oddParityBad) { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - decrementOdd = true; - } else { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - decrementEven = true; - } - } else if (mismatch == -1) { - if (oddParityBad) { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - incrementOdd = true; - } else { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - incrementEven = true; - } - } else if (mismatch == 0) { - if (oddParityBad) { - if (!evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - // Both bad - if (oddSum < evenSum) { - incrementOdd = true; - decrementEven = true; - } else { - decrementOdd = true; - incrementEven = true; - } - } else { - if (evenParityBad) { - throw NotFoundException.getNotFoundInstance(); - } - // Nothing to do! - } - } else { - throw NotFoundException.getNotFoundInstance(); - } - - if (incrementOdd) { - if (decrementOdd) { - throw NotFoundException.getNotFoundInstance(); - } - increment(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (decrementOdd) { - decrement(this.getOddCounts(), this.getOddRoundingErrors()); - } - if (incrementEven) { - if (decrementEven) { - throw NotFoundException.getNotFoundInstance(); - } - increment(this.getEvenCounts(), this.getOddRoundingErrors()); - } - if (decrementEven) { - decrement(this.getEvenCounts(), this.getEvenRoundingErrors()); - } - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java deleted file mode 100644 index 759cf96..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class AI013103decoder extends AI013x0xDecoder { - - AI013103decoder(BitArray information) { - super(information); - } - - @Override - protected void addWeightCode(StringBuilder buf, int weight) { - buf.append("(3103)"); - } - - @Override - protected int checkWeight(int weight) { - return weight; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java deleted file mode 100644 index eb50f7a..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class AI01320xDecoder extends AI013x0xDecoder { - - AI01320xDecoder(BitArray information) { - super(information); - } - - @Override - protected void addWeightCode(StringBuilder buf, int weight) { - if (weight < 10000) { - buf.append("(3202)"); - } else { - buf.append("(3203)"); - } - } - - @Override - protected int checkWeight(int weight) { - if (weight < 10000) { - return weight; - } - return weight - 10000; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java deleted file mode 100644 index 9ea5bba..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class AI01392xDecoder extends AI01decoder { - - private static final int HEADER_SIZE = 5 + 1 + 2; - private static final int LAST_DIGIT_SIZE = 2; - - AI01392xDecoder(BitArray information) { - super(information); - } - - @Override - public String parseInformation() throws NotFoundException, FormatException { - if (this.getInformation().getSize() < HEADER_SIZE + GTIN_SIZE) { - throw NotFoundException.getNotFoundInstance(); - } - - StringBuilder buf = new StringBuilder(); - - encodeCompressedGtin(buf, HEADER_SIZE); - - int lastAIdigit = - this.getGeneralDecoder().extractNumericValueFromBitArray(HEADER_SIZE + GTIN_SIZE, LAST_DIGIT_SIZE); - buf.append("(392"); - buf.append(lastAIdigit); - buf.append(')'); - - DecodedInformation decodedInformation = - this.getGeneralDecoder().decodeGeneralPurposeField(HEADER_SIZE + GTIN_SIZE + LAST_DIGIT_SIZE, null); - buf.append(decodedInformation.getNewString()); - - return buf.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java deleted file mode 100644 index 9c7ad5c..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class AI01393xDecoder extends AI01decoder { - - private static final int HEADER_SIZE = 5 + 1 + 2; - private static final int LAST_DIGIT_SIZE = 2; - private static final int FIRST_THREE_DIGITS_SIZE = 10; - - AI01393xDecoder(BitArray information) { - super(information); - } - - @Override - public String parseInformation() throws NotFoundException, FormatException { - if (this.getInformation().getSize() < HEADER_SIZE + GTIN_SIZE) { - throw NotFoundException.getNotFoundInstance(); - } - - StringBuilder buf = new StringBuilder(); - - encodeCompressedGtin(buf, HEADER_SIZE); - - int lastAIdigit = - this.getGeneralDecoder().extractNumericValueFromBitArray(HEADER_SIZE + GTIN_SIZE, LAST_DIGIT_SIZE); - - buf.append("(393"); - buf.append(lastAIdigit); - buf.append(')'); - - int firstThreeDigits = - this.getGeneralDecoder().extractNumericValueFromBitArray(HEADER_SIZE + GTIN_SIZE + LAST_DIGIT_SIZE, FIRST_THREE_DIGITS_SIZE); - if (firstThreeDigits / 100 == 0) { - buf.append('0'); - } - if (firstThreeDigits / 10 == 0) { - buf.append('0'); - } - buf.append(firstThreeDigits); - - DecodedInformation generalInformation = - this.getGeneralDecoder().decodeGeneralPurposeField(HEADER_SIZE + GTIN_SIZE + LAST_DIGIT_SIZE + FIRST_THREE_DIGITS_SIZE, null); - buf.append(generalInformation.getNewString()); - - return buf.toString(); - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java deleted file mode 100644 index 386368f..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class AI013x0x1xDecoder extends AI01weightDecoder { - - private static final int HEADER_SIZE = 7 + 1; - private static final int WEIGHT_SIZE = 20; - private static final int DATE_SIZE = 16; - - private final String dateCode; - private final String firstAIdigits; - - AI013x0x1xDecoder(BitArray information, String firstAIdigits, String dateCode) { - super(information); - this.dateCode = dateCode; - this.firstAIdigits = firstAIdigits; - } - - @Override - public String parseInformation() throws NotFoundException { - if (this.getInformation().getSize() != HEADER_SIZE + GTIN_SIZE + WEIGHT_SIZE + DATE_SIZE) { - throw NotFoundException.getNotFoundInstance(); - } - - StringBuilder buf = new StringBuilder(); - - encodeCompressedGtin(buf, HEADER_SIZE); - encodeCompressedWeight(buf, HEADER_SIZE + GTIN_SIZE, WEIGHT_SIZE); - encodeCompressedDate(buf, HEADER_SIZE + GTIN_SIZE + WEIGHT_SIZE); - - return buf.toString(); - } - - private void encodeCompressedDate(StringBuilder buf, int currentPos) { - int numericDate = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos, DATE_SIZE); - if (numericDate == 38400) { - return; - } - - buf.append('('); - buf.append(this.dateCode); - buf.append(')'); - - int day = numericDate % 32; - numericDate /= 32; - int month = numericDate % 12 + 1; - numericDate /= 12; - int year = numericDate; - - if (year / 10 == 0) { - buf.append('0'); - } - buf.append(year); - if (month / 10 == 0) { - buf.append('0'); - } - buf.append(month); - if (day / 10 == 0) { - buf.append('0'); - } - buf.append(day); - } - - @Override - protected void addWeightCode(StringBuilder buf, int weight) { - int lastAI = weight / 100000; - buf.append('('); - buf.append(this.firstAIdigits); - buf.append(lastAI); - buf.append(')'); - } - - @Override - protected int checkWeight(int weight) { - return weight % 100000; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java deleted file mode 100644 index 54d32d6..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -abstract class AI013x0xDecoder extends AI01weightDecoder { - - private static final int HEADER_SIZE = 4 + 1; - private static final int WEIGHT_SIZE = 15; - - AI013x0xDecoder(BitArray information) { - super(information); - } - - @Override - public String parseInformation() throws NotFoundException { - if (this.getInformation().getSize() != HEADER_SIZE + GTIN_SIZE + WEIGHT_SIZE) { - throw NotFoundException.getNotFoundInstance(); - } - - StringBuilder buf = new StringBuilder(); - - encodeCompressedGtin(buf, HEADER_SIZE); - encodeCompressedWeight(buf, HEADER_SIZE + GTIN_SIZE, WEIGHT_SIZE); - - return buf.toString(); - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java deleted file mode 100644 index 27222a3..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class AI01AndOtherAIs extends AI01decoder { - - private static final int HEADER_SIZE = 1 + 1 + 2; //first bit encodes the linkage flag, - //the second one is the encodation method, and the other two are for the variable length - AI01AndOtherAIs(BitArray information) { - super(information); - } - - @Override - public String parseInformation() throws NotFoundException, FormatException { - StringBuilder buff = new StringBuilder(); - - buff.append("(01)"); - int initialGtinPosition = buff.length(); - int firstGtinDigit = this.getGeneralDecoder().extractNumericValueFromBitArray(HEADER_SIZE, 4); - buff.append(firstGtinDigit); - - this.encodeCompressedGtinWithoutAI(buff, HEADER_SIZE + 4, initialGtinPosition); - - return this.getGeneralDecoder().decodeAllCodes(buff, HEADER_SIZE + 44); - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java deleted file mode 100644 index 795015c..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -abstract class AI01decoder extends AbstractExpandedDecoder { - - static final int GTIN_SIZE = 40; - - AI01decoder(BitArray information) { - super(information); - } - - final void encodeCompressedGtin(StringBuilder buf, int currentPos) { - buf.append("(01)"); - int initialPosition = buf.length(); - buf.append('9'); - - encodeCompressedGtinWithoutAI(buf, currentPos, initialPosition); - } - - final void encodeCompressedGtinWithoutAI(StringBuilder buf, int currentPos, int initialBufferPosition) { - for (int i = 0; i < 4; ++i) { - int currentBlock = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos + 10 * i, 10); - if (currentBlock / 100 == 0) { - buf.append('0'); - } - if (currentBlock / 10 == 0) { - buf.append('0'); - } - buf.append(currentBlock); - } - - appendCheckDigit(buf, initialBufferPosition); - } - - private static void appendCheckDigit(StringBuilder buf, int currentPos) { - int checkDigit = 0; - for (int i = 0; i < 13; i++) { - int digit = buf.charAt(i + currentPos) - '0'; - checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; - } - - checkDigit = 10 - (checkDigit % 10); - if (checkDigit == 10) { - checkDigit = 0; - } - - buf.append(checkDigit); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java deleted file mode 100644 index 96f9464..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -abstract class AI01weightDecoder extends AI01decoder { - - AI01weightDecoder(BitArray information) { - super(information); - } - - final void encodeCompressedWeight(StringBuilder buf, int currentPos, int weightSize) { - int originalWeightNumeric = this.getGeneralDecoder().extractNumericValueFromBitArray(currentPos, weightSize); - addWeightCode(buf, originalWeightNumeric); - - int weightNumeric = checkWeight(originalWeightNumeric); - - int currentDivisor = 100000; - for (int i = 0; i < 5; ++i) { - if (weightNumeric / currentDivisor == 0) { - buf.append('0'); - } - currentDivisor /= 10; - } - buf.append(weightNumeric); - } - - protected abstract void addWeightCode(StringBuilder buf, int weight); - - protected abstract int checkWeight(int weight); - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java deleted file mode 100644 index 771b42b..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -public abstract class AbstractExpandedDecoder { - - private final BitArray information; - private final GeneralAppIdDecoder generalDecoder; - - AbstractExpandedDecoder(BitArray information) { - this.information = information; - this.generalDecoder = new GeneralAppIdDecoder(information); - } - - protected final BitArray getInformation() { - return information; - } - - protected final GeneralAppIdDecoder getGeneralDecoder() { - return generalDecoder; - } - - public abstract String parseInformation() throws NotFoundException, FormatException; - - public static AbstractExpandedDecoder createDecoder(BitArray information) { - if (information.get(1)) { - return new AI01AndOtherAIs(information); - } - if (!information.get(2)) { - return new AnyAIDecoder(information); - } - - int fourBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 4); - - switch (fourBitEncodationMethod) { - case 4: return new AI013103decoder(information); - case 5: return new AI01320xDecoder(information); - } - - int fiveBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 5); - switch (fiveBitEncodationMethod) { - case 12: return new AI01392xDecoder(information); - case 13: return new AI01393xDecoder(information); - } - - int sevenBitEncodationMethod = GeneralAppIdDecoder.extractNumericValueFromBitArray(information, 1, 7); - switch (sevenBitEncodationMethod) { - case 56: return new AI013x0x1xDecoder(information, "310", "11"); - case 57: return new AI013x0x1xDecoder(information, "320", "11"); - case 58: return new AI013x0x1xDecoder(information, "310", "13"); - case 59: return new AI013x0x1xDecoder(information, "320", "13"); - case 60: return new AI013x0x1xDecoder(information, "310", "15"); - case 61: return new AI013x0x1xDecoder(information, "320", "15"); - case 62: return new AI013x0x1xDecoder(information, "310", "17"); - case 63: return new AI013x0x1xDecoder(information, "320", "17"); - } - - throw new IllegalStateException("unknown decoder: " + information); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java deleted file mode 100644 index 2074d8f..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class AnyAIDecoder extends AbstractExpandedDecoder { - - private static final int HEADER_SIZE = 2 + 1 + 2; - - AnyAIDecoder(BitArray information) { - super(information); - } - - @Override - public String parseInformation() throws NotFoundException, FormatException { - StringBuilder buf = new StringBuilder(); - return this.getGeneralDecoder().decodeAllCodes(buf, HEADER_SIZE); - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java deleted file mode 100644 index a959355..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class BlockParsedResult { - - private final DecodedInformation decodedInformation; - private final boolean finished; - - BlockParsedResult(boolean finished) { - this(null, finished); - } - - BlockParsedResult(DecodedInformation information, boolean finished) { - this.finished = finished; - this.decodedInformation = information; - } - - DecodedInformation getDecodedInformation() { - return this.decodedInformation; - } - - boolean isFinished() { - return this.finished; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java deleted file mode 100644 index 34e92e1..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -final class CurrentParsingState { - - private int position; - private State encoding; - - private enum State { - NUMERIC, - ALPHA, - ISO_IEC_646 - } - - CurrentParsingState() { - this.position = 0; - this.encoding = State.NUMERIC; - } - - int getPosition() { - return position; - } - - void setPosition(int position) { - this.position = position; - } - - void incrementPosition(int delta) { - position += delta; - } - - boolean isAlpha() { - return this.encoding == State.ALPHA; - } - - boolean isNumeric() { - return this.encoding == State.NUMERIC; - } - - boolean isIsoIec646() { - return this.encoding == State.ISO_IEC_646; - } - - void setNumeric() { - this.encoding = State.NUMERIC; - } - - void setAlpha() { - this.encoding = State.ALPHA; - } - - void setIsoIec646() { - this.encoding = State.ISO_IEC_646; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java deleted file mode 100644 index 2dd8995..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class DecodedChar extends DecodedObject { - - private final char value; - - static final char FNC1 = '$'; // It's not in Alphanumeric neither in ISO/IEC 646 charset - - DecodedChar(int newPosition, char value) { - super(newPosition); - this.value = value; - } - - char getValue() { - return this.value; - } - - boolean isFNC1() { - return this.value == FNC1; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java deleted file mode 100644 index 0ed90fd..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class DecodedInformation extends DecodedObject { - - private final String newString; - private final int remainingValue; - private final boolean remaining; - - DecodedInformation(int newPosition, String newString) { - super(newPosition); - this.newString = newString; - this.remaining = false; - this.remainingValue = 0; - } - - DecodedInformation(int newPosition, String newString, int remainingValue) { - super(newPosition); - this.remaining = true; - this.remainingValue = remainingValue; - this.newString = newString; - } - - String getNewString() { - return this.newString; - } - - boolean isRemaining() { - return this.remaining; - } - - int getRemainingValue() { - return this.remainingValue; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java deleted file mode 100644 index df38d94..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class DecodedNumeric extends DecodedObject { - - private final int firstDigit; - private final int secondDigit; - - static final int FNC1 = 10; - - DecodedNumeric(int newPosition, int firstDigit, int secondDigit) throws FormatException { - super(newPosition); - - if (firstDigit < 0 || firstDigit > 10 || secondDigit < 0 || secondDigit > 10) { - throw FormatException.getFormatInstance(); - } - - this.firstDigit = firstDigit; - this.secondDigit = secondDigit; - } - - int getFirstDigit() { - return this.firstDigit; - } - - int getSecondDigit() { - return this.secondDigit; - } - - int getValue() { - return this.firstDigit * 10 + this.secondDigit; - } - - boolean isFirstDigitFNC1() { - return this.firstDigit == FNC1; - } - - boolean isSecondDigitFNC1() { - return this.secondDigit == FNC1; - } - - boolean isAnyFNC1() { - return this.firstDigit == FNC1 || this.secondDigit == FNC1; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java deleted file mode 100644 index cf7d7da..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - */ -abstract class DecodedObject { - - private final int newPosition; - - DecodedObject(int newPosition) { - this.newPosition = newPosition; - } - - final int getNewPosition() { - return this.newPosition; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java deleted file mode 100644 index e273350..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.NotFoundException; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class FieldParser { - - private static final Object VARIABLE_LENGTH = new Object(); - - private static final Object [][] TWO_DIGIT_DATA_LENGTH = { - // "DIGITS", new Integer(LENGTH) - // or - // "DIGITS", VARIABLE_LENGTH, new Integer(MAX_SIZE) - - { "00", 18}, - { "01", 14}, - { "02", 14}, - - { "10", VARIABLE_LENGTH, 20}, - { "11", 6}, - { "12", 6}, - { "13", 6}, - { "15", 6}, - { "17", 6}, - - { "20", 2}, - { "21", VARIABLE_LENGTH, 20}, - { "22", VARIABLE_LENGTH, 29}, - - { "30", VARIABLE_LENGTH, 8}, - { "37", VARIABLE_LENGTH, 8}, - - //internal company codes - { "90", VARIABLE_LENGTH, 30}, - { "91", VARIABLE_LENGTH, 30}, - { "92", VARIABLE_LENGTH, 30}, - { "93", VARIABLE_LENGTH, 30}, - { "94", VARIABLE_LENGTH, 30}, - { "95", VARIABLE_LENGTH, 30}, - { "96", VARIABLE_LENGTH, 30}, - { "97", VARIABLE_LENGTH, 30}, - { "98", VARIABLE_LENGTH, 30}, - { "99", VARIABLE_LENGTH, 30}, - }; - - private static final Object [][] THREE_DIGIT_DATA_LENGTH = { - // Same format as above - - { "240", VARIABLE_LENGTH, 30}, - { "241", VARIABLE_LENGTH, 30}, - { "242", VARIABLE_LENGTH, 6}, - { "250", VARIABLE_LENGTH, 30}, - { "251", VARIABLE_LENGTH, 30}, - { "253", VARIABLE_LENGTH, 17}, - { "254", VARIABLE_LENGTH, 20}, - - { "400", VARIABLE_LENGTH, 30}, - { "401", VARIABLE_LENGTH, 30}, - { "402", 17}, - { "403", VARIABLE_LENGTH, 30}, - { "410", 13}, - { "411", 13}, - { "412", 13}, - { "413", 13}, - { "414", 13}, - { "420", VARIABLE_LENGTH, 20}, - { "421", VARIABLE_LENGTH, 15}, - { "422", 3}, - { "423", VARIABLE_LENGTH, 15}, - { "424", 3}, - { "425", 3}, - { "426", 3}, - }; - - private static final Object [][] THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH = { - // Same format as above - - { "310", 6}, - { "311", 6}, - { "312", 6}, - { "313", 6}, - { "314", 6}, - { "315", 6}, - { "316", 6}, - { "320", 6}, - { "321", 6}, - { "322", 6}, - { "323", 6}, - { "324", 6}, - { "325", 6}, - { "326", 6}, - { "327", 6}, - { "328", 6}, - { "329", 6}, - { "330", 6}, - { "331", 6}, - { "332", 6}, - { "333", 6}, - { "334", 6}, - { "335", 6}, - { "336", 6}, - { "340", 6}, - { "341", 6}, - { "342", 6}, - { "343", 6}, - { "344", 6}, - { "345", 6}, - { "346", 6}, - { "347", 6}, - { "348", 6}, - { "349", 6}, - { "350", 6}, - { "351", 6}, - { "352", 6}, - { "353", 6}, - { "354", 6}, - { "355", 6}, - { "356", 6}, - { "357", 6}, - { "360", 6}, - { "361", 6}, - { "362", 6}, - { "363", 6}, - { "364", 6}, - { "365", 6}, - { "366", 6}, - { "367", 6}, - { "368", 6}, - { "369", 6}, - { "390", VARIABLE_LENGTH, 15}, - { "391", VARIABLE_LENGTH, 18}, - { "392", VARIABLE_LENGTH, 15}, - { "393", VARIABLE_LENGTH, 18}, - { "703", VARIABLE_LENGTH, 30} - }; - - private static final Object [][] FOUR_DIGIT_DATA_LENGTH = { - // Same format as above - - { "7001", 13}, - { "7002", VARIABLE_LENGTH, 30}, - { "7003", 10}, - - { "8001", 14}, - { "8002", VARIABLE_LENGTH, 20}, - { "8003", VARIABLE_LENGTH, 30}, - { "8004", VARIABLE_LENGTH, 30}, - { "8005", 6}, - { "8006", 18}, - { "8007", VARIABLE_LENGTH, 30}, - { "8008", VARIABLE_LENGTH, 12}, - { "8018", 18}, - { "8020", VARIABLE_LENGTH, 25}, - { "8100", 6}, - { "8101", 10}, - { "8102", 2}, - { "8110", VARIABLE_LENGTH, 70}, - { "8200", VARIABLE_LENGTH, 70}, - }; - - private FieldParser() { - } - - static String parseFieldsInGeneralPurpose(String rawInformation) throws NotFoundException { - if (rawInformation.isEmpty()) { - return null; - } - - // Processing 2-digit AIs - - if (rawInformation.length() < 2) { - throw NotFoundException.getNotFoundInstance(); - } - - String firstTwoDigits = rawInformation.substring(0, 2); - - for (Object[] dataLength : TWO_DIGIT_DATA_LENGTH) { - if (dataLength[0].equals(firstTwoDigits)) { - if (dataLength[1] == VARIABLE_LENGTH) { - return processVariableAI(2, (Integer) dataLength[2], rawInformation); - } - return processFixedAI(2, (Integer) dataLength[1], rawInformation); - } - } - - if (rawInformation.length() < 3) { - throw NotFoundException.getNotFoundInstance(); - } - - String firstThreeDigits = rawInformation.substring(0, 3); - - for (Object[] dataLength : THREE_DIGIT_DATA_LENGTH) { - if (dataLength[0].equals(firstThreeDigits)) { - if (dataLength[1] == VARIABLE_LENGTH) { - return processVariableAI(3, (Integer) dataLength[2], rawInformation); - } - return processFixedAI(3, (Integer) dataLength[1], rawInformation); - } - } - - - for (Object[] dataLength : THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH) { - if (dataLength[0].equals(firstThreeDigits)) { - if (dataLength[1] == VARIABLE_LENGTH) { - return processVariableAI(4, (Integer) dataLength[2], rawInformation); - } - return processFixedAI(4, (Integer) dataLength[1], rawInformation); - } - } - - if (rawInformation.length() < 4) { - throw NotFoundException.getNotFoundInstance(); - } - - String firstFourDigits = rawInformation.substring(0, 4); - - for (Object[] dataLength : FOUR_DIGIT_DATA_LENGTH) { - if (dataLength[0].equals(firstFourDigits)) { - if (dataLength[1] == VARIABLE_LENGTH) { - return processVariableAI(4, (Integer) dataLength[2], rawInformation); - } - return processFixedAI(4, (Integer) dataLength[1], rawInformation); - } - } - - throw NotFoundException.getNotFoundInstance(); - } - - private static String processFixedAI(int aiSize, int fieldSize, String rawInformation) throws NotFoundException { - if (rawInformation.length() < aiSize) { - throw NotFoundException.getNotFoundInstance(); - } - - String ai = rawInformation.substring(0, aiSize); - - if (rawInformation.length() < aiSize + fieldSize) { - throw NotFoundException.getNotFoundInstance(); - } - - String field = rawInformation.substring(aiSize, aiSize + fieldSize); - String remaining = rawInformation.substring(aiSize + fieldSize); - String result = '(' + ai + ')' + field; - String parsedAI = parseFieldsInGeneralPurpose(remaining); - return parsedAI == null ? result : result + parsedAI; - } - - private static String processVariableAI(int aiSize, int variableFieldSize, String rawInformation) - throws NotFoundException { - String ai = rawInformation.substring(0, aiSize); - int maxSize; - if (rawInformation.length() < aiSize + variableFieldSize) { - maxSize = rawInformation.length(); - } else { - maxSize = aiSize + variableFieldSize; - } - String field = rawInformation.substring(aiSize, maxSize); - String remaining = rawInformation.substring(maxSize); - String result = '(' + ai + ')' + field; - String parsedAI = parseFieldsInGeneralPurpose(remaining); - return parsedAI == null ? result : result + parsedAI; - } -} diff --git a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java b/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java deleted file mode 100644 index f7a2457..0000000 --- a/zxing/src/main/java/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * These authors would like to acknowledge the Spanish Ministry of Industry, - * Tourism and Trade, for the support in the project TSI020301-2008-2 - * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled - * Mobile Dynamic Environments", led by Treelogic - * ( http://www.treelogic.com/ ): - * - * http://www.piramidepse.com/ - */ - -package com.google.zxing.oned.rss.expanded.decoders; - -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.common.BitArray; - -/** - * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) - * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) - */ -final class GeneralAppIdDecoder { - - private final BitArray information; - private final CurrentParsingState current = new CurrentParsingState(); - private final StringBuilder buffer = new StringBuilder(); - - GeneralAppIdDecoder(BitArray information) { - this.information = information; - } - - String decodeAllCodes(StringBuilder buff, int initialPosition) throws NotFoundException, FormatException { - int currentPosition = initialPosition; - String remaining = null; - do { - DecodedInformation info = this.decodeGeneralPurposeField(currentPosition, remaining); - String parsedFields = FieldParser.parseFieldsInGeneralPurpose(info.getNewString()); - if (parsedFields != null) { - buff.append(parsedFields); - } - if (info.isRemaining()) { - remaining = String.valueOf(info.getRemainingValue()); - } else { - remaining = null; - } - - if (currentPosition == info.getNewPosition()) { // No step forward! - break; - } - currentPosition = info.getNewPosition(); - } while (true); - - return buff.toString(); - } - - private boolean isStillNumeric(int pos) { - // It's numeric if it still has 7 positions - // and one of the first 4 bits is "1". - if (pos + 7 > this.information.getSize()) { - return pos + 4 <= this.information.getSize(); - } - - for (int i = pos; i < pos + 3; ++i) { - if (this.information.get(i)) { - return true; - } - } - - return this.information.get(pos + 3); - } - - private DecodedNumeric decodeNumeric(int pos) throws FormatException { - if (pos + 7 > this.information.getSize()) { - int numeric = extractNumericValueFromBitArray(pos, 4); - if (numeric == 0) { - return new DecodedNumeric(this.information.getSize(), DecodedNumeric.FNC1, DecodedNumeric.FNC1); - } - return new DecodedNumeric(this.information.getSize(), numeric - 1, DecodedNumeric.FNC1); - } - int numeric = extractNumericValueFromBitArray(pos, 7); - - int digit1 = (numeric - 8) / 11; - int digit2 = (numeric - 8) % 11; - - return new DecodedNumeric(pos + 7, digit1, digit2); - } - - int extractNumericValueFromBitArray(int pos, int bits) { - return extractNumericValueFromBitArray(this.information, pos, bits); - } - - static int extractNumericValueFromBitArray(BitArray information, int pos, int bits) { - int value = 0; - for (int i = 0; i < bits; ++i) { - if (information.get(pos + i)) { - value |= 1 << (bits - i - 1); - } - } - - return value; - } - - DecodedInformation decodeGeneralPurposeField(int pos, String remaining) throws FormatException { - this.buffer.setLength(0); - - if (remaining != null) { - this.buffer.append(remaining); - } - - this.current.setPosition(pos); - - DecodedInformation lastDecoded = parseBlocks(); - if (lastDecoded != null && lastDecoded.isRemaining()) { - return new DecodedInformation(this.current.getPosition(), this.buffer.toString(), lastDecoded.getRemainingValue()); - } - return new DecodedInformation(this.current.getPosition(), this.buffer.toString()); - } - - private DecodedInformation parseBlocks() throws FormatException { - boolean isFinished; - BlockParsedResult result; - do { - int initialPosition = current.getPosition(); - - if (current.isAlpha()) { - result = parseAlphaBlock(); - isFinished = result.isFinished(); - } else if (current.isIsoIec646()) { - result = parseIsoIec646Block(); - isFinished = result.isFinished(); - } else { // it must be numeric - result = parseNumericBlock(); - isFinished = result.isFinished(); - } - - boolean positionChanged = initialPosition != current.getPosition(); - if (!positionChanged && !isFinished) { - break; - } - } while (!isFinished); - - return result.getDecodedInformation(); - } - - private BlockParsedResult parseNumericBlock() throws FormatException { - while (isStillNumeric(current.getPosition())) { - DecodedNumeric numeric = decodeNumeric(current.getPosition()); - current.setPosition(numeric.getNewPosition()); - - if (numeric.isFirstDigitFNC1()) { - DecodedInformation information; - if (numeric.isSecondDigitFNC1()) { - information = new DecodedInformation(current.getPosition(), buffer.toString()); - } else { - information = new DecodedInformation(current.getPosition(), buffer.toString(), numeric.getSecondDigit()); - } - return new BlockParsedResult(information, true); - } - buffer.append(numeric.getFirstDigit()); - - if (numeric.isSecondDigitFNC1()) { - DecodedInformation information = new DecodedInformation(current.getPosition(), buffer.toString()); - return new BlockParsedResult(information, true); - } - buffer.append(numeric.getSecondDigit()); - } - - if (isNumericToAlphaNumericLatch(current.getPosition())) { - current.setAlpha(); - current.incrementPosition(4); - } - return new BlockParsedResult(false); - } - - private BlockParsedResult parseIsoIec646Block() throws FormatException { - while (isStillIsoIec646(current.getPosition())) { - DecodedChar iso = decodeIsoIec646(current.getPosition()); - current.setPosition(iso.getNewPosition()); - - if (iso.isFNC1()) { - DecodedInformation information = new DecodedInformation(current.getPosition(), buffer.toString()); - return new BlockParsedResult(information, true); - } - buffer.append(iso.getValue()); - } - - if (isAlphaOr646ToNumericLatch(current.getPosition())) { - current.incrementPosition(3); - current.setNumeric(); - } else if (isAlphaTo646ToAlphaLatch(current.getPosition())) { - if (current.getPosition() + 5 < this.information.getSize()) { - current.incrementPosition(5); - } else { - current.setPosition(this.information.getSize()); - } - - current.setAlpha(); - } - return new BlockParsedResult(false); - } - - private BlockParsedResult parseAlphaBlock() { - while (isStillAlpha(current.getPosition())) { - DecodedChar alpha = decodeAlphanumeric(current.getPosition()); - current.setPosition(alpha.getNewPosition()); - - if (alpha.isFNC1()) { - DecodedInformation information = new DecodedInformation(current.getPosition(), buffer.toString()); - return new BlockParsedResult(information, true); //end of the char block - } - - buffer.append(alpha.getValue()); - } - - if (isAlphaOr646ToNumericLatch(current.getPosition())) { - current.incrementPosition(3); - current.setNumeric(); - } else if (isAlphaTo646ToAlphaLatch(current.getPosition())) { - if (current.getPosition() + 5 < this.information.getSize()) { - current.incrementPosition(5); - } else { - current.setPosition(this.information.getSize()); - } - - current.setIsoIec646(); - } - return new BlockParsedResult(false); - } - - private boolean isStillIsoIec646(int pos) { - if (pos + 5 > this.information.getSize()) { - return false; - } - - int fiveBitValue = extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue >= 5 && fiveBitValue < 16) { - return true; - } - - if (pos + 7 > this.information.getSize()) { - return false; - } - - int sevenBitValue = extractNumericValueFromBitArray(pos, 7); - if (sevenBitValue >= 64 && sevenBitValue < 116) { - return true; - } - - if (pos + 8 > this.information.getSize()) { - return false; - } - - int eightBitValue = extractNumericValueFromBitArray(pos, 8); - return eightBitValue >= 232 && eightBitValue < 253; - - } - - private DecodedChar decodeIsoIec646(int pos) throws FormatException { - int fiveBitValue = extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue == 15) { - return new DecodedChar(pos + 5, DecodedChar.FNC1); - } - - if (fiveBitValue >= 5 && fiveBitValue < 15) { - return new DecodedChar(pos + 5, (char) ('0' + fiveBitValue - 5)); - } - - int sevenBitValue = extractNumericValueFromBitArray(pos, 7); - - if (sevenBitValue >= 64 && sevenBitValue < 90) { - return new DecodedChar(pos + 7, (char) (sevenBitValue + 1)); - } - - if (sevenBitValue >= 90 && sevenBitValue < 116) { - return new DecodedChar(pos + 7, (char) (sevenBitValue + 7)); - } - - int eightBitValue = extractNumericValueFromBitArray(pos, 8); - char c; - switch (eightBitValue) { - case 232: - c = '!'; - break; - case 233: - c = '"'; - break; - case 234: - c = '%'; - break; - case 235: - c = '&'; - break; - case 236: - c = '\''; - break; - case 237: - c = '('; - break; - case 238: - c = ')'; - break; - case 239: - c = '*'; - break; - case 240: - c = '+'; - break; - case 241: - c = ','; - break; - case 242: - c = '-'; - break; - case 243: - c = '.'; - break; - case 244: - c = '/'; - break; - case 245: - c = ':'; - break; - case 246: - c = ';'; - break; - case 247: - c = '<'; - break; - case 248: - c = '='; - break; - case 249: - c = '>'; - break; - case 250: - c = '?'; - break; - case 251: - c = '_'; - break; - case 252: - c = ' '; - break; - default: - throw FormatException.getFormatInstance(); - } - return new DecodedChar(pos + 8, c); - } - - private boolean isStillAlpha(int pos) { - if (pos + 5 > this.information.getSize()) { - return false; - } - - // We now check if it's a valid 5-bit value (0..9 and FNC1) - int fiveBitValue = extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue >= 5 && fiveBitValue < 16) { - return true; - } - - if (pos + 6 > this.information.getSize()) { - return false; - } - - int sixBitValue = extractNumericValueFromBitArray(pos, 6); - return sixBitValue >= 16 && sixBitValue < 63; // 63 not included - } - - private DecodedChar decodeAlphanumeric(int pos) { - int fiveBitValue = extractNumericValueFromBitArray(pos, 5); - if (fiveBitValue == 15) { - return new DecodedChar(pos + 5, DecodedChar.FNC1); - } - - if (fiveBitValue >= 5 && fiveBitValue < 15) { - return new DecodedChar(pos + 5, (char) ('0' + fiveBitValue - 5)); - } - - int sixBitValue = extractNumericValueFromBitArray(pos, 6); - - if (sixBitValue >= 32 && sixBitValue < 58) { - return new DecodedChar(pos + 6, (char) (sixBitValue + 33)); - } - - char c; - switch (sixBitValue) { - case 58: - c = '*'; - break; - case 59: - c = ','; - break; - case 60: - c = '-'; - break; - case 61: - c = '.'; - break; - case 62: - c = '/'; - break; - default: - throw new IllegalStateException("Decoding invalid alphanumeric value: " + sixBitValue); - } - return new DecodedChar(pos + 6, c); - } - - private boolean isAlphaTo646ToAlphaLatch(int pos) { - if (pos + 1 > this.information.getSize()) { - return false; - } - - for (int i = 0; i < 5 && i + pos < this.information.getSize(); ++i) { - if (i == 2) { - if (!this.information.get(pos + 2)) { - return false; - } - } else if (this.information.get(pos + i)) { - return false; - } - } - - return true; - } - - private boolean isAlphaOr646ToNumericLatch(int pos) { - // Next is alphanumeric if there are 3 positions and they are all zeros - if (pos + 3 > this.information.getSize()) { - return false; - } - - for (int i = pos; i < pos + 3; ++i) { - if (this.information.get(i)) { - return false; - } - } - return true; - } - - private boolean isNumericToAlphaNumericLatch(int pos) { - // Next is alphanumeric if there are 4 positions and they are all zeros, or - // if there is a subset of this just before the end of the symbol - if (pos + 1 > this.information.getSize()) { - return false; - } - - for (int i = 0; i < 4 && i + pos < this.information.getSize(); ++i) { - if (this.information.get(pos + i)) { - return false; - } - } - return true; - } -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Common.java b/zxing/src/main/java/com/google/zxing/pdf417/PDF417Common.java deleted file mode 100644 index 5e7cafd..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Common.java +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.zxing.pdf417; - -import java.util.Arrays; -import java.util.Collection; - -import com.google.zxing.common.detector.MathUtils; - -/** - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author Guenther Grau - */ -public final class PDF417Common { - - public static final int NUMBER_OF_CODEWORDS = 929; - // Maximum Codewords (Data + Error). - public static final int MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1; - public static final int MIN_ROWS_IN_BARCODE = 3; - public static final int MAX_ROWS_IN_BARCODE = 90; - // One left row indication column + max 30 data columns + one right row indicator column - //public static final int MAX_CODEWORDS_IN_ROW = 32; - public static final int MODULES_IN_CODEWORD = 17; - public static final int MODULES_IN_STOP_PATTERN = 18; - public static final int BARS_IN_MODULE = 8; - - private static final int[] EMPTY_INT_ARRAY = {}; - - private PDF417Common() { - } - - /** - * @param moduleBitCount values to sum - * @return sum of values - * @deprecated call {@link MathUtils#sum(int[])} - */ - @Deprecated - public static int getBitCountSum(int[] moduleBitCount) { - return MathUtils.sum(moduleBitCount); - } - - public static int[] toIntArray(Collection list) { - if (list == null || list.isEmpty()) { - return EMPTY_INT_ARRAY; - } - int[] result = new int[list.size()]; - int i = 0; - for (Integer integer : list) { - result[i++] = integer; - } - return result; - } - - /** - * @param symbol encoded symbol to translate to a codeword - * @return the codeword corresponding to the symbol. - */ - public static int getCodeword(int symbol) { - int i = Arrays.binarySearch(SYMBOL_TABLE, symbol & 0x3FFFF); - if (i < 0) { - return -1; - } - return (CODEWORD_TABLE[i] - 1) % NUMBER_OF_CODEWORDS; - } - - /** - * The sorted table of all possible symbols. Extracted from the PDF417 - * specification. The index of a symbol in this table corresponds to the - * index into the codeword table. - */ - public static final int[] SYMBOL_TABLE = { - 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, - 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, - 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, - 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, - 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, - 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, - 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, - 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, - 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, - 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, - 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, - 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, - 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, - 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, - 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, - 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, - 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, - 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, - 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, - 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, - 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, - 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, - 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, - 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, - 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, - 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, - 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, - 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, - 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, - 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, - 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, - 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, - 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, - 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, - 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, - 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, - 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, - 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, - 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, - 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, - 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, - 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, - 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, - 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, - 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, - 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, - 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, - 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, - 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, - 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, - 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, - 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, - 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, - 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, - 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, - 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, - 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, - 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, - 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, - 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, - 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, - 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, - 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, - 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, - 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, - 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, - 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, - 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, - 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, - 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, - 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, - 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, - 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, - 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, - 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, - 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, - 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, - 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, - 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, - 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, - 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, - 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, - 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, - 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, - 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, - 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, - 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, - 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, - 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, - 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, - 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, - 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, - 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, - 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, - 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, - 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, - 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, - 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, - 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, - 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, - 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, - 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, - 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, - 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, - 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, - 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, - 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, - 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, - 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, - 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, - 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, - 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, - 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, - 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, - 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, - 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, - 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, - 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, - 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, - 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, - 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, - 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, - 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, - 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, - 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, - 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, - 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, - 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, - 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, - 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, - 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, - 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, - 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, - 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, - 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, - 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, - 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, - 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, - 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, - 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, - 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, - 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, - 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, - 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, - 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, - 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, - 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, - 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, - 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, - 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, - 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, - 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, - 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, - 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, - 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, - 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, - 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, - 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, - 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, - 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, - 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, - 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, - 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, - 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, - 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, - 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, - 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, - 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, - 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, - 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, - 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, - 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, - 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, - 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, - 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, - 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, - 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, - 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, - 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, - 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, - 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, - 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, - 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, - 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, - 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, - 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, - 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, - 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, - 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, - 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, - 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, - 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, - 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, - 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, - 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, - 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, - 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, - 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, - 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, - 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, - 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, - 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, - 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, - 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, - 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, - 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, - 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, - 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, - 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, - 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, - 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, - 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, - 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, - 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, - 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, - 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, - 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, - 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, - 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, - 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, - 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, - 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, - 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, - 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, - 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, - 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, - 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, - 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, - 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, - 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, - 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, - 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, - 0x1fba8, 0x1fbb6, 0x1fbda}; - - /** - * This table contains to codewords for all symbols. - */ - private static final int[] CODEWORD_TABLE = { - 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, - 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, - 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, - 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, - 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, - 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, - 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, - 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, - 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, - 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, - 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, - 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, - 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, - 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, - 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, - 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, - 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, - 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, - 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, - 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, - 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, - 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, - 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, - 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, - 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, - 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, - 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, - 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, - 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, - 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, - 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, - 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, - 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, - 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, - 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, - 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, - 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, - 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, - 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, - 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, - 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, - 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, - 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, - 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, - 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, - 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, - 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, - 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, - 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, - 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, - 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, - 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, - 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, - 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, - 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, - 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, - 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, - 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, - 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, - 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, - 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, - 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, - 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, - 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, - 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, - 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, - 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, - 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, - 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, - 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, - 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, - 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, - 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, - 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, - 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, - 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, - 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, - 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, - 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, - 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, - 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, - 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, - 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, - 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, - 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, - 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, - 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, - 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, - 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, - 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, - 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, - 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, - 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, - 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, - 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, - 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, - 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, - 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, - 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, - 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, - 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, - 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, - 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, - 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, - 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, - 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, - 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, - 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, - 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, - 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, - 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, - 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, - 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, - 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, - 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, - 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, - 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, - 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, - 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, - 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, - 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, - 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, - 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, - 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, - 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, - 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, - 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, - 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, - 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, - 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, - 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, - 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, - 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, - 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, - 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, - 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, - 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, - 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, - 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, - 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700}; -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Reader.java b/zxing/src/main/java/com/google/zxing/pdf417/PDF417Reader.java deleted file mode 100644 index c0eeb28..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Reader.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.multi.MultipleBarcodeReader; -import com.google.zxing.pdf417.decoder.PDF417ScanningDecoder; -import com.google.zxing.pdf417.detector.Detector; -import com.google.zxing.pdf417.detector.PDF417DetectorResult; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * This implementation can detect and decode PDF417 codes in an image. - * - * @author Guenther Grau - */ -public final class PDF417Reader implements Reader, MultipleBarcodeReader { - - /** - * Locates and decodes a PDF417 code in an image. - * - * @return a String representing the content encoded by the PDF417 code - * @throws NotFoundException if a PDF417 code cannot be found, - * @throws FormatException if a PDF417 cannot be decoded - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, FormatException, ChecksumException { - return decode(image, null); - } - - @Override - public Result decode(BinaryBitmap image, Map hints) throws NotFoundException, FormatException, - ChecksumException { - Result[] result = decode(image, hints, false); - if (result == null || result.length == 0 || result[0] == null) { - throw NotFoundException.getNotFoundInstance(); - } - return result[0]; - } - - @Override - public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException { - return decodeMultiple(image, null); - } - - @Override - public Result[] decodeMultiple(BinaryBitmap image, Map hints) throws NotFoundException { - try { - return decode(image, hints, true); - } catch (FormatException | ChecksumException ignored) { - throw NotFoundException.getNotFoundInstance(); - } - } - - private static Result[] decode(BinaryBitmap image, Map hints, boolean multiple) - throws NotFoundException, FormatException, ChecksumException { - List results = new ArrayList<>(); - PDF417DetectorResult detectorResult = Detector.detect(image, hints, multiple); - for (ResultPoint[] points : detectorResult.getPoints()) { - DecoderResult decoderResult = PDF417ScanningDecoder.decode(detectorResult.getBits(), points[4], points[5], - points[6], points[7], getMinCodewordWidth(points), getMaxCodewordWidth(points)); - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, BarcodeFormat.PDF_417); - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, decoderResult.getECLevel()); - PDF417ResultMetadata pdf417ResultMetadata = (PDF417ResultMetadata) decoderResult.getOther(); - if (pdf417ResultMetadata != null) { - result.putMetadata(ResultMetadataType.PDF417_EXTRA_METADATA, pdf417ResultMetadata); - } - results.add(result); - } - return results.toArray(new Result[results.size()]); - } - - private static int getMaxWidth(ResultPoint p1, ResultPoint p2) { - if (p1 == null || p2 == null) { - return 0; - } - return (int) Math.abs(p1.getX() - p2.getX()); - } - - private static int getMinWidth(ResultPoint p1, ResultPoint p2) { - if (p1 == null || p2 == null) { - return Integer.MAX_VALUE; - } - return (int) Math.abs(p1.getX() - p2.getX()); - } - - private static int getMaxCodewordWidth(ResultPoint[] p) { - return Math.max( - Math.max(getMaxWidth(p[0], p[4]), getMaxWidth(p[6], p[2]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN), - Math.max(getMaxWidth(p[1], p[5]), getMaxWidth(p[7], p[3]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN)); - } - - private static int getMinCodewordWidth(ResultPoint[] p) { - return Math.min( - Math.min(getMinWidth(p[0], p[4]), getMinWidth(p[6], p[2]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN), - Math.min(getMinWidth(p[1], p[5]), getMinWidth(p[7], p[3]) * PDF417Common.MODULES_IN_CODEWORD / - PDF417Common.MODULES_IN_STOP_PATTERN)); - } - - @Override - public void reset() { - // nothing needs to be reset - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/PDF417ResultMetadata.java b/zxing/src/main/java/com/google/zxing/pdf417/PDF417ResultMetadata.java deleted file mode 100644 index 2e1c4ee..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/PDF417ResultMetadata.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417; - -/** - * @author Guenther Grau - */ -public final class PDF417ResultMetadata { - - private int segmentIndex; - private String fileId; - private int[] optionalData; - private boolean lastSegment; - - public int getSegmentIndex() { - return segmentIndex; - } - - public void setSegmentIndex(int segmentIndex) { - this.segmentIndex = segmentIndex; - } - - public String getFileId() { - return fileId; - } - - public void setFileId(String fileId) { - this.fileId = fileId; - } - - public int[] getOptionalData() { - return optionalData; - } - - public void setOptionalData(int[] optionalData) { - this.optionalData = optionalData; - } - - public boolean isLastSegment() { - return lastSegment; - } - - public void setLastSegment(boolean lastSegment) { - this.lastSegment = lastSegment; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Writer.java b/zxing/src/main/java/com/google/zxing/pdf417/PDF417Writer.java deleted file mode 100644 index 0002250..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/PDF417Writer.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.pdf417.encoder.Compaction; -import com.google.zxing.pdf417.encoder.Dimensions; -import com.google.zxing.pdf417.encoder.PDF417; - -import java.nio.charset.Charset; -import java.util.Map; - -/** - * @author Jacob Haynes - * @author qwandor@google.com (Andrew Walbran) - */ -public final class PDF417Writer implements Writer { - - /** - * default white space (margin) around the code - */ - static final int WHITE_SPACE = 30; - - /** - * default error correction level - */ - static final int DEFAULT_ERROR_CORRECTION_LEVEL = 2; - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - if (format != BarcodeFormat.PDF_417) { - throw new IllegalArgumentException("Can only encode PDF_417, but got " + format); - } - - PDF417 encoder = new PDF417(); - int margin = WHITE_SPACE; - int errorCorrectionLevel = DEFAULT_ERROR_CORRECTION_LEVEL; - - if (hints != null) { - if (hints.containsKey(EncodeHintType.PDF417_COMPACT)) { - encoder.setCompact(Boolean.valueOf(hints.get(EncodeHintType.PDF417_COMPACT).toString())); - } - if (hints.containsKey(EncodeHintType.PDF417_COMPACTION)) { - encoder.setCompaction(Compaction.valueOf(hints.get(EncodeHintType.PDF417_COMPACTION).toString())); - } - if (hints.containsKey(EncodeHintType.PDF417_DIMENSIONS)) { - Dimensions dimensions = (Dimensions) hints.get(EncodeHintType.PDF417_DIMENSIONS); - encoder.setDimensions(dimensions.getMaxCols(), - dimensions.getMinCols(), - dimensions.getMaxRows(), - dimensions.getMinRows()); - } - if (hints.containsKey(EncodeHintType.MARGIN)) { - margin = Integer.parseInt(hints.get(EncodeHintType.MARGIN).toString()); - } - if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) { - errorCorrectionLevel = Integer.parseInt(hints.get(EncodeHintType.ERROR_CORRECTION).toString()); - } - if (hints.containsKey(EncodeHintType.CHARACTER_SET)) { - Charset encoding = Charset.forName(hints.get(EncodeHintType.CHARACTER_SET).toString()); - encoder.setEncoding(encoding); - } - } - - return bitMatrixFromEncoder(encoder, contents, errorCorrectionLevel, width, height, margin); - } - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height) throws WriterException { - return encode(contents, format, width, height, null); - } - - /** - * Takes encoder, accounts for width/height, and retrieves bit matrix - */ - private static BitMatrix bitMatrixFromEncoder(PDF417 encoder, - String contents, - int errorCorrectionLevel, - int width, - int height, - int margin) throws WriterException { - encoder.generateBarcodeLogic(contents, errorCorrectionLevel); - - int aspectRatio = 4; - byte[][] originalScale = encoder.getBarcodeMatrix().getScaledMatrix(1, aspectRatio); - boolean rotated = false; - if ((height > width) ^ (originalScale[0].length < originalScale.length)) { - originalScale = rotateArray(originalScale); - rotated = true; - } - - int scaleX = width / originalScale[0].length; - int scaleY = height / originalScale.length; - - int scale; - if (scaleX < scaleY) { - scale = scaleX; - } else { - scale = scaleY; - } - - if (scale > 1) { - byte[][] scaledMatrix = - encoder.getBarcodeMatrix().getScaledMatrix(scale, scale * aspectRatio); - if (rotated) { - scaledMatrix = rotateArray(scaledMatrix); - } - return bitMatrixFrombitArray(scaledMatrix, margin); - } - return bitMatrixFrombitArray(originalScale, margin); - } - - /** - * This takes an array holding the values of the PDF 417 - * - * @param input a byte array of information with 0 is black, and 1 is white - * @param margin border around the barcode - * @return BitMatrix of the input - */ - private static BitMatrix bitMatrixFrombitArray(byte[][] input, int margin) { - // Creates the bitmatrix with extra space for whitespace - BitMatrix output = new BitMatrix(input[0].length + 2 * margin, input.length + 2 * margin); - output.clear(); - for (int y = 0, yOutput = output.getHeight() - margin - 1; y < input.length; y++, yOutput--) { - for (int x = 0; x < input[0].length; x++) { - // Zero is white in the bytematrix - if (input[y][x] == 1) { - output.set(x + margin, yOutput); - } - } - } - return output; - } - - /** - * Takes and rotates the it 90 degrees - */ - private static byte[][] rotateArray(byte[][] bitarray) { - byte[][] temp = new byte[bitarray[0].length][bitarray.length]; - for (int ii = 0; ii < bitarray.length; ii++) { - // This makes the direction consistent on screen when rotating the - // screen; - int inverseii = bitarray.length - ii - 1; - for (int jj = 0; jj < bitarray[0].length; jj++) { - temp[jj][inverseii] = bitarray[ii][jj]; - } - } - return temp; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeMetadata.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeMetadata.java deleted file mode 100644 index 9c1acbf..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeMetadata.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -/** - * @author Guenther Grau - */ -final class BarcodeMetadata { - - private final int columnCount; - private final int errorCorrectionLevel; - private final int rowCountUpperPart; - private final int rowCountLowerPart; - private final int rowCount; - - BarcodeMetadata(int columnCount, int rowCountUpperPart, int rowCountLowerPart, int errorCorrectionLevel) { - this.columnCount = columnCount; - this.errorCorrectionLevel = errorCorrectionLevel; - this.rowCountUpperPart = rowCountUpperPart; - this.rowCountLowerPart = rowCountLowerPart; - this.rowCount = rowCountUpperPart + rowCountLowerPart; - } - - int getColumnCount() { - return columnCount; - } - - int getErrorCorrectionLevel() { - return errorCorrectionLevel; - } - - int getRowCount() { - return rowCount; - } - - int getRowCountUpperPart() { - return rowCountUpperPart; - } - - int getRowCountLowerPart() { - return rowCountLowerPart; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeValue.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeValue.java deleted file mode 100644 index 79a8d23..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BarcodeValue.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.pdf417.PDF417Common; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -/** - * @author Guenther Grau - */ -final class BarcodeValue { - private final Map values = new HashMap<>(); - - /** - * Add an occurrence of a value - */ - void setValue(int value) { - Integer confidence = values.get(value); - if (confidence == null) { - confidence = 0; - } - confidence++; - values.put(value, confidence); - } - - /** - * Determines the maximum occurrence of a set value and returns all values which were set with this occurrence. - * @return an array of int, containing the values with the highest occurrence, or null, if no value was set - */ - int[] getValue() { - int maxConfidence = -1; - Collection result = new ArrayList<>(); - for (Entry entry : values.entrySet()) { - if (entry.getValue() > maxConfidence) { - maxConfidence = entry.getValue(); - result.clear(); - result.add(entry.getKey()); - } else if (entry.getValue() == maxConfidence) { - result.add(entry.getKey()); - } - } - return PDF417Common.toIntArray(result); - } - - public Integer getConfidence(int value) { - return values.get(value); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BoundingBox.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/BoundingBox.java deleted file mode 100644 index b773145..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/BoundingBox.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; - -/** - * @author Guenther Grau - */ -final class BoundingBox { - - private BitMatrix image; - private ResultPoint topLeft; - private ResultPoint bottomLeft; - private ResultPoint topRight; - private ResultPoint bottomRight; - private int minX; - private int maxX; - private int minY; - private int maxY; - - BoundingBox(BitMatrix image, - ResultPoint topLeft, - ResultPoint bottomLeft, - ResultPoint topRight, - ResultPoint bottomRight) throws NotFoundException { - if ((topLeft == null && topRight == null) || - (bottomLeft == null && bottomRight == null) || - (topLeft != null && bottomLeft == null) || - (topRight != null && bottomRight == null)) { - throw NotFoundException.getNotFoundInstance(); - } - init(image, topLeft, bottomLeft, topRight, bottomRight); - } - - BoundingBox(BoundingBox boundingBox) { - init(boundingBox.image, boundingBox.topLeft, boundingBox.bottomLeft, boundingBox.topRight, boundingBox.bottomRight); - } - - private void init(BitMatrix image, - ResultPoint topLeft, - ResultPoint bottomLeft, - ResultPoint topRight, - ResultPoint bottomRight) { - this.image = image; - this.topLeft = topLeft; - this.bottomLeft = bottomLeft; - this.topRight = topRight; - this.bottomRight = bottomRight; - calculateMinMaxValues(); - } - - static BoundingBox merge(BoundingBox leftBox, BoundingBox rightBox) throws NotFoundException { - if (leftBox == null) { - return rightBox; - } - if (rightBox == null) { - return leftBox; - } - return new BoundingBox(leftBox.image, leftBox.topLeft, leftBox.bottomLeft, rightBox.topRight, rightBox.bottomRight); - } - - BoundingBox addMissingRows(int missingStartRows, int missingEndRows, boolean isLeft) throws NotFoundException { - ResultPoint newTopLeft = topLeft; - ResultPoint newBottomLeft = bottomLeft; - ResultPoint newTopRight = topRight; - ResultPoint newBottomRight = bottomRight; - - if (missingStartRows > 0) { - ResultPoint top = isLeft ? topLeft : topRight; - int newMinY = (int) top.getY() - missingStartRows; - if (newMinY < 0) { - newMinY = 0; - } - ResultPoint newTop = new ResultPoint(top.getX(), newMinY); - if (isLeft) { - newTopLeft = newTop; - } else { - newTopRight = newTop; - } - } - - if (missingEndRows > 0) { - ResultPoint bottom = isLeft ? bottomLeft : bottomRight; - int newMaxY = (int) bottom.getY() + missingEndRows; - if (newMaxY >= image.getHeight()) { - newMaxY = image.getHeight() - 1; - } - ResultPoint newBottom = new ResultPoint(bottom.getX(), newMaxY); - if (isLeft) { - newBottomLeft = newBottom; - } else { - newBottomRight = newBottom; - } - } - - calculateMinMaxValues(); - return new BoundingBox(image, newTopLeft, newBottomLeft, newTopRight, newBottomRight); - } - - private void calculateMinMaxValues() { - if (topLeft == null) { - topLeft = new ResultPoint(0, topRight.getY()); - bottomLeft = new ResultPoint(0, bottomRight.getY()); - } else if (topRight == null) { - topRight = new ResultPoint(image.getWidth() - 1, topLeft.getY()); - bottomRight = new ResultPoint(image.getWidth() - 1, bottomLeft.getY()); - } - - minX = (int) Math.min(topLeft.getX(), bottomLeft.getX()); - maxX = (int) Math.max(topRight.getX(), bottomRight.getX()); - minY = (int) Math.min(topLeft.getY(), topRight.getY()); - maxY = (int) Math.max(bottomLeft.getY(), bottomRight.getY()); - } - - /* - void setTopRight(ResultPoint topRight) { - this.topRight = topRight; - calculateMinMaxValues(); - } - - void setBottomRight(ResultPoint bottomRight) { - this.bottomRight = bottomRight; - calculateMinMaxValues(); - } - */ - - int getMinX() { - return minX; - } - - int getMaxX() { - return maxX; - } - - int getMinY() { - return minY; - } - - int getMaxY() { - return maxY; - } - - ResultPoint getTopLeft() { - return topLeft; - } - - ResultPoint getTopRight() { - return topRight; - } - - ResultPoint getBottomLeft() { - return bottomLeft; - } - - ResultPoint getBottomRight() { - return bottomRight; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/Codeword.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/Codeword.java deleted file mode 100644 index bb5477d..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/Codeword.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -/** - * @author Guenther Grau - */ -final class Codeword { - - private static final int BARCODE_ROW_UNKNOWN = -1; - - private final int startX; - private final int endX; - private final int bucket; - private final int value; - private int rowNumber = BARCODE_ROW_UNKNOWN; - - Codeword(int startX, int endX, int bucket, int value) { - this.startX = startX; - this.endX = endX; - this.bucket = bucket; - this.value = value; - } - - boolean hasValidRowNumber() { - return isValidRowNumber(rowNumber); - } - - boolean isValidRowNumber(int rowNumber) { - return rowNumber != BARCODE_ROW_UNKNOWN && bucket == (rowNumber % 3) * 3; - } - - void setRowNumberAsRowIndicatorColumn() { - rowNumber = (value / 30) * 3 + bucket / 3; - } - - int getWidth() { - return endX - startX; - } - - int getStartX() { - return startX; - } - - int getEndX() { - return endX; - } - - int getBucket() { - return bucket; - } - - int getValue() { - return value; - } - - int getRowNumber() { - return rowNumber; - } - - void setRowNumber(int rowNumber) { - this.rowNumber = rowNumber; - } - - @Override - public String toString() { - return rowNumber + "|" + value; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java deleted file mode 100644 index bf62180..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java +++ /dev/null @@ -1,637 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.common.CharacterSetECI; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.pdf417.PDF417ResultMetadata; - -import java.io.ByteArrayOutputStream; -import java.math.BigInteger; -import java.nio.charset.Charset; -import java.util.Arrays; - -/** - *

    This class contains the methods for decoding the PDF417 codewords.

    - * - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author Guenther Grau - */ -final class DecodedBitStreamParser { - - private enum Mode { - ALPHA, - LOWER, - MIXED, - PUNCT, - ALPHA_SHIFT, - PUNCT_SHIFT - } - - private static final int TEXT_COMPACTION_MODE_LATCH = 900; - private static final int BYTE_COMPACTION_MODE_LATCH = 901; - private static final int NUMERIC_COMPACTION_MODE_LATCH = 902; - private static final int BYTE_COMPACTION_MODE_LATCH_6 = 924; - private static final int ECI_USER_DEFINED = 925; - private static final int ECI_GENERAL_PURPOSE = 926; - private static final int ECI_CHARSET = 927; - private static final int BEGIN_MACRO_PDF417_CONTROL_BLOCK = 928; - private static final int BEGIN_MACRO_PDF417_OPTIONAL_FIELD = 923; - private static final int MACRO_PDF417_TERMINATOR = 922; - private static final int MODE_SHIFT_TO_BYTE_COMPACTION_MODE = 913; - private static final int MAX_NUMERIC_CODEWORDS = 15; - - private static final int PL = 25; - private static final int LL = 27; - private static final int AS = 27; - private static final int ML = 28; - private static final int AL = 28; - private static final int PS = 29; - private static final int PAL = 29; - - private static final char[] PUNCT_CHARS = - ";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'".toCharArray(); - - private static final char[] MIXED_CHARS = - "0123456789&\r\t,:#-.$/+%*=^".toCharArray(); - - private static final Charset DEFAULT_ENCODING = Charset.forName("ISO-8859-1"); - - /** - * Table containing values for the exponent of 900. - * This is used in the numeric compaction decode algorithm. - */ - private static final BigInteger[] EXP900; - static { - EXP900 = new BigInteger[16]; - EXP900[0] = BigInteger.ONE; - BigInteger nineHundred = BigInteger.valueOf(900); - EXP900[1] = nineHundred; - for (int i = 2; i < EXP900.length; i++) { - EXP900[i] = EXP900[i - 1].multiply(nineHundred); - } - } - - private static final int NUMBER_OF_SEQUENCE_CODEWORDS = 2; - - private DecodedBitStreamParser() { - } - - static DecoderResult decode(int[] codewords, String ecLevel) throws FormatException { - StringBuilder result = new StringBuilder(codewords.length * 2); - Charset encoding = DEFAULT_ENCODING; - // Get compaction mode - int codeIndex = 1; - int code = codewords[codeIndex++]; - PDF417ResultMetadata resultMetadata = new PDF417ResultMetadata(); - while (codeIndex < codewords[0]) { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - codeIndex = textCompaction(codewords, codeIndex, result); - break; - case BYTE_COMPACTION_MODE_LATCH: - case BYTE_COMPACTION_MODE_LATCH_6: - codeIndex = byteCompaction(code, codewords, encoding, codeIndex, result); - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - result.append((char) codewords[codeIndex++]); - break; - case NUMERIC_COMPACTION_MODE_LATCH: - codeIndex = numericCompaction(codewords, codeIndex, result); - break; - case ECI_CHARSET: - CharacterSetECI charsetECI = - CharacterSetECI.getCharacterSetECIByValue(codewords[codeIndex++]); - encoding = Charset.forName(charsetECI.name()); - break; - case ECI_GENERAL_PURPOSE: - // Can't do anything with generic ECI; skip its 2 characters - codeIndex += 2; - break; - case ECI_USER_DEFINED: - // Can't do anything with user ECI; skip its 1 character - codeIndex ++; - break; - case BEGIN_MACRO_PDF417_CONTROL_BLOCK: - codeIndex = decodeMacroBlock(codewords, codeIndex, resultMetadata); - break; - case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case MACRO_PDF417_TERMINATOR: - // Should not see these outside a macro block - throw FormatException.getFormatInstance(); - default: - // Default to text compaction. During testing numerous barcodes - // appeared to be missing the starting mode. In these cases defaulting - // to text compaction seems to work. - codeIndex--; - codeIndex = textCompaction(codewords, codeIndex, result); - break; - } - if (codeIndex < codewords.length) { - code = codewords[codeIndex++]; - } else { - throw FormatException.getFormatInstance(); - } - } - if (result.length() == 0) { - throw FormatException.getFormatInstance(); - } - DecoderResult decoderResult = new DecoderResult(null, result.toString(), null, ecLevel); - decoderResult.setOther(resultMetadata); - return decoderResult; - } - - private static int decodeMacroBlock(int[] codewords, int codeIndex, PDF417ResultMetadata resultMetadata) - throws FormatException { - if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { - // we must have at least two bytes left for the segment index - throw FormatException.getFormatInstance(); - } - int[] segmentIndexArray = new int[NUMBER_OF_SEQUENCE_CODEWORDS]; - for (int i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { - segmentIndexArray[i] = codewords[codeIndex]; - } - resultMetadata.setSegmentIndex(Integer.parseInt(decodeBase900toBase10(segmentIndexArray, - NUMBER_OF_SEQUENCE_CODEWORDS))); - - StringBuilder fileId = new StringBuilder(); - codeIndex = textCompaction(codewords, codeIndex, fileId); - resultMetadata.setFileId(fileId.toString()); - - if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { - codeIndex++; - int[] additionalOptionCodeWords = new int[codewords[0] - codeIndex]; - int additionalOptionCodeWordsIndex = 0; - - boolean end = false; - while ((codeIndex < codewords[0]) && !end) { - int code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - additionalOptionCodeWords[additionalOptionCodeWordsIndex++] = code; - } else { - switch (code) { - case MACRO_PDF417_TERMINATOR: - resultMetadata.setLastSegment(true); - codeIndex++; - end = true; - break; - default: - throw FormatException.getFormatInstance(); - } - } - } - - resultMetadata.setOptionalData(Arrays.copyOf(additionalOptionCodeWords, additionalOptionCodeWordsIndex)); - } else if (codewords[codeIndex] == MACRO_PDF417_TERMINATOR) { - resultMetadata.setLastSegment(true); - codeIndex++; - } - - return codeIndex; - } - - /** - * Text Compaction mode (see 5.4.1.5) permits all printable ASCII characters to be - * encoded, i.e. values 32 - 126 inclusive in accordance with ISO/IEC 646 (IRV), as - * well as selected control characters. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ - private static int textCompaction(int[] codewords, int codeIndex, StringBuilder result) { - // 2 character per codeword - int[] textCompactionData = new int[(codewords[0] - codeIndex) * 2]; - // Used to hold the byte compaction value if there is a mode shift - int[] byteCompactionData = new int[(codewords[0] - codeIndex) * 2]; - - int index = 0; - boolean end = false; - while ((codeIndex < codewords[0]) && !end) { - int code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - textCompactionData[index] = code / 30; - textCompactionData[index + 1] = code % 30; - index += 2; - } else { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - // reinitialize text compaction mode to alpha sub mode - textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; - break; - case BYTE_COMPACTION_MODE_LATCH: - case BYTE_COMPACTION_MODE_LATCH_6: - case NUMERIC_COMPACTION_MODE_LATCH: - case BEGIN_MACRO_PDF417_CONTROL_BLOCK: - case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: - case MACRO_PDF417_TERMINATOR: - codeIndex--; - end = true; - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - // The Mode Shift codeword 913 shall cause a temporary - // switch from Text Compaction mode to Byte Compaction mode. - // This switch shall be in effect for only the next codeword, - // after which the mode shall revert to the prevailing sub-mode - // of the Text Compaction mode. Codeword 913 is only available - // in Text Compaction mode; its use is described in 5.4.2.4. - textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; - code = codewords[codeIndex++]; - byteCompactionData[index] = code; - index++; - break; - } - } - } - decodeTextCompaction(textCompactionData, byteCompactionData, index, result); - return codeIndex; - } - - /** - * The Text Compaction mode includes all the printable ASCII characters - * (i.e. values from 32 to 126) and three ASCII control characters: HT or tab - * (ASCII value 9), LF or line feed (ASCII value 10), and CR or carriage - * return (ASCII value 13). The Text Compaction mode also includes various latch - * and shift characters which are used exclusively within the mode. The Text - * Compaction mode encodes up to 2 characters per codeword. The compaction rules - * for converting data into PDF417 codewords are defined in 5.4.2.2. The sub-mode - * switches are defined in 5.4.2.3. - * - * @param textCompactionData The text compaction data. - * @param byteCompactionData The byte compaction data if there - * was a mode shift. - * @param length The size of the text compaction and byte compaction data. - * @param result The decoded data is appended to the result. - */ - private static void decodeTextCompaction(int[] textCompactionData, - int[] byteCompactionData, - int length, - StringBuilder result) { - // Beginning from an initial state of the Alpha sub-mode - // The default compaction mode for PDF417 in effect at the start of each symbol shall always be Text - // Compaction mode Alpha sub-mode (uppercase alphabetic). A latch codeword from another mode to the Text - // Compaction mode shall always switch to the Text Compaction Alpha sub-mode. - Mode subMode = Mode.ALPHA; - Mode priorToShiftMode = Mode.ALPHA; - int i = 0; - while (i < length) { - int subModeCh = textCompactionData[i]; - char ch = 0; - switch (subMode) { - case ALPHA: - // Alpha (uppercase alphabetic) - if (subModeCh < 26) { - // Upper case Alpha Character - ch = (char) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = Mode.LOWER; - } else if (subModeCh == ML) { - subMode = Mode.MIXED; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode.PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result.append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - - case LOWER: - // Lower (lowercase alphabetic) - if (subModeCh < 26) { - ch = (char) ('a' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == AS) { - // Shift to alpha - priorToShiftMode = subMode; - subMode = Mode.ALPHA_SHIFT; - } else if (subModeCh == ML) { - subMode = Mode.MIXED; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode.PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - // TODO Does this need to use the current character encoding? See other occurrences below - result.append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - - case MIXED: - // Mixed (numeric and some punctuation) - if (subModeCh < PL) { - ch = MIXED_CHARS[subModeCh]; - } else { - if (subModeCh == PL) { - subMode = Mode.PUNCT; - } else if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = Mode.LOWER; - } else if (subModeCh == AL) { - subMode = Mode.ALPHA; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = Mode.PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result.append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - - case PUNCT: - // Punctuation - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = Mode.ALPHA; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result.append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - - case ALPHA_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < 26) { - ch = (char) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - - case PUNCT_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = Mode.ALPHA; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - // PS before Shift-to-Byte is used as a padding character, - // see 5.4.2.4 of the specification - result.append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = Mode.ALPHA; - } - } - break; - } - if (ch != 0) { - // Append decoded character to result - result.append(ch); - } - i++; - } - } - - /** - * Byte Compaction mode (see 5.4.3) permits all 256 possible 8-bit byte values to be encoded. - * This includes all ASCII characters value 0 to 127 inclusive and provides for international - * character set support. - * - * @param mode The byte compaction mode i.e. 901 or 924 - * @param codewords The array of codewords (data + error) - * @param encoding Currently active character encoding - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ - private static int byteCompaction(int mode, - int[] codewords, - Charset encoding, - int codeIndex, - StringBuilder result) { - ByteArrayOutputStream decodedBytes = new ByteArrayOutputStream(); - if (mode == BYTE_COMPACTION_MODE_LATCH) { - // Total number of Byte Compaction characters to be encoded - // is not a multiple of 6 - int count = 0; - long value = 0; - int[] byteCompactedCodewords = new int[6]; - boolean end = false; - int nextCode = codewords[codeIndex++]; - while ((codeIndex < codewords[0]) && !end) { - byteCompactedCodewords[count++] = nextCode; - // Base 900 - value = 900 * value + nextCode; - nextCode = codewords[codeIndex++]; - // perhaps it should be ok to check only nextCode >= TEXT_COMPACTION_MODE_LATCH - if (nextCode == TEXT_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH || - nextCode == NUMERIC_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH_6 || - nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - nextCode == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = true; - } else { - if ((count % 5 == 0) && (count > 0)) { - // Decode every 5 codewords - // Convert to Base 256 - for (int j = 0; j < 6; ++j) { - decodedBytes.write((byte) (value >> (8 * (5 - j)))); - } - value = 0; - count = 0; - } - } - } - - // if the end of all codewords is reached the last codeword needs to be added - if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) { - byteCompactedCodewords[count++] = nextCode; - } - - // If Byte Compaction mode is invoked with codeword 901, - // the last group of codewords is interpreted directly - // as one byte per codeword, without compaction. - for (int i = 0; i < count; i++) { - decodedBytes.write((byte) byteCompactedCodewords[i]); - } - - } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { - // Total number of Byte Compaction characters to be encoded - // is an integer multiple of 6 - int count = 0; - long value = 0; - boolean end = false; - while (codeIndex < codewords[0] && !end) { - int code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - count++; - // Base 900 - value = 900 * value + code; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == NUMERIC_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = true; - } - } - if ((count % 5 == 0) && (count > 0)) { - // Decode every 5 codewords - // Convert to Base 256 - for (int j = 0; j < 6; ++j) { - decodedBytes.write((byte) (value >> (8 * (5 - j)))); - } - value = 0; - count = 0; - } - } - } - result.append(new String(decodedBytes.toByteArray(), encoding)); - return codeIndex; - } - - /** - * Numeric Compaction mode (see 5.4.4) permits efficient encoding of numeric data strings. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ - private static int numericCompaction(int[] codewords, int codeIndex, StringBuilder result) throws FormatException { - int count = 0; - boolean end = false; - - int[] numericCodewords = new int[MAX_NUMERIC_CODEWORDS]; - - while (codeIndex < codewords[0] && !end) { - int code = codewords[codeIndex++]; - if (codeIndex == codewords[0]) { - end = true; - } - if (code < TEXT_COMPACTION_MODE_LATCH) { - numericCodewords[count] = code; - count++; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = true; - } - } - if (count % MAX_NUMERIC_CODEWORDS == 0 || - code == NUMERIC_COMPACTION_MODE_LATCH || - end) { - // Re-invoking Numeric Compaction mode (by using codeword 902 - // while in Numeric Compaction mode) serves to terminate the - // current Numeric Compaction mode grouping as described in 5.4.4.2, - // and then to start a new one grouping. - if (count > 0) { - String s = decodeBase900toBase10(numericCodewords, count); - result.append(s); - count = 0; - } - } - } - return codeIndex; - } - - /** - * Convert a list of Numeric Compacted codewords from Base 900 to Base 10. - * - * @param codewords The array of codewords - * @param count The number of codewords - * @return The decoded string representing the Numeric data. - */ - /* - EXAMPLE - Encode the fifteen digit numeric string 000213298174000 - Prefix the numeric string with a 1 and set the initial value of - t = 1 000 213 298 174 000 - Calculate codeword 0 - d0 = 1 000 213 298 174 000 mod 900 = 200 - - t = 1 000 213 298 174 000 div 900 = 1 111 348 109 082 - Calculate codeword 1 - d1 = 1 111 348 109 082 mod 900 = 282 - - t = 1 111 348 109 082 div 900 = 1 234 831 232 - Calculate codeword 2 - d2 = 1 234 831 232 mod 900 = 632 - - t = 1 234 831 232 div 900 = 1 372 034 - Calculate codeword 3 - d3 = 1 372 034 mod 900 = 434 - - t = 1 372 034 div 900 = 1 524 - Calculate codeword 4 - d4 = 1 524 mod 900 = 624 - - t = 1 524 div 900 = 1 - Calculate codeword 5 - d5 = 1 mod 900 = 1 - t = 1 div 900 = 0 - Codeword sequence is: 1, 624, 434, 632, 282, 200 - - Decode the above codewords involves - 1 x 900 power of 5 + 624 x 900 power of 4 + 434 x 900 power of 3 + - 632 x 900 power of 2 + 282 x 900 power of 1 + 200 x 900 power of 0 = 1000213298174000 - - Remove leading 1 => Result is 000213298174000 - */ - private static String decodeBase900toBase10(int[] codewords, int count) throws FormatException { - BigInteger result = BigInteger.ZERO; - for (int i = 0; i < count; i++) { - result = result.add(EXP900[count - i - 1].multiply(BigInteger.valueOf(codewords[i]))); - } - String resultString = result.toString(); - if (resultString.charAt(0) != '1') { - throw FormatException.getFormatInstance(); - } - return resultString.substring(1); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java deleted file mode 100644 index 74892ee..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResult.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.pdf417.PDF417Common; - -import java.util.Formatter; - -/** - * @author Guenther Grau - */ -final class DetectionResult { - - private static final int ADJUST_ROW_NUMBER_SKIP = 2; - - private final BarcodeMetadata barcodeMetadata; - private final DetectionResultColumn[] detectionResultColumns; - private BoundingBox boundingBox; - private final int barcodeColumnCount; - - DetectionResult(BarcodeMetadata barcodeMetadata, BoundingBox boundingBox) { - this.barcodeMetadata = barcodeMetadata; - this.barcodeColumnCount = barcodeMetadata.getColumnCount(); - this.boundingBox = boundingBox; - detectionResultColumns = new DetectionResultColumn[barcodeColumnCount + 2]; - } - - DetectionResultColumn[] getDetectionResultColumns() { - adjustIndicatorColumnRowNumbers(detectionResultColumns[0]); - adjustIndicatorColumnRowNumbers(detectionResultColumns[barcodeColumnCount + 1]); - int unadjustedCodewordCount = PDF417Common.MAX_CODEWORDS_IN_BARCODE; - int previousUnadjustedCount; - do { - previousUnadjustedCount = unadjustedCodewordCount; - unadjustedCodewordCount = adjustRowNumbers(); - } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); - return detectionResultColumns; - } - - private void adjustIndicatorColumnRowNumbers(DetectionResultColumn detectionResultColumn) { - if (detectionResultColumn != null) { - ((DetectionResultRowIndicatorColumn) detectionResultColumn) - .adjustCompleteIndicatorColumnRowNumbers(barcodeMetadata); - } - } - - // TODO ensure that no detected codewords with unknown row number are left - // we should be able to estimate the row height and use it as a hint for the row number - // we should also fill the rows top to bottom and bottom to top - /** - * @return number of codewords which don't have a valid row number. Note that the count is not accurate as codewords - * will be counted several times. It just serves as an indicator to see when we can stop adjusting row numbers - */ - private int adjustRowNumbers() { - int unadjustedCount = adjustRowNumbersByRow(); - if (unadjustedCount == 0) { - return 0; - } - for (int barcodeColumn = 1; barcodeColumn < barcodeColumnCount + 1; barcodeColumn++) { - Codeword[] codewords = detectionResultColumns[barcodeColumn].getCodewords(); - for (int codewordsRow = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - if (!codewords[codewordsRow].hasValidRowNumber()) { - adjustRowNumbers(barcodeColumn, codewordsRow, codewords); - } - } - } - return unadjustedCount; - } - - private int adjustRowNumbersByRow() { - adjustRowNumbersFromBothRI(); - // TODO we should only do full row adjustments if row numbers of left and right row indicator column match. - // Maybe it's even better to calculated the height (in codeword rows) and divide it by the number of barcode - // rows. This, together with the LRI and RRI row numbers should allow us to get a good estimate where a row - // number starts and ends. - int unadjustedCount = adjustRowNumbersFromLRI(); - return unadjustedCount + adjustRowNumbersFromRRI(); - } - - private void adjustRowNumbersFromBothRI() { - if (detectionResultColumns[0] == null || detectionResultColumns[barcodeColumnCount + 1] == null) { - return; - } - Codeword[] LRIcodewords = detectionResultColumns[0].getCodewords(); - Codeword[] RRIcodewords = detectionResultColumns[barcodeColumnCount + 1].getCodewords(); - for (int codewordsRow = 0; codewordsRow < LRIcodewords.length; codewordsRow++) { - if (LRIcodewords[codewordsRow] != null && - RRIcodewords[codewordsRow] != null && - LRIcodewords[codewordsRow].getRowNumber() == RRIcodewords[codewordsRow].getRowNumber()) { - for (int barcodeColumn = 1; barcodeColumn <= barcodeColumnCount; barcodeColumn++) { - Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword == null) { - continue; - } - codeword.setRowNumber(LRIcodewords[codewordsRow].getRowNumber()); - if (!codeword.hasValidRowNumber()) { - detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow] = null; - } - } - } - } - } - - private int adjustRowNumbersFromRRI() { - if (detectionResultColumns[barcodeColumnCount + 1] == null) { - return 0; - } - int unadjustedCount = 0; - Codeword[] codewords = detectionResultColumns[barcodeColumnCount + 1].getCodewords(); - for (int codewordsRow = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - int rowIndicatorRowNumber = codewords[codewordsRow].getRowNumber(); - int invalidRowCounts = 0; - for (int barcodeColumn = barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { - Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword != null) { - invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword.hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; - } - - private int adjustRowNumbersFromLRI() { - if (detectionResultColumns[0] == null) { - return 0; - } - int unadjustedCount = 0; - Codeword[] codewords = detectionResultColumns[0].getCodewords(); - for (int codewordsRow = 0; codewordsRow < codewords.length; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - int rowIndicatorRowNumber = codewords[codewordsRow].getRowNumber(); - int invalidRowCounts = 0; - for (int barcodeColumn = 1; barcodeColumn < barcodeColumnCount + 1 && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { - Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword != null) { - invalidRowCounts = adjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword); - if (!codeword.hasValidRowNumber()) { - unadjustedCount++; - } - } - } - } - return unadjustedCount; - } - - private static int adjustRowNumberIfValid(int rowIndicatorRowNumber, int invalidRowCounts, Codeword codeword) { - if (codeword == null) { - return invalidRowCounts; - } - if (!codeword.hasValidRowNumber()) { - if (codeword.isValidRowNumber(rowIndicatorRowNumber)) { - codeword.setRowNumber(rowIndicatorRowNumber); - invalidRowCounts = 0; - } else { - ++invalidRowCounts; - } - } - return invalidRowCounts; - } - - private void adjustRowNumbers(int barcodeColumn, int codewordsRow, Codeword[] codewords) { - Codeword codeword = codewords[codewordsRow]; - Codeword[] previousColumnCodewords = detectionResultColumns[barcodeColumn - 1].getCodewords(); - Codeword[] nextColumnCodewords = previousColumnCodewords; - if (detectionResultColumns[barcodeColumn + 1] != null) { - nextColumnCodewords = detectionResultColumns[barcodeColumn + 1].getCodewords(); - } - - Codeword[] otherCodewords = new Codeword[14]; - - otherCodewords[2] = previousColumnCodewords[codewordsRow]; - otherCodewords[3] = nextColumnCodewords[codewordsRow]; - - if (codewordsRow > 0) { - otherCodewords[0] = codewords[codewordsRow - 1]; - otherCodewords[4] = previousColumnCodewords[codewordsRow - 1]; - otherCodewords[5] = nextColumnCodewords[codewordsRow - 1]; - } - if (codewordsRow > 1) { - otherCodewords[8] = codewords[codewordsRow - 2]; - otherCodewords[10] = previousColumnCodewords[codewordsRow - 2]; - otherCodewords[11] = nextColumnCodewords[codewordsRow - 2]; - } - if (codewordsRow < codewords.length - 1) { - otherCodewords[1] = codewords[codewordsRow + 1]; - otherCodewords[6] = previousColumnCodewords[codewordsRow + 1]; - otherCodewords[7] = nextColumnCodewords[codewordsRow + 1]; - } - if (codewordsRow < codewords.length - 2) { - otherCodewords[9] = codewords[codewordsRow + 2]; - otherCodewords[12] = previousColumnCodewords[codewordsRow + 2]; - otherCodewords[13] = nextColumnCodewords[codewordsRow + 2]; - } - for (Codeword otherCodeword : otherCodewords) { - if (adjustRowNumber(codeword, otherCodeword)) { - return; - } - } - } - - /** - * @return true, if row number was adjusted, false otherwise - */ - private static boolean adjustRowNumber(Codeword codeword, Codeword otherCodeword) { - if (otherCodeword == null) { - return false; - } - if (otherCodeword.hasValidRowNumber() && otherCodeword.getBucket() == codeword.getBucket()) { - codeword.setRowNumber(otherCodeword.getRowNumber()); - return true; - } - return false; - } - - int getBarcodeColumnCount() { - return barcodeColumnCount; - } - - int getBarcodeRowCount() { - return barcodeMetadata.getRowCount(); - } - - int getBarcodeECLevel() { - return barcodeMetadata.getErrorCorrectionLevel(); - } - - public void setBoundingBox(BoundingBox boundingBox) { - this.boundingBox = boundingBox; - } - - BoundingBox getBoundingBox() { - return boundingBox; - } - - void setDetectionResultColumn(int barcodeColumn, DetectionResultColumn detectionResultColumn) { - detectionResultColumns[barcodeColumn] = detectionResultColumn; - } - - DetectionResultColumn getDetectionResultColumn(int barcodeColumn) { - return detectionResultColumns[barcodeColumn]; - } - - @Override - public String toString() { - DetectionResultColumn rowIndicatorColumn = detectionResultColumns[0]; - if (rowIndicatorColumn == null) { - rowIndicatorColumn = detectionResultColumns[barcodeColumnCount + 1]; - } - Formatter formatter = new Formatter(); - for (int codewordsRow = 0; codewordsRow < rowIndicatorColumn.getCodewords().length; codewordsRow++) { - formatter.format("CW %3d:", codewordsRow); - for (int barcodeColumn = 0; barcodeColumn < barcodeColumnCount + 2; barcodeColumn++) { - if (detectionResultColumns[barcodeColumn] == null) { - formatter.format(" | "); - continue; - } - Codeword codeword = detectionResultColumns[barcodeColumn].getCodewords()[codewordsRow]; - if (codeword == null) { - formatter.format(" | "); - continue; - } - formatter.format(" %3d|%3d", codeword.getRowNumber(), codeword.getValue()); - } - formatter.format("%n"); - } - String result = formatter.toString(); - formatter.close(); - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java deleted file mode 100644 index bda0b39..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultColumn.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import java.util.Formatter; - -/** - * @author Guenther Grau - */ -class DetectionResultColumn { - - private static final int MAX_NEARBY_DISTANCE = 5; - - private final BoundingBox boundingBox; - private final Codeword[] codewords; - - DetectionResultColumn(BoundingBox boundingBox) { - this.boundingBox = new BoundingBox(boundingBox); - codewords = new Codeword[boundingBox.getMaxY() - boundingBox.getMinY() + 1]; - } - - final Codeword getCodewordNearby(int imageRow) { - Codeword codeword = getCodeword(imageRow); - if (codeword != null) { - return codeword; - } - for (int i = 1; i < MAX_NEARBY_DISTANCE; i++) { - int nearImageRow = imageRowToCodewordIndex(imageRow) - i; - if (nearImageRow >= 0) { - codeword = codewords[nearImageRow]; - if (codeword != null) { - return codeword; - } - } - nearImageRow = imageRowToCodewordIndex(imageRow) + i; - if (nearImageRow < codewords.length) { - codeword = codewords[nearImageRow]; - if (codeword != null) { - return codeword; - } - } - } - return null; - } - - final int imageRowToCodewordIndex(int imageRow) { - return imageRow - boundingBox.getMinY(); - } - - final void setCodeword(int imageRow, Codeword codeword) { - codewords[imageRowToCodewordIndex(imageRow)] = codeword; - } - - final Codeword getCodeword(int imageRow) { - return codewords[imageRowToCodewordIndex(imageRow)]; - } - - final BoundingBox getBoundingBox() { - return boundingBox; - } - - final Codeword[] getCodewords() { - return codewords; - } - - @Override - public String toString() { - Formatter formatter = new Formatter(); - int row = 0; - for (Codeword codeword : codewords) { - if (codeword == null) { - formatter.format("%3d: | %n", row++); - continue; - } - formatter.format("%3d: %3d|%3d%n", row++, codeword.getRowNumber(), codeword.getValue()); - } - String result = formatter.toString(); - formatter.close(); - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultRowIndicatorColumn.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultRowIndicatorColumn.java deleted file mode 100644 index 85f40bf..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/DetectionResultRowIndicatorColumn.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.ResultPoint; -import com.google.zxing.pdf417.PDF417Common; - -/** - * @author Guenther Grau - */ -final class DetectionResultRowIndicatorColumn extends DetectionResultColumn { - - private final boolean isLeft; - - DetectionResultRowIndicatorColumn(BoundingBox boundingBox, boolean isLeft) { - super(boundingBox); - this.isLeft = isLeft; - } - - void setRowNumbers() { - for (Codeword codeword : getCodewords()) { - if (codeword != null) { - codeword.setRowNumberAsRowIndicatorColumn(); - } - } - } - - // TODO implement properly - // TODO maybe we should add missing codewords to store the correct row number to make - // finding row numbers for other columns easier - // use row height count to make detection of invalid row numbers more reliable - int adjustCompleteIndicatorColumnRowNumbers(BarcodeMetadata barcodeMetadata) { - Codeword[] codewords = getCodewords(); - setRowNumbers(); - removeIncorrectCodewords(codewords, barcodeMetadata); - BoundingBox boundingBox = getBoundingBox(); - ResultPoint top = isLeft ? boundingBox.getTopLeft() : boundingBox.getTopRight(); - ResultPoint bottom = isLeft ? boundingBox.getBottomLeft() : boundingBox.getBottomRight(); - int firstRow = imageRowToCodewordIndex((int) top.getY()); - int lastRow = imageRowToCodewordIndex((int) bottom.getY()); - // We need to be careful using the average row height. Barcode could be skewed so that we have smaller and - // taller rows - float averageRowHeight = (lastRow - firstRow) / (float) barcodeMetadata.getRowCount(); - int barcodeRow = -1; - int maxRowHeight = 1; - int currentRowHeight = 0; - for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - Codeword codeword = codewords[codewordsRow]; - - // float expectedRowNumber = (codewordsRow - firstRow) / averageRowHeight; - // if (Math.abs(codeword.getRowNumber() - expectedRowNumber) > 2) { - // SimpleLog.log(LEVEL.WARNING, - // "Removing codeword, rowNumberSkew too high, codeword[" + codewordsRow + "]: Expected Row: " + - // expectedRowNumber + ", RealRow: " + codeword.getRowNumber() + ", value: " + codeword.getValue()); - // codewords[codewordsRow] = null; - // } - - int rowDifference = codeword.getRowNumber() - barcodeRow; - - // TODO improve handling with case where first row indicator doesn't start with 0 - - if (rowDifference == 0) { - currentRowHeight++; - } else if (rowDifference == 1) { - maxRowHeight = Math.max(maxRowHeight, currentRowHeight); - currentRowHeight = 1; - barcodeRow = codeword.getRowNumber(); - } else if (rowDifference < 0 || - codeword.getRowNumber() >= barcodeMetadata.getRowCount() || - rowDifference > codewordsRow) { - codewords[codewordsRow] = null; - } else { - int checkedRows; - if (maxRowHeight > 2) { - checkedRows = (maxRowHeight - 2) * rowDifference; - } else { - checkedRows = rowDifference; - } - boolean closePreviousCodewordFound = checkedRows >= codewordsRow; - for (int i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { - // there must be (height * rowDifference) number of codewords missing. For now we assume height = 1. - // This should hopefully get rid of most problems already. - closePreviousCodewordFound = codewords[codewordsRow - i] != null; - } - if (closePreviousCodewordFound) { - codewords[codewordsRow] = null; - } else { - barcodeRow = codeword.getRowNumber(); - currentRowHeight = 1; - } - } - } - return (int) (averageRowHeight + 0.5); - } - - int[] getRowHeights() throws FormatException { - BarcodeMetadata barcodeMetadata = getBarcodeMetadata(); - if (barcodeMetadata == null) { - return null; - } - adjustIncompleteIndicatorColumnRowNumbers(barcodeMetadata); - int[] result = new int[barcodeMetadata.getRowCount()]; - for (Codeword codeword : getCodewords()) { - if (codeword != null) { - int rowNumber = codeword.getRowNumber(); - if (rowNumber >= result.length) { - // We have more rows than the barcode metadata allows for, ignore them. - continue; - } - result[rowNumber]++; - } // else throw exception? - } - return result; - } - - // TODO maybe we should add missing codewords to store the correct row number to make - // finding row numbers for other columns easier - // use row height count to make detection of invalid row numbers more reliable - int adjustIncompleteIndicatorColumnRowNumbers(BarcodeMetadata barcodeMetadata) { - BoundingBox boundingBox = getBoundingBox(); - ResultPoint top = isLeft ? boundingBox.getTopLeft() : boundingBox.getTopRight(); - ResultPoint bottom = isLeft ? boundingBox.getBottomLeft() : boundingBox.getBottomRight(); - int firstRow = imageRowToCodewordIndex((int) top.getY()); - int lastRow = imageRowToCodewordIndex((int) bottom.getY()); - float averageRowHeight = (lastRow - firstRow) / (float) barcodeMetadata.getRowCount(); - Codeword[] codewords = getCodewords(); - int barcodeRow = -1; - int maxRowHeight = 1; - int currentRowHeight = 0; - for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { - if (codewords[codewordsRow] == null) { - continue; - } - Codeword codeword = codewords[codewordsRow]; - - codeword.setRowNumberAsRowIndicatorColumn(); - - int rowDifference = codeword.getRowNumber() - barcodeRow; - - // TODO improve handling with case where first row indicator doesn't start with 0 - - if (rowDifference == 0) { - currentRowHeight++; - } else if (rowDifference == 1) { - maxRowHeight = Math.max(maxRowHeight, currentRowHeight); - currentRowHeight = 1; - barcodeRow = codeword.getRowNumber(); - } else if (codeword.getRowNumber() >= barcodeMetadata.getRowCount()) { - codewords[codewordsRow] = null; - } else { - barcodeRow = codeword.getRowNumber(); - currentRowHeight = 1; - } - } - return (int) (averageRowHeight + 0.5); - } - - BarcodeMetadata getBarcodeMetadata() { - Codeword[] codewords = getCodewords(); - BarcodeValue barcodeColumnCount = new BarcodeValue(); - BarcodeValue barcodeRowCountUpperPart = new BarcodeValue(); - BarcodeValue barcodeRowCountLowerPart = new BarcodeValue(); - BarcodeValue barcodeECLevel = new BarcodeValue(); - for (Codeword codeword : codewords) { - if (codeword == null) { - continue; - } - codeword.setRowNumberAsRowIndicatorColumn(); - int rowIndicatorValue = codeword.getValue() % 30; - int codewordRowNumber = codeword.getRowNumber(); - if (!isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); - break; - case 1: - barcodeECLevel.setValue(rowIndicatorValue / 3); - barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); - break; - case 2: - barcodeColumnCount.setValue(rowIndicatorValue + 1); - break; - } - } - // Maybe we should check if we have ambiguous values? - if ((barcodeColumnCount.getValue().length == 0) || - (barcodeRowCountUpperPart.getValue().length == 0) || - (barcodeRowCountLowerPart.getValue().length == 0) || - (barcodeECLevel.getValue().length == 0) || - barcodeColumnCount.getValue()[0] < 1 || - barcodeRowCountUpperPart.getValue()[0] + barcodeRowCountLowerPart.getValue()[0] < PDF417Common.MIN_ROWS_IN_BARCODE || - barcodeRowCountUpperPart.getValue()[0] + barcodeRowCountLowerPart.getValue()[0] > PDF417Common.MAX_ROWS_IN_BARCODE) { - return null; - } - BarcodeMetadata barcodeMetadata = new BarcodeMetadata(barcodeColumnCount.getValue()[0], - barcodeRowCountUpperPart.getValue()[0], barcodeRowCountLowerPart.getValue()[0], barcodeECLevel.getValue()[0]); - removeIncorrectCodewords(codewords, barcodeMetadata); - return barcodeMetadata; - } - - private void removeIncorrectCodewords(Codeword[] codewords, BarcodeMetadata barcodeMetadata) { - // Remove codewords which do not match the metadata - // TODO Maybe we should keep the incorrect codewords for the start and end positions? - for (int codewordRow = 0; codewordRow < codewords.length; codewordRow++) { - Codeword codeword = codewords[codewordRow]; - if (codewords[codewordRow] == null) { - continue; - } - int rowIndicatorValue = codeword.getValue() % 30; - int codewordRowNumber = codeword.getRowNumber(); - if (codewordRowNumber > barcodeMetadata.getRowCount()) { - codewords[codewordRow] = null; - continue; - } - if (!isLeft) { - codewordRowNumber += 2; - } - switch (codewordRowNumber % 3) { - case 0: - if (rowIndicatorValue * 3 + 1 != barcodeMetadata.getRowCountUpperPart()) { - codewords[codewordRow] = null; - } - break; - case 1: - if (rowIndicatorValue / 3 != barcodeMetadata.getErrorCorrectionLevel() || - rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { - codewords[codewordRow] = null; - } - break; - case 2: - if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { - codewords[codewordRow] = null; - } - break; - } - } - } - - boolean isLeft() { - return isLeft; - } - - @Override - public String toString() { - return "IsLeft: " + isLeft + '\n' + super.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417CodewordDecoder.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417CodewordDecoder.java deleted file mode 100644 index 6eb2b13..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417CodewordDecoder.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.pdf417.PDF417Common; - -/** - * @author Guenther Grau - * @author creatale GmbH (christoph.schulz@creatale.de) - */ -final class PDF417CodewordDecoder { - - private static final float[][] RATIOS_TABLE = - new float[PDF417Common.SYMBOL_TABLE.length][PDF417Common.BARS_IN_MODULE]; - - static { - // Pre-computes the symbol ratio table. - for (int i = 0; i < PDF417Common.SYMBOL_TABLE.length; i++) { - int currentSymbol = PDF417Common.SYMBOL_TABLE[i]; - int currentBit = currentSymbol & 0x1; - for (int j = 0; j < PDF417Common.BARS_IN_MODULE; j++) { - float size = 0.0f; - while ((currentSymbol & 0x1) == currentBit) { - size += 1.0f; - currentSymbol >>= 1; - } - currentBit = currentSymbol & 0x1; - RATIOS_TABLE[i][PDF417Common.BARS_IN_MODULE - j - 1] = size / PDF417Common.MODULES_IN_CODEWORD; - } - } - } - - private PDF417CodewordDecoder() { - } - - static int getDecodedValue(int[] moduleBitCount) { - int decodedValue = getDecodedCodewordValue(sampleBitCounts(moduleBitCount)); - if (decodedValue != -1) { - return decodedValue; - } - return getClosestDecodedValue(moduleBitCount); - } - - private static int[] sampleBitCounts(int[] moduleBitCount) { - float bitCountSum = MathUtils.sum(moduleBitCount); - int[] result = new int[PDF417Common.BARS_IN_MODULE]; - int bitCountIndex = 0; - int sumPreviousBits = 0; - for (int i = 0; i < PDF417Common.MODULES_IN_CODEWORD; i++) { - float sampleIndex = - bitCountSum / (2 * PDF417Common.MODULES_IN_CODEWORD) + - (i * bitCountSum) / PDF417Common.MODULES_IN_CODEWORD; - if (sumPreviousBits + moduleBitCount[bitCountIndex] <= sampleIndex) { - sumPreviousBits += moduleBitCount[bitCountIndex]; - bitCountIndex++; - } - result[bitCountIndex]++; - } - return result; - } - - private static int getDecodedCodewordValue(int[] moduleBitCount) { - int decodedValue = getBitValue(moduleBitCount); - return PDF417Common.getCodeword(decodedValue) == -1 ? -1 : decodedValue; - } - - private static int getBitValue(int[] moduleBitCount) { - long result = 0; - for (int i = 0; i < moduleBitCount.length; i++) { - for (int bit = 0; bit < moduleBitCount[i]; bit++) { - result = (result << 1) | (i % 2 == 0 ? 1 : 0); - } - } - return (int) result; - } - - private static int getClosestDecodedValue(int[] moduleBitCount) { - int bitCountSum = MathUtils.sum(moduleBitCount); - float[] bitCountRatios = new float[PDF417Common.BARS_IN_MODULE]; - for (int i = 0; i < bitCountRatios.length; i++) { - bitCountRatios[i] = moduleBitCount[i] / (float) bitCountSum; - } - float bestMatchError = Float.MAX_VALUE; - int bestMatch = -1; - for (int j = 0; j < RATIOS_TABLE.length; j++) { - float error = 0.0f; - float[] ratioTableRow = RATIOS_TABLE[j]; - for (int k = 0; k < PDF417Common.BARS_IN_MODULE; k++) { - float diff = ratioTableRow[k] - bitCountRatios[k]; - error += diff * diff; - if (error >= bestMatchError) { - break; - } - } - if (error < bestMatchError) { - bestMatchError = error; - bestMatch = PDF417Common.SYMBOL_TABLE[j]; - } - } - return bestMatch; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java deleted file mode 100644 index a1c2d8f..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java +++ /dev/null @@ -1,631 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder; - -import com.google.zxing.ChecksumException; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.pdf417.PDF417Common; -import com.google.zxing.pdf417.decoder.ec.ErrorCorrection; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Formatter; -import java.util.List; - -/** - * @author Guenther Grau - */ -public final class PDF417ScanningDecoder { - - private static final int CODEWORD_SKEW_SIZE = 2; - - private static final int MAX_ERRORS = 3; - private static final int MAX_EC_CODEWORDS = 512; - private static final ErrorCorrection errorCorrection = new ErrorCorrection(); - - private PDF417ScanningDecoder() { - } - - // TODO don't pass in minCodewordWidth and maxCodewordWidth, pass in barcode columns for start and stop pattern - // columns. That way width can be deducted from the pattern column. - // This approach also allows to detect more details about the barcode, e.g. if a bar type (white or black) is wider - // than it should be. This can happen if the scanner used a bad blackpoint. - public static DecoderResult decode(BitMatrix image, - ResultPoint imageTopLeft, - ResultPoint imageBottomLeft, - ResultPoint imageTopRight, - ResultPoint imageBottomRight, - int minCodewordWidth, - int maxCodewordWidth) throws NotFoundException, FormatException, ChecksumException { - BoundingBox boundingBox = new BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight); - DetectionResultRowIndicatorColumn leftRowIndicatorColumn = null; - DetectionResultRowIndicatorColumn rightRowIndicatorColumn = null; - DetectionResult detectionResult = null; - for (int i = 0; i < 2; i++) { - if (imageTopLeft != null) { - leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, imageTopLeft, true, minCodewordWidth, - maxCodewordWidth); - } - if (imageTopRight != null) { - rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, imageTopRight, false, minCodewordWidth, - maxCodewordWidth); - } - detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn); - if (detectionResult == null) { - throw NotFoundException.getNotFoundInstance(); - } - if (i == 0 && detectionResult.getBoundingBox() != null && - (detectionResult.getBoundingBox().getMinY() < boundingBox.getMinY() || detectionResult.getBoundingBox() - .getMaxY() > boundingBox.getMaxY())) { - boundingBox = detectionResult.getBoundingBox(); - } else { - detectionResult.setBoundingBox(boundingBox); - break; - } - } - int maxBarcodeColumn = detectionResult.getBarcodeColumnCount() + 1; - detectionResult.setDetectionResultColumn(0, leftRowIndicatorColumn); - detectionResult.setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn); - - boolean leftToRight = leftRowIndicatorColumn != null; - for (int barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { - int barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; - if (detectionResult.getDetectionResultColumn(barcodeColumn) != null) { - // This will be the case for the opposite row indicator column, which doesn't need to be decoded again. - continue; - } - DetectionResultColumn detectionResultColumn; - if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { - detectionResultColumn = new DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn == 0); - } else { - detectionResultColumn = new DetectionResultColumn(boundingBox); - } - detectionResult.setDetectionResultColumn(barcodeColumn, detectionResultColumn); - int startColumn = -1; - int previousStartColumn = startColumn; - // TODO start at a row for which we know the start position, then detect upwards and downwards from there. - for (int imageRow = boundingBox.getMinY(); imageRow <= boundingBox.getMaxY(); imageRow++) { - startColumn = getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); - if (startColumn < 0 || startColumn > boundingBox.getMaxX()) { - if (previousStartColumn == -1) { - continue; - } - startColumn = previousStartColumn; - } - Codeword codeword = detectCodeword(image, boundingBox.getMinX(), boundingBox.getMaxX(), leftToRight, - startColumn, imageRow, minCodewordWidth, maxCodewordWidth); - if (codeword != null) { - detectionResultColumn.setCodeword(imageRow, codeword); - previousStartColumn = startColumn; - minCodewordWidth = Math.min(minCodewordWidth, codeword.getWidth()); - maxCodewordWidth = Math.max(maxCodewordWidth, codeword.getWidth()); - } - } - } - return createDecoderResult(detectionResult); - } - - private static DetectionResult merge(DetectionResultRowIndicatorColumn leftRowIndicatorColumn, - DetectionResultRowIndicatorColumn rightRowIndicatorColumn) - throws NotFoundException, FormatException { - if (leftRowIndicatorColumn == null && rightRowIndicatorColumn == null) { - return null; - } - BarcodeMetadata barcodeMetadata = getBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn); - if (barcodeMetadata == null) { - return null; - } - BoundingBox boundingBox = BoundingBox.merge(adjustBoundingBox(leftRowIndicatorColumn), - adjustBoundingBox(rightRowIndicatorColumn)); - return new DetectionResult(barcodeMetadata, boundingBox); - } - - private static BoundingBox adjustBoundingBox(DetectionResultRowIndicatorColumn rowIndicatorColumn) - throws NotFoundException, FormatException { - if (rowIndicatorColumn == null) { - return null; - } - int[] rowHeights = rowIndicatorColumn.getRowHeights(); - if (rowHeights == null) { - return null; - } - int maxRowHeight = getMax(rowHeights); - int missingStartRows = 0; - for (int rowHeight : rowHeights) { - missingStartRows += maxRowHeight - rowHeight; - if (rowHeight > 0) { - break; - } - } - Codeword[] codewords = rowIndicatorColumn.getCodewords(); - for (int row = 0; missingStartRows > 0 && codewords[row] == null; row++) { - missingStartRows--; - } - int missingEndRows = 0; - for (int row = rowHeights.length - 1; row >= 0; row--) { - missingEndRows += maxRowHeight - rowHeights[row]; - if (rowHeights[row] > 0) { - break; - } - } - for (int row = codewords.length - 1; missingEndRows > 0 && codewords[row] == null; row--) { - missingEndRows--; - } - return rowIndicatorColumn.getBoundingBox().addMissingRows(missingStartRows, missingEndRows, - rowIndicatorColumn.isLeft()); - } - - private static int getMax(int[] values) { - int maxValue = -1; - for (int value : values) { - maxValue = Math.max(maxValue, value); - } - return maxValue; - } - - private static BarcodeMetadata getBarcodeMetadata(DetectionResultRowIndicatorColumn leftRowIndicatorColumn, - DetectionResultRowIndicatorColumn rightRowIndicatorColumn) { - BarcodeMetadata leftBarcodeMetadata; - if (leftRowIndicatorColumn == null || - (leftBarcodeMetadata = leftRowIndicatorColumn.getBarcodeMetadata()) == null) { - return rightRowIndicatorColumn == null ? null : rightRowIndicatorColumn.getBarcodeMetadata(); - } - BarcodeMetadata rightBarcodeMetadata; - if (rightRowIndicatorColumn == null || - (rightBarcodeMetadata = rightRowIndicatorColumn.getBarcodeMetadata()) == null) { - return leftBarcodeMetadata; - } - - if (leftBarcodeMetadata.getColumnCount() != rightBarcodeMetadata.getColumnCount() && - leftBarcodeMetadata.getErrorCorrectionLevel() != rightBarcodeMetadata.getErrorCorrectionLevel() && - leftBarcodeMetadata.getRowCount() != rightBarcodeMetadata.getRowCount()) { - return null; - } - return leftBarcodeMetadata; - } - - private static DetectionResultRowIndicatorColumn getRowIndicatorColumn(BitMatrix image, - BoundingBox boundingBox, - ResultPoint startPoint, - boolean leftToRight, - int minCodewordWidth, - int maxCodewordWidth) { - DetectionResultRowIndicatorColumn rowIndicatorColumn = new DetectionResultRowIndicatorColumn(boundingBox, - leftToRight); - for (int i = 0; i < 2; i++) { - int increment = i == 0 ? 1 : -1; - int startColumn = (int) startPoint.getX(); - for (int imageRow = (int) startPoint.getY(); imageRow <= boundingBox.getMaxY() && - imageRow >= boundingBox.getMinY(); imageRow += increment) { - Codeword codeword = detectCodeword(image, 0, image.getWidth(), leftToRight, startColumn, imageRow, - minCodewordWidth, maxCodewordWidth); - if (codeword != null) { - rowIndicatorColumn.setCodeword(imageRow, codeword); - if (leftToRight) { - startColumn = codeword.getStartX(); - } else { - startColumn = codeword.getEndX(); - } - } - } - } - return rowIndicatorColumn; - } - - private static void adjustCodewordCount(DetectionResult detectionResult, BarcodeValue[][] barcodeMatrix) - throws NotFoundException { - int[] numberOfCodewords = barcodeMatrix[0][1].getValue(); - int calculatedNumberOfCodewords = detectionResult.getBarcodeColumnCount() * - detectionResult.getBarcodeRowCount() - - getNumberOfECCodeWords(detectionResult.getBarcodeECLevel()); - if (numberOfCodewords.length == 0) { - if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > PDF417Common.MAX_CODEWORDS_IN_BARCODE) { - throw NotFoundException.getNotFoundInstance(); - } - barcodeMatrix[0][1].setValue(calculatedNumberOfCodewords); - } else if (numberOfCodewords[0] != calculatedNumberOfCodewords) { - // The calculated one is more reliable as it is derived from the row indicator columns - barcodeMatrix[0][1].setValue(calculatedNumberOfCodewords); - } - } - - private static DecoderResult createDecoderResult(DetectionResult detectionResult) throws FormatException, - ChecksumException, NotFoundException { - BarcodeValue[][] barcodeMatrix = createBarcodeMatrix(detectionResult); - adjustCodewordCount(detectionResult, barcodeMatrix); - Collection erasures = new ArrayList<>(); - int[] codewords = new int[detectionResult.getBarcodeRowCount() * detectionResult.getBarcodeColumnCount()]; - List ambiguousIndexValuesList = new ArrayList<>(); - List ambiguousIndexesList = new ArrayList<>(); - for (int row = 0; row < detectionResult.getBarcodeRowCount(); row++) { - for (int column = 0; column < detectionResult.getBarcodeColumnCount(); column++) { - int[] values = barcodeMatrix[row][column + 1].getValue(); - int codewordIndex = row * detectionResult.getBarcodeColumnCount() + column; - if (values.length == 0) { - erasures.add(codewordIndex); - } else if (values.length == 1) { - codewords[codewordIndex] = values[0]; - } else { - ambiguousIndexesList.add(codewordIndex); - ambiguousIndexValuesList.add(values); - } - } - } - int[][] ambiguousIndexValues = new int[ambiguousIndexValuesList.size()][]; - for (int i = 0; i < ambiguousIndexValues.length; i++) { - ambiguousIndexValues[i] = ambiguousIndexValuesList.get(i); - } - return createDecoderResultFromAmbiguousValues(detectionResult.getBarcodeECLevel(), codewords, - PDF417Common.toIntArray(erasures), PDF417Common.toIntArray(ambiguousIndexesList), ambiguousIndexValues); - } - - /** - * 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 - */ - 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(); - } - - private static BarcodeValue[][] createBarcodeMatrix(DetectionResult detectionResult) { - BarcodeValue[][] barcodeMatrix = - new BarcodeValue[detectionResult.getBarcodeRowCount()][detectionResult.getBarcodeColumnCount() + 2]; - for (int row = 0; row < barcodeMatrix.length; row++) { - for (int column = 0; column < barcodeMatrix[row].length; column++) { - barcodeMatrix[row][column] = new BarcodeValue(); - } - } - - int column = 0; - for (DetectionResultColumn detectionResultColumn : detectionResult.getDetectionResultColumns()) { - if (detectionResultColumn != null) { - for (Codeword codeword : detectionResultColumn.getCodewords()) { - if (codeword != null) { - int rowNumber = codeword.getRowNumber(); - if (rowNumber >= 0) { - if (rowNumber >= barcodeMatrix.length) { - // We have more rows than the barcode metadata allows for, ignore them. - continue; - } - barcodeMatrix[rowNumber][column].setValue(codeword.getValue()); - } - } - } - } - column++; - } - return barcodeMatrix; - } - - private static boolean isValidBarcodeColumn(DetectionResult detectionResult, int barcodeColumn) { - return barcodeColumn >= 0 && barcodeColumn <= detectionResult.getBarcodeColumnCount() + 1; - } - - private static int getStartColumn(DetectionResult detectionResult, - int barcodeColumn, - int imageRow, - boolean leftToRight) { - int offset = leftToRight ? 1 : -1; - Codeword codeword = null; - if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult.getDetectionResultColumn(barcodeColumn - offset).getCodeword(imageRow); - } - if (codeword != null) { - return leftToRight ? codeword.getEndX() : codeword.getStartX(); - } - codeword = detectionResult.getDetectionResultColumn(barcodeColumn).getCodewordNearby(imageRow); - if (codeword != null) { - return leftToRight ? codeword.getStartX() : codeword.getEndX(); - } - if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - codeword = detectionResult.getDetectionResultColumn(barcodeColumn - offset).getCodewordNearby(imageRow); - } - if (codeword != null) { - return leftToRight ? codeword.getEndX() : codeword.getStartX(); - } - int skippedColumns = 0; - - while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { - barcodeColumn -= offset; - for (Codeword previousRowCodeword : detectionResult.getDetectionResultColumn(barcodeColumn).getCodewords()) { - if (previousRowCodeword != null) { - return (leftToRight ? previousRowCodeword.getEndX() : previousRowCodeword.getStartX()) + - offset * - skippedColumns * - (previousRowCodeword.getEndX() - previousRowCodeword.getStartX()); - } - } - skippedColumns++; - } - return leftToRight ? detectionResult.getBoundingBox().getMinX() : detectionResult.getBoundingBox().getMaxX(); - } - - private static Codeword detectCodeword(BitMatrix image, - int minColumn, - int maxColumn, - boolean leftToRight, - int startColumn, - int imageRow, - int minCodewordWidth, - int maxCodewordWidth) { - startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - // we usually know fairly exact now how long a codeword is. We should provide minimum and maximum expected length - // and try to adjust the read pixels, e.g. remove single pixel errors or try to cut off exceeding pixels. - // min and maxCodewordWidth should not be used as they are calculated for the whole barcode an can be inaccurate - // for the current position - int[] moduleBitCount = getModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); - if (moduleBitCount == null) { - return null; - } - int endColumn; - int codewordBitCount = MathUtils.sum(moduleBitCount); - if (leftToRight) { - endColumn = startColumn + codewordBitCount; - } else { - for (int i = 0; i < moduleBitCount.length / 2; i++) { - int tmpCount = moduleBitCount[i]; - moduleBitCount[i] = moduleBitCount[moduleBitCount.length - 1 - i]; - moduleBitCount[moduleBitCount.length - 1 - i] = tmpCount; - } - endColumn = startColumn; - startColumn = endColumn - codewordBitCount; - } - // TODO implement check for width and correction of black and white bars - // use start (and maybe stop pattern) to determine if blackbars are wider than white bars. If so, adjust. - // should probably done only for codewords with a lot more than 17 bits. - // The following fixes 10-1.png, which has wide black bars and small white bars - // for (int i = 0; i < moduleBitCount.length; i++) { - // if (i % 2 == 0) { - // moduleBitCount[i]--; - // } else { - // moduleBitCount[i]++; - // } - // } - - // We could also use the width of surrounding codewords for more accurate results, but this seems - // sufficient for now - if (!checkCodewordSkew(codewordBitCount, minCodewordWidth, maxCodewordWidth)) { - // We could try to use the startX and endX position of the codeword in the same column in the previous row, - // create the bit count from it and normalize it to 8. This would help with single pixel errors. - return null; - } - - int decodedValue = PDF417CodewordDecoder.getDecodedValue(moduleBitCount); - int codeword = PDF417Common.getCodeword(decodedValue); - if (codeword == -1) { - return null; - } - return new Codeword(startColumn, endColumn, getCodewordBucketNumber(decodedValue), codeword); - } - - private static int[] getModuleBitCount(BitMatrix image, - int minColumn, - int maxColumn, - boolean leftToRight, - int startColumn, - int imageRow) { - int imageColumn = startColumn; - int[] moduleBitCount = new int[8]; - int moduleNumber = 0; - int increment = leftToRight ? 1 : -1; - boolean previousPixelValue = leftToRight; - while ((leftToRight ? imageColumn < maxColumn : imageColumn >= minColumn) && - moduleNumber < moduleBitCount.length) { - if (image.get(imageColumn, imageRow) == previousPixelValue) { - moduleBitCount[moduleNumber]++; - imageColumn += increment; - } else { - moduleNumber++; - previousPixelValue = !previousPixelValue; - } - } - if (moduleNumber == moduleBitCount.length || - ((imageColumn == (leftToRight ? maxColumn : minColumn)) && - moduleNumber == moduleBitCount.length - 1)) { - return moduleBitCount; - } - return null; - } - - private static int getNumberOfECCodeWords(int barcodeECLevel) { - return 2 << barcodeECLevel; - } - - private static int adjustCodewordStartColumn(BitMatrix image, - int minColumn, - int maxColumn, - boolean leftToRight, - int codewordStartColumn, - int imageRow) { - int correctedStartColumn = codewordStartColumn; - int increment = leftToRight ? -1 : 1; - // there should be no black pixels before the start column. If there are, then we need to start earlier. - for (int i = 0; i < 2; i++) { - while ((leftToRight ? correctedStartColumn >= minColumn : correctedStartColumn < maxColumn) && - leftToRight == image.get(correctedStartColumn, imageRow)) { - if (Math.abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_SIZE) { - return codewordStartColumn; - } - correctedStartColumn += increment; - } - increment = -increment; - leftToRight = !leftToRight; - } - return correctedStartColumn; - } - - private static boolean checkCodewordSkew(int codewordSize, int minCodewordWidth, int maxCodewordWidth) { - return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && - codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE; - } - - private static DecoderResult decodeCodewords(int[] codewords, int ecLevel, int[] erasures) throws FormatException, - ChecksumException { - if (codewords.length == 0) { - throw FormatException.getFormatInstance(); - } - - int numECCodewords = 1 << (ecLevel + 1); - int correctedErrorsCount = correctErrors(codewords, erasures, numECCodewords); - verifyCodewordCount(codewords, numECCodewords); - - // Decode the codewords - DecoderResult decoderResult = DecodedBitStreamParser.decode(codewords, String.valueOf(ecLevel)); - decoderResult.setErrorsCorrected(correctedErrorsCount); - decoderResult.setErasures(erasures.length); - return decoderResult; - } - - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place.

    - * - * @param codewords data and error correction codewords - * @param erasures positions of any known erasures - * @param numECCodewords number of error correction codewords that are available in codewords - * @throws ChecksumException if error correction fails - */ - private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws ChecksumException { - if (erasures != null && - erasures.length > numECCodewords / 2 + MAX_ERRORS || - numECCodewords < 0 || - numECCodewords > MAX_EC_CODEWORDS) { - // Too many errors or EC Codewords is corrupted - throw ChecksumException.getChecksumInstance(); - } - return errorCorrection.decode(codewords, numECCodewords, erasures); - } - - /** - * Verify that all is OK with the codeword array. - */ - private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws FormatException { - if (codewords.length < 4) { - // Codeword array size should be at least 4 allowing for - // Count CW, At least one Data CW, Error Correction CW, Error Correction CW - throw FormatException.getFormatInstance(); - } - // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data - // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad - // codewords, but excluding the number of error correction codewords. - int numberOfCodewords = codewords[0]; - if (numberOfCodewords > codewords.length) { - throw FormatException.getFormatInstance(); - } - if (numberOfCodewords == 0) { - // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) - if (numECCodewords < codewords.length) { - codewords[0] = codewords.length - numECCodewords; - } else { - throw FormatException.getFormatInstance(); - } - } - } - - private static int[] getBitCountForCodeword(int codeword) { - int[] result = new int[8]; - int previousValue = 0; - int i = result.length - 1; - while (true) { - if ((codeword & 0x1) != previousValue) { - previousValue = codeword & 0x1; - i--; - if (i < 0) { - break; - } - } - result[i]++; - codeword >>= 1; - } - return result; - } - - private static int getCodewordBucketNumber(int codeword) { - return getCodewordBucketNumber(getBitCountForCodeword(codeword)); - } - - private static int getCodewordBucketNumber(int[] moduleBitCount) { - return (moduleBitCount[0] - moduleBitCount[2] + moduleBitCount[4] - moduleBitCount[6] + 9) % 9; - } - - public static String toString(BarcodeValue[][] barcodeMatrix) { - Formatter formatter = new Formatter(); - for (int row = 0; row < barcodeMatrix.length; row++) { - formatter.format("Row %2d: ", row); - for (int column = 0; column < barcodeMatrix[row].length; column++) { - BarcodeValue barcodeValue = barcodeMatrix[row][column]; - if (barcodeValue.getValue().length == 0) { - formatter.format(" ", (Object[]) null); - } else { - formatter.format("%4d(%2d)", barcodeValue.getValue()[0], - barcodeValue.getConfidence(barcodeValue.getValue()[0])); - } - } - formatter.format("%n"); - } - String result = formatter.toString(); - formatter.close(); - return result; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ErrorCorrection.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ErrorCorrection.java deleted file mode 100644 index e34cb7f..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ErrorCorrection.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder.ec; - -import com.google.zxing.ChecksumException; - -/** - *

    PDF417 error correction implementation.

    - * - *

    This example - * is quite useful in understanding the algorithm.

    - * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder - */ -public final class ErrorCorrection { - - private final ModulusGF field; - - public ErrorCorrection() { - this.field = ModulusGF.PDF417_GF; - } - - /** - * @param received received codewords - * @param numECCodewords number of those codewords used for EC - * @param erasures location of erasures - * @return number of errors - * @throws ChecksumException if errors cannot be corrected, maybe because of too many errors - */ - public int decode(int[] received, - int numECCodewords, - int[] erasures) throws ChecksumException { - - ModulusPoly poly = new ModulusPoly(field, received); - int[] S = new int[numECCodewords]; - boolean error = false; - for (int i = numECCodewords; i > 0; i--) { - int eval = poly.evaluateAt(field.exp(i)); - S[numECCodewords - i] = eval; - if (eval != 0) { - error = true; - } - } - - if (!error) { - return 0; - } - - ModulusPoly knownErrors = field.getOne(); - if (erasures != null) { - for (int erasure : erasures) { - int b = field.exp(received.length - 1 - erasure); - // Add (1 - bx) term: - ModulusPoly term = new ModulusPoly(field, new int[]{field.subtract(0, b), 1}); - knownErrors = knownErrors.multiply(term); - } - } - - ModulusPoly syndrome = new ModulusPoly(field, S); - //syndrome = syndrome.multiply(knownErrors); - - ModulusPoly[] sigmaOmega = - runEuclideanAlgorithm(field.buildMonomial(numECCodewords, 1), syndrome, numECCodewords); - ModulusPoly sigma = sigmaOmega[0]; - ModulusPoly omega = sigmaOmega[1]; - - //sigma = sigma.multiply(knownErrors); - - int[] errorLocations = findErrorLocations(sigma); - int[] errorMagnitudes = findErrorMagnitudes(omega, sigma, errorLocations); - - for (int i = 0; i < errorLocations.length; i++) { - int position = received.length - 1 - field.log(errorLocations[i]); - if (position < 0) { - throw ChecksumException.getChecksumInstance(); - } - received[position] = field.subtract(received[position], errorMagnitudes[i]); - } - return errorLocations.length; - } - - private ModulusPoly[] runEuclideanAlgorithm(ModulusPoly a, ModulusPoly b, int R) - throws ChecksumException { - // Assume a's degree is >= b's - if (a.getDegree() < b.getDegree()) { - ModulusPoly temp = a; - a = b; - b = temp; - } - - ModulusPoly rLast = a; - ModulusPoly r = b; - ModulusPoly tLast = field.getZero(); - ModulusPoly t = field.getOne(); - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.getDegree() >= R / 2) { - ModulusPoly rLastLast = rLast; - ModulusPoly tLastLast = tLast; - rLast = r; - tLast = t; - - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.isZero()) { - // Oops, Euclidean algorithm already terminated? - throw ChecksumException.getChecksumInstance(); - } - r = rLastLast; - ModulusPoly q = field.getZero(); - int denominatorLeadingTerm = rLast.getCoefficient(rLast.getDegree()); - int dltInverse = field.inverse(denominatorLeadingTerm); - while (r.getDegree() >= rLast.getDegree() && !r.isZero()) { - int degreeDiff = r.getDegree() - rLast.getDegree(); - int scale = field.multiply(r.getCoefficient(r.getDegree()), dltInverse); - q = q.add(field.buildMonomial(degreeDiff, scale)); - r = r.subtract(rLast.multiplyByMonomial(degreeDiff, scale)); - } - - t = q.multiply(tLast).subtract(tLastLast).negative(); - } - - int sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero == 0) { - throw ChecksumException.getChecksumInstance(); - } - - int inverse = field.inverse(sigmaTildeAtZero); - ModulusPoly sigma = t.multiply(inverse); - ModulusPoly omega = r.multiply(inverse); - return new ModulusPoly[]{sigma, omega}; - } - - private int[] findErrorLocations(ModulusPoly errorLocator) throws ChecksumException { - // This is a direct application of Chien's search - int numErrors = errorLocator.getDegree(); - int[] result = new int[numErrors]; - int e = 0; - for (int i = 1; i < field.getSize() && e < numErrors; i++) { - if (errorLocator.evaluateAt(i) == 0) { - result[e] = field.inverse(i); - e++; - } - } - if (e != numErrors) { - throw ChecksumException.getChecksumInstance(); - } - return result; - } - - private int[] findErrorMagnitudes(ModulusPoly errorEvaluator, - ModulusPoly errorLocator, - int[] errorLocations) { - int errorLocatorDegree = errorLocator.getDegree(); - int[] formalDerivativeCoefficients = new int[errorLocatorDegree]; - for (int i = 1; i <= errorLocatorDegree; i++) { - formalDerivativeCoefficients[errorLocatorDegree - i] = - field.multiply(i, errorLocator.getCoefficient(i)); - } - ModulusPoly formalDerivative = new ModulusPoly(field, formalDerivativeCoefficients); - - // This is directly applying Forney's Formula - int s = errorLocations.length; - int[] result = new int[s]; - for (int i = 0; i < s; i++) { - int xiInverse = field.inverse(errorLocations[i]); - int numerator = field.subtract(0, errorEvaluator.evaluateAt(xiInverse)); - int denominator = field.inverse(formalDerivative.evaluateAt(xiInverse)); - result[i] = field.multiply(numerator, denominator); - } - return result; - } -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusGF.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusGF.java deleted file mode 100644 index 535ba02..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusGF.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder.ec; - -import com.google.zxing.pdf417.PDF417Common; - -/** - *

    A field based on powers of a generator integer, modulo some modulus.

    - * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGF - */ -public final class ModulusGF { - - public static final ModulusGF PDF417_GF = new ModulusGF(PDF417Common.NUMBER_OF_CODEWORDS, 3); - - private final int[] expTable; - private final int[] logTable; - private final ModulusPoly zero; - private final ModulusPoly one; - private final int modulus; - - private ModulusGF(int modulus, int generator) { - this.modulus = modulus; - expTable = new int[modulus]; - logTable = new int[modulus]; - int x = 1; - for (int i = 0; i < modulus; i++) { - expTable[i] = x; - x = (x * generator) % modulus; - } - for (int i = 0; i < modulus - 1; i++) { - logTable[expTable[i]] = i; - } - // logTable[0] == 0 but this should never be used - zero = new ModulusPoly(this, new int[]{0}); - one = new ModulusPoly(this, new int[]{1}); - } - - - ModulusPoly getZero() { - return zero; - } - - ModulusPoly getOne() { - return one; - } - - ModulusPoly buildMonomial(int degree, int coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient == 0) { - return zero; - } - int[] coefficients = new int[degree + 1]; - coefficients[0] = coefficient; - return new ModulusPoly(this, coefficients); - } - - int add(int a, int b) { - return (a + b) % modulus; - } - - int subtract(int a, int b) { - return (modulus + a - b) % modulus; - } - - int exp(int a) { - return expTable[a]; - } - - int log(int a) { - if (a == 0) { - throw new IllegalArgumentException(); - } - return logTable[a]; - } - - int inverse(int a) { - if (a == 0) { - throw new ArithmeticException(); - } - return expTable[modulus - logTable[a] - 1]; - } - - int multiply(int a, int b) { - if (a == 0 || b == 0) { - return 0; - } - return expTable[(logTable[a] + logTable[b]) % (modulus - 1)]; - } - - int getSize() { - return modulus; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusPoly.java b/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusPoly.java deleted file mode 100644 index 053bbf7..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/decoder/ec/ModulusPoly.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.decoder.ec; - -/** - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGFPoly - */ -final class ModulusPoly { - - private final ModulusGF field; - private final int[] coefficients; - - ModulusPoly(ModulusGF field, int[] coefficients) { - if (coefficients.length == 0) { - throw new IllegalArgumentException(); - } - this.field = field; - int coefficientsLength = coefficients.length; - if (coefficientsLength > 1 && coefficients[0] == 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - int firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) { - this.coefficients = new int[]{0}; - } else { - this.coefficients = new int[coefficientsLength - firstNonZero]; - System.arraycopy(coefficients, - firstNonZero, - this.coefficients, - 0, - this.coefficients.length); - } - } else { - this.coefficients = coefficients; - } - } - - int[] getCoefficients() { - return coefficients; - } - - /** - * @return degree of this polynomial - */ - int getDegree() { - return coefficients.length - 1; - } - - /** - * @return true iff this polynomial is the monomial "0" - */ - boolean isZero() { - return coefficients[0] == 0; - } - - /** - * @return coefficient of x^degree term in this polynomial - */ - int getCoefficient(int degree) { - return coefficients[coefficients.length - 1 - degree]; - } - - /** - * @return evaluation of this polynomial at a given point - */ - int evaluateAt(int a) { - if (a == 0) { - // Just return the x^0 coefficient - return getCoefficient(0); - } - int size = coefficients.length; - if (a == 1) { - // Just the sum of the coefficients - int result = 0; - for (int coefficient : coefficients) { - result = field.add(result, coefficient); - } - return result; - } - int result = coefficients[0]; - for (int i = 1; i < size; i++) { - result = field.add(field.multiply(a, result), coefficients[i]); - } - return result; - } - - ModulusPoly add(ModulusPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (isZero()) { - return other; - } - if (other.isZero()) { - return this; - } - - int[] smallerCoefficients = this.coefficients; - int[] largerCoefficients = other.coefficients; - if (smallerCoefficients.length > largerCoefficients.length) { - int[] temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - int[] sumDiff = new int[largerCoefficients.length]; - int lengthDiff = largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - System.arraycopy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - - for (int i = lengthDiff; i < largerCoefficients.length; i++) { - sumDiff[i] = field.add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - - return new ModulusPoly(field, sumDiff); - } - - ModulusPoly subtract(ModulusPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (other.isZero()) { - return this; - } - return add(other.negative()); - } - - ModulusPoly multiply(ModulusPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (isZero() || other.isZero()) { - return field.getZero(); - } - int[] aCoefficients = this.coefficients; - int aLength = aCoefficients.length; - int[] bCoefficients = other.coefficients; - int bLength = bCoefficients.length; - int[] product = new int[aLength + bLength - 1]; - for (int i = 0; i < aLength; i++) { - int aCoeff = aCoefficients[i]; - for (int j = 0; j < bLength; j++) { - product[i + j] = field.add(product[i + j], field.multiply(aCoeff, bCoefficients[j])); - } - } - return new ModulusPoly(field, product); - } - - ModulusPoly negative() { - int size = coefficients.length; - int[] negativeCoefficients = new int[size]; - for (int i = 0; i < size; i++) { - negativeCoefficients[i] = field.subtract(0, coefficients[i]); - } - return new ModulusPoly(field, negativeCoefficients); - } - - ModulusPoly multiply(int scalar) { - if (scalar == 0) { - return field.getZero(); - } - if (scalar == 1) { - return this; - } - int size = coefficients.length; - int[] product = new int[size]; - for (int i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], scalar); - } - return new ModulusPoly(field, product); - } - - ModulusPoly multiplyByMonomial(int degree, int coefficient) { - if (degree < 0) { - throw new IllegalArgumentException(); - } - if (coefficient == 0) { - return field.getZero(); - } - int size = coefficients.length; - int[] product = new int[size + degree]; - for (int i = 0; i < size; i++) { - product[i] = field.multiply(coefficients[i], coefficient); - } - return new ModulusPoly(field, product); - } - - ModulusPoly[] divide(ModulusPoly other) { - if (!field.equals(other.field)) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (other.isZero()) { - throw new IllegalArgumentException("Divide by 0"); - } - - ModulusPoly quotient = field.getZero(); - ModulusPoly remainder = this; - - int denominatorLeadingTerm = other.getCoefficient(other.getDegree()); - int inverseDenominatorLeadingTerm = field.inverse(denominatorLeadingTerm); - - while (remainder.getDegree() >= other.getDegree() && !remainder.isZero()) { - int degreeDifference = remainder.getDegree() - other.getDegree(); - int scale = field.multiply(remainder.getCoefficient(remainder.getDegree()), inverseDenominatorLeadingTerm); - ModulusPoly term = other.multiplyByMonomial(degreeDifference, scale); - ModulusPoly iterationQuotient = field.buildMonomial(degreeDifference, scale); - quotient = quotient.add(iterationQuotient); - remainder = remainder.subtract(term); - } - - return new ModulusPoly[] { quotient, remainder }; - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(8 * getDegree()); - for (int degree = getDegree(); degree >= 0; degree--) { - int coefficient = getCoefficient(degree); - if (coefficient != 0) { - if (coefficient < 0) { - result.append(" - "); - coefficient = -coefficient; - } else { - if (result.length() > 0) { - result.append(" + "); - } - } - if (degree == 0 || coefficient != 1) { - result.append(coefficient); - } - if (degree != 0) { - if (degree == 1) { - result.append('x'); - } else { - result.append("x^"); - result.append(degree); - } - } - } - } - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/detector/Detector.java b/zxing/src/main/java/com/google/zxing/pdf417/detector/Detector.java deleted file mode 100644 index 1538e4a..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/detector/Detector.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright 2009 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.detector; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - *

    Encapsulates logic that can detect a PDF417 Code in an image, even if the - * PDF417 Code is rotated or skewed, or partially obscured.

    - * - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author dswitkin@google.com (Daniel Switkin) - * @author Guenther Grau - */ -public final class Detector { - - private static final int[] INDEXES_START_PATTERN = {0, 4, 1, 5}; - private static final int[] INDEXES_STOP_PATTERN = {6, 2, 7, 3}; - private static final float MAX_AVG_VARIANCE = 0.42f; - private static final float MAX_INDIVIDUAL_VARIANCE = 0.8f; - - // B S B S B S B S Bar/Space pattern - // 11111111 0 1 0 1 0 1 000 - private static final int[] START_PATTERN = {8, 1, 1, 1, 1, 1, 1, 3}; - // 1111111 0 1 000 1 0 1 00 1 - private static final int[] STOP_PATTERN = {7, 1, 1, 3, 1, 1, 1, 2, 1}; - private static final int MAX_PIXEL_DRIFT = 3; - private static final int MAX_PATTERN_DRIFT = 5; - // if we set the value too low, then we don't detect the correct height of the bar if the start patterns are damaged. - // if we set the value too high, then we might detect the start pattern from a neighbor barcode. - private static final int SKIPPED_ROW_COUNT_MAX = 25; - // A PDF471 barcode should have at least 3 rows, with each row being >= 3 times the module width. Therefore it should be at least - // 9 pixels tall. To be conservative, we use about half the size to ensure we don't miss it. - private static final int ROW_STEP = 5; - private static final int BARCODE_MIN_HEIGHT = 10; - - private Detector() { - } - - /** - *

    Detects a PDF417 Code in an image. Only checks 0 and 180 degree rotations.

    - * - * @param image barcode image to decode - * @param hints optional hints to detector - * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will - * be found and returned - * @return {@link PDF417DetectorResult} encapsulating results of detecting a PDF417 code - * @throws NotFoundException if no PDF417 Code can be found - */ - public static PDF417DetectorResult detect(BinaryBitmap image, Map hints, boolean multiple) - throws NotFoundException { - // TODO detection improvement, tryHarder could try several different luminance thresholds/blackpoints or even - // different binarizers - //boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - - BitMatrix bitMatrix = image.getBlackMatrix(); - - List barcodeCoordinates = detect(multiple, bitMatrix); - if (barcodeCoordinates.isEmpty()) { - bitMatrix = bitMatrix.clone(); - bitMatrix.rotate180(); - barcodeCoordinates = detect(multiple, bitMatrix); - } - return new PDF417DetectorResult(bitMatrix, barcodeCoordinates); - } - - /** - * Detects PDF417 codes in an image. Only checks 0 degree rotation - * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will - * be found and returned - * @param bitMatrix bit matrix to detect barcodes in - * @return List of ResultPoint arrays containing the coordinates of found barcodes - */ - private static List detect(boolean multiple, BitMatrix bitMatrix) { - List barcodeCoordinates = new ArrayList<>(); - int row = 0; - int column = 0; - boolean foundBarcodeInRow = false; - while (row < bitMatrix.getHeight()) { - ResultPoint[] vertices = findVertices(bitMatrix, row, column); - - if (vertices[0] == null && vertices[3] == null) { - if (!foundBarcodeInRow) { - // we didn't find any barcode so that's the end of searching - break; - } - // we didn't find a barcode starting at the given column and row. Try again from the first column and slightly - // below the lowest barcode we found so far. - foundBarcodeInRow = false; - column = 0; - for (ResultPoint[] barcodeCoordinate : barcodeCoordinates) { - if (barcodeCoordinate[1] != null) { - row = (int) Math.max(row, barcodeCoordinate[1].getY()); - } - if (barcodeCoordinate[3] != null) { - row = Math.max(row, (int) barcodeCoordinate[3].getY()); - } - } - row += ROW_STEP; - continue; - } - foundBarcodeInRow = true; - barcodeCoordinates.add(vertices); - if (!multiple) { - break; - } - // if we didn't find a right row indicator column, then continue the search for the next barcode after the - // start pattern of the barcode just found. - if (vertices[2] != null) { - column = (int) vertices[2].getX(); - row = (int) vertices[2].getY(); - } else { - column = (int) vertices[4].getX(); - row = (int) vertices[4].getY(); - } - } - return barcodeCoordinates; - } - - /** - * Locate the vertices and the codewords area of a black blob using the Start - * and Stop patterns as locators. - * - * @param matrix the scanned barcode image. - * @return an array containing the vertices: - * vertices[0] x, y top left barcode - * vertices[1] x, y bottom left barcode - * vertices[2] x, y top right barcode - * vertices[3] x, y bottom right barcode - * vertices[4] x, y top left codeword area - * vertices[5] x, y bottom left codeword area - * vertices[6] x, y top right codeword area - * vertices[7] x, y bottom right codeword area - */ - private static ResultPoint[] findVertices(BitMatrix matrix, int startRow, int startColumn) { - int height = matrix.getHeight(); - int width = matrix.getWidth(); - - ResultPoint[] result = new ResultPoint[8]; - copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN), - INDEXES_START_PATTERN); - - if (result[4] != null) { - startColumn = (int) result[4].getX(); - startRow = (int) result[4].getY(); - } - copyToResult(result, findRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN), - INDEXES_STOP_PATTERN); - return result; - } - - private static void copyToResult(ResultPoint[] result, ResultPoint[] tmpResult, int[] destinationIndexes) { - for (int i = 0; i < destinationIndexes.length; i++) { - result[destinationIndexes[i]] = tmpResult[i]; - } - } - - private static ResultPoint[] findRowsWithPattern(BitMatrix matrix, - int height, - int width, - int startRow, - int startColumn, - int[] pattern) { - ResultPoint[] result = new ResultPoint[4]; - boolean found = false; - int[] counters = new int[pattern.length]; - for (; startRow < height; startRow += ROW_STEP) { - int[] loc = findGuardPattern(matrix, startColumn, startRow, width, false, pattern, counters); - if (loc != null) { - while (startRow > 0) { - int[] previousRowLoc = findGuardPattern(matrix, startColumn, --startRow, width, false, pattern, counters); - if (previousRowLoc != null) { - loc = previousRowLoc; - } else { - startRow++; - break; - } - } - result[0] = new ResultPoint(loc[0], startRow); - result[1] = new ResultPoint(loc[1], startRow); - found = true; - break; - } - } - int stopRow = startRow + 1; - // Last row of the current symbol that contains pattern - if (found) { - int skippedRowCount = 0; - int[] previousRowLoc = {(int) result[0].getX(), (int) result[1].getX()}; - for (; stopRow < height; stopRow++) { - int[] loc = findGuardPattern(matrix, previousRowLoc[0], stopRow, width, false, pattern, counters); - // a found pattern is only considered to belong to the same barcode if the start and end positions - // don't differ too much. Pattern drift should be not bigger than two for consecutive rows. With - // a higher number of skipped rows drift could be larger. To keep it simple for now, we allow a slightly - // larger drift and don't check for skipped rows. - if (loc != null && - Math.abs(previousRowLoc[0] - loc[0]) < MAX_PATTERN_DRIFT && - Math.abs(previousRowLoc[1] - loc[1]) < MAX_PATTERN_DRIFT) { - previousRowLoc = loc; - skippedRowCount = 0; - } else { - if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { - break; - } else { - skippedRowCount++; - } - } - } - stopRow -= skippedRowCount + 1; - result[2] = new ResultPoint(previousRowLoc[0], stopRow); - result[3] = new ResultPoint(previousRowLoc[1], stopRow); - } - if (stopRow - startRow < BARCODE_MIN_HEIGHT) { - for (int i = 0; i < result.length; i++) { - result[i] = null; - } - } - return result; - } - - /** - * @param matrix row of black/white values to search - * @param column x position to start search - * @param row y position to start search - * @param width the number of pixels to search on this row - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @param counters array of counters, as long as pattern, to re-use - * @return start/end horizontal offset of guard pattern, as an array of two ints. - */ - private static int[] findGuardPattern(BitMatrix matrix, - int column, - int row, - int width, - boolean whiteFirst, - int[] pattern, - int[] counters) { - Arrays.fill(counters, 0, counters.length, 0); - int patternLength = pattern.length; - boolean isWhite = whiteFirst; - int patternStart = column; - int pixelDrift = 0; - - // if there are black pixels left of the current pixel shift to the left, but only for MAX_PIXEL_DRIFT pixels - while (matrix.get(patternStart, row) && patternStart > 0 && pixelDrift++ < MAX_PIXEL_DRIFT) { - patternStart--; - } - int x = patternStart; - int counterPosition = 0; - for (; x < width; x++) { - boolean pixel = matrix.get(x, row); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return new int[] {patternStart, x}; - } - patternStart += counters[0] + counters[1]; - System.arraycopy(counters, 2, counters, 0, patternLength - 2); - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return new int[] {patternStart, x - 1}; - } - } - return null; - } - - /** - * Determines how closely a set of observed counts of runs of black/white - * values matches a given target pattern. This is reported as the ratio of - * the total variance from the expected pattern proportions across all - * pattern elements, to the length of the pattern. - * - * @param counters observed counters - * @param pattern expected pattern - * @param maxIndividualVariance The most any counter can differ before we give up - * @return ratio of total variance between counters and pattern compared to total pattern size - */ - private static float patternMatchVariance(int[] counters, int[] pattern, float maxIndividualVariance) { - int numCounters = counters.length; - int total = 0; - int patternLength = 0; - for (int i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this - // is too small to reliably match, so fail: - return Float.POSITIVE_INFINITY; - } - // We're going to fake floating-point math in integers. We just need to use more bits. - // Scale up patternLength so that intermediate values below like scaledCounter will have - // more "significant digits". - float unitBarWidth = (float) total / patternLength; - maxIndividualVariance *= unitBarWidth; - - float totalVariance = 0.0f; - for (int x = 0; x < numCounters; x++) { - int counter = counters[x]; - float scaledPattern = pattern[x] * unitBarWidth; - float variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return Float.POSITIVE_INFINITY; - } - totalVariance += variance; - } - return totalVariance / total; - } -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/detector/PDF417DetectorResult.java b/zxing/src/main/java/com/google/zxing/pdf417/detector/PDF417DetectorResult.java deleted file mode 100644 index 081b778..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/detector/PDF417DetectorResult.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.detector; - -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; - -import java.util.List; - -/** - * @author Guenther Grau - */ -public final class PDF417DetectorResult { - - private final BitMatrix bits; - private final List points; - - public PDF417DetectorResult(BitMatrix bits, List points) { - this.bits = bits; - this.points = points; - } - - public BitMatrix getBits() { - return bits; - } - - public List getPoints() { - return points; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeMatrix.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeMatrix.java deleted file mode 100644 index 1cff113..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeMatrix.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.encoder; - -/** - * Holds all of the information for a barcode in a format where it can be easily accessable - * - * @author Jacob Haynes - */ -public final class BarcodeMatrix { - - private final BarcodeRow[] matrix; - private int currentRow; - private final int height; - private final int width; - - /** - * @param height the height of the matrix (Rows) - * @param width the width of the matrix (Cols) - */ - BarcodeMatrix(int height, int width) { - matrix = new BarcodeRow[height]; - //Initializes the array to the correct width - for (int i = 0, matrixLength = matrix.length; i < matrixLength; i++) { - matrix[i] = new BarcodeRow((width + 4) * 17 + 1); - } - this.width = width * 17; - this.height = height; - this.currentRow = -1; - } - - void set(int x, int y, byte value) { - matrix[y].set(x, value); - } - - /* - void setMatrix(int x, int y, boolean black) { - set(x, y, (byte) (black ? 1 : 0)); - } - */ - - void startRow() { - ++currentRow; - } - - BarcodeRow getCurrentRow() { - return matrix[currentRow]; - } - - public byte[][] getMatrix() { - return getScaledMatrix(1, 1); - } - - /* - public byte[][] getScaledMatrix(int scale) { - return getScaledMatrix(scale, scale); - } - */ - - public byte[][] getScaledMatrix(int xScale, int yScale) { - byte[][] matrixOut = new byte[height * yScale][width * xScale]; - int yMax = height * yScale; - for (int i = 0; i < yMax; i++) { - matrixOut[yMax - i - 1] = matrix[i / yScale].getScaledRow(xScale); - } - return matrixOut; - } -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeRow.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeRow.java deleted file mode 100644 index 3ec70d5..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/BarcodeRow.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.encoder; - -/** - * @author Jacob Haynes - */ -final class BarcodeRow { - - private final byte[] row; - //A tacker for position in the bar - private int currentLocation; - - /** - * Creates a Barcode row of the width - */ - BarcodeRow(int width) { - this.row = new byte[width]; - currentLocation = 0; - } - - /** - * Sets a specific location in the bar - * - * @param x The location in the bar - * @param value Black if true, white if false; - */ - void set(int x, byte value) { - row[x] = value; - } - - /** - * Sets a specific location in the bar - * - * @param x The location in the bar - * @param black Black if true, white if false; - */ - void set(int x, boolean black) { - row[x] = (byte) (black ? 1 : 0); - } - - /** - * @param black A boolean which is true if the bar black false if it is white - * @param width How many spots wide the bar is. - */ - void addBar(boolean black, int width) { - for (int ii = 0; ii < width; ii++) { - set(currentLocation++, black); - } - } - - /* - byte[] getRow() { - return row; - } - */ - - /** - * This function scales the row - * - * @param scale How much you want the image to be scaled, must be greater than or equal to 1. - * @return the scaled row - */ - byte[] getScaledRow(int scale) { - byte[] output = new byte[row.length * scale]; - for (int i = 0; i < output.length; i++) { - output[i] = row[i / scale]; - } - return output; - } -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/Compaction.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/Compaction.java deleted file mode 100644 index 3a2c032..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/Compaction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.encoder; - -/** - * Represents possible PDF417 barcode compaction types. - */ -public enum Compaction { - - AUTO, - TEXT, - BYTE, - NUMERIC - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/Dimensions.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/Dimensions.java deleted file mode 100644 index 83a736b..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/Dimensions.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2012 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.pdf417.encoder; - -/** - * Data object to specify the minimum and maximum number of rows and columns for a PDF417 barcode. - * - * @author qwandor@google.com (Andrew Walbran) - */ -public final class Dimensions { - - private final int minCols; - private final int maxCols; - private final int minRows; - private final int maxRows; - - public Dimensions(int minCols, int maxCols, int minRows, int maxRows) { - this.minCols = minCols; - this.maxCols = maxCols; - this.minRows = minRows; - this.maxRows = maxRows; - } - - public int getMinCols() { - return minCols; - } - - public int getMaxCols() { - return maxCols; - } - - public int getMinRows() { - return minRows; - } - - public int getMaxRows() { - return maxRows; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417.java deleted file mode 100644 index 2927732..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417.java +++ /dev/null @@ -1,769 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file has been modified from its original form in Barcode4J. - */ - -package com.google.zxing.pdf417.encoder; - -import com.google.zxing.WriterException; - -import java.nio.charset.Charset; - -/** - * Top-level class for the logic part of the PDF417 implementation. - */ -public final class PDF417 { - - /** - * The start pattern (17 bits) - */ - private static final int START_PATTERN = 0x1fea8; - /** - * The stop pattern (18 bits) - */ - private static final int STOP_PATTERN = 0x3fa29; - - /** - * The codeword table from the Annex A of ISO/IEC 15438:2001(E). - */ - private static final int[][] CODEWORD_TABLE = { - {0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, - 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, - 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, - 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, - 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, - 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, - 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, - 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, - 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, - 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, - 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, - 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, - 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, - 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, - 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, - 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, - 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, - 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, - 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, - 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, - 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, - 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, - 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, - 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, - 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, - 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, - 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, - 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, - 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, - 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, - 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, - 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, - 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, - 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, - 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, - 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, - 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, - 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, - 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, - 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, - 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, - 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, - 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, - 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, - 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, - 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, - 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, - 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, - 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, - 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, - 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, - 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, - 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, - 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, - 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, - 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, - 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, - 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, - 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, - 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, - 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, - 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, - 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, - 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, - 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, - 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, - 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, - 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, - 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, - 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, - 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, - 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, - 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, - 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, - 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, - 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, - 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, - 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, - 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, - 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, - 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, - 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, - 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, - 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, - 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, - 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, - 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, - 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, - 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, - 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, - 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, - 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, - 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, - 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, - 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, - 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, - 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, - 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, - 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, - 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, - 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, - 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, - 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, - 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, - 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, - 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, - 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, - 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, - 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, - 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, - 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, - 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, - 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, - 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, - 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, - 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, - 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, - 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, - 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, - 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, - 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, - 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, - 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, - 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, - 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, - 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, - 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, - 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, - 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, - 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, - 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, - 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, - 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, - 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, - 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, - 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, - 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, - 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, - 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, - 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, - 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, - 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, - 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, - 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, - 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, - 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, - 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, - 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, - 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, - 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, - 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, - 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, - 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, - 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, - 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4}, - {0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, - 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, - 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, - 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, - 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, - 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, - 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, - 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, - 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, - 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, - 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, - 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, - 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, - 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, - 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, - 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, - 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, - 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, - 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, - 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, - 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, - 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, - 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, - 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, - 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, - 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, - 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, - 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, - 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, - 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, - 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, - 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, - 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, - 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, - 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, - 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, - 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, - 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, - 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, - 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, - 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, - 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, - 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, - 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, - 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, - 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, - 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, - 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, - 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, - 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, - 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, - 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, - 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, - 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, - 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, - 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, - 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, - 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, - 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, - 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, - 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, - 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, - 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, - 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, - 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, - 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, - 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, - 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, - 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, - 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, - 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, - 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, - 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, - 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, - 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, - 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, - 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, - 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, - 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, - 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, - 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, - 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, - 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, - 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, - 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, - 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, - 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, - 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, - 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, - 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, - 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, - 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, - 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, - 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, - 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, - 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, - 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, - 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, - 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, - 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, - 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, - 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, - 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, - 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, - 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, - 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, - 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, - 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, - 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, - 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, - 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, - 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, - 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, - 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, - 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, - 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, - 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, - 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, - 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, - 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, - 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, - 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, - 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, - 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, - 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, - 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, - 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, - 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, - 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, - 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, - 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, - 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, - 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, - 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, - 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, - 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, - 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, - 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, - 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, - 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, - 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, - 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, - 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, - 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, - 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, - 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, - 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, - 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, - 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, - 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, - 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, - 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, - 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, - 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, - 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26}, - {0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, - 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, - 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, - 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, - 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, - 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, - 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, - 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, - 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, - 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, - 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, - 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, - 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, - 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, - 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, - 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, - 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, - 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, - 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, - 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, - 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, - 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, - 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, - 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, - 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, - 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, - 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, - 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, - 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, - 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, - 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, - 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, - 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, - 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, - 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, - 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, - 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, - 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, - 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, - 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, - 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, - 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, - 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, - 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, - 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, - 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, - 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, - 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, - 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, - 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, - 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, - 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, - 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, - 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, - 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, - 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, - 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, - 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, - 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, - 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, - 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, - 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, - 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, - 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, - 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, - 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, - 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, - 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, - 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, - 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, - 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, - 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, - 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, - 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, - 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, - 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, - 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, - 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, - 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, - 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, - 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, - 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, - 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, - 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, - 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, - 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, - 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, - 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, - 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, - 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, - 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, - 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, - 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, - 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, - 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, - 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, - 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, - 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, - 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, - 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, - 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, - 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, - 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, - 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, - 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, - 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, - 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, - 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, - 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, - 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, - 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, - 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, - 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, - 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, - 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, - 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, - 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, - 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, - 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, - 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, - 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, - 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, - 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, - 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, - 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, - 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, - 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, - 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, - 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, - 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, - 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, - 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, - 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, - 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, - 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, - 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, - 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, - 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, - 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, - 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, - 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, - 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, - 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, - 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, - 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, - 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, - 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, - 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, - 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, - 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, - 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, - 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, - 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, - 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, - 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea}}; - - private static final float PREFERRED_RATIO = 3.0f; - private static final float DEFAULT_MODULE_WIDTH = 0.357f; //1px in mm - private static final float HEIGHT = 2.0f; //mm - - private BarcodeMatrix barcodeMatrix; - private boolean compact; - private Compaction compaction; - private Charset encoding; - private int minCols; - private int maxCols; - private int maxRows; - private int minRows; - - public PDF417() { - this(false); - } - - public PDF417(boolean compact) { - this.compact = compact; - compaction = Compaction.AUTO; - encoding = null; // Use default - minCols = 2; - maxCols = 30; - maxRows = 30; - minRows = 2; - } - - public BarcodeMatrix getBarcodeMatrix() { - return barcodeMatrix; - } - - /** - * Calculates the necessary number of rows as described in annex Q of ISO/IEC 15438:2001(E). - * - * @param m the number of source codewords prior to the additional of the Symbol Length - * Descriptor and any pad codewords - * @param k the number of error correction codewords - * @param c the number of columns in the symbol in the data region (excluding start, stop and - * row indicator codewords) - * @return the number of rows in the symbol (r) - */ - private static int calculateNumberOfRows(int m, int k, int c) { - int r = ((m + 1 + k) / c) + 1; - if (c * r >= (m + 1 + k + c)) { - r--; - } - return r; - } - - /** - * Calculates the number of pad codewords as described in 4.9.2 of ISO/IEC 15438:2001(E). - * - * @param m the number of source codewords prior to the additional of the Symbol Length - * Descriptor and any pad codewords - * @param k the number of error correction codewords - * @param c the number of columns in the symbol in the data region (excluding start, stop and - * row indicator codewords) - * @param r the number of rows in the symbol - * @return the number of pad codewords - */ - private static int getNumberOfPadCodewords(int m, int k, int c, int r) { - int n = c * r - k; - return n > m + 1 ? n - m - 1 : 0; - } - - private static void encodeChar(int pattern, int len, BarcodeRow logic) { - int map = 1 << len - 1; - boolean last = (pattern & map) != 0; //Initialize to inverse of first bit - int width = 0; - for (int i = 0; i < len; i++) { - boolean black = (pattern & map) != 0; - if (last == black) { - width++; - } else { - logic.addBar(last, width); - - last = black; - width = 1; - } - map >>= 1; - } - logic.addBar(last, width); - } - - private void encodeLowLevel(CharSequence fullCodewords, - int c, - int r, - int errorCorrectionLevel, - BarcodeMatrix logic) { - - int idx = 0; - for (int y = 0; y < r; y++) { - int cluster = y % 3; - logic.startRow(); - encodeChar(START_PATTERN, 17, logic.getCurrentRow()); - - int left; - int right; - if (cluster == 0) { - left = (30 * (y / 3)) + ((r - 1) / 3); - right = (30 * (y / 3)) + (c - 1); - } else if (cluster == 1) { - left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); - right = (30 * (y / 3)) + ((r - 1) / 3); - } else { - left = (30 * (y / 3)) + (c - 1); - right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); - } - - int pattern = CODEWORD_TABLE[cluster][left]; - encodeChar(pattern, 17, logic.getCurrentRow()); - - for (int x = 0; x < c; x++) { - pattern = CODEWORD_TABLE[cluster][fullCodewords.charAt(idx)]; - encodeChar(pattern, 17, logic.getCurrentRow()); - idx++; - } - - if (compact) { - encodeChar(STOP_PATTERN, 1, logic.getCurrentRow()); // encodes stop line for compact pdf417 - } else { - pattern = CODEWORD_TABLE[cluster][right]; - encodeChar(pattern, 17, logic.getCurrentRow()); - - encodeChar(STOP_PATTERN, 18, logic.getCurrentRow()); - } - } - } - - /** - * @param msg message to encode - * @param errorCorrectionLevel PDF417 error correction level to use - * @throws WriterException if the contents cannot be encoded in this format - */ - public void generateBarcodeLogic(String msg, int errorCorrectionLevel) throws WriterException { - - //1. step: High-level encoding - int errorCorrectionCodeWords = PDF417ErrorCorrection.getErrorCorrectionCodewordCount(errorCorrectionLevel); - String highLevel = PDF417HighLevelEncoder.encodeHighLevel(msg, compaction, encoding); - int sourceCodeWords = highLevel.length(); - - int[] dimension = determineDimensions(sourceCodeWords, errorCorrectionCodeWords); - - int cols = dimension[0]; - int rows = dimension[1]; - - int pad = getNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows); - - //2. step: construct data codewords - if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { // +1 for symbol length CW - throw new WriterException( - "Encoded message contains too many code words, message too big (" + msg.length() + " bytes)"); - } - int n = sourceCodeWords + pad + 1; - StringBuilder sb = new StringBuilder(n); - sb.append((char) n); - sb.append(highLevel); - for (int i = 0; i < pad; i++) { - sb.append((char) 900); //PAD characters - } - String dataCodewords = sb.toString(); - - //3. step: Error correction - String ec = PDF417ErrorCorrection.generateErrorCorrection(dataCodewords, errorCorrectionLevel); - String fullCodewords = dataCodewords + ec; - - //4. step: low-level encoding - barcodeMatrix = new BarcodeMatrix(rows, cols); - encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel, barcodeMatrix); - } - - /** - * Determine optimal nr of columns and rows for the specified number of - * codewords. - * - * @param sourceCodeWords number of code words - * @param errorCorrectionCodeWords number of error correction code words - * @return dimension object containing cols as width and rows as height - */ - private int[] determineDimensions(int sourceCodeWords, int errorCorrectionCodeWords) throws WriterException { - float ratio = 0.0f; - int[] dimension = null; - - for (int cols = minCols; cols <= maxCols; cols++) { - - int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); - - if (rows < minRows) { - break; - } - - if (rows > maxRows) { - continue; - } - - float newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); - - // ignore if previous ratio is closer to preferred ratio - if (dimension != null && Math.abs(newRatio - PREFERRED_RATIO) > Math.abs(ratio - PREFERRED_RATIO)) { - continue; - } - - ratio = newRatio; - dimension = new int[] {cols, rows}; - } - - // Handle case when min values were larger than necessary - if (dimension == null) { - int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, minCols); - if (rows < minRows) { - dimension = new int[]{minCols, minRows}; - } - } - - if (dimension == null) { - throw new WriterException("Unable to fit message in columns"); - } - - return dimension; - } - - /** - * Sets max/min row/col values - * - * @param maxCols maximum allowed columns - * @param minCols minimum allowed columns - * @param maxRows maximum allowed rows - * @param minRows minimum allowed rows - */ - public void setDimensions(int maxCols, int minCols, int maxRows, int minRows) { - this.maxCols = maxCols; - this.minCols = minCols; - this.maxRows = maxRows; - this.minRows = minRows; - } - - /** - * @param compaction compaction mode to use - */ - public void setCompaction(Compaction compaction) { - this.compaction = compaction; - } - - /** - * @param compact if true, enables compaction - */ - public void setCompact(boolean compact) { - this.compact = compact; - } - - /** - * @param encoding sets character encoding to use - */ - public void setEncoding(Charset encoding) { - this.encoding = encoding; - } - -} - diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417ErrorCorrection.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417ErrorCorrection.java deleted file mode 100644 index 6528172..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417ErrorCorrection.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file has been modified from its original form in Barcode4J. - */ - -package com.google.zxing.pdf417.encoder; - -import com.google.zxing.WriterException; - -/** - * PDF417 error correction code following the algorithm described in ISO/IEC 15438:2001(E) in - * chapter 4.10. - */ -final class PDF417ErrorCorrection { - - /** - * Tables of coefficients for calculating error correction words - * (see annex F, ISO/IEC 15438:2001(E)) - */ - private static final int[][] EC_COEFFICIENTS = { - {27, 917}, - {522, 568, 723, 809}, - {237, 308, 436, 284, 646, 653, 428, 379}, - {274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, - 42, 176, 65}, - {361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, - 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, - 133, 231, 390, 685, 330, 63, 410}, - {539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, - 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, - 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, - 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, - 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, - 623, 264, 543}, - {521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, - 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, - 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, - 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, - 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, - 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, - 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, - 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, - 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, - 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, - 315, 550, 86, 801, 4, 108, 539}, - {524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, - 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, - 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, - 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, - 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, - 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, - 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, - 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, - 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, - 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, - 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, - 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, - 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, - 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, - 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, - 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, - 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, - 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, - 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, - 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, - 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, - 55, 497, 10}, - {352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, - 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, - 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, - 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, - 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, - 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, - 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, - 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, - 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, - 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, - 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, - 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, - 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, - 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, - 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, - 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, - 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, - 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, - 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, - 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, - 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, - 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, - 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, - 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, - 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, - 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, - 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, - 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, - 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, - 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, - 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, - 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, - 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, - 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, - 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, - 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, - 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, - 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, - 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, - 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, - 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, - 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, - 410, 389, 244, 31, 121, 303, 263}}; - - private PDF417ErrorCorrection() { - } - - /** - * Determines the number of error correction codewords for a specified error correction - * level. - * - * @param errorCorrectionLevel the error correction level (0-8) - * @return the number of codewords generated for error correction - */ - static int getErrorCorrectionCodewordCount(int errorCorrectionLevel) { - if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { - throw new IllegalArgumentException("Error correction level must be between 0 and 8!"); - } - return 1 << (errorCorrectionLevel + 1); - } - - /** - * Returns the recommended minimum error correction level as described in annex E of - * ISO/IEC 15438:2001(E). - * - * @param n the number of data codewords - * @return the recommended minimum error correction level - */ - static int getRecommendedMinimumErrorCorrectionLevel(int n) throws WriterException { - if (n <= 0) { - throw new IllegalArgumentException("n must be > 0"); - } - if (n <= 40) { - return 2; - } - if (n <= 160) { - return 3; - } - if (n <= 320) { - return 4; - } - if (n <= 863) { - return 5; - } - throw new WriterException("No recommendation possible"); - } - - /** - * Generates the error correction codewords according to 4.10 in ISO/IEC 15438:2001(E). - * - * @param dataCodewords the data codewords - * @param errorCorrectionLevel the error correction level (0-8) - * @return the String representing the error correction codewords - */ - static String generateErrorCorrection(CharSequence dataCodewords, int errorCorrectionLevel) { - int k = getErrorCorrectionCodewordCount(errorCorrectionLevel); - char[] e = new char[k]; - int sld = dataCodewords.length(); - for (int i = 0; i < sld; i++) { - int t1 = (dataCodewords.charAt(i) + e[e.length - 1]) % 929; - int t2; - int t3; - for (int j = k - 1; j >= 1; j--) { - t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; - t3 = 929 - t2; - e[j] = (char) ((e[j - 1] + t3) % 929); - } - t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; - t3 = 929 - t2; - e[0] = (char) (t3 % 929); - } - StringBuilder sb = new StringBuilder(k); - for (int j = k - 1; j >= 0; j--) { - if (e[j] != 0) { - e[j] = (char) (929 - e[j]); - } - sb.append(e[j]); - } - return sb.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java b/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java deleted file mode 100644 index 0f0e3a8..0000000 --- a/zxing/src/main/java/com/google/zxing/pdf417/encoder/PDF417HighLevelEncoder.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file has been modified from its original form in Barcode4J. - */ - -package com.google.zxing.pdf417.encoder; - -import com.google.zxing.WriterException; -import com.google.zxing.common.CharacterSetECI; - -import java.math.BigInteger; -import java.nio.charset.Charset; -import java.nio.charset.CharsetEncoder; -import java.util.Arrays; - -/** - * PDF417 high-level encoder following the algorithm described in ISO/IEC 15438:2001(E) in - * annex P. - */ -final class PDF417HighLevelEncoder { - - /** - * code for Text compaction - */ - private static final int TEXT_COMPACTION = 0; - - /** - * code for Byte compaction - */ - private static final int BYTE_COMPACTION = 1; - - /** - * code for Numeric compaction - */ - private static final int NUMERIC_COMPACTION = 2; - - /** - * Text compaction submode Alpha - */ - private static final int SUBMODE_ALPHA = 0; - - /** - * Text compaction submode Lower - */ - private static final int SUBMODE_LOWER = 1; - - /** - * Text compaction submode Mixed - */ - private static final int SUBMODE_MIXED = 2; - - /** - * Text compaction submode Punctuation - */ - private static final int SUBMODE_PUNCTUATION = 3; - - /** - * mode latch to Text Compaction mode - */ - private static final int LATCH_TO_TEXT = 900; - - /** - * mode latch to Byte Compaction mode (number of characters NOT a multiple of 6) - */ - private static final int LATCH_TO_BYTE_PADDED = 901; - - /** - * mode latch to Numeric Compaction mode - */ - private static final int LATCH_TO_NUMERIC = 902; - - /** - * mode shift to Byte Compaction mode - */ - private static final int SHIFT_TO_BYTE = 913; - - /** - * mode latch to Byte Compaction mode (number of characters a multiple of 6) - */ - private static final int LATCH_TO_BYTE = 924; - - /** - * identifier for a user defined Extended Channel Interpretation (ECI) - */ - private static final int ECI_USER_DEFINED = 925; - - /** - * identifier for a general purpose ECO format - */ - private static final int ECI_GENERAL_PURPOSE = 926; - - /** - * identifier for an ECI of a character set of code page - */ - private static final int ECI_CHARSET = 927; - - /** - * Raw code table for text compaction Mixed sub-mode - */ - private static final byte[] TEXT_MIXED_RAW = { - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, - 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0}; - - /** - * Raw code table for text compaction: Punctuation sub-mode - */ - private static final byte[] TEXT_PUNCTUATION_RAW = { - 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, - 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0}; - - private static final byte[] MIXED = new byte[128]; - private static final byte[] PUNCTUATION = new byte[128]; - - private static final Charset DEFAULT_ENCODING = Charset.forName("ISO-8859-1"); - - private PDF417HighLevelEncoder() { - } - - static { - //Construct inverse lookups - Arrays.fill(MIXED, (byte) -1); - for (byte i = 0; i < TEXT_MIXED_RAW.length; i++) { - byte b = TEXT_MIXED_RAW[i]; - if (b > 0) { - MIXED[b] = i; - } - } - Arrays.fill(PUNCTUATION, (byte) -1); - for (byte i = 0; i < TEXT_PUNCTUATION_RAW.length; i++) { - byte b = TEXT_PUNCTUATION_RAW[i]; - if (b > 0) { - PUNCTUATION[b] = i; - } - } - } - - /** - * Performs high-level encoding of a PDF417 message using the algorithm described in annex P - * of ISO/IEC 15438:2001(E). If byte compaction has been selected, then only byte compaction - * is used. - * - * @param msg the message - * @param compaction compaction mode to use - * @param encoding character encoding used to encode in default or byte compaction - * or {@code null} for default / not applicable - * @return the encoded message (the char values range from 0 to 928) - */ - static String encodeHighLevel(String msg, Compaction compaction, Charset encoding) throws WriterException { - - //the codewords 0..928 are encoded as Unicode characters - StringBuilder sb = new StringBuilder(msg.length()); - - if (encoding == null) { - encoding = DEFAULT_ENCODING; - } else if (!DEFAULT_ENCODING.equals(encoding)) { - CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding.name()); - if (eci != null) { - encodingECI(eci.getValue(), sb); - } - } - - int len = msg.length(); - int p = 0; - int textSubMode = SUBMODE_ALPHA; - - // User selected encoding mode - if (compaction == Compaction.TEXT) { - encodeText(msg, p, len, sb, textSubMode); - - } else if (compaction == Compaction.BYTE) { - byte[] bytes = msg.getBytes(encoding); - encodeBinary(bytes, p, bytes.length, BYTE_COMPACTION, sb); - - } else if (compaction == Compaction.NUMERIC) { - sb.append((char) LATCH_TO_NUMERIC); - encodeNumeric(msg, p, len, sb); - - } else { - int encodingMode = TEXT_COMPACTION; //Default mode, see 4.4.2.1 - while (p < len) { - int n = determineConsecutiveDigitCount(msg, p); - if (n >= 13) { - sb.append((char) LATCH_TO_NUMERIC); - encodingMode = NUMERIC_COMPACTION; - textSubMode = SUBMODE_ALPHA; //Reset after latch - encodeNumeric(msg, p, n, sb); - p += n; - } else { - int t = determineConsecutiveTextCount(msg, p); - if (t >= 5 || n == len) { - if (encodingMode != TEXT_COMPACTION) { - sb.append((char) LATCH_TO_TEXT); - encodingMode = TEXT_COMPACTION; - textSubMode = SUBMODE_ALPHA; //start with submode alpha after latch - } - textSubMode = encodeText(msg, p, t, sb, textSubMode); - p += t; - } else { - int b = determineConsecutiveBinaryCount(msg, p, encoding); - if (b == 0) { - b = 1; - } - byte[] bytes = msg.substring(p, p + b).getBytes(encoding); - if (bytes.length == 1 && encodingMode == TEXT_COMPACTION) { - //Switch for one byte (instead of latch) - encodeBinary(bytes, 0, 1, TEXT_COMPACTION, sb); - } else { - //Mode latch performed by encodeBinary() - encodeBinary(bytes, 0, bytes.length, encodingMode, sb); - encodingMode = BYTE_COMPACTION; - textSubMode = SUBMODE_ALPHA; //Reset after latch - } - p += b; - } - } - } - } - - return sb.toString(); - } - - /** - * Encode parts of the message using Text Compaction as described in ISO/IEC 15438:2001(E), - * chapter 4.4.2. - * - * @param msg the message - * @param startpos the start position within the message - * @param count the number of characters to encode - * @param sb receives the encoded codewords - * @param initialSubmode should normally be SUBMODE_ALPHA - * @return the text submode in which this method ends - */ - private static int encodeText(CharSequence msg, - int startpos, - int count, - StringBuilder sb, - int initialSubmode) { - StringBuilder tmp = new StringBuilder(count); - int submode = initialSubmode; - int idx = 0; - while (true) { - char ch = msg.charAt(startpos + idx); - switch (submode) { - case SUBMODE_ALPHA: - if (isAlphaUpper(ch)) { - if (ch == ' ') { - tmp.append((char) 26); //space - } else { - tmp.append((char) (ch - 65)); - } - } else { - if (isAlphaLower(ch)) { - submode = SUBMODE_LOWER; - tmp.append((char) 27); //ll - continue; - } else if (isMixed(ch)) { - submode = SUBMODE_MIXED; - tmp.append((char) 28); //ml - continue; - } else { - tmp.append((char) 29); //ps - tmp.append((char) PUNCTUATION[ch]); - break; - } - } - break; - case SUBMODE_LOWER: - if (isAlphaLower(ch)) { - if (ch == ' ') { - tmp.append((char) 26); //space - } else { - tmp.append((char) (ch - 97)); - } - } else { - if (isAlphaUpper(ch)) { - tmp.append((char) 27); //as - tmp.append((char) (ch - 65)); - //space cannot happen here, it is also in "Lower" - break; - } else if (isMixed(ch)) { - submode = SUBMODE_MIXED; - tmp.append((char) 28); //ml - continue; - } else { - tmp.append((char) 29); //ps - tmp.append((char) PUNCTUATION[ch]); - break; - } - } - break; - case SUBMODE_MIXED: - if (isMixed(ch)) { - tmp.append((char) MIXED[ch]); - } else { - if (isAlphaUpper(ch)) { - submode = SUBMODE_ALPHA; - tmp.append((char) 28); //al - continue; - } else if (isAlphaLower(ch)) { - submode = SUBMODE_LOWER; - tmp.append((char) 27); //ll - continue; - } else { - if (startpos + idx + 1 < count) { - char next = msg.charAt(startpos + idx + 1); - if (isPunctuation(next)) { - submode = SUBMODE_PUNCTUATION; - tmp.append((char) 25); //pl - continue; - } - } - tmp.append((char) 29); //ps - tmp.append((char) PUNCTUATION[ch]); - } - } - break; - default: //SUBMODE_PUNCTUATION - if (isPunctuation(ch)) { - tmp.append((char) PUNCTUATION[ch]); - } else { - submode = SUBMODE_ALPHA; - tmp.append((char) 29); //al - continue; - } - } - idx++; - if (idx >= count) { - break; - } - } - char h = 0; - int len = tmp.length(); - for (int i = 0; i < len; i++) { - boolean odd = (i % 2) != 0; - if (odd) { - h = (char) ((h * 30) + tmp.charAt(i)); - sb.append(h); - } else { - h = tmp.charAt(i); - } - } - if ((len % 2) != 0) { - sb.append((char) ((h * 30) + 29)); //ps - } - return submode; - } - - /** - * Encode parts of the message using Byte Compaction as described in ISO/IEC 15438:2001(E), - * chapter 4.4.3. The Unicode characters will be converted to binary using the cp437 - * codepage. - * - * @param bytes the message converted to a byte array - * @param startpos the start position within the message - * @param count the number of bytes to encode - * @param startmode the mode from which this method starts - * @param sb receives the encoded codewords - */ - private static void encodeBinary(byte[] bytes, - int startpos, - int count, - int startmode, - StringBuilder sb) { - if (count == 1 && startmode == TEXT_COMPACTION) { - sb.append((char) SHIFT_TO_BYTE); - } else { - if ((count % 6) == 0) { - sb.append((char) LATCH_TO_BYTE); - } else { - sb.append((char) LATCH_TO_BYTE_PADDED); - } - } - - int idx = startpos; - // Encode sixpacks - if (count >= 6) { - char[] chars = new char[5]; - while ((startpos + count - idx) >= 6) { - long t = 0; - for (int i = 0; i < 6; i++) { - t <<= 8; - t += bytes[idx + i] & 0xff; - } - for (int i = 0; i < 5; i++) { - chars[i] = (char) (t % 900); - t /= 900; - } - for (int i = chars.length - 1; i >= 0; i--) { - sb.append(chars[i]); - } - idx += 6; - } - } - //Encode rest (remaining n<5 bytes if any) - for (int i = idx; i < startpos + count; i++) { - int ch = bytes[i] & 0xff; - sb.append((char) ch); - } - } - - private static void encodeNumeric(String msg, int startpos, int count, StringBuilder sb) { - int idx = 0; - StringBuilder tmp = new StringBuilder(count / 3 + 1); - BigInteger num900 = BigInteger.valueOf(900); - BigInteger num0 = BigInteger.valueOf(0); - while (idx < count) { - tmp.setLength(0); - int len = Math.min(44, count - idx); - String part = '1' + msg.substring(startpos + idx, startpos + idx + len); - BigInteger bigint = new BigInteger(part); - do { - tmp.append((char) bigint.mod(num900).intValue()); - bigint = bigint.divide(num900); - } while (!bigint.equals(num0)); - - //Reverse temporary string - for (int i = tmp.length() - 1; i >= 0; i--) { - sb.append(tmp.charAt(i)); - } - idx += len; - } - } - - - private static boolean isDigit(char ch) { - return ch >= '0' && ch <= '9'; - } - - private static boolean isAlphaUpper(char ch) { - return ch == ' ' || (ch >= 'A' && ch <= 'Z'); - } - - private static boolean isAlphaLower(char ch) { - return ch == ' ' || (ch >= 'a' && ch <= 'z'); - } - - private static boolean isMixed(char ch) { - return MIXED[ch] != -1; - } - - private static boolean isPunctuation(char ch) { - return PUNCTUATION[ch] != -1; - } - - private static boolean isText(char ch) { - return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); - } - - /** - * Determines the number of consecutive characters that are encodable using numeric compaction. - * - * @param msg the message - * @param startpos the start position within the message - * @return the requested character count - */ - private static int determineConsecutiveDigitCount(CharSequence msg, int startpos) { - int count = 0; - int len = msg.length(); - int idx = startpos; - if (idx < len) { - char ch = msg.charAt(idx); - while (isDigit(ch) && idx < len) { - count++; - idx++; - if (idx < len) { - ch = msg.charAt(idx); - } - } - } - return count; - } - - /** - * Determines the number of consecutive characters that are encodable using text compaction. - * - * @param msg the message - * @param startpos the start position within the message - * @return the requested character count - */ - private static int determineConsecutiveTextCount(CharSequence msg, int startpos) { - int len = msg.length(); - int idx = startpos; - while (idx < len) { - char ch = msg.charAt(idx); - int numericCount = 0; - while (numericCount < 13 && isDigit(ch) && idx < len) { - numericCount++; - idx++; - if (idx < len) { - ch = msg.charAt(idx); - } - } - if (numericCount >= 13) { - return idx - startpos - numericCount; - } - if (numericCount > 0) { - //Heuristic: All text-encodable chars or digits are binary encodable - continue; - } - ch = msg.charAt(idx); - - //Check if character is encodable - if (!isText(ch)) { - break; - } - idx++; - } - return idx - startpos; - } - - /** - * Determines the number of consecutive characters that are encodable using binary compaction. - * - * @param msg the message - * @param startpos the start position within the message - * @param encoding the charset used to convert the message to a byte array - * @return the requested character count - */ - private static int determineConsecutiveBinaryCount(String msg, int startpos, Charset encoding) - throws WriterException { - CharsetEncoder encoder = encoding.newEncoder(); - int len = msg.length(); - int idx = startpos; - while (idx < len) { - char ch = msg.charAt(idx); - int numericCount = 0; - - while (numericCount < 13 && isDigit(ch)) { - numericCount++; - //textCount++; - int i = idx + numericCount; - if (i >= len) { - break; - } - ch = msg.charAt(i); - } - if (numericCount >= 13) { - return idx - startpos; - } - ch = msg.charAt(idx); - - if (!encoder.canEncode(ch)) { - throw new WriterException("Non-encodable character detected: " + ch + " (Unicode: " + (int) ch + ')'); - } - idx++; - } - return idx - startpos; - } - - private static void encodingECI(int eci, StringBuilder sb) throws WriterException { - if (eci >= 0 && eci < 900) { - sb.append((char) ECI_CHARSET); - sb.append((char) eci); - } else if (eci < 810900) { - sb.append((char) ECI_GENERAL_PURPOSE); - sb.append((char) (eci / 900 - 1)); - sb.append((char) (eci % 900)); - } else if (eci < 811800) { - sb.append((char) ECI_USER_DEFINED); - sb.append((char) (810900 - eci)); - } else { - throw new WriterException("ECI number not in valid range from 0..811799, but was " + eci); - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/QRCodeReader.java b/zxing/src/main/java/com/google/zxing/qrcode/QRCodeReader.java deleted file mode 100644 index ebc6b9a..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/QRCodeReader.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.Reader; -import com.google.zxing.Result; -import com.google.zxing.ResultMetadataType; -import com.google.zxing.ResultPoint; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.qrcode.decoder.Decoder; -import com.google.zxing.qrcode.decoder.QRCodeDecoderMetaData; -import com.google.zxing.qrcode.detector.Detector; - -import java.util.List; -import java.util.Map; - -/** - * This implementation can detect and decode QR Codes in an image. - * - * @author Sean Owen - */ -public class QRCodeReader implements Reader { - - private static final ResultPoint[] NO_POINTS = new ResultPoint[0]; - - private final Decoder decoder = new Decoder(); - - protected final Decoder getDecoder() { - return decoder; - } - - /** - * Locates and decodes a QR code in an image. - * - * @return a String representing the content encoded by the QR code - * @throws NotFoundException if a QR code cannot be found - * @throws FormatException if a QR code cannot be decoded - * @throws ChecksumException if error correction fails - */ - @Override - public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException { - return decode(image, null); - } - - @Override - public final Result decode(BinaryBitmap image, Map hints) - throws NotFoundException, ChecksumException, FormatException { - DecoderResult decoderResult; - ResultPoint[] points; - if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { - BitMatrix bits = extractPureBits(image.getBlackMatrix()); - decoderResult = decoder.decode(bits, hints); - points = NO_POINTS; - } else { - DetectorResult detectorResult = new Detector(image.getBlackMatrix()).detect(hints); - decoderResult = decoder.decode(detectorResult.getBits(), hints); - points = detectorResult.getPoints(); - } - - // If the code was mirrored: swap the bottom-left and the top-right points. - if (decoderResult.getOther() instanceof QRCodeDecoderMetaData) { - ((QRCodeDecoderMetaData) decoderResult.getOther()).applyMirroredCorrection(points); - } - - Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), points, BarcodeFormat.QR_CODE); - List byteSegments = decoderResult.getByteSegments(); - if (byteSegments != null) { - result.putMetadata(ResultMetadataType.BYTE_SEGMENTS, byteSegments); - } - String ecLevel = decoderResult.getECLevel(); - if (ecLevel != null) { - result.putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, ecLevel); - } - if (decoderResult.hasStructuredAppend()) { - result.putMetadata(ResultMetadataType.STRUCTURED_APPEND_SEQUENCE, - decoderResult.getStructuredAppendSequenceNumber()); - result.putMetadata(ResultMetadataType.STRUCTURED_APPEND_PARITY, - decoderResult.getStructuredAppendParity()); - } - return result; - } - - @Override - public void reset() { - // do nothing - } - - /** - * This method detects a code in a "pure" image -- that is, pure monochrome image - * which contains only an unrotated, unskewed, image of a code, with some white border - * around it. This is a specialized method that works exceptionally fast in this special - * case. - * - * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) - */ - private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException { - - int[] leftTopBlack = image.getTopLeftOnBit(); - int[] rightBottomBlack = image.getBottomRightOnBit(); - if (leftTopBlack == null || rightBottomBlack == null) { - throw NotFoundException.getNotFoundInstance(); - } - - float moduleSize = moduleSize(leftTopBlack, image); - - int top = leftTopBlack[1]; - int bottom = rightBottomBlack[1]; - int left = leftTopBlack[0]; - int right = rightBottomBlack[0]; - - // Sanity check! - if (left >= right || top >= bottom) { - throw NotFoundException.getNotFoundInstance(); - } - - if (bottom - top != right - left) { - // Special case, where bottom-right module wasn't black so we found something else in the last row - // Assume it's a square, so use height as the width - right = left + (bottom - top); - if (right >= image.getWidth()) { - // Abort if that would not make sense -- off image - throw NotFoundException.getNotFoundInstance(); - } - } - - int matrixWidth = Math.round((right - left + 1) / moduleSize); - int matrixHeight = Math.round((bottom - top + 1) / moduleSize); - if (matrixWidth <= 0 || matrixHeight <= 0) { - throw NotFoundException.getNotFoundInstance(); - } - if (matrixHeight != matrixWidth) { - // Only possibly decode square regions - throw NotFoundException.getNotFoundInstance(); - } - - // Push in the "border" by half the module width so that we start - // sampling in the middle of the module. Just in case the image is a - // little off, this will help recover. - int nudge = (int) (moduleSize / 2.0f); - top += nudge; - left += nudge; - - // But careful that this does not sample off the edge - // "right" is the farthest-right valid pixel location -- right+1 is not necessarily - // This is positive by how much the inner x loop below would be too large - int nudgedTooFarRight = left + (int) ((matrixWidth - 1) * moduleSize) - right; - if (nudgedTooFarRight > 0) { - if (nudgedTooFarRight > nudge) { - // Neither way fits; abort - throw NotFoundException.getNotFoundInstance(); - } - left -= nudgedTooFarRight; - } - // See logic above - int nudgedTooFarDown = top + (int) ((matrixHeight - 1) * moduleSize) - bottom; - if (nudgedTooFarDown > 0) { - if (nudgedTooFarDown > nudge) { - // Neither way fits; abort - throw NotFoundException.getNotFoundInstance(); - } - top -= nudgedTooFarDown; - } - - // Now just read off the bits - BitMatrix bits = new BitMatrix(matrixWidth, matrixHeight); - for (int y = 0; y < matrixHeight; y++) { - int iOffset = top + (int) (y * moduleSize); - for (int x = 0; x < matrixWidth; x++) { - if (image.get(left + (int) (x * moduleSize), iOffset)) { - bits.set(x, y); - } - } - } - return bits; - } - - private static float moduleSize(int[] leftTopBlack, BitMatrix image) throws NotFoundException { - int height = image.getHeight(); - int width = image.getWidth(); - int x = leftTopBlack[0]; - int y = leftTopBlack[1]; - boolean inBlack = true; - int transitions = 0; - while (x < width && y < height) { - if (inBlack != image.get(x, y)) { - if (++transitions == 5) { - break; - } - inBlack = !inBlack; - } - x++; - y++; - } - if (x == width || y == height) { - throw NotFoundException.getNotFoundInstance(); - } - return (x - leftTopBlack[0]) / 7.0f; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java b/zxing/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java deleted file mode 100644 index ce7ee07..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.EncodeHintType; -import com.google.zxing.Writer; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.qrcode.encoder.ByteMatrix; -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import com.google.zxing.qrcode.encoder.Encoder; -import com.google.zxing.qrcode.encoder.QRCode; - -import java.util.Map; - -/** - * This object renders a QR Code as a BitMatrix 2D array of greyscale values. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class QRCodeWriter implements Writer { - - private static final int QUIET_ZONE_SIZE = 4; - - @Override - public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) - throws WriterException { - - return encode(contents, format, width, height, null); - } - - @Override - public BitMatrix encode(String contents, - BarcodeFormat format, - int width, - int height, - Map hints) throws WriterException { - - if (contents.isEmpty()) { - throw new IllegalArgumentException("Found empty contents"); - } - - if (format != BarcodeFormat.QR_CODE) { - throw new IllegalArgumentException("Can only encode QR_CODE, but got " + format); - } - - if (width < 0 || height < 0) { - throw new IllegalArgumentException("Requested dimensions are too small: " + width + 'x' + - height); - } - - ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L; - int quietZone = QUIET_ZONE_SIZE; - if (hints != null) { - if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) { - errorCorrectionLevel = ErrorCorrectionLevel.valueOf(hints.get(EncodeHintType.ERROR_CORRECTION).toString()); - } - if (hints.containsKey(EncodeHintType.MARGIN)) { - quietZone = Integer.parseInt(hints.get(EncodeHintType.MARGIN).toString()); - } - } - - QRCode code = Encoder.encode(contents, errorCorrectionLevel, hints); - return renderResult(code, width, height, quietZone); - } - - // Note that the input matrix uses 0 == white, 1 == black, while the output matrix uses - // 0 == black, 255 == white (i.e. an 8 bit greyscale bitmap). - private static BitMatrix renderResult(QRCode code, int width, int height, int quietZone) { - ByteMatrix input = code.getMatrix(); - if (input == null) { - throw new IllegalStateException(); - } - int inputWidth = input.getWidth(); - int inputHeight = input.getHeight(); - int qrWidth = inputWidth + (quietZone * 2); - int qrHeight = inputHeight + (quietZone * 2); - int outputWidth = Math.max(width, qrWidth); - int outputHeight = Math.max(height, qrHeight); - - int multiple = Math.min(outputWidth / qrWidth, outputHeight / qrHeight); - // Padding includes both the quiet zone and the extra white pixels to accommodate the requested - // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. - // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will - // handle all the padding from 100x100 (the actual QR) up to 200x160. - int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; - int topPadding = (outputHeight - (inputHeight * multiple)) / 2; - - BitMatrix output = new BitMatrix(outputWidth, outputHeight); - - for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { - // Write the contents of this row of the barcode - for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { - if (input.get(inputX, inputY) == 1) { - output.setRegion(outputX, outputY, multiple, multiple); - } - } - } - - return output; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/BitMatrixParser.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/BitMatrixParser.java deleted file mode 100644 index 584988a..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/BitMatrixParser.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; - -/** - * @author Sean Owen - */ -final class BitMatrixParser { - - private final BitMatrix bitMatrix; - private Version parsedVersion; - private FormatInformation parsedFormatInfo; - private boolean mirror; - - /** - * @param bitMatrix {@link BitMatrix} to parse - * @throws FormatException if dimension is not >= 21 and 1 mod 4 - */ - BitMatrixParser(BitMatrix bitMatrix) throws FormatException { - int dimension = bitMatrix.getHeight(); - if (dimension < 21 || (dimension & 0x03) != 1) { - throw FormatException.getFormatInstance(); - } - this.bitMatrix = bitMatrix; - } - - /** - *

    Reads format information from one of its two locations within the QR Code.

    - * - * @return {@link FormatInformation} encapsulating the QR Code's format info - * @throws FormatException if both format information locations cannot be parsed as - * the valid encoding of format information - */ - FormatInformation readFormatInformation() throws FormatException { - - if (parsedFormatInfo != null) { - return parsedFormatInfo; - } - - // Read top-left format info bits - int formatInfoBits1 = 0; - for (int i = 0; i < 6; i++) { - formatInfoBits1 = copyBit(i, 8, formatInfoBits1); - } - // .. and skip a bit in the timing pattern ... - formatInfoBits1 = copyBit(7, 8, formatInfoBits1); - formatInfoBits1 = copyBit(8, 8, formatInfoBits1); - formatInfoBits1 = copyBit(8, 7, formatInfoBits1); - // .. and skip a bit in the timing pattern ... - for (int j = 5; j >= 0; j--) { - formatInfoBits1 = copyBit(8, j, formatInfoBits1); - } - - // Read the top-right/bottom-left pattern too - int dimension = bitMatrix.getHeight(); - int formatInfoBits2 = 0; - int jMin = dimension - 7; - for (int j = dimension - 1; j >= jMin; j--) { - formatInfoBits2 = copyBit(8, j, formatInfoBits2); - } - for (int i = dimension - 8; i < dimension; i++) { - formatInfoBits2 = copyBit(i, 8, formatInfoBits2); - } - - parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits1, formatInfoBits2); - if (parsedFormatInfo != null) { - return parsedFormatInfo; - } - throw FormatException.getFormatInstance(); - } - - /** - *

    Reads version information from one of its two locations within the QR Code.

    - * - * @return {@link Version} encapsulating the QR Code's version - * @throws FormatException if both version information locations cannot be parsed as - * the valid encoding of version information - */ - Version readVersion() throws FormatException { - - if (parsedVersion != null) { - return parsedVersion; - } - - int dimension = bitMatrix.getHeight(); - - int provisionalVersion = (dimension - 17) / 4; - if (provisionalVersion <= 6) { - return Version.getVersionForNumber(provisionalVersion); - } - - // Read top-right version info: 3 wide by 6 tall - int versionBits = 0; - int ijMin = dimension - 11; - for (int j = 5; j >= 0; j--) { - for (int i = dimension - 9; i >= ijMin; i--) { - versionBits = copyBit(i, j, versionBits); - } - } - - Version theParsedVersion = Version.decodeVersionInformation(versionBits); - if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) { - parsedVersion = theParsedVersion; - return theParsedVersion; - } - - // Hmm, failed. Try bottom left: 6 wide by 3 tall - versionBits = 0; - for (int i = 5; i >= 0; i--) { - for (int j = dimension - 9; j >= ijMin; j--) { - versionBits = copyBit(i, j, versionBits); - } - } - - theParsedVersion = Version.decodeVersionInformation(versionBits); - if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) { - parsedVersion = theParsedVersion; - return theParsedVersion; - } - throw FormatException.getFormatInstance(); - } - - private int copyBit(int i, int j, int versionBits) { - boolean bit = mirror ? bitMatrix.get(j, i) : bitMatrix.get(i, j); - return bit ? (versionBits << 1) | 0x1 : versionBits << 1; - } - - /** - *

    Reads the bits in the {@link BitMatrix} representing the finder pattern in the - * correct order in order to reconstruct the codewords bytes contained within the - * QR Code.

    - * - * @return bytes encoded within the QR Code - * @throws FormatException if the exact number of bytes expected is not read - */ - byte[] readCodewords() throws FormatException { - - FormatInformation formatInfo = readFormatInformation(); - Version version = readVersion(); - - // Get the data mask for the format used in this QR Code. This will exclude - // some bits from reading as we wind through the bit matrix. - DataMask dataMask = DataMask.values()[formatInfo.getDataMask()]; - int dimension = bitMatrix.getHeight(); - dataMask.unmaskBitMatrix(bitMatrix, dimension); - - BitMatrix functionPattern = version.buildFunctionPattern(); - - boolean readingUp = true; - byte[] result = new byte[version.getTotalCodewords()]; - int resultOffset = 0; - int currentByte = 0; - int bitsRead = 0; - // Read columns in pairs, from right to left - for (int j = dimension - 1; j > 0; j -= 2) { - if (j == 6) { - // Skip whole column with vertical alignment pattern; - // saves time and makes the other code proceed more cleanly - j--; - } - // Read alternatingly from bottom to top then top to bottom - for (int count = 0; count < dimension; count++) { - int i = readingUp ? dimension - 1 - count : count; - for (int col = 0; col < 2; col++) { - // Ignore bits covered by the function pattern - if (!functionPattern.get(j - col, i)) { - // Read a bit - bitsRead++; - currentByte <<= 1; - if (bitMatrix.get(j - col, i)) { - currentByte |= 1; - } - // If we've made a whole byte, save it off - if (bitsRead == 8) { - result[resultOffset++] = (byte) currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp ^= true; // readingUp = !readingUp; // switch directions - } - if (resultOffset != version.getTotalCodewords()) { - throw FormatException.getFormatInstance(); - } - return result; - } - - /** - * Revert the mask removal done while reading the code words. The bit matrix should revert to its original state. - */ - void remask() { - if (parsedFormatInfo == null) { - return; // We have no format information, and have no data mask - } - DataMask dataMask = DataMask.values()[parsedFormatInfo.getDataMask()]; - int dimension = bitMatrix.getHeight(); - dataMask.unmaskBitMatrix(bitMatrix, dimension); - } - - /** - * Prepare the parser for a mirrored operation. - * This flag has effect only on the {@link #readFormatInformation()} and the - * {@link #readVersion()}. Before proceeding with {@link #readCodewords()} the - * {@link #mirror()} method should be called. - * - * @param mirror Whether to read version and format information mirrored. - */ - void setMirror(boolean mirror) { - parsedVersion = null; - parsedFormatInfo = null; - this.mirror = mirror; - } - - /** Mirror the bit matrix in order to attempt a second reading. */ - void mirror() { - for (int x = 0; x < bitMatrix.getWidth(); x++) { - for (int y = x + 1; y < bitMatrix.getHeight(); y++) { - if (bitMatrix.get(x, y) != bitMatrix.get(y, x)) { - bitMatrix.flip(y, x); - bitMatrix.flip(x, y); - } - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataBlock.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataBlock.java deleted file mode 100644 index 8f5cdcb..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataBlock.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -/** - *

    Encapsulates a block of data within a QR Code. QR Codes may split their data into - * multiple blocks, each of which is a unit of data and error-correction codewords. Each - * is represented by an instance of this class.

    - * - * @author Sean Owen - */ -final class DataBlock { - - private final int numDataCodewords; - private final byte[] codewords; - - private DataBlock(int numDataCodewords, byte[] codewords) { - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - } - - /** - *

    When QR Codes use multiple data blocks, they are actually interleaved. - * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This - * method will separate the data into original blocks.

    - * - * @param rawCodewords bytes as read directly from the QR Code - * @param version version of the QR Code - * @param ecLevel error-correction level of the QR Code - * @return DataBlocks containing original bytes, "de-interleaved" from representation in the - * QR Code - */ - static DataBlock[] getDataBlocks(byte[] rawCodewords, - Version version, - ErrorCorrectionLevel ecLevel) { - - if (rawCodewords.length != version.getTotalCodewords()) { - throw new IllegalArgumentException(); - } - - // Figure out the number and size of data blocks used by this version and - // error correction level - Version.ECBlocks ecBlocks = version.getECBlocksForLevel(ecLevel); - - // First count the total number of data blocks - int totalBlocks = 0; - Version.ECB[] ecBlockArray = ecBlocks.getECBlocks(); - for (Version.ECB ecBlock : ecBlockArray) { - totalBlocks += ecBlock.getCount(); - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - DataBlock[] result = new DataBlock[totalBlocks]; - int numResultBlocks = 0; - for (Version.ECB ecBlock : ecBlockArray) { - for (int i = 0; i < ecBlock.getCount(); i++) { - int numDataCodewords = ecBlock.getDataCodewords(); - int numBlockCodewords = ecBlocks.getECCodewordsPerBlock() + numDataCodewords; - result[numResultBlocks++] = new DataBlock(numDataCodewords, new byte[numBlockCodewords]); - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - int shorterBlocksTotalCodewords = result[0].codewords.length; - int longerBlocksStartAt = result.length - 1; - while (longerBlocksStartAt >= 0) { - int numCodewords = result[longerBlocksStartAt].codewords.length; - if (numCodewords == shorterBlocksTotalCodewords) { - break; - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - - int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.getECCodewordsPerBlock(); - // The last elements of result may be 1 element longer; - // first fill out as many elements as all of them have - int rawCodewordsOffset = 0; - for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (int j = 0; j < numResultBlocks; j++) { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (int j = longerBlocksStartAt; j < numResultBlocks; j++) { - result[j].codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - int max = result[0].codewords.length; - for (int i = shorterBlocksNumDataCodewords; i < max; i++) { - for (int j = 0; j < numResultBlocks; j++) { - int iOffset = j < longerBlocksStartAt ? i : i + 1; - result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - return result; - } - - int getNumDataCodewords() { - return numDataCodewords; - } - - byte[] getCodewords() { - return codewords; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataMask.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataMask.java deleted file mode 100644 index a273cc3..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DataMask.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.common.BitMatrix; - -/** - *

    Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations - * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix, - * including areas used for finder patterns, timing patterns, etc. These areas should be unused - * after the point they are unmasked anyway.

    - * - *

    Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position - * and j is row position. In fact, as the text says, i is row position and j is column position.

    - * - * @author Sean Owen - */ -enum DataMask { - - /** - * See ISO 18004:2006 6.8.1 - */ - - /** - * 000: mask bits for which (x + y) mod 2 == 0 - */ - DATA_MASK_000() { - @Override - boolean isMasked(int i, int j) { - return ((i + j) & 0x01) == 0; - } - }, - - /** - * 001: mask bits for which x mod 2 == 0 - */ - DATA_MASK_001() { - @Override - boolean isMasked(int i, int j) { - return (i & 0x01) == 0; - } - }, - - /** - * 010: mask bits for which y mod 3 == 0 - */ - DATA_MASK_010() { - @Override - boolean isMasked(int i, int j) { - return j % 3 == 0; - } - }, - - /** - * 011: mask bits for which (x + y) mod 3 == 0 - */ - DATA_MASK_011() { - @Override - boolean isMasked(int i, int j) { - return (i + j) % 3 == 0; - } - }, - - /** - * 100: mask bits for which (x/2 + y/3) mod 2 == 0 - */ - DATA_MASK_100() { - @Override - boolean isMasked(int i, int j) { - return (((i / 2) + (j / 3)) & 0x01) == 0; - } - }, - - /** - * 101: mask bits for which xy mod 2 + xy mod 3 == 0 - */ - DATA_MASK_101() { - @Override - boolean isMasked(int i, int j) { - int temp = i * j; - return (temp & 0x01) + (temp % 3) == 0; - } - }, - - /** - * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 - */ - DATA_MASK_110() { - @Override - boolean isMasked(int i, int j) { - int temp = i * j; - return (((temp & 0x01) + (temp % 3)) & 0x01) == 0; - } - }, - - /** - * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 - */ - DATA_MASK_111() { - @Override - boolean isMasked(int i, int j) { - return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0; - } - }; - - // End of enum constants. - - - /** - *

    Implementations of this method reverse the data masking process applied to a QR Code and - * make its bits ready to read.

    - * - * @param bits representation of QR Code bits - * @param dimension dimension of QR Code, represented by bits, being unmasked - */ - final void unmaskBitMatrix(BitMatrix bits, int dimension) { - for (int i = 0; i < dimension; i++) { - for (int j = 0; j < dimension; j++) { - if (isMasked(i, j)) { - bits.flip(j, i); - } - } - } - } - - abstract boolean isMasked(int i, int j); - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java deleted file mode 100644 index b3167f4..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.common.BitSource; -import com.google.zxing.common.CharacterSetECI; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.StringUtils; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - *

    QR Codes can encode text as bits in one of several modes, and can use multiple modes - * in one QR Code. This class decodes the bits back into text.

    - * - *

    See ISO 18004:2006, 6.4.3 - 6.4.7

    - * - * @author Sean Owen - */ -final class DecodedBitStreamParser { - - /** - * See ISO 18004:2006, 6.4.4 Table 5 - */ - private static final char[] ALPHANUMERIC_CHARS = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:".toCharArray(); - private static final int GB2312_SUBSET = 1; - - private DecodedBitStreamParser() { - } - - static DecoderResult decode(byte[] bytes, - Version version, - ErrorCorrectionLevel ecLevel, - Map hints) throws FormatException { - BitSource bits = new BitSource(bytes); - StringBuilder result = new StringBuilder(50); - List byteSegments = new ArrayList<>(1); - int symbolSequence = -1; - int parityData = -1; - - try { - CharacterSetECI currentCharacterSetECI = null; - boolean fc1InEffect = false; - Mode mode; - do { - // While still another segment to read... - if (bits.available() < 4) { - // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here - mode = Mode.TERMINATOR; - } else { - mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits - } - if (mode != Mode.TERMINATOR) { - if (mode == Mode.FNC1_FIRST_POSITION || mode == Mode.FNC1_SECOND_POSITION) { - // We do little with FNC1 except alter the parsed result a bit according to the spec - fc1InEffect = true; - } else if (mode == Mode.STRUCTURED_APPEND) { - if (bits.available() < 16) { - throw FormatException.getFormatInstance(); - } - // sequence number and parity is added later to the result metadata - // Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue - symbolSequence = bits.readBits(8); - parityData = bits.readBits(8); - } else if (mode == Mode.ECI) { - // Count doesn't apply to ECI - int value = parseECIValue(bits); - currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value); - if (currentCharacterSetECI == null) { - throw FormatException.getFormatInstance(); - } - } else { - // First handle Hanzi mode which does not start with character count - if (mode == Mode.HANZI) { - //chinese mode contains a sub set indicator right after mode indicator - int subset = bits.readBits(4); - int countHanzi = bits.readBits(mode.getCharacterCountBits(version)); - if (subset == GB2312_SUBSET) { - decodeHanziSegment(bits, result, countHanzi); - } - } else { - // "Normal" QR code modes: - // How many characters will follow, encoded in this mode? - int count = bits.readBits(mode.getCharacterCountBits(version)); - if (mode == Mode.NUMERIC) { - decodeNumericSegment(bits, result, count); - } else if (mode == Mode.ALPHANUMERIC) { - decodeAlphanumericSegment(bits, result, count, fc1InEffect); - } else if (mode == Mode.BYTE) { - decodeByteSegment(bits, result, count, currentCharacterSetECI, byteSegments, hints); - } else if (mode == Mode.KANJI) { - decodeKanjiSegment(bits, result, count); - } else { - throw FormatException.getFormatInstance(); - } - } - } - } - } while (mode != Mode.TERMINATOR); - } catch (IllegalArgumentException iae) { - // from readBits() calls - throw FormatException.getFormatInstance(); - } - - return new DecoderResult(bytes, - result.toString(), - byteSegments.isEmpty() ? null : byteSegments, - ecLevel == null ? null : ecLevel.toString(), - symbolSequence, - parityData); - } - - /** - * See specification GBT 18284-2000 - */ - private static void decodeHanziSegment(BitSource bits, - StringBuilder result, - int count) throws FormatException { - // Don't crash trying to read more bits than we have available. - if (count * 13 > bits.available()) { - throw FormatException.getFormatInstance(); - } - - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as GB2312 afterwards - byte[] buffer = new byte[2 * count]; - int offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - int twoBytes = bits.readBits(13); - int assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); - if (assembledTwoBytes < 0x003BF) { - // In the 0xA1A1 to 0xAAFE range - assembledTwoBytes += 0x0A1A1; - } else { - // In the 0xB0A1 to 0xFAFE range - assembledTwoBytes += 0x0A6A1; - } - buffer[offset] = (byte) ((assembledTwoBytes >> 8) & 0xFF); - buffer[offset + 1] = (byte) (assembledTwoBytes & 0xFF); - offset += 2; - count--; - } - - try { - result.append(new String(buffer, StringUtils.GB2312)); - } catch (UnsupportedEncodingException ignored) { - throw FormatException.getFormatInstance(); - } - } - - private static void decodeKanjiSegment(BitSource bits, - StringBuilder result, - int count) throws FormatException { - // Don't crash trying to read more bits than we have available. - if (count * 13 > bits.available()) { - throw FormatException.getFormatInstance(); - } - - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as Shift_JIS afterwards - byte[] buffer = new byte[2 * count]; - int offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - int twoBytes = bits.readBits(13); - int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0); - if (assembledTwoBytes < 0x01F00) { - // In the 0x8140 to 0x9FFC range - assembledTwoBytes += 0x08140; - } else { - // In the 0xE040 to 0xEBBF range - assembledTwoBytes += 0x0C140; - } - buffer[offset] = (byte) (assembledTwoBytes >> 8); - buffer[offset + 1] = (byte) assembledTwoBytes; - offset += 2; - count--; - } - // Shift_JIS may not be supported in some environments: - try { - result.append(new String(buffer, StringUtils.SHIFT_JIS)); - } catch (UnsupportedEncodingException ignored) { - throw FormatException.getFormatInstance(); - } - } - - private static void decodeByteSegment(BitSource bits, - StringBuilder result, - int count, - CharacterSetECI currentCharacterSetECI, - Collection byteSegments, - Map hints) throws FormatException { - // Don't crash trying to read more bits than we have available. - if (8 * count > bits.available()) { - throw FormatException.getFormatInstance(); - } - - byte[] readBytes = new byte[count]; - for (int i = 0; i < count; i++) { - readBytes[i] = (byte) bits.readBits(8); - } - String encoding; - if (currentCharacterSetECI == null) { - // The spec isn't clear on this mode; see - // section 6.4.5: t does not say which encoding to assuming - // upon decoding. I have seen ISO-8859-1 used as well as - // Shift_JIS -- without anything like an ECI designator to - // give a hint. - encoding = StringUtils.guessEncoding(readBytes, hints); - } else { - encoding = currentCharacterSetECI.name(); - } - try { - result.append(new String(readBytes, encoding)); - } catch (UnsupportedEncodingException ignored) { - throw FormatException.getFormatInstance(); - } - byteSegments.add(readBytes); - } - - private static char toAlphaNumericChar(int value) throws FormatException { - if (value >= ALPHANUMERIC_CHARS.length) { - throw FormatException.getFormatInstance(); - } - return ALPHANUMERIC_CHARS[value]; - } - - private static void decodeAlphanumericSegment(BitSource bits, - StringBuilder result, - int count, - boolean fc1InEffect) throws FormatException { - // Read two characters at a time - int start = result.length(); - while (count > 1) { - if (bits.available() < 11) { - throw FormatException.getFormatInstance(); - } - int nextTwoCharsBits = bits.readBits(11); - result.append(toAlphaNumericChar(nextTwoCharsBits / 45)); - result.append(toAlphaNumericChar(nextTwoCharsBits % 45)); - count -= 2; - } - if (count == 1) { - // special case: one character left - if (bits.available() < 6) { - throw FormatException.getFormatInstance(); - } - result.append(toAlphaNumericChar(bits.readBits(6))); - } - // See section 6.4.8.1, 6.4.8.2 - if (fc1InEffect) { - // We need to massage the result a bit if in an FNC1 mode: - for (int i = start; i < result.length(); i++) { - if (result.charAt(i) == '%') { - if (i < result.length() - 1 && result.charAt(i + 1) == '%') { - // %% is rendered as % - result.deleteCharAt(i + 1); - } else { - // In alpha mode, % should be converted to FNC1 separator 0x1D - result.setCharAt(i, (char) 0x1D); - } - } - } - } - } - - private static void decodeNumericSegment(BitSource bits, - StringBuilder result, - int count) throws FormatException { - // Read three digits at a time - while (count >= 3) { - // Each 10 bits encodes three digits - if (bits.available() < 10) { - throw FormatException.getFormatInstance(); - } - int threeDigitsBits = bits.readBits(10); - if (threeDigitsBits >= 1000) { - throw FormatException.getFormatInstance(); - } - result.append(toAlphaNumericChar(threeDigitsBits / 100)); - result.append(toAlphaNumericChar((threeDigitsBits / 10) % 10)); - result.append(toAlphaNumericChar(threeDigitsBits % 10)); - count -= 3; - } - if (count == 2) { - // Two digits left over to read, encoded in 7 bits - if (bits.available() < 7) { - throw FormatException.getFormatInstance(); - } - int twoDigitsBits = bits.readBits(7); - if (twoDigitsBits >= 100) { - throw FormatException.getFormatInstance(); - } - result.append(toAlphaNumericChar(twoDigitsBits / 10)); - result.append(toAlphaNumericChar(twoDigitsBits % 10)); - } else if (count == 1) { - // One digit left over to read - if (bits.available() < 4) { - throw FormatException.getFormatInstance(); - } - int digitBits = bits.readBits(4); - if (digitBits >= 10) { - throw FormatException.getFormatInstance(); - } - result.append(toAlphaNumericChar(digitBits)); - } - } - - private static int parseECIValue(BitSource bits) throws FormatException { - int firstByte = bits.readBits(8); - if ((firstByte & 0x80) == 0) { - // just one byte - return firstByte & 0x7F; - } - if ((firstByte & 0xC0) == 0x80) { - // two bytes - int secondByte = bits.readBits(8); - return ((firstByte & 0x3F) << 8) | secondByte; - } - if ((firstByte & 0xE0) == 0xC0) { - // three bytes - int secondThirdBytes = bits.readBits(16); - return ((firstByte & 0x1F) << 16) | secondThirdBytes; - } - throw FormatException.getFormatInstance(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Decoder.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/Decoder.java deleted file mode 100644 index b28267e..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Decoder.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.ChecksumException; -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DecoderResult; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; -import com.google.zxing.common.reedsolomon.ReedSolomonException; - -import java.util.Map; - -/** - *

    The main class which implements QR Code decoding -- as opposed to locating and extracting - * the QR Code from an image.

    - * - * @author Sean Owen - */ -public final class Decoder { - - private final ReedSolomonDecoder rsDecoder; - - public Decoder() { - rsDecoder = new ReedSolomonDecoder(GenericGF.QR_CODE_FIELD_256); - } - - public DecoderResult decode(boolean[][] image) throws ChecksumException, FormatException { - return decode(image, null); - } - - /** - *

    Convenience method that can decode a QR Code represented as a 2D array of booleans. - * "true" is taken to mean a black module.

    - * - * @param image booleans representing white/black QR Code modules - * @param hints decoding hints that should be used to influence decoding - * @return text and bytes encoded within the QR Code - * @throws FormatException if the QR Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - public DecoderResult decode(boolean[][] image, Map hints) - throws ChecksumException, FormatException { - int dimension = image.length; - BitMatrix bits = new BitMatrix(dimension); - for (int i = 0; i < dimension; i++) { - for (int j = 0; j < dimension; j++) { - if (image[i][j]) { - bits.set(j, i); - } - } - } - return decode(bits, hints); - } - - public DecoderResult decode(BitMatrix bits) throws ChecksumException, FormatException { - return decode(bits, null); - } - - /** - *

    Decodes a QR Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a black module.

    - * - * @param bits booleans representing white/black QR Code modules - * @param hints decoding hints that should be used to influence decoding - * @return text and bytes encoded within the QR Code - * @throws FormatException if the QR Code cannot be decoded - * @throws ChecksumException if error correction fails - */ - public DecoderResult decode(BitMatrix bits, Map hints) - throws FormatException, ChecksumException { - - // Construct a parser and read version, error-correction level - BitMatrixParser parser = new BitMatrixParser(bits); - FormatException fe = null; - ChecksumException ce = null; - try { - return decode(parser, hints); - } catch (FormatException e) { - fe = e; - } catch (ChecksumException e) { - ce = e; - } - - try { - - // Revert the bit matrix - parser.remask(); - - // Will be attempting a mirrored reading of the version and format info. - parser.setMirror(true); - - // Preemptively read the version. - parser.readVersion(); - - // Preemptively read the format information. - parser.readFormatInformation(); - - /* - * Since we're here, this means we have successfully detected some kind - * of version and format information when mirrored. This is a good sign, - * that the QR code may be mirrored, and we should try once more with a - * mirrored content. - */ - // Prepare for a mirrored reading. - parser.mirror(); - - DecoderResult result = decode(parser, hints); - - // Success! Notify the caller that the code was mirrored. - result.setOther(new QRCodeDecoderMetaData(true)); - - return result; - - } catch (FormatException | ChecksumException e) { - // Throw the exception from the original reading - if (fe != null) { - throw fe; - } - if (ce != null) { - throw ce; - } - throw e; - - } - } - - private DecoderResult decode(BitMatrixParser parser, Map hints) - throws FormatException, ChecksumException { - Version version = parser.readVersion(); - ErrorCorrectionLevel ecLevel = parser.readFormatInformation().getErrorCorrectionLevel(); - - // Read codewords - byte[] codewords = parser.readCodewords(); - // Separate into data blocks - DataBlock[] dataBlocks = DataBlock.getDataBlocks(codewords, version, ecLevel); - - // Count total number of data bytes - int totalBytes = 0; - for (DataBlock dataBlock : dataBlocks) { - totalBytes += dataBlock.getNumDataCodewords(); - } - byte[] resultBytes = new byte[totalBytes]; - int resultOffset = 0; - - // Error-correct and copy data blocks together into a stream of bytes - for (DataBlock dataBlock : dataBlocks) { - byte[] codewordBytes = dataBlock.getCodewords(); - int numDataCodewords = dataBlock.getNumDataCodewords(); - correctErrors(codewordBytes, numDataCodewords); - for (int i = 0; i < numDataCodewords; i++) { - resultBytes[resultOffset++] = codewordBytes[i]; - } - } - - // Decode the contents of that stream of bytes - return DecodedBitStreamParser.decode(resultBytes, version, ecLevel, hints); - } - - /** - *

    Given data and error-correction codewords received, possibly corrupted by errors, attempts to - * correct the errors in-place using Reed-Solomon error correction.

    - * - * @param codewordBytes data and error correction codewords - * @param numDataCodewords number of codewords that are data bytes - * @throws ChecksumException if error correction fails - */ - private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException { - int numCodewords = codewordBytes.length; - // First read into an array of ints - int[] codewordsInts = new int[numCodewords]; - for (int i = 0; i < numCodewords; i++) { - codewordsInts[i] = codewordBytes[i] & 0xFF; - } - int numECCodewords = codewordBytes.length - numDataCodewords; - try { - rsDecoder.decode(codewordsInts, numECCodewords); - } catch (ReedSolomonException ignored) { - throw ChecksumException.getChecksumInstance(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (int i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = (byte) codewordsInts[i]; - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java deleted file mode 100644 index 0f1e113..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -/** - *

    See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels - * defined by the QR code standard.

    - * - * @author Sean Owen - */ -public enum ErrorCorrectionLevel { - - /** L = ~7% correction */ - L(0x01), - /** M = ~15% correction */ - M(0x00), - /** Q = ~25% correction */ - Q(0x03), - /** H = ~30% correction */ - H(0x02); - - private static final ErrorCorrectionLevel[] FOR_BITS = {M, L, H, Q}; - - private final int bits; - - ErrorCorrectionLevel(int bits) { - this.bits = bits; - } - - public int getBits() { - return bits; - } - - /** - * @param bits int containing the two bits encoding a QR Code's error correction level - * @return ErrorCorrectionLevel representing the encoded error correction level - */ - public static ErrorCorrectionLevel forBits(int bits) { - if (bits < 0 || bits >= FOR_BITS.length) { - throw new IllegalArgumentException(); - } - return FOR_BITS[bits]; - } - - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/FormatInformation.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/FormatInformation.java deleted file mode 100644 index df7b612..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/FormatInformation.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -/** - *

    Encapsulates a QR Code's format information, including the data mask used and - * error correction level.

    - * - * @author Sean Owen - * @see DataMask - * @see ErrorCorrectionLevel - */ -final class FormatInformation { - - private static final int FORMAT_INFO_MASK_QR = 0x5412; - - /** - * See ISO 18004:2006, Annex C, Table C.1 - */ - private static final int[][] FORMAT_INFO_DECODE_LOOKUP = { - {0x5412, 0x00}, - {0x5125, 0x01}, - {0x5E7C, 0x02}, - {0x5B4B, 0x03}, - {0x45F9, 0x04}, - {0x40CE, 0x05}, - {0x4F97, 0x06}, - {0x4AA0, 0x07}, - {0x77C4, 0x08}, - {0x72F3, 0x09}, - {0x7DAA, 0x0A}, - {0x789D, 0x0B}, - {0x662F, 0x0C}, - {0x6318, 0x0D}, - {0x6C41, 0x0E}, - {0x6976, 0x0F}, - {0x1689, 0x10}, - {0x13BE, 0x11}, - {0x1CE7, 0x12}, - {0x19D0, 0x13}, - {0x0762, 0x14}, - {0x0255, 0x15}, - {0x0D0C, 0x16}, - {0x083B, 0x17}, - {0x355F, 0x18}, - {0x3068, 0x19}, - {0x3F31, 0x1A}, - {0x3A06, 0x1B}, - {0x24B4, 0x1C}, - {0x2183, 0x1D}, - {0x2EDA, 0x1E}, - {0x2BED, 0x1F}, - }; - - private final ErrorCorrectionLevel errorCorrectionLevel; - private final byte dataMask; - - private FormatInformation(int formatInfo) { - // Bits 3,4 - errorCorrectionLevel = ErrorCorrectionLevel.forBits((formatInfo >> 3) & 0x03); - // Bottom 3 bits - dataMask = (byte) (formatInfo & 0x07); - } - - static int numBitsDiffering(int a, int b) { - return Integer.bitCount(a ^ b); - } - - /** - * @param maskedFormatInfo1 format info indicator, with mask still applied - * @param maskedFormatInfo2 second copy of same info; both are checked at the same time - * to establish best match - * @return information about the format it specifies, or {@code null} - * if doesn't seem to match any known pattern - */ - static FormatInformation decodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { - FormatInformation formatInfo = doDecodeFormatInformation(maskedFormatInfo1, maskedFormatInfo2); - if (formatInfo != null) { - return formatInfo; - } - // Should return null, but, some QR codes apparently - // do not mask this info. Try again by actually masking the pattern - // first - return doDecodeFormatInformation(maskedFormatInfo1 ^ FORMAT_INFO_MASK_QR, - maskedFormatInfo2 ^ FORMAT_INFO_MASK_QR); - } - - private static FormatInformation doDecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { - // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing - int bestDifference = Integer.MAX_VALUE; - int bestFormatInfo = 0; - for (int[] decodeInfo : FORMAT_INFO_DECODE_LOOKUP) { - int targetInfo = decodeInfo[0]; - if (targetInfo == maskedFormatInfo1 || targetInfo == maskedFormatInfo2) { - // Found an exact match - return new FormatInformation(decodeInfo[1]); - } - int bitsDifference = numBitsDiffering(maskedFormatInfo1, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - if (maskedFormatInfo1 != maskedFormatInfo2) { - // also try the other option - bitsDifference = numBitsDiffering(maskedFormatInfo2, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - } - // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits - // differing means we found a match - if (bestDifference <= 3) { - return new FormatInformation(bestFormatInfo); - } - return null; - } - - ErrorCorrectionLevel getErrorCorrectionLevel() { - return errorCorrectionLevel; - } - - byte getDataMask() { - return dataMask; - } - - @Override - public int hashCode() { - return (errorCorrectionLevel.ordinal() << 3) | (int) dataMask; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof FormatInformation)) { - return false; - } - FormatInformation other = (FormatInformation) o; - return this.errorCorrectionLevel == other.errorCorrectionLevel && - this.dataMask == other.dataMask; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Mode.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/Mode.java deleted file mode 100644 index b7e9ab3..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Mode.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -/** - *

    See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which - * data can be encoded to bits in the QR code standard.

    - * - * @author Sean Owen - */ -public enum Mode { - - TERMINATOR(new int[]{0, 0, 0}, 0x00), // Not really a mode... - NUMERIC(new int[]{10, 12, 14}, 0x01), - ALPHANUMERIC(new int[]{9, 11, 13}, 0x02), - STRUCTURED_APPEND(new int[]{0, 0, 0}, 0x03), // Not supported - BYTE(new int[]{8, 16, 16}, 0x04), - ECI(new int[]{0, 0, 0}, 0x07), // character counts don't apply - KANJI(new int[]{8, 10, 12}, 0x08), - FNC1_FIRST_POSITION(new int[]{0, 0, 0}, 0x05), - FNC1_SECOND_POSITION(new int[]{0, 0, 0}, 0x09), - /** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ - HANZI(new int[]{8, 10, 12}, 0x0D); - - private final int[] characterCountBitsForVersions; - private final int bits; - - Mode(int[] characterCountBitsForVersions, int bits) { - this.characterCountBitsForVersions = characterCountBitsForVersions; - this.bits = bits; - } - - /** - * @param bits four bits encoding a QR Code data mode - * @return Mode encoded by these bits - * @throws IllegalArgumentException if bits do not correspond to a known mode - */ - public static Mode forBits(int bits) { - switch (bits) { - case 0x0: - return TERMINATOR; - case 0x1: - return NUMERIC; - case 0x2: - return ALPHANUMERIC; - case 0x3: - return STRUCTURED_APPEND; - case 0x4: - return BYTE; - case 0x5: - return FNC1_FIRST_POSITION; - case 0x7: - return ECI; - case 0x8: - return KANJI; - case 0x9: - return FNC1_SECOND_POSITION; - case 0xD: - // 0xD is defined in GBT 18284-2000, may not be supported in foreign country - return HANZI; - default: - throw new IllegalArgumentException(); - } - } - - /** - * @param version version in question - * @return number of bits used, in this QR Code symbol {@link Version}, to encode the - * count of characters that will follow encoded in this Mode - */ - public int getCharacterCountBits(Version version) { - int number = version.getVersionNumber(); - int offset; - if (number <= 9) { - offset = 0; - } else if (number <= 26) { - offset = 1; - } else { - offset = 2; - } - return characterCountBitsForVersions[offset]; - } - - public int getBits() { - return bits; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/QRCodeDecoderMetaData.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/QRCodeDecoderMetaData.java deleted file mode 100644 index 75821e3..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/QRCodeDecoderMetaData.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2013 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.ResultPoint; - -/** - * Meta-data container for QR Code decoding. Instances of this class may be used to convey information back to the - * decoding caller. Callers are expected to process this. - * - * @see com.google.zxing.common.DecoderResult#getOther() - */ -public final class QRCodeDecoderMetaData { - - private final boolean mirrored; - - QRCodeDecoderMetaData(boolean mirrored) { - this.mirrored = mirrored; - } - - /** - * @return true if the QR Code was mirrored. - */ - public boolean isMirrored() { - return mirrored; - } - - /** - * Apply the result points' order correction due to mirroring. - * - * @param points Array of points to apply mirror correction to. - */ - public void applyMirroredCorrection(ResultPoint[] points) { - if (!mirrored || points == null || points.length < 3) { - return; - } - ResultPoint bottomLeft = points[0]; - points[0] = points[2]; - points[2] = bottomLeft; - // No need to 'fix' top-left and alignment pattern. - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Version.java b/zxing/src/main/java/com/google/zxing/qrcode/decoder/Version.java deleted file mode 100644 index cc40525..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/decoder/Version.java +++ /dev/null @@ -1,578 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.decoder; - -import com.google.zxing.FormatException; -import com.google.zxing.common.BitMatrix; - -/** - * See ISO 18004:2006 Annex D - * - * @author Sean Owen - */ -public final class Version { - - /** - * See ISO 18004:2006 Annex D. - * Element i represents the raw version bits that specify version i + 7 - */ - private static final int[] VERSION_DECODE_INFO = { - 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, - 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, - 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, - 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, - 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, - 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, - 0x2542E, 0x26A64, 0x27541, 0x28C69 - }; - - private static final Version[] VERSIONS = buildVersions(); - - private final int versionNumber; - private final int[] alignmentPatternCenters; - private final ECBlocks[] ecBlocks; - private final int totalCodewords; - - private Version(int versionNumber, - int[] alignmentPatternCenters, - ECBlocks... ecBlocks) { - this.versionNumber = versionNumber; - this.alignmentPatternCenters = alignmentPatternCenters; - this.ecBlocks = ecBlocks; - int total = 0; - int ecCodewords = ecBlocks[0].getECCodewordsPerBlock(); - ECB[] ecbArray = ecBlocks[0].getECBlocks(); - for (ECB ecBlock : ecbArray) { - total += ecBlock.getCount() * (ecBlock.getDataCodewords() + ecCodewords); - } - this.totalCodewords = total; - } - - public int getVersionNumber() { - return versionNumber; - } - - public int[] getAlignmentPatternCenters() { - return alignmentPatternCenters; - } - - public int getTotalCodewords() { - return totalCodewords; - } - - public int getDimensionForVersion() { - return 17 + 4 * versionNumber; - } - - public ECBlocks getECBlocksForLevel(ErrorCorrectionLevel ecLevel) { - return ecBlocks[ecLevel.ordinal()]; - } - - /** - *

    Deduces version information purely from QR Code dimensions.

    - * - * @param dimension dimension in modules - * @return Version for a QR Code of that dimension - * @throws FormatException if dimension is not 1 mod 4 - */ - public static Version getProvisionalVersionForDimension(int dimension) throws FormatException { - if (dimension % 4 != 1) { - throw FormatException.getFormatInstance(); - } - try { - return getVersionForNumber((dimension - 17) / 4); - } catch (IllegalArgumentException ignored) { - throw FormatException.getFormatInstance(); - } - } - - public static Version getVersionForNumber(int versionNumber) { - if (versionNumber < 1 || versionNumber > 40) { - throw new IllegalArgumentException(); - } - return VERSIONS[versionNumber - 1]; - } - - static Version decodeVersionInformation(int versionBits) { - int bestDifference = Integer.MAX_VALUE; - int bestVersion = 0; - for (int i = 0; i < VERSION_DECODE_INFO.length; i++) { - int targetVersion = VERSION_DECODE_INFO[i]; - // Do the version info bits match exactly? done. - if (targetVersion == versionBits) { - return getVersionForNumber(i + 7); - } - // Otherwise see if this is the closest to a real version info bit string - // we have seen so far - int bitsDifference = FormatInformation.numBitsDiffering(versionBits, targetVersion); - if (bitsDifference < bestDifference) { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 8 bits. - if (bestDifference <= 3) { - return getVersionForNumber(bestVersion); - } - // If we didn't find a close enough match, fail - return null; - } - - /** - * See ISO 18004:2006 Annex E - */ - BitMatrix buildFunctionPattern() { - int dimension = getDimensionForVersion(); - BitMatrix bitMatrix = new BitMatrix(dimension); - - // Top left finder pattern + separator + format - bitMatrix.setRegion(0, 0, 9, 9); - // Top right finder pattern + separator + format - bitMatrix.setRegion(dimension - 8, 0, 8, 9); - // Bottom left finder pattern + separator + format - bitMatrix.setRegion(0, dimension - 8, 9, 8); - - // Alignment patterns - int max = alignmentPatternCenters.length; - for (int x = 0; x < max; x++) { - int i = alignmentPatternCenters[x] - 2; - for (int y = 0; y < max; y++) { - if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { - // No alignment patterns near the three finder paterns - continue; - } - bitMatrix.setRegion(alignmentPatternCenters[y] - 2, i, 5, 5); - } - } - - // Vertical timing pattern - bitMatrix.setRegion(6, 9, 1, dimension - 17); - // Horizontal timing pattern - bitMatrix.setRegion(9, 6, dimension - 17, 1); - - if (versionNumber > 6) { - // Version info, top right - bitMatrix.setRegion(dimension - 11, 0, 3, 6); - // Version info, bottom left - bitMatrix.setRegion(0, dimension - 11, 6, 3); - } - - return bitMatrix; - } - - /** - *

    Encapsulates a set of error-correction blocks in one symbol version. Most versions will - * use blocks of differing sizes within one version, so, this encapsulates the parameters for - * each set of blocks. It also holds the number of error-correction codewords per block since it - * will be the same across all blocks within one version.

    - */ - public static final class ECBlocks { - private final int ecCodewordsPerBlock; - private final ECB[] ecBlocks; - - ECBlocks(int ecCodewordsPerBlock, ECB... ecBlocks) { - this.ecCodewordsPerBlock = ecCodewordsPerBlock; - this.ecBlocks = ecBlocks; - } - - public int getECCodewordsPerBlock() { - return ecCodewordsPerBlock; - } - - public int getNumBlocks() { - int total = 0; - for (ECB ecBlock : ecBlocks) { - total += ecBlock.getCount(); - } - return total; - } - - public int getTotalECCodewords() { - return ecCodewordsPerBlock * getNumBlocks(); - } - - public ECB[] getECBlocks() { - return ecBlocks; - } - } - - /** - *

    Encapsualtes the parameters for one error-correction block in one symbol version. - * This includes the number of data codewords, and the number of times a block with these - * parameters is used consecutively in the QR code version's format.

    - */ - public static final class ECB { - private final int count; - private final int dataCodewords; - - ECB(int count, int dataCodewords) { - this.count = count; - this.dataCodewords = dataCodewords; - } - - public int getCount() { - return count; - } - - public int getDataCodewords() { - return dataCodewords; - } - } - - @Override - public String toString() { - return String.valueOf(versionNumber); - } - - /** - * See ISO 18004:2006 6.5.1 Table 9 - */ - private static Version[] buildVersions() { - return new Version[]{ - new Version(1, new int[]{}, - new ECBlocks(7, new ECB(1, 19)), - new ECBlocks(10, new ECB(1, 16)), - new ECBlocks(13, new ECB(1, 13)), - new ECBlocks(17, new ECB(1, 9))), - new Version(2, new int[]{6, 18}, - new ECBlocks(10, new ECB(1, 34)), - new ECBlocks(16, new ECB(1, 28)), - new ECBlocks(22, new ECB(1, 22)), - new ECBlocks(28, new ECB(1, 16))), - new Version(3, new int[]{6, 22}, - new ECBlocks(15, new ECB(1, 55)), - new ECBlocks(26, new ECB(1, 44)), - new ECBlocks(18, new ECB(2, 17)), - new ECBlocks(22, new ECB(2, 13))), - new Version(4, new int[]{6, 26}, - new ECBlocks(20, new ECB(1, 80)), - new ECBlocks(18, new ECB(2, 32)), - new ECBlocks(26, new ECB(2, 24)), - new ECBlocks(16, new ECB(4, 9))), - new Version(5, new int[]{6, 30}, - new ECBlocks(26, new ECB(1, 108)), - new ECBlocks(24, new ECB(2, 43)), - new ECBlocks(18, new ECB(2, 15), - new ECB(2, 16)), - new ECBlocks(22, new ECB(2, 11), - new ECB(2, 12))), - new Version(6, new int[]{6, 34}, - new ECBlocks(18, new ECB(2, 68)), - new ECBlocks(16, new ECB(4, 27)), - new ECBlocks(24, new ECB(4, 19)), - new ECBlocks(28, new ECB(4, 15))), - new Version(7, new int[]{6, 22, 38}, - new ECBlocks(20, new ECB(2, 78)), - new ECBlocks(18, new ECB(4, 31)), - new ECBlocks(18, new ECB(2, 14), - new ECB(4, 15)), - new ECBlocks(26, new ECB(4, 13), - new ECB(1, 14))), - new Version(8, new int[]{6, 24, 42}, - new ECBlocks(24, new ECB(2, 97)), - new ECBlocks(22, new ECB(2, 38), - new ECB(2, 39)), - new ECBlocks(22, new ECB(4, 18), - new ECB(2, 19)), - new ECBlocks(26, new ECB(4, 14), - new ECB(2, 15))), - new Version(9, new int[]{6, 26, 46}, - new ECBlocks(30, new ECB(2, 116)), - new ECBlocks(22, new ECB(3, 36), - new ECB(2, 37)), - new ECBlocks(20, new ECB(4, 16), - new ECB(4, 17)), - new ECBlocks(24, new ECB(4, 12), - new ECB(4, 13))), - new Version(10, new int[]{6, 28, 50}, - new ECBlocks(18, new ECB(2, 68), - new ECB(2, 69)), - new ECBlocks(26, new ECB(4, 43), - new ECB(1, 44)), - new ECBlocks(24, new ECB(6, 19), - new ECB(2, 20)), - new ECBlocks(28, new ECB(6, 15), - new ECB(2, 16))), - new Version(11, new int[]{6, 30, 54}, - new ECBlocks(20, new ECB(4, 81)), - new ECBlocks(30, new ECB(1, 50), - new ECB(4, 51)), - new ECBlocks(28, new ECB(4, 22), - new ECB(4, 23)), - new ECBlocks(24, new ECB(3, 12), - new ECB(8, 13))), - new Version(12, new int[]{6, 32, 58}, - new ECBlocks(24, new ECB(2, 92), - new ECB(2, 93)), - new ECBlocks(22, new ECB(6, 36), - new ECB(2, 37)), - new ECBlocks(26, new ECB(4, 20), - new ECB(6, 21)), - new ECBlocks(28, new ECB(7, 14), - new ECB(4, 15))), - new Version(13, new int[]{6, 34, 62}, - new ECBlocks(26, new ECB(4, 107)), - new ECBlocks(22, new ECB(8, 37), - new ECB(1, 38)), - new ECBlocks(24, new ECB(8, 20), - new ECB(4, 21)), - new ECBlocks(22, new ECB(12, 11), - new ECB(4, 12))), - new Version(14, new int[]{6, 26, 46, 66}, - new ECBlocks(30, new ECB(3, 115), - new ECB(1, 116)), - new ECBlocks(24, new ECB(4, 40), - new ECB(5, 41)), - new ECBlocks(20, new ECB(11, 16), - new ECB(5, 17)), - new ECBlocks(24, new ECB(11, 12), - new ECB(5, 13))), - new Version(15, new int[]{6, 26, 48, 70}, - new ECBlocks(22, new ECB(5, 87), - new ECB(1, 88)), - new ECBlocks(24, new ECB(5, 41), - new ECB(5, 42)), - new ECBlocks(30, new ECB(5, 24), - new ECB(7, 25)), - new ECBlocks(24, new ECB(11, 12), - new ECB(7, 13))), - new Version(16, new int[]{6, 26, 50, 74}, - new ECBlocks(24, new ECB(5, 98), - new ECB(1, 99)), - new ECBlocks(28, new ECB(7, 45), - new ECB(3, 46)), - new ECBlocks(24, new ECB(15, 19), - new ECB(2, 20)), - new ECBlocks(30, new ECB(3, 15), - new ECB(13, 16))), - new Version(17, new int[]{6, 30, 54, 78}, - new ECBlocks(28, new ECB(1, 107), - new ECB(5, 108)), - new ECBlocks(28, new ECB(10, 46), - new ECB(1, 47)), - new ECBlocks(28, new ECB(1, 22), - new ECB(15, 23)), - new ECBlocks(28, new ECB(2, 14), - new ECB(17, 15))), - new Version(18, new int[]{6, 30, 56, 82}, - new ECBlocks(30, new ECB(5, 120), - new ECB(1, 121)), - new ECBlocks(26, new ECB(9, 43), - new ECB(4, 44)), - new ECBlocks(28, new ECB(17, 22), - new ECB(1, 23)), - new ECBlocks(28, new ECB(2, 14), - new ECB(19, 15))), - new Version(19, new int[]{6, 30, 58, 86}, - new ECBlocks(28, new ECB(3, 113), - new ECB(4, 114)), - new ECBlocks(26, new ECB(3, 44), - new ECB(11, 45)), - new ECBlocks(26, new ECB(17, 21), - new ECB(4, 22)), - new ECBlocks(26, new ECB(9, 13), - new ECB(16, 14))), - new Version(20, new int[]{6, 34, 62, 90}, - new ECBlocks(28, new ECB(3, 107), - new ECB(5, 108)), - new ECBlocks(26, new ECB(3, 41), - new ECB(13, 42)), - new ECBlocks(30, new ECB(15, 24), - new ECB(5, 25)), - new ECBlocks(28, new ECB(15, 15), - new ECB(10, 16))), - new Version(21, new int[]{6, 28, 50, 72, 94}, - new ECBlocks(28, new ECB(4, 116), - new ECB(4, 117)), - new ECBlocks(26, new ECB(17, 42)), - new ECBlocks(28, new ECB(17, 22), - new ECB(6, 23)), - new ECBlocks(30, new ECB(19, 16), - new ECB(6, 17))), - new Version(22, new int[]{6, 26, 50, 74, 98}, - new ECBlocks(28, new ECB(2, 111), - new ECB(7, 112)), - new ECBlocks(28, new ECB(17, 46)), - new ECBlocks(30, new ECB(7, 24), - new ECB(16, 25)), - new ECBlocks(24, new ECB(34, 13))), - new Version(23, new int[]{6, 30, 54, 78, 102}, - new ECBlocks(30, new ECB(4, 121), - new ECB(5, 122)), - new ECBlocks(28, new ECB(4, 47), - new ECB(14, 48)), - new ECBlocks(30, new ECB(11, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(16, 15), - new ECB(14, 16))), - new Version(24, new int[]{6, 28, 54, 80, 106}, - new ECBlocks(30, new ECB(6, 117), - new ECB(4, 118)), - new ECBlocks(28, new ECB(6, 45), - new ECB(14, 46)), - new ECBlocks(30, new ECB(11, 24), - new ECB(16, 25)), - new ECBlocks(30, new ECB(30, 16), - new ECB(2, 17))), - new Version(25, new int[]{6, 32, 58, 84, 110}, - new ECBlocks(26, new ECB(8, 106), - new ECB(4, 107)), - new ECBlocks(28, new ECB(8, 47), - new ECB(13, 48)), - new ECBlocks(30, new ECB(7, 24), - new ECB(22, 25)), - new ECBlocks(30, new ECB(22, 15), - new ECB(13, 16))), - new Version(26, new int[]{6, 30, 58, 86, 114}, - new ECBlocks(28, new ECB(10, 114), - new ECB(2, 115)), - new ECBlocks(28, new ECB(19, 46), - new ECB(4, 47)), - new ECBlocks(28, new ECB(28, 22), - new ECB(6, 23)), - new ECBlocks(30, new ECB(33, 16), - new ECB(4, 17))), - new Version(27, new int[]{6, 34, 62, 90, 118}, - new ECBlocks(30, new ECB(8, 122), - new ECB(4, 123)), - new ECBlocks(28, new ECB(22, 45), - new ECB(3, 46)), - new ECBlocks(30, new ECB(8, 23), - new ECB(26, 24)), - new ECBlocks(30, new ECB(12, 15), - new ECB(28, 16))), - new Version(28, new int[]{6, 26, 50, 74, 98, 122}, - new ECBlocks(30, new ECB(3, 117), - new ECB(10, 118)), - new ECBlocks(28, new ECB(3, 45), - new ECB(23, 46)), - new ECBlocks(30, new ECB(4, 24), - new ECB(31, 25)), - new ECBlocks(30, new ECB(11, 15), - new ECB(31, 16))), - new Version(29, new int[]{6, 30, 54, 78, 102, 126}, - new ECBlocks(30, new ECB(7, 116), - new ECB(7, 117)), - new ECBlocks(28, new ECB(21, 45), - new ECB(7, 46)), - new ECBlocks(30, new ECB(1, 23), - new ECB(37, 24)), - new ECBlocks(30, new ECB(19, 15), - new ECB(26, 16))), - new Version(30, new int[]{6, 26, 52, 78, 104, 130}, - new ECBlocks(30, new ECB(5, 115), - new ECB(10, 116)), - new ECBlocks(28, new ECB(19, 47), - new ECB(10, 48)), - new ECBlocks(30, new ECB(15, 24), - new ECB(25, 25)), - new ECBlocks(30, new ECB(23, 15), - new ECB(25, 16))), - new Version(31, new int[]{6, 30, 56, 82, 108, 134}, - new ECBlocks(30, new ECB(13, 115), - new ECB(3, 116)), - new ECBlocks(28, new ECB(2, 46), - new ECB(29, 47)), - new ECBlocks(30, new ECB(42, 24), - new ECB(1, 25)), - new ECBlocks(30, new ECB(23, 15), - new ECB(28, 16))), - new Version(32, new int[]{6, 34, 60, 86, 112, 138}, - new ECBlocks(30, new ECB(17, 115)), - new ECBlocks(28, new ECB(10, 46), - new ECB(23, 47)), - new ECBlocks(30, new ECB(10, 24), - new ECB(35, 25)), - new ECBlocks(30, new ECB(19, 15), - new ECB(35, 16))), - new Version(33, new int[]{6, 30, 58, 86, 114, 142}, - new ECBlocks(30, new ECB(17, 115), - new ECB(1, 116)), - new ECBlocks(28, new ECB(14, 46), - new ECB(21, 47)), - new ECBlocks(30, new ECB(29, 24), - new ECB(19, 25)), - new ECBlocks(30, new ECB(11, 15), - new ECB(46, 16))), - new Version(34, new int[]{6, 34, 62, 90, 118, 146}, - new ECBlocks(30, new ECB(13, 115), - new ECB(6, 116)), - new ECBlocks(28, new ECB(14, 46), - new ECB(23, 47)), - new ECBlocks(30, new ECB(44, 24), - new ECB(7, 25)), - new ECBlocks(30, new ECB(59, 16), - new ECB(1, 17))), - new Version(35, new int[]{6, 30, 54, 78, 102, 126, 150}, - new ECBlocks(30, new ECB(12, 121), - new ECB(7, 122)), - new ECBlocks(28, new ECB(12, 47), - new ECB(26, 48)), - new ECBlocks(30, new ECB(39, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(22, 15), - new ECB(41, 16))), - new Version(36, new int[]{6, 24, 50, 76, 102, 128, 154}, - new ECBlocks(30, new ECB(6, 121), - new ECB(14, 122)), - new ECBlocks(28, new ECB(6, 47), - new ECB(34, 48)), - new ECBlocks(30, new ECB(46, 24), - new ECB(10, 25)), - new ECBlocks(30, new ECB(2, 15), - new ECB(64, 16))), - new Version(37, new int[]{6, 28, 54, 80, 106, 132, 158}, - new ECBlocks(30, new ECB(17, 122), - new ECB(4, 123)), - new ECBlocks(28, new ECB(29, 46), - new ECB(14, 47)), - new ECBlocks(30, new ECB(49, 24), - new ECB(10, 25)), - new ECBlocks(30, new ECB(24, 15), - new ECB(46, 16))), - new Version(38, new int[]{6, 32, 58, 84, 110, 136, 162}, - new ECBlocks(30, new ECB(4, 122), - new ECB(18, 123)), - new ECBlocks(28, new ECB(13, 46), - new ECB(32, 47)), - new ECBlocks(30, new ECB(48, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(42, 15), - new ECB(32, 16))), - new Version(39, new int[]{6, 26, 54, 82, 110, 138, 166}, - new ECBlocks(30, new ECB(20, 117), - new ECB(4, 118)), - new ECBlocks(28, new ECB(40, 47), - new ECB(7, 48)), - new ECBlocks(30, new ECB(43, 24), - new ECB(22, 25)), - new ECBlocks(30, new ECB(10, 15), - new ECB(67, 16))), - new Version(40, new int[]{6, 30, 58, 86, 114, 142, 170}, - new ECBlocks(30, new ECB(19, 118), - new ECB(6, 119)), - new ECBlocks(28, new ECB(18, 47), - new ECB(31, 48)), - new ECBlocks(30, new ECB(34, 24), - new ECB(34, 25)), - new ECBlocks(30, new ECB(20, 15), - new ECB(61, 16))) - }; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPattern.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPattern.java deleted file mode 100644 index 96d9194..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPattern.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -import com.google.zxing.ResultPoint; - -/** - *

    Encapsulates an alignment pattern, which are the smaller square patterns found in - * all but the simplest QR Codes.

    - * - * @author Sean Owen - */ -public final class AlignmentPattern extends ResultPoint { - - private final float estimatedModuleSize; - - AlignmentPattern(float posX, float posY, float estimatedModuleSize) { - super(posX, posY); - this.estimatedModuleSize = estimatedModuleSize; - } - - /** - *

    Determines if this alignment pattern "about equals" an alignment pattern at the stated - * position and size -- meaning, it is at nearly the same center with nearly the same size.

    - */ - boolean aboutEquals(float moduleSize, float i, float j) { - if (Math.abs(i - getY()) <= moduleSize && Math.abs(j - getX()) <= moduleSize) { - float moduleSizeDiff = Math.abs(moduleSize - estimatedModuleSize); - return moduleSizeDiff <= 1.0f || moduleSizeDiff <= estimatedModuleSize; - } - return false; - } - - /** - * Combines this object's current estimate of a finder pattern position and module size - * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. - */ - AlignmentPattern combineEstimate(float i, float j, float newModuleSize) { - float combinedX = (getX() + j) / 2.0f; - float combinedY = (getY() + i) / 2.0f; - float combinedModuleSize = (estimatedModuleSize + newModuleSize) / 2.0f; - return new AlignmentPattern(combinedX, combinedY, combinedModuleSize); - } - -} \ No newline at end of file diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java deleted file mode 100644 index 062d4d7..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitMatrix; - -import java.util.ArrayList; -import java.util.List; - -/** - *

    This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder - * patterns but are smaller and appear at regular intervals throughout the image.

    - * - *

    At the moment this only looks for the bottom-right alignment pattern.

    - * - *

    This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied, - * pasted and stripped down here for maximum performance but does unfortunately duplicate - * some code.

    - * - *

    This class is thread-safe but not reentrant. Each thread must allocate its own object.

    - * - * @author Sean Owen - */ -final class AlignmentPatternFinder { - - private final BitMatrix image; - private final List possibleCenters; - private final int startX; - private final int startY; - private final int width; - private final int height; - private final float moduleSize; - private final int[] crossCheckStateCount; - private final ResultPointCallback resultPointCallback; - - /** - *

    Creates a finder that will look in a portion of the whole image.

    - * - * @param image image to search - * @param startX left column from which to start searching - * @param startY top row from which to start searching - * @param width width of region to search - * @param height height of region to search - * @param moduleSize estimated module size so far - */ - AlignmentPatternFinder(BitMatrix image, - int startX, - int startY, - int width, - int height, - float moduleSize, - ResultPointCallback resultPointCallback) { - this.image = image; - this.possibleCenters = new ArrayList<>(5); - this.startX = startX; - this.startY = startY; - this.width = width; - this.height = height; - this.moduleSize = moduleSize; - this.crossCheckStateCount = new int[3]; - this.resultPointCallback = resultPointCallback; - } - - /** - *

    This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since - * it's pretty performance-critical and so is written to be fast foremost.

    - * - * @return {@link AlignmentPattern} if found - * @throws NotFoundException if not found - */ - AlignmentPattern find() throws NotFoundException { - int startX = this.startX; - int height = this.height; - int maxJ = startX + width; - int middleI = startY + (height / 2); - // We are looking for black/white/black modules in 1:1:1 ratio; - // this tracks the number of black/white/black modules seen so far - int[] stateCount = new int[3]; - for (int iGen = 0; iGen < height; iGen++) { - // Search from middle outwards - int i = middleI + ((iGen & 0x01) == 0 ? (iGen + 1) / 2 : -((iGen + 1) / 2)); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - int j = startX; - // Burn off leading white pixels before anything else; if we start in the middle of - // a white run, it doesn't make sense to count its length, since we don't know if the - // white run continued to the left of the start point - while (j < maxJ && !image.get(j, i)) { - j++; - } - int currentState = 0; - while (j < maxJ) { - if (image.get(j, i)) { - // Black pixel - if (currentState == 1) { // Counting black pixels - stateCount[1]++; - } else { // Counting white pixels - if (currentState == 2) { // A winner? - if (foundPatternCross(stateCount)) { // Yes - AlignmentPattern confirmed = handlePossibleCenter(stateCount, i, j); - if (confirmed != null) { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } else { - stateCount[++currentState]++; - } - } - } else { // White pixel - if (currentState == 1) { // Counting black pixels - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (foundPatternCross(stateCount)) { - AlignmentPattern confirmed = handlePossibleCenter(stateCount, i, maxJ); - if (confirmed != null) { - return confirmed; - } - } - - } - - // Hmm, nothing we saw was observed and confirmed twice. If we had - // any guess at all, return it. - if (!possibleCenters.isEmpty()) { - return possibleCenters.get(0); - } - - throw NotFoundException.getNotFoundInstance(); - } - - /** - * Given a count of black/white/black pixels just seen and an end position, - * figures the location of the center of this black/white/black run. - */ - private static float centerFromEnd(int[] stateCount, int end) { - return (float) (end - stateCount[2]) - stateCount[1] / 2.0f; - } - - /** - * @param stateCount count of black/white/black pixels just read - * @return true iff the proportions of the counts is close enough to the 1/1/1 ratios - * used by alignment patterns to be considered a match - */ - private boolean foundPatternCross(int[] stateCount) { - float moduleSize = this.moduleSize; - float maxVariance = moduleSize / 2.0f; - for (int i = 0; i < 3; i++) { - if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) { - return false; - } - } - return true; - } - - /** - *

    After a horizontal scan finds a potential alignment pattern, this method - * "cross-checks" by scanning down vertically through the center of the possible - * alignment pattern to see if the same proportion is detected.

    - * - * @param startI row where an alignment pattern was detected - * @param centerJ center of the section that appears to cross an alignment pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @return vertical center of alignment pattern, or {@link Float#NaN} if not found - */ - private float crossCheckVertical(int startI, int centerJ, int maxCount, - int originalStateCountTotal) { - BitMatrix image = this.image; - - int maxI = image.getHeight(); - int[] stateCount = crossCheckStateCount; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - - // Start counting up from center - int i = startI; - while (i >= 0 && image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return Float.NaN; - } - while (i >= 0 && !image.get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return Float.NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - if (i == maxI || stateCount[1] > maxCount) { - return Float.NaN; - } - while (i < maxI && !image.get(centerJ, i) && stateCount[2] <= maxCount) { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) { - return Float.NaN; - } - - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return Float.NaN; - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : Float.NaN; - } - - /** - *

    This is called when a horizontal scan finds a possible alignment pattern. It will - * cross check with a vertical scan, and if successful, will see if this pattern had been - * found on a previous horizontal scan. If so, we consider it confirmed and conclude we have - * found the alignment pattern.

    - * - * @param stateCount reading state module counts from horizontal scan - * @param i row where alignment pattern may be found - * @param j end of possible alignment pattern in row - * @return {@link AlignmentPattern} if we have found the same pattern twice, or null if not - */ - private AlignmentPattern handlePossibleCenter(int[] stateCount, int i, int j) { - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - float centerJ = centerFromEnd(stateCount, j); - float centerI = crossCheckVertical(i, (int) centerJ, 2 * stateCount[1], stateCountTotal); - if (!Float.isNaN(centerI)) { - float estimatedModuleSize = (float) (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; - for (AlignmentPattern center : possibleCenters) { - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) { - return center.combineEstimate(centerI, centerJ, estimatedModuleSize); - } - } - // Hadn't found this before; save it - AlignmentPattern point = new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - possibleCenters.add(point); - if (resultPointCallback != null) { - resultPointCallback.foundPossibleResultPoint(point); - } - } - return null; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/Detector.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/Detector.java deleted file mode 100644 index d3367ba..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/Detector.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -import com.google.zxing.DecodeHintType; -import com.google.zxing.FormatException; -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitMatrix; -import com.google.zxing.common.DetectorResult; -import com.google.zxing.common.GridSampler; -import com.google.zxing.common.PerspectiveTransform; -import com.google.zxing.common.detector.MathUtils; -import com.google.zxing.qrcode.decoder.Version; - -import java.util.Map; - -/** - *

    Encapsulates logic that can detect a QR Code in an image, even if the QR Code - * is rotated or skewed, or partially obscured.

    - * - * @author Sean Owen - */ -public class Detector { - - private final BitMatrix image; - private ResultPointCallback resultPointCallback; - - public Detector(BitMatrix image) { - this.image = image; - } - - protected final BitMatrix getImage() { - return image; - } - - protected final ResultPointCallback getResultPointCallback() { - return resultPointCallback; - } - - /** - *

    Detects a QR Code in an image.

    - * - * @return {@link DetectorResult} encapsulating results of detecting a QR Code - * @throws NotFoundException if QR Code cannot be found - * @throws FormatException if a QR Code cannot be decoded - */ - public DetectorResult detect() throws NotFoundException, FormatException { - return detect(null); - } - - /** - *

    Detects a QR Code in an image.

    - * - * @param hints optional hints to detector - * @return {@link DetectorResult} encapsulating results of detecting a QR Code - * @throws NotFoundException if QR Code cannot be found - * @throws FormatException if a QR Code cannot be decoded - */ - public final DetectorResult detect(Map hints) throws NotFoundException, FormatException { - - resultPointCallback = hints == null ? null : - (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); - - FinderPatternFinder finder = new FinderPatternFinder(image, resultPointCallback); - FinderPatternInfo info = finder.find(hints); - - return processFinderPatternInfo(info); - } - - protected final DetectorResult processFinderPatternInfo(FinderPatternInfo info) - throws NotFoundException, FormatException { - - FinderPattern topLeft = info.getTopLeft(); - FinderPattern topRight = info.getTopRight(); - FinderPattern bottomLeft = info.getBottomLeft(); - - float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft); - if (moduleSize < 1.0f) { - throw NotFoundException.getNotFoundInstance(); - } - int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize); - Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension); - int modulesBetweenFPCenters = provisionalVersion.getDimensionForVersion() - 7; - - AlignmentPattern alignmentPattern = null; - // Anything above version 1 has an alignment pattern - if (provisionalVersion.getAlignmentPatternCenters().length > 0) { - - // Guess where a "bottom right" finder pattern would have been - float bottomRightX = topRight.getX() - topLeft.getX() + bottomLeft.getX(); - float bottomRightY = topRight.getY() - topLeft.getY() + bottomLeft.getY(); - - // Estimate that alignment pattern is closer by 3 modules - // from "bottom right" to known top left location - float correctionToTopLeft = 1.0f - 3.0f / (float) modulesBetweenFPCenters; - int estAlignmentX = (int) (topLeft.getX() + correctionToTopLeft * (bottomRightX - topLeft.getX())); - int estAlignmentY = (int) (topLeft.getY() + correctionToTopLeft * (bottomRightY - topLeft.getY())); - - // Kind of arbitrary -- expand search radius before giving up - for (int i = 4; i <= 16; i <<= 1) { - try { - alignmentPattern = findAlignmentInRegion(moduleSize, - estAlignmentX, - estAlignmentY, - (float) i); - break; - } catch (NotFoundException re) { - // try next round - } - } - // If we didn't find alignment pattern... well try anyway without it - } - - PerspectiveTransform transform = - createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension); - - BitMatrix bits = sampleGrid(image, transform, dimension); - - ResultPoint[] points; - if (alignmentPattern == null) { - points = new ResultPoint[]{bottomLeft, topLeft, topRight}; - } else { - points = new ResultPoint[]{bottomLeft, topLeft, topRight, alignmentPattern}; - } - return new DetectorResult(bits, points); - } - - private static PerspectiveTransform createTransform(ResultPoint topLeft, - ResultPoint topRight, - ResultPoint bottomLeft, - ResultPoint alignmentPattern, - int dimension) { - float dimMinusThree = (float) dimension - 3.5f; - float bottomRightX; - float bottomRightY; - float sourceBottomRightX; - float sourceBottomRightY; - if (alignmentPattern != null) { - bottomRightX = alignmentPattern.getX(); - bottomRightY = alignmentPattern.getY(); - sourceBottomRightX = dimMinusThree - 3.0f; - sourceBottomRightY = sourceBottomRightX; - } else { - // Don't have an alignment pattern, just make up the bottom-right point - bottomRightX = (topRight.getX() - topLeft.getX()) + bottomLeft.getX(); - bottomRightY = (topRight.getY() - topLeft.getY()) + bottomLeft.getY(); - sourceBottomRightX = dimMinusThree; - sourceBottomRightY = dimMinusThree; - } - - return PerspectiveTransform.quadrilateralToQuadrilateral( - 3.5f, - 3.5f, - dimMinusThree, - 3.5f, - sourceBottomRightX, - sourceBottomRightY, - 3.5f, - dimMinusThree, - topLeft.getX(), - topLeft.getY(), - topRight.getX(), - topRight.getY(), - bottomRightX, - bottomRightY, - bottomLeft.getX(), - bottomLeft.getY()); - } - - private static BitMatrix sampleGrid(BitMatrix image, - PerspectiveTransform transform, - int dimension) throws NotFoundException { - - GridSampler sampler = GridSampler.getInstance(); - return sampler.sampleGrid(image, dimension, dimension, transform); - } - - /** - *

    Computes the dimension (number of modules on a size) of the QR Code based on the position - * of the finder patterns and estimated module size.

    - */ - private static int computeDimension(ResultPoint topLeft, - ResultPoint topRight, - ResultPoint bottomLeft, - float moduleSize) throws NotFoundException { - int tltrCentersDimension = MathUtils.round(ResultPoint.distance(topLeft, topRight) / moduleSize); - int tlblCentersDimension = MathUtils.round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize); - int dimension = ((tltrCentersDimension + tlblCentersDimension) / 2) + 7; - switch (dimension & 0x03) { // mod 4 - case 0: - dimension++; - break; - // 1? do nothing - case 2: - dimension--; - break; - case 3: - throw NotFoundException.getNotFoundInstance(); - } - return dimension; - } - - /** - *

    Computes an average estimated module size based on estimated derived from the positions - * of the three finder patterns.

    - * - * @param topLeft detected top-left finder pattern center - * @param topRight detected top-right finder pattern center - * @param bottomLeft detected bottom-left finder pattern center - * @return estimated module size - */ - protected final float calculateModuleSize(ResultPoint topLeft, - ResultPoint topRight, - ResultPoint bottomLeft) { - // Take the average - return (calculateModuleSizeOneWay(topLeft, topRight) + - calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f; - } - - /** - *

    Estimates module size based on two finder patterns -- it uses - * {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the - * width of each, measuring along the axis between their centers.

    - */ - private float calculateModuleSizeOneWay(ResultPoint pattern, ResultPoint otherPattern) { - float moduleSizeEst1 = sizeOfBlackWhiteBlackRunBothWays((int) pattern.getX(), - (int) pattern.getY(), - (int) otherPattern.getX(), - (int) otherPattern.getY()); - float moduleSizeEst2 = sizeOfBlackWhiteBlackRunBothWays((int) otherPattern.getX(), - (int) otherPattern.getY(), - (int) pattern.getX(), - (int) pattern.getY()); - if (Float.isNaN(moduleSizeEst1)) { - return moduleSizeEst2 / 7.0f; - } - if (Float.isNaN(moduleSizeEst2)) { - return moduleSizeEst1 / 7.0f; - } - // Average them, and divide by 7 since we've counted the width of 3 black modules, - // and 1 white and 1 black module on either side. Ergo, divide sum by 14. - return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; - } - - /** - * See {@link #sizeOfBlackWhiteBlackRun(int, int, int, int)}; computes the total width of - * a finder pattern by looking for a black-white-black run from the center in the direction - * of another point (another finder pattern center), and in the opposite direction too. - */ - private float sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY) { - - float result = sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - - // Now count other way -- don't run off image though of course - float scale = 1.0f; - int otherToX = fromX - (toX - fromX); - if (otherToX < 0) { - scale = (float) fromX / (float) (fromX - otherToX); - otherToX = 0; - } else if (otherToX >= image.getWidth()) { - scale = (float) (image.getWidth() - 1 - fromX) / (float) (otherToX - fromX); - otherToX = image.getWidth() - 1; - } - int otherToY = (int) (fromY - (toY - fromY) * scale); - - scale = 1.0f; - if (otherToY < 0) { - scale = (float) fromY / (float) (fromY - otherToY); - otherToY = 0; - } else if (otherToY >= image.getHeight()) { - scale = (float) (image.getHeight() - 1 - fromY) / (float) (otherToY - fromY); - otherToY = image.getHeight() - 1; - } - otherToX = (int) (fromX + (otherToX - fromX) * scale); - - result += sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - - // Middle pixel is double-counted this way; subtract 1 - return result - 1.0f; - } - - /** - *

    This method traces a line from a point in the image, in the direction towards another point. - * It begins in a black region, and keeps going until it finds white, then black, then white again. - * It reports the distance from the start to this point.

    - * - *

    This is used when figuring out how wide a finder pattern is, when the finder pattern - * may be skewed or rotated.

    - */ - private float sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY) { - // Mild variant of Bresenham's algorithm; - // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm - boolean steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) { - int temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - int dx = Math.abs(toX - fromX); - int dy = Math.abs(toY - fromY); - int error = -dx / 2; - int xstep = fromX < toX ? 1 : -1; - int ystep = fromY < toY ? 1 : -1; - - // In black pixels, looking for white, first or second time. - int state = 0; - // Loop up until x == toX, but not beyond - int xLimit = toX + xstep; - for (int x = fromX, y = fromY; x != xLimit; x += xstep) { - int realX = steep ? y : x; - int realY = steep ? x : y; - - // Does current pixel mean we have moved white to black or vice versa? - // Scanning black in state 0,2 and white in state 1, so if we find the wrong - // color, advance to next state or end if we are in state 2 already - if ((state == 1) == image.get(realX, realY)) { - if (state == 2) { - return MathUtils.distance(x, y, fromX, fromY); - } - state++; - } - - error += dy; - if (error > 0) { - if (y == toY) { - break; - } - y += ystep; - error -= dx; - } - } - // Found black-white-black; give the benefit of the doubt that the next pixel outside the image - // is "white" so this last point at (toX+xStep,toY) is the right ending. This is really a - // small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. - if (state == 2) { - return MathUtils.distance(toX + xstep, toY, fromX, fromY); - } - // else we didn't find even black-white-black; no estimate is really possible - return Float.NaN; - } - - /** - *

    Attempts to locate an alignment pattern in a limited region of the image, which is - * guessed to contain it. This method uses {@link AlignmentPattern}.

    - * - * @param overallEstModuleSize estimated module size so far - * @param estAlignmentX x coordinate of center of area probably containing alignment pattern - * @param estAlignmentY y coordinate of above - * @param allowanceFactor number of pixels in all directions to search from the center - * @return {@link AlignmentPattern} if found, or null otherwise - * @throws NotFoundException if an unexpected error occurs during detection - */ - protected final AlignmentPattern findAlignmentInRegion(float overallEstModuleSize, - int estAlignmentX, - int estAlignmentY, - float allowanceFactor) - throws NotFoundException { - // Look for an alignment pattern (3 modules in size) around where it - // should be - int allowance = (int) (allowanceFactor * overallEstModuleSize); - int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); - int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { - throw NotFoundException.getNotFoundInstance(); - } - - int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); - int alignmentAreaBottomY = Math.min(image.getHeight() - 1, estAlignmentY + allowance); - if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) { - throw NotFoundException.getNotFoundInstance(); - } - - AlignmentPatternFinder alignmentFinder = - new AlignmentPatternFinder( - image, - alignmentAreaLeftX, - alignmentAreaTopY, - alignmentAreaRightX - alignmentAreaLeftX, - alignmentAreaBottomY - alignmentAreaTopY, - overallEstModuleSize, - resultPointCallback); - return alignmentFinder.find(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPattern.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPattern.java deleted file mode 100644 index a64e7c2..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPattern.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -import com.google.zxing.ResultPoint; - -/** - *

    Encapsulates a finder pattern, which are the three square patterns found in - * the corners of QR Codes. It also encapsulates a count of similar finder patterns, - * as a convenience to the finder's bookkeeping.

    - * - * @author Sean Owen - */ -public final class FinderPattern extends ResultPoint { - - private final float estimatedModuleSize; - private final int count; - - FinderPattern(float posX, float posY, float estimatedModuleSize) { - this(posX, posY, estimatedModuleSize, 1); - } - - private FinderPattern(float posX, float posY, float estimatedModuleSize, int count) { - super(posX, posY); - this.estimatedModuleSize = estimatedModuleSize; - this.count = count; - } - - public float getEstimatedModuleSize() { - return estimatedModuleSize; - } - - int getCount() { - return count; - } - - /* - void incrementCount() { - this.count++; - } - */ - - /** - *

    Determines if this finder pattern "about equals" a finder pattern at the stated - * position and size -- meaning, it is at nearly the same center with nearly the same size.

    - */ - boolean aboutEquals(float moduleSize, float i, float j) { - if (Math.abs(i - getY()) <= moduleSize && Math.abs(j - getX()) <= moduleSize) { - float moduleSizeDiff = Math.abs(moduleSize - estimatedModuleSize); - return moduleSizeDiff <= 1.0f || moduleSizeDiff <= estimatedModuleSize; - } - return false; - } - - /** - * Combines this object's current estimate of a finder pattern position and module size - * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average - * based on count. - */ - FinderPattern combineEstimate(float i, float j, float newModuleSize) { - int combinedCount = count + 1; - float combinedX = (count * getX() + j) / combinedCount; - float combinedY = (count * getY() + i) / combinedCount; - float combinedModuleSize = (count * estimatedModuleSize + newModuleSize) / combinedCount; - return new FinderPattern(combinedX, combinedY, combinedModuleSize, combinedCount); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java deleted file mode 100644 index 9c0c59f..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternFinder.java +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -import com.google.zxing.DecodeHintType; -import com.google.zxing.NotFoundException; -import com.google.zxing.ResultPoint; -import com.google.zxing.ResultPointCallback; -import com.google.zxing.common.BitMatrix; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - -/** - *

    This class attempts to find finder patterns in a QR Code. Finder patterns are the square - * markers at three corners of a QR Code.

    - * - *

    This class is thread-safe but not reentrant. Each thread must allocate its own object. - * - * @author Sean Owen - */ -public class FinderPatternFinder { - - private static final int CENTER_QUORUM = 2; - protected static final int MIN_SKIP = 3; // 1 pixel/module times 3 modules/center - protected static final int MAX_MODULES = 57; // support up to version 10 for mobile clients - - private final BitMatrix image; - private final List possibleCenters; - private boolean hasSkipped; - private final int[] crossCheckStateCount; - private final ResultPointCallback resultPointCallback; - - /** - *

    Creates a finder that will search the image for three finder patterns.

    - * - * @param image image to search - */ - public FinderPatternFinder(BitMatrix image) { - this(image, null); - } - - public FinderPatternFinder(BitMatrix image, ResultPointCallback resultPointCallback) { - this.image = image; - this.possibleCenters = new ArrayList<>(); - this.crossCheckStateCount = new int[5]; - this.resultPointCallback = resultPointCallback; - } - - protected final BitMatrix getImage() { - return image; - } - - protected final List getPossibleCenters() { - return possibleCenters; - } - - final FinderPatternInfo find(Map hints) throws NotFoundException { - boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); - boolean pureBarcode = hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE); - int maxI = image.getHeight(); - int maxJ = image.getWidth(); - // We are looking for black/white/black/white/black modules in - // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far - - // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the - // image, and then account for the center being 3 modules in size. This gives the smallest - // number of pixels the center could be, so skip this often. When trying harder, look for all - // QR versions regardless of how dense they are. - int iSkip = (3 * maxI) / (4 * MAX_MODULES); - if (iSkip < MIN_SKIP || tryHarder) { - iSkip = MIN_SKIP; - } - - boolean done = false; - int[] stateCount = new int[5]; - for (int i = iSkip - 1; i < maxI && !done; i += iSkip) { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - int currentState = 0; - for (int j = 0; j < maxJ; j++) { - if (image.get(j, i)) { - // Black pixel - if ((currentState & 1) == 1) { // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } else { // White pixel - if ((currentState & 1) == 0) { // Counting black pixels - if (currentState == 4) { // A winner? - if (foundPatternCross(stateCount)) { // Yes - boolean confirmed = handlePossibleCenter(stateCount, i, j, pureBarcode); - if (confirmed) { - // Start examining every other line. Checking each line turned out to be too - // expensive and didn't improve performance. - iSkip = 2; - if (hasSkipped) { - done = haveMultiplyConfirmedCenters(); - } else { - int rowSkip = findRowSkip(); - if (rowSkip > stateCount[2]) { - // Skip rows between row of lower confirmed center - // and top of presumed third confirmed center - // but back up a bit to get a full chance of detecting - // it, entire width of center of finder pattern - - // Skip by rowSkip, but back off by stateCount[2] (size of last center - // of pattern we saw) to be conservative, and also back off by iSkip which - // is about to be re-added - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } else { - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - continue; - } - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } else { // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } else { - stateCount[++currentState]++; - } - } else { // Counting white pixels - stateCount[currentState]++; - } - } - } - if (foundPatternCross(stateCount)) { - boolean confirmed = handlePossibleCenter(stateCount, i, maxJ, pureBarcode); - if (confirmed) { - iSkip = stateCount[0]; - if (hasSkipped) { - // Found a third one - done = haveMultiplyConfirmedCenters(); - } - } - } - } - - FinderPattern[] patternInfo = selectBestPatterns(); - ResultPoint.orderBestPatterns(patternInfo); - - return new FinderPatternInfo(patternInfo); - } - - /** - * Given a count of black/white/black/white/black pixels just seen and an end position, - * figures the location of the center of this run. - */ - private static float centerFromEnd(int[] stateCount, int end) { - return (float) (end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; - } - - /** - * @param stateCount count of black/white/black/white/black pixels just read - * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios - * used by finder patterns to be considered a match - */ - protected static boolean foundPatternCross(int[] stateCount) { - int totalModuleSize = 0; - for (int i = 0; i < 5; i++) { - int count = stateCount[i]; - if (count == 0) { - return false; - } - totalModuleSize += count; - } - if (totalModuleSize < 7) { - return false; - } - float moduleSize = totalModuleSize / 7.0f; - float maxVariance = moduleSize / 2.0f; - // Allow less than 50% variance from 1-1-3-1-1 proportions - return - Math.abs(moduleSize - stateCount[0]) < maxVariance && - Math.abs(moduleSize - stateCount[1]) < maxVariance && - Math.abs(3.0f * moduleSize - stateCount[2]) < 3 * maxVariance && - Math.abs(moduleSize - stateCount[3]) < maxVariance && - Math.abs(moduleSize - stateCount[4]) < maxVariance; - } - - private int[] getCrossCheckStateCount() { - crossCheckStateCount[0] = 0; - crossCheckStateCount[1] = 0; - crossCheckStateCount[2] = 0; - crossCheckStateCount[3] = 0; - crossCheckStateCount[4] = 0; - return crossCheckStateCount; - } - - /** - * After a vertical and horizontal scan finds a potential finder pattern, this method - * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible - * finder pattern to see if the same proportion is detected. - * - * @param startI row where a finder pattern was detected - * @param centerJ center of the section that appears to cross a finder pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @param originalStateCountTotal The original state count total. - * @return true if proportions are withing expected limits - */ - private boolean crossCheckDiagonal(int startI, int centerJ, int maxCount, int originalStateCountTotal) { - int[] stateCount = getCrossCheckStateCount(); - - // Start counting up, left from center finding black center mass - int i = 0; - while (startI >= i && centerJ >= i && image.get(centerJ - i, startI - i)) { - stateCount[2]++; - i++; - } - - if (startI < i || centerJ < i) { - return false; - } - - // Continue up, left finding white space - while (startI >= i && centerJ >= i && !image.get(centerJ - i, startI - i) && - stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - - // If already too many modules in this state or ran off the edge: - if (startI < i || centerJ < i || stateCount[1] > maxCount) { - return false; - } - - // Continue up, left finding black border - while (startI >= i && centerJ >= i && image.get(centerJ - i, startI - i) && - stateCount[0] <= maxCount) { - stateCount[0]++; - i++; - } - if (stateCount[0] > maxCount) { - return false; - } - - int maxI = image.getHeight(); - int maxJ = image.getWidth(); - - // Now also count down, right from center - i = 1; - while (startI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, startI + i)) { - stateCount[2]++; - i++; - } - - // Ran off the edge? - if (startI + i >= maxI || centerJ + i >= maxJ) { - return false; - } - - while (startI + i < maxI && centerJ + i < maxJ && !image.get(centerJ + i, startI + i) && - stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - - if (startI + i >= maxI || centerJ + i >= maxJ || stateCount[3] >= maxCount) { - return false; - } - - while (startI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, startI + i) && - stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - - if (stateCount[4] >= maxCount) { - return false; - } - - // If we found a finder-pattern-like section, but its size is more than 100% different than - // the original, assume it's a false positive - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - return - Math.abs(stateCountTotal - originalStateCountTotal) < 2 * originalStateCountTotal && - foundPatternCross(stateCount); - } - - /** - *

    After a horizontal scan finds a potential finder pattern, this method - * "cross-checks" by scanning down vertically through the center of the possible - * finder pattern to see if the same proportion is detected.

    - * - * @param startI row where a finder pattern was detected - * @param centerJ center of the section that appears to cross a finder pattern - * @param maxCount maximum reasonable number of modules that should be - * observed in any reading state, based on the results of the horizontal scan - * @return vertical center of finder pattern, or {@link Float#NaN} if not found - */ - private float crossCheckVertical(int startI, int centerJ, int maxCount, - int originalStateCountTotal) { - BitMatrix image = this.image; - - int maxI = image.getHeight(); - int[] stateCount = getCrossCheckStateCount(); - - // Start counting up from center - int i = startI; - while (i >= 0 && image.get(centerJ, i)) { - stateCount[2]++; - i--; - } - if (i < 0) { - return Float.NaN; - } - while (i >= 0 && !image.get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return Float.NaN; - } - while (i >= 0 && image.get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return Float.NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image.get(centerJ, i)) { - stateCount[2]++; - i++; - } - if (i == maxI) { - return Float.NaN; - } - while (i < maxI && !image.get(centerJ, i) && stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - if (i == maxI || stateCount[3] >= maxCount) { - return Float.NaN; - } - while (i < maxI && image.get(centerJ, i) && stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) { - return Float.NaN; - } - - // If we found a finder-pattern-like section, but its size is more than 40% different than - // the original, assume it's a false positive - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return Float.NaN; - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : Float.NaN; - } - - /** - *

    Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical, - * except it reads horizontally instead of vertically. This is used to cross-cross - * check a vertical cross check and locate the real center of the alignment pattern.

    - */ - private float crossCheckHorizontal(int startJ, int centerI, int maxCount, - int originalStateCountTotal) { - BitMatrix image = this.image; - - int maxJ = image.getWidth(); - int[] stateCount = getCrossCheckStateCount(); - - int j = startJ; - while (j >= 0 && image.get(j, centerI)) { - stateCount[2]++; - j--; - } - if (j < 0) { - return Float.NaN; - } - while (j >= 0 && !image.get(j, centerI) && stateCount[1] <= maxCount) { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) { - return Float.NaN; - } - while (j >= 0 && image.get(j, centerI) && stateCount[0] <= maxCount) { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) { - return Float.NaN; - } - - j = startJ + 1; - while (j < maxJ && image.get(j, centerI)) { - stateCount[2]++; - j++; - } - if (j == maxJ) { - return Float.NaN; - } - while (j < maxJ && !image.get(j, centerI) && stateCount[3] < maxCount) { - stateCount[3]++; - j++; - } - if (j == maxJ || stateCount[3] >= maxCount) { - return Float.NaN; - } - while (j < maxJ && image.get(j, centerI) && stateCount[4] < maxCount) { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) { - return Float.NaN; - } - - // If we found a finder-pattern-like section, but its size is significantly different than - // the original, assume it's a false positive - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return Float.NaN; - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, j) : Float.NaN; - } - - /** - *

    This is called when a horizontal scan finds a possible alignment pattern. It will - * cross check with a vertical scan, and if successful, will, ah, cross-cross-check - * with another horizontal scan. This is needed primarily to locate the real horizontal - * center of the pattern in cases of extreme skew. - * And then we cross-cross-cross check with another diagonal scan.

    - * - *

    If that succeeds the finder pattern location is added to a list that tracks - * the number of times each location has been nearly-matched as a finder pattern. - * Each additional find is more evidence that the location is in fact a finder - * pattern center - * - * @param stateCount reading state module counts from horizontal scan - * @param i row where finder pattern may be found - * @param j end of possible finder pattern in row - * @param pureBarcode true if in "pure barcode" mode - * @return true if a finder pattern candidate was found this time - */ - protected final boolean handlePossibleCenter(int[] stateCount, int i, int j, boolean pureBarcode) { - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + - stateCount[4]; - float centerJ = centerFromEnd(stateCount, j); - float centerI = crossCheckVertical(i, (int) centerJ, stateCount[2], stateCountTotal); - if (!Float.isNaN(centerI)) { - // Re-cross check - centerJ = crossCheckHorizontal((int) centerJ, (int) centerI, stateCount[2], stateCountTotal); - if (!Float.isNaN(centerJ) && - (!pureBarcode || crossCheckDiagonal((int) centerI, (int) centerJ, stateCount[2], stateCountTotal))) { - float estimatedModuleSize = (float) stateCountTotal / 7.0f; - boolean found = false; - for (int index = 0; index < possibleCenters.size(); index++) { - FinderPattern center = possibleCenters.get(index); - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) { - possibleCenters.set(index, center.combineEstimate(centerI, centerJ, estimatedModuleSize)); - found = true; - break; - } - } - if (!found) { - FinderPattern point = new FinderPattern(centerJ, centerI, estimatedModuleSize); - possibleCenters.add(point); - if (resultPointCallback != null) { - resultPointCallback.foundPossibleResultPoint(point); - } - } - return true; - } - } - return false; - } - - /** - * @return number of rows we could safely skip during scanning, based on the first - * two finder patterns that have been located. In some cases their position will - * allow us to infer that the third pattern must lie below a certain point farther - * down in the image. - */ - private int findRowSkip() { - int max = possibleCenters.size(); - if (max <= 1) { - return 0; - } - ResultPoint firstConfirmedCenter = null; - for (FinderPattern center : possibleCenters) { - if (center.getCount() >= CENTER_QUORUM) { - if (firstConfirmedCenter == null) { - firstConfirmedCenter = center; - } else { - // We have two confirmed centers - // How far down can we skip before resuming looking for the next - // pattern? In the worst case, only the difference between the - // difference in the x / y coordinates of the two centers. - // This is the case where you find top left last. - hasSkipped = true; - return (int) (Math.abs(firstConfirmedCenter.getX() - center.getX()) - - Math.abs(firstConfirmedCenter.getY() - center.getY())) / 2; - } - } - } - return 0; - } - - /** - * @return true iff we have found at least 3 finder patterns that have been detected - * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the - * candidates is "pretty similar" - */ - private boolean haveMultiplyConfirmedCenters() { - int confirmedCount = 0; - float totalModuleSize = 0.0f; - int max = possibleCenters.size(); - for (FinderPattern pattern : possibleCenters) { - if (pattern.getCount() >= CENTER_QUORUM) { - confirmedCount++; - totalModuleSize += pattern.getEstimatedModuleSize(); - } - } - if (confirmedCount < 3) { - return false; - } - // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" - // and that we need to keep looking. We detect this by asking if the estimated module sizes - // vary too much. We arbitrarily say that when the total deviation from average exceeds - // 5% of the total module size estimates, it's too much. - float average = totalModuleSize / (float) max; - float totalDeviation = 0.0f; - for (FinderPattern pattern : possibleCenters) { - totalDeviation += Math.abs(pattern.getEstimatedModuleSize() - average); - } - return totalDeviation <= 0.05f * totalModuleSize; - } - - /** - * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are - * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module - * size differs from the average among those patterns the least - * @throws NotFoundException if 3 such finder patterns do not exist - */ - private FinderPattern[] selectBestPatterns() throws NotFoundException { - - int startSize = possibleCenters.size(); - if (startSize < 3) { - // Couldn't find enough finder patterns - throw NotFoundException.getNotFoundInstance(); - } - - // Filter outlier possibilities whose module size is too different - if (startSize > 3) { - // But we can only afford to do so if we have at least 4 possibilities to choose from - float totalModuleSize = 0.0f; - float square = 0.0f; - for (FinderPattern center : possibleCenters) { - float size = center.getEstimatedModuleSize(); - totalModuleSize += size; - square += size * size; - } - float average = totalModuleSize / (float) startSize; - float stdDev = (float) Math.sqrt(square / startSize - average * average); - - Collections.sort(possibleCenters, new FurthestFromAverageComparator(average)); - - float limit = Math.max(0.2f * average, stdDev); - - for (int i = 0; i < possibleCenters.size() && possibleCenters.size() > 3; i++) { - FinderPattern pattern = possibleCenters.get(i); - if (Math.abs(pattern.getEstimatedModuleSize() - average) > limit) { - possibleCenters.remove(i); - i--; - } - } - } - - if (possibleCenters.size() > 3) { - // Throw away all but those first size candidate points we found. - - float totalModuleSize = 0.0f; - for (FinderPattern possibleCenter : possibleCenters) { - totalModuleSize += possibleCenter.getEstimatedModuleSize(); - } - - float average = totalModuleSize / (float) possibleCenters.size(); - - Collections.sort(possibleCenters, new CenterComparator(average)); - - possibleCenters.subList(3, possibleCenters.size()).clear(); - } - - return new FinderPattern[]{ - possibleCenters.get(0), - possibleCenters.get(1), - possibleCenters.get(2) - }; - } - - /** - *

    Orders by furthest from average

    - */ - private static final class FurthestFromAverageComparator implements Comparator, Serializable { - private final float average; - private FurthestFromAverageComparator(float f) { - average = f; - } - @Override - public int compare(FinderPattern center1, FinderPattern center2) { - float dA = Math.abs(center2.getEstimatedModuleSize() - average); - float dB = Math.abs(center1.getEstimatedModuleSize() - average); - return dA < dB ? -1 : dA == dB ? 0 : 1; - } - } - - /** - *

    Orders by {@link FinderPattern#getCount()}, descending.

    - */ - private static final class CenterComparator implements Comparator, Serializable { - private final float average; - private CenterComparator(float f) { - average = f; - } - @Override - public int compare(FinderPattern center1, FinderPattern center2) { - if (center2.getCount() == center1.getCount()) { - float dA = Math.abs(center2.getEstimatedModuleSize() - average); - float dB = Math.abs(center1.getEstimatedModuleSize() - average); - return dA < dB ? 1 : dA == dB ? 0 : -1; - } else { - return center2.getCount() - center1.getCount(); - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternInfo.java b/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternInfo.java deleted file mode 100644 index 3c34010..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/detector/FinderPatternInfo.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2007 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.detector; - -/** - *

    Encapsulates information about finder patterns in an image, including the location of - * the three finder patterns, and their estimated module size.

    - * - * @author Sean Owen - */ -public final class FinderPatternInfo { - - private final FinderPattern bottomLeft; - private final FinderPattern topLeft; - private final FinderPattern topRight; - - public FinderPatternInfo(FinderPattern[] patternCenters) { - this.bottomLeft = patternCenters[0]; - this.topLeft = patternCenters[1]; - this.topRight = patternCenters[2]; - } - - public FinderPattern getBottomLeft() { - return bottomLeft; - } - - public FinderPattern getTopLeft() { - return topLeft; - } - - public FinderPattern getTopRight() { - return topRight; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/BlockPair.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/BlockPair.java deleted file mode 100644 index 5714d9c..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/BlockPair.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -final class BlockPair { - - private final byte[] dataBytes; - private final byte[] errorCorrectionBytes; - - BlockPair(byte[] data, byte[] errorCorrection) { - dataBytes = data; - errorCorrectionBytes = errorCorrection; - } - - public byte[] getDataBytes() { - return dataBytes; - } - - public byte[] getErrorCorrectionBytes() { - return errorCorrectionBytes; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/ByteMatrix.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/ByteMatrix.java deleted file mode 100644 index d7fef06..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/ByteMatrix.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -/** - * JAVAPORT: The original code was a 2D array of ints, but since it only ever gets assigned - * -1, 0, and 1, I'm going to use less memory and go with bytes. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class ByteMatrix { - - private final byte[][] bytes; - private final int width; - private final int height; - - public ByteMatrix(int width, int height) { - bytes = new byte[height][width]; - this.width = width; - this.height = height; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public byte get(int x, int y) { - return bytes[y][x]; - } - - /** - * @return an internal representation as bytes, in row-major order. array[y][x] represents point (x,y) - */ - public byte[][] getArray() { - return bytes; - } - - public void set(int x, int y, byte value) { - bytes[y][x] = value; - } - - public void set(int x, int y, int value) { - bytes[y][x] = (byte) value; - } - - public void set(int x, int y, boolean value) { - bytes[y][x] = (byte) (value ? 1 : 0); - } - - public void clear(byte value) { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - bytes[y][x] = value; - } - } - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(2 * width * height + 2); - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - switch (bytes[y][x]) { - case 0: - result.append(" 0"); - break; - case 1: - result.append(" 1"); - break; - default: - result.append(" "); - break; - } - } - result.append('\n'); - } - return result.toString(); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java deleted file mode 100644 index 3aaae48..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java +++ /dev/null @@ -1,578 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -import com.google.zxing.EncodeHintType; -import com.google.zxing.WriterException; -import com.google.zxing.common.BitArray; -import com.google.zxing.common.CharacterSetECI; -import com.google.zxing.common.reedsolomon.GenericGF; -import com.google.zxing.common.reedsolomon.ReedSolomonEncoder; -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import com.google.zxing.qrcode.decoder.Mode; -import com.google.zxing.qrcode.decoder.Version; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; - -/** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ -public final class Encoder { - - // The original table is defined in the table 5 of JISX0510:2004 (p.19). - private static final int[] ALPHANUMERIC_TABLE = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x00-0x0f - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x10-0x1f - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // 0x20-0x2f - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // 0x30-0x3f - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 0x40-0x4f - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // 0x50-0x5f - }; - - static final String DEFAULT_BYTE_MODE_ENCODING = "ISO-8859-1"; - - private Encoder() { - } - - // The mask penalty calculation is complicated. See Table 21 of JISX0510:2004 (p.45) for details. - // Basically it applies four rules and summate all penalties. - private static int calculateMaskPenalty(ByteMatrix matrix) { - return MaskUtil.applyMaskPenaltyRule1(matrix) - + MaskUtil.applyMaskPenaltyRule2(matrix) - + MaskUtil.applyMaskPenaltyRule3(matrix) - + MaskUtil.applyMaskPenaltyRule4(matrix); - } - - /** - * @param content text to encode - * @param ecLevel error correction level to use - * @return {@link QRCode} representing the encoded QR code - * @throws WriterException if encoding can't succeed, because of for example invalid content - * or configuration - */ - public static QRCode encode(String content, ErrorCorrectionLevel ecLevel) throws WriterException { - return encode(content, ecLevel, null); - } - - public static QRCode encode(String content, - ErrorCorrectionLevel ecLevel, - Map hints) throws WriterException { - - // Determine what character encoding has been specified by the caller, if any - String encoding = DEFAULT_BYTE_MODE_ENCODING; - if (hints != null && hints.containsKey(EncodeHintType.CHARACTER_SET)) { - encoding = hints.get(EncodeHintType.CHARACTER_SET).toString(); - } - - // Pick an encoding mode appropriate for the content. Note that this will not attempt to use - // multiple modes / segments even if that were more efficient. Twould be nice. - Mode mode = chooseMode(content, encoding); - - // This will store the header information, like mode and - // length, as well as "header" segments like an ECI segment. - BitArray headerBits = new BitArray(); - - // Append ECI segment if applicable - if (mode == Mode.BYTE && !DEFAULT_BYTE_MODE_ENCODING.equals(encoding)) { - CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding); - if (eci != null) { - appendECI(eci, headerBits); - } - } - - // (With ECI in place,) Write the mode marker - appendModeInfo(mode, headerBits); - - // Collect data within the main segment, separately, to count its size if needed. Don't add it to - // main payload yet. - BitArray dataBits = new BitArray(); - appendBytes(content, mode, dataBits, encoding); - - // Hard part: need to know version to know how many bits length takes. But need to know how many - // bits it takes to know version. First we take a guess at version by assuming version will be - // the minimum, 1: - - int provisionalBitsNeeded = headerBits.getSize() - + mode.getCharacterCountBits(Version.getVersionForNumber(1)) - + dataBits.getSize(); - Version provisionalVersion = chooseVersion(provisionalBitsNeeded, ecLevel); - - // Use that guess to calculate the right version. I am still not sure this works in 100% of cases. - - int bitsNeeded = headerBits.getSize() - + mode.getCharacterCountBits(provisionalVersion) - + dataBits.getSize(); - Version version = chooseVersion(bitsNeeded, ecLevel); - - BitArray headerAndDataBits = new BitArray(); - headerAndDataBits.appendBitArray(headerBits); - // Find "length" of main segment and write it - int numLetters = mode == Mode.BYTE ? dataBits.getSizeInBytes() : content.length(); - appendLengthInfo(numLetters, version, mode, headerAndDataBits); - // Put data together into the overall payload - headerAndDataBits.appendBitArray(dataBits); - - Version.ECBlocks ecBlocks = version.getECBlocksForLevel(ecLevel); - int numDataBytes = version.getTotalCodewords() - ecBlocks.getTotalECCodewords(); - - // Terminate the bits properly. - terminateBits(numDataBytes, headerAndDataBits); - - // Interleave data bits with error correction code. - BitArray finalBits = interleaveWithECBytes(headerAndDataBits, - version.getTotalCodewords(), - numDataBytes, - ecBlocks.getNumBlocks()); - - QRCode qrCode = new QRCode(); - - qrCode.setECLevel(ecLevel); - qrCode.setMode(mode); - qrCode.setVersion(version); - - // Choose the mask pattern and set to "qrCode". - int dimension = version.getDimensionForVersion(); - ByteMatrix matrix = new ByteMatrix(dimension, dimension); - int maskPattern = chooseMaskPattern(finalBits, ecLevel, version, matrix); - qrCode.setMaskPattern(maskPattern); - - // Build the matrix and set it to "qrCode". - MatrixUtil.buildMatrix(finalBits, ecLevel, version, maskPattern, matrix); - qrCode.setMatrix(matrix); - - return qrCode; - } - - /** - * @return the code point of the table used in alphanumeric mode or - * -1 if there is no corresponding code in the table. - */ - static int getAlphanumericCode(int code) { - if (code < ALPHANUMERIC_TABLE.length) { - return ALPHANUMERIC_TABLE[code]; - } - return -1; - } - - public static Mode chooseMode(String content) { - return chooseMode(content, null); - } - - /** - * Choose the best mode by examining the content. Note that 'encoding' is used as a hint; - * if it is Shift_JIS, and the input is only double-byte Kanji, then we return {@link Mode#KANJI}. - */ - private static Mode chooseMode(String content, String encoding) { - if ("Shift_JIS".equals(encoding) && isOnlyDoubleByteKanji(content)) { - // Choose Kanji mode if all input are double-byte characters - return Mode.KANJI; - } - boolean hasNumeric = false; - boolean hasAlphanumeric = false; - for (int i = 0; i < content.length(); ++i) { - char c = content.charAt(i); - if (c >= '0' && c <= '9') { - hasNumeric = true; - } else if (getAlphanumericCode(c) != -1) { - hasAlphanumeric = true; - } else { - return Mode.BYTE; - } - } - if (hasAlphanumeric) { - return Mode.ALPHANUMERIC; - } - if (hasNumeric) { - return Mode.NUMERIC; - } - return Mode.BYTE; - } - - private static boolean isOnlyDoubleByteKanji(String content) { - byte[] bytes; - try { - bytes = content.getBytes("Shift_JIS"); - } catch (UnsupportedEncodingException ignored) { - return false; - } - int length = bytes.length; - if (length % 2 != 0) { - return false; - } - for (int i = 0; i < length; i += 2) { - int byte1 = bytes[i] & 0xFF; - if ((byte1 < 0x81 || byte1 > 0x9F) && (byte1 < 0xE0 || byte1 > 0xEB)) { - return false; - } - } - return true; - } - - private static int chooseMaskPattern(BitArray bits, - ErrorCorrectionLevel ecLevel, - Version version, - ByteMatrix matrix) throws WriterException { - - int minPenalty = Integer.MAX_VALUE; // Lower penalty is better. - int bestMaskPattern = -1; - // We try all mask patterns to choose the best one. - for (int maskPattern = 0; maskPattern < QRCode.NUM_MASK_PATTERNS; maskPattern++) { - MatrixUtil.buildMatrix(bits, ecLevel, version, maskPattern, matrix); - int penalty = calculateMaskPenalty(matrix); - if (penalty < minPenalty) { - minPenalty = penalty; - bestMaskPattern = maskPattern; - } - } - return bestMaskPattern; - } - - private static Version chooseVersion(int numInputBits, ErrorCorrectionLevel ecLevel) throws WriterException { - // In the following comments, we use numbers of Version 7-H. - for (int versionNum = 1; versionNum <= 40; versionNum++) { - Version version = Version.getVersionForNumber(versionNum); - // numBytes = 196 - int numBytes = version.getTotalCodewords(); - // getNumECBytes = 130 - Version.ECBlocks ecBlocks = version.getECBlocksForLevel(ecLevel); - int numEcBytes = ecBlocks.getTotalECCodewords(); - // getNumDataBytes = 196 - 130 = 66 - int numDataBytes = numBytes - numEcBytes; - int totalInputBytes = (numInputBits + 7) / 8; - if (numDataBytes >= totalInputBytes) { - return version; - } - } - throw new WriterException("Data too big"); - } - - /** - * Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24). - */ - static void terminateBits(int numDataBytes, BitArray bits) throws WriterException { - int capacity = numDataBytes * 8; - if (bits.getSize() > capacity) { - throw new WriterException("data bits cannot fit in the QR Code" + bits.getSize() + " > " + - capacity); - } - for (int i = 0; i < 4 && bits.getSize() < capacity; ++i) { - bits.appendBit(false); - } - // Append termination bits. See 8.4.8 of JISX0510:2004 (p.24) for details. - // If the last byte isn't 8-bit aligned, we'll add padding bits. - int numBitsInLastByte = bits.getSize() & 0x07; - if (numBitsInLastByte > 0) { - for (int i = numBitsInLastByte; i < 8; i++) { - bits.appendBit(false); - } - } - // If we have more space, we'll fill the space with padding patterns defined in 8.4.9 (p.24). - int numPaddingBytes = numDataBytes - bits.getSizeInBytes(); - for (int i = 0; i < numPaddingBytes; ++i) { - bits.appendBits((i & 0x01) == 0 ? 0xEC : 0x11, 8); - } - if (bits.getSize() != capacity) { - throw new WriterException("Bits size does not equal capacity"); - } - } - - /** - * Get number of data bytes and number of error correction bytes for block id "blockID". Store - * the result in "numDataBytesInBlock", and "numECBytesInBlock". See table 12 in 8.5.1 of - * JISX0510:2004 (p.30) - */ - static void getNumDataBytesAndNumECBytesForBlockID(int numTotalBytes, - int numDataBytes, - int numRSBlocks, - int blockID, - int[] numDataBytesInBlock, - int[] numECBytesInBlock) throws WriterException { - if (blockID >= numRSBlocks) { - throw new WriterException("Block ID too large"); - } - // numRsBlocksInGroup2 = 196 % 5 = 1 - int numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; - // numRsBlocksInGroup1 = 5 - 1 = 4 - int numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; - // numTotalBytesInGroup1 = 196 / 5 = 39 - int numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; - // numTotalBytesInGroup2 = 39 + 1 = 40 - int numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; - // numDataBytesInGroup1 = 66 / 5 = 13 - int numDataBytesInGroup1 = numDataBytes / numRSBlocks; - // numDataBytesInGroup2 = 13 + 1 = 14 - int numDataBytesInGroup2 = numDataBytesInGroup1 + 1; - // numEcBytesInGroup1 = 39 - 13 = 26 - int numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; - // numEcBytesInGroup2 = 40 - 14 = 26 - int numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; - // Sanity checks. - // 26 = 26 - if (numEcBytesInGroup1 != numEcBytesInGroup2) { - throw new WriterException("EC bytes mismatch"); - } - // 5 = 4 + 1. - if (numRSBlocks != numRsBlocksInGroup1 + numRsBlocksInGroup2) { - throw new WriterException("RS blocks mismatch"); - } - // 196 = (13 + 26) * 4 + (14 + 26) * 1 - if (numTotalBytes != - ((numDataBytesInGroup1 + numEcBytesInGroup1) * - numRsBlocksInGroup1) + - ((numDataBytesInGroup2 + numEcBytesInGroup2) * - numRsBlocksInGroup2)) { - throw new WriterException("Total bytes mismatch"); - } - - if (blockID < numRsBlocksInGroup1) { - numDataBytesInBlock[0] = numDataBytesInGroup1; - numECBytesInBlock[0] = numEcBytesInGroup1; - } else { - numDataBytesInBlock[0] = numDataBytesInGroup2; - numECBytesInBlock[0] = numEcBytesInGroup2; - } - } - - /** - * Interleave "bits" with corresponding error correction bytes. On success, store the result in - * "result". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details. - */ - static BitArray interleaveWithECBytes(BitArray bits, - int numTotalBytes, - int numDataBytes, - int numRSBlocks) throws WriterException { - - // "bits" must have "getNumDataBytes" bytes of data. - if (bits.getSizeInBytes() != numDataBytes) { - throw new WriterException("Number of bits and data bytes does not match"); - } - - // Step 1. Divide data bytes into blocks and generate error correction bytes for them. We'll - // store the divided data bytes blocks and error correction bytes blocks into "blocks". - int dataBytesOffset = 0; - int maxNumDataBytes = 0; - int maxNumEcBytes = 0; - - // Since, we know the number of reedsolmon blocks, we can initialize the vector with the number. - Collection blocks = new ArrayList<>(numRSBlocks); - - for (int i = 0; i < numRSBlocks; ++i) { - int[] numDataBytesInBlock = new int[1]; - int[] numEcBytesInBlock = new int[1]; - getNumDataBytesAndNumECBytesForBlockID( - numTotalBytes, numDataBytes, numRSBlocks, i, - numDataBytesInBlock, numEcBytesInBlock); - - int size = numDataBytesInBlock[0]; - byte[] dataBytes = new byte[size]; - bits.toBytes(8 * dataBytesOffset, dataBytes, 0, size); - byte[] ecBytes = generateECBytes(dataBytes, numEcBytesInBlock[0]); - blocks.add(new BlockPair(dataBytes, ecBytes)); - - maxNumDataBytes = Math.max(maxNumDataBytes, size); - maxNumEcBytes = Math.max(maxNumEcBytes, ecBytes.length); - dataBytesOffset += numDataBytesInBlock[0]; - } - if (numDataBytes != dataBytesOffset) { - throw new WriterException("Data bytes does not match offset"); - } - - BitArray result = new BitArray(); - - // First, place data blocks. - for (int i = 0; i < maxNumDataBytes; ++i) { - for (BlockPair block : blocks) { - byte[] dataBytes = block.getDataBytes(); - if (i < dataBytes.length) { - result.appendBits(dataBytes[i], 8); - } - } - } - // Then, place error correction blocks. - for (int i = 0; i < maxNumEcBytes; ++i) { - for (BlockPair block : blocks) { - byte[] ecBytes = block.getErrorCorrectionBytes(); - if (i < ecBytes.length) { - result.appendBits(ecBytes[i], 8); - } - } - } - if (numTotalBytes != result.getSizeInBytes()) { // Should be same. - throw new WriterException("Interleaving error: " + numTotalBytes + " and " + - result.getSizeInBytes() + " differ."); - } - - return result; - } - - static byte[] generateECBytes(byte[] dataBytes, int numEcBytesInBlock) { - int numDataBytes = dataBytes.length; - int[] toEncode = new int[numDataBytes + numEcBytesInBlock]; - for (int i = 0; i < numDataBytes; i++) { - toEncode[i] = dataBytes[i] & 0xFF; - } - new ReedSolomonEncoder(GenericGF.QR_CODE_FIELD_256).encode(toEncode, numEcBytesInBlock); - - byte[] ecBytes = new byte[numEcBytesInBlock]; - for (int i = 0; i < numEcBytesInBlock; i++) { - ecBytes[i] = (byte) toEncode[numDataBytes + i]; - } - return ecBytes; - } - - /** - * Append mode info. On success, store the result in "bits". - */ - static void appendModeInfo(Mode mode, BitArray bits) { - bits.appendBits(mode.getBits(), 4); - } - - - /** - * Append length info. On success, store the result in "bits". - */ - static void appendLengthInfo(int numLetters, Version version, Mode mode, BitArray bits) throws WriterException { - int numBits = mode.getCharacterCountBits(version); - if (numLetters >= (1 << numBits)) { - throw new WriterException(numLetters + " is bigger than " + ((1 << numBits) - 1)); - } - bits.appendBits(numLetters, numBits); - } - - /** - * Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits". - */ - static void appendBytes(String content, - Mode mode, - BitArray bits, - String encoding) throws WriterException { - switch (mode) { - case NUMERIC: - appendNumericBytes(content, bits); - break; - case ALPHANUMERIC: - appendAlphanumericBytes(content, bits); - break; - case BYTE: - append8BitBytes(content, bits, encoding); - break; - case KANJI: - appendKanjiBytes(content, bits); - break; - default: - throw new WriterException("Invalid mode: " + mode); - } - } - - static void appendNumericBytes(CharSequence content, BitArray bits) { - int length = content.length(); - int i = 0; - while (i < length) { - int num1 = content.charAt(i) - '0'; - if (i + 2 < length) { - // Encode three numeric letters in ten bits. - int num2 = content.charAt(i + 1) - '0'; - int num3 = content.charAt(i + 2) - '0'; - bits.appendBits(num1 * 100 + num2 * 10 + num3, 10); - i += 3; - } else if (i + 1 < length) { - // Encode two numeric letters in seven bits. - int num2 = content.charAt(i + 1) - '0'; - bits.appendBits(num1 * 10 + num2, 7); - i += 2; - } else { - // Encode one numeric letter in four bits. - bits.appendBits(num1, 4); - i++; - } - } - } - - static void appendAlphanumericBytes(CharSequence content, BitArray bits) throws WriterException { - int length = content.length(); - int i = 0; - while (i < length) { - int code1 = getAlphanumericCode(content.charAt(i)); - if (code1 == -1) { - throw new WriterException(); - } - if (i + 1 < length) { - int code2 = getAlphanumericCode(content.charAt(i + 1)); - if (code2 == -1) { - throw new WriterException(); - } - // Encode two alphanumeric letters in 11 bits. - bits.appendBits(code1 * 45 + code2, 11); - i += 2; - } else { - // Encode one alphanumeric letter in six bits. - bits.appendBits(code1, 6); - i++; - } - } - } - - static void append8BitBytes(String content, BitArray bits, String encoding) - throws WriterException { - byte[] bytes; - try { - bytes = content.getBytes(encoding); - } catch (UnsupportedEncodingException uee) { - throw new WriterException(uee); - } - for (byte b : bytes) { - bits.appendBits(b, 8); - } - } - - static void appendKanjiBytes(String content, BitArray bits) throws WriterException { - byte[] bytes; - try { - bytes = content.getBytes("Shift_JIS"); - } catch (UnsupportedEncodingException uee) { - throw new WriterException(uee); - } - int length = bytes.length; - for (int i = 0; i < length; i += 2) { - int byte1 = bytes[i] & 0xFF; - int byte2 = bytes[i + 1] & 0xFF; - int code = (byte1 << 8) | byte2; - int subtracted = -1; - if (code >= 0x8140 && code <= 0x9ffc) { - subtracted = code - 0x8140; - } else if (code >= 0xe040 && code <= 0xebbf) { - subtracted = code - 0xc140; - } - if (subtracted == -1) { - throw new WriterException("Invalid byte sequence"); - } - int encoded = ((subtracted >> 8) * 0xc0) + (subtracted & 0xff); - bits.appendBits(encoded, 13); - } - } - - private static void appendECI(CharacterSetECI eci, BitArray bits) { - bits.appendBits(Mode.ECI.getBits(), 4); - // This is correct for values up to 127, which is all we need now. - bits.appendBits(eci.getValue(), 8); - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/MaskUtil.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/MaskUtil.java deleted file mode 100644 index 1c25d0a..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/MaskUtil.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -/** - * @author Satoru Takabayashi - * @author Daniel Switkin - * @author Sean Owen - */ -final class MaskUtil { - - // Penalty weights from section 6.8.2.1 - private static final int N1 = 3; - private static final int N2 = 3; - private static final int N3 = 40; - private static final int N4 = 10; - - private MaskUtil() { - // do nothing - } - - /** - * Apply mask penalty rule 1 and return the penalty. Find repetitive cells with the same color and - * give penalty to them. Example: 00000 or 11111. - */ - static int applyMaskPenaltyRule1(ByteMatrix matrix) { - return applyMaskPenaltyRule1Internal(matrix, true) + applyMaskPenaltyRule1Internal(matrix, false); - } - - /** - * Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give - * penalty to them. This is actually equivalent to the spec's rule, which is to find MxN blocks and give a - * penalty proportional to (M-1)x(N-1), because this is the number of 2x2 blocks inside such a block. - */ - static int applyMaskPenaltyRule2(ByteMatrix matrix) { - int penalty = 0; - byte[][] array = matrix.getArray(); - int width = matrix.getWidth(); - int height = matrix.getHeight(); - for (int y = 0; y < height - 1; y++) { - for (int x = 0; x < width - 1; x++) { - int value = array[y][x]; - if (value == array[y][x + 1] && value == array[y + 1][x] && value == array[y + 1][x + 1]) { - penalty++; - } - } - } - return N2 * penalty; - } - - /** - * Apply mask penalty rule 3 and return the penalty. Find consecutive runs of 1:1:3:1:1:4 - * starting with black, or 4:1:1:3:1:1 starting with white, and give penalty to them. If we - * find patterns like 000010111010000, we give penalty once. - */ - static int applyMaskPenaltyRule3(ByteMatrix matrix) { - int numPenalties = 0; - byte[][] array = matrix.getArray(); - int width = matrix.getWidth(); - int height = matrix.getHeight(); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - byte[] arrayY = array[y]; // We can at least optimize this access - if (x + 6 < width && - arrayY[x] == 1 && - arrayY[x + 1] == 0 && - arrayY[x + 2] == 1 && - arrayY[x + 3] == 1 && - arrayY[x + 4] == 1 && - arrayY[x + 5] == 0 && - arrayY[x + 6] == 1 && - (isWhiteHorizontal(arrayY, x - 4, x) || isWhiteHorizontal(arrayY, x + 7, x + 11))) { - numPenalties++; - } - if (y + 6 < height && - array[y][x] == 1 && - array[y + 1][x] == 0 && - array[y + 2][x] == 1 && - array[y + 3][x] == 1 && - array[y + 4][x] == 1 && - array[y + 5][x] == 0 && - array[y + 6][x] == 1 && - (isWhiteVertical(array, x, y - 4, y) || isWhiteVertical(array, x, y + 7, y + 11))) { - numPenalties++; - } - } - } - return numPenalties * N3; - } - - private static boolean isWhiteHorizontal(byte[] rowArray, int from, int to) { - from = Math.max(from, 0); - to = Math.min(to, rowArray.length); - for (int i = from; i < to; i++) { - if (rowArray[i] == 1) { - return false; - } - } - return true; - } - - private static boolean isWhiteVertical(byte[][] array, int col, int from, int to) { - from = Math.max(from, 0); - to = Math.min(to, array.length); - for (int i = from; i < to; i++) { - if (array[i][col] == 1) { - return false; - } - } - return true; - } - - /** - * Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give - * penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. - */ - static int applyMaskPenaltyRule4(ByteMatrix matrix) { - int numDarkCells = 0; - byte[][] array = matrix.getArray(); - int width = matrix.getWidth(); - int height = matrix.getHeight(); - for (int y = 0; y < height; y++) { - byte[] arrayY = array[y]; - for (int x = 0; x < width; x++) { - if (arrayY[x] == 1) { - numDarkCells++; - } - } - } - int numTotalCells = matrix.getHeight() * matrix.getWidth(); - int fivePercentVariances = Math.abs(numDarkCells * 2 - numTotalCells) * 10 / numTotalCells; - return fivePercentVariances * N4; - } - - /** - * Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask - * pattern conditions. - */ - static boolean getDataMaskBit(int maskPattern, int x, int y) { - int intermediate; - int temp; - switch (maskPattern) { - case 0: - intermediate = (y + x) & 0x1; - break; - case 1: - intermediate = y & 0x1; - break; - case 2: - intermediate = x % 3; - break; - case 3: - intermediate = (y + x) % 3; - break; - case 4: - intermediate = ((y / 2) + (x / 3)) & 0x1; - break; - case 5: - temp = y * x; - intermediate = (temp & 0x1) + (temp % 3); - break; - case 6: - temp = y * x; - intermediate = ((temp & 0x1) + (temp % 3)) & 0x1; - break; - case 7: - temp = y * x; - intermediate = ((temp % 3) + ((y + x) & 0x1)) & 0x1; - break; - default: - throw new IllegalArgumentException("Invalid mask pattern: " + maskPattern); - } - return intermediate == 0; - } - - /** - * Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both - * vertical and horizontal orders respectively. - */ - private static int applyMaskPenaltyRule1Internal(ByteMatrix matrix, boolean isHorizontal) { - int penalty = 0; - int iLimit = isHorizontal ? matrix.getHeight() : matrix.getWidth(); - int jLimit = isHorizontal ? matrix.getWidth() : matrix.getHeight(); - byte[][] array = matrix.getArray(); - for (int i = 0; i < iLimit; i++) { - int numSameBitCells = 0; - int prevBit = -1; - for (int j = 0; j < jLimit; j++) { - int bit = isHorizontal ? array[i][j] : array[j][i]; - if (bit == prevBit) { - numSameBitCells++; - } else { - if (numSameBitCells >= 5) { - penalty += N1 + (numSameBitCells - 5); - } - numSameBitCells = 1; // Include the cell itself. - prevBit = bit; - } - } - if (numSameBitCells >= 5) { - penalty += N1 + (numSameBitCells - 5); - } - } - return penalty; - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/MatrixUtil.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/MatrixUtil.java deleted file mode 100644 index 9e2345e..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/MatrixUtil.java +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -import com.google.zxing.WriterException; -import com.google.zxing.common.BitArray; -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import com.google.zxing.qrcode.decoder.Version; - -/** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ -final class MatrixUtil { - - private MatrixUtil() { - // do nothing - } - - private static final int[][] POSITION_DETECTION_PATTERN = { - {1, 1, 1, 1, 1, 1, 1}, - {1, 0, 0, 0, 0, 0, 1}, - {1, 0, 1, 1, 1, 0, 1}, - {1, 0, 1, 1, 1, 0, 1}, - {1, 0, 1, 1, 1, 0, 1}, - {1, 0, 0, 0, 0, 0, 1}, - {1, 1, 1, 1, 1, 1, 1}, - }; - - private static final int[][] POSITION_ADJUSTMENT_PATTERN = { - {1, 1, 1, 1, 1}, - {1, 0, 0, 0, 1}, - {1, 0, 1, 0, 1}, - {1, 0, 0, 0, 1}, - {1, 1, 1, 1, 1}, - }; - - // From Appendix E. Table 1, JIS0510X:2004 (p 71). The table was double-checked by komatsu. - private static final int[][] POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE = { - {-1, -1, -1, -1, -1, -1, -1}, // Version 1 - { 6, 18, -1, -1, -1, -1, -1}, // Version 2 - { 6, 22, -1, -1, -1, -1, -1}, // Version 3 - { 6, 26, -1, -1, -1, -1, -1}, // Version 4 - { 6, 30, -1, -1, -1, -1, -1}, // Version 5 - { 6, 34, -1, -1, -1, -1, -1}, // Version 6 - { 6, 22, 38, -1, -1, -1, -1}, // Version 7 - { 6, 24, 42, -1, -1, -1, -1}, // Version 8 - { 6, 26, 46, -1, -1, -1, -1}, // Version 9 - { 6, 28, 50, -1, -1, -1, -1}, // Version 10 - { 6, 30, 54, -1, -1, -1, -1}, // Version 11 - { 6, 32, 58, -1, -1, -1, -1}, // Version 12 - { 6, 34, 62, -1, -1, -1, -1}, // Version 13 - { 6, 26, 46, 66, -1, -1, -1}, // Version 14 - { 6, 26, 48, 70, -1, -1, -1}, // Version 15 - { 6, 26, 50, 74, -1, -1, -1}, // Version 16 - { 6, 30, 54, 78, -1, -1, -1}, // Version 17 - { 6, 30, 56, 82, -1, -1, -1}, // Version 18 - { 6, 30, 58, 86, -1, -1, -1}, // Version 19 - { 6, 34, 62, 90, -1, -1, -1}, // Version 20 - { 6, 28, 50, 72, 94, -1, -1}, // Version 21 - { 6, 26, 50, 74, 98, -1, -1}, // Version 22 - { 6, 30, 54, 78, 102, -1, -1}, // Version 23 - { 6, 28, 54, 80, 106, -1, -1}, // Version 24 - { 6, 32, 58, 84, 110, -1, -1}, // Version 25 - { 6, 30, 58, 86, 114, -1, -1}, // Version 26 - { 6, 34, 62, 90, 118, -1, -1}, // Version 27 - { 6, 26, 50, 74, 98, 122, -1}, // Version 28 - { 6, 30, 54, 78, 102, 126, -1}, // Version 29 - { 6, 26, 52, 78, 104, 130, -1}, // Version 30 - { 6, 30, 56, 82, 108, 134, -1}, // Version 31 - { 6, 34, 60, 86, 112, 138, -1}, // Version 32 - { 6, 30, 58, 86, 114, 142, -1}, // Version 33 - { 6, 34, 62, 90, 118, 146, -1}, // Version 34 - { 6, 30, 54, 78, 102, 126, 150}, // Version 35 - { 6, 24, 50, 76, 102, 128, 154}, // Version 36 - { 6, 28, 54, 80, 106, 132, 158}, // Version 37 - { 6, 32, 58, 84, 110, 136, 162}, // Version 38 - { 6, 26, 54, 82, 110, 138, 166}, // Version 39 - { 6, 30, 58, 86, 114, 142, 170}, // Version 40 - }; - - // Type info cells at the left top corner. - private static final int[][] TYPE_INFO_COORDINATES = { - {8, 0}, - {8, 1}, - {8, 2}, - {8, 3}, - {8, 4}, - {8, 5}, - {8, 7}, - {8, 8}, - {7, 8}, - {5, 8}, - {4, 8}, - {3, 8}, - {2, 8}, - {1, 8}, - {0, 8}, - }; - - // From Appendix D in JISX0510:2004 (p. 67) - private static final int VERSION_INFO_POLY = 0x1f25; // 1 1111 0010 0101 - - // From Appendix C in JISX0510:2004 (p.65). - private static final int TYPE_INFO_POLY = 0x537; - private static final int TYPE_INFO_MASK_PATTERN = 0x5412; - - // Set all cells to -1. -1 means that the cell is empty (not set yet). - // - // JAVAPORT: We shouldn't need to do this at all. The code should be rewritten to begin encoding - // with the ByteMatrix initialized all to zero. - static void clearMatrix(ByteMatrix matrix) { - matrix.clear((byte) -1); - } - - // Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On - // success, store the result in "matrix" and return true. - static void buildMatrix(BitArray dataBits, - ErrorCorrectionLevel ecLevel, - Version version, - int maskPattern, - ByteMatrix matrix) throws WriterException { - clearMatrix(matrix); - embedBasicPatterns(version, matrix); - // Type information appear with any version. - embedTypeInfo(ecLevel, maskPattern, matrix); - // Version info appear if version >= 7. - maybeEmbedVersionInfo(version, matrix); - // Data should be embedded at end. - embedDataBits(dataBits, maskPattern, matrix); - } - - // Embed basic patterns. On success, modify the matrix and return true. - // The basic patterns are: - // - Position detection patterns - // - Timing patterns - // - Dark dot at the left bottom corner - // - Position adjustment patterns, if need be - static void embedBasicPatterns(Version version, ByteMatrix matrix) throws WriterException { - // Let's get started with embedding big squares at corners. - embedPositionDetectionPatternsAndSeparators(matrix); - // Then, embed the dark dot at the left bottom corner. - embedDarkDotAtLeftBottomCorner(matrix); - - // Position adjustment patterns appear if version >= 2. - maybeEmbedPositionAdjustmentPatterns(version, matrix); - // Timing patterns should be embedded after position adj. patterns. - embedTimingPatterns(matrix); - } - - // Embed type information. On success, modify the matrix. - static void embedTypeInfo(ErrorCorrectionLevel ecLevel, int maskPattern, ByteMatrix matrix) - throws WriterException { - BitArray typeInfoBits = new BitArray(); - makeTypeInfoBits(ecLevel, maskPattern, typeInfoBits); - - for (int i = 0; i < typeInfoBits.getSize(); ++i) { - // Place bits in LSB to MSB order. LSB (least significant bit) is the last value in - // "typeInfoBits". - boolean bit = typeInfoBits.get(typeInfoBits.getSize() - 1 - i); - - // Type info bits at the left top corner. See 8.9 of JISX0510:2004 (p.46). - int x1 = TYPE_INFO_COORDINATES[i][0]; - int y1 = TYPE_INFO_COORDINATES[i][1]; - matrix.set(x1, y1, bit); - - if (i < 8) { - // Right top corner. - int x2 = matrix.getWidth() - i - 1; - int y2 = 8; - matrix.set(x2, y2, bit); - } else { - // Left bottom corner. - int x2 = 8; - int y2 = matrix.getHeight() - 7 + (i - 8); - matrix.set(x2, y2, bit); - } - } - } - - // Embed version information if need be. On success, modify the matrix and return true. - // See 8.10 of JISX0510:2004 (p.47) for how to embed version information. - static void maybeEmbedVersionInfo(Version version, ByteMatrix matrix) throws WriterException { - if (version.getVersionNumber() < 7) { // Version info is necessary if version >= 7. - return; // Don't need version info. - } - BitArray versionInfoBits = new BitArray(); - makeVersionInfoBits(version, versionInfoBits); - - int bitIndex = 6 * 3 - 1; // It will decrease from 17 to 0. - for (int i = 0; i < 6; ++i) { - for (int j = 0; j < 3; ++j) { - // Place bits in LSB (least significant bit) to MSB order. - boolean bit = versionInfoBits.get(bitIndex); - bitIndex--; - // Left bottom corner. - matrix.set(i, matrix.getHeight() - 11 + j, bit); - // Right bottom corner. - matrix.set(matrix.getHeight() - 11 + j, i, bit); - } - } - } - - // Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. - // For debugging purposes, it skips masking process if "getMaskPattern" is -1. - // See 8.7 of JISX0510:2004 (p.38) for how to embed data bits. - static void embedDataBits(BitArray dataBits, int maskPattern, ByteMatrix matrix) - throws WriterException { - int bitIndex = 0; - int direction = -1; - // Start from the right bottom cell. - int x = matrix.getWidth() - 1; - int y = matrix.getHeight() - 1; - while (x > 0) { - // Skip the vertical timing pattern. - if (x == 6) { - x -= 1; - } - while (y >= 0 && y < matrix.getHeight()) { - for (int i = 0; i < 2; ++i) { - int xx = x - i; - // Skip the cell if it's not empty. - if (!isEmpty(matrix.get(xx, y))) { - continue; - } - boolean bit; - if (bitIndex < dataBits.getSize()) { - bit = dataBits.get(bitIndex); - ++bitIndex; - } else { - // Padding bit. If there is no bit left, we'll fill the left cells with 0, as described - // in 8.4.9 of JISX0510:2004 (p. 24). - bit = false; - } - - // Skip masking if mask_pattern is -1. - if (maskPattern != -1 && MaskUtil.getDataMaskBit(maskPattern, xx, y)) { - bit = !bit; - } - matrix.set(xx, y, bit); - } - y += direction; - } - direction = -direction; // Reverse the direction. - y += direction; - x -= 2; // Move to the left. - } - // All bits should be consumed. - if (bitIndex != dataBits.getSize()) { - throw new WriterException("Not all bits consumed: " + bitIndex + '/' + dataBits.getSize()); - } - } - - // Return the position of the most significant bit set (to one) in the "value". The most - // significant bit is position 32. If there is no bit set, return 0. Examples: - // - findMSBSet(0) => 0 - // - findMSBSet(1) => 1 - // - findMSBSet(255) => 8 - static int findMSBSet(int value) { - return 32 - Integer.numberOfLeadingZeros(value); - } - - // Calculate BCH (Bose-Chaudhuri-Hocquenghem) code for "value" using polynomial "poly". The BCH - // code is used for encoding type information and version information. - // Example: Calculation of version information of 7. - // f(x) is created from 7. - // - 7 = 000111 in 6 bits - // - f(x) = x^2 + x^1 + x^0 - // g(x) is given by the standard (p. 67) - // - g(x) = x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1 - // Multiply f(x) by x^(18 - 6) - // - f'(x) = f(x) * x^(18 - 6) - // - f'(x) = x^14 + x^13 + x^12 - // Calculate the remainder of f'(x) / g(x) - // x^2 - // __________________________________________________ - // g(x) )x^14 + x^13 + x^12 - // x^14 + x^13 + x^12 + x^11 + x^10 + x^7 + x^4 + x^2 - // -------------------------------------------------- - // x^11 + x^10 + x^7 + x^4 + x^2 - // - // The remainder is x^11 + x^10 + x^7 + x^4 + x^2 - // Encode it in binary: 110010010100 - // The return value is 0xc94 (1100 1001 0100) - // - // Since all coefficients in the polynomials are 1 or 0, we can do the calculation by bit - // operations. We don't care if cofficients are positive or negative. - static int calculateBCHCode(int value, int poly) { - if (poly == 0) { - throw new IllegalArgumentException("0 polynomial"); - } - // If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1 - // from 13 to make it 12. - int msbSetInPoly = findMSBSet(poly); - value <<= msbSetInPoly - 1; - // Do the division business using exclusive-or operations. - while (findMSBSet(value) >= msbSetInPoly) { - value ^= poly << (findMSBSet(value) - msbSetInPoly); - } - // Now the "value" is the remainder (i.e. the BCH code) - return value; - } - - // Make bit vector of type information. On success, store the result in "bits" and return true. - // Encode error correction level and mask pattern. See 8.9 of - // JISX0510:2004 (p.45) for details. - static void makeTypeInfoBits(ErrorCorrectionLevel ecLevel, int maskPattern, BitArray bits) - throws WriterException { - if (!QRCode.isValidMaskPattern(maskPattern)) { - throw new WriterException("Invalid mask pattern"); - } - int typeInfo = (ecLevel.getBits() << 3) | maskPattern; - bits.appendBits(typeInfo, 5); - - int bchCode = calculateBCHCode(typeInfo, TYPE_INFO_POLY); - bits.appendBits(bchCode, 10); - - BitArray maskBits = new BitArray(); - maskBits.appendBits(TYPE_INFO_MASK_PATTERN, 15); - bits.xor(maskBits); - - if (bits.getSize() != 15) { // Just in case. - throw new WriterException("should not happen but we got: " + bits.getSize()); - } - } - - // Make bit vector of version information. On success, store the result in "bits" and return true. - // See 8.10 of JISX0510:2004 (p.45) for details. - static void makeVersionInfoBits(Version version, BitArray bits) throws WriterException { - bits.appendBits(version.getVersionNumber(), 6); - int bchCode = calculateBCHCode(version.getVersionNumber(), VERSION_INFO_POLY); - bits.appendBits(bchCode, 12); - - if (bits.getSize() != 18) { // Just in case. - throw new WriterException("should not happen but we got: " + bits.getSize()); - } - } - - // Check if "value" is empty. - private static boolean isEmpty(int value) { - return value == -1; - } - - private static void embedTimingPatterns(ByteMatrix matrix) { - // -8 is for skipping position detection patterns (size 7), and two horizontal/vertical - // separation patterns (size 1). Thus, 8 = 7 + 1. - for (int i = 8; i < matrix.getWidth() - 8; ++i) { - int bit = (i + 1) % 2; - // Horizontal line. - if (isEmpty(matrix.get(i, 6))) { - matrix.set(i, 6, bit); - } - // Vertical line. - if (isEmpty(matrix.get(6, i))) { - matrix.set(6, i, bit); - } - } - } - - // Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46) - private static void embedDarkDotAtLeftBottomCorner(ByteMatrix matrix) throws WriterException { - if (matrix.get(8, matrix.getHeight() - 8) == 0) { - throw new WriterException(); - } - matrix.set(8, matrix.getHeight() - 8, 1); - } - - private static void embedHorizontalSeparationPattern(int xStart, - int yStart, - ByteMatrix matrix) throws WriterException { - for (int x = 0; x < 8; ++x) { - if (!isEmpty(matrix.get(xStart + x, yStart))) { - throw new WriterException(); - } - matrix.set(xStart + x, yStart, 0); - } - } - - private static void embedVerticalSeparationPattern(int xStart, - int yStart, - ByteMatrix matrix) throws WriterException { - for (int y = 0; y < 7; ++y) { - if (!isEmpty(matrix.get(xStart, yStart + y))) { - throw new WriterException(); - } - matrix.set(xStart, yStart + y, 0); - } - } - - // Note that we cannot unify the function with embedPositionDetectionPattern() despite they are - // almost identical, since we cannot write a function that takes 2D arrays in different sizes in - // C/C++. We should live with the fact. - private static void embedPositionAdjustmentPattern(int xStart, int yStart, ByteMatrix matrix) { - for (int y = 0; y < 5; ++y) { - for (int x = 0; x < 5; ++x) { - matrix.set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]); - } - } - } - - private static void embedPositionDetectionPattern(int xStart, int yStart, ByteMatrix matrix) { - for (int y = 0; y < 7; ++y) { - for (int x = 0; x < 7; ++x) { - matrix.set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]); - } - } - } - - // Embed position detection patterns and surrounding vertical/horizontal separators. - private static void embedPositionDetectionPatternsAndSeparators(ByteMatrix matrix) throws WriterException { - // Embed three big squares at corners. - int pdpWidth = POSITION_DETECTION_PATTERN[0].length; - // Left top corner. - embedPositionDetectionPattern(0, 0, matrix); - // Right top corner. - embedPositionDetectionPattern(matrix.getWidth() - pdpWidth, 0, matrix); - // Left bottom corner. - embedPositionDetectionPattern(0, matrix.getWidth() - pdpWidth, matrix); - - // Embed horizontal separation patterns around the squares. - int hspWidth = 8; - // Left top corner. - embedHorizontalSeparationPattern(0, hspWidth - 1, matrix); - // Right top corner. - embedHorizontalSeparationPattern(matrix.getWidth() - hspWidth, - hspWidth - 1, matrix); - // Left bottom corner. - embedHorizontalSeparationPattern(0, matrix.getWidth() - hspWidth, matrix); - - // Embed vertical separation patterns around the squares. - int vspSize = 7; - // Left top corner. - embedVerticalSeparationPattern(vspSize, 0, matrix); - // Right top corner. - embedVerticalSeparationPattern(matrix.getHeight() - vspSize - 1, 0, matrix); - // Left bottom corner. - embedVerticalSeparationPattern(vspSize, matrix.getHeight() - vspSize, - matrix); - } - - // Embed position adjustment patterns if need be. - private static void maybeEmbedPositionAdjustmentPatterns(Version version, ByteMatrix matrix) { - if (version.getVersionNumber() < 2) { // The patterns appear if version >= 2 - return; - } - int index = version.getVersionNumber() - 1; - int[] coordinates = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index]; - int numCoordinates = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index].length; - for (int i = 0; i < numCoordinates; ++i) { - for (int j = 0; j < numCoordinates; ++j) { - int y = coordinates[i]; - int x = coordinates[j]; - if (x == -1 || y == -1) { - continue; - } - // If the cell is unset, we embed the position adjustment pattern here. - if (isEmpty(matrix.get(x, y))) { - // -2 is necessary since the x/y coordinates point to the center of the pattern, not the - // left top corner. - embedPositionAdjustmentPattern(x - 2, y - 2, matrix); - } - } - } - } - -} diff --git a/zxing/src/main/java/com/google/zxing/qrcode/encoder/QRCode.java b/zxing/src/main/java/com/google/zxing/qrcode/encoder/QRCode.java deleted file mode 100644 index b560de9..0000000 --- a/zxing/src/main/java/com/google/zxing/qrcode/encoder/QRCode.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.zxing.qrcode.encoder; - -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import com.google.zxing.qrcode.decoder.Mode; -import com.google.zxing.qrcode.decoder.Version; - -/** - * @author satorux@google.com (Satoru Takabayashi) - creator - * @author dswitkin@google.com (Daniel Switkin) - ported from C++ - */ -public final class QRCode { - - public static final int NUM_MASK_PATTERNS = 8; - - private Mode mode; - private ErrorCorrectionLevel ecLevel; - private Version version; - private int maskPattern; - private ByteMatrix matrix; - - public QRCode() { - maskPattern = -1; - } - - public Mode getMode() { - return mode; - } - - public ErrorCorrectionLevel getECLevel() { - return ecLevel; - } - - public Version getVersion() { - return version; - } - - public int getMaskPattern() { - return maskPattern; - } - - public ByteMatrix getMatrix() { - return matrix; - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(200); - result.append("<<\n"); - result.append(" mode: "); - result.append(mode); - result.append("\n ecLevel: "); - result.append(ecLevel); - result.append("\n version: "); - result.append(version); - result.append("\n maskPattern: "); - result.append(maskPattern); - if (matrix == null) { - result.append("\n matrix: null\n"); - } else { - result.append("\n matrix:\n"); - result.append(matrix); - } - result.append(">>\n"); - return result.toString(); - } - - public void setMode(Mode value) { - mode = value; - } - - public void setECLevel(ErrorCorrectionLevel value) { - ecLevel = value; - } - - public void setVersion(Version version) { - this.version = version; - } - - public void setMaskPattern(int value) { - maskPattern = value; - } - - public void setMatrix(ByteMatrix value) { - matrix = value; - } - - // Check if "mask_pattern" is valid. - public static boolean isValidMaskPattern(int maskPattern) { - return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS; - } - -} diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerView.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerView.java index 7d2be20..0bc68a8 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerView.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerView.java @@ -14,8 +14,10 @@ import com.google.zxing.ResultPoint; import com.mylhyl.zxing.scanner.camera.CameraManager; import com.mylhyl.zxing.scanner.common.Scanner; +import com.mylhyl.zxing.scanner.decode.DecodeFormatManager; import java.io.IOException; +import java.util.Collection; /** * Created by hupei on 2016/7/1. @@ -36,6 +38,7 @@ public class ScannerView extends FrameLayout implements SurfaceHolder.Callback { private int laserFrameWidth, laserFrameHeight;//扫描框大小 private int laserFrameTopMargin;//扫描框离屏幕上方距离 + private Collection decodeFormats;//解码类型 public ScannerView(Context context) { this(context, null); @@ -60,6 +63,9 @@ private void init(Context context, AttributeSet attrs, int defStyle) { mViewfinderView = new ViewfinderView(context, attrs); addView(mViewfinderView, new LayoutParams(LayoutParams.MATCH_PARENT , LayoutParams.MATCH_PARENT)); + + //默认解码二维 + setScanMode(Scanner.ScanMode.QR_CODE_MODE); } public void onResume() { @@ -106,8 +112,7 @@ private void initCamera(SurfaceHolder surfaceHolder) { // Creating the mScannerViewHandler starts the preview, which can also throw a // RuntimeException. if (mScannerViewHandler == null) { - mScannerViewHandler = new ScannerViewHandler(this, null, - null, null, mCameraManager); + mScannerViewHandler = new ScannerViewHandler(this, decodeFormats, mCameraManager); } //设置扫描框大小 if (laserFrameWidth > 0 && laserFrameHeight > 0) @@ -393,6 +398,28 @@ public ScannerView setLaserFrameTopMargin(int laserFrameTopMargin) { return this; } + /** + * 设置扫描解码类型(二维码、一维码、商品条码) + * + * @param scanMode {@linkplain Scanner.ScanMode mode} + * @return + */ + public ScannerView setScanMode(String scanMode) { + decodeFormats = DecodeFormatManager.parseDecodeFormats(scanMode); + return this; + } + + /** + * 设置扫描解码类型 + * + * @param barcodeFormat + * @return + */ + public ScannerView setScanMode(BarcodeFormat... barcodeFormat) { + decodeFormats = DecodeFormatManager.parseDecodeFormats(barcodeFormat); + return this; + } + /** * 重新扫描,支持延时 * diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerViewHandler.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerViewHandler.java index dd96241..22ce8d2 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerViewHandler.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/ScannerViewHandler.java @@ -23,15 +23,12 @@ import android.os.Message; import com.google.zxing.BarcodeFormat; -import com.google.zxing.DecodeHintType; import com.google.zxing.Result; import com.mylhyl.zxing.scanner.camera.CameraManager; -import com.mylhyl.zxing.scanner.common.Intents; import com.mylhyl.zxing.scanner.common.Scanner; import com.mylhyl.zxing.scanner.decode.DecodeThread; import java.util.Collection; -import java.util.Map; /** * 针对扫描任务的Handler,可接收的message有启动扫描(restart_preview)、扫描成功(decode_succeeded)、扫描失败(decode_failed)等等 @@ -51,16 +48,13 @@ private enum State { PREVIEW, SUCCESS, DONE } - ScannerViewHandler(ScannerView scannerView, - Collection decodeFormats, - Map baseHints, String characterSet, + ScannerViewHandler(ScannerView scannerView, Collection decodeFormats, CameraManager cameraManager) { this.scannerView = scannerView; this.cameraManager = cameraManager; //启动扫描线程 - decodeThread = new DecodeThread(cameraManager, this, decodeFormats, baseHints, - characterSet, new ViewfinderResultPointCallback( - scannerView.getViewfinderView())); + decodeThread = new DecodeThread(cameraManager, this, decodeFormats, + new ViewfinderResultPointCallback(scannerView.getViewfinderView())); decodeThread.start(); state = State.SUCCESS; //开启相机预览界面 diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraConfigurationManager.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraConfigurationManager.java index 8ce0910..7a75092 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraConfigurationManager.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraConfigurationManager.java @@ -40,12 +40,12 @@ final class CameraConfigurationManager { private static final int FRONT_LIGHT_MODE_ON = 0; private static final int FRONT_LIGHT_MODE_OFF = 1; private final Context context; - private int cwNeededRotation; +// private int cwNeededRotation; private int cwRotationFromDisplayToCamera; private Point screenResolution; private Point cameraResolution; private Point bestPreviewSize; - private Point previewSizeOnScreen; +// private Point previewSizeOnScreen; CameraConfigurationManager(Context context) { this.context = context; @@ -93,11 +93,11 @@ void initFromCameraParameters(OpenCamera camera) { cwRotationFromDisplayToCamera = (360 + cwRotationFromNaturalToCamera - cwRotationFromNaturalToDisplay) % 360; - if (camera.getFacing() == CameraFacing.FRONT) { - cwNeededRotation = (360 - cwRotationFromDisplayToCamera) % 360; - } else { - cwNeededRotation = cwRotationFromDisplayToCamera; - } +// if (camera.getFacing() == CameraFacing.FRONT) { +// cwNeededRotation = (360 - cwRotationFromDisplayToCamera) % 360; +// } else { +// cwNeededRotation = cwRotationFromDisplayToCamera; +// } Point theScreenResolution = new Point(); display.getSize(theScreenResolution); @@ -107,14 +107,14 @@ void initFromCameraParameters(OpenCamera camera) { bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue( parameters, screenResolution); - boolean isScreenPortrait = screenResolution.x < screenResolution.y; - boolean isPreviewSizePortrait = bestPreviewSize.x < bestPreviewSize.y; +// boolean isScreenPortrait = screenResolution.x < screenResolution.y; +// boolean isPreviewSizePortrait = bestPreviewSize.x < bestPreviewSize.y; - if (isScreenPortrait == isPreviewSizePortrait) { - previewSizeOnScreen = bestPreviewSize; - } else { - previewSizeOnScreen = new Point(bestPreviewSize.y, bestPreviewSize.x); - } +// if (isScreenPortrait == isPreviewSizePortrait) { +// previewSizeOnScreen = bestPreviewSize; +// } else { +// previewSizeOnScreen = new Point(bestPreviewSize.y, bestPreviewSize.x); +// } } /** diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraManager.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraManager.java index 8c16e98..23dc343 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraManager.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/camera/CameraManager.java @@ -249,15 +249,15 @@ public synchronized Rect getFramingRect() { } int statusBarHeight = getStatusBarHeight();//状态栏高度 int leftOffset = (screenResolution.x - width) / 2; - int topOffset = (screenResolution.y - height) / 2 - statusBarHeight; + int topOffset = (screenResolution.y - height) / 2 ; if (laserFrameTopMargin == 0) - laserFrameTopMargin = topOffset; + laserFrameTopMargin = topOffset - statusBarHeight; else { laserFrameTopMargin += statusBarHeight; } framingRect = new Rect(leftOffset, laserFrameTopMargin, leftOffset + width, laserFrameTopMargin + height); - // Log.d(TAG, "Calculated framing rect: " + framingRect); + Log.d(TAG, "Calculated framing rect: " + framingRect); } return framingRect; } diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Intents.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Intents.java deleted file mode 100644 index c4d99fe..0000000 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Intents.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (C) 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.mylhyl.zxing.scanner.common; - -/** - * This class provides the constants to use when sending an Intent to Barcode Scanner. - * These strings are effectively API and cannot be changed. - * - * @author dswitkin@google.com (Daniel Switkin) - */ -public final class Intents { - private Intents() { - } - - /** - * Constants related to the {@link Scan#ACTION} Intent. - */ - public static final class Scan { - /** - * Send this intent to open the Barcodes app in scanning mode, find a barcode, and return - * the results. - */ - public static final String ACTION = "com.mylhyl.zxing.scanner.client.android.SCAN"; - - /** - * By default, sending this will decode all barcodes that we understand. However it - * may be useful to limit scanning to certain formats. Use - * {@link android.content.Intent#putExtra(String, String)} with one of the values below. - *

    - * Setting this is effectively shorthand for setting explicit formats with {@link #FORMATS}. - * It is overridden by that setting. - */ - public static final String MODE = "SCAN_MODE"; - - /** - * Decode only UPC and EAN barcodes. This is the right choice for shopping apps which get - * prices, reviews, etc. for products. - */ - public static final String PRODUCT_MODE = "PRODUCT_MODE"; - - /** - * Decode only 1D barcodes. - */ - public static final String ONE_D_MODE = "ONE_D_MODE"; - - /** - * Decode only QR codes. - */ - public static final String QR_CODE_MODE = "QR_CODE_MODE"; - - /** - * Decode only Data Matrix codes. - */ - public static final String DATA_MATRIX_MODE = "DATA_MATRIX_MODE"; - - /** - * Decode only Aztec. - */ - public static final String AZTEC_MODE = "AZTEC_MODE"; - - /** - * Decode only PDF417. - */ - public static final String PDF417_MODE = "PDF417_MODE"; - - /** - * Comma-separated list of formats to scan for. The values must match the names of - * {@link com.google.zxing.BarcodeFormat}s, e.g. {@link com.google.zxing.BarcodeFormat#EAN_13}. - * Example: "EAN_13,EAN_8,QR_CODE". This overrides {@link #MODE}. - */ - public static final String FORMATS = "SCAN_FORMATS"; - - /** - * Optional parameter to specify the id of the camera from which to recognize barcodes. - * Overrides the default camera that would otherwise would have been selected. - * If provided, should be an int. - */ -// public static final String CAMERA_ID = "SCAN_CAMERA_ID"; - - /** - * @see com.google.zxing.DecodeHintType#CHARACTER_SET - */ -// public static final String CHARACTER_SET = "CHARACTER_SET"; - - /** - * Optional parameters to specify the width and height of the scanning rectangle in pixels. - * The app will try to honor these, but will clamp them to the size of the preview frame. - * You should specify both or neither, and pass the size as an int. - */ -// public static final String WIDTH = "SCAN_WIDTH"; -// public static final String HEIGHT = "SCAN_HEIGHT"; - - /** - * Desired duration in milliseconds for which to pause after a successful scan before - * returning to the calling intent. Specified as a long, not an integer! - * For example: 1000L, not 1000. - */ -// public static final String RESULT_DISPLAY_DURATION_MS = "RESULT_DISPLAY_DURATION_MS"; - - /** - * Prompt to show on-screen when scanning by intent. Specified as a {@link String}. - */ -// public static final String PROMPT_MESSAGE = "PROMPT_MESSAGE"; - - /** - * If a barcode is found, Barcodes returns {@link android.app.Activity#RESULT_OK} to - * {@link android.app.Activity#onActivityResult(int, int, android.content.Intent)} - * of the app which requested the scan via - * {@link android.app.Activity#startActivityForResult(android.content.Intent, int)} - * The barcodes contents can be retrieved with - * {@link android.content.Intent#getStringExtra(String)}. - * If the user presses Back, the result code will be {@link android.app.Activity#RESULT_CANCELED}. - */ - public static final String RESULT = "SCAN_RESULT"; - - /** - * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_FORMAT} - * to determine which barcode format was found. - * See {@link com.google.zxing.BarcodeFormat} for possible values. - */ - public static final String RESULT_FORMAT = "SCAN_RESULT_FORMAT"; - - /** - * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_UPC_EAN_EXTENSION} - * to return the content of any UPC extension barcode that was also found. Only applicable - * to {@link com.google.zxing.BarcodeFormat#UPC_A} and {@link com.google.zxing.BarcodeFormat#EAN_13} - * formats. - */ -// public static final String RESULT_UPC_EAN_EXTENSION = "SCAN_RESULT_UPC_EAN_EXTENSION"; - - /** - * Call {@link android.content.Intent#getByteArrayExtra(String)} with {@link #RESULT_BYTES} - * to get a {@code byte[]} of raw bytes in the barcode, if available. - */ -// public static final String RESULT_BYTES = "SCAN_RESULT_BYTES"; - - /** - * Key for the value of {@link com.google.zxing.ResultMetadataType#ORIENTATION}, if available. - * Call {@link android.content.Intent#getIntArrayExtra(String)} with {@link #RESULT_ORIENTATION}. - */ -// public static final String RESULT_ORIENTATION = "SCAN_RESULT_ORIENTATION"; - - /** - * Key for the value of {@link com.google.zxing.ResultMetadataType#ERROR_CORRECTION_LEVEL}, if available. - * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_ERROR_CORRECTION_LEVEL}. - */ -// public static final String RESULT_ERROR_CORRECTION_LEVEL = "SCAN_RESULT_ERROR_CORRECTION_LEVEL"; - - /** - * Prefix for keys that map to the values of {@link com.google.zxing.ResultMetadataType#BYTE_SEGMENTS}, - * if available. The actual values will be set under a series of keys formed by adding 0, 1, 2, ... - * to this prefix. So the first byte segment is under key "SCAN_RESULT_BYTE_SEGMENTS_0" for example. - * Call {@link android.content.Intent#getByteArrayExtra(String)} with these keys. - */ -// public static final String RESULT_BYTE_SEGMENTS_PREFIX = "SCAN_RESULT_BYTE_SEGMENTS_"; - - private Scan() { - } - } -} diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Scanner.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Scanner.java index 71efc8c..5660172 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Scanner.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/common/Scanner.java @@ -10,7 +10,7 @@ /** * Created by hupei on 2016/7/1. */ -public class Scanner { +public final class Scanner { public static final int RESTART_PREVIEW = 0; public static final int DECODE_SUCCEEDED = 1; public static final int DECODE_FAILED = 2; @@ -27,6 +27,36 @@ public static class color { public static final int RESULT_POINTS = 0xc099cc00; } + public static class Scan { + public static final String ACTION = "com.mylhyl.zxing.scanner.client.android.SCAN"; + + public static final String RESULT = "SCAN_RESULT"; + } + + public static class ScanMode { + + /** + * Decode only UPC and EAN barcodes. This is the right choice for shopping apps which get + * prices, reviews, etc. for products. + */ + public static final String PRODUCT_MODE = "PRODUCT_MODE"; + + /** + * Decode only 1D barcodes. + */ + public static final String ONE_D_MODE = "ONE_D_MODE"; + + /** + * Decode only QR codes. + */ + public static final String QR_CODE_MODE = "QR_CODE"; + + /** + * Decode only Data Matrix codes. + */ + public static final String DATA_MATRIX_MODE = "DATA_MATRIX_MODE"; + } + public static ParsedResult parseResult(Result rawResult) { if (rawResult == null) return null; return ResultParser.parseResult(rawResult); diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeFormatManager.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeFormatManager.java new file mode 100644 index 0000000..bf70abe --- /dev/null +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeFormatManager.java @@ -0,0 +1,77 @@ +package com.mylhyl.zxing.scanner.decode; + +import android.text.TextUtils; + +import com.google.zxing.BarcodeFormat; +import com.mylhyl.zxing.scanner.common.Scanner; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Created by hupei on 2017/7/7. + */ + +public final class DecodeFormatManager { + + static final Set PRODUCT_FORMATS; + static final Set INDUSTRIAL_FORMATS; + private static final Set ONE_D_FORMATS; + static final Set QR_CODE_FORMATS = EnumSet.of(BarcodeFormat.QR_CODE); + static final Set DATA_MATRIX_FORMATS = EnumSet.of(BarcodeFormat.DATA_MATRIX); + + static { + PRODUCT_FORMATS = EnumSet.of( + BarcodeFormat.UPC_A, + BarcodeFormat.UPC_E, + BarcodeFormat.EAN_13, + BarcodeFormat.EAN_8, + BarcodeFormat.RSS_14, + BarcodeFormat.RSS_EXPANDED); + INDUSTRIAL_FORMATS = EnumSet.of( + BarcodeFormat.CODE_39, + BarcodeFormat.CODE_93, + BarcodeFormat.CODE_128, + BarcodeFormat.ITF, + BarcodeFormat.CODABAR); + ONE_D_FORMATS = EnumSet.copyOf(PRODUCT_FORMATS); + ONE_D_FORMATS.addAll(INDUSTRIAL_FORMATS); + } + + private static final Map> FORMATS_FOR_MODE; + + static { + FORMATS_FOR_MODE = new HashMap<>(); + FORMATS_FOR_MODE.put(Scanner.ScanMode.ONE_D_MODE, ONE_D_FORMATS); + FORMATS_FOR_MODE.put(Scanner.ScanMode.PRODUCT_MODE, PRODUCT_FORMATS); + FORMATS_FOR_MODE.put(Scanner.ScanMode.QR_CODE_MODE, QR_CODE_FORMATS); + FORMATS_FOR_MODE.put(Scanner.ScanMode.DATA_MATRIX_MODE, DATA_MATRIX_FORMATS); + } + + private DecodeFormatManager() { + } + + public static Set parseDecodeFormats(BarcodeFormat... scanFormats) { + if (scanFormats != null) { + Set formats = EnumSet.noneOf(BarcodeFormat.class); + try { + for (BarcodeFormat format : scanFormats) { + formats.add(format); + } + return formats; + } catch (IllegalArgumentException iae) { + // ignore it then + } + } + return null; + } + + public static Set parseDecodeFormats(String decodeMode) { + if (!TextUtils.isEmpty(decodeMode)) { + return FORMATS_FOR_MODE.get(decodeMode); + } + return null; + } +} diff --git a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeThread.java b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeThread.java index 45cc68e..117a940 100644 --- a/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeThread.java +++ b/zxingscanner/src/main/java/com/mylhyl/zxing/scanner/decode/DecodeThread.java @@ -48,38 +48,14 @@ public final class DecodeThread extends Thread { private Handler handler; private final CountDownLatch handlerInitLatch; - static final Set PRODUCT_FORMATS; - static final Set INDUSTRIAL_FORMATS; - - static final Set QR_CODE_FORMATS = EnumSet.of(BarcodeFormat.QR_CODE); - static final Set DATA_MATRIX_FORMATS = EnumSet.of(BarcodeFormat.DATA_MATRIX); - - static { - PRODUCT_FORMATS = EnumSet.of(BarcodeFormat.UPC_A, - BarcodeFormat.UPC_E, - BarcodeFormat.EAN_13, - BarcodeFormat.EAN_8, - BarcodeFormat.RSS_14, - BarcodeFormat.RSS_EXPANDED); - INDUSTRIAL_FORMATS = EnumSet.of(BarcodeFormat.CODE_39, - BarcodeFormat.CODE_93, - BarcodeFormat.CODE_128, - BarcodeFormat.ITF, - BarcodeFormat.CODABAR); - } - public DecodeThread(CameraManager cameraManager, Handler scannerViewHandler, - Collection decodeFormats, - Map baseHints, String characterSet, - ResultPointCallback resultPointCallback) { + Collection decodeFormats, ResultPointCallback + resultPointCallback) { this.cameraManager = cameraManager; this.scannerViewHandler = scannerViewHandler; handlerInitLatch = new CountDownLatch(1); hints = new EnumMap<>(DecodeHintType.class); - if (baseHints != null) { - hints.putAll(baseHints); - } // The prefs can't change while the thread is running, so pick them up // once here. @@ -89,29 +65,26 @@ public DecodeThread(CameraManager cameraManager, Handler scannerViewHandler, // 一维码:商品 boolean decode1DProduct = true; if (decode1DProduct) { - decodeFormats.addAll(PRODUCT_FORMATS); + decodeFormats.addAll(DecodeFormatManager.PRODUCT_FORMATS); } // 一维码:工业 boolean decode1DIndustrial = true; if (decode1DIndustrial) { - decodeFormats.addAll(INDUSTRIAL_FORMATS); + decodeFormats.addAll(DecodeFormatManager.INDUSTRIAL_FORMATS); } // 二维码 boolean decodeQR = true; if (decodeQR) { - decodeFormats.addAll(QR_CODE_FORMATS); + decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); } // Data Matrix boolean decodeDataMatrix = true; if (decodeDataMatrix) { - decodeFormats.addAll(DATA_MATRIX_FORMATS); + decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS); } } hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); - if (characterSet != null) { - hints.put(DecodeHintType.CHARACTER_SET, characterSet); - } hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback); Log.i("DecodeThread", "Hints: " + hints);

    See - * - * DoCoMo's documentation about the result types represented by subclasses of this class.

  2. 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