From 86ea7eb03e3f3c031728a2d6d703106978dcf246 Mon Sep 17 00:00:00 2001 From: dengwenjie <775747758@qq.com> Date: Fri, 29 Aug 2025 10:30:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +- {smartjavaai-all => all}/pom.xml | 16 +- all/src/test/java/Test.java | 47 ++ {smartjavaai-bom => bom}/pom.xml | 18 +- build/output/0.png | Bin 0 -> 16663 bytes build/output/0crop.png | Bin 0 -> 8048 bytes build/output/1.png | Bin 0 -> 30577 bytes build/output/10.png | Bin 0 -> 167163 bytes build/output/10crop.png | Bin 0 -> 10449 bytes build/output/11.png | Bin 0 -> 187995 bytes build/output/11crop.png | Bin 0 -> 13573 bytes build/output/12.png | Bin 0 -> 207352 bytes build/output/12crop.png | Bin 0 -> 13996 bytes build/output/13.png | Bin 0 -> 228700 bytes build/output/13crop.png | Bin 0 -> 16839 bytes build/output/14.png | Bin 0 -> 240124 bytes build/output/14crop.png | Bin 0 -> 9124 bytes build/output/15.png | Bin 0 -> 272258 bytes build/output/15crop.png | Bin 0 -> 24477 bytes build/output/1crop.png | Bin 0 -> 6625 bytes build/output/2.png | Bin 0 -> 43060 bytes build/output/2crop.png | Bin 0 -> 5526 bytes build/output/3.png | Bin 0 -> 58231 bytes build/output/3crop.png | Bin 0 -> 7512 bytes build/output/4.png | Bin 0 -> 697608 bytes build/output/4crop.png | Bin 0 -> 143771 bytes build/output/5.png | Bin 0 -> 99585 bytes build/output/5crop.png | Bin 0 -> 16864 bytes build/output/6.png | Bin 0 -> 116983 bytes build/output/6crop.png | Bin 0 -> 11283 bytes build/output/7.png | Bin 0 -> 133202 bytes build/output/7crop.png | Bin 0 -> 7222 bytes build/output/8.png | Bin 0 -> 154081 bytes build/output/8crop.png | Bin 0 -> 9836 bytes build/output/9.png | Bin 0 -> 26687 bytes build/output/9crop.png | Bin 0 -> 3942 bytes build/output/9rotate.png | Bin 0 -> 3558 bytes build/output/cn_layout_detect_result.png | Bin 0 -> 139214 bytes build/output/ocr_1_detected.jpg | Bin 0 -> 866096 bytes build/output/table.jpg | Bin 0 -> 275183 bytes build/output/yolo_detected.png | Bin 0 -> 3928719 bytes {smartjavaai-common => common}/pom.xml | 6 +- .../cn/smartjavaai/common/config/Config.java | 16 +- .../common/config/ModelConfig.java | 0 .../common/cv/SmartImageFactory.java | 65 +++ .../common/entity/DetectionInfo.java | 10 + .../common/entity/DetectionRectangle.java | 0 .../common/entity/DetectionResponse.java | 3 + .../common/entity/InstanceSegInfo.java | 29 ++ .../smartjavaai/common/entity/Language.java | 0 .../smartjavaai/common/entity/ObbDetInfo.java | 29 ++ .../common/entity/ObjectDetInfo.java | 0 .../cn/smartjavaai/common/entity/Point.java | 0 .../java/cn/smartjavaai/common/entity/R.java | 0 .../smartjavaai/common/entity/RotatedBox.java | 38 ++ .../common/entity/face/ExpressionResult.java | 0 .../common/entity/face/FaceAttribute.java | 0 .../common/entity/face/FaceInfo.java | 0 .../common/entity/face/FaceSearchResult.java | 0 .../common/entity/face/HeadPose.java | 0 .../common/entity/face/LivenessResult.java | 0 .../common/entity/ocr/TableStructure.java | 0 .../smartjavaai/common/enums/DeviceEnum.java | 0 .../common/enums/VideoSourceType.java | 12 + .../common/enums/face/EyeStatus.java | 0 .../common/enums/face/FacialExpression.java | 0 .../common/enums/face/GenderType.java | 0 .../common/enums/face/LivenessStatus.java | 0 .../common/pool/CommonPredictorFactory.java | 0 .../pool/ModelPredictorPoolManager.java | 0 .../common/pool/PredictorFactory.java | 0 .../preprocess/BufferedImagePreprocessor.java | 0 .../smartjavaai/common/utils/ArrayUtils.java | 0 .../common/utils/Base64ImageUtils.java | 0 .../common/utils/DJLCommonUtils.java | 32 ++ .../smartjavaai/common/utils/FileUtils.java | 0 .../common/utils/FrameConverterUtil.java | 66 +++ .../smartjavaai/common/utils/ImageUtils.java | 5 +- .../common/utils/LetterBoxUtils.java | 24 + .../cn/smartjavaai/common/utils/NMSUtils.java | 43 ++ .../smartjavaai/common/utils/OpenCVUtils.java | 265 ++++++++++ .../smartjavaai/common/utils/PointUtils.java | 0 .../smartjavaai/common/utils/PoolUtils.java | 0 .../cn/smartjavaai/common/utils/SVDUtils.java | 0 .../smartjavaai/common/utils/VideoUtils.java | 0 examples/face-example/pom.xml | 10 +- .../examples/face/PythonTranslator.java | 118 +++++ .../main/java/smartai/examples/face/Test.java | 99 ++++ .../examples/face/facedet/FaceDetDemo.java | 19 +- .../examples/face/facerec/FaceRecDemo.java | 4 +- .../face-example/src/test/python/model.py | 126 +++++ .../output/object_detection_detected.png | Bin 0 -> 1863518 bytes examples/objectdetection-example/pom.xml | 6 +- .../objectdetection/ObjectDetection.java | 59 +++ .../ocr-examples/output/ocr_4_recognized.jpg | Bin 0 -> 698275 bytes .../ocr-examples/output/plate_recognized.jpg | Bin 0 -> 146788 bytes .../ocr-examples/output/plate_recognized2.jpg | Bin 0 -> 87787 bytes .../ocr-examples/output/table_ch2_result.html | 5 + .../ocr-examples/output/table_ch2_result.jpg | Bin 0 -> 282553 bytes .../ocr-examples/output/table_ch2_result.xls | Bin 0 -> 7680 bytes .../ocr-examples/output/table_ch2_result2.xls | Bin 0 -> 7680 bytes examples/ocr-examples/pom.xml | 2 +- .../examples/ocr/common/OcrRecognizeDemo.java | 6 +- examples/speech-examples/pom.xml | 2 +- examples/translation-example/pom.xml | 2 +- {smartjavaai-face => face}/pom.xml | 10 +- .../face/config/FaceAttributeConfig.java | 0 .../face/config/FaceDetConfig.java | 2 +- .../face/config/FaceExpressionConfig.java | 0 .../face/config/FaceRecConfig.java | 0 .../face/config/LivenessConfig.java | 0 .../face/config/QualityConfig.java | 0 .../face/constant/FaceDetectConstant.java | 0 .../face/constant/FaceNetConstant.java | 0 .../face/constant/LivenessConstant.java | 0 .../face/constant/MiniVisionConstant.java | 0 .../face/constant/RetinaFaceConstant.java | 4 - .../UltraLightFastGenericFaceConstant.java | 0 .../face/context/PredictorContext.java | 0 .../java/cn/smartjavaai/face/dao/FaceDao.java | 0 .../face/entity/FaceQualityResult.java | 0 .../face/entity/FaceQualitySummary.java | 0 .../face/entity/FaceRegisterInfo.java | 0 .../smartjavaai/face/entity/FaceResult.java | 0 .../face/entity/FaceSearchParams.java | 0 .../face/enums/ExpressionModelEnum.java | 0 .../face/enums/FaceAttributeModelEnum.java | 0 .../face/enums/FaceDetModelEnum.java | 93 ++++ .../face/enums/FaceRecModelEnum.java | 1 + .../cn/smartjavaai/face/enums/IdStrategy.java | 0 .../face/enums/LivenessModelEnum.java | 0 .../smartjavaai/face/enums/QualityGrade.java | 0 .../face/enums/QualityModelEnum.java | 0 .../face/enums/SimilarityType.java | 0 .../smartjavaai/face/enums/VectorDBType.java | 0 .../face/exception/FaceException.java | 0 .../face/factory/ExpressionModelFactory.java | 0 .../factory/FaceAttributeModelFactory.java | 0 .../face/factory/FaceDetModelFactory.java | 23 +- .../face/factory/FaceQualityModelFactory.java | 0 .../face/factory/FaceRecModelFactory.java | 1 + .../face/factory/LivenessModelFactory.java | 0 .../model/attribute/FaceAttributeModel.java | 0 .../Seetaface6FaceAttributeModel.java | 0 .../model/expression/CommonEmotionModel.java | 0 .../model/expression/ExpressionModel.java | 0 .../criterial/EmotionCriteriaFactory.java | 0 .../translator/DenseNetEmotionTranslator.java | 0 .../translator/FrEmotionTranslator.java | 0 .../model/facedect/CommonFaceDetModel.java | 0 .../face/model/facedect/FaceDetModel.java | 1 - .../model/facedect/MtcnnFaceDetModel.java | 399 +++++++++++++++ .../facedect/SeetaFace6FaceDetModel.java | 6 + .../criterial/FaceDetCriteriaFactory.java | 107 ++++ .../facedect/mtcnn/MtcnnBatchResult.java | 24 + .../model/facedect/mtcnn/MtcnnProcess.java | 64 +++ .../face/model/facedect/mtcnn/MtcnnUtils.java | 112 +++++ .../face/model/facedect/mtcnn/ONetModel.java | 202 ++++++++ .../face/model/facedect/mtcnn/PNetModel.java | 186 +++++++ .../face/model/facedect/mtcnn/RNetModel.java | 107 ++++ .../model/facerec/CommonFaceRecModel.java | 0 .../face/model/facerec/FaceRecModel.java | 0 .../model/facerec/SeetaFace6FaceRecModel.java | 16 +- .../criteria/FaceRecCriteriaFactory.java | 0 .../translator/FaceFeatureTranslator.java | 0 .../translator/FaceNetRecTranslator.java | 0 .../model/liveness/CommonLivenessModel.java | 0 .../face/model/liveness/LivenessDetModel.java | 0 .../liveness/MiniVisionLivenessModel.java | 0 .../liveness/Seetaface6LivenessModel.java | 0 .../criterial/LivenessCriteriaFactory.java | 0 .../liveness/translator/IicFrTranslator.java | 0 .../translator/MiniVisionTranslator.java | 0 .../face/model/quality/FaceQualityModel.java | 0 .../model/quality/Seetaface6QualityModel.java | 0 .../face/preprocess/DJLImagePreprocessor.java | 0 .../face/seetaface/ClarityDLResult.java | 0 .../face/seetaface/NativeLoader.java | 0 .../face/sqllite/ResultSetExtractor.java | 0 .../smartjavaai/face/sqllite/RowMapper.java | 0 .../face/sqllite/SqliteHelper.java | 0 .../translator/FaceDetectionTranslator.java | 0 .../face/translator/SCRFDFaceTranslator.java | 242 +++++++++ .../face/translator/YoloV5FaceTranslator.java | 462 +++++++++++++++++ .../face/translator/YoloV8FaceTranslator.java | 476 ++++++++++++++++++ .../face/utils/FaceAlignUtils.java | 0 .../cn/smartjavaai/face/utils/FaceUtils.java | 4 +- .../cn/smartjavaai/face/utils/SVDUtils.java | 0 .../face/utils/Seetaface6Utils.java | 0 .../face/utils/SimilarityUtil.java | 0 .../smartjavaai/face/utils/VectorUtils.java | 0 .../face/vector/config/MilvusConfig.java | 0 .../face/vector/config/SQLiteConfig.java | 0 .../face/vector/config/VectorDBConfig.java | 0 .../vector/constant/VectorDBConstants.java | 0 .../face/vector/core/MilvusClient.java | 0 .../face/vector/core/SQLiteClient.java | 0 .../face/vector/core/VectorDBClient.java | 0 .../face/vector/core/VectorDBFactory.java | 0 .../face/vector/entity/FaceVector.java | 0 .../vector/exception/VectorDBException.java | 0 .../src/main/resources/db/schema.sql | 0 face/src/test/java/Test.java | 87 ++++ {smartjavaai-ocr => ocr}/pom.xml | 10 +- .../ocr/config/DirectionModelConfig.java | 0 .../ocr/config/OcrDetModelConfig.java | 0 .../ocr/config/OcrRecModelConfig.java | 0 .../smartjavaai/ocr/config/OcrRecOptions.java | 0 .../ocr/config/PlateDetModelConfig.java | 0 .../ocr/config/PlateRecModelConfig.java | 0 .../ocr/config/TableStructureConfig.java | 0 .../smartjavaai/ocr/entity/DirectionInfo.java | 0 .../cn/smartjavaai/ocr/entity/IdCardInfo.java | 0 .../cn/smartjavaai/ocr/entity/ImageInfo.java | 0 .../cn/smartjavaai/ocr/entity/OcrBox.java | 0 .../cn/smartjavaai/ocr/entity/OcrInfo.java | 0 .../cn/smartjavaai/ocr/entity/OcrItem.java | 0 .../cn/smartjavaai/ocr/entity/PlateInfo.java | 0 .../smartjavaai/ocr/entity/PlateResult.java | 0 .../cn/smartjavaai/ocr/entity/RotatedBox.java | 0 .../ocr/entity/RotatedBoxCompX.java | 0 .../ocr/entity/TableStructureResult.java | 0 .../cn/smartjavaai/ocr/enums/AngleEnum.java | 0 .../ocr/enums/CommonDetModelEnum.java | 0 .../ocr/enums/CommonRecModelEnum.java | 0 .../ocr/enums/DirectionModelEnum.java | 0 .../ocr/enums/PlateDetModelEnum.java | 0 .../ocr/enums/PlateRecModelEnum.java | 0 .../cn/smartjavaai/ocr/enums/PlateType.java | 0 .../ocr/enums/TableStructureModelEnum.java | 0 .../ocr/exception/OcrException.java | 0 .../ocr/factory/OcrModelFactory.java | 0 .../ocr/factory/PlateModelFactory.java | 0 .../ocr/factory/TableRecModelFactory.java | 0 .../common/detect/OcrCommonDetModel.java | 0 .../common/detect/OcrCommonDetModelImpl.java | 0 .../OcrCommonDetCriterialFactory.java | 0 .../detect/translator/PPOCRDetTranslator.java | 0 .../common/direction/OcrDirectionModel.java | 0 .../direction/PPOCRMobileV2ClsModel.java | 0 .../criteria/DirectionCriteriaFactory.java | 0 .../translator/PpWordRotateTranslator.java | 0 .../common/recognize/OcrCommonRecModel.java | 0 .../recognize/OcrCommonRecModelImpl.java | 0 .../OcrCommonRecCriterialFactory.java | 0 .../translator/PPOCRRecTranslator.java | 0 .../ocr/model/plate/CRNNPlateRecModel.java | 20 +- .../ocr/model/plate/PlateDetModel.java | 0 .../ocr/model/plate/PlateRecModel.java | 0 .../ocr/model/plate/Yolov5PlateDetModel.java | 0 .../criteria/PlateDetCriterialFactory.java | 12 + .../criteria/PlateRecCriterialFactory.java | 0 .../translator/CRNNPlateRecTranslator.java | 0 .../Yolo5PlateDetectTranslator.java | 0 .../Yolov7PlateDetectTranslator.java | 0 .../Yolov8PlateDetectTranslator.java | 0 .../table/CommonTableStructureModel.java | 0 .../ocr/model/table/TableRecognizer.java | 0 .../ocr/model/table/TableStructureModel.java | 0 .../criteria/StructureCriteriaFactory.java | 0 .../translator/TableStructTranslator.java | 0 .../ocr/opencv/OcrNDArrayUtils.java | 0 .../ocr/utils/ConvertHtml2Excel.java | 0 .../ocr/utils/CrossRangeCellMeta.java | 0 .../cn/smartjavaai/ocr/utils/OcrUtils.java | 13 +- pom.xml | 31 +- .../smartjavaai/common/utils/OpenCVUtils.java | 143 ------ .../face/enums/FaceDetModelEnum.java | 37 -- .../criterial/FaceDetCriteriaFactory.java | 69 --- .../objectdetection/utils/DetectorUtils.java | 67 --- .../translation/entity/CausalLMOutput.java | 33 -- {smartjavaai-speech => speech}/pom.xml | 10 +- .../speech/asr/audio/SmartAudioFactory.java | 0 .../speech/asr/config/AsrModelConfig.java | 0 .../speech/asr/entity/AsrResult.java | 0 .../speech/asr/entity/AsrSegment.java | 0 .../speech/asr/entity/RecParams.java | 0 .../speech/asr/entity/VoskParams.java | 0 .../speech/asr/entity/WhisperParams.java | 0 .../speech/asr/enums/AsrModelEnum.java | 0 .../speech/asr/exception/AsrException.java | 0 .../asr/factory/SpeechRecognizerFactory.java | 0 .../speech/asr/model/SpeechRecognizer.java | 0 .../speech/asr/model/VoskRecognizer.java | 0 .../speech/asr/model/WhisperRecognizer.java | 0 .../speech/asr/pool/WhisperStatePool.java | 0 .../smartjavaai/speech/utils/AudioUtils.java | 0 speech/src/test/java/Test.java | 218 ++++++++ {smartjavaai-translate => translate}/pom.xml | 13 +- .../translation/config/NllbSearchConfig.java | 0 .../translation/config/OpusSearchConfig.java | 63 +++ .../config/TranslationModelConfig.java | 0 .../translation/entity/BatchTensorList.java | 0 .../entity/BeamBatchTensorList.java | 61 +++ .../entity/GreedyBatchTensorList.java | 0 .../translation/entity/TranslateParam.java | 10 + .../translation/enums/LanguageCode.java | 0 .../enums/TranslationModeEnum.java | 6 +- .../exception/TranslationException.java | 0 .../factory/TranslationModelFactory.java | 20 +- .../translation/model/BeamHypotheses.java | 121 +++++ .../translation/model/BeamSearchScorer.java | 118 +++++ .../translation/model/NllbModel.java | 4 +- .../translation/model/OpusMtModel.java | 442 ++++++++++++++++ .../translation/model/TranslationModel.java | 9 + .../translator/NllbDecoder2Translator.java | 2 +- .../translator/NllbDecoderTranslator.java | 2 +- .../translator/NllbEncoderTranslator.java | 0 .../translator/opus/Decoder2Translator.java | 52 ++ .../translator/opus/DecoderTranslator.java | 54 ++ .../translator/opus/EncoderTranslator.java | 49 ++ .../translation/utils/NDArrayUtils.java | 28 ++ .../translation/utils/TokenUtils.java | 28 ++ translate/src/main/test/java/Test.java | 35 ++ .../pom.xml | 37 +- .../action/config/ActionRecModelConfig.java | 58 +++ .../criteria/ActionRecCriteriaFactory.java | 67 +++ .../action/enums/ActionRecModelEnum.java | 48 ++ .../action/exception/ActionException.java | 29 ++ .../action/model/ActionRecModel.java | 46 ++ .../action/model/CommonActionRecModel.java | 142 ++++++ .../action/model/CommonActionTranslator.java | 140 ++++++ .../config/InstanceSegModelConfig.java | 55 ++ .../criteria/InstanceSegCriteriaFactory.java | 47 ++ .../instanceseg/entity/DetectParams.java | 17 + .../enums/InstanceSegModelEnum.java | 43 ++ .../exception/InstanceSegException.java | 29 ++ .../model/CommonInstanceSegModel.java | 153 ++++++ .../instanceseg/model/InstanceSegModel.java | 47 ++ .../YoloSegmentationTranslator2.java | 182 +++++++ .../YoloSegmentationTranslatorFactory2.java | 37 ++ .../config/DetectorModelConfig.java | 0 .../config/PersonDetModelConfig.java | 62 +++ .../constant/DetectorConstant.java | 0 .../criteria/CriteriaBuilderFactory.java | 5 +- .../criteria/CriteriaBuilderStrategy.java | 0 .../criteria/DJLModelCriteriaBuilder.java | 0 .../criteria/PersonDetCriteriaFactory.java | 76 +++ .../criteria/Tensorflow2CriteriaBuilder.java | 119 +++++ .../criteria/YoloCriteriaBuilder.java | 0 .../enums/DetectorModelEnum.java | 5 +- .../enums/PersonDetectorModelEnum.java | 51 ++ .../exception/DetectionException.java | 0 .../objectdetection/model/DetectorModel.java | 73 +-- .../model/ObjectDetectionModelFactory.java | 14 +- .../model/person/CommonPersonDetModel.java | 160 ++++++ .../model/person/PersonDetModel.java | 62 +++ .../stream/StreamDetectionListener.java | 16 + .../stream/StreamDetector.java | 280 +++++++++++ .../translator/TensorflowTranslator.java | 111 ++++ .../translator/YoloV8PersonDetTranslator.java | 457 +++++++++++++++++ .../semseg/config/SemSegModelConfig.java | 49 ++ .../criteria/SemSegCriteriaFactory.java | 48 ++ .../semseg/entity/DetectParams.java | 17 + .../semseg/enums/SemSegModelEnum.java | 34 ++ .../semseg/exception/SemSegException.java | 29 ++ .../semseg/model/CommonSemSegModel.java | 137 +++++ .../smartjavaai/semseg/model/SemSegModel.java | 42 ++ .../vision/utils/CategoryMaskFilter.java | 102 ++++ .../vision/utils/ClassificationFilter.java | 62 +++ .../vision/utils/DetectedObjectsFilter.java | 84 ++++ .../vision/utils/DetectorUtils.java | 114 +++++ .../vision/utils/ObbResultFilter.java | 45 ++ .../vision/utils/TensorflowSynsetUtils.java | 78 +++ 364 files changed, 8572 insertions(+), 540 deletions(-) rename {smartjavaai-all => all}/pom.xml (94%) create mode 100644 all/src/test/java/Test.java rename {smartjavaai-bom => bom}/pom.xml (92%) create mode 100644 build/output/0.png create mode 100644 build/output/0crop.png create mode 100644 build/output/1.png create mode 100644 build/output/10.png create mode 100644 build/output/10crop.png create mode 100644 build/output/11.png create mode 100644 build/output/11crop.png create mode 100644 build/output/12.png create mode 100644 build/output/12crop.png create mode 100644 build/output/13.png create mode 100644 build/output/13crop.png create mode 100644 build/output/14.png create mode 100644 build/output/14crop.png create mode 100644 build/output/15.png create mode 100644 build/output/15crop.png create mode 100644 build/output/1crop.png create mode 100644 build/output/2.png create mode 100644 build/output/2crop.png create mode 100644 build/output/3.png create mode 100644 build/output/3crop.png create mode 100644 build/output/4.png create mode 100644 build/output/4crop.png create mode 100644 build/output/5.png create mode 100644 build/output/5crop.png create mode 100644 build/output/6.png create mode 100644 build/output/6crop.png create mode 100644 build/output/7.png create mode 100644 build/output/7crop.png create mode 100644 build/output/8.png create mode 100644 build/output/8crop.png create mode 100644 build/output/9.png create mode 100644 build/output/9crop.png create mode 100644 build/output/9rotate.png create mode 100644 build/output/cn_layout_detect_result.png create mode 100644 build/output/ocr_1_detected.jpg create mode 100644 build/output/table.jpg create mode 100644 build/output/yolo_detected.png rename {smartjavaai-common => common}/pom.xml (97%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/config/Config.java (83%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/config/ModelConfig.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/cv/SmartImageFactory.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/DetectionInfo.java (86%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/DetectionRectangle.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/DetectionResponse.java (86%) create mode 100644 common/src/main/java/cn/smartjavaai/common/entity/InstanceSegInfo.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/Language.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/entity/ObbDetInfo.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/ObjectDetInfo.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/Point.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/R.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/entity/RotatedBox.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/ExpressionResult.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/FaceAttribute.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/FaceInfo.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/FaceSearchResult.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/HeadPose.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/face/LivenessResult.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/entity/ocr/TableStructure.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/enums/DeviceEnum.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/enums/VideoSourceType.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/enums/face/EyeStatus.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/enums/face/FacialExpression.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/enums/face/GenderType.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/enums/face/LivenessStatus.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/pool/CommonPredictorFactory.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/pool/ModelPredictorPoolManager.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/pool/PredictorFactory.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/preprocess/BufferedImagePreprocessor.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/ArrayUtils.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/Base64ImageUtils.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/utils/DJLCommonUtils.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/FileUtils.java (100%) create mode 100644 common/src/main/java/cn/smartjavaai/common/utils/FrameConverterUtil.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/ImageUtils.java (99%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/LetterBoxUtils.java (80%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/NMSUtils.java (53%) create mode 100644 common/src/main/java/cn/smartjavaai/common/utils/OpenCVUtils.java rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/PointUtils.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/PoolUtils.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/SVDUtils.java (100%) rename {smartjavaai-common => common}/src/main/java/cn/smartjavaai/common/utils/VideoUtils.java (100%) create mode 100644 examples/face-example/src/main/java/smartai/examples/face/PythonTranslator.java create mode 100644 examples/face-example/src/main/java/smartai/examples/face/Test.java create mode 100644 examples/face-example/src/test/python/model.py create mode 100644 examples/objectdetection-example/output/object_detection_detected.png create mode 100644 examples/ocr-examples/output/ocr_4_recognized.jpg create mode 100644 examples/ocr-examples/output/plate_recognized.jpg create mode 100644 examples/ocr-examples/output/plate_recognized2.jpg create mode 100644 examples/ocr-examples/output/table_ch2_result.html create mode 100644 examples/ocr-examples/output/table_ch2_result.jpg create mode 100644 examples/ocr-examples/output/table_ch2_result.xls create mode 100644 examples/ocr-examples/output/table_ch2_result2.xls rename {smartjavaai-face => face}/pom.xml (96%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/FaceAttributeConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/FaceDetConfig.java (92%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/FaceExpressionConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/FaceRecConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/LivenessConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/config/QualityConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/FaceDetectConstant.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/FaceNetConstant.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/LivenessConstant.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/MiniVisionConstant.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/RetinaFaceConstant.java (77%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/constant/UltraLightFastGenericFaceConstant.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/context/PredictorContext.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/dao/FaceDao.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/entity/FaceQualityResult.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/entity/FaceQualitySummary.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/entity/FaceRegisterInfo.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/entity/FaceResult.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/entity/FaceSearchParams.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/ExpressionModelEnum.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/FaceAttributeModelEnum.java (100%) create mode 100644 face/src/main/java/cn/smartjavaai/face/enums/FaceDetModelEnum.java rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/FaceRecModelEnum.java (95%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/IdStrategy.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/LivenessModelEnum.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/QualityGrade.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/QualityModelEnum.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/SimilarityType.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/enums/VectorDBType.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/exception/FaceException.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/ExpressionModelFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/FaceAttributeModelFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/FaceDetModelFactory.java (76%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/FaceQualityModelFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/FaceRecModelFactory.java (96%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/factory/LivenessModelFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/attribute/FaceAttributeModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/attribute/Seetaface6FaceAttributeModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/expression/CommonEmotionModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/expression/ExpressionModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/expression/criterial/EmotionCriteriaFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/expression/translator/DenseNetEmotionTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/expression/translator/FrEmotionTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facedect/CommonFaceDetModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facedect/FaceDetModel.java (99%) create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/MtcnnFaceDetModel.java rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facedect/SeetaFace6FaceDetModel.java (97%) create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/criterial/FaceDetCriteriaFactory.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/MtcnnBatchResult.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/MtcnnProcess.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/MtcnnUtils.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/ONetModel.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/PNetModel.java create mode 100644 face/src/main/java/cn/smartjavaai/face/model/facedect/mtcnn/RNetModel.java rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/CommonFaceRecModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/FaceRecModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/SeetaFace6FaceRecModel.java (98%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/criteria/FaceRecCriteriaFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/translator/FaceFeatureTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/facerec/translator/FaceNetRecTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/CommonLivenessModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/LivenessDetModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/MiniVisionLivenessModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/Seetaface6LivenessModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/criterial/LivenessCriteriaFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/translator/IicFrTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/liveness/translator/MiniVisionTranslator.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/quality/FaceQualityModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/model/quality/Seetaface6QualityModel.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/preprocess/DJLImagePreprocessor.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/seetaface/ClarityDLResult.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/seetaface/NativeLoader.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/sqllite/ResultSetExtractor.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/sqllite/RowMapper.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/sqllite/SqliteHelper.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/translator/FaceDetectionTranslator.java (100%) create mode 100644 face/src/main/java/cn/smartjavaai/face/translator/SCRFDFaceTranslator.java create mode 100644 face/src/main/java/cn/smartjavaai/face/translator/YoloV5FaceTranslator.java create mode 100644 face/src/main/java/cn/smartjavaai/face/translator/YoloV8FaceTranslator.java rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/FaceAlignUtils.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/FaceUtils.java (99%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/SVDUtils.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/Seetaface6Utils.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/SimilarityUtil.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/utils/VectorUtils.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/config/MilvusConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/config/SQLiteConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/config/VectorDBConfig.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/constant/VectorDBConstants.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/core/MilvusClient.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/core/SQLiteClient.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/core/VectorDBClient.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/core/VectorDBFactory.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/entity/FaceVector.java (100%) rename {smartjavaai-face => face}/src/main/java/cn/smartjavaai/face/vector/exception/VectorDBException.java (100%) rename {smartjavaai-face => face}/src/main/resources/db/schema.sql (100%) create mode 100644 face/src/test/java/Test.java rename {smartjavaai-ocr => ocr}/pom.xml (96%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/DirectionModelConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/OcrDetModelConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/OcrRecModelConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/OcrRecOptions.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/PlateDetModelConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/PlateRecModelConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/config/TableStructureConfig.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/DirectionInfo.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/IdCardInfo.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/ImageInfo.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/OcrBox.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/OcrInfo.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/OcrItem.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/PlateInfo.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/PlateResult.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/RotatedBox.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/RotatedBoxCompX.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/entity/TableStructureResult.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/AngleEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/CommonDetModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/CommonRecModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/DirectionModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/PlateDetModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/PlateRecModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/PlateType.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/enums/TableStructureModelEnum.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/exception/OcrException.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/factory/OcrModelFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/factory/PlateModelFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/factory/TableRecModelFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/detect/OcrCommonDetModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/detect/OcrCommonDetModelImpl.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/detect/criteria/OcrCommonDetCriterialFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/detect/translator/PPOCRDetTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/direction/OcrDirectionModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/direction/PPOCRMobileV2ClsModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/direction/criteria/DirectionCriteriaFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/direction/translator/PpWordRotateTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/recognize/OcrCommonRecModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/recognize/OcrCommonRecModelImpl.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/recognize/criteria/OcrCommonRecCriterialFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/common/recognize/translator/PPOCRRecTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/CRNNPlateRecModel.java (93%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/PlateDetModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/PlateRecModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/Yolov5PlateDetModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/criteria/PlateDetCriterialFactory.java (79%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/criteria/PlateRecCriterialFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/translator/CRNNPlateRecTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/translator/Yolo5PlateDetectTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/translator/Yolov7PlateDetectTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/plate/translator/Yolov8PlateDetectTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/table/CommonTableStructureModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/table/TableRecognizer.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/table/TableStructureModel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/table/criteria/StructureCriteriaFactory.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/model/table/translator/TableStructTranslator.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/opencv/OcrNDArrayUtils.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/utils/ConvertHtml2Excel.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/utils/CrossRangeCellMeta.java (100%) rename {smartjavaai-ocr => ocr}/src/main/java/cn/smartjavaai/ocr/utils/OcrUtils.java (98%) delete mode 100644 smartjavaai-common/src/main/java/cn/smartjavaai/common/utils/OpenCVUtils.java delete mode 100644 smartjavaai-face/src/main/java/cn/smartjavaai/face/enums/FaceDetModelEnum.java delete mode 100644 smartjavaai-face/src/main/java/cn/smartjavaai/face/model/facedect/criterial/FaceDetCriteriaFactory.java delete mode 100644 smartjavaai-objectdetection/src/main/java/cn/smartjavaai/objectdetection/utils/DetectorUtils.java delete mode 100644 smartjavaai-translate/src/main/java/cn/smartjavaai/translation/entity/CausalLMOutput.java rename {smartjavaai-speech => speech}/pom.xml (96%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/audio/SmartAudioFactory.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/config/AsrModelConfig.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/entity/AsrResult.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/entity/AsrSegment.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/entity/RecParams.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/entity/VoskParams.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/entity/WhisperParams.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/enums/AsrModelEnum.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/exception/AsrException.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/factory/SpeechRecognizerFactory.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/model/SpeechRecognizer.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/model/VoskRecognizer.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/model/WhisperRecognizer.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/asr/pool/WhisperStatePool.java (100%) rename {smartjavaai-speech => speech}/src/main/java/cn/smartjavaai/speech/utils/AudioUtils.java (100%) create mode 100644 speech/src/test/java/Test.java rename {smartjavaai-translate => translate}/pom.xml (93%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/config/NllbSearchConfig.java (100%) create mode 100644 translate/src/main/java/cn/smartjavaai/translation/config/OpusSearchConfig.java rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/config/TranslationModelConfig.java (100%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/entity/BatchTensorList.java (100%) create mode 100644 translate/src/main/java/cn/smartjavaai/translation/entity/BeamBatchTensorList.java rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/entity/GreedyBatchTensorList.java (100%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/entity/TranslateParam.java (76%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/enums/LanguageCode.java (100%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/enums/TranslationModeEnum.java (91%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/exception/TranslationException.java (100%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/factory/TranslationModelFactory.java (72%) create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/BeamHypotheses.java create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/BeamSearchScorer.java rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/model/NllbModel.java (99%) create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/OpusMtModel.java rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/model/TranslationModel.java (76%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/model/translator/NllbDecoder2Translator.java (95%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/model/translator/NllbDecoderTranslator.java (95%) rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/model/translator/NllbEncoderTranslator.java (100%) create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/translator/opus/Decoder2Translator.java create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/translator/opus/DecoderTranslator.java create mode 100644 translate/src/main/java/cn/smartjavaai/translation/model/translator/opus/EncoderTranslator.java create mode 100644 translate/src/main/java/cn/smartjavaai/translation/utils/NDArrayUtils.java rename {smartjavaai-translate => translate}/src/main/java/cn/smartjavaai/translation/utils/TokenUtils.java (59%) create mode 100644 translate/src/main/test/java/Test.java rename {smartjavaai-objectdetection => vision}/pom.xml (81%) create mode 100644 vision/src/main/java/cn/smartjavaai/action/config/ActionRecModelConfig.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/criteria/ActionRecCriteriaFactory.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/enums/ActionRecModelEnum.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/exception/ActionException.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/model/ActionRecModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/model/CommonActionRecModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/action/model/CommonActionTranslator.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/config/InstanceSegModelConfig.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/criteria/InstanceSegCriteriaFactory.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/entity/DetectParams.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/enums/InstanceSegModelEnum.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/exception/InstanceSegException.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/model/CommonInstanceSegModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/model/InstanceSegModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/translator/YoloSegmentationTranslator2.java create mode 100644 vision/src/main/java/cn/smartjavaai/instanceseg/translator/YoloSegmentationTranslatorFactory2.java rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/config/DetectorModelConfig.java (100%) create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/config/PersonDetModelConfig.java rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/constant/DetectorConstant.java (100%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/criteria/CriteriaBuilderFactory.java (88%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/criteria/CriteriaBuilderStrategy.java (100%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/criteria/DJLModelCriteriaBuilder.java (100%) create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/criteria/PersonDetCriteriaFactory.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/criteria/Tensorflow2CriteriaBuilder.java rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/criteria/YoloCriteriaBuilder.java (100%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/enums/DetectorModelEnum.java (96%) create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/enums/PersonDetectorModelEnum.java rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/exception/DetectionException.java (100%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/model/DetectorModel.java (79%) rename {smartjavaai-objectdetection => vision}/src/main/java/cn/smartjavaai/objectdetection/model/ObjectDetectionModelFactory.java (82%) create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/model/person/CommonPersonDetModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/model/person/PersonDetModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/stream/StreamDetectionListener.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/stream/StreamDetector.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/translator/TensorflowTranslator.java create mode 100644 vision/src/main/java/cn/smartjavaai/objectdetection/translator/YoloV8PersonDetTranslator.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/config/SemSegModelConfig.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/criteria/SemSegCriteriaFactory.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/entity/DetectParams.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/enums/SemSegModelEnum.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/exception/SemSegException.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/model/CommonSemSegModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/semseg/model/SemSegModel.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/CategoryMaskFilter.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/ClassificationFilter.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/DetectedObjectsFilter.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/DetectorUtils.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/ObbResultFilter.java create mode 100644 vision/src/main/java/cn/smartjavaai/vision/utils/TensorflowSynsetUtils.java diff --git a/README.md b/README.md index ae0153e..5d11bca 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,8 @@ SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的
语音识别
- - 支持100种语言 + - 支持100种语言8 z9{3?tnLa6+bfO&dJt;5qC%J+a3C{a(#LF Fylr6K`(lPziPuG%}^>^3vn~ZZkR4ZM^6}EcvItnfIlKqZq8@qWGEQ?%n;* z%m0zde*p0xYxs{V_;2JM=`rLaP+t$w@$-8D{+s*qWh5GrU0!ycTy7wWBQ*KvO3#X9 H41NCx_Ce4| literal 0 HcmV?d00001 diff --git a/build/output/0crop.png b/build/output/0crop.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e2ccab4d593e3e9e616ea9213c2b92cc77b746 GIT binary patch literal 8048 zcmbt(cQo5?^na~tP}0VT+DcHPLTPPPs%qEXDn*T&wQ4r@E>#k%HW8y{5t~q3%_>2o zC^c%-DB>6G=leaszkk1Tl6S^A&-2{%-21w(8?B?IdX?%1)ul_9uBts!enR|wN_;=N zLP~rxqxw`YUE;W_rhH%Dmt?cUui3)Z@5j! qc$%4u={#nK8_OIs2sSx9g@( z j;vYS4Z0tzsHO-CYck)txj{;OP?pz9Uohr zG!EMgNs`+uO)!g-%w6lgN;2^dVB7iS7STNj4iMP{1JKB;N5c&&nw^JVC%w_fZE)OJ zXSET$u{TMB6F4BWSebhD|MUPCy~%`9ggvy_Ar&n*|8$*|f?-;$%Ut#t;WJ!zlezY2 zQFXp`-=wfR?3p?F1idH;loFJkQxVcYD$-+kVdql>IHw{9FWZ4_*I x^O78cz^w_p%Z`c|esSRuT7V_?P(2_&s^s)w3U8pa!Mkq^#3AWopby3S&Y4Xm5 z3bH6sVdDi$P SS$4DL%`lOrztt|g!%@2gt+%StV!f&+2ts-Gz=1fh|K^aVxz^2 zLRA0vSYqIiEUOV?6mc(S{Z@rzjPZ+_&3ltBsi%Exbe5hw#hxnY0W>Y4JYU;VH%(k1 zPJ KYzw@Apuy56aa JI+`U1O9ZZ>%IMn znciv)&uLS}h*iCl?nlWYV-&i9JT|V8l#6`tnH?9o!Ea|3-8-5~|3z`+v)s#(A?R1_ z`O&0#>FJP!=z17(-4w9iZCoHtZsoloM`!u!bG*a%syCsu^Q#3P*^!++JYJje(T=%l zH+o5vGbY9uAzbv rNXSgxM>0_ww+YsSp$Uo{f^7xUG^K1p`1yKlXgLCD`h4bSb@VG~pSXA88(W zd+u o;S*X97Y> z>k1q!jtPmf2cMjEOX&|((X@V3TQW#KdnI3Z<9Aj^>NO*)QzhY{(8h_XD|Tu;#@;%N zS{JfFz@TA09=>SlcY>P>9;;-B!FqZ!-&1+2iUgD~xGjaVrLJ;Cj8J5kX&BCX0aeu> zYWm4=<>89ue)W5Woo-Ou0oHYaP^CQ{WxwaV#ZF}qpUq1bc<{M2+v#Ol%0VstW*!Z% zNL+NrVzP$dxIX2u--rO_taHQ<`EaO5nHLXDO=d_5e@o10&HNQ{(f5^DX=wBdc^e^I(&|Xu6qqCzQ-CF#3sXMfWHR?3my(h9S6lLAbP}k3 zSYCR|QQzpFHS!)l>wHu23`9ouuI!ct3!{;R_fnd|Zwp5-^eGUKwB~)S1w5P}ou&2m zXMBFo&3RE>r4IGrb7rThvg0wPw!pP;4%iju2p#x+fJAI@Y$vGzx)k`Z5sA7%M$Sr3 zPEJpnV(u|6FcR3|BA^e+??D?DKN5IaB1p}5QEs6V;hGwvO!jZ}i(Q N2SkxzO6e Ao%be)tI0ikwS&ZXS? zFpiIaFy0w@!)eFJ`#<>*lnHn`=$q`wWA QkleL!mG~cemSw;J*3m3VkqRG9#6?gqni2tvvEO+ z(iJJGt? HIkRPat=740D(T#W8!njv z&g$wpr}yxJ^pk6y*U}WuR;Mjrsn??P{id2GsZvYRT6e>Xt&Vz1=S2G%fUw$3b%8+| zU66K%xyBs1;2;Ue{a PKyM1&M*gv=894q^$Qh3)Mp(|7$F_ Je?dQjV{82Lmg&oWlu|*r5Gvm!Wib!JgT=N_2n=@j<%u{`{4)n^J&po4 z7zSlh4$G0UzXlc8ZnV&<+so_aDAkfGx*L#!XqtMKXu!+5|8+rj Y7{2zrPoBuIk7e$ zx3j5SFa6-_xU(dlSkI`-)Vv#FrGRgEFu<#25-E09llL)@qKehb)@LbVhBr2KS;_^o zqvsQJ$`Y%DLODh2%Eg6m*A7&3RQew=Sv7C8aLBqA)JW+|#VPABX-rIp2{nK@fpJi# z`h<(>(n|z_J>5v4r<+f7`jgB3I;4%za *}>_&Jk!`aQ``-%AFoh1u9|;W%rk z<8jH {$;N*T_qs48Yhklrb5VUx*l^OXh!EAbd|Jw-V(k@-|N#Lqwa}X{L zp>ssRlvT6R?5TRwvU+-J)xzW8&mS&9bXh#NqT5rDeW&tH39XH_Q09fX1`s-mqU|I* zJvR)nb)yItIFqgOiN sUr0n a=BP%D_u#-Lpe9qm8B1K^p9)(IQy|(`bKK2AYUTFsj{i#IyY 2(>- {X2Fp3hf7UWGNM=oc)RNwsP-U<8&Pbep<;PcV#O8&M zcn^`#?5H?8^3Sds&?;s kxY>w)XpvDHi+pzEm|sGl>H!e|gYF4WON9##PU zS4+eoDSSxqJs^yA$Pjl=Q;%`}?5+P+%b(EqS&~gS{5nhJ@fev^BR)C9l-GsTZB#J9 zB=CFQ8p>7v7t`vYNafwp7vCsODgyehp{+ng;EKvr@ArOtbv|>i#*LJZvlaq7Q1<06 z4(@~B_+$wm9D1lKT7Sc{vg`J6A92AriNMDP0m~J|zYYD7H<%e-K+)Hj?n0Cpy|_7D zVygZ^?b|RVq>d t>tO4xZHL}(I}x1{Tf zURK@kJ4LC|qLIlehXK2-iIzb|g3mj>1GECRy;^K#v<+Bx4+(^Yh2IBgv{WtDZ(DwC znsB&Bw#-5+<$l&>$NZQmV%Es1l}vf?mxMr^fM%Y=kko3+aro_^j;MGk{p&P+_#S1q zJF%p2R1L#_UKYy@iGJOOP~#K2G4x#pn~+HGJ*b^@4L(wB6!IGf3|IyJc 8 zz^{?pQroFoBt7y2Rv!Bfl>U6Hrgbj3(_DhR!r2hYc7NFHjQaLhxssyZ0-t`Vg|lJj zjStftvWNTgYEto3+wA^7)_zVivnQ`OxyXB_o!1qN+8UXA47D7ddWE3` Tfds_ZevdC zD%mB2MvAvvHq-r`A2AXbgy{c9Z=z@QJ>g%=m;^8rbPTls~ z=u_>_b1Y%0nbIg}f+L9?^uJ~((K-Y~@&GBC6X$+sR%mnMsGO3p9=JM}Vt*x?%^TT- zPxYx!eQwZuJK(^HBj}tDqZ5Dc*Qb^Q>AfgscD`rH!U^hxW0?iq8B?}}MB}*SX;#}2 z;n=lBiKR51%<4o&HQP6*7QM*0uA<7}(ep=j?#_1|i{L#ZW}}r~?-8zXXV*;O5as&x z(X*kG`6INyT&2j02UzM>PK7muS%>LAsBYtIljr*kguSFLk2BrP4>s|!-0qBQRaFNd z-)aSR2^yXDJI@=36&@~})j2Kf^(EL0w^D9 &yoH19s0>U7_Gchm$dt5`qB$87vnGxU(jk$C!kUR^HOr~ zSEki^>*| @@yc$%^Cv+#jwzdVfXWYEo z!g2mJ?R@ZElKXx}@ODnuL5+8)WOCWtRQ8YfGURLf!-;A^7qgl!mqMq>F-h@ppMZ^Q zv&y#HVCJCUbEd49Q|?c7<*MV~4QXm?j|>h*JwlJaNRKJ!CIW3gQRw&};$yeL96Tc# z%S-3ggxM3mJAb_Mvke?(JJ7I*E8f~UwKsfv*+6siWGd*ai)n!uBK4 5!6Lu={MxLUF8UDzlE~Fkc3xDt%8;qS7?@#-MTD|Ef>9~r)RlV-(QYL7J*Q| zjHPxrpwW0fAu+l;alH1xldokB{z?vQxZM_j4Kj?owW6P2G}YqN=6$B(6P-kTU{SSN zI!=pz7O30*p~B|#Rn*?Q5qaN9mG@7hsJuE*EnSE6hgbnxf!fCgYhw 8h}rnK zYg;MvO>q-qfKJyBQ&}KPEwr6yn(fjQzR6nf{~c@Cwi%DgEJvs(!{WG1icOjvk4?nM zJP(_e({QbJGcGUa0O}TNE6ksDPvAb5`}S7BCF0l*b~7V8!-v^N8}ApODGn9so8C-? zDM{^r%^1MU&+Z53DInP^yN^jVJwL?-U*$T*?;VKR4JGHlHhi=k=+ySA>q5L+UxJU- zwPp88xL5|C2z^BXwgXNu=PLs&v%;k@_S@Iw-Il|bZ7Kr-{oSR^;`L#J^A6s|b*E*> z$Qqc}z->(6P&KZpLMn CbEsNx802PS^g6b X@D?`Lr0$WT)>DX$4MT4TjQapcHl|I1E(KPC6&eV`=q)V`Ts%)3LSG2 z(1Yt^m+a`PEaG_>ZHG-lW2a(##}ozcET1`XG=Iy(Og>6FGiu&%_{eI9%~UQ=zwuSr z;^pK?B@t^72wuI-Hp@ 8l&aE@l{KHBop(kI!IW1a_j29jQ+winQ=ij)09tmF=Tn4TFr zv(!;A?}n6wCl~o|9bdkJ-T6AYdAH9vM`P;+27h+X-46G!E2T)C=Sqdqo^(bWEjvAv z#o5LpW4h@>PaN)xdBPo;lV6UF84Qf12i{vsrEc3ekWlyDP6+to7@7I7qa|f5J!gtQ zpbNT}iMISTFhXaW&0KEPREBwK7if|yW&dA{5$V_q`r ?ar@n_C zy7dS%1 eVP^+FoWlfCzTzanDg(MZUL^Zu3v-#_0pjo&|bSKE%yr#s7Y5B>x+8*x`_!W zp^mXUC}OZ5mYpkkn`hfQjIuc)TaT2)U?Mrb-;|qys)Z!~3+=^n zo$XGU@aypVIW(Gn3-+xZT`Iw>Vw%?P-}$qjPfbr@FWY3n`qR4wo&eK?8aTJ2P-Kpl ziacf*lWIpSQarTmp`Hg;c>BxK#DvJNyh#2 p`98JI3WHzA76OcZv2H2CHUWZ%_51^r^a}fr?pNalsw{8xPH1KPS zK}C6FuH2)-cW-d{niSv(bykEQ*hA%B(v!-7<0@CFW&lg_l-dnFrZhv5l+owIHgJ*- z_lc++5`ppkjMVpyJA7)nB1fYyTI@F@Us!VW)w)9;a9IoMc)bx4Q@YU}ZA?wC_Ftz- zByQYwCB;GQ?G_s57MD8m^~i4*B#l(IoZn a@KD=Ptv{J>brgB6SQkN0^T^ov=P4M8`=$t^xbK^2P2Y^;wvQj=15U5 z{hOM;C#coR;M!}W$$RsGJ!4r+YJ)@*e$lw^ZmU5<6E{RpANTjFy-+kSFPhy-c<6=Z zx3`bnVpr1PWyITv*b!fN=R7dK<>IZ1sMjd7VfH$SO!Y~A)I;om;SUi<1NoQGdO0F> z yd#Lg}yOJulQpm&TGn;-p~fHgM?5HG1G(p4YKaNEHG7d<@!V z9>Gi;5cprr8X-dJ!rahQRFxRL!DNcU`ouMDl~D${9sUa%{yD&Y0WD)lr&HPt_BQZxAqN@DXxEN zqrqR%AN))MtgQ=) #4tBTVJTS+bSVNd%C;hp-?wTkff)mq#kh~6CDf9ZGekG0C6w0FQ%|D_ `8L9G8-D YViq<|n@BPkt%gc6b?NJ%3lFmy?`gdj+F!-z11bV*ANje;=r zkTc&b*K+B4-skz=`^S6Vf1d67!EAcYbsgt%>_?vaH4&N`N+g7IgcukYBr3}C+87v^ zbQl;|YXn&6e=*Imr^Ucv#88oc@Yoacd%JgB`LqG-3=TKg_C@43kL1Iq>fLIq7iw_7 z ZvB+!<}>~fgAVdL*X-V;<+)@O=gBg% zh469W`OpBO7+K@;zC_)7`EvN%;)U_HmnEXw&N}d++mq}Gq`99|`tY5yw{M#D35g#z zg{<2a->!dd<>&z|pDVsCJW1JIy!9cb{z?8fyN=liNMwFnTd<*iMasFBq5FwDVy-5! z|6Q>``?vpY5%BnZ!}sqyi*qS&ALFSH5n^v1y)^EbEg5?$0^0dB-=%G4)^U$}+V09) z6MZkZ{eZ^ZpaRQ~0M}O^D$MPl*xb*ka(}kFLWj+*`6eVEEcDgG ci#&eqg6 zHcNA$_gLRWNwq@h_M2e1IIL}0AqM(eO7=4|a|^eVcF^me5fVAS{#`CCtm|e09o*c1 zZgQ8b-yOZ4KO{sRD q6kRDE4t4*cxP8AKqHu z!0ReFuQpzw{W|aIi$wgxG4rQeFNo(vl+telNar3zyXbq o%si4l?633c%%I5sefm+<(^) zZ|JzH?J(Z`pk+2yfX*Jn5+^@NL6wtvuqN+1kD5&RO>T%mbc0IQ3&)B($0n>K5*?9A zB{w)}`>1`#S!2Bjn8gDDE_<48+bWVJ3AWr!Y?T(PuUzz; ki0?O>yTWx^Cn|B(My$l>*X08Gx;ZGriBxt8PSlP0#uzAtTpx8AGU z8GU%EAY^E02-q*MsW9>_us8I0G?k>Cl$bPcoPfKVb+6A{i&{tpc+Xa)D7v?%6C9uM zAo<=c6R@R_oz7!MzEs&J+oFjHKO}YQ(f5 )7<;o#v#kX`Of&m#>Q<;TO0MU=y?a*XBND%h!efMx-&>t}lpqs1M4 z_Rs2G9F~9l(m$oUu|ybr$c>GKEz8XbASb1w87co6IiRUPHN32^Bzj`{#qqNzTe%~| zVRqm(*k%75^xK7DVR2|!0_3Bjkh;l)HX&!uYXbpo;|XVRp2(1a_ik*JhkWm4Lhfwp zPuxjgE3j~Iu4m9USAPv=z;=#?%qyrjX$iu?YxE|bBX8*@7RjuiX>G73TC}^Z2lAz? zEs^)$<9>}d``O254nqBMb+bNF(55=xTxKu?ThS?+g|Uh}JI_o7aP2owf(>Bw5L35k zQ3AA9S-B1B(#fO`J|)6Em%KAfXsLWN=NwodN|Yg0 7_62HGQlJq{D>2&ep>y7O6I>FgsUaKHDw4L}Q2lpMi#oIKA zw|EhdK>d2~E(m1wC}v;9#ff0e->YA0rAkuz!*Tb}$ZQq;+=rZy`ZriaQbP)6GU1Q3 zt5{=jx?Q(_njYQ>5Hvbc)N+znH?5x6oSlgEL++b`M>1MPy<(nz$WZj#@Vhj($;*9O zMA4DA*PZ@KU&n?46@j|wi$y91z3z%c?UiTOqE@sRJ~Y>yOFgBZ$vxZiKovci;QP{x zKuz+Buepe8mbX~9HFdA&T-P )I3(=sO|19XHrc0eUaG5hS{R#!*A!B_Csr%gTw^IXg2R_ z(x`#Z+Q(P}IOD1jV$1sA{T9zKu~>*9A%z5O`E5q}Ht8Rn_akB@J(sn(jv~BwTh4C5 zy@DF?6^LApOp?n|I-}in4hKOO%kaxl)b{Pmhl8Wxjy_+J-q5|>2XwDEc}DuVU37-$ zQS7aY-br74kyDM*C!d)mZ-{to%k8=lnR7<5L4w%YqL=744XChIKR5%Gh^x%{aGMMY zo{h3PPKc@#58JtmMmb1V&b<^X2%TVk-hrVa3;+P%nW?mEhmXAb>6<-GhHTu*W`uF< zR-D0+Y^BAV^wim>`S`Fs(34mDGZ)RU^DOB4jv(7{d<&ukN9(arL+uBF%eH3lUWDHX zQE?;oVIvr2>b39dA+**C&ta|K%4o>CsNwY$mZWLso%eyghi7hDb! 0v*d4-pvTRvq@A}08S1QdcYrlnEzLy)%$MEKiM&BUv&7wZ zlbchYaG&;Pg||%OQ7R*ULjadB$_fH7%9<5uJ^j?f@NrMBgmRVbV#K?rvoiX`CA(s( zyVU%emamEE7_h=Y;<5mK1@XJG*b38gJI+BJ(>p+|#6u>Z=BFzk1%ZHw&DK-;3AvR9 z>P&AKna>>P+ BMH{U|BP&?m{soV#;1QP*Xa%_Jyer zxUN}PEMrTC&49SZ1?RQQFa 7)F+Q$Y$sOge9{Ix+Fra%?AOYrOuz$jjxh zT U>k zJ|#73pdmg#^g~9P+7l%;9fvHiNbj9=ZrF^3wKIn>`jZpls%_9H5feB^V-pf@qA?;* z5Q0I3y_&v~MPJ(%OPQ$6T1s!V6XW1>0ojkfXTG80D`(Hm-4_?+`U&{#^1;u7)G6xy z7ISVunOUEc6ZKL~m2D^Za1(Xh!|-Y;tcY?o>#Di+Sh8}zJ^$HZFLy~2F)99(3!A<5 zX0$14Ps#5@TG;LJY!LiR$ Au1yv0nsz+UIR?jlgUb^mfN zlw{7q$0AZOYfqCLOX8C-9>*#1Z^9F9jQV4Sasj;jxiBCk7lPEc{SJ(&86s6xK3bqo zJU${OrJ9U{V(lW+leoK>af@$9eQQ18RR>?0r-l( +u&Y!PK z*m7pD$Rx6+dn+S;*sU|;!>GOa+v+aH4ckK*a= hwSMS!xyEagYVD7YrpNyUsd|F4Dp*ILKYhRPVFN%iqk7UNGJzKux%PxV$!_B z0042s^cndo$f(;Xs@FLEm(t0H6C^BHRVYg8H|%s>dFTzd8t|Jp=Q0|{Am2M@!ve|G z0x)A}|Do_m4BRxnwWSUwSuv%uhEDJ{ODt-una8KH *HS9`LN^}B+#xH5N5kRC^LH%Q5Cbt8`P1i+|M90(q_f6( zf1e$8-1fdicL?4JKk<+__~3Q;Sjbh+lqG_jPP#5y?1C4ye*<>B6dNm;?*zZ?HM$ME zkRF;VOf)2*4i V;_rca8s5Mx4|CgFn@O~v6Gj-5=C)Neb>9=A%~`B!4IoOTSAXG=_*x= zIfW oRl>2#tbf{Hu~LvAikX_)_^}1dfF-uLn5cqkj({hY_TLL zn~dvQc@}tmzmmQjLAH+=Fp->Pn;zaYJxb;^78+q~j037cID-mcA5l*#HHgSPcI}~? za@75ME+7UfODeR-az0_s-_z<9qKGjZH;yc-HRu=EY9_r@Pm5FiIG2sy!DfmCqGPF4YNfNAmwpL!1QFYc2$gAy_Om19A?+Bm<`_tB<5Sm-)GL zhfHhyHs@d{wAPbEBTKG3XqT{w)TNPillklzf>&Y2CW9(+49G>%g#+NKf-4)4$u-4A zN2gZI6;;~Ge@s5_g&6L<{mPuyWY@r~egZ5+muy0zrD`*0 s{$?U&GU9{e%pdeg@{OswM#c-KY zj7Tx_G|lAQy?V xDsAJYiH<7Tcwm>CI^d^c8xs}=i z;q)Xo2cN?IsvNG|v&po{I}B 4Yu!RT6 z`khUmrZ;M~>1YgR%$V`%4|? 1J&BC8A{gNHCL`?z#cKkc*W_Gs59DIPbGJAFrv34T zFzXGguzK&&dx(7S#A($NK~tkXAO*TE|5t>br1XHpTd%HQb-k&~N)H$;weN&RwjVX4 zV*L)xrF}iq7EjeG&vg9GOIs)KQx`Tk2{1`hUN}%&wO&4{93e8AulDF{mOd%~d%EQW zdYO_c22HVMPY00rU96@ybX(0el&6d5e+m%ZDiu|i%PZBZB*nwl4aF+Ol2BMH;+~iE zaxkym8QJWt^?)G{+^cPT1s?{1o!Rm!S^2W${vHMBkU#5NCzm0_RkTPAo42J)+3)Jf z_Sx$&*PYn(?Au&8I6?RwGMl~zC@h1hhT3X*3j1I_1C>S+UuM^|N9I~DwoMKWsHu1$ z=aj)1_yhU0+{25glIf?hk>b0HUSH)L?*?%Z9cSgLdx1Uc<4Np=pexdsUtr$ntEuqw zvQ4NRs@C*$rMcqdQT_X `ra3)`@({1@1HXUgc!QL;>@32tKlzMC~$zdUSt_{ z7uWUihp>_b>;wKzr QOs!e06cL*ksM4 zFivgjnP}b%IvmYL=7+&fa|*6^^!S`+`}90O?pSJSs%Z4;6TVO#KQTl=x9X=>oq8fY z7O!$dPdW#PZgQtk5+`Zfub7>ti2BU&UJi~Mibo9}?A$(05ftA^My8EgPozGxtk*U0 zua$jhK#|Yuy7zz~Utp!`R*$-9wwH T2kDk+&+FX|)~x)ADH z4N1$SQ+v#*Ps>x*x10Z}oh3||I0HPsk 5B#y6;9v{S5PclzA9pESy1~qiGgn zu=Y5keP!^<^m2=Tr@eh8rnwn@y6o6udz%;h#cu7)XR#pjMMY{xofs+=y0x8+v_J6Q zTyQ;EhM(#>@{Fv$`%oHThsoezR)*I@HR 6K|P!1`PQJuW$Z zaR@z`gaN7uOwI~T_edO1w?*`i?sIE6Jai@qw&K$b@e<-B(Iz{5*)Rh+9y}Zt5}kXN zw8aOhW@Ue euv+o8JGJZ-JVDhIVjOyhfgG>r>uSUj7pDl&-lvz{kdzpGp zXDlLyQU`jJ%qN2c(zE@(?%eiSVfTaF&zLLTI5&o&3f?Y61H-aPi(S-ZgbCE7Xa+~X zGt@2aEM-TwqAM5RHAyQ6yL;PJ(!^Zq<6l3!ESz5W!A&nezn9hyq}iix-H1h|Ri3WU za7#R?OsUz!UXxd2)eU0aq&Z_I@p%b;xq5OsH8dgYCOG-v;0|*e8zx0bjJUdp)4vi_ zi&KU7FH_O;XKcr^p(lt=b$j0>L+PV&>HWy(Il1~4t>-UV*9MR)x8J8BstHPc5+vR| z_1Ct~=z>&U91vxn9xuMm*Yf$6eHEy8i9jrZr{9J}c3Q?QTpjdepFy&bU!^ar{k* z3kpd!kvMIKx+8o&jzri;sRw3?QlID01Xj~&+q=C9%aj!Ta28s=px(?+6`kyECfByW zQc@A2X_gS)|7(QfOeo6@0bnWTw1s~^h%;30M7Ol3iDV|8+{Z3mR?y3{M1*f*<01Ej zcdQ0#nM`ujlv#Ak)oy;!1NB+1^B!47>Z>;y1vt~5`u8@>bpP-OLu7X+^wmD<#j~i% zQkz!a8|vc)An)Tn)r^d@@yH;xPat}S;_}(A&`o%&+jh#!C45^KXjP`pgq8O7_%?kK zNW=TCDU$bdBaYum-J}p!YuH4cY?I+KG1rv_HC2m~I(`$rBZ$rQM>zqc!ulhzMQ8i1 z^o22aPP|r)PW4^3YT3`3o@_vEqSj0$&fERo@bKqBd_KoIE@iZ?zmVFz$@|inWIKXR zrXR2$r$?lDFwZUGx8jFtyp6254ZXb9ZC>#>DFU01zz$oQkv97Ai=y>d)XWuh|GaW< zbb0bsJuRuKqopS#y(R>^+mDM!stc1y2V-WQk~4MG{=InPoS~9>;r*#xVG{L{dR5^f z4i%T4g_~L0SijYAG}IJ =Mtmky*M?r%fPrKQTJvgeWI3X&(!2y5civsK!Y}uvQPO@) zg!MH-cGr}0DV !Le9`6IRZB7G zM;cM9%@O%Vw{g5p$GMN 20{(Vw-Pxsf~pGo-0ohkU7~P5(gXyC{#; zezk|xp0&=mWmkCf>H^$vPWoySbrkQ2+IPWl4K;85n#_CFjgP#a5vg`qsAy=F1#z(v zQ?A(~$a+qQEhwsBE8KK6F=^_3FpXN^MfUrhMZ-#nQVlsBQgl?cqeN%Lv;78kMw*X9 z4Tl$edWI)mfOSr#Oq=1H7`WZXYc4V9Ng0zYX^gC}qSs@xr1SkR!;4Mz-UX27wev|^ z;W}eKWnT@(SDV2E#&uvDQ30xF>z=Q!+<+dTm7b^*o!WXC;|QLcp7oEt8uRlU>4aTO zI3BQ>9zaYlNc{RT2D}7Sw}?`-541}VmOihmDJ_{o6!Jg}$F8OTPxBxSmqMHL)?pPP z&f}}hwf930iUzlH41<%G#vjJtq#+%4TLbV@2Zvzb2kY3-uHT 5^eh6k2?MV^ zLhkb}+|RZqm2y6AJgBO+^zr1oP5Kleiz7z9l1QnjuL|L@^|T#hG+=o|AtS#PnR@5B zN?2r&_Ujs#3|mU-X&Mj}UV#i{C&UDRtH#8~m+BfFQY?CCxn#JBCkp#;by-J4_GK_K zp4nCPx56NfVkShZEkq8-rP`vNHYqwX7Ih%bD^Z}TGJhDBg_;U$WpbPtz)x*#XvhL@ zr3o5l93pRooSlCE+P|{5_ZdHk FXeC`qEQYm~ z*fUruo>nP}rGPIafSz>tcqP|`6<4jhkfSDfeqx_-c(K|QF>`VUI{PKpW?Tl8neZ#s zRFP}oaRZVmcL_E9iAsmw*%_hRBo7nM$H~BtYlm>3X?zCHg3FEWsipqQ{vulMdo^DA zevoXk(A9Z629vk+{df#ZOl_EYPSI&V`Cv}965*6V{Ug25_f&fKKq+~w#Yus|nS3&U zYCc@1&HFA|zy$v`u@%DF-o73=*zBO_;%H0Lw?;euhgmm&osV8h4fZXC%BfKB$YAo+ zjuH3&aQb1Q*b;3)4>;_2Sg92ls>j1CH7eBC!ECEpwq7+cPu!U?dr@>N2|QdF3;+O} zv|iZHO+|D)W8y3nVU|!8NnG<49w3YiPtxX8=rbZE1-)y-iZf@bpjX1wVCAcz(9l1~ z^nK5{>9B3`Qe {JGLU`qhDf;Nbj#TGn|5fi+j1~oVFTI z >)b5~Ua!I4#tRZ93>$BU53fLW&+hCY2>!FG$js$4G^YSp4Jy zBosMtFc;-bcwUnodS}eNVN2=a^cXXQUJQ>gYP(CTiZa3qNElK>Ru=VrZ*WrrzHT%_ zHzime`{MSLm{?)n-yORcVVjD7$b04Gn6&&>v6Mtnh~4GNBUHb*2}+Xca}8q5kO8?g z$9vJ!=i9#=!{mWq!mUhL+tv|}Pvw$z^YXzb3NI{dY%JM|GA|%UHBHQH*9wN0tlBbO z_wh;v21ObhP^^S1WsC8zgMRU?MjdGUfM!k=;V|c~scOvKCDu0d+(6vYR+h3SSLJY2 zDeLr0XQI-i&T_3Zyg^j*RECafq|1EyW+Jx}w?&M>JI0W(c?DtaQ%XG=KXM{$mNjNd zhkSWj2NC?pfqwmig6b__;|U8|^!RR_TLBMS3HJ$+_N^iq&5wg|EkB;))dJ$SHo1RF z(UkZ=5u?v}`3dCKQT?6ShA6+2Lh$~wC<-G?=$W_G_RY#yULX^l2&Yc}vhU;_A-Ekn z^1Zi8LvgbU$Qj9yTs*8HarER^kkSvyxMAqrcWU0a;Kc$ta@(!ule 54AP jQ6N|G(Ej4bjR7{2@tJ?{#;BmL!Q zt>o!@+HWQJ-3gdC12L$XQYiB )4Z}!oy=KajLe6%VeWwl2U0;z(omD zQ#BDRn@J2PpbwZoep@iTdM#Z87vXg-S}V{`0;b3rJ=zt>T@QbcyLB%vcI=tCrUQ6% zw}t)+@_4p@hJc&zx8UvkxII(ef+&u?2e+V8z)=a3jZnX3eEBUF4C|D(#Mkdie_8Kg z;7(ERm{g;6L6`fQT#XQis_FC=)2cy&XG-&_5I)v^898V|UU0+D>sYVlJJ~|wEJv&6 zjfkQW4(D4yLRtB30jD~d7Tn^P2}hEP3^d*3R`Ox-+W#R5WpF0dAl4pblZ5cuJL!kz zxvy4tE^i>$Mv#TNax)z|M{9I7nYphHWRLF{hToMH(|;rTj8lxcq8bBz%s~`RzQjby zQN`!X+P2O_w!I1VL~PDWN{KUjMTA_h=VoT+a=is9GW*2H=k!>UEbqQHRQS8&>|Be- z HzMF-^rk2{a(X1V+AJB#$YL?lxop8?<~z|77EIHn2W0%gp+j z1k2t=1vF!@3z#+iliCwzuM*fMCi!y$tuIcC?SZLb(dP6|o)Fnw0#1PQZ~P?zyj`r! zUjOC)LON<-yN0#;8ym`kcpg_Q9<%f2KN(DRYS(f8_bLuuqk{g#2;Gr5?+5!ou++r? zG5DwTa~OjM0@^SF(9|_u#UL=6y5{#8O(4pg{|9wVg@XXN^qLV9i)di-FP;(d9h&nb z2H}j-nfwJgO>&pEn-8#Xs8UM*#+;v2s |OUk9 akE%xx>-N3=z}MJj23noh6i1E`J4%t1pfkvK$0xj0KVt{@XsF zq`mjB>}^a^J&+fdNchEW%Sf@B-c{+jt_VqBQmSXW_Is_>K~~$nz#>L$Ya9xeG1WbR zEiL(pD7u>zkAuZ%KE7j+*9yA-dcQ$g=tin#LIhoEOgE9s*M-liC9Wr67y>Z}oHY9G zKC3X4>Av%H`^v|H`?srtFmeI|??LeUD0RVMs{6jHD=i~$J>`L7qiYh151h(u%O8p) zn;=puRVnT$yrBeX2dn&tKCt2ug8DJA-&G6krh~*Q>=s_GG-PN oht#7py1gJ!8#{&rD--_4#27cZB C)# z3N?ne`c4KVG?FvDZ!V7sz2)fS%L|tS{`G~$Jtf%C8r`RpOZl9P 7(WCro+bZfxn+n!p9T+qQk5+8xQObFU@?n6%y$0b zdV!h8v(1;Af8asxL?t+KKB<~Om6?={hQ$9G*KdnnZM*RPXYq{IrA74v2USIyfJ_di zQ39H>wm| (4c<;i^oW5yl} zU2Bq-{7+^01wfjz1yy4JLQ+UTTo+Sx93b&2SE72pc&ekh%RTLDlq@#@{gh$ad2N^! zc(RISY^*(bQ~ee?--g%c-Wc6rV=QDG%%Qxa2*TCtqh!IhagO?d-Q5q{Ja^#yM1`9D zoCK~M5yXn=lwpBMwPFfbcYb>3z _3nqLew6d7k;44eYdwV}1^}+Q_ zWDejn@-P57IY1@m(GTRk^|+U2L`17hAVb=ws+?pNLx7Ki1OMBx;IFt6U&QssHOcgn zkR}0WHC?2C|9|MKi);a}k-miIPVL4`OL(%ZO4k!SUWg?CvVY)Sv=T+1h{&v==zKL; zeeJ`F7ikE0G+mo}Z`_H#D&~1BZ~pq9zH&9SNYBXh@4q@c2fZ4 3sv`Mwf7EF4%zA1lETuWu{y-A zQ*UeR=S2twR~U%H@dC}Ye}u7%l*+JR|9|_1Vfl2;%*s}CyUX4Ce7+Cy0dzs78!5o^ z>}#O5h4&{GMnaswLOlEK< Wzo9>_)Q1y}UQ+g$C!jG~<}r zfVe-i@l|Q1 z2v&2zN2x!*4yA-yOdBq`Sr0GOs=U!b$K~8rnwM zvj3+ubGI2uz7E&sm+@u`o6w!FjT#=*4iaa*H+IykO+J05ROM3^_{;fU?HIcMUO)f4 zK9?zXs0y`lC^aS7J ANxA?{eEi^%rrW!bPQE0h)oaVWOI`$_Crf+_DSO`sDWdL zk65=_jORxhZT1#_SP>GHOv{pYEj%G1!#y+g_@u!B49}2q63L8ln|lh<2K|I}b7SY) z)82P=-IPiIP@lSB!-7*T{fP8N3YkfimH9$ 4xLFUIuY2EiZKbs z;tn3AuCXn9O*5Wyv>ybDit_$O+rk{k<(>s8P?3>>oD}$sd#7oke7F^EpPGLBO=Q!a z>iP}xziOF FqOX?G>0XDG}yKRa2Tl;E!jzq?5KM_Mpri^GwRb4iLC P|Se?E63PJs|W{-9q=KvjA>)RmgoD4lFmRhnz27f|`zGQ51In_^{gg70YG zA00ZBQ9HH>-5y4FEK$(_-M?z+KgEj=r3`zB-HRh+o&;WuK3*yR@mSvU>iAC8-{ni} z?W53Pv ln=G(4hKom51W2G9`g~?J68}CanbMlGZD`I zq3j`n=P{IwQGjKRE1#)szwh3X4kDQ^rXwwhf!r}#KT_Wh#iVeyY5McI1iwFubP)5{ z@5rBVYCwM^_}{jwNA WU@}Z!en_MsGuYwtE zTd_M0kbV(z3ZuyIDv~c7cUAoD|E2GFR;@i%4)LfN;;$ZhLh5|4L*h~ZmxhpBF~;dH zq&H0*Tcv|a>19bH%^&~BHE5>{Vw+~Zp>j!*&_vaMX^eY%w~eVn;Z2z7zaT04iL*F8 z53Zve6$k4H4)+Eq%{XLefE`-r3Zj|Kp3B zOmq08b0ftzvUm%<>VLtcUhA&Zg)+8ac(&>M3$_A8*JTF_kc$0)<$UR2m9@n4hF z{i#vx{ObhxjIJDj;<~20!0Y4!R0-V=B5SUuM4?wBsME?>Yr$#J1(#0s#
xvS_ImTZheFxL>Z^x^idp#baP=`b8sLhtZxg4p`gb$PrvtbC@fs}9Uw zO#Qx2t^|)U|8A%L=uj{5tliMs*p_2Cs@9yc50=*E+}fDk%3MnE{Z75Xa+(5+Ix BEz;VYfzN@GcNojiQ@JHuIWWG~}QZKA4 zj-J~Gh^MUtw{^L62MDJp5CYgT9Js4z!NcRwgWVRe ETf|HDpb;s~;g7rHr|bGtVbjvB3$be*%Cj6%y9 z?xDiPq=h8_TEpOG&=o+`UQd&wlBczbek6i#2zTAa9}2Bye>rubo+BKTtXohepg@!6 z)XQ`u?*9-ppi_23GY-&~gvrGu(~rk&q#a{vH{ZS91-<$v+HyH(3cD8B<9Dv)vwN65 z(TFI|NLH}mq*X8IBIm!0yP??`&t33sAjR>tF#F_kz>!7i)&5qtXM3^XY>*{Q@-oIJ z3N9v{2t_W;G&vBXQ@|34CBdT#SNCqms0H T~Y0i+prG7>k_eMIO0%z%)s v^FtO4Buj`{ *aT6XCI8}HS)tFj zIfT>7(oN~3-1DNd2i^#MU6){NHBtiQNIA}3>J50Pa?BUz_-h2=ZFDxZRi+N&7p;ZO zMC=1YUVPg%@$@k`jIK{ylx?c6GoynA)1l_i*mSxrlv{7d(bSHM)xk$BXY=@VC|H @Qjy6T*zKI7!p|my~S*Pt!# 0n2UbrR+W%J<^D5X?qR?>C?)ELgrbTi41P*?_mam%E@E0C#(0Z4Td!8M5WI5 zN16~jzMRj6%S?{VVeYFt?B^%_G(iu=*5aPiu9rw#Z|=Nmp_5#qi1Sfq^L&% 7dvxbg$>SI>dh4O%6B$mP=_!8&E&tEUn8QSyXL9Pxpueoq8pbeiow) zj9tCrI7-3TvUhVM?2vHj^V; sPAe9cvTOjLk+sPLM?hruNP )1gX&LD^$SvtdE+rIRur-0e6v~l zU>v$X0KM7yF-nl6zt!<3`n7Sty$i>*n;XWBP-u$hr=86UBZzzoe{=P8G8r;l$#0a} zcNBV&3_Gj7eW~)w>tU=-a~;K~=R^~Hz@vOh?_6xc2CTjFaYr?*iwPJaY*8i<>b8uF zTJehY94y}r4MHvkB(D{G6T-tGi$!aB Yk6!44uWfUhT!Dux!|S zJ~WeLte$LGwf#(PxPzsCjK9T<%K}fJ0|2Q)JH8ye)`Pxlo&L6{S7T6m>wUze?WFt- zQU(T2#(Qf7_@qg3akewkVjTHz>ua6s@bUBeyj-i?&}Rjf7X|cGZYhOdGX#b^NX(o$ zl9!j1doOo>dby{+GF=QST_AsQ9623JUGl{a0z6H2Is536>4n&mvaFnq7|@Zv@gkLs zDpEnZ0xtP=VJVB{R-MnO^nHY|>7g+6oC|uG;CS`m1QhK1l`$tsxKN|Po+^}|SsqAp zaiQyrg%u>jNWk%Ve??Ck-U35V$Qk65zN)m0bf>{faN2X~OA2s`$Ho%Kq-9}Z4s8!D zu*n1xmsSkcrKdVO*GPIJKZT%AhlZ-cLAr0|KB|dXFj{aUseX375}Mbk^zxMljD*X= z%4Z^I(oIq8ey9uRMHpMN0k=z3fOWqS*A@ExEmZ?90`Zagmn$q%CqZE~yUFT$fTtv> zyizA8k327XP{VNKv}nsW^`Wl@;~OQ8a|*E3Js%Sd=x&dnBG*%e8>5KM`)6zHejQF* zS=HYMFoSXN1VXtxtt8HLMzW+Q$3^e?LLX^airgiaFcL8TM8SiO!rH_s_*SBGTT12U zZsYPc5;5C@#OVS&A0!| u_I=;NH4&zxlT&Rnh>+(4Y=ws_UZus $m4GT$icy)t zbnVw^$pfkIC(`cuv|(;K8^b*3J3) #;!y?h7~k=vRycISuyrN=_LGYf6M{4+ zjG8uG9u4#hjbAHY)^^Lq)+Qz31%{~=0Q@5Xpcrcmz*B^Igh8FUbj2t+Nbt2TPuczQ zW*z6<%RZ%vGj+kYd5)dY0y1paxfXf;b)Fo*tb>lm@m{IcvmhE(&Q-JTBCmUh>(kni z-yb0lGd!{oE5O?7M<14NWS@?XoUS}VOs%_(SGrOfgHkT8rlwZjK?~DF`GtI8hAeDC z)+wTBTq1k)KCUUH&ok&Um`i3P19WdAop0|whn=65?q&r!;|i%Ku6`*VdPvDh##WxB zW08TUEzsV{0le-%*sO1KQ|2x(0i v~e5_ iYn7VjsdQzmY;JAk^+b}dperIu5-=0zReN>pzl>_r_mygE?_Ua(Uu zXd|FvkY(1L0>9LI-MRGOU>a Fq = gM1L`Oy*c#CWa`jRW8Q>XG~2pFFaJ0 oV#V{Ty;DkeN_Ozh?%Yr(ofczD_jJ_jB9U{8A_pl z$-{fAHf#Q^$ij!0=CDdiN?eW}%PIQ>?~(O!_TebK)6v_f5!uKbn1t2`ng*98vldvL zl;3z7)Tnjcm*?%-2Ha=#ff2)iEjRvkP&}d1Yc2h21gb8*&)$0uhGSee$k!V9QnRb! z(g~R 2oOy`#mlxYR%KStQES7g zKAon>{W(3vXN#G1-q3xs9S}jfj?WkA%QmZp{iAY0^V xa(S zDdk)qw y<(C&ldwF2jqf z&qC?~2fwwYKTPnzM&?e3yJgB4hj3XB&xT-wA4(L3eme(g+$q%vJ1}v)Ds4Q$FD+N_ zMiw0U9Z~xM#TVwiy-wfw9efdQ{Z3n}^L~!YR{wZAyxX?>N#?Et05Py_a(J$XDmCTq zQ-iLeUvUV5fe{B%`PNs_u#><_uTdg0($gwGr;A9F%X*JWSmuIlloYupcZGnGc0dLn z2h$8CXJ1~8y!?t=jJAzX>{XY|u&KmF0K4xnzB+v*SXouS?^jdUp1^_`jziq*dqNTL zKHBm-r$e*l?nOG>vz^Ni0YfdXb4l!QJ_0YqqU5J3U3@NYNJSL*?u>kt%Hcl6zkN}} zdv;)zS`IG1sy>R`DQ||iz}HqX;f6*ACnFbDre5n(4$V7*116U>R?<5}yR*$T)|(fd z?OY~@V{or^#N~-2GJp_vE@|q%Z9Y;lAbFTLlpJ)`Wj7oL;5Un>oR`7DX3b#6w=z?q zh*vFinp^v5V4s~0bD!%&zcFU@Y@wc?KD7Nh({GJV3gDVd9wx2wbI#|0vM2%fT6gEO ztVusqOQX-uEtt4ytS4LvJjU)j<^ergU!9EvW}kAR)@rlQfUpC5*m(x@%r6D6eO3C{ zdE_#;@WqSd+90mZWNS-%2hma;=#d~4d64?i9niEInSJ!>k?%^a^aaonIqq$xPHXOS z77O0=Lmf(Ag;s+5_zp% _edi$;}}#qN$jEhiM4{IT;_ed zYT31i)Trr_D2Z)IHodx67oznpK5Nz q2M7k>Y+=bETjTr9w^_fdGK8Nh >1*X~A z*YlzR;1`py)8o{Z)5%&=c61ZnBXJm0_*M*ZWeDA$gH;`l9ZT8`ISsJ;bcabE$2{Vk z`wnaQ0NUQT4emla(Uz&+p7dob{Nl3mqdC=%VD>>~Bb3dY)zAc)?kM3m5G{T29(vgi zpUYomk=||KU4V2heBOTdmdiDon_a2Dh>wKPD$b6$l=Z!Vc$mB0hLp41{43SQteIEx zJtP!{7JU!%=>fg}Wlu_20?A8q(S!z6>uU>+#`PvXeXgx56;N4xi5*u4)P$AP&L$FJ z>a#uowr&{_+xt`qMuQJkcQxsIi+yo#Rus9NiX1HaBr~NXjQ)wEw}PS$mAhzbLXk7m zev<=wdf~LZ=LMVK&tXQ~FGoDbs28qM1}W~Nw^Z4D)^XMhOUOpdjBMjuvU{~hw(eo` zw7@YDG0*c8tdkO1x;_ 9fA2$ra&&mzy@3bSR!8bs?9ePvLcIEkSw%a4T+k4BRt$S>yt#mxu-yAMSP(8OlT5skf zOag$s$O>L?c8^pp=wy&x6299w%QAD&Qh8RA;ZTg2PxJ6u)?4(Z);isy_E`)=UXj^q ztbhJq=>rtT>s>lP)#0 @A_Ec9?^xp-}=EO>%v z2k&r-=S0|0&Ty?Q<&bpB%;?Tae_3spM-xdB{N=B` G^f|7-6$qngaR zwG;(}q526(fJhZVDM4x|A_yX71O`Eb3?gk*N+_WRfsty00s=yag>o4Y2BNe;VuOf6 zqM!mw?==BJ2oRFoS7&tQ-u3;MAK(4%UF#0-S}a)Wu(S6*=Xv(#oPG9-+|nEYT0pSL zqUczcwi!k4Ts_;A$PP_fj~{(>`}o>mQ{qBl(re-N+m%r-;#NBqN0B7rCI(VCz#6GT zZdVNr+2km`8!=4mSKQ&4v9o4(+N%;5NBSKn8N~>~5}n96k)Dayt;EJnV$khy-~EL? ztos&>S_B8LKrS7xLT(((K0WjtrUP@<<@E(8pDGnk8$9r~ey;81V?1MNXGhl%lh|9q zsmJvUuD}nN3NtVl<8OY)Kk;AesuZ|6=5|lyM0DcO+1QyYp<6H{CyEGXhuqR6Og+FN zK4o(_kFSqzX^${wuyKJtej{{d2)BegR?##I=c~`bh;dfa3A1 !h-oT_B6%i zfnoawmdH3l^wr(inUaGMSj`yoA#@;Nolam-PfUg^7;-1&Xl?VSX3dUppDS{=3;_z( z>V7msY+r^DmgER_f#|x9^eT^t!_Rn%?ZKeS-?d $e_&&=Yb6NpKanTek^hevlTk~Z;4(XIA|4Xgo3U1A?X`{;|+R&F6JhUQG1 zkd7YPG{MqsC|eVz+^0WqQbI0t)7d{;?657Gx8|LpBMuLyw??_6+&LCu>v8>fOwVlF zTxjCk{v^~b5(ejmW%p8m1|{qkNNcre(y$yYVW}rjJ>Xp3$jWUjw}3m3IQ1@~UkurS z+$s&M4YYMd45xuXxz$2~!YRvOW+EBiL+;>&qfNQ*gmI);Gi>MFyiK&7=u()6_rxP$ z)92e-Jbp92f|og@X$Q8&dY#`yb7|vDD*Gjt6Tkns;cApNI~^OvQXhpR#(eNjplB1B z*qt%$niPFX{CEUm(~B?`6OP^vKG1) Z4|-8!bzxcF){STC+t`hly+4%_2`yg!yE(HmfZ3 zV-4q7`>}^3j1No#wIGzHcD)^oBn1NInRD%E*t*s(<-sepXz9Y|GpTInoi`Tov^wr3 zf&M&g_5zU(Yy|I|56QURdH%XIac85@+ic|`Iy+&xg!VCUZ794gL-j0$Jwa)w&%&70 zqs3!1!k8<8>JJ;ic*7`SinDK9B4%rS+7AcUe;mAwiq%);;TO^n_;L50k^WlPuxEEf z liYV^0ynPmr0Pj0#3osGEb+0dj4x u7~37o~SE{LzL*&aE2Uha~Yd3tsQ<{ zd{I_=nDuPdoc5uf*r|mgO}0G#cs`-)iZ(tjx3OQCxP1iS9k&L5X9kIrry!)!@$|*f z4QJ#UhK}NY*i4^>ZO OJPoZR;C}dSo2GM z6pJVi@4@1ujFOfkpFCUyo(c&lR`5?vxvjjp=6mO|=Cb0_D!5orkaATgXrJ62dcrxx zgAT{K&AW a(!*^Lb;c-!U y`` zQGwiL8fQe4u;|$L!^{Oe F0-x^X{oG3Erq3}d;dTyry=c$8S`z1L2lW-Yz#;m zxha6`jT(lOZRJmub-%SH-IJT8B`t=wbAA9I+9?anZy#ZUtWD?~F7~tVLX}YQ#7O}T z1!x!sf4ZvcoL~?9 ?(`|e3n51(x3FEIS zs$ffsg=eK-4+!NITUrmiaxiYK#dTCqxveGtDWj1R1X&&irp{6gmlT`e&Ax2z=o;x> z!xx)_vS}(N&ORivx6g9mDt;8<5bh&wZm0Ik!5iB~BQ?G)890lrEaV!ojm{)Ybzoyj z+2&1Np15#~?cm@G{TA#tz%i;#?MrhMwY &lmbjV0Jwgl=EU9H=W!gO@>nBhXX zjfILyD`kpXiUjU6>OC(Iy3b6PsUO=|6#7A#A6>hzN{cTutZr%hJh>7ABr i{d+=s_eN_XbS)y< z$exN_`XQ*+T44mFt~H!f+r-&egl)aPagjt1;pRvqp9`}hVj~kCmvq<#^(nT~HUmdi zuGJyu`^l6}#%kFqlCEF3zW0kZxyJ{z2~&-Q!*qhstUmq0D7^pY5=1TQ =l0x`8iqz!UaFVT zhA!7rOh}F<9|ygmoR9A(iz>{*>oR<9(mL8NI%yaeh^xf}J=giZv0y`NBj#5(tFf^( zNl8abnW5uY>ms*3$_ @cLZmOS417CB>XKfMbX3)Jat01e?*fk0d3=Ry_K6#T zlfegL_w5Gr1*__*q`}`_H_h(p2!xJ@E;&5k+3ddDF4C&eYj2L~)=(7-_|q~GI9>6x z2tRYLI`|3C)9PK%itRtO&kP4_0juMKoDYLsBokkTWC4f2r!Bb6+&Ay!ox>Bebl)T_ zq}pi~1f>9#g^-rBKRq5y?2<<)w1>LIL0 (_wG+N)13fTNR^m!w*IVopa2vi6lTrLqeDt-juaSC24%Hw20Q#P=4Z`CBl~& zx2L`L!Ro~6&rUpk(#el m35^V)@lW)8Hc|^^dJvVI~B`uA< zf0e0bC+J8IF@Y$i2l~WrkYlQ0+O3S5`>%655-%#;{hC(o_yb9(+e&g8zl*3H|5fEP zq Xc)L&OrIIF?KHVuA<_&v*#%PSPJlAs zHxZYfBMq(%c5kj?x#Z!hQr*ROLH=1%YT#tcpnO|9!69R54HL&)sEJFF)Ir-^I6yq0 zS3vy^=K6C;Eik=4O9rn8E5%HNvso{pR^O1UQ;cp%LEEXS+!o=L0{1ynO(=nrOJ<>L z1~&G+X?z~gB6yO>X$akU=7?a*ES@P5d40|Scjwa!eGMC4jP8wfarxWmS;9i2sl`s9 z-;=mbG%=R8mPe^Tzb&e-*Atq1x!YPs|5X3mJvwGB$(G70Xw<%$d=L-(o`xN07+$%5 z*DmROpWhMi>IXpAE7z)ETXGNPU5K6=e*BmYm=ZlaML CP|))lRYu`3VQ~n&ONPz?wRjDl_>RegZd!^CzrjWCf*?)dTv9 zwTYAd2*t4%5YB1|HK99?BBgu)V&HD2BHxny{Q<|j-+c@_{05X>433Q~*QuJ?m9kGr zRI@Fsr#Pvdm7{JRZ|qZg{XtTWQ@e8pTJ^tc=Uge6$EyUA7gl?QgT?p9k8B9j)~ugJ za5r$U^$vuCuBTsTP_fj0^@~o;sky1HvTFAN`w~f~iL?`n1A-UGOwN-gSlfKfw#Kn@ zU2I-n0d?TeaY!2sj@7T&^za2w&o!WXink)SZfR0{a`3|e#w8}Qf*)nSVn7*eTRZ4U zJx?U~bk8t{B6_0xqa@ZLp27ZyA37Ar?-sfmXf$OhBufs4D`sD^om^$;-V=kuB25FO zNrV7ZFBPCJX+lBJ1r-)q@;;$0;dOzR^khhrCz<5*V@mY5#Pa1!-R!|tMo$gRX5gIG z{>kPt_#;U@pdtt8U8x3&*&`upr=J!1%USIi y65Gp?XrnDMuu8HNfFw{2I1Ktvx@P`w*sIJ =9{^c$9};l1ZvMkypmGJbG%HNYGeP-(^kNM@xK=rQ+F3zeSkowcr1<&nfW6=#|X zHriQMCciKfF9(g!89dmE0VcKSXy ~Jc75s3l wi@cNg434f_Qb>RQ}apT_pCTu!8uy zs-HkW;z4N=0KJq&SP6CQ|ErJy3JyVFsWTcIBU$*tIILUk`ZTGE>RP$=1parIOTxfWOr~3o{k81BCHbr;Yjewl3j& zeyVTzOf!X_X(mcmPyA2o=rFKBBBAlDTrf|`AxlSmNc*7iKY$posv;)X=q!00e)yn^ z48QjVjsbrxTNXS0VR{DM pMCG^Go1d;Ml<%F=YrR)9d|ejDApZn`E(!rCdtL8& zd~D9)#8>Pd60?;&gy*lw+~+ v6rKEvFv(Wmy0f&R^WQ-5$5V9R`Jex9rE4SNs<82HctPl zFnbk#`PR5-Zt6FB{;VSJlt|v*Y`2Ly5RUOVIs9si2qGEuhlkg~R3yNGMQ$D{Rr>X> zBIx(Cu{%@F{fvmy7-q)uo%`Q-6Zq^*u+6noaoJPWk+Rvr$1GYmyPP@e%}L>8S@fP1 z)So|mpRe_ABejMQi_;S^%)GMo>fzOjVg&Tu!o>pzeh*f*u|_UwuE1-3G;d1Pht)08 zF{`>r_N%Im#nXw@n8^O9^5AcL0658C=6I1xjh)kr%L^0RYfv<@bCUC*Bd&>p35JjM zV3fb{CE)pL5iKcqNp}_Xdy4mAw51K_xP_HdbVf&r$)ub0SmvLUEwjEQlo$DBq@OMZ zAH4NWbGA&^l<>weurx~$`j-4 TK4a_4A{}`BBPU%{QU;|k;m4KAEIn+0O!0| zhYh@KiWki+|7|*mn}OQS|E4?Yf82-v4~Xke`7d3mW?u7c=z!-7LTLQTBV2fFtNCL4 zLaPnRHCON9mx#6fGjsV2=am*X<5xYil)&x_rHk83R?Gq4D1St(f2Zg5)6mphA(zU6 zFEQDIJBx5JmpGMhAuFT1wDJ_n_(5#hvY{#3f}Vdmn{=c_e6k_1 ifpQ&4lf U@>Ukr zl;8NmA~c{H@yMT=e*DWXE%JK))*!=3BvQ8gYI0Y@&9E$~@!S(?z~<${-<42=?j-*^ zg2e8! s|KG(n-;Qzx?V ;MS(`ji-Us7UqLP^ zCZ-{l*G+2R?VV7T esvtLwiVwEUkEYrb+-?E4T99*+l3_{0*% z_yC2e)T2N+S@~xsZ;uIB0OkWP+RAKrxUP;|QwPTP7>+s&y8p==-ozvfeA44+At3Yq zePzJ#z`%6Cb&-+QE#XT`OTca^3WYjkh{9mxfs?1VZzZNX>v6affDjXtdqYOi(b2%s zo2{)aAe>AV_4mqju~)vA- Y=5`ab{w literal 0 HcmV?d00001 diff --git a/build/output/10.png b/build/output/10.png new file mode 100644 index 0000000000000000000000000000000000000000..017c96711fe5643ef99dea466f621cc744023737 GIT binary patch literal 167163 zcmce;dsvMB+BQBVOcYa+DWOTy5N(7?RHLX-)KpYdYATXwi=-q|QX`ciZG@O;uPsFz z(nP5!6_OA_QY7uf@4WM@_kGs!{ITBOdXM!w*0=TjnrY^~@6YwQuJb&v^ZJ}L-@H+L zn(Q R%~jzEI=jr4XxQ3KE9ZB (2x*)b8{tE zfsg@5QBhmFd4A`c?-z 7q1JrS?X$6IZ*NLuoG-ukx~wr=%)J_LP?9OsA;{Qo7v}r;z^s zOt)GhdGb)oM)GA|adEN0IdAVOk3=`6GkGf0eRj09Xo}NB^isM564Qi2Jln&ajOh{# zQl+nz^<+|P*I2m|m8(u)L=#~@^5sxUb0&pMyi Pr=9G}>$ea~IaPv^ $sRkN8W;M$ zF21kx_O>=|Q`4_#d#298rKhB>D@v)ob9-r}la$|^)f4!fo8-T?O;j%ad2vsmN Q1tjarjl `)jiG@l3@zyo`R|IF &;8w0&G2#x3Gds?-`%)^2C9eCn3n z F!n#v0#u&b$4! zG}E`cp`ZP%*poWt-9&uJ X%v>;E z+vjSka )E8e?W@Elk*@N{w9X-GglOjwosSPM8~KnF6&1C%afMhFakZA| zR*I5BSjJ8C?99wH-f!>s-t63muhU$)vTW?@?F(xT=452Bq$Xp pd`e52Hhuc6llSqGwe>Pp)ooJM{`Q=hG m>Q{kF88hw#Cha#^f zEi5{Np+TbYW2iJmbwLESm_#LYlNbxp@lOG|K60P()@KnmPyTNM^xar_s&dlm{lQ=I zYVN&Jdsy=Gg~!HIvPN_xvO&YQuA0T0lRpx9DA||DLnN(kGL1p*ep%eh-xSZJpLyuw z?VZ;*mXSfM&5LUngGYZfZ|U@FHY3)D h^8w0#Xc-YxeBkZIkcv zu=eayI-lB=nwm=dTIlrUAq& ;ioV$V6!(z4;+%2U~20#b5%9FKgfMgZ+E8*G&) zTUih4?jIi=?6`ffqW|9Xq@<+d@;6j6^Yiofcb1c4OqHtMs4;f8X4!TIkM(w))_Yar zyNk5j-TiqUyC!bYrj)?1CD^l*NPHe;B4$KFBo=P)>w7i+aPh@L&+Sb2L?t| !z=$F@@5Z3qg_0^QE*6z=AlzKRM<6V#a6-pDqy!UxNg4uF*S)pbHJ3g+V zgL&m|Ft={HRzPp7D|Oh}9^I?aC@#0!ORjM!p?l|t6(7_;m^_s5QjsCkOe(KdhO!$B z$h1E*XUH$wKsMn}(#UKsc_(+#lytQt^NpwrD<$bH3uT&NHLKbEftA@(sk~H)wHGza z4!tf+b;;}~@;z;J&;F)cSLn#}j49hpmMdGo=_b;hcf+v=`>CJz?CCyxu4YheCHq|5 zda{i64cXvn5B%-Tnu`%10pDG!)Z}VpR_%Q@X{PR_9vzZAhp6gbu#i8$Ja4l<*s(u& zU~WSRFAnjRjM_?jH$K$)XSnNhXJFr2t~!GZ6kv_AKfb?w#O)qOG^gk1r{-(v=?~S! zj4YT;X7v2EFUkUk 0-3=Fr%qn!Lygc~#uaVQb z-y?{+?NadkK<^9xkB{G+-R2+^GHL1zLxtGj@zD$Gf=V}@p1-RhS^K~jo8aK`zOfTC z=9MB)?c0pVB{^%34EJYbWc0S*Y-?#rNHZaehB2njod4_hSYPg)?@Vj! z2>bj!e}Z`%*A__UxOT!M8ozFPncvoSrmPkUdpg zSg7J~=g@Hf8@yWH=i9J}$^1SrAoQ9a@9^UG!M;ZcE21JJwYqW3WSR?>D8W>apJl2v zAeg&93w7z)4W}y`PAPCml|!9JQ3CsJ78XiLNx2l*GK^KEJv=?v`hAR{I9G-U8BmPr zGVIId%4eB_AD^%vUowa_7GaB#xatihY3>O08UF}$(WOi1HpP3N|1Jx(Hd3WO?0Lq& z>U*=vCU ASP+B>C@iY!KR!!&x$>6AM5sMV@G$5tn { zFVF6iT)e$E=R)9B$*-j==gxWLXuk3m)5jovn%-ihzzE+NhF^5dw^^>qE!539kuFof zlVd!1aIB@@Qop=!X=HxDz=wFp-~`|KGfvb*&kMXec@CL&q_fSx!yE5wxUeQ(#a6@f zMd7bsNB(=9yVNJHBx)?4I1;m~?L(KQq49h7?wvb#4oR_1vmU7;r>N*G%g)@~+|f~$ zmcl3?6yEeSew%_+XpfpI-xsY4pgqTAP)nBpGr#e!CG3KznKK4Hxw)g2sOKv%MOG zLMFBqf?YXMSUaVg9vP~hlbzjhCtzUsTh|)Dk6vG%<^B29t%q=YR9AO}_oBGt*)tmp zi(~4WuQf+^{pf8UQaw5nm637I^%Paz8Oz_c!`BRG*Rvg|EzMo&%tN!JRrA&!{*hNR zf0Lpl0d7|$m|k2L^!jKM0Yra)ymC73;X7>2FQvd5sQiPUTkK2yM(XzmPa=_N4cf#` z+}Ba+S|?3+4GJntRbI4cQM%RVfkr)56%}0G70-4c*mSFD>||rb(V@Phf5wNV8uWii z+AqmiweRJ#?Cm#y{rWY1`K?QL?)*YN|Dl_UyT=xu1XwiNXaes4?%jVhGb3ZqzJ0-; z)30GKek~vS+S=M`sF3IN=HB=3-}QcfJDuj90z7o%h8j84I&