Repository: apple/corenet Branch: main Commit: f9f83e616a34 Files: 738 Total size: 7.5 MB Directory structure: gitextract_0z54odcq/ ├── .dockerignore ├── .flake8 ├── .gitattributes ├── .gitignore ├── ACKNOWLEDGEMENTS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── conftest.py ├── corenet/ │ ├── __init__.py │ ├── __main__.py │ ├── __version__.py │ ├── cli/ │ │ ├── __init__.py │ │ ├── entrypoints.py │ │ ├── main.py │ │ ├── main_benchmark.py │ │ ├── main_conversion.py │ │ ├── main_eval.py │ │ ├── main_eval_llmadapters.py │ │ └── main_train.py │ ├── constants.py │ ├── data/ │ │ ├── __init__.py │ │ ├── collate_fns/ │ │ │ ├── __init__.py │ │ │ ├── byteformer_collate_functions.py │ │ │ └── collate_functions.py │ │ ├── data_loaders.py │ │ ├── datasets/ │ │ │ ├── __init__.py │ │ │ ├── audio_classification/ │ │ │ │ ├── __init__.py │ │ │ │ └── speech_commands_v2.py │ │ │ ├── classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_image_classification_dataset.py │ │ │ │ ├── base_imagenet_shift_dataset.py │ │ │ │ ├── coco.py │ │ │ │ ├── imagenet.py │ │ │ │ ├── imagenet_a.py │ │ │ │ ├── imagenet_r.py │ │ │ │ ├── imagenet_sketch.py │ │ │ │ ├── imagenet_synsets.py │ │ │ │ ├── imagenet_v2.py │ │ │ │ ├── places365.py │ │ │ │ └── wordnet_tagged_classification.py │ │ │ ├── dataset_base.py │ │ │ ├── detection/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_detection.py │ │ │ │ ├── coco_base.py │ │ │ │ ├── coco_mask_rcnn.py │ │ │ │ └── coco_ssd.py │ │ │ ├── language_modeling/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_lm.py │ │ │ │ ├── commonsense_170k.py │ │ │ │ └── general_lm.py │ │ │ ├── multi_modal_img_text/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_multi_modal_img_text.py │ │ │ │ ├── flickr.py │ │ │ │ ├── img_text_tar_dataset.py │ │ │ │ └── zero_shot_image_classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_zero_shot_image_classification.py │ │ │ │ ├── imagenet.py │ │ │ │ ├── imagenet_a.py │ │ │ │ ├── imagenet_class_names.py │ │ │ │ ├── imagenet_r.py │ │ │ │ ├── imagenet_sketch.py │ │ │ │ └── templates.py │ │ │ ├── segmentation/ │ │ │ │ ├── __init__.py │ │ │ │ ├── ade20k.py │ │ │ │ ├── base_segmentation.py │ │ │ │ ├── coco_segmentation.py │ │ │ │ ├── coco_stuff.py │ │ │ │ └── pascal_voc.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ ├── common.py │ │ │ ├── text.py │ │ │ └── video.py │ │ ├── io/ │ │ │ ├── __init__.py │ │ │ └── transfer_clients.py │ │ ├── loader/ │ │ │ ├── __init__.py │ │ │ └── dataloader.py │ │ ├── sampler/ │ │ │ ├── __init__.py │ │ │ ├── base_sampler.py │ │ │ ├── batch_sampler.py │ │ │ ├── chain_sampler.py │ │ │ ├── multi_scale_sampler.py │ │ │ ├── utils.py │ │ │ ├── variable_batch_sampler.py │ │ │ ├── video_batch_sampler.py │ │ │ ├── video_clip_batch_sampler.py │ │ │ └── video_variable_seq_sampler.py │ │ ├── text_tokenizer/ │ │ │ ├── __init__.py │ │ │ ├── base_tokenizer.py │ │ │ ├── clip_tokenizer.py │ │ │ └── sentencepiece_tokenizer.py │ │ ├── transforms/ │ │ │ ├── __init__.py │ │ │ ├── audio.py │ │ │ ├── audio_aux/ │ │ │ │ ├── __init__.py │ │ │ │ └── mfccs.py │ │ │ ├── audio_bytes.py │ │ │ ├── base_transforms.py │ │ │ ├── common.py │ │ │ ├── image_bytes.py │ │ │ ├── image_pil.py │ │ │ ├── image_torch.py │ │ │ ├── utils.py │ │ │ └── video.py │ │ └── video_reader/ │ │ ├── __init__.py │ │ ├── base_av_reader.py │ │ ├── decord_reader.py │ │ ├── ffmpeg_reader.py │ │ ├── ffmpeg_utils.py │ │ └── pyav_reader.py │ ├── engine/ │ │ ├── __init__.py │ │ ├── default_trainer.py │ │ ├── detection_utils/ │ │ │ ├── __init__.py │ │ │ └── coco_map.py │ │ ├── eval_detection.py │ │ ├── eval_segmentation.py │ │ ├── evaluation_engine.py │ │ ├── fsdp_trainer.py │ │ ├── segmentation_utils/ │ │ │ ├── __init__.py │ │ │ └── cityscapes_iou.py │ │ └── utils.py │ ├── loss_fn/ │ │ ├── __init__.py │ │ ├── base_criteria.py │ │ ├── classification/ │ │ │ ├── __init__.py │ │ │ ├── base_classification_criteria.py │ │ │ ├── binary_cross_entropy.py │ │ │ ├── cross_entropy.py │ │ │ └── focal_loss.py │ │ ├── composite_loss.py │ │ ├── detection/ │ │ │ ├── __init__.py │ │ │ ├── base_detection_criteria.py │ │ │ ├── mask_rcnn_loss.py │ │ │ └── ssd_multibox_loss.py │ │ ├── distillation/ │ │ │ ├── __init__.py │ │ │ ├── base_distillation.py │ │ │ ├── hard_distillation.py │ │ │ └── soft_kl_distillation.py │ │ ├── language_modeling/ │ │ │ ├── __init__.py │ │ │ ├── base_lm.py │ │ │ ├── cross_entropy.py │ │ │ └── cross_entropy_for_kv_prediction.py │ │ ├── multi_modal_img_text/ │ │ │ ├── __init__.py │ │ │ ├── base_multi_modal_img_text_criteria.py │ │ │ └── contrastive_loss_clip.py │ │ ├── neural_augmentation.py │ │ ├── segmentation/ │ │ │ ├── __init__.py │ │ │ ├── base_segmentation_criteria.py │ │ │ └── cross_entropy.py │ │ └── utils/ │ │ ├── __init__.py │ │ ├── build_helper.py │ │ └── class_weighting.py │ ├── metrics/ │ │ ├── __init__.py │ │ ├── average_precision.py │ │ ├── coco_map.py │ │ ├── confusion_mat.py │ │ ├── image_text_retrieval.py │ │ ├── intersection_over_union.py │ │ ├── metric_base.py │ │ ├── metric_base_test.py │ │ ├── misc.py │ │ ├── multiclass_classification_pr.py │ │ ├── probability_histograms.py │ │ ├── psnr.py │ │ ├── retrieval_cmc.py │ │ ├── stats.py │ │ ├── topk_accuracy.py │ │ └── vqa_preset_score.py │ ├── modeling/ │ │ ├── __init__.py │ │ ├── anchor_generator/ │ │ │ ├── __init__.py │ │ │ ├── base_anchor_generator.py │ │ │ └── ssd_anchor_generator.py │ │ ├── image_projection_layers/ │ │ │ ├── __init__.py │ │ │ ├── attention_pool_2d.py │ │ │ ├── base_image_projection.py │ │ │ ├── global_pool_2d.py │ │ │ └── simple_projection_head.py │ │ ├── layers/ │ │ │ ├── __init__.py │ │ │ ├── activation/ │ │ │ │ ├── __init__.py │ │ │ │ ├── gelu.py │ │ │ │ ├── hard_sigmoid.py │ │ │ │ ├── hard_swish.py │ │ │ │ ├── leaky_relu.py │ │ │ │ ├── prelu.py │ │ │ │ ├── relu.py │ │ │ │ ├── relu6.py │ │ │ │ ├── sigmoid.py │ │ │ │ ├── swish.py │ │ │ │ └── tanh.py │ │ │ ├── adaptive_pool.py │ │ │ ├── base_layer.py │ │ │ ├── conv_layer.py │ │ │ ├── dropout.py │ │ │ ├── embedding.py │ │ │ ├── flash_multi_head_attention.py │ │ │ ├── flatten.py │ │ │ ├── global_pool.py │ │ │ ├── identity.py │ │ │ ├── linear_attention.py │ │ │ ├── linear_layer.py │ │ │ ├── multi_head_attention.py │ │ │ ├── normalization/ │ │ │ │ ├── __init__.py │ │ │ │ ├── batch_norm.py │ │ │ │ ├── group_norm.py │ │ │ │ ├── instance_norm.py │ │ │ │ ├── layer_norm.py │ │ │ │ ├── rms_norm.py │ │ │ │ └── sync_batch_norm.py │ │ │ ├── normalization_layers.py │ │ │ ├── pixel_shuffle.py │ │ │ ├── pooling.py │ │ │ ├── positional_embedding.py │ │ │ ├── positional_encoding.py │ │ │ ├── random_layers.py │ │ │ ├── rotary_embeddings.py │ │ │ ├── single_head_attention.py │ │ │ ├── softmax.py │ │ │ ├── stochastic_depth.py │ │ │ ├── token_merging.py │ │ │ └── upsample.py │ │ ├── matcher_det/ │ │ │ ├── __init__.py │ │ │ ├── base_matcher.py │ │ │ └── ssd_matcher.py │ │ ├── misc/ │ │ │ ├── __init__.py │ │ │ ├── averaging_utils.py │ │ │ ├── box_utils.py │ │ │ ├── common.py │ │ │ └── init_utils.py │ │ ├── models/ │ │ │ ├── __init__.py │ │ │ ├── audio_classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── audio_byteformer.py │ │ │ │ └── base_audio_classification.py │ │ │ ├── base_model.py │ │ │ ├── classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_image_encoder.py │ │ │ │ ├── byteformer.py │ │ │ │ ├── config/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── byteformer.py │ │ │ │ │ ├── efficientnet.py │ │ │ │ │ ├── fastvit.py │ │ │ │ │ ├── mobilenetv1.py │ │ │ │ │ ├── mobilenetv2.py │ │ │ │ │ ├── mobilenetv3.py │ │ │ │ │ ├── mobileone.py │ │ │ │ │ ├── mobilevit.py │ │ │ │ │ ├── mobilevit_v2.py │ │ │ │ │ ├── regnet.py │ │ │ │ │ ├── resnet.py │ │ │ │ │ ├── swin_transformer.py │ │ │ │ │ └── vit.py │ │ │ │ ├── efficientnet.py │ │ │ │ ├── fastvit.py │ │ │ │ ├── mobilenetv1.py │ │ │ │ ├── mobilenetv2.py │ │ │ │ ├── mobilenetv3.py │ │ │ │ ├── mobileone.py │ │ │ │ ├── mobilevit.py │ │ │ │ ├── mobilevit_v2.py │ │ │ │ ├── regnet.py │ │ │ │ ├── resnet.py │ │ │ │ ├── swin_transformer.py │ │ │ │ └── vit.py │ │ │ ├── detection/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_detection.py │ │ │ │ ├── mask_rcnn.py │ │ │ │ ├── ssd.py │ │ │ │ └── utils/ │ │ │ │ ├── __init__.py │ │ │ │ └── rcnn_utils.py │ │ │ ├── fsdp_wrapper.py │ │ │ ├── language_modeling/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_lm.py │ │ │ │ ├── general_gpt.py │ │ │ │ └── kv_prediction.py │ │ │ ├── multi_modal_img_text/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_multi_modal_img_text.py │ │ │ │ └── clip.py │ │ │ ├── segmentation/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_seg.py │ │ │ │ ├── enc_dec.py │ │ │ │ └── heads/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base_seg_head.py │ │ │ │ ├── deeplabv3.py │ │ │ │ ├── pspnet.py │ │ │ │ └── simple_seg_head.py │ │ │ └── video_classification/ │ │ │ ├── __init__.py │ │ │ └── base_video_encoder.py │ │ ├── modules/ │ │ │ ├── __init__.py │ │ │ ├── aspp_block.py │ │ │ ├── base_module.py │ │ │ ├── efficientnet.py │ │ │ ├── fastvit.py │ │ │ ├── feature_pyramid.py │ │ │ ├── flash_transformer.py │ │ │ ├── mobilenetv2.py │ │ │ ├── mobileone_block.py │ │ │ ├── mobilevit_block.py │ │ │ ├── pspnet_module.py │ │ │ ├── regnet_modules.py │ │ │ ├── resnet_modules.py │ │ │ ├── squeeze_excitation.py │ │ │ ├── ssd_heads.py │ │ │ ├── swin_transformer_block.py │ │ │ ├── transformer.py │ │ │ └── windowed_transformer.py │ │ ├── neural_augmentor/ │ │ │ ├── __init__.py │ │ │ ├── neural_aug.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ └── neural_aug_utils.py │ │ └── text_encoders/ │ │ ├── __init__.py │ │ ├── base_text_encoder.py │ │ └── transformer.py │ ├── optims/ │ │ ├── __init__.py │ │ ├── adam.py │ │ ├── adamw.py │ │ ├── base_optim.py │ │ ├── scheduler/ │ │ │ ├── __init__.py │ │ │ ├── base_scheduler.py │ │ │ ├── cosine.py │ │ │ ├── cyclic.py │ │ │ ├── fixed.py │ │ │ ├── multi_step.py │ │ │ └── polynomial.py │ │ └── sgd.py │ ├── options/ │ │ ├── __init__.py │ │ ├── errors.py │ │ ├── opts.py │ │ ├── parse_args.py │ │ └── utils.py │ ├── third_party/ │ │ ├── __init__.py │ │ ├── data/ │ │ │ ├── __init__.py │ │ │ └── text_tokenizer/ │ │ │ ├── __init__.py │ │ │ └── openai_clip_tokenizer.py │ │ └── modeling/ │ │ ├── __init__.py │ │ ├── lora.py │ │ └── ssd_utils.py │ ├── train_eval_pipelines/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── default_train_eval.py │ │ └── fsdp_train_eval.py │ └── utils/ │ ├── __init__.py │ ├── activation_checkpointing_wrapper.py │ ├── check.py │ ├── checkpoint_utils.py │ ├── color_map.py │ ├── common_utils.py │ ├── context_managers.py │ ├── ddp_utils.py │ ├── dict_utils.py │ ├── download_utils.py │ ├── file_logger.py │ ├── fpdb.py │ ├── hf_adapter_utils.py │ ├── import_utils.py │ ├── io_utils.py │ ├── logger.py │ ├── math_utils.py │ ├── object_utils.py │ ├── object_utils_test.py │ ├── pytorch_to_coreml.py │ ├── registry.py │ ├── registry_test.py │ ├── resources.py │ ├── retry_utils.py │ ├── tensor_utils.py │ └── visualization_utils.py ├── mlx_examples/ │ ├── clip/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── clip.py │ │ ├── image_processor.py │ │ ├── main_clip_to_mlx.py │ │ ├── main_test_clip_mlx.py │ │ ├── model.py │ │ ├── requirements.txt │ │ ├── results/ │ │ │ └── .gitkeep │ │ └── tokenizer.py │ ├── open_elm/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── convert.py │ │ ├── inference.py │ │ └── open_elm.py │ └── requirements.txt ├── projects/ │ ├── byteformer/ │ │ ├── README.md │ │ ├── imagenet_file_encodings/ │ │ │ ├── encoding_type=PNG.yaml │ │ │ ├── encoding_type=TIFF.yaml │ │ │ ├── encoding_type=fCHW.yaml │ │ │ └── encoding_type=fHWC.yaml │ │ ├── imagenet_jpeg_q100/ │ │ │ ├── conv_kernel_size=16.yaml │ │ │ ├── conv_kernel_size=32.yaml │ │ │ └── conv_kernel_size=8.yaml │ │ ├── imagenet_jpeg_q60/ │ │ │ ├── conv_kernel_size=16,window_sizes=[128].yaml │ │ │ ├── conv_kernel_size=16,window_sizes=[32].yaml │ │ │ ├── conv_kernel_size=32,window_sizes=[128].yaml │ │ │ ├── conv_kernel_size=32,window_sizes=[32].yaml │ │ │ ├── conv_kernel_size=4,window_sizes=[128].yaml │ │ │ ├── conv_kernel_size=4,window_sizes=[32].yaml │ │ │ ├── conv_kernel_size=8,window_sizes=[128].yaml │ │ │ └── conv_kernel_size=8,window_sizes=[32].yaml │ │ ├── imagenet_jpeg_shuffle_bytes/ │ │ │ ├── mode=cyclic_half_length.yaml │ │ │ ├── mode=random_shuffle.yaml │ │ │ ├── mode=reverse.yaml │ │ │ ├── mode=stride.yaml │ │ │ └── mode=window_shuffle.yaml │ │ ├── imagenet_obfuscation/ │ │ │ ├── width_range=[-10,10].yaml │ │ │ ├── width_range=[-20,20].yaml │ │ │ ├── width_range=[-5,5].yaml │ │ │ └── width_range=[0,0].yaml │ │ ├── imagenet_privacy_preserving_camera/ │ │ │ ├── keep_frac=0.03,conv_kernel_size=4.yaml │ │ │ ├── keep_frac=0.05,conv_kernel_size=4.yaml │ │ │ ├── keep_frac=0.1,conv_kernel_size=4.yaml │ │ │ ├── keep_frac=0.25,conv_kernel_size=8.yaml │ │ │ ├── keep_frac=0.5,conv_kernel_size=16.yaml │ │ │ └── keep_frac=0.75,conv_kernel_size=32.yaml │ │ ├── speech_commands_mp3/ │ │ │ ├── conv_kernel_size=4,window_size=[128].yaml │ │ │ ├── conv_kernel_size=4,window_size=[32].yaml │ │ │ ├── conv_kernel_size=8,window_size=[128].yaml │ │ │ └── conv_kernel_size=8,window_size=[32].yaml │ │ └── speech_commands_wav/ │ │ ├── encoding_dtype=float32,conv_kernel_size=16.yaml │ │ ├── encoding_dtype=float32,conv_kernel_size=32.yaml │ │ ├── encoding_dtype=int16,conv_kernel_size=16.yaml │ │ ├── encoding_dtype=int16,conv_kernel_size=32.yaml │ │ ├── encoding_dtype=int16,conv_kernel_size=8.yaml │ │ ├── encoding_dtype=int32,conv_kernel_size=16.yaml │ │ ├── encoding_dtype=int32,conv_kernel_size=32.yaml │ │ ├── encoding_dtype=uint8,conv_kernel_size=16.yaml │ │ ├── encoding_dtype=uint8,conv_kernel_size=32.yaml │ │ ├── encoding_dtype=uint8,conv_kernel_size=4.yaml │ │ └── encoding_dtype=uint8,conv_kernel_size=8.yaml │ ├── catlip/ │ │ ├── README-multi-label-object-classification.md │ │ ├── README-object-detection.md │ │ ├── README-pretraining.md │ │ ├── README-semantic-segmentation.md │ │ ├── README-single-label-object-classification.md │ │ ├── README.md │ │ ├── image_classification/ │ │ │ ├── imagenet/ │ │ │ │ ├── vit_base.yaml │ │ │ │ ├── vit_base_512x512.yaml │ │ │ │ ├── vit_huge.yaml │ │ │ │ ├── vit_huge_512x512.yaml │ │ │ │ ├── vit_large.yaml │ │ │ │ └── vit_large_512x512.yaml │ │ │ └── places365/ │ │ │ ├── vit_base.yaml │ │ │ ├── vit_base_512x512.yaml │ │ │ ├── vit_huge.yaml │ │ │ ├── vit_huge_512x512.yaml │ │ │ ├── vit_large.yaml │ │ │ └── vit_large_512x512.yaml │ │ ├── multi_label_image_classification/ │ │ │ ├── vit_base.yaml │ │ │ └── vit_large.yaml │ │ ├── object_detection/ │ │ │ ├── maskrcnn_vit_base.yaml │ │ │ ├── maskrcnn_vit_huge.yaml │ │ │ └── maskrcnn_vit_large.yaml │ │ ├── pretraining/ │ │ │ ├── vit_base.yaml │ │ │ ├── vit_huge.yaml │ │ │ └── vit_large.yaml │ │ └── semantic_segmentation/ │ │ ├── deeplabv3_vit_base.yaml │ │ ├── deeplabv3_vit_huge.yaml │ │ └── deeplabv3_vit_large.yaml │ ├── clip/ │ │ ├── README.md │ │ └── clip_vit_base.yaml │ ├── fastvit/ │ │ ├── README.md │ │ └── classification/ │ │ └── fastvit_t8_in1k.yaml │ ├── kv-prediction/ │ │ ├── README.md │ │ ├── openelm/ │ │ │ ├── openelm_1_1B_0_25.yaml │ │ │ ├── openelm_1_1B_0_50.yaml │ │ │ ├── openelm_1_1B_0_75.yaml │ │ │ ├── openelm_1_1B_kvp_c_270M.yaml │ │ │ ├── openelm_1_1B_kvp_c_450M.yaml │ │ │ ├── openelm_1_1B_kvp_lp_0_25.yaml │ │ │ ├── openelm_1_1B_kvp_lp_0_50.yaml │ │ │ ├── openelm_1_1B_kvp_lp_0_75.yaml │ │ │ ├── openelm_3B_kvp_c_1_1B.yaml │ │ │ ├── openelm_3B_kvp_c_270M.yaml │ │ │ ├── openelm_3B_kvp_c_450M.yaml │ │ │ ├── openelm_3B_kvp_lp_0_25.yaml │ │ │ ├── openelm_3B_kvp_lp_0_50.yaml │ │ │ ├── openelm_3B_kvp_lp_0_75.yaml │ │ │ ├── openelm_base_3B_aux_0_25l.yaml │ │ │ ├── openelm_base_3B_aux_0_50l.yaml │ │ │ └── openelm_base_3B_aux_0_75l.yaml │ │ └── triviaqa-template.yaml │ ├── mobilenet_v1/ │ │ ├── README.md │ │ └── classification/ │ │ └── mobilenetv1_1.0_in1k.yaml │ ├── mobilenet_v2/ │ │ ├── README.md │ │ ├── classification/ │ │ │ └── mobilenetv2_1.0_in1k.yaml │ │ └── segmentation/ │ │ └── deeplabv3_ade20k.yaml │ ├── mobilenet_v3/ │ │ ├── README.md │ │ └── classification/ │ │ └── mobilenetv3_large_in1k.yaml │ ├── mobileone/ │ │ ├── README.md │ │ └── classification/ │ │ └── mobileone_s1_in1k.yaml │ ├── mobilevit/ │ │ └── README.md │ ├── mobilevit_v2/ │ │ ├── README.md │ │ ├── classification/ │ │ │ ├── mobilevitv2_2.0_ft_384x384.yaml │ │ │ └── mobilevitv2_2.0_in1k.yaml │ │ ├── detection/ │ │ │ └── mobilevitv2_2.0_ssd_coco.yaml │ │ └── segmentation/ │ │ └── deeplabv3_mobilevitv2_1.0_ade20k.yaml │ ├── openelm/ │ │ ├── README-instruct.md │ │ ├── README-peft.md │ │ ├── README-pretraining.md │ │ ├── README.md │ │ ├── instruction_tuning/ │ │ │ └── openelm-instruct.yaml │ │ ├── peft_configs/ │ │ │ ├── openelm_lora_1_1B.yaml │ │ │ ├── openelm_lora_270M.yaml │ │ │ ├── openelm_lora_270M_eval.yaml │ │ │ ├── openelm_lora_3B.yaml │ │ │ └── openelm_lora_450M.yaml │ │ └── pretraining_configs/ │ │ ├── openelm_1_1B.yaml │ │ ├── openelm_270M.yaml │ │ ├── openelm_3B.yaml │ │ └── openelm_450M.yaml │ ├── range_augment/ │ │ ├── README-classification.md │ │ ├── README-clip.md │ │ ├── README-distillation.md │ │ ├── README-object-detection.md │ │ ├── README-segmentation.md │ │ ├── README.md │ │ ├── classification/ │ │ │ ├── efficientnet_b0.yaml │ │ │ ├── efficientnet_b1.yaml │ │ │ ├── efficientnet_b2.yaml │ │ │ ├── efficientnet_b3.yaml │ │ │ ├── mobilenet_v1.yaml │ │ │ ├── mobilenet_v2.yaml │ │ │ ├── mobilenet_v3.yaml │ │ │ ├── mobilevit_v1.yaml │ │ │ ├── regnety_16gf.yaml │ │ │ ├── resnet_101.yaml │ │ │ ├── resnet_50.yaml │ │ │ ├── se_resnet_50.yaml │ │ │ ├── swin_transformer_small.yaml │ │ │ └── swin_transformer_tiny.yaml │ │ ├── clip/ │ │ │ ├── clip_vit_base.yaml │ │ │ └── clip_vit_huge.yaml │ │ ├── clip_finetune_imagenet/ │ │ │ ├── clip_vit_base.yaml │ │ │ └── clip_vit_huge.yaml │ │ ├── detection/ │ │ │ ├── maskrcnn_efficientnet_b3.yaml │ │ │ ├── maskrcnn_mobilenet_v1.yaml │ │ │ ├── maskrcnn_mobilenet_v2.yaml │ │ │ ├── maskrcnn_mobilenet_v3.yaml │ │ │ ├── maskrcnn_mobilevit.yaml │ │ │ ├── maskrcnn_resnet_101.yaml │ │ │ └── maskrcnn_resnet_50.yaml │ │ ├── distillation/ │ │ │ ├── teacher_resnet101_student_mobilenet_v1.yaml │ │ │ ├── teacher_resnet101_student_mobilenet_v2.yaml │ │ │ ├── teacher_resnet101_student_mobilenet_v3.yaml │ │ │ └── teacher_resnet101_student_mobilevit.yaml │ │ └── segmentation/ │ │ ├── ade20k/ │ │ │ ├── deeplabv3_efficientnet_b3.yaml │ │ │ ├── deeplabv3_mobilenet_v1.yaml │ │ │ ├── deeplabv3_mobilenet_v2.yaml │ │ │ ├── deeplabv3_mobilenet_v3.yaml │ │ │ ├── deeplabv3_mobilevit.yaml │ │ │ ├── deeplabv3_resnet_101.yaml │ │ │ └── deeplabv3_resnet_50.yaml │ │ └── pascal_voc/ │ │ ├── deeplabv3_efficientnet_b3.yaml │ │ ├── deeplabv3_mobilenet_v1.yaml │ │ ├── deeplabv3_mobilenet_v2.yaml │ │ ├── deeplabv3_mobilenet_v3.yaml │ │ ├── deeplabv3_resnet_101.yaml │ │ └── deeplabv3_resnet_50.yaml │ ├── resnet/ │ │ ├── README.md │ │ ├── classification/ │ │ │ └── resnet50_in1k.yaml │ │ └── detection/ │ │ └── ssd_resnet50_coco.yaml │ └── vit/ │ ├── README.md │ └── classification/ │ └── vit_base_in1k.yaml ├── pyproject.toml ├── requirements-optional.txt ├── requirements.txt ├── setup.py ├── tests/ │ ├── __init__.py │ ├── configs.py │ ├── data/ │ │ ├── __init__.py │ │ ├── coco/ │ │ │ └── annotations/ │ │ │ ├── instances_train2017.json │ │ │ └── instances_val2017.json │ │ ├── collate_fns/ │ │ │ ├── __init__.py │ │ │ ├── test_byteformer_collate_fn.py │ │ │ └── test_collate_functions.py │ │ ├── datasets/ │ │ │ ├── __init__.py │ │ │ ├── audio_classification/ │ │ │ │ ├── __init__.py │ │ │ │ └── test_speech_commands_v2.py │ │ │ ├── classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dummy_configs/ │ │ │ │ │ ├── coco.yaml │ │ │ │ │ ├── image_classification_dataset.yaml │ │ │ │ │ ├── imagenet.yaml │ │ │ │ │ ├── imagenet_a.yaml │ │ │ │ │ ├── imagenet_r.yaml │ │ │ │ │ ├── imagenet_sketch.yaml │ │ │ │ │ └── wordnet_tagged_classification.yaml │ │ │ │ ├── mock_coco.py │ │ │ │ ├── mock_imagenet.py │ │ │ │ ├── mock_wordnet_tagged_classification.py │ │ │ │ ├── test_base_image_classification_dataset.py │ │ │ │ ├── test_mock_coco.py │ │ │ │ ├── test_mock_imagenet.py │ │ │ │ └── test_wordnet_tagged_classification.py │ │ │ ├── detection/ │ │ │ │ ├── __init__.py │ │ │ │ ├── mock_coco_mask_rcnn.py │ │ │ │ └── mock_coco_ssd.py │ │ │ ├── language_modeling/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dummy_commonsense_170k.yaml │ │ │ │ ├── dummy_lm_dataset.yaml │ │ │ │ ├── mock_general_lm.py │ │ │ │ ├── test_commonsense_170k.py │ │ │ │ └── test_general_lm.py │ │ │ ├── multi_modal_img_text/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dummy_img_text_tar_dataset.yaml │ │ │ │ ├── mock_img_text_tar_dataset.py │ │ │ │ ├── test_img_text_tar_dataset.py │ │ │ │ └── zero_shot_image_classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dummy_configs/ │ │ │ │ │ ├── imagenet.yaml │ │ │ │ │ ├── imagenet_a.yaml │ │ │ │ │ ├── imagenet_r.yaml │ │ │ │ │ └── imagenet_sketch.yaml │ │ │ │ ├── mock_imagenet.py │ │ │ │ └── test_mock_imagenet.py │ │ │ ├── segmentation/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dummy_ade20k_config.yaml │ │ │ │ ├── dummy_cocostuff_config.yaml │ │ │ │ ├── mock_ade20k.py │ │ │ │ ├── mock_coco_stuff.py │ │ │ │ ├── test_mock_ade20k.py │ │ │ │ └── test_mock_coco_stuff.py │ │ │ ├── test_dataset_base.py │ │ │ ├── test_image_pil.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ ├── test_common.py │ │ │ └── test_video.py │ │ ├── io/ │ │ │ ├── __init__.py │ │ │ └── test_transfer_clients.py │ │ ├── samplers/ │ │ │ ├── __init__.py │ │ │ ├── test_batch_sampler_config.yaml │ │ │ ├── test_chain_sampler.py │ │ │ ├── test_chain_sampler_config.yaml │ │ │ ├── test_data_samplers.py │ │ │ ├── test_multi_scale_sampler_config.yaml │ │ │ ├── test_variable_batch_sampler_config.yaml │ │ │ └── test_video_clip_batch_sampler_config.yaml │ │ ├── text_tokenizer/ │ │ │ ├── __init__.py │ │ │ ├── test_clip_tokenizer.py │ │ │ └── test_openai_clip_tokenizer.py │ │ └── video_reader/ │ │ ├── __init__.py │ │ ├── test_av_reader.py │ │ └── test_ffmpeg_utils.py │ ├── engine/ │ │ ├── __init__.py │ │ ├── dummy_configs/ │ │ │ ├── ade20k_segmentation/ │ │ │ │ └── deeplabv3_mobilenetv2.yaml │ │ │ ├── coco_detection/ │ │ │ │ ├── resnet_mask_rcnn.yaml │ │ │ │ └── resnet_ssd.yaml │ │ │ ├── image_text_clip/ │ │ │ │ └── clip_vit.yaml │ │ │ ├── imagenet_classification/ │ │ │ │ ├── efficientnet_b0.yaml │ │ │ │ ├── mobilevit.yaml │ │ │ │ └── mobilevit_v2.yaml │ │ │ └── language_modeling_gpt/ │ │ │ └── gpt.yaml │ │ └── test_training_engine.py │ ├── loss_fns/ │ │ ├── __init__.py │ │ ├── language_modeling/ │ │ │ ├── __init__.py │ │ │ ├── test_cross_entropy.py │ │ │ └── test_cross_entropy_for_kv_prediction.py │ │ ├── test_class_weighting.py │ │ ├── test_classification_loss.py │ │ ├── test_composite_loss.py │ │ ├── test_contrastive_loss.py │ │ ├── test_detection_loss.py │ │ ├── test_focal_loss.py │ │ ├── test_neural_aug.py │ │ ├── test_neural_aug_compatibility.py │ │ └── test_segmentation_loss.py │ ├── metrics/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── test_coco_map.py │ │ ├── test_image_text_retrieval_metrics.py │ │ ├── test_iou.py │ │ ├── test_misc.py │ │ ├── test_multiclass_classification_pr.py │ │ ├── test_probability_histogram.py │ │ ├── test_psnr.py │ │ ├── test_retrieval_cmc_metrics.py │ │ ├── test_topk_accuracy.py │ │ └── test_vqa_preset_score_metrics.py │ ├── misc/ │ │ ├── __init__.py │ │ ├── dummy_clip_config.yaml │ │ ├── dummy_linear_probe_config.yaml │ │ └── test_common.py │ ├── modeling/ │ │ ├── __init__.py │ │ ├── layers/ │ │ │ ├── __init__.py │ │ │ ├── normalization_layers/ │ │ │ │ ├── __init__.py │ │ │ │ └── test_rms_norm.py │ │ │ ├── test_conv_layer.py │ │ │ ├── test_multi_head_attn.py │ │ │ ├── test_pos_embeddings.py │ │ │ ├── test_rotary_embeddings.py │ │ │ └── test_token_merging.py │ │ ├── models/ │ │ │ ├── __init__.py │ │ │ ├── audio_classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base_audio_classification.py │ │ │ │ └── test_byteformer.py │ │ │ ├── classification/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_byteformer.py │ │ │ │ │ └── vit_config.yaml │ │ │ │ ├── test_byteformer.py │ │ │ │ └── test_vit.py │ │ │ ├── language_modeling/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config/ │ │ │ │ │ ├── gpt_config.yaml │ │ │ │ │ └── kv_prediction_config.yaml │ │ │ │ ├── test_general_gpt.py │ │ │ │ └── test_kv_prediction.py │ │ │ ├── test_activation_checkpointing_wrapper.py │ │ │ ├── test_lora.py │ │ │ └── test_neural_aug_utils.py │ │ ├── modules/ │ │ │ ├── __init__.py │ │ │ ├── test_transformer.py │ │ │ └── test_windowed_transformer.py │ │ └── test_model.py │ ├── optims/ │ │ ├── __init__.py │ │ └── scheduler/ │ │ ├── __init__.py │ │ └── test_scheduler.py │ ├── options/ │ │ ├── __init__.py │ │ ├── test_parse_args.py │ │ └── test_utils.py │ ├── test_conventions.py │ ├── test_utils.py │ ├── transforms/ │ │ ├── __init__.py │ │ ├── test_audio.py │ │ ├── test_audio_bytes.py │ │ ├── test_image.py │ │ ├── test_image_bytes.py │ │ └── test_video.py │ └── utils/ │ ├── __init__.py │ ├── test_check.py │ ├── test_common_utils.py │ ├── test_dict_utils.py │ ├── test_download_utils.py │ ├── test_file_logger.py │ └── test_import_utils.py ├── tools/ │ ├── __init__.py │ └── converter_coco_stuff.py ├── tox.ini └── tutorials/ ├── clip.ipynb ├── guide_slurm_and_multi_node_training.md ├── object_detection.ipynb ├── semantic_segmentation.ipynb └── train_a_new_model_on_a_new_dataset_from_scratch.ipynb ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ # Docker-specific: **/Dockerfile setup_bolt.sh .git .gitignore .dockerignore # Mirroring .gitignore # Note: dockerignore matches paths only from the root dir, while gitignore matches # paths from any nested directory. Thus, you'll need to add **/ for some paths. .vscode/ .coverage *.pyc **/*.pyc __pycache__ **/__pycache__ .DS_STORE **/.DS_STORE .idea *.swp .pytest_cache .mypy_cache .corenet_data_cache build/ results* vision_datasets/ exp_results/ exp_results* results_* *.so **/*.so model_zoo model_zoo/* pipeline.yaml *.egg-info **/*.egg-info venv/ trash/ mlx_model/ .tox/ # The playground_* files get generated by tutorials/train_new_model_on_new_dataset_from_scratch.ipynb **/playground_* ================================================ FILE: .flake8 ================================================ [flake8] max-line-length = 88 extend-ignore = E203 ================================================ FILE: .gitattributes ================================================ *.tar filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *.zstd filter=lfs diff=lfs merge=lfs -text *.ipynb filter=lfs diff=lfs merge=lfs -text *.png filter=lfs diff=lfs merge=lfs -text *.jpeg filter=lfs diff=lfs merge=lfs -text *.jpg filter=lfs diff=lfs merge=lfs -text *.whl filter=lfs diff=lfs merge=lfs -text *.npy filter=lfs diff=lfs merge=lfs -text *.npz filter=lfs diff=lfs merge=lfs -text *.pt filter=lfs diff=lfs merge=lfs -text *.mov filter=lfs diff=lfs merge=lfs -text *.mp4 filter=lfs diff=lfs merge=lfs -text *.pdf filter=lfs diff=lfs merge=lfs -text *.tif filter=lfs diff=lfs merge=lfs -text *.tiff filter=lfs diff=lfs merge=lfs -text *.model filter=lfs diff=lfs merge=lfs -text *.parquet filter=lfs diff=lfs merge=lfs -text *.pkl filter=lfs diff=lfs merge=lfs -text *.safetensors filter=lfs diff=lfs merge=lfs -text ================================================ FILE: .gitignore ================================================ # Note: please mirror changes of this file to .dockerignore. .vscode/ .coverage *.pyc __pycache__ .DS_STORE .idea *.swp .pytest_cache .mypy_cache .corenet_data_cache build/ /results* vision_datasets/ exp_results/ exp_results* results_* *.so model_zoo model_zoo/* pipeline.yaml *.egg-info venv/ trash mlx_model/ .tox/ # The playground_* files get generated by tutorials/train_new_model_on_new_dataset_from_scratch.ipynb playground_* ================================================ FILE: ACKNOWLEDGEMENTS ================================================ Acknowledgements Portions of this Software may utilize the following copyrighted material, the use of which is hereby acknowledged. Facebook (Fairseq) MIT License Copyright (c) Facebook, Inc. and its affiliates. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Eleuther AI (LM Eval Harness) MIT License Copyright (c) 2020 EleutherAI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Hao Gao (pytorch-ssd) MIT License Copyright (c) 2019 Hao Gao Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. HuggingFace (PEFT) Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. Max deGroot, Ellis Brown (ssd.pytorch) MIT License Copyright (c) 2017 Max deGroot, Ellis Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Sachin Mehta (EdgeNets) MIT License Copyright (c) 2021 Sachin Mehta Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. OpenMMLab (mmSegmentation) Copyright 2020 The MMSegmentation Authors. All rights reserved. Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 The MMSegmentation 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. PyTorch (Torchvision) BSD 3-Clause License Copyright (c) Soumith Chintala 2016, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. CLIP (OpenAI) MIT License Copyright (c) 2021 OpenAI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. TIMM Library (PyTorch Image Models) Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Ross Wightman 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. Forked-PDB (Lightning AI) Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. Zhiqiang Hu (LLM Adapters) Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2023 Rohan Taori, Ishaan Gulrajani, Tianyi Zhang, Yann Dubois, Xuechen Li 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. ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the open source team at [opensource-conduct@group.apple.com](mailto:opensource-conduct@group.apple.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html) ================================================ FILE: CONTRIBUTING.md ================================================ # Contribution Guide Thanks for your interest in contributing. This project was released to accompany a research paper for purposes of reproducibility, and beyond its publication there are limited plans for future development of the repository. While we welcome new pull requests and issues please note that our response may be limited. Forks and out-of-tree improvements are strongly encouraged. ## Before you get started By submitting a pull request, you represent that you have the right to license your contribution to Apple and the community, and agree by submitting the patch that your contributions are licensed under the [LICENSE](LICENSE). We ask that all community members read and observe our [Code of Conduct](CODE_OF_CONDUCT.md). ================================================ FILE: LICENSE ================================================ Copyright (C) 2024 Apple Inc. All Rights Reserved. Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple's copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- SOFTWARE DISTRIBUTED IN THIS REPOSITORY: This software includes a number of subcomponents with separate copyright notices and license terms - please see the file ACKNOWLEDGEMENTS. ------------------------------------------------------------------------------- ================================================ FILE: Makefile ================================================ SHELL := /bin/bash YEAR = $$(date +%Y) LAST_YEAR = $$(($(YEAR) - 1)) COLOR_LOG = \033[34m COLOR_INFO = \033[32m COLOR_WARNING = \033[33m COLOR_ERROR = \033[31m COLOR_END = \033[0m SRC_DIRS = corenet tests .PHONY: format install-githooks prepush-check update-copyright-year update-copyright-year: @if [[ "$$CHECK_ONLY" == "" ]]; then \ if ! command -v rg &>/dev/null; then \ printf "$(COLOR_INFO)Installing ripgrep ...$(COLOR_END)\n"; \ if [[ "$$OSTYPE" == "darwin"* ]]; then \ brew install ripgrep; \ else \ sudo --preserve-env apt-get install ripgrep; \ fi; \ fi; \ rg -l "\(C\) $(LAST_YEAR)" \ | grep -v "ACKNOWLEDGEMENTS" \ | xargs -r -n1 -P 10 sed -i.bak.copyright "s/(C) $(LAST_YEAR) Apple/(C) $(YEAR) Apple/g" \ && find . -name '*.bak.copyright' \ | xargs -r -n1 -P 10 rm; \ fi format: format-init-files format-license-headers format-eof-new-lines format-isort format-black format-conventions # Formatting checks succeeded. # The existence of __init__.py files is necessary for the inclusion of packages in the setup.py (i.e. pip-instsallable) package. format-init-files: # Checking missing __init__.py files... @python_files=$$(find $(SRC_DIRS) -iname "*.py"); \ for dir_name in $$(find $(SRC_DIRS) -type d -not -name __pycache__); do \ grep -q "^$$dir_name/" <(echo "$$python_files") || continue; \ init_file="$$dir_name/__init__.py"; \ [[ -f "$$init_file" ]] && continue; \ if [[ "$$CHECK_ONLY" == "1" ]]; then \ printf "$(COLOR_ERROR)Missing $$init_file. $(COLOR_END)\n"; \ else \ touch "$$init_file"; \ printf "$(COLOR_LOG)Added $$init_file. $(COLOR_END)\n"; \ fi \ done format-license-headers: update-copyright-year # Checking missing license headers files... # Read the first 4 lines of each file to check if the Copyright notice header exists. # The Copyright note is usually found on line 3, but some files may have an additional # '#/bin/bash' or '#/usr/bin/env python' header line, hence reading 3+1 lines. @for f in $$(find . -iname "*.py"); do \ [ -s "$$f" ] || continue; \ git check-ignore -q "$$f" && continue; \ export COPYRIGHT_NOTICE_LINES=4; \ (head -$$COPYRIGHT_NOTICE_LINES $$f | grep -q "# *Copyright (C) $(YEAR) Apple Inc. All Rights Reserved.") && continue; \ [[ "$$CHECK_ONLY" == "1" ]] && exit 1; \ sed -i '' -e "1s/^/#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) $(YEAR) Apple Inc. All Rights Reserved.\n#\n\n/" $$f; \ printf "$(COLOR_LOG)Added license header for $$f$(COLOR_END)\n"; \ done format-eof-new-lines: # Ensure newline at the end of all files... # Inspired by https://unix.stackexchange.com/a/161853/55814 @if [[ "$$CHECK_ONLY" == "" ]]; then \ git ls-files -z | while IFS= read -rd '' f; do \ if [[ -f "$$f" ]] && (file --mime-encoding "$$f" | grep -qv binary); then \ tail -c1 < "$$f" | read -r _ || (echo >> "$$f" && printf "$(COLOR_LOG) Added newline at the end of $$f$(COLOR_END)\n"); \ fi; \ done; \ fi format-isort: # Running isort... @if [[ "$$CHECK_ONLY" == "1" ]]; then \ isort --check-only .; \ else \ isort .; \ fi format-black: # Running black formatter... @if [[ "$$CHECK_ONLY" == "1" ]]; then \ black --check .; \ else \ black .; \ fi format-conventions: @if [[ "$$CHECK_ONLY" == "1" ]]; then \ echo "# Checking coding conventions..."; \ convention_test_files=(tests/test_conventions.py); \ [[ -d tests/internal ]] && convention_test_files+=(tests/internal/test_internal_conventions.py); \ export _parallel_args="$$( (python -c "import xdist.plugin" 2>/dev/null && echo '-n 4') || true)"; \ if ! pytest --junit-xml="" -q "$${convention_test_files[@]}" $$_parallel_args; then \ printf "$(COLOR_ERROR) Please manually fix the above convention errors. $(COLOR_END)\n"; \ exit 1; \ fi; \ fi prepush-check: @printf "$(COLOR_LOG)[pre-push hook]$(COLOR_END)\n" @CHECK_ONLY=1 make format || (printf "$(COLOR_ERROR)Formatting checks failed.$(COLOR_END) Please run '$(COLOR_INFO)make format$(COLOR_END)' command, commit, and push again.\n" && exit 1); @if [ -n "$$(git status --porcelain)" ]; then \ printf "$(COLOR_WARNING)Formatting checks succeeded, but please consider committing UNCOMMITTED changes to the following files:$(COLOR_END)\n"; \ git status --short; \ else \ printf "$(COLOR_INFO)Formatting checks succeeded.$(COLOR_END)\n"; \ fi install-githooks: @echo -e "#!/usr/bin/env bash\n" '\ set -euo pipefail\n\ # Check if Git LFS is installed\n\ if ! command -v git-lfs >/dev/null 2>&1; then\n\ echo >&2 "Error: Git LFS is not installed. Please install Git LFS to continue."\n\ exit 1\n\ fi\n\ \n\ git lfs pre-push "$$@"\n\n\ printf "$(COLOR_LOG)[pre-push hook]$(COLOR_END) Running formatting checks and fixes... To skip this hook, please run \"git push --no-verify\".\\n";\n\ if grep -q "^prepush-check:" Makefile 2>/dev/null; then\n\ make prepush-check;\n\ else\n\ printf "$(COLOR_WARNING)WARNING:$(COLOR_END) Skipping the pre-push formatting checks and fixes. The git hook is installed (probably on a different git branch), but Makefile is either missing or old on this branch.\\n";\n\ fi \ ' > "$$(git rev-parse --git-path hooks)/pre-push" chmod +x "$$(git rev-parse --git-path hooks)/pre-push" # Successfully installed the pre-push hook. test-all: ## # Notes: # * Run all tests and set OMP/MKL threads 1 to allow pytest parallelization # * The number of parallel tests will be 10 by default, which is good for running tests # locally. Larger numbers may cause OOM error. If PYTEST_WORKERS environment variable # is already set, the existing value gets used. # * Currently, our tests fail when DDP is enabled. Hence, we set disable gpus for test # by setting CUDA_VISIBLE_DEVICES="". ## PYTEST_WORKERS="$${PYTEST_WORKERS:=10}"; CUDA_VISIBLE_DEVICES="" MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 OMP_NUM_THREADS=1 pytest . -n $$PYTEST_WORKERS $(extra_args) coverage-test-all: PYTEST_WORKERS="$${PYTEST_WORKERS:=10}"; CUDA_VISIBLE_DEVICES="" MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 OMP_NUM_THREADS=1 coverage run -m pytest . -n $$PYTEST_WORKERS $(extra_args) ================================================ FILE: README.md ================================================ # CoreNet: A library for training deep neural networks CoreNet is a deep neural network toolkit that allows researchers and engineers to train standard and novel small and large-scale models for variety of tasks, including foundation models (e.g., CLIP and LLM), object classification, object detection, and semantic segmentation. ## Table of contents * [What's new?](#whats-new) * [Research efforts at Apple using CoreNet](#research-efforts-at-apple-using-corenet) * [Installation](#installation) * [Directory Structure](#directory-structure) * [Maintainers](#maintainers) * [Contributing to CoreNet](#contributing-to-corenet) * [License](#license) * [Relationship with CVNets](#relationship-with-cvnets) * [Citation](#citation) ## What's new? * ***October 2024***: Version 0.1.1 of the CoreNet library includes * [KV Prediction](./projects/kv-prediction/) ## Research efforts at Apple using CoreNet Below is the list of publications from Apple that uses CoreNet. Also, training and evaluation recipes, as well as links to pre-trained models, can be found inside the [projects](./projects/) folder. Please refer to it for further details. * [KV Prediction for Improved Time to First Token](https://arxiv.org/abs/2410.08391) * [OpenELM: An Efficient Language Model Family with Open Training and Inference Framework](https://arxiv.org/abs/2404.14619) * [CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data](https://arxiv.org/abs/2404.15653) * [Reinforce Data, Multiply Impact: Improved Model Accuracy and Robustness with Dataset Reinforcement](https://arxiv.org/abs/2303.08983) * [CLIP meets Model Zoo Experts: Pseudo-Supervision for Visual Enhancement](https://arxiv.org/abs/2310.14108) * [FastVit: A Fast Hybrid Vision Transformer using Structural Reparameterization](https://arxiv.org/abs/2303.14189) * [Bytes Are All You Need: Transformers Operating Directly on File Bytes](https://arxiv.org/abs/2306.00238) * [MobileOne: An Improved One millisecond Mobile Backbone](https://arxiv.org/abs/2206.04040) * [RangeAugment: Efficient Online Augmentation with Range Learning](https://arxiv.org/abs/2212.10553) * [Separable Self-attention for Mobile Vision Transformers (MobileViTv2)](https://arxiv.org/abs/2206.02680) * [CVNets: High performance library for Computer Vision, ACM MM'22](https://arxiv.org/abs/2206.02002) * [MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer, ICLR'22](https://arxiv.org/abs/2110.02178) ## Installation You will need Git LFS (instructions below) to run tests and Jupyter notebooks ([instructions](https://jupyter.org/install)) in this repository, and to contribute to it so we recommend that you install and activate it first. On Linux we recommend to use Python 3.10+ and PyTorch (version >= v2.1.0), on macOS system Python 3.9+ should be sufficient. Note that the optional dependencies listed below are required if you'd like to make contributions and/or run tests. For Linux (substitute `apt` for your package manager): ```bash sudo apt install git-lfs git clone git@github.com:apple/corenet.git cd corenet git lfs install git lfs pull # The following venv command is optional, but recommended. Alternatively, you can create and activate a conda environment. python3 -m venv venv && source venv/bin/activate python3 -m pip install --editable . ``` To install optional dependencies for audio and video processing: ```bash sudo apt install libsox-dev ffmpeg ``` For macOS, assuming you use Homebrew: ```bash brew install git-lfs git clone git@github.com:apple/corenet.git cd corenet cd \$(pwd -P) # See the note below. git lfs install git lfs pull # The following venv command is optional, but recommended. Alternatively, you can create and activate a conda environment. python3 -m venv venv && source venv/bin/activate python3 -m pip install --editable . ``` To install optional dependencies for audio and video processing: ```bash brew install sox ffmpeg ``` Note that on macOS the file system is case insensitive, and case sensitivity can cause issues with Git. You should access the repository on disk as if the path were case sensitive, i.e. with the same capitalization as you see when you list the directories `ls`. You can switch to such a path with the `cd $(pwd -P)` command. ## Directory Structure This section provides quick access and a brief description for important CoreNet directories.
Description Quick Access

Getting Started

Working with the examples is an easy way to get started with CoreNet.
└── tutorials
    ├── train_a_new_model_on_a_new_dataset_from_scratch.ipynb
    ├── guide_slurm_and_multi_node_training.md
    ├── clip.ipynb
    ├── semantic_segmentation.ipynb
    └── object_detection.ipynb

Training Recipes

CoreNet provides reproducible training recipes, in addition to the pretrained model weights and checkpoints for the publications that are listed in projects/ directory. Publication project directories generally contain the following contents: * `README.md` provides documentation, links to the pretrained weights, and citations. * `/.yaml` provides configuration for reproducing the trainings and evaluations.
└── projects
    ├── kv-prediction (*)
    ├── byteformer
    ├── catlip
    ├── clip
    ├── fastvit
    ├── mobilenet_v1
    ├── mobilenet_v2
    ├── mobilenet_v3
    ├── mobileone
    ├── mobilevit
    ├── mobilevit_v2
    ├── openelm
    ├── range_augment
    ├── resnet
    └── vit

(*) Newly released.

MLX Examples

MLX examples demonstrate how to run CoreNet models efficiently on Apple Silicon. Please find further information in the README.md file within the corresponding example directory.
└──mlx_example
    ├── clip
    └── open_elm

Model Implementations

Models are organized by tasks (e.g. "classification"). You can find all model implementations for each task in the corresponding task folder. Each model class is decorated by a `@MODEL_REGISTRY.register(name="", type="")` decorator. To use a model class in CoreNet training or evaluation, assign `models..name = ` in the YAML configuration.
└── corenet
    └── modeling
        └── models
            ├── audio_classification
            ├── classification
            ├── detection
            ├── language_modeling
            ├── multi_modal_img_text
            └── segmentation

Datasets

Similarly to the models, datasets are also categorized by tasks.
└── corenet
    └── data
        └── datasets
            ├── audio_classification
            ├── classification
            ├── detection
            ├── language_modeling
            ├── multi_modal_img_text
            └── segmentation

Other key directories

In this section, we have highlighted the rest of the key directories that implement classes corresponding to the names that are referenced in the YAML configurations.
└── corenet
    ├── loss_fn
    ├── metrics
    ├── optims
    │   └── scheduler
    ├── train_eval_pipelines
    ├── data
    │   ├── collate_fns
    │   ├── sampler
    │   ├── text_tokenizer
    │   ├── transforms
    │   └── video_reader
    └── modeling
        ├── layers
        ├── modules
        ├── neural_augmentor
        └── text_encoders
## Maintainers This code is developed and maintained by Maxwell Horton, Mohammad Sekhavat Yanzi Jin, and Dmitry Belenko. ### Previous Maintainers * Sachin Mehta * Farzad Abdolhosseini ## Contributing to CoreNet We welcome PRs from the community! You can find information about contributing to CoreNet in our [contributing](CONTRIBUTING.md) document. Please remember to follow our [Code of Conduct](CODE_OF_CONDUCT.md). ## License For license details, see [LICENSE](LICENSE). ## Relationship with CVNets CoreNet evolved from CVNets, to encompass a broader range of applications beyond computer vision. Its expansion facilitated the training of foundational models, including LLMs. ## Citation If you find our work useful, please cite the following paper: ``` @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: conftest.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import sys # NOTE: This environment variable should be set before any corenet import. os.environ["CORENET_ENTRYPOINT"] = "pytest" if sys.platform == "darwin": # Necessary to find sox when pytest is run in multiprocess mode. macOS # normally strips DYLD_LIBRARY_PATH when starting subprocesses, as a # security measure. os.environ["DYLD_LIBRARY_PATH"] = "/opt/homebrew/lib" import random import signal from types import FrameType from typing import Optional import numpy as np import pytest import torch from corenet import suppress_known_warnings session_timed_out = False def handle_timeout(signum: int, frame: Optional[FrameType] = None) -> None: global session_timed_out session_timed_out = True # Not calling pytest.exit() directly to capture the output of the test. See: https://stackoverflow.com/a/59234261/1139196 pytest.fail("timeout") def pytest_sessionstart(): suppress_known_warnings() timeout = os.environ.get("PYTEST_GLOBAL_TIMEOUT", "") if not timeout: return if timeout.endswith("s"): timeout = int(timeout[:-1]) elif timeout.endswith("m"): timeout = int(timeout[:-1]) * 60 else: raise ValueError( f"Timeout value {timeout} should either end with 'm' (minutes) or 's' (seconds)." ) signal.signal(signal.SIGALRM, handle_timeout) signal.setitimer(signal.ITIMER_REAL, timeout) def pytest_runtest_logfinish(nodeid, location): if session_timed_out: pytest.exit("timeout") @pytest.fixture(autouse=True) def set_random_seed(request): seed = 1 random.seed(seed) torch.manual_seed(seed) np.random.seed(seed) ================================================ FILE: corenet/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import warnings from corenet.constants import is_external_env, is_test_env from corenet.utils.logger import match_warning_message KNOWN_WARNINGS = [ ## # Torchtext deprecation warning: ## match_warning_message( " /!\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\ Torchtext is deprecated" " and the last released version will be 0.18 (this one)." ), ## # The following warnings are raised by tests/metrics/test_coco_map.py: ## match_warning_message( "Creating a tensor from a list of numpy.ndarrays is extremely slow. Please" " consider converting the list to a single numpy.ndarray with numpy.array()" " before converting to a tensor." ), match_warning_message("unclosed file <"), ## # The following warnings are raised by tests/loss_fns/test_class_weighting.py: ## match_warning_message( "`torch.testing.assert_allclose()` is deprecated since 1.12 and will be removed" " in a future release. Please use `torch.testing.assert_close()` instead. You" " can find detailed upgrade instructions in" " https://github.com/pytorch/pytorch/issues/61844." ), ## # The following warnings are raised by "import torchvision.datasets": ## match_warning_message( "torch.utils._pytree._register_pytree_node is deprecated. Please use" " torch.utils._pytree.register_pytree_node instead." ), ## # The following warnings are raised by "import coremltools" (macOS only): ## match_warning_message( "Call to deprecated create function", "Note: Create unlinked descriptors is going to go away. Please use get/find" " descriptors from generated code or query the descriptor_pool.", ), ] def suppress_known_warnings() -> None: """ Suppresses warnings that are known to be safe for corenet, to avoid overwhelming the standard error outputs (especially with multiple subprocesses). Notes: - We should invoke this function as early as possible (i.e. in corenet/__init__.py) because some of the warnings are during the execution of the import statements. We should suppress the known warnings before importing other modules. - We SHOULD NOT invoke this function when corenet is imported from external libraries because it enters the `warnings.catch_warnings(record=True)` context manager without invoking its __exit__() method. This is only safe when we are not already inside a `with warnings.catch_warnings():` context, which is the case for corenet entrypoints. """ try: # Importing corenet.internal inside the function to avoid cyclic dependency. from corenet.internal import KNOWN_WARNINGS_INTERNAL except ModuleNotFoundError: KNOWN_WARNINGS_INTERNAL = [] known_warnings = KNOWN_WARNINGS + KNOWN_WARNINGS_INTERNAL if len(known_warnings) == 0: return if is_test_env(): # In the test env, convert unsuppressed/unhandled warnings to errors. # Filters listed later take precedence over those listed before them. Invoking # filterwarnings("error") first so that it becomes the default when warning is # no handled by other filters. warnings.filterwarnings("error") warnings.catch_warnings(record=True).__enter__() for known_warning in known_warnings: warnings.filterwarnings("ignore", message=known_warning) if not is_external_env(): suppress_known_warnings() ================================================ FILE: corenet/__main__.py ================================================ ================================================ FILE: corenet/__version__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # version = "0.1.1" ================================================ FILE: corenet/cli/__init__.py ================================================ ================================================ FILE: corenet/cli/entrypoints.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, Tuple # Entrypoints is a mapping from shell executable name to (module, function) pair. # Having too many entrypoints in setup.py limits us our ability to add features or # refactor the code, because users who pull the latest changes will have to re-install # corenet in order for `setup.py` changes to apply. # A better practice is to stop introducing new entrypoints, and add subcommands to the # main `corenet` entrypoint. Currently, `corenet train` is identical to `corenet-train`. entrypoints: Dict[str, Tuple[str, str]] = { "corenet-train": ("corenet.cli.main_train", "main_worker"), "corenet-eval": ("corenet.cli.main_eval", "main_worker"), "corenet-eval-llmadapters": ( "corenet.cli.main_eval_llmadapters", "main_eval_llmadapters", ), "corenet-eval-seg": ("corenet.cli.main_eval", "main_worker_segmentation"), "corenet-eval-det": ("corenet.cli.main_eval", "main_worker_detection"), "corenet-convert": ("corenet.cli.main_conversion", "main_worker_conversion"), "corenet": ("corenet.cli.main", "main"), } console_scripts = [ f"{entrypoint} = {module}:{func}" for entrypoint, (module, func) in entrypoints.items() ] ================================================ FILE: corenet/cli/main.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import importlib from itertools import chain from typing import Dict, List, Optional, Tuple from corenet.cli.entrypoints import entrypoints as oss_entrypoints try: from corenet.internal.cli.entrypoints import entrypoints as internal_entrypoints except ModuleNotFoundError: internal_entrypoints = {} def main(args: Optional[List[str]] = None) -> None: """ We are planning to deprecate `corenet-train`, `corenet-eval`, ... commands for `corenet train` (the dash is removed), `corenet eval`, ... because adding/renaming entrypoints will require `pip install -e .`. Most users don't reinstall corenet after pulling the git repo. Hence, relying on a single entrypoint `corenet` with subcommands is more future proof. """ entrypoints = { k.replace("corenet-", ""): v for k, v in chain(oss_entrypoints.items(), internal_entrypoints.items()) } parser = argparse.ArgumentParser() parser.add_argument("entrypoint", choices=list(entrypoints.keys())) entrypoint_opts, args = parser.parse_known_args(args) module_name, func_name = entrypoints[entrypoint_opts.entrypoint] getattr(importlib.import_module(module_name), func_name)(args) ================================================ FILE: corenet/cli/main_benchmark.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import time from typing import Optional import torch from torch.cuda.amp import autocast from corenet.engine.utils import autocast_fn from corenet.modeling import get_model from corenet.options.opts import get_benchmarking_arguments from corenet.utils import logger from corenet.utils.common_utils import device_setup from corenet.utils.pytorch_to_coreml import convert_pytorch_to_coreml from corenet.utils.tensor_utils import create_rand_tensor def cpu_timestamp(*args, **kwargs): # perf_counter returns time in seconds return time.perf_counter() def cuda_timestamp(cuda_sync=False, device=None, *args, **kwargs): if cuda_sync: torch.cuda.synchronize(device=device) # perf_counter returns time in seconds return time.perf_counter() def step( time_fn, model, example_inputs, autocast_enable: False, amp_precision: Optional[str] = "float16", ): start_time = time_fn() with autocast_fn(enabled=autocast_enable, amp_precision=amp_precision): model(example_inputs) end_time = time_fn(cuda_sync=True) return end_time - start_time def main_benchmark(): # set-up opts = get_benchmarking_arguments() # device set-up opts = device_setup(opts) norm_layer = getattr(opts, "model.normalization.name", "batch_norm") if norm_layer.find("sync") > -1: norm_layer = norm_layer.replace("sync_", "") setattr(opts, "model.normalization.name", norm_layer) device = getattr(opts, "dev.device", torch.device("cpu")) if torch.cuda.device_count() == 0: device = torch.device("cpu") time_fn = cpu_timestamp if device == torch.device("cpu") else cuda_timestamp warmup_iterations = getattr(opts, "benchmark.warmup_iter", 10) iterations = getattr(opts, "benchmark.n_iter", 50) batch_size = getattr(opts, "benchmark.batch_size", 1) mixed_precision = ( False if device == torch.device("cpu") else getattr(opts, "common.mixed_precision", False) ) mixed_precision_dtype = getattr(opts, "common.mixed_precision_dtype", "float16") # load the model model = get_model(opts) model.eval() # print model information model.info() example_inp = create_rand_tensor(opts=opts, device="cpu", batch_size=batch_size) # cool down for 5 seconds time.sleep(5) if getattr(opts, "benchmark.use_jit_model", False): converted_models_dict = convert_pytorch_to_coreml( opts=None, pytorch_model=model, input_tensor=example_inp, jit_model_only=True, ) model = converted_models_dict["jit"] model = model.to(device=device) example_inp = example_inp.to(device=device) model.eval() with torch.no_grad(): # warm-up for i in range(warmup_iterations): step( time_fn=time_fn, model=model, example_inputs=example_inp, autocast_enable=mixed_precision, amp_precision=mixed_precision_dtype, ) n_steps = n_samples = 0.0 # run benchmark for i in range(iterations): step_time = step( time_fn=time_fn, model=model, example_inputs=example_inp, autocast_enable=mixed_precision, amp_precision=mixed_precision_dtype, ) n_steps += step_time n_samples += batch_size logger.info( "Number of samples processed per second: {:.3f}".format(n_samples / n_steps) ) if __name__ == "__main__": main_benchmark() ================================================ FILE: corenet/cli/main_conversion.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os from typing import List, Optional import coremltools as ct import torch from corenet.constants import TMP_RES_FOLDER from corenet.modeling import get_model from corenet.options.opts import get_conversion_arguments from corenet.utils import logger from corenet.utils.checkpoint_utils import CHECKPOINT_EXTN from corenet.utils.pytorch_to_coreml import convert_pytorch_to_coreml def main_worker_conversion(args: Optional[List[str]] = None): opts = get_conversion_arguments(args=args) # set coreml conversion flag to true setattr(opts, "common.enable_coreml_compatible_module", True) norm_layer = getattr(opts, "model.normalization.name", "batch_norm") if norm_layer.find("sync") > -1: norm_layer = norm_layer.replace("sync_", "") setattr(opts, "model.normalization.name", norm_layer) model = get_model(opts) model_name = model.__class__.__name__ model.eval() coreml_extn = getattr(opts, "conversion.coreml_extn", "mlmodel") results_folder = getattr(opts, "common.results_loc", TMP_RES_FOLDER) if not os.path.isdir(results_folder): os.makedirs(results_folder) model_dst_loc = "{}/{}.{}".format(results_folder, model_name, coreml_extn) if os.path.isfile(model_dst_loc): os.remove(model_dst_loc) try: convert_to = "mlprogram" if coreml_extn == "mlpackage" else "neuralnetwork" minimum_deployment_target = getattr( opts, "conversion.minimum_deployment_target" ) if minimum_deployment_target is not None: minimum_deployment_target = ct.target[minimum_deployment_target] compute_precision = getattr(opts, "conversion.compute_precision") if compute_precision is not None: compute_precision = ct.precision[compute_precision] converted_models_dict = convert_pytorch_to_coreml( opts=opts, pytorch_model=model, convert_to=convert_to, minimum_deployment_target=minimum_deployment_target, compute_precision=compute_precision, ) coreml_model = converted_models_dict["coreml"] jit_model = converted_models_dict["jit"] jit_optimized = converted_models_dict["jit_optimized"] coreml_model.save(model_dst_loc) torch.jit.save( jit_model, model_dst_loc.replace(f".{coreml_extn}", f"_jit.{CHECKPOINT_EXTN}"), ) jit_optimized._save_for_lite_interpreter( model_dst_loc.replace(f".{coreml_extn}", f"_jit_opt.{CHECKPOINT_EXTN}") ) logger.log("PyTorch model converted to CoreML successfully.") logger.log("CoreML model location: {}".format(model_dst_loc)) except Exception as e: logger.error( "PyTorch to CoreML conversion failed. See below for error details:\n {}".format( e ) ) if __name__ == "__main__": main_worker_conversion() ================================================ FILE: corenet/cli/main_eval.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional from corenet.options.opts import get_training_arguments from corenet.train_eval_pipelines import ( TRAIN_EVAL_PIPELINE_REGISTRY, BaseTrainEvalPipeline, ) def main(train_eval_pipeline: BaseTrainEvalPipeline): """ This function will be invoked on each gpu worker process. Args: train_eval_pipeline: Provides major pipeline components. The class to be used is configurable by "--train-eval-pipeline.name" opt. By default, an instance of ``train_eval_pipelines.TrainEvalPipeline`` will be passed to this function. """ evaluation_engine = train_eval_pipeline.evaluation_engine evaluation_engine.run() def main_worker(args: Optional[List[str]] = None): opts = get_training_arguments(args=args) pipeline_name = getattr(opts, "train_eval_pipeline.name") train_eval_pipeline = TRAIN_EVAL_PIPELINE_REGISTRY[pipeline_name](opts=opts) launcher = train_eval_pipeline.launcher launcher(main) # for segmentation and detection, we follow a different evaluation pipeline that allows to save the results too def main_worker_segmentation(args: Optional[List[str]] = None, **kwargs): from corenet.engine.eval_segmentation import main_segmentation_evaluation main_segmentation_evaluation(args=args, **kwargs) def main_worker_detection(args: Optional[List[str]] = None, **kwargs): from corenet.engine.eval_detection import main_detection_evaluation main_detection_evaluation(args=args, **kwargs) if __name__ == "__main__": main_worker() ================================================ FILE: corenet/cli/main_eval_llmadapters.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ Evaluate commonsense reasoning performance on 8 commonsense reasoning tasks, collectively called "CommonSense 170k" in LLM-Adapters . Code is adapted from https://github.com/AGI-Edgerunners/LLM-Adapters In addition to the generation-style evaluation used by LLM-Adapters, we add a multiple-choice-style evaluation. This massively improves results for small models. Currently, this only supports the LLama tokenizer. We may add support for other tokenizers in the future. """ import collections import copy import json import os import random import re from typing import Any, Dict, List, Optional, Tuple import numpy as np from tqdm import tqdm from corenet.data.datasets.language_modeling import commonsense_170k from corenet.data.text_tokenizer import build_tokenizer # Needs to be imported in a special way due to the hyphenated name. try: llmadapters = __import__("LLM-Adapters.commonsense_evaluate") except: llmadapters = None import argparse import torch from corenet.options.opts import get_lm_eval_arguments from corenet.utils import hf_adapter_utils, logger from corenet.utils.download_utils import get_local_path try: # For multiple-choice-style evaluation. from lm_eval.models.huggingface import HFLM except: HFLM = object try: from transformers import AutoTokenizer, GenerationConfig, LlamaTokenizer except ModuleNotFoundError as mnfe: LlamaTokenizer = None AutoTokenizer = None GenerationConfig = None class CoreNetLMEvalWrapper(HFLM): """ A wrapper to build a CoreNet model that inherits the HFLM API. Args: opts: The global arguments object. """ def __init__(self, opts: argparse.Namespace) -> None: device = "cuda" if torch.cuda.is_available() else "cpu" hf_config = hf_adapter_utils.CorenetToHFPretrainedConfig(**vars(opts)) tokenizer_path = getattr(opts, f"text_tokenizer.sentence_piece.model_path") tokenizer_path = get_local_path(opts, tokenizer_path) # Currently, we only support LLamaTokenizer for this evaluation. hf_tokenizer = LlamaTokenizer.from_pretrained(tokenizer_path) vocab_size = hf_tokenizer.vocab_size hf_model = hf_adapter_utils.CorenetToHFPretrainedModel(hf_config, vocab_size) hf_model.to(device=device) # To ensure padding and batching don't cause issues, for now we only support # a batch_size of 1. In some cases, our code handles position ids differently # than other codebases, so we are extra cautious. batch_size = 1 super().__init__( pretrained=hf_model, tokenizer=hf_tokenizer, batch_size=batch_size, max_length=getattr(opts, "dataset.language_modeling.sequence_length"), trust_remote_code=True, add_bos_token=getattr(opts, "lm_eval_wrapper.add_sot_token"), ) self.opts = opts def main_eval_llmadapters(args: Optional[List[str]] = None) -> None: """Main entry point for evaluation using LLM Adapters. This differs from the lm-eval-harness because it uses a different prompting strategy. We currently only support commonsense reasoning tasks. Args: args: A list of strings, as input on the command line. """ opts = get_lm_eval_arguments(args=args) model_eval_wrapper = CoreNetLMEvalWrapper(opts) tasks = getattr(opts, "llmadapters_evaluation.datasets") dataset_dir = getattr(opts, "llmadapters_evaluation.dataset_dir") device = "cuda" if torch.cuda.is_available() else "cpu" results_loc = getattr(opts, "common.results_loc") limit = getattr(opts, "llmadapters_evaluation.limit") if limit is None: limit = int(1e9) multiple_choice = getattr(opts, "llmadapters_evaluation.multiple_choice") os.makedirs(results_loc, exist_ok=True) if multiple_choice: main_func = main_multiple_choice else: main_func = main_generation results = {} for task in tasks: save_file = f"{results_loc}/{task}.json" results[task] = main_func( task, dataset_dir, save_file, model_eval_wrapper, model_eval_wrapper.tokenizer, device, limit=limit, ) with open(f"{results_loc}/results.json", "w+") as f: json.dump(results, f, indent=4) ### Functions for generation-style evaluation. def main_generation( dataset_name: str, dataset_dir: str, save_file: str, model: CoreNetLMEvalWrapper, tokenizer: AutoTokenizer, device: str, limit: int = 1e9, ) -> None: """ Run generation-style evaluation for the given dataset and model. Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters Args: dataset_name: The name of the dataset. E.g. "boolq" or "piqa". dataset_dir: The directory which contains a dataset with the given name. save_file: The path to which to save the results. model: The model to evaluate. tokenizer: The tokenizer to use with the model. device: The device on which to evaluate. limit: The maximum number of samples to process. """ dataset = json.load(open(os.path.join(dataset_dir, dataset_name, "test.json"), "r")) # Shuffle the data. This is mainly useful if the ``limit'' # option is used. This way, results will be sampled from # throughout the validation set. random.seed(83652) random.shuffle(dataset) dataset = dataset[:limit] total = len(dataset) correct = 0 seen = 0 output_data = [] pbar = tqdm(total=total) for idx, elem in enumerate(dataset): seen += 1 instruction = elem.get("instruction") output = evaluate_sample_with_generation(model, tokenizer, instruction, device) label = elem.get("answer") is_correct = False predict = extract_answer_from_generation(dataset_name, output) if label == predict: correct += 1 is_correct = True new_elem = copy.deepcopy(elem) new_elem["output_pred"] = output new_elem["pred"] = predict new_elem["is_correct"] = is_correct output_data.append(new_elem) logger.info(f"EXAMPLE:") logger.info(f'> INSTRUCTION: {elem["instruction"]}') logger.info(f"> OUTPUT: {output}") logger.info(f"> PREDICTION: {predict}") logger.info(f"> LABEL: {label}") logger.info("---------------") logger.info(f"\rtest:{idx + 1}/{total} | accuracy: {correct / seen}") logger.info("---------------") with open(save_file, "w+") as f: json.dump(output_data, f, indent=4) pbar.update(1) pbar.close() logger.info("\n") logger.info("Test finished.") return {"acc": correct / seen} def evaluate_sample_with_generation( model: CoreNetLMEvalWrapper, tokenizer: AutoTokenizer, instruction: str, device: str, temperature: float = 0.1, top_p: float = 0.75, top_k: int = 40, num_beams: int = 4, max_new_tokens: int = 32, **kwargs: Dict[str, Any], ) -> str: """ Evaluate a sample with the given model. Adapted from LLM-Adapters. Args: model: The model to evaluate. tokenizer: The tokenizer to use with the model. instruction: A common sense reasoning input. device: The device on which to run. temperature: The temperature parameter for generation. top_p: The top_p parameter for generation. top_k: The top_k parameter for generation. num_beams: The number of beams to use in generation. max_new_tokens: The maximum number of tokens to generate. kwargs: Additional kwargs to pass to the GenerationConfig. """ prompt = llmadapters.commonsense_evaluate.generate_prompt(instruction) tokenized_inputs = tokenizer(prompt, return_tensors="pt", padding=True) input_ids = tokenized_inputs["input_ids"].to(device) generation_config = GenerationConfig( temperature=temperature, top_p=top_p, top_k=top_k, num_beams=num_beams, **kwargs, ) with torch.no_grad(): generation_output = model._model.generate( input_ids=input_ids, generation_config=generation_config, return_dict_in_generate=True, output_scores=True, max_new_tokens=max_new_tokens, use_cache=False, ) # The batch size is 1. We remove the batch dimension. (s,) = generation_output.sequences output = tokenizer.decode(s, skip_special_tokens=True) output = output.split("### Response:")[1].strip() return output def extract_answer_from_generation(dataset: str, sentence: str) -> str: """ Extract the multiple-choice answer from a sentence output by the model. Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters Args: dataset: The name of the dataset. sentence: The sentence from which to extract the answer. Returns: A string representing the answer. """ if dataset == "boolq": sentence_ = sentence.strip() pred_answers = re.findall(r"true|false", sentence_) if not pred_answers: return "" return pred_answers[0] elif dataset == "piqa": sentence_ = sentence.strip() pred_answers = re.findall(r"solution1|solution2", sentence_) if not pred_answers: return "" return pred_answers[0] elif dataset in ["social_i_qa", "ARC-Challenge", "ARC-Easy", "openbookqa"]: sentence_ = sentence.strip() pred_answers = re.findall(r"answer1|answer2|answer3|answer4|answer5", sentence_) if not pred_answers: return "" return pred_answers[0] elif dataset == "hellaswag": sentence_ = sentence.strip() pred_answers = re.findall(r"ending1|ending2|ending3|ending4", sentence_) if not pred_answers: return "" return pred_answers[0] elif dataset == "winogrande": sentence_ = sentence.strip() pred_answers = re.findall(r"option1|option2", sentence_) if not pred_answers: return "" return pred_answers[0] else: raise ValueError(f"Invalid dataset {dataset}.") ### Functions for MC-style evaluation. def main_multiple_choice( dataset_name: str, dataset_dir: str, save_file: str, model: CoreNetLMEvalWrapper, tokenizer: AutoTokenizer, device: str, limit: int = 1e9, ) -> None: """ Run multiple-choice style evaluation. NOTE: The tokenizer and device are unused, but are passed to make the API consistent with @main_generation. Args: dataset_name: The name of the dataset. E.g. "boolq" or "piqa". dataset_dir: The directory which contains a dataset with the given name. save_file: The path to which to save the results. model: The model to evaluate. tokenizer: The tokenizer to use with the model. device: The device on which to evaluate. limit: The maximum number of samples to process. """ dataset = json.load(open(os.path.join(dataset_dir, dataset_name, "test.json"), "r")) # Shuffle the data. This is mainly useful if the ``limit'' # option is used. This way, results will be sampled from # throughout the validation set. random.seed(83652) random.shuffle(dataset) dataset = dataset[:limit] total = len(dataset) correct = 0 correct_norm = 0 seen = 0 output_data = [] pbar = tqdm(total=total) for idx, elem in enumerate(dataset): seen += 1 chosen_value, chosen_norm_value = evaluate_likelihood(model, elem) label = elem.get("answer") is_correct = False is_correct_norm = False if label == chosen_value: correct += 1 is_correct = True if label == chosen_norm_value: correct_norm += 1 is_correct_norm = True new_elem = copy.deepcopy(elem) new_elem["output_pred"] = chosen_value new_elem["output_norm_pred"] = chosen_norm_value new_elem["is_correct"] = is_correct new_elem["is_correct_norm"] = is_correct_norm output_data.append(new_elem) logger.info("EXAMPLE:") logger.info(f"INSTRUCTION: {elem['instruction']}") logger.info(f"OUTPUT: {chosen_value}") logger.info(f"OUTPUT NORM: {chosen_norm_value}") logger.info(f"LABEL: {label}") logger.info("---------------") logger.info( f"\rtest:{idx + 1}/{total} | accuracy: {correct / seen} | accuracy norm {correct_norm / seen}" ) logger.info("---------------") with open(save_file, "w+") as f: json.dump(output_data, f, indent=4) pbar.update(1) pbar.close() logger.info("\n") logger.info("Test finished.") return {"acc": correct / seen, "acc_norm": correct_norm / seen} def evaluate_likelihood( model: CoreNetLMEvalWrapper, data: Dict[str, str] ) -> Tuple[str, str]: """ Evaluate the likelihood of all possible answers for a prompt. Return the most likely one. Args: model: The model to use for evaluation. data: The data point to use. It contains the prompt and all possible answers. It contains the following keys: "instruction", "input", "output", "answer". Returns: A tuple containing the strings representing the most likely answers as measured by maximum loglikelihood and maximum normalized loglikelihood. """ # Generate the set of possible instructions. requests = get_loglikelihood_inputs(data) model_outputs = model.loglikelihood(requests) # Get the log likelihoods and the most likely answer.. likelihoods = [o[0] for o in model_outputs] index = np.argmax(likelihoods) output = requests[index].args[1].split(" ")[-1] # Get the log likelihoods (normalized by response length) # and the most likely answer. normalized_likelihoods = [ likelihoods[i] / len(requests[i].args[1]) for i in range(len(requests)) ] index = np.argmax(normalized_likelihoods) output_norm = requests[index].args[1].split(" ")[-1] return output, output_norm Request = collections.namedtuple("Request", "args") def get_loglikelihood_inputs(data: Dict[str, str]) -> List[Request]: """ Helper function to create the inputs to the model's loglikelihood function. Args: data: The data point to use. It contains the prompt and all possible answers. It contains the following keys: "instruction", "input", "output", "answer". Returns: A list of Requests for the loglikelihood function. """ def generate_response(response_value): return f"the correct answer is {response_value}" possible_answers = [] instruction = data["instruction"] instruction_end = instruction.split("\n")[-1] if re.match(".*Answer format: true/false", instruction_end): possible_answers = ["true", "false"] else: for word in ["answer", "ending", "option", "solution"]: if re.match(rf".*Answer format: .*{word}(\d)$", instruction_end): num_answers = int(instruction_end[-1]) possible_answers = [f"{word}{num}" for num in range(1, num_answers + 1)] if len(possible_answers) == 0: raise ValueError(f"Could not find answer type.") context = commonsense_170k.generate_prompt_and_response( {"instruction": instruction, "output": "", "input": ""} ) request = [] for elem in possible_answers: obj = Request(((context, generate_response(elem)))) request.append(obj) return request if __name__ == "__main__": main_eval_llmadapters() ================================================ FILE: corenet/cli/main_train.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional from torch.distributed.elastic.multiprocessing import errors from corenet.options.opts import get_training_arguments from corenet.train_eval_pipelines import ( TRAIN_EVAL_PIPELINE_REGISTRY, BaseTrainEvalPipeline, ) @errors.record def callback(train_eval_pipeline: BaseTrainEvalPipeline) -> None: """ This function will be invoked on each gpu worker process. Args: train_eval_pipeline: Provides major pipeline components. The class to be used is configurable by "--train-eval-pipeline.name" opt. By default, an instance of ``train_eval_pipelines.TrainEvalPipeline`` will be passed to this function. """ train_sampler = train_eval_pipeline.train_sampler train_eval_pipeline.training_engine.run(train_sampler=train_sampler) def main_worker(args: Optional[List[str]] = None): opts = get_training_arguments(args=args) pipeline_name = getattr(opts, "train_eval_pipeline.name") train_eval_pipeline = TRAIN_EVAL_PIPELINE_REGISTRY[pipeline_name](opts=opts) launcher = train_eval_pipeline.launcher launcher(callback) if __name__ == "__main__": main_worker() ================================================ FILE: corenet/constants.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import re import sys from pathlib import Path from typing import Any, Literal # LIBRARY_ROOT is the folder that contains `corenet/` module. LIBRARY_ROOT = Path(__file__).parent.parent MIN_TORCH_VERSION = "1.11.0" SUPPORTED_IMAGE_EXTNS = [".png", ".jpg", ".jpeg"] # Add image formats here SUPPORTED_VIDEO_CLIP_VOTING_FN = ["sum", "max"] SUPPORTED_VIDEO_READER = ["pyav", "decord"] DEFAULT_IMAGE_WIDTH = DEFAULT_IMAGE_HEIGHT = 256 DEFAULT_IMAGE_CHANNELS = 3 DEFAULT_VIDEO_FRAMES = 8 DEFAULT_LOG_FREQ = 500 DEFAULT_ITERATIONS = 300000 DEFAULT_EPOCHS = 300 DEFAULT_MAX_ITERATIONS = DEFAULT_MAX_EPOCHS = 10000000 DEFAULT_RESULTS_DIR = "results" DEFAULT_LOGS_DIR = "results/logs" TMP_RES_FOLDER = "results_tmp" TMP_CACHE_LOC = "/tmp/corenet" Path(TMP_CACHE_LOC).mkdir(parents=True, exist_ok=True) DATA_CACHE_DIR = ".corenet_data_cache" Path(DATA_CACHE_DIR).mkdir(parents=True, exist_ok=True) def get_corenet_env() -> Literal["pytest", "default", "external"]: """ Returns: One of the following values: * "pytest" iff corenet is loaded by pytest. For further details, please read the documentation of @is_test_env function. * "external" iff corenet is imported by modules other than the corenet itself and pytest. * "default" iff corenet is imported by one of its own entrypoints. Note: Please do not move this function to any module that has imports from corenet or imports for third-party non-builtin modules. The reason is that we invoke this function in corenet/__init__.py in order to suppress warnings *before* importing third-party libraries. """ result = os.environ.get("CORENET_ENTRYPOINT") if result in (None, ""): # We fallback to "external", unless we detect corenet's default entrypoints # in sys.argv. result = "external" if len(sys.argv) > 0 and Path(sys.argv[0]).name.startswith("corenet-"): # This branch activates when running "corenet-train", etc. in commandline. os.environ["CORENET_ENTRYPOINT"] = "default" result = "default" elif len(sys.argv) > 1 and any( re.match(r"corenet[./](internal[./])?cli[./]", arg) for arg in sys.argv[1:] ): # This branch activates when running "python corenet/cli/main_train.py" # or running "python -m corenet.cli.main_train." os.environ["CORENET_ENTRYPOINT"] = "default" result = "default" if result not in ("pytest", "default", "external"): raise ValueError( f"Got invalid value for environment variable CORENET_ENTRYPOINT={result}." ) return result def is_test_env() -> bool: """ Returns: True iff the corenet module is loaded by pytest. Note: - `CORENET_ENTRYPOINT=pytest` environment variable is set by `conftest.py` file. - Previously, we used to rely on the existence of "PYTEST_CURRENT_TEST" env var, which is set automatically by pytest, rather than CORENET_ENTRYPOINT=pytest. But the issue was that the `conftest.py` itself and some fixtures are run before "PYTEST_CURRENT_TEST" gets set. """ return get_corenet_env() == "pytest" def is_external_env() -> bool: """ Returns: True iff the corenet module is loaded by modules other than the corenet itself and pytest """ return get_corenet_env() == "external" def if_test_env(then: Any, otherwise: Any) -> Any: return then if get_corenet_env() == "pytest" else otherwise ================================================ FILE: corenet/data/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.data.data_loaders import create_test_loader, create_train_val_loader ================================================ FILE: corenet/data/collate_fns/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.utils import logger from corenet.utils.registry import Registry COLLATE_FN_REGISTRY = Registry( "collate_fn", lazy_load_dirs=["corenet/data/collate_fns"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_collate_fn(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add arguments related to collate function""" group = parser.add_argument_group("Collate function arguments") group.add_argument( "--dataset.collate-fn-name-train", type=str, default="pytorch_default_collate_fn", help="Name of collate function for training. Defaults to pytorch_default_collate_fn.", ) group.add_argument( "--dataset.collate-fn-name-val", type=str, default="pytorch_default_collate_fn", help="Name of collate function for validation. Defaults to pytorch_default_collate_fn.", ) group.add_argument( "--dataset.collate-fn-name-test", type=str, default="pytorch_default_collate_fn", help="Name of collate function used for evaluation. " "Default is pytorch_default_collate_fn.", ) return parser def build_collate_fn(opts, *args, **kwargs): collate_fn_name_train = getattr(opts, "dataset.collate_fn_name_train") if collate_fn_name_train is None: logger.error( "Please specify collate function for training dataset using " "--dataset.collate-fn-name-train" ) collate_fn_name_val = getattr(opts, "dataset.collate_fn_name_val") if collate_fn_name_val is None: logger.error( "Please specify collate function for training dataset using " "--dataset.collate-fn-name-val" ) collate_fn_train = COLLATE_FN_REGISTRY[collate_fn_name_train] collate_fn_val = COLLATE_FN_REGISTRY[collate_fn_name_val] return collate_fn_train, collate_fn_val def build_test_collate_fn(opts, *args, **kwargs): collate_fn_name_test = getattr(opts, "dataset.collate_fn_name_test") # for test time if collate_fn_name_test is not None: return COLLATE_FN_REGISTRY[collate_fn_name_test] return None ================================================ FILE: corenet/data/collate_fns/byteformer_collate_functions.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """This file contains collate functions used by ByteFormer. Since the model operates on a variety of input types, these collate functions are not associated with a particular dataset. These transforms are applied before the model (rather than inside the model) to take advantage of parallelism, and to avoid the need to move tensors from the GPU, back to the CPU, then back to GPU (since these transforms cannot be done on GPU). """ import argparse from typing import Dict, List, Mapping, Optional, Union import torch from torch import Tensor from torch.nn import functional from corenet.data.collate_fns import COLLATE_FN_REGISTRY, collate_functions from corenet.data.transforms import audio_bytes, image_bytes @COLLATE_FN_REGISTRY.register(name="byteformer_image_collate_fn") def byteformer_image_collate_fn( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> Mapping[str, Tensor]: """ Apply augmentations specific to `ByteFormer `_ image training, then perform padded collation. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ batch = apply_pil_save(batch, opts) batch = apply_shuffle_bytes(batch, opts) batch = apply_mask_positions(batch, opts) batch = apply_random_uniform_noise(batch, opts) batch = apply_byte_permutation(batch, opts) batch = apply_padding(batch, opts) batch = collate_functions.pytorch_default_collate_fn(batch, opts) return batch def apply_padding( batch: List[Mapping[str, Union[Dict[str, Tensor], Tensor]]], opts: argparse.Namespace, key: Optional[str] = None, ) -> List[Mapping[str, Tensor]]: """ Apply padding to make samples the same length. The input is a list of dictionaries of the form: [{"samples": @entry, ...}, ...]. If @key is specified, @entry has the form {@key: @value}, where @value corresponds to the entry that should be padded. Otherwise, @entry is assumed to be a tensor. The tensor mentioned in the above paragraph will have shape [batch_size, sequence_length, ...]. Args: batch: The batch of data. opts: The global arguments. key: The key of the sample element to pad. If @key is None, the entry is assumed to be a tensor. Returns: The modified batch of size [batch_size, padded_sequence_length, ...]. """ def get_entry( entry: Union[Dict[str, Tensor], Tensor], key: Optional[str] ) -> Tensor: """ Helper function to deal with the cases where entries in the samples. Args: entry: Either a tensor of shape [batch_size, sequence_length, ...], or a dictionary containing {@key: tensor of shape [batch_size, sequence_length, ...]}. Returns: A tensor of shape [batch_size, ...]. """ if isinstance(entry, dict): return entry[key] if key is not None: raise ValueError(f"Key should not be specified if entries are not dicts.") return entry if get_entry(batch[0]["samples"], key).dim() != 1: # Padding only applies to 1d tensors. return batch padding_idx = getattr(opts, "model.classification.byteformer.padding_index") # Tensors have shape [batch_size, sequence_length, ...]. Get the maximum # sequence length. padded_seq_len = max(get_entry(be["samples"], key).shape[0] for be in batch) for elem in batch: sample = get_entry(elem["samples"], key) # [batch_size, sequence_length, ...]. sample = functional.pad( sample, (0, padded_seq_len - sample.shape[0]), value=padding_idx ) # [batch_size, padded_sequence_length, ...]. if isinstance(elem["samples"], dict): elem["samples"][key] = sample else: elem["samples"] = sample return batch def apply_pil_save( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace, ) -> List[Mapping[str, Tensor]]: """ Apply the PILSave transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "image_augmentation.pil_save.enable"): transform = image_bytes.PILSave(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch def apply_shuffle_bytes( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace, ) -> List[Mapping[str, Tensor]]: """ Apply the ShuffleBytes transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "image_augmentation.shuffle_bytes.enable"): transform = image_bytes.ShuffleBytes(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch def apply_mask_positions( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> List[Mapping[str, Tensor]]: """ Apply the MaskPositions transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "image_augmentation.mask_positions.enable"): transform = image_bytes.MaskPositions(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch def apply_random_uniform_noise( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> List[Mapping[str, Tensor]]: """ Apply the RandomUniformNoise transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "image_augmentation.random_uniform.enable"): transform = image_bytes.RandomUniformNoise(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch def apply_byte_permutation( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> List[Mapping[str, Tensor]]: """ Apply the BytePermutation transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "image_augmentation.byte_permutation.enable"): transform = image_bytes.BytePermutation(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch def apply_torchaudio_save( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> List[Mapping[str, Tensor]]: """ Apply the TorchaudioSave transform to each batch element. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ if getattr(opts, "audio_augmentation.torchaudio_save.enable"): transform = audio_bytes.TorchaudioSave(opts) for i, elem in enumerate(batch): batch[i] = transform(elem) return batch @COLLATE_FN_REGISTRY.register(name="byteformer_audio_collate_fn") def byteformer_audio_collate_fn( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> Mapping[str, Tensor]: """ Apply augmentations specific to ByteFormer audio training, then perform padded collation. Args: batch: The batch of data. opts: The global arguments. Returns: The modified batch. """ batch = apply_torchaudio_save(batch, opts) batch = apply_padding(batch, opts, "audio") # Remove the metadata, which is no longer needed. for elem in batch: del elem["metadata"] batch = collate_functions.pytorch_default_collate_fn(batch, opts) return batch ================================================ FILE: corenet/data/collate_fns/collate_functions.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, List, Mapping import torch from torch import Tensor from torch.utils.data import default_collate from corenet.data.collate_fns import COLLATE_FN_REGISTRY from corenet.utils import logger @COLLATE_FN_REGISTRY.register(name="pytorch_default_collate_fn") def pytorch_default_collate_fn(batch: Any, *args, **kwargs) -> Any: """A wrapper around PyTorch's default collate function.""" batch = default_collate(batch) return batch @COLLATE_FN_REGISTRY.register(name="unlabeled_image_data_collate_fn") def unlabeled_image_data_collate_fn( batch: List[Mapping[str, Any]], opts: argparse.Namespace ) -> Mapping[str, Any]: """ Combines a list of dictionaries into a single dictionary by concatenating matching fields. Each input dictionary is expected to have items with `samples` and `sample_id` as keys. The value for `samples` is expected to be a tensor and the value for `sample_id` is expected to be an integer. This function adds `targets` field to the output dictionary with dummy values to meet the expectations of training engine. Args: batch: A list of dictionaries opts: An argparse.Namespace instance. Returns: A dictionary with `samples`, `sample_id` and `targets` as keys. """ batch_size = len(batch) sample_size = [batch_size, *batch[0]["samples"].shape] img_dtype = batch[0]["samples"].dtype samples = torch.zeros(size=sample_size, dtype=img_dtype) sample_ids = torch.zeros(size=[batch_size], dtype=torch.long) for i, batch_i in enumerate(batch): samples[i] = batch_i["samples"] sample_ids[i] = batch_i["sample_id"] channels_last = getattr(opts, "common.channels_last") if channels_last: samples = samples.to(memory_format=torch.channels_last) # Add dummy labels to meet the expectations of training engine. dummy_labels = torch.full(size=[batch_size], fill_value=0, dtype=torch.long) return {"samples": samples, "sample_id": sample_ids, "targets": dummy_labels} @COLLATE_FN_REGISTRY.register(name="image_classification_data_collate_fn") def image_classification_data_collate_fn( batch: List[Mapping[str, Any]], opts: argparse.Namespace ) -> Mapping[str, Any]: """Combines a list of dictionaries into a single dictionary by concatenating matching fields. Each input dictionary is expected to have items with `samples`,`sample_id` and `targets` as keys. The value for `samples` is expected to be a tensor and the values for `sample_id` and `targets` are expected to be integers. Args: batch: A list of dictionaries opts: An argparse.Namespace instance. Returns: A dictionary with `samples`, `sample_id` and `targets` as keys. """ batch_size = len(batch) img_size = [batch_size, *batch[0]["samples"].shape] img_dtype = batch[0]["samples"].dtype images = torch.zeros(size=img_size, dtype=img_dtype) sample_ids = torch.zeros(size=[batch_size], dtype=torch.long) labels = torch.full(size=[batch_size], fill_value=-1, dtype=torch.long) valid_indexes = [] for i, batch_i in enumerate(batch): images[i] = batch_i["samples"] sample_ids[i] = batch_i["sample_id"] label_i = batch_i["targets"] labels[i] = label_i if label_i != -1: valid_indexes.append(i) valid_indexes = torch.tensor(valid_indexes, dtype=torch.long) images = torch.index_select(images, dim=0, index=valid_indexes) sample_ids = torch.index_select(sample_ids, dim=0, index=valid_indexes) labels = torch.index_select(labels, dim=0, index=valid_indexes) channels_last = getattr(opts, "common.channels_last") if channels_last: images = images.to(memory_format=torch.channels_last) return {"samples": images, "targets": labels, "sample_id": sample_ids} @COLLATE_FN_REGISTRY.register(name="default_collate_fn") def default_collate_fn( batch: List[Mapping[str, Tensor]], opts: argparse.Namespace ) -> Mapping[str, Tensor]: """Combines a list of dictionaries into a single dictionary by concatenating matching fields. Args: batch: A list of dictionaries opts: An argparse.Namespace instance. Returns: A dictionary with the same keys as batch[0]. """ batch_size = len(batch) # get the keys for first element in the list, assuming all elements have the same keys keys = list(batch[0].keys()) new_batch = {k: [] for k in keys} for b in range(batch_size): for k in keys: new_batch[k].append(batch[b][k]) # stack the keys for k in keys: batch_elements = new_batch.pop(k) if isinstance(batch_elements[0], (int, float)): # list of ints or floats batch_elements = torch.as_tensor(batch_elements) else: # stack tensors (including 0-dimensional) try: batch_elements = torch.stack(batch_elements, dim=0).contiguous() except Exception as e: logger.error("Unable to stack the tensors. Error: {}".format(e)) new_batch[k] = batch_elements return new_batch ================================================ FILE: corenet/data/data_loaders.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from functools import partial from typing import Mapping, Optional, Tuple, Union from torch.utils.data import IterableDataset from torch.utils.data.sampler import Sampler from corenet.data.collate_fns import build_collate_fn, build_test_collate_fn from corenet.data.datasets import BaseDataset, get_test_dataset, get_train_val_datasets from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.sampler import build_sampler from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.tensor_utils import image_size_from_opts def create_test_loader(opts: argparse.Namespace) -> CoreNetDataLoader: """Helper function to create and return a dataset loader for test dataset from command-line arguments""" is_master_node = is_master(opts) test_dataset = get_test_dataset(opts) if isinstance(test_dataset, IterableDataset): test_sampler = None batch_size = getattr(opts, "dataset.eval_batch_size0") assert batch_size > 0, ( f"For iterable datasets, we need batch size > 0 but got {batch_size}. " f"Please specify batch size using 'dataset.eval_batch_size0' argument in the config file." ) else: n_test_samples = get_num_data_samples_as_int_or_mapping(test_dataset) # The sampler reads the batch size for validation/test jobs using 'dataset.val_batch_size0' # So, we override the value of validation batch size argument with evaluation batch size argument. setattr( opts, "dataset.val_batch_size0", getattr(opts, "dataset.eval_batch_size0"), ) # we don't need variable batch sampler for evaluation sampler_name = getattr(opts, "sampler.name", "batch_sampler") crop_size_h, crop_size_w = image_size_from_opts(opts) if sampler_name.find("var") > -1: setattr(opts, "sampler.name", "batch_sampler") setattr(opts, "sampler.bs.crop_size_width", crop_size_w) setattr(opts, "sampler.bs.crop_size_height", crop_size_h) test_sampler = build_sampler( opts=opts, n_data_samples=n_test_samples, is_training=False, get_item_metadata=test_dataset.get_item_metadata, ) # for non-iterable dataset, batch size is handled inside the sampler. batch_size = 1 if is_master_node: logger.log(f"Evaluation sampler details: {test_sampler}") collate_fn_test = build_test_collate_fn(opts=opts) data_workers = getattr(opts, "dataset.workers") persistent_workers = getattr(opts, "dataset.persistent_workers") and ( data_workers > 0 ) pin_memory = getattr(opts, "dataset.pin_memory") test_loader = CoreNetDataLoader( dataset=test_dataset, batch_size=batch_size, batch_sampler=test_sampler, num_workers=data_workers, pin_memory=pin_memory, persistent_workers=persistent_workers, collate_fn=( partial(collate_fn_test, opts=opts) if collate_fn_test is not None else None ), ) return test_loader def create_train_val_loader( opts: argparse.Namespace, ) -> Tuple[CoreNetDataLoader, Optional[CoreNetDataLoader], Sampler]: """Helper function to create training and validation data loaders. Args: opts: Command-line arguments Returns: A tuple containing training data loader, (optional) validation data loader, and training data sampler. """ is_master_node = is_master(opts) train_dataset, valid_dataset = get_train_val_datasets(opts) if isinstance(train_dataset, IterableDataset): train_sampler = None train_batch_size = getattr(opts, "dataset.train_batch_size0") assert train_batch_size > 0, ( f"For iterable datasets, we need batch size > 0 but got {train_batch_size}. " f"Please specify batch size using 'dataset.train_batch_size0' argument in the config file." ) else: n_train_samples = get_num_data_samples_as_int_or_mapping(train_dataset) train_sampler = build_sampler( opts=opts, n_data_samples=n_train_samples, is_training=True, get_item_metadata=train_dataset.get_item_metadata, ) # for non-iterable dataset, batch size is handled inside the sampler. train_batch_size = 1 if valid_dataset is None: # Validation is disabled. valid_sampler = None val_batch_size = 1 elif isinstance(valid_dataset, IterableDataset): # validation dataset is iterable valid_sampler = None val_batch_size = getattr(opts, "dataset.val_batch_size0") assert val_batch_size > 0, ( f"For iterable datasets, we need batch size > 0 but got {val_batch_size}. " f"Please specify batch size using 'dataset.val_batch_size0' argument in the config file." ) else: # validation dataset is map-style n_valid_samples = get_num_data_samples_as_int_or_mapping(valid_dataset) valid_sampler = build_sampler( opts=opts, n_data_samples=n_valid_samples, is_training=False, get_item_metadata=valid_dataset.get_item_metadata, ) # for non-iterable dataset, batch size is handled inside the sampler. val_batch_size = 1 data_workers = getattr(opts, "dataset.workers") persistent_workers = getattr(opts, "dataset.persistent_workers") and ( data_workers > 0 ) pin_memory = getattr(opts, "dataset.pin_memory") prefetch_factor = getattr(opts, "dataset.prefetch_factor") collate_fn_train, collate_fn_val = build_collate_fn(opts=opts) train_loader = CoreNetDataLoader( dataset=train_dataset, batch_size=train_batch_size, num_workers=data_workers, pin_memory=pin_memory, batch_sampler=train_sampler, persistent_workers=persistent_workers, collate_fn=( partial(collate_fn_train, opts=opts) if collate_fn_train is not None else None ), prefetch_factor=prefetch_factor, ) if valid_dataset is not None: val_loader = CoreNetDataLoader( dataset=valid_dataset, batch_size=val_batch_size, batch_sampler=valid_sampler, num_workers=data_workers, pin_memory=pin_memory, persistent_workers=persistent_workers, collate_fn=( partial(collate_fn_val, opts=opts) if collate_fn_val is not None else None ), ) else: val_loader = None if is_master_node: if train_sampler is not None: logger.log(f"Training sampler details: {train_sampler}") if valid_sampler is not None: logger.log(f"Validation sampler details: {valid_sampler}") logger.log("Number of data workers: {}".format(data_workers)) return train_loader, val_loader, train_sampler def get_num_data_samples_as_int_or_mapping( dataset: BaseDataset, ) -> Union[int, Mapping[str, int]]: """Return the number of samples in the dataset. The dataset can be a single or composition of multiple datasets (as in multi-task learning). For a single dataset, the number of samples is integer while for multiple datasets, a dictionary is returned with task name and number of samples per task. Args: dataset: An instance of `corenet.data.datasets.BaseDataset` class Returns: An integer for single dataset and mapping for composite datasets. """ if hasattr(dataset, "get_dataset_length_as_mapping"): return dataset.get_dataset_length_as_mapping() else: return len(dataset) ================================================ FILE: corenet/data/datasets/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple from corenet.constants import if_test_env from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) from corenet.data.datasets.classification.base_imagenet_shift_dataset import ( BaseImageNetShiftDataset, ) from corenet.data.datasets.dataset_base import ( BaseDataset, BaseImageDataset, BaseIterableDataset, BaseVideoDataset, ) from corenet.data.datasets.detection.base_detection import BaseDetectionDataset from corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset from corenet.data.datasets.multi_modal_img_text import arguments_multi_modal_img_text from corenet.data.datasets.segmentation.base_segmentation import ( BaseImageSegmentationDataset, ) from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.registry import Registry DATASET_REGISTRY = Registry( registry_name="dataset_registry", base_class=BaseDataset, lazy_load_dirs=["corenet/data/datasets"] + if_test_env( then=["tests/data/datasets"], otherwise=[], ), internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def build_dataset_from_registry( opts: argparse.Namespace, is_training: bool = True, is_evaluation: bool = False, *args, **kwargs, ) -> BaseDataset: """Helper function to build a dataset from dataset registry Args: opts: Command-line arguments is_training: Training mode or not. Defaults to True. is_evaluation: Evaluation mode or not. Defaults to False. Returns: An instance of BaseDataset ...note: `is_training` is used to indicate whether the dataset is used for training or validation On the other hand, `is_evaluation` mode is used to indicate the dataset is used for testing. Theoretically, `is_training=False` and `is_evaluation=True` should be the same. However, for some datasets (especially segmentation), validation dataset transforms are different from test transforms because each image has different resolution, making it difficult to construct batches. Therefore, we treat these two modes different. For datasets, where validation and testing transforms are the same, we set evaluation transforms the same as the validation transforms (e.g., in ImageNet object classification). """ dataset_category = getattr(opts, "dataset.category") if dataset_category is None: logger.error("Please specify dataset category using --dataset.category") dataset_name = getattr(opts, f"dataset.name") if dataset_name is None: logger.error("Please specify dataset name using --dataset.name") dataset = DATASET_REGISTRY[dataset_name, dataset_category]( opts=opts, is_training=is_training, is_evaluation=is_evaluation, *args, **kwargs ) return dataset def get_test_dataset(opts: argparse.Namespace, *args, **kwargs) -> BaseDataset: """Helper function to build a dataset for testing. Args: opts: Command-line arguments Returns: An instance of BaseDataset """ test_dataset = build_dataset_from_registry( opts, is_training=False, is_evaluation=True, *args, **kwargs ) if is_master(opts): logger.log("Evaluation dataset details: ") print("{}".format(test_dataset)) return test_dataset def get_train_val_datasets( opts: argparse.Namespace, *args, **kwargs ) -> Tuple[BaseDataset, Optional[BaseDataset]]: """Helper function to build a dataset for training and validation. Args: opts: Command-line arguments Returns: Training and (optionally) validation datasets. """ disable_val = getattr(opts, "dataset.disable_val") is_master_node = is_master(opts) train_dataset = build_dataset_from_registry( opts, is_training=True, is_evaluation=False, *args, **kwargs ) if is_master_node: logger.log("Training dataset details are given below") print(train_dataset) valid_dataset = None if not disable_val: valid_dataset = build_dataset_from_registry( opts, is_training=False, is_evaluation=False, *args, **kwargs ) if is_master_node: logger.log("Validation dataset details are given below") print(valid_dataset) return train_dataset, valid_dataset def arguments_dataset(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add dataset-specific arguments from BaseDataset, BaseImageDataset, BaseImageClassificationDataset, BaseImageNetShiftDataset, BaseVideoDataset, zero-shot datasets, and DATASET_REGISTRY. """ parser = BaseDataset.add_arguments(parser) parser = BaseImageDataset.add_arguments(parser) parser = BaseImageSegmentationDataset.add_arguments(parser) parser = BaseVideoDataset.add_arguments(parser) parser = BaseImageClassificationDataset.add_arguments(parser) parser = BaseImageNetShiftDataset.add_arguments(parser) parser = BaseDetectionDataset.add_arguments(parser) parser = BaseLMIterableDataset.add_arguments(parser) try: from corenet.internal.utils.server_utils import dataset_server_args parser = dataset_server_args(parser) except ImportError: pass # add multi-modal and zero-shot arguments parser = arguments_multi_modal_img_text(parser=parser) # add dataset specific arguments parser = DATASET_REGISTRY.all_arguments(parser) return parser ================================================ FILE: corenet/data/datasets/audio_classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/data/datasets/audio_classification/speech_commands_v2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import json import os import random from typing import Dict, Tuple, Union import torch import torchaudio from torch import Tensor from torch.nn import functional as F from corenet.data.datasets import DATASET_REGISTRY, dataset_base from corenet.data.transforms.audio import Noise, Roll, SetFixedLength from corenet.data.transforms.common import Compose from corenet.data.transforms.image_pil import BaseTransformation @DATASET_REGISTRY.register(name="speech_commands_v2", type="audio_classification") class SpeechCommandsv2Dataset(dataset_base.BaseDataset): """ Google's Speech Commands dataset for keyword spotting (https://arxiv.org/abs/1804.03209). This contains the "v2" version for 12-way classification (10 commands, plus unknown and background categories). Args: opts: Command-line arguments """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: super().__init__(opts=opts, *args, **kwargs) mode_str = self.mode if self.mode == "val": # This value is needed to calculate the correct annotation .json paths. mode_str = "validation" self.dataset_config = os.path.join(self.root, f"{mode_str}_manifest.json") self._process_dataset_config() self.mixup = getattr(opts, "dataset.speech_commands_v2.mixup") def _process_dataset_config(self) -> None: """ Process the dataset .json files to set up the dataset. The .json configs contain: [ { "audio_filepath": relative path to audio from the dataset root directory, "duration": floating point duration in seconds, "command": the label of the spoken command. }, ... ] """ with open(self.dataset_config) as f: lines = f.readlines() self.dataset_entries = [] for line in lines: self.dataset_entries.append(json.loads(line)) for elem in self.dataset_entries: audio_path = elem["audio_filepath"] new_path = os.path.join(self.root, audio_path) elem["audio_filepath"] = new_path all_labels = sorted(set([elem["command"] for elem in self.dataset_entries])) self.label_to_index = {l: i for i, l in enumerate(all_labels)} if getattr(self.opts, "audio_augmentation.noise.enable"): # Cache this, since it loads files on initialization. background_dir = os.path.join(self.root, "_background_noise_") self.noise = Noise(self.opts, noise_files_dir=background_dir) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.speech-commands-v2.mixup", action="store_true", help="If set, apply mixup inside the dataset.", ) return parser def _training_transforms(self, *args, **kwargs) -> BaseTransformation: """ Returns transformations applied to the input in training mode. """ aug_list = [ SetFixedLength(self.opts), ] if getattr(self.opts, "audio_augmentation.noise.enable"): aug_list.append(self.noise) if getattr(self.opts, "audio_augmentation.roll.enable"): aug_list.append(Roll(self.opts)) return Compose(self.opts, aug_list) def _validation_transforms(self, *args, **kwargs) -> BaseTransformation: """ Returns transformations applied to the input in validation mode. """ aug_list = [SetFixedLength(self.opts)] return Compose(self.opts, aug_list) def get_sample(self, index: int) -> Tuple[Tensor, float, Tensor]: """ Get the dataset sample at the given index. """ dataset_entry = self.dataset_entries[index] waveform, audio_fps = torchaudio.load(dataset_entry["audio_filepath"]) label = torch.tensor( self.label_to_index[dataset_entry["command"]], dtype=torch.long ) return waveform, audio_fps, label def __getitem__( self, batch_indexes_tup: Tuple ) -> Dict[str, Union[Dict[str, Tensor], Tensor, int]]: """ Returns the sample corresponding to the input sample index and applies transforms. If the class uses mixup, and is in training mode, this will additionally apply mixup. Args: batch_indexes_tup: Tuple of the form (crop_size_h, crop_size_w, sample_index). The first two parts are not needed, and are ignored by this function. Returns: A sample as a dictionary. It contains: { "samples": { "audio": A [C, N] tensor, where C is the number of channels, and N is the length. } "targets": an integer class label. "sample_id": an integer giving the sample index. "metadata": { "audio_fps": The sampling rate of the audio. } } """ _, _, index = batch_indexes_tup data = self.get_transformed_sample(index) if self.mixup and self.is_training: index = random.randint(0, len(self) - 1) data2 = self.get_transformed_sample(index) if data["metadata"]["audio_fps"] != data2["metadata"]["audio_fps"]: raise ValueError( f"Inconsistent audio_fps ({data['metadata']['audio_fps']} and {data2['metadata']['audio_fps']})" ) coefficient = torch.rand(1) data["samples"]["audio"] = data["samples"]["audio"] * coefficient + data2[ "samples" ]["audio"] * (1.0 - coefficient) def to_onehot(targets: Tensor) -> Tensor: return F.one_hot(targets, num_classes=len(self.label_to_index)) data["targets"] = to_onehot(data["targets"]) * coefficient + to_onehot( data2["targets"] ) * (1.0 - coefficient) return data def get_transformed_sample( self, index: int ) -> Dict[str, Union[Dict[str, Tensor], Tensor, int]]: """ Get the sample at the index specified by @index. Args: index: The index of the sample. Returns: A sample as a dictionary. It contains: { "samples": { "audio": A [C, N] tensor, where C is the number of channels, and N is the length. } "targets": an integer class label. "sample_id": an integer giving the sample index. "metadata": { "audio_fps": The sampling rate of the audio. } } """ waveform, audio_fps, label = self.get_sample(index) data = { "samples": {"audio": waveform}, "targets": label, "sample_id": index, "metadata": {"audio_fps": audio_fps}, } transform_fn = self.get_augmentation_transforms() data = transform_fn(data) return data def __len__(self) -> int: return len(self.dataset_entries) ================================================ FILE: corenet/data/datasets/classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/data/datasets/classification/base_image_classification_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, Tuple, Union import torch from torchvision.datasets import ImageFolder from corenet.data.datasets.dataset_base import BaseImageDataset from corenet.data.datasets.utils.common import select_samples_by_category from corenet.data.transforms import image_pil from corenet.data.transforms.common import Compose from corenet.utils import logger from corenet.utils.ddp_utils import is_master class BaseImageClassificationDataset(BaseImageDataset, ImageFolder): """Image Classification Dataset. This base class can be used to represent any image classification dataset which is stored in a way that meets the expectations of `torchvision.datasets.ImageFolder`. New image classification datasets can be derived from this similar to ImageNetDataset (imagenet.py) or Places365Dataset (places365.py) and overwrite the data transformations as needed. This dataset also supports sampling a random subset of the training set to be used for training. The subset size is determined by the arguments `dataset.num_samples_per_category` and `dataset.percentage_of_samples` in the input `opts`. Only one of these two should be specified. When `dataset.percentage_of_samples` is specified, data is sampled from all classes according to this percentage such that the distribution of classes does not change. The randomness in sampling is controlled by the `dataset.sample_selection_random_seed` in the input `opts`. Args: opts: An argparse.Namespace instance. """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: BaseImageDataset.__init__( self, opts=opts, *args, **kwargs, ) root = self.root ImageFolder.__init__( self, root=root, transform=None, target_transform=None, is_valid_file=None, ) self.n_classes = len(list(self.class_to_idx.keys())) master = is_master(self.opts) if master: logger.log("Number of categories: {}".format(self.n_classes)) logger.log("Total number of samples: {}".format(len(self.samples))) num_samples_per_category = getattr( self.opts, "dataset.num_samples_per_category" ) percentage_of_samples = getattr(self.opts, "dataset.percentage_of_samples") if self.is_training and ( num_samples_per_category > 0 or (0 < percentage_of_samples < 100) ): if num_samples_per_category > 0 and (0 < percentage_of_samples < 100): raise ValueError( "Both `dataset.num_samples_per_category` and `dataset.percentage_of_samples` are specified. " "Please specify only one." ) random_seed = getattr(self.opts, "dataset.sample_selection_random_seed") if num_samples_per_category > 0: selected_sample_indices = select_samples_by_category( sample_category_labels=self.targets, random_seed=random_seed, num_samples_per_category=num_samples_per_category, ) if master: logger.log( "Using {} samples per category.".format( num_samples_per_category ) ) else: selected_sample_indices = select_samples_by_category( sample_category_labels=self.targets, random_seed=random_seed, percentage_of_samples_per_category=percentage_of_samples, ) if master: logger.log( "Using {} percentage of samples per category.".format( percentage_of_samples ) ) self.samples = [self.samples[ind] for ind in selected_sample_indices] self.imgs = [self.imgs[ind] for ind in selected_sample_indices] self.targets = [self.targets[ind] for ind in selected_sample_indices] elif master: logger.log("Using all samples in the dataset.") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Adds dataset related arguments to the parser. Args: parser: An argparse.Namespace instance Returns: Input argparse.Namespace instance with additional arguments. """ if cls != BaseImageClassificationDataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.num-samples-per-category", type=int, default=-1, help="Number of samples to use per category. If set to -1, all samples will be used.", ) return parser def _training_transforms( self, size: Union[Tuple[int, int], int], *args, **kwargs ) -> image_pil.BaseTransformation: """ Returns transformations applied to the input in training mode. Order of transformations: RandomResizedCrop, RandomHorizontalFlip, One of AutoAugment or RandAugment or TrivialAugmentWide, RandomErasing Batch-based augmentations such as Mixup and CutMix are implemented in trainer. Args: size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ if not getattr(self.opts, "image_augmentation.random_resized_crop.enable"): raise ValueError( "`image_augmentation.random_resized_crop.enable` must be set to True in input options." ) aug_list = [image_pil.RandomResizedCrop(opts=self.opts, size=size)] if getattr(self.opts, "image_augmentation.random_horizontal_flip.enable"): aug_list.append(image_pil.RandomHorizontalFlip(opts=self.opts)) auto_augment = getattr(self.opts, "image_augmentation.auto_augment.enable") rand_augment = getattr(self.opts, "image_augmentation.rand_augment.enable") trivial_augment_wide = getattr( self.opts, "image_augmentation.trivial_augment_wide.enable" ) if bool(auto_augment) + bool(rand_augment) + bool(trivial_augment_wide) > 1: logger.error( "Only one of AutoAugment, RandAugment and TrivialAugmentWide should be used." ) elif auto_augment: aug_list.append(image_pil.AutoAugment(opts=self.opts)) elif rand_augment: if getattr(self.opts, "image_augmentation.rand_augment.use_timm_library"): aug_list.append(image_pil.RandAugmentTimm(opts=self.opts)) else: aug_list.append(image_pil.RandAugment(opts=self.opts)) elif trivial_augment_wide: aug_list.append(image_pil.TrivialAugmentWide(opts=self.opts)) aug_list.append(image_pil.ToTensor(opts=self.opts)) if getattr(self.opts, "image_augmentation.random_erase.enable"): aug_list.append(image_pil.RandomErasing(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) def _validation_transforms(self, *args, **kwargs) -> image_pil.BaseTransformation: """ Returns transformations applied to the input in validation mode. Order of augmentations: Resize followed by CenterCrop """ if not getattr(self.opts, "image_augmentation.resize.enable"): raise ValueError( "`image_augmentation.resize.enable` must be set to True in input options." ) aug_list = [image_pil.Resize(opts=self.opts)] if not getattr(self.opts, "image_augmentation.center_crop.enable"): raise ValueError( "`image_augmentation.center_crop.enable` must be set to True in input options." ) aug_list.append(image_pil.CenterCrop(opts=self.opts)) aug_list.append(image_pil.ToTensor(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Dict[str, Any]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index and label of a sample, respectively. Shapes: The output data dictionary contains three keys (samples, sample_id, and target). The values of these keys has the following shapes: data["samples"]: Shape is [Channels, Height, Width] data["sample_id"]: Shape is 1 data["targets"]: Shape is 1 """ crop_size_h, crop_size_w, sample_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) img_path, target = self.samples[sample_index] input_img = self.read_image_pil(img_path) if input_img is None: # Sometimes images are corrupt # Skip such images logger.log("Img index {} is possibly corrupt.".format(sample_index)) input_tensor = torch.zeros( size=(3, crop_size_h, crop_size_w), dtype=torch.float ) target = -1 data = {"image": input_tensor} else: data = {"image": input_img} data = transform_fn(data) data["samples"] = data.pop("image") data["targets"] = target data["sample_id"] = sample_index return data def __len__(self) -> int: return len(self.samples) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() return extra_repr_str + f"\n\t num_classes={self.n_classes}" ================================================ FILE: corenet/data/datasets/classification/base_imagenet_shift_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """Base class for ImageNet distribution shift datasets.""" import argparse from typing import Any, Dict, Tuple from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) class BaseImageNetShiftDataset(BaseImageClassificationDataset): """ImageNet Distribution Shift Dataset. This base class supports ImageNet out-of-distribution datasets. The class names for datasets are a subset of ImageNet. The `__getitem__` method projects the labels to the classes of ImageNet to allow zero-shot evaluation. Args: opts: An argparse.Namespace instance. """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: """Initialize BaseImageNetShiftDataset.""" BaseImageClassificationDataset.__init__( self, opts=opts, *args, **kwargs, ) # The class ids are converted to their equivalent ImageNet class ids # We manually set the n_classes and overwrite the n_classes set by # ImageFolder self.n_classes = 1000 self.post_init_checks() def post_init_checks(self) -> None: """Verify the dataset is correctly initialized. Also called in testing.""" if self.is_training: raise Exception( "{} can only be used for evaluation".format(self.__class__.__name__) ) model_classes = getattr(self.opts, "model.classification.n_classes") # Note: ImageNet distribution shift subsets can have classes less than 1000 # In such a case, a proper mapping from ImageNet classes to ImageNet distribution shift dataset needs to be done. assert ( self.n_classes <= model_classes ), f"The dataset expects {self.n_classes} unique labels, but the model is trained on {model_classes} unique labels. " @staticmethod def class_id_to_imagenet_class_id(class_id: int) -> int: """Return the corresponding class index from ImageNet given a class index.""" raise NotImplementedError( "Subclasses should implement the mapping to imagenet class ids." ) def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Dict[str, Any]: """Return the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index and label of a sample, respectively. Shapes: The output data dictionary contains three keys (samples, sample_id, and target). The values of these keys has the following shapes: data["samples"]: Shape is [Channels, Height, Width] data["sample_id"]: Shape is 1 data["targets"]: Shape is 1 """ data = BaseImageClassificationDataset.__getitem__(self, sample_size_and_index) data["targets"] = self.class_id_to_imagenet_class_id(data["targets"]) return data ================================================ FILE: corenet/data/datasets/classification/coco.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from functools import cached_property from typing import Any, Dict, List, Tuple, Union import torch from pycocotools.coco import COCO from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, BaseImageDataset, ) from corenet.data.transforms.image_pil import BaseTransformation @DATASET_REGISTRY.register(name="coco", type="classification") class COCOClassification(BaseImageDataset): """`COCO `_ dataset for multi-label object classification. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) year = 2017 split = "train" if self.is_training else "val" ann_file = os.path.join( self.root, "annotations/instances_{}{}.json".format(split, year) ) self.img_dir = os.path.join(self.root, "images/{}{}".format(split, year)) self.coco = COCO(ann_file) self.ids = list(self.coco.imgs.keys()) self.cat2cat = dict() for cat in self.coco.cats.keys(): self.cat2cat[cat] = len(self.cat2cat) def __len__(self) -> int: """Number of samples in the dataset.""" return len(self.ids) def _training_transforms( self, size: Union[int, Tuple[int, int]] ) -> BaseTransformation: """Returns transformations applied to the input image in training mode. These transformations are the same as the 'BaseImageClassificationDataset'. Args: size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ return BaseImageClassificationDataset._training_transforms(self, size) def _validation_transforms( self, *unused_args, **unused_kwargs ) -> BaseTransformation: """Returns transformations applied to the input in validation mode. These transformations are the same as the 'BaseImageClassificationDataset'. Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ return BaseImageClassificationDataset._validation_transforms(self) def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Dict[str, Any]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index). Returns: A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index, and label of a sample, respectively. Shapes: The output data dictionary contains three keys (samples, sample_id, and target). The values of these keys has the following shapes: data["samples"]: Shape is [image_channels, image_height, image_width] data["sample_id"]: Shape is 1 data["targets"]: Shape is [num_classes] """ crop_size_h, crop_size_w, img_index = sample_size_and_index coco = self.coco img_id = self.ids[img_index] ann_ids = coco.getAnnIds(imgIds=img_id) annotations = coco.loadAnns(ann_ids) target = torch.zeros((3, self.n_classes), dtype=torch.long) # Steps to produce multi-label classification labels # Step 1: Group the target labels into three categories based on object area # Step 2: Produce the binary label for each class by computing maximum value # along the first dimension (i.e., dim=0). # Step 1 for obj in annotations: if obj["area"] < 32 * 32: # small objects target[0][self.cat2cat[obj["category_id"]]] = 1 elif obj["area"] < 96 * 96: # medium objects target[1][self.cat2cat[obj["category_id"]]] = 1 else: # large objects target[2][self.cat2cat[obj["category_id"]]] = 1 # Step 2 target = target.amax(dim=0) img_path = os.path.join(self.img_dir, coco.loadImgs(img_id)[0]["file_name"]) input_img = self.read_image_pil(img_path) transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) data = transform_fn({"image": input_img}) data["samples"] = data.pop("image") data["targets"] = target data["sample_id"] = img_index return data @cached_property def n_classes(self): return len(self.class_names) @cached_property def class_names(self) -> List[str]: """Returns the names of object classes in the COCO dataset.""" return [ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire", "hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush", ] ================================================ FILE: corenet/data/datasets/classification/imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) @DATASET_REGISTRY.register(name="imagenet", type="classification") class ImageNetDataset(BaseImageClassificationDataset): """ ImageNet dataset that follows the structure of ImageClassificationDataset. "ImageNet: A large-scale hierarchical image database" Jia Deng; Wei Dong; Richard Socher; Li-Jia Li; Kai Li; Li Fei-Fei 2009 IEEE Conference on Computer Vision and Pattern Recognition """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: BaseImageClassificationDataset.__init__( self, opts=opts, *args, **kwargs, ) ================================================ FILE: corenet/data/datasets/classification/imagenet_a.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ImageNetA dataset, a distribution shift of ImageNet.""" import argparse from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_imagenet_shift_dataset import ( BaseImageNetShiftDataset, ) from corenet.data.datasets.classification.imagenet_synsets import ( IMAGENET_A_SYNSETS, IMAGENET_SYNSETS, ) IMAGENET_A_CLASS_SUBLIST = [ IMAGENET_SYNSETS.index(IMAGENET_A_SYNSETS[synset]) for synset in range(len(IMAGENET_A_SYNSETS)) ] @DATASET_REGISTRY.register(name="imagenet_a", type="classification") class ImageNetADataset(BaseImageNetShiftDataset): """ImageNetA dataset, a distribution shift of ImageNet. ImageNet-A contains real-world, unmodified natural images that cause model accuracy to substantially degrade. @article{hendrycks2021nae, title={Natural Adversarial Examples}, author={Dan Hendrycks and Kevin Zhao and Steven Basart and Jacob Steinhardt and Dawn Song}, journal={CVPR}, year={2021} } """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: """Initialize ImageNetA.""" BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs) @staticmethod def class_id_to_imagenet_class_id(class_id: int) -> int: """Return the mapped class index using precomputed mapping.""" return IMAGENET_A_CLASS_SUBLIST[class_id] ================================================ FILE: corenet/data/datasets/classification/imagenet_r.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ImageNetR dataset, a distribution shift of ImageNet.""" import argparse from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_imagenet_shift_dataset import ( BaseImageNetShiftDataset, ) from corenet.data.datasets.classification.imagenet_synsets import ( IMAGENET_R_SYNSETS, IMAGENET_SYNSETS, ) IMAGENET_R_CLASS_SUBLIST = [ IMAGENET_SYNSETS.index(IMAGENET_R_SYNSETS[synset]) for synset in range(len(IMAGENET_R_SYNSETS)) ] @DATASET_REGISTRY.register(name="imagenet_r", type="classification") class ImageNetRDataset(BaseImageNetShiftDataset): """ImageNetR dataset, a distribution shift of ImageNet. ImageNet-R(endition) contains art, cartoons, deviantart, graffiti, embroidery, graphics, origami, paintings, patterns, plastic objects, plush objects, sculptures, sketches, tattoos, toys, and video game renditions of ImageNet classes. @article{hendrycks2021many, title={The Many Faces of Robustness: A Critical Analysis of Out-of-Distribution Generalization}, author={Dan Hendrycks and Steven Basart and Norman Mu and Saurav Kadavath and Frank Wang and Evan Dorundo and Rahul Desai and Tyler Zhu and Samyak Parajuli and Mike Guo and Dawn Song and Jacob Steinhardt and Justin Gilmer}, journal={ICCV}, year={2021} } """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: """Initialize ImageNetR.""" BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs) @staticmethod def class_id_to_imagenet_class_id(class_id: int) -> int: """Return the mapped class index using precomputed mapping.""" return IMAGENET_R_CLASS_SUBLIST[class_id] ================================================ FILE: corenet/data/datasets/classification/imagenet_sketch.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ImageNetSketch dataset, a distribution shift of ImageNet.""" import argparse from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_imagenet_shift_dataset import ( BaseImageNetShiftDataset, ) @DATASET_REGISTRY.register(name="imagenet_sketch", type="classification") class ImageNetSketchDataset(BaseImageNetShiftDataset): """ImageNetSketch dataset, a distribution shift of ImageNet. Data set is created from Google Image queries "sketch of __", where __ is the standard class name. Search is only within the "black and white" color scheme. @inproceedings{wang2019learning, title={Learning Robust Global Representations by Penalizing Local Predictive Power}, author={Wang, Haohan and Ge, Songwei and Lipton, Zachary and Xing, Eric P}, booktitle={Advances in Neural Information Processing Systems}, pages={10506--10518}, year={2019} } """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: """Initialize ImageNetSketchDataset.""" BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs) @staticmethod def class_id_to_imagenet_class_id(class_id: int) -> int: """Return `class_id` as the ImageNet Sketch classes are the same as ImageNet.""" return class_id ================================================ FILE: corenet/data/datasets/classification/imagenet_synsets.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # Folder names/class IDs in ImageNet-1k IMAGENET_SYNSETS = [ "n01440764", "n01443537", "n01484850", "n01491361", "n01494475", "n01496331", "n01498041", "n01514668", "n01514859", "n01518878", "n01530575", "n01531178", "n01532829", "n01534433", "n01537544", "n01558993", "n01560419", "n01580077", "n01582220", "n01592084", "n01601694", "n01608432", "n01614925", "n01616318", "n01622779", "n01629819", "n01630670", "n01631663", "n01632458", "n01632777", "n01641577", "n01644373", "n01644900", "n01664065", "n01665541", "n01667114", "n01667778", "n01669191", "n01675722", "n01677366", "n01682714", "n01685808", "n01687978", "n01688243", "n01689811", "n01692333", "n01693334", "n01694178", "n01695060", "n01697457", "n01698640", "n01704323", "n01728572", "n01728920", "n01729322", "n01729977", "n01734418", "n01735189", "n01737021", "n01739381", "n01740131", "n01742172", "n01744401", "n01748264", "n01749939", "n01751748", "n01753488", "n01755581", "n01756291", "n01768244", "n01770081", "n01770393", "n01773157", "n01773549", "n01773797", "n01774384", "n01774750", "n01775062", "n01776313", "n01784675", "n01795545", "n01796340", "n01797886", "n01798484", "n01806143", "n01806567", "n01807496", "n01817953", "n01818515", "n01819313", "n01820546", "n01824575", "n01828970", "n01829413", "n01833805", "n01843065", "n01843383", "n01847000", "n01855032", "n01855672", "n01860187", "n01871265", "n01872401", "n01873310", "n01877812", "n01882714", "n01883070", "n01910747", "n01914609", "n01917289", "n01924916", "n01930112", "n01943899", "n01944390", "n01945685", "n01950731", "n01955084", "n01968897", "n01978287", "n01978455", "n01980166", "n01981276", "n01983481", "n01984695", "n01985128", "n01986214", "n01990800", "n02002556", "n02002724", "n02006656", "n02007558", "n02009229", "n02009912", "n02011460", "n02012849", "n02013706", "n02017213", "n02018207", "n02018795", "n02025239", "n02027492", "n02028035", "n02033041", "n02037110", "n02051845", "n02056570", "n02058221", "n02066245", "n02071294", "n02074367", "n02077923", "n02085620", "n02085782", "n02085936", "n02086079", "n02086240", "n02086646", "n02086910", "n02087046", "n02087394", "n02088094", "n02088238", "n02088364", "n02088466", "n02088632", "n02089078", "n02089867", "n02089973", "n02090379", "n02090622", "n02090721", "n02091032", "n02091134", "n02091244", "n02091467", "n02091635", "n02091831", "n02092002", "n02092339", "n02093256", "n02093428", "n02093647", "n02093754", "n02093859", "n02093991", "n02094114", "n02094258", "n02094433", "n02095314", "n02095570", "n02095889", "n02096051", "n02096177", "n02096294", "n02096437", "n02096585", "n02097047", "n02097130", "n02097209", "n02097298", "n02097474", "n02097658", "n02098105", "n02098286", "n02098413", "n02099267", "n02099429", "n02099601", "n02099712", "n02099849", "n02100236", "n02100583", "n02100735", "n02100877", "n02101006", "n02101388", "n02101556", "n02102040", "n02102177", "n02102318", "n02102480", "n02102973", "n02104029", "n02104365", "n02105056", "n02105162", "n02105251", "n02105412", "n02105505", "n02105641", "n02105855", "n02106030", "n02106166", "n02106382", "n02106550", "n02106662", "n02107142", "n02107312", "n02107574", "n02107683", "n02107908", "n02108000", "n02108089", "n02108422", "n02108551", "n02108915", "n02109047", "n02109525", "n02109961", "n02110063", "n02110185", "n02110341", "n02110627", "n02110806", "n02110958", "n02111129", "n02111277", "n02111500", "n02111889", "n02112018", "n02112137", "n02112350", "n02112706", "n02113023", "n02113186", "n02113624", "n02113712", "n02113799", "n02113978", "n02114367", "n02114548", "n02114712", "n02114855", "n02115641", "n02115913", "n02116738", "n02117135", "n02119022", "n02119789", "n02120079", "n02120505", "n02123045", "n02123159", "n02123394", "n02123597", "n02124075", "n02125311", "n02127052", "n02128385", "n02128757", "n02128925", "n02129165", "n02129604", "n02130308", "n02132136", "n02133161", "n02134084", "n02134418", "n02137549", "n02138441", "n02165105", "n02165456", "n02167151", "n02168699", "n02169497", "n02172182", "n02174001", "n02177972", "n02190166", "n02206856", "n02219486", "n02226429", "n02229544", "n02231487", "n02233338", "n02236044", "n02256656", "n02259212", "n02264363", "n02268443", "n02268853", "n02276258", "n02277742", "n02279972", "n02280649", "n02281406", "n02281787", "n02317335", "n02319095", "n02321529", "n02325366", "n02326432", "n02328150", "n02342885", "n02346627", "n02356798", "n02361337", "n02363005", "n02364673", "n02389026", "n02391049", "n02395406", "n02396427", "n02397096", "n02398521", "n02403003", "n02408429", "n02410509", "n02412080", "n02415577", "n02417914", "n02422106", "n02422699", "n02423022", "n02437312", "n02437616", "n02441942", "n02442845", "n02443114", "n02443484", "n02444819", "n02445715", "n02447366", "n02454379", "n02457408", "n02480495", "n02480855", "n02481823", "n02483362", "n02483708", "n02484975", "n02486261", "n02486410", "n02487347", "n02488291", "n02488702", "n02489166", "n02490219", "n02492035", "n02492660", "n02493509", "n02493793", "n02494079", "n02497673", "n02500267", "n02504013", "n02504458", "n02509815", "n02510455", "n02514041", "n02526121", "n02536864", "n02606052", "n02607072", "n02640242", "n02641379", "n02643566", "n02655020", "n02666196", "n02667093", "n02669723", "n02672831", "n02676566", "n02687172", "n02690373", "n02692877", "n02699494", "n02701002", "n02704792", "n02708093", "n02727426", "n02730930", "n02747177", "n02749479", "n02769748", "n02776631", "n02777292", "n02782093", "n02783161", "n02786058", "n02787622", "n02788148", "n02790996", "n02791124", "n02791270", "n02793495", "n02794156", "n02795169", "n02797295", "n02799071", "n02802426", "n02804414", "n02804610", "n02807133", "n02808304", "n02808440", "n02814533", "n02814860", "n02815834", "n02817516", "n02823428", "n02823750", "n02825657", "n02834397", "n02835271", "n02837789", "n02840245", "n02841315", "n02843684", "n02859443", "n02860847", "n02865351", "n02869837", "n02870880", "n02871525", "n02877765", "n02879718", "n02883205", "n02892201", "n02892767", "n02894605", "n02895154", "n02906734", "n02909870", "n02910353", "n02916936", "n02917067", "n02927161", "n02930766", "n02939185", "n02948072", "n02950826", "n02951358", "n02951585", "n02963159", "n02965783", "n02966193", "n02966687", "n02971356", "n02974003", "n02977058", "n02978881", "n02979186", "n02980441", "n02981792", "n02988304", "n02992211", "n02992529", "n02999410", "n03000134", "n03000247", "n03000684", "n03014705", "n03016953", "n03017168", "n03018349", "n03026506", "n03028079", "n03032252", "n03041632", "n03042490", "n03045698", "n03047690", "n03062245", "n03063599", "n03063689", "n03065424", "n03075370", "n03085013", "n03089624", "n03095699", "n03100240", "n03109150", "n03110669", "n03124043", "n03124170", "n03125729", "n03126707", "n03127747", "n03127925", "n03131574", "n03133878", "n03134739", "n03141823", "n03146219", "n03160309", "n03179701", "n03180011", "n03187595", "n03188531", "n03196217", "n03197337", "n03201208", "n03207743", "n03207941", "n03208938", "n03216828", "n03218198", "n03220513", "n03223299", "n03240683", "n03249569", "n03250847", "n03255030", "n03259280", "n03271574", "n03272010", "n03272562", "n03290653", "n03291819", "n03297495", "n03314780", "n03325584", "n03337140", "n03344393", "n03345487", "n03347037", "n03355925", "n03372029", "n03376595", "n03379051", "n03384352", "n03388043", "n03388183", "n03388549", "n03393912", "n03394916", "n03400231", "n03404251", "n03417042", "n03424325", "n03425413", "n03443371", "n03444034", "n03445777", "n03445924", "n03447447", "n03447721", "n03450230", "n03452741", "n03457902", "n03459775", "n03461385", "n03467068", "n03476684", "n03476991", "n03478589", "n03481172", "n03482405", "n03483316", "n03485407", "n03485794", "n03492542", "n03494278", "n03495258", "n03496892", "n03498962", "n03527444", "n03529860", "n03530642", "n03532672", "n03534580", "n03535780", "n03538406", "n03544143", "n03584254", "n03584829", "n03590841", "n03594734", "n03594945", "n03595614", "n03598930", "n03599486", "n03602883", "n03617480", "n03623198", "n03627232", "n03630383", "n03633091", "n03637318", "n03642806", "n03649909", "n03657121", "n03658185", "n03661043", "n03662601", "n03666591", "n03670208", "n03673027", "n03676483", "n03680355", "n03690938", "n03691459", "n03692522", "n03697007", "n03706229", "n03709823", "n03710193", "n03710637", "n03710721", "n03717622", "n03720891", "n03721384", "n03724870", "n03729826", "n03733131", "n03733281", "n03733805", "n03742115", "n03743016", "n03759954", "n03761084", "n03763968", "n03764736", "n03769881", "n03770439", "n03770679", "n03773504", "n03775071", "n03775546", "n03776460", "n03777568", "n03777754", "n03781244", "n03782006", "n03785016", "n03786901", "n03787032", "n03788195", "n03788365", "n03791053", "n03792782", "n03792972", "n03793489", "n03794056", "n03796401", "n03803284", "n03804744", "n03814639", "n03814906", "n03825788", "n03832673", "n03837869", "n03838899", "n03840681", "n03841143", "n03843555", "n03854065", "n03857828", "n03866082", "n03868242", "n03868863", "n03871628", "n03873416", "n03874293", "n03874599", "n03876231", "n03877472", "n03877845", "n03884397", "n03887697", "n03888257", "n03888605", "n03891251", "n03891332", "n03895866", "n03899768", "n03902125", "n03903868", "n03908618", "n03908714", "n03916031", "n03920288", "n03924679", "n03929660", "n03929855", "n03930313", "n03930630", "n03933933", "n03935335", "n03937543", "n03938244", "n03942813", "n03944341", "n03947888", "n03950228", "n03954731", "n03956157", "n03958227", "n03961711", "n03967562", "n03970156", "n03976467", "n03976657", "n03977966", "n03980874", "n03982430", "n03983396", "n03991062", "n03992509", "n03995372", "n03998194", "n04004767", "n04005630", "n04008634", "n04009552", "n04019541", "n04023962", "n04026417", "n04033901", "n04033995", "n04037443", "n04039381", "n04040759", "n04041544", "n04044716", "n04049303", "n04065272", "n04067472", "n04069434", "n04070727", "n04074963", "n04081281", "n04086273", "n04090263", "n04099969", "n04111531", "n04116512", "n04118538", "n04118776", "n04120489", "n04125021", "n04127249", "n04131690", "n04133789", "n04136333", "n04141076", "n04141327", "n04141975", "n04146614", "n04147183", "n04149813", "n04152593", "n04153751", "n04154565", "n04162706", "n04179913", "n04192698", "n04200800", "n04201297", "n04204238", "n04204347", "n04208210", "n04209133", "n04209239", "n04228054", "n04229816", "n04235860", "n04238763", "n04239074", "n04243546", "n04251144", "n04252077", "n04252225", "n04254120", "n04254680", "n04254777", "n04258138", "n04259630", "n04263257", "n04264628", "n04265275", "n04266014", "n04270147", "n04273569", "n04275548", "n04277352", "n04285008", "n04286575", "n04296562", "n04310018", "n04311004", "n04311174", "n04317175", "n04325704", "n04326547", "n04328186", "n04330267", "n04332243", "n04335435", "n04336792", "n04344873", "n04346328", "n04347754", "n04350905", "n04355338", "n04355933", "n04356056", "n04357314", "n04366367", "n04367480", "n04370456", "n04371430", "n04371774", "n04372370", "n04376876", "n04380533", "n04389033", "n04392985", "n04398044", "n04399382", "n04404412", "n04409515", "n04417672", "n04418357", "n04423845", "n04428191", "n04429376", "n04435653", "n04442312", "n04443257", "n04447861", "n04456115", "n04458633", "n04461696", "n04462240", "n04465501", "n04467665", "n04476259", "n04479046", "n04482393", "n04483307", "n04485082", "n04486054", "n04487081", "n04487394", "n04493381", "n04501370", "n04505470", "n04507155", "n04509417", "n04515003", "n04517823", "n04522168", "n04523525", "n04525038", "n04525305", "n04532106", "n04532670", "n04536866", "n04540053", "n04542943", "n04548280", "n04548362", "n04550184", "n04552348", "n04553703", "n04554684", "n04557648", "n04560804", "n04562935", "n04579145", "n04579432", "n04584207", "n04589890", "n04590129", "n04591157", "n04591713", "n04592741", "n04596742", "n04597913", "n04599235", "n04604644", "n04606251", "n04612504", "n04613696", "n06359193", "n06596364", "n06785654", "n06794110", "n06874185", "n07248320", "n07565083", "n07579787", "n07583066", "n07584110", "n07590611", "n07613480", "n07614500", "n07615774", "n07684084", "n07693725", "n07695742", "n07697313", "n07697537", "n07711569", "n07714571", "n07714990", "n07715103", "n07716358", "n07716906", "n07717410", "n07717556", "n07718472", "n07718747", "n07720875", "n07730033", "n07734744", "n07742313", "n07745940", "n07747607", "n07749582", "n07753113", "n07753275", "n07753592", "n07754684", "n07760859", "n07768694", "n07802026", "n07831146", "n07836838", "n07860988", "n07871810", "n07873807", "n07875152", "n07880968", "n07892512", "n07920052", "n07930864", "n07932039", "n09193705", "n09229709", "n09246464", "n09256479", "n09288635", "n09332890", "n09399592", "n09421951", "n09428293", "n09468604", "n09472597", "n09835506", "n10148035", "n10565667", "n11879895", "n11939491", "n12057211", "n12144580", "n12267677", "n12620546", "n12768682", "n12985857", "n12998815", "n13037406", "n13040303", "n13044778", "n13052670", "n13054560", "n13133613", "n15075141", ] # ImageNet-R folder names/class IDs. Subset of ImageNet-1k classes IMAGENET_R_SYNSETS = [ "n01443537", "n01484850", "n01494475", "n01498041", "n01514859", "n01518878", "n01531178", "n01534433", "n01614925", "n01616318", "n01630670", "n01632777", "n01644373", "n01677366", "n01694178", "n01748264", "n01770393", "n01774750", "n01784675", "n01806143", "n01820546", "n01833805", "n01843383", "n01847000", "n01855672", "n01860187", "n01882714", "n01910747", "n01944390", "n01983481", "n01986214", "n02007558", "n02009912", "n02051845", "n02056570", "n02066245", "n02071294", "n02077923", "n02085620", "n02086240", "n02088094", "n02088238", "n02088364", "n02088466", "n02091032", "n02091134", "n02092339", "n02094433", "n02096585", "n02097298", "n02098286", "n02099601", "n02099712", "n02102318", "n02106030", "n02106166", "n02106550", "n02106662", "n02108089", "n02108915", "n02109525", "n02110185", "n02110341", "n02110958", "n02112018", "n02112137", "n02113023", "n02113624", "n02113799", "n02114367", "n02117135", "n02119022", "n02123045", "n02128385", "n02128757", "n02129165", "n02129604", "n02130308", "n02134084", "n02138441", "n02165456", "n02190166", "n02206856", "n02219486", "n02226429", "n02233338", "n02236044", "n02268443", "n02279972", "n02317335", "n02325366", "n02346627", "n02356798", "n02363005", "n02364673", "n02391049", "n02395406", "n02398521", "n02410509", "n02423022", "n02437616", "n02445715", "n02447366", "n02480495", "n02480855", "n02481823", "n02483362", "n02486410", "n02510455", "n02526121", "n02607072", "n02655020", "n02672831", "n02701002", "n02749479", "n02769748", "n02793495", "n02797295", "n02802426", "n02808440", "n02814860", "n02823750", "n02841315", "n02843684", "n02883205", "n02906734", "n02909870", "n02939185", "n02948072", "n02950826", "n02951358", "n02966193", "n02980441", "n02992529", "n03124170", "n03272010", "n03345487", "n03372029", "n03424325", "n03452741", "n03467068", "n03481172", "n03494278", "n03495258", "n03498962", "n03594945", "n03602883", "n03630383", "n03649909", "n03676483", "n03710193", "n03773504", "n03775071", "n03888257", "n03930630", "n03947888", "n04086273", "n04118538", "n04133789", "n04141076", "n04146614", "n04147183", "n04192698", "n04254680", "n04266014", "n04275548", "n04310018", "n04325704", "n04347754", "n04389033", "n04409515", "n04465501", "n04487394", "n04522168", "n04536866", "n04552348", "n04591713", "n07614500", "n07693725", "n07695742", "n07697313", "n07697537", "n07714571", "n07714990", "n07718472", "n07720875", "n07734744", "n07742313", "n07745940", "n07749582", "n07753275", "n07753592", "n07768694", "n07873807", "n07880968", "n07920052", "n09472597", "n09835506", "n10565667", "n12267677", ] # ImageNet-A folder names/class IDs. Subset of ImageNet-1k classes IMAGENET_A_SYNSETS = [ "n01498041", "n01531178", "n01534433", "n01558993", "n01580077", "n01614925", "n01616318", "n01631663", "n01641577", "n01669191", "n01677366", "n01687978", "n01694178", "n01698640", "n01735189", "n01770081", "n01770393", "n01774750", "n01784675", "n01819313", "n01820546", "n01833805", "n01843383", "n01847000", "n01855672", "n01882714", "n01910747", "n01914609", "n01924916", "n01944390", "n01985128", "n01986214", "n02007558", "n02009912", "n02037110", "n02051845", "n02077923", "n02085620", "n02099601", "n02106550", "n02106662", "n02110958", "n02119022", "n02123394", "n02127052", "n02129165", "n02133161", "n02137549", "n02165456", "n02174001", "n02177972", "n02190166", "n02206856", "n02219486", "n02226429", "n02231487", "n02233338", "n02236044", "n02259212", "n02268443", "n02279972", "n02280649", "n02281787", "n02317335", "n02325366", "n02346627", "n02356798", "n02361337", "n02410509", "n02445715", "n02454379", "n02486410", "n02492035", "n02504458", "n02655020", "n02669723", "n02672831", "n02676566", "n02690373", "n02701002", "n02730930", "n02777292", "n02782093", "n02787622", "n02793495", "n02797295", "n02802426", "n02814860", "n02815834", "n02837789", "n02879718", "n02883205", "n02895154", "n02906734", "n02948072", "n02951358", "n02980441", "n02992211", "n02999410", "n03014705", "n03026506", "n03124043", "n03125729", "n03187595", "n03196217", "n03223299", "n03250847", "n03255030", "n03291819", "n03325584", "n03355925", "n03384352", "n03388043", "n03417042", "n03443371", "n03444034", "n03445924", "n03452741", "n03483316", "n03584829", "n03590841", "n03594945", "n03617480", "n03666591", "n03670208", "n03717622", "n03720891", "n03721384", "n03724870", "n03775071", "n03788195", "n03804744", "n03837869", "n03840681", "n03854065", "n03888257", "n03891332", "n03935335", "n03982430", "n04019541", "n04033901", "n04039381", "n04067472", "n04086273", "n04099969", "n04118538", "n04131690", "n04133789", "n04141076", "n04146614", "n04147183", "n04179913", "n04208210", "n04235860", "n04252077", "n04252225", "n04254120", "n04270147", "n04275548", "n04310018", "n04317175", "n04344873", "n04347754", "n04355338", "n04366367", "n04376876", "n04389033", "n04399382", "n04442312", "n04456115", "n04482393", "n04507155", "n04509417", "n04532670", "n04540053", "n04554684", "n04562935", "n04591713", "n04606251", "n07583066", "n07695742", "n07697313", "n07697537", "n07714990", "n07718472", "n07720875", "n07734744", "n07749582", "n07753592", "n07760859", "n07768694", "n07831146", "n09229709", "n09246464", "n09472597", "n09835506", "n11879895", "n12057211", "n12144580", "n12267677", ] ================================================ FILE: corenet/data/datasets/classification/imagenet_v2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import tarfile from pathlib import Path from typing import Dict, Tuple import torch from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.dataset_base import BaseImageDataset from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.utils import logger from corenet.utils.download_utils import get_local_path IMAGENETv2_SPLIT_LINK_MAP = { "matched_frequency": { "url": "https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-matched-frequency.tar.gz", "extracted_folder_name": "imagenetv2-matched-frequency-format-val", }, "threshold_0.7": { "url": "https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-threshold0.7.tar.gz", "extracted_folder_name": "imagenetv2-threshold0.7-format-val", }, "top_images": { "url": "https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-top-images.tar.gz", "extracted_folder_name": "imagenetv2-top-images-format-val", }, } @DATASET_REGISTRY.register(name="imagenet_v2", type="classification") class Imagenetv2Dataset(BaseImageDataset): """ `ImageNetv2 Dataset `_ for studying the robustness of models trained on ImageNet dataset Args: opts: command-line arguments """ def __init__( self, opts, *args, **kwargs, ) -> None: super().__init__(opts=opts, *args, **kwargs) if self.is_training: logger.error( "{} can only be used for evaluation".format(self.__class__.__name__) ) split = getattr(opts, "dataset.imagenet_v2.split", None) if split is None or split not in IMAGENETv2_SPLIT_LINK_MAP.keys(): logger.error( "Please specify split for ImageNetv2. Supported ImageNetv2 splits are: {}".format( IMAGENETv2_SPLIT_LINK_MAP.keys() ) ) split_path = get_local_path(opts, path=IMAGENETv2_SPLIT_LINK_MAP[split]["url"]) with tarfile.open(split_path) as tf: tf.extractall(self.root) root = Path( "{}/{}".format( self.root, IMAGENETv2_SPLIT_LINK_MAP[split]["extracted_folder_name"], ) ) file_names = list(root.glob("**/*.jpeg")) self.file_names = file_names @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add dataset-specific arguments to the parser.""" if cls != Imagenetv2Dataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.imagenet-v2.split", type=str, default="matched-frequency", help="ImageNetv2 dataset. Possible choices are: {}".format( [ f"{i + 1}: {split_name}" for i, split_name in enumerate(IMAGENETv2_SPLIT_LINK_MAP.keys()) ] ), choices=IMAGENETv2_SPLIT_LINK_MAP.keys(), ) return parser def _validation_transforms(self, *args, **kwargs): """Data transforms during validation Order of transform is Resize, CenterCrop, ToTensor Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ aug_list = [ T.Resize(opts=self.opts), T.CenterCrop(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def __getitem__(self, sample_size_and_index: Tuple) -> Dict: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Shapes: The output data dictionary contains three keys (samples, sample_id, and target). The values of these keys has the following shapes: data["samples"]: Shape is [Channels, Height, Width] data["sample_id"]: Shape is 1 data["targets"]: Shape is 1 Returns: A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index and label of a sample, respectively. """ crop_size_h, crop_size_w, img_index = sample_size_and_index # same for validation and evaluation transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) # infer target label from the file name # file names are organized as SPLIT_NAME-format-val/class_idx/*.jpg # Example: All images in this folder (imagenetv2-matched-frequency-format-val/0/*.jpg) belong to class 0 img_path = str(self.file_names[img_index]) target = int(self.file_names[img_index].parent.name) input_img = self.read_image_pil(img_path) if input_img is None: # Sometimes images are corrupt # Skip such images logger.log("Img index {} is possibly corrupt.".format(img_index)) input_tensor = torch.zeros( size=(3, crop_size_h, crop_size_w), dtype=torch.float ) target = -1 data = {"image": input_tensor} else: data = {"image": input_img} data = transform_fn(data) data["samples"] = data["image"] data["targets"] = target data["sample_id"] = img_index return data def __len__(self) -> int: return len(self.file_names) ================================================ FILE: corenet/data/datasets/classification/places365.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) @DATASET_REGISTRY.register(name="places365", type="classification") class Places365Dataset(BaseImageClassificationDataset): """ Places365 dataset that follows the structure of ImageClassificationDataset. "Places: A 10 million Image Database for Scene Recognition" B. Zhou, A. Lapedriza, A. Khosla, A. Oliva, and A. Torralba IEEE Transactions on Pattern Analysis and Machine Intelligence, 2017 """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: BaseImageClassificationDataset.__init__( self, opts=opts, *args, **kwargs, ) ================================================ FILE: corenet/data/datasets/classification/wordnet_tagged_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import fcntl import glob import io import os import pickle import random import shutil import tarfile from pathlib import Path from typing import Any, List, Mapping, Tuple from urllib.parse import urlsplit import pybase64 import torch from PIL import Image, ImageFile try: import nltk from nltk.corpus import wordnet as wn from nltk.corpus.reader.wordnet import Synset from nltk.stem import WordNetLemmatizer NLTK_INSTALLED = True except ModuleNotFoundError: wn = None Synset = None WordNetLemmatizer = None NLTK_INSTALLED = False from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) from corenet.data.datasets.dataset_base import BaseImageDataset from corenet.data.datasets.utils.text import caption_preprocessing from corenet.data.io.transfer_clients import BaseClient, get_transfer_client from corenet.data.transforms import BaseTransformation from corenet.utils import logger from corenet.utils.download_utils import get_local_path # To enable reading truncated images, we update the default values of following variables in PIL # TODO: Investigate later if below Image flags can be moved to where Image is read. Image.MAX_IMAGE_PIXELS = None ImageFile.LOAD_TRUNCATED_IMAGES = True TAR_FILE_EXTN = "tar.gz" TAR_FILE_EXTRACTION_CODE = "r:gz" SAMPLE_FILE_EXTN = "pkl" def extract_pos_offset_info_from_synset(synset: Synset) -> str: """Extracts part-of-speech and offset information from the input @synset. Args: synset: WordNet synset. Returns: A string containing part-of-speech and offset information about the synset. """ offset = synset.offset() pos = synset.pos() return f"{pos}{offset}" def check_valid_noun_synset(synset: Synset, word: str) -> bool: """Check if input synset and word are the same. Args: synset: Input synset. word: Input word. Returns: A boolean indicating if input synset and word are the same or not. """ return synset.name() == f"{word}.n.01" @DATASET_REGISTRY.register(name="wordnet_tagged_classification", type="classification") class WordnetTaggedClassificationDataset(BaseImageDataset): """WordNet tagged classification dataset. This class converts the image-text dataset into multi-label classification dataset. The expected data structure of the input data should be the same as 'corenet.data.datasets.multi_modal_img_text.img_text_tar_dataset.ImgTextTarDataset' Args: opts: Command-line arguments. """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: if not NLTK_INSTALLED: logger.error( "Please install NLTK library using 'pip install nltk==3.8.1' and 'python3 -m nltk.downloader all' commands." ) super().__init__(opts=opts, *args, **kwargs) self._transfer_client = None self.vocab = self._get_vocab() self.__post_init__() def __post_init__(self) -> None: """Post init checks.""" if not self.is_training: raise NotImplementedError("Only training is supported for now.") def _get_vocab(self) -> List[str]: """Retrieves the vocabulary as a list. The vocabulary is structured as a dictionary where synsets are represented as keys in pos-offset format, and their corresponding frequencies in the dataset are stored as values. The key-value pairs are arranged in descending order based on the frequencies. An example is shown below: { "n5928118": 52418327, "n13333833": 46393897, "n4960277": 38781582, "n7947958": 36532096, "n9638875": 34564013, "n928077": 30290822, "n7996689": 28076676, "n10787470": 24182531, "n5938976": 23817664, "n8559508": 23476398 } Returns: A list containing the name of top-k synsets. The value of 'k' is specified using 'dataset.wordnet_tagged_classification.vocab_size' argument. """ vocab_file_path = getattr( self.opts, "dataset.wordnet_tagged_classification.vocab_file" ) if vocab_file_path is None: logger.error(f"Vocab path can't be None in {self.__class__.__name__}.") vocab_file_path = get_local_path( self.opts, path=vocab_file_path, force_delete=False, use_start_rank=True, sync_ranks=False, ) with open(vocab_file_path, "rb") as f: vocab = pickle.load(f) vocab_size = getattr( self.opts, "dataset.wordnet_tagged_classification.vocab_size" ) if vocab_size is None or vocab_size < 0: logger.error( f"Vocabulary size should be a positive number. Got: {vocab_size}. Please specify by 'dataset.wordnet_tagged_classification.vocab_size' argument." ) return list(vocab.keys())[:vocab_size] def _metadata_file_path(self) -> str: """Returns metadata file path from command-line arguments.""" opts = self.opts metadata_file_path = getattr( opts, f"dataset.wordnet_tagged_classification.metadata_file" ) if not metadata_file_path: logger.error( f"Please specify metadata file path using 'dataset.wordnet_tagged_classification.metadata_file'." ) return metadata_file_path def _metadata(self): """Reads the metadata content. ...note: The metadata file is expected to have following keys: 1. total_tar_files: Total number of tar files in the dataset. 2. max_files_per_tar: Maximum number of files inside each tar. 3. tar_file_names: List containing names of the tar files. """ opts = self.opts metadata_file_path = self._metadata_file_path() # download the metadata file metadata_file_local_path = get_local_path( opts, path=metadata_file_path, force_delete=False, use_start_rank=True, sync_ranks=False, ) with open(metadata_file_local_path, "rb") as handle: metadata = pickle.load(handle) if not {"total_tar_files", "max_files_per_tar", "tar_file_names"}.issubset( metadata.keys() ): logger.error( f"Metadata file in {self.__class__.__name__} should have following keys: \ total_tar_files, max_files_per_tar, tar_file_names" ) return metadata def _download_and_extract_tar_file(self, sample_index: int) -> int: """Downloads and extracts the tar file. The tar files are pre-assumably stored in remote location (e.g., S3 bucket) and, if required, are downloaded and extracted to local directory @self.cache_loc. Because of distributed and multi-process training, we first extract them in the same location as downloaded, and then move to @self.cache_loc. Args: sample_index: Sample index. Returns: Index of the folder in which sample may be present. ...note: Each tar file may have samples less than @self.max_files_per_tar because of filtering criteria. """ # Retrieve the folder index that may contain the sample. folder_idx = sample_index // self.max_files_per_tar metadata_file_path = self._metadata_file_path() remote_directory = os.path.dirname(metadata_file_path) remote_file_path = f"{remote_directory}/{folder_idx}.{TAR_FILE_EXTN}" with open( f"{self.cache_loc}/{folder_idx}.{TAR_FILE_EXTN}.lock", "a" ) as lock_file: try: fcntl.flock(lock_file, fcntl.LOCK_EX) if os.path.isdir(f"{self.cache_loc}/{folder_idx}"): return folder_idx transfer_client = self._get_transfer_client( file_path=metadata_file_path ) local_tar_file_path = transfer_client.download( remote_file_paths=remote_file_path, dst_dir=self.cache_loc ) # extract the tar file in the same location where tar file is downloaded tar_file_basename = os.path.basename(local_tar_file_path) with tarfile.open(local_tar_file_path, TAR_FILE_EXTRACTION_CODE) as tar: tar.extractall( path=local_tar_file_path.replace(tar_file_basename, "") ) # move extracted tar file to @self.cache_loc shutil.move( local_tar_file_path.replace(f".{TAR_FILE_EXTN}", ""), self.cache_loc ) # Delete the tar file if os.path.exists(local_tar_file_path): os.remove(local_tar_file_path) finally: fcntl.flock(lock_file, fcntl.LOCK_UN) return folder_idx def _convert_caption_to_labels(self, captions_str: str) -> List[int]: """Converts the caption into multi-class labels. The input caption is tokenized into words, and noun synsets are extracted for each word. Subsequently, the parts of speech (POS) and offsets of the extracted noun synsets are compared with those in the vocabulary to generate a list of multi-class labels. Args: captions_str: Input caption as a string. Returns: A list of integers, where each integer corresponds to the index of the matching synset in the vocabulary. In case there are no matching synsets, an empty list is returned. """ captions_str = caption_preprocessing(captions_str) # process caption and find synsets tagged_words = nltk.pos_tag(nltk.word_tokenize(captions_str)) lemmatzr = WordNetLemmatizer() labels = [] for word, pos in tagged_words: # use lemmatizer to reduce text ambiguity. # words like bicycle and bicycles are converted to bicycle try: word = lemmatzr.lemmatize(word) noun_synset = wn.synset(f"{word}.n.01") except Exception as e: # No lemma 'is' with part of speech 'n', then nltk.corpus.reader.wordnet.WordNetError is raised. # Skip such cases continue if not check_valid_noun_synset(noun_synset, word): continue noun_synset = extract_pos_offset_info_from_synset(noun_synset) if noun_synset in self.vocab: # add the indices of the labels labels.append(self.vocab.index(noun_synset)) return labels def _read_sample_with_wordnet_label_mining( self, sample_index: int ) -> Tuple[Image.Image, List[str]]: """Reads the sample with WordNet derived labels. The function extracts the image and caption corresponding to input @sample_index. It then converts the caption into multi-class labels. Args: sample_index: Sample index. Returns: Returns a tuple of image and mult-class labels for a given sample index. """ # Check if this folder exists. If not, then download the tar file and extract it. folder_idx = self._download_and_extract_tar_file(sample_index=sample_index) file_name = f"{self.cache_loc}/{folder_idx}/{sample_index}.{SAMPLE_FILE_EXTN}" if not Path(file_name).exists(): # Each tar file is supposed to have certain number of samples, but # it may not have all samples (because some samples may be corrupted and are filtered). # Therefore, if file does not exist, we randomly sample the file from a folder and return its content. # This helps in avoiding errors related to tensor mismatch shapes (usually arises when each GPU has different batch size) # when gathering the image and text embeddings from all GPUs in contrastive loss. files_in_folder = glob.glob( f"{self.cache_loc}/{folder_idx}/*.{SAMPLE_FILE_EXTN}" ) assert len(files_in_folder) > 0 file_name = random.choice(files_in_folder) with open(file_name, "rb") as handle: data = pickle.load(handle) img_bytes = pybase64.b64decode(data["image"], validate=True) image = Image.open(io.BytesIO(img_bytes)).convert("RGBA").convert("RGB") if "texts" in data: caption_str = data["texts"] elif "text" in data: caption_str = data["text"] else: raise NotImplementedError("Text key not found.") labels = self._convert_caption_to_labels(captions_str=caption_str) return image, labels def _training_transforms(self, *args, **kwargs) -> BaseTransformation: """Image transformations to be applied on input image during training. See 'BaseImageClassificationDataset' for the supported transformations for the classification task. """ return BaseImageClassificationDataset._training_transforms( self, *args, **kwargs ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add dataset-specific arguments to the parser.""" if cls == WordnetTaggedClassificationDataset: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.wordnet-tagged-classification.vocab-file", type=str, default=None, help="Location of vocab pickle file. Defaults to None.", ) group.add_argument( "--dataset.wordnet-tagged-classification.metadata-file", type=str, default=None, help="Metadata file containing information about img-text pairs. Defaults to None.", ) group.add_argument( "--dataset.wordnet-tagged-classification.vocab-size", type=int, default=None, help="Vocabulary threshold. Synsets in the ordered vocabulary dictionary beyond this threshold will not be used. Defaults to None (i.e., user needs to specify the value).", ) return parser def _get_transfer_client(self, file_path: str) -> BaseClient: """Get transfer client for a given file path. Args: file_path: File path. Returns: An instance of BaseClient. ...note: Some of the clients are not pickle-able (e.g., S3). Therefore, this function should not be called inside the '__init__' function. """ if self._transfer_client is None: opts = self.opts client_name = urlsplit(file_path).scheme.lower() self._transfer_client = get_transfer_client( opts, transfer_client_name=client_name, force_delete=False, only_download_on_start_rank=False, synchronize_distributed_ranks=False, parallel_download=False, ) return self._transfer_client def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Mapping[str, Any]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index). Returns: A dictionary with 'samples', 'targets', and 'sample_id' as keys corresponding to input, label, and index of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]: Shape is [Channels, Height, Width] output_data["targets"]: Shape is [vocab_size] output_data["sample_id"]: Shape is [1] """ crop_size_h, crop_size_w, sample_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) image, labels = self._read_sample_with_wordnet_label_mining(sample_index) # convert labels to one hot vector targets = torch.zeros((self.vocab_size), dtype=torch.long) if labels is not None and len(labels) > 0: targets[labels] = 1 output_data = { "samples": transform_fn({"image": image})["image"], "targets": targets, "sample_id": sample_index, } return output_data def __len__(self) -> int: return self.total_tar_files * self.max_files_per_tar @property def cache_loc(self) -> str: return DATA_CACHE_DIR @property def vocab_size(self): return len(self.vocab) @property def total_tar_files(self) -> int: """Total number of tar files in the dataset.""" metadata = self._metadata() return metadata["total_tar_files"] @property def max_files_per_tar(self) -> int: """Maximum number of files inside each tar file.""" metadata = self._metadata() return metadata["max_files_per_tar"] def extra_repr(self) -> str: return super().extra_repr() + ( f"\n\ttotal_tar_files={self.total_tar_files}" f"\n\tmax_files_per_tar={self.max_files_per_tar}" f"\n\tnum_synsets={self.vocab_size}" ) ================================================ FILE: corenet/data/datasets/dataset_base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from __future__ import annotations import argparse from abc import ABC from functools import cached_property from typing import Any, Dict, Optional, TypedDict import torch from PIL import Image from torch.utils import data from corenet.data.transforms import BaseTransformation from corenet.data.video_reader import get_video_reader from corenet.utils import logger from corenet.utils.ddp_utils import ( get_node_rank, get_world_size, is_master, is_start_rank_node, ) class BaseDataset(data.Dataset, ABC): """Base class for creating datasets. Sub-classes must implement __getitem__, _training_transforms, and _validation_transforms functions. Args: opts: Command-line arguments is_training: Training mode or not. Defaults to True. is_evaluation: Evaluation mode or not. Defaults to False. ...note:: `is_training` is used to indicate whether the dataset is used for training or validation. On the other hand, `is_evaluation` mode is used to indicate the dataset is used for testing. Theoretically, `is_training=False` and `is_evaluation=True` should be the same. However, for some datasets (especially segmentation), validation dataset transforms are different from test transforms because each image has different resolution, making it difficult to construct batches. Therefore, we treat these two modes different. For datasets, where validation and testing transforms are the same, we set evaluation transforms the same as the validation transforms. """ def __init__( self, opts: argparse.Namespace, is_training: bool = True, is_evaluation: bool = False, *args, **kwargs, ) -> None: # Do not remove the default value here. if getattr(opts, "dataset.trove.enable", False): opts = self.load_from_server( opts=opts, is_training=is_training, is_evaluation=is_evaluation ) assert ( not is_training or not is_evaluation ), "is_training and is_evaluation cannot be both True" if is_training: self.mode = "train" elif is_evaluation: self.mode = "test" else: self.mode = "val" self.root = getattr(opts, f"dataset.root_{self.mode}") if self.mode == "test" and not getattr(opts, f"dataset.root_test"): # Only use root_test when applicable. Most datasets only define root_val. self.root = getattr(opts, f"dataset.root_val") self.is_training = is_training self.is_evaluation = is_evaluation self.opts = opts self.device = getattr(self.opts, "dev.device", torch.device("cpu")) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add dataset-specific arguments""" if cls != BaseDataset: # Don't re-register arguments in subclasses that don't override # `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.root-train", type=str, default="", help="Root location of train dataset", ) group.add_argument( "--dataset.root-val", type=str, default="", help="Root location of valid dataset", ) group.add_argument( "--dataset.root-test", type=str, default="", help="Root location of test dataset", ) group.add_argument( "--dataset.disable-val", action="store_true", default=False, help="Disable validation during training", ) group.add_argument( "--dataset.name", type=str, default=None, help="Dataset name (e.g., imagenet). Defaults to None.", ) group.add_argument( "--dataset.category", type=str, default=None, help="Dataset category (e.g., segmentation, classification). Defaults to None.", ) group.add_argument( "--dataset.percentage-of-samples", type=float, default=100.0, help="Percentage of samples to use from the dataset.", ) group.add_argument( "--dataset.sample-selection-random-seed", type=int, default=0, help="Random seed for selecting a subset of samples to use from the dataset.", ) group.add_argument( "--dataset.train-batch-size0", default=128, type=int, help="Training batch size on GPU-0. Defaults to 128. " "Note that we scale it depending on total GPUs available for training. For" " example, if 2 GPUs are available and value of `dataset.train_batch_size0`" " is 128, then effective batch size will be 256.", ) group.add_argument( "--dataset.val-batch-size0", default=1, type=int, help="Batch size on GPU-0 for validation. Defaults to 1. " "Note that we scale it depending on total GPUs available for training. For" " example, if 2 GPUs are available and value of `dataset.val_batch_size0`" " is 128, then effective batch size will be 256.", ) group.add_argument( "--dataset.eval-batch-size0", default=1, type=int, help="Batch size on GPU-0 for testing or evaluation. Defaults to 1." "Note that we scale it automatically depending on total number of GPUs" " available. We recommend to run evaluation on a single GPU machine.", ) group.add_argument( "--dataset.workers", default=-1, type=int, help="Number of data workers. Defaults to -1." "When number of workers are specified as -1, then total number of workers" " is equal to the number of available CPUs.", ) group.add_argument( "--dataset.persistent-workers", action="store_true", default=False, help="Enabling this argument allows us to use same workers for loading data" " throughout the training. Defaults to False.", ) group.add_argument( "--dataset.pin-memory", action="store_true", default=False, help="Enabling this allows us to use pin memory option in data loader. " "Defaults to False.", ) group.add_argument( "--dataset.prefetch-factor", type=int, default=2, help="Number of samples loaded in advance by each data worker. Defaults to 2.", ) group.add_argument( "--dataset.padding-index", type=int, default=None, help="Padding index for text vocabulary. Defaults to None.", ) group.add_argument( "--dataset.text-vocab-size", type=int, default=-1, help="Text vocabulary size. Defaults to -1.", ) group.add_argument( "--dataset.text-context-length", type=int, default=None, help="Context length for text encoder. Defaults to None.", ) return parser @staticmethod def load_from_server( opts: argparse.Namespace, is_training: bool, is_evaluation: bool ) -> Optional[argparse.Namespace]: """Helper function to load dataset from server.""" try: from corenet.internal.utils.server_utils import load_from_data_server opts = load_from_data_server( opts=opts, is_training=is_training, is_evaluation=is_evaluation ) return opts except ImportError as e: import traceback traceback.print_exc() logger.error( "Unable to load data. Please load data manually. Error: {}".format(e) ) def _training_transforms(self, *args, **kwargs) -> BaseTransformation: """Data transforms for training""" raise NotImplementedError def _validation_transforms(self, *args, **kwargs) -> BaseTransformation: """Data transforms for validation""" raise NotImplementedError def _evaluation_transforms(self, *args, **kwargs) -> BaseTransformation: """Data transforms for evaluation/testing""" return self._validation_transforms(*args, **kwargs) def get_augmentation_transforms(self, *args, **kwargs) -> BaseTransformation: """Helper function to get data transforms depending on the mode (training, evaluation, or validation)""" if self.is_training: transform = self._training_transforms(*args, **kwargs) elif self.is_evaluation: transform = self._evaluation_transforms(*args, **kwargs) else: transform = self._validation_transforms(*args, **kwargs) return transform def share_dataset_arguments(self) -> Dict[str, Any]: """Function that can be used by sub-classes to share dataset-specific options. It returns a mapping. An example is {"model.classification.n_classes", 1000} By default, we return an empty dictionary """ return {} def __len__(self) -> int: raise NotImplementedError def __getitem__(self, sample_size_and_index: Any) -> Any: """Returns the sample corresponding to the input sample index.""" raise NotImplementedError def extra_repr(self) -> str: r"""Extra information to be represented in __repr__. Each line in the output string should be prefixed with ``\t``. """ return f"\n\tnum_samples={len(self)}" def __repr__(self) -> str: return ( f"{self.__class__.__name__}(" f"\n\troot={self.root} " f"\n\tis_training={self.is_training} " f"{self.extra_repr()}" f"\n)" ) def get_item_metadata(self, item_idx: int) -> Dict: """Returns the metadata for given @item_idx. This method could be used by samplers for sampling dynamic batches based on the metadata of the items. Args: item_idx: The index of sample to provide metadata for. The indexing should be aligned with how ``self.__getitem__(item_idx)`` sequences the dataset items. Returns: A dict containing the metadata. Each sampler may require a specific schema to be returned by this function. """ raise NotImplementedError() @property def worker_id(self) -> int: """Returns the current worker id when loading data with multiple workers in dataloader. ...note: When 'get_worker_info' is None, '0' is returned to indicate it's a single process. ...warning: This function should be called after dataset is wrapped inside dataloader. """ worker_info = torch.utils.data.get_worker_info() if worker_info is not None: return worker_info.id return 0 @property def num_workers(self) -> int: """Returns the number of workers used to load data with multi-processing in dataloader. ...note: When 'get_worker_info' is None, '1' is returned to indicate it's a single process. ...warning: This function should be called after dataset is wrapped inside dataloader. """ worker_info = torch.utils.data.get_worker_info() if worker_info is not None: return worker_info.num_workers return 1 @property def is_master_node(self) -> bool: """Check if the current node is the master node in the distributed system. Returns: True if the current node is the master node, False otherwise. ...warning: This function should be used with distributed training. """ return is_master(self.opts) @property def is_start_rank_node(self) -> bool: """Check if the GPU in a node is the first GPU or not during distributed training. Returns: True if the current GPU is the first GPU on each node. False otherwise. ...warning: This function should be used with distributed training. """ return is_start_rank_node(self.opts) @property def world_size(self) -> int: """Returns the number of processes in the current process group in distributed training. ...warning: This function should be used with distributed training. """ return max(1, getattr(self.opts, "ddp.world_size")) @property def rank(self) -> int: """Returns the rank of the current process in distributed training. ...note: Rank is a unique identifier assigned to each process within a distributed process group, and are always consecutive integers ranging from 0 to 'world_size'. ...warning: This function should be used with distributed training. """ return max(0, getattr(self.opts, "ddp.rank")) class BaseImageDataset(BaseDataset, ABC): """Base Dataset class for Image datasets.""" @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Reads a PIL image. Args: path: Path of image file. Returns: If there are no exceptions (e.g., because of corrupted images), PIL Image is returned. Otherwise, None. """ try: return Image.open(path).convert("RGB") except: # for any runtime exception while reading an image (typically arises from # corrupted images), we return None. return None def extra_repr(self) -> str: r"""Extra information to be represented in __repr__. Each line in the output string should be prefixed with ``\t``. """ from corenet.utils.tensor_utils import image_size_from_opts return ( super().extra_repr() + f"\n\ttransforms={self.get_augmentation_transforms(size=image_size_from_opts(self.opts))}" ) class BaseVideoDataset(BaseDataset, ABC): """Base Dataset class for video datasets. Args: opts: Command-line arguments """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: super().__init__(opts, *args, **kwargs) self.video_reader = get_video_reader(opts=opts, is_training=self.is_training) self._deprecated_clips_per_video = getattr(opts, "dataset.clips_per_video") self._deprecated_n_frames_per_clip = getattr(opts, "dataset.n_frames_per_clip") @property def clips_per_video(self) -> int: logger.warning( DeprecationWarning( "The --dataset.clips-per-video argument is deprecated. Please use" " VideoClipBatchSampler and its corresponding arguments." ) ) return self._deprecated_clips_per_video @clips_per_video.setter def _deprecated_set_clips_per_video(self, value: int) -> None: self._deprecated_clips_per_video = value @property def n_frames_per_clip(self) -> int: logger.warning( DeprecationWarning( "The --dataset.n-frames-per-clip argument is deprecated. Please use" " VideoClipBatchSampler and its corresponding arguments." ) ) return self._deprecated_n_frames_per_clip @n_frames_per_clip.setter def _deprecated_set_n_frames_per_clip(self, value: int) -> None: self._deprecated_n_frames_per_clip = value @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseVideoDataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.clips-per-video", type=int, default=1, help="The number of clips that each video file gets split into. Default" " value is 1, i.e., we don't split videos into multiple clips.", ) group.add_argument( "--dataset.n-frames-per-clip", type=int, default=64, help="The number of frames to read from the video file into each clip." " Defaults to 64.", ) return parser def get_item_metadata(self, item_idx: int) -> VideoMetadataDict: """Returns the metadata for given @item_idx. This method is used by VideoClipSampler for sampling dynamic clips based on the duration of the items. Subclasses should override this method if they use VideoClipSampler. Args: item_idx: The index of video file to provide metadata. The indexing should be aligned with how ``self.__getitem__(item_idx)`` sequences the dataset items. Returns: A dict containing the metadata. Please see @VideoMetadataDict documentation. """ raise NotImplementedError() def get_item_local_path(self, item_idx: int) -> str: """Returns the local video path for given @item_idx. Implementing this method is optional, but having a unified interface reduces the cost of adding features. Args: item_idx: The index of video file to provide metadata. The indexing should be aligned with how ``self.__getitem__(item_idx)`` sequences the dataset items. Returns: str: The local path (downloaded if required) to the video file. """ raise NotImplementedError() # The ``total=False`` annotation marks all dict entries as NotRequired. class VideoMetadataDict(TypedDict, total=False): """ This class is an alias of Dict, in addition to optional standard key names and value types. The fields will be required or optional depending on the Sampler. """ video_fps: float # (Required for VideoClipBatchSampler) total_video_frames: int # (Required for VideoClipBatchSampler) video_duration: ( float # video_fps * total_video_frames (Required for VideoClipBatchSampler) ) audio_fps: float class BaseIterableDataset(BaseDataset, data.IterableDataset): """Base class for Iterable datasets.""" pass ================================================ FILE: corenet/data/datasets/detection/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/data/datasets/detection/base_detection.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.datasets import BaseImageDataset class BaseDetectionDataset(BaseImageDataset): """Base Dataset class for object detection datasets.""" @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseDetectionDataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--evaluation.detection.save-overlay-boxes", action="store_true", help="enable this flag to visualize predicted masks on top of input image", ) group.add_argument( "--evaluation.detection.mode", type=str, default="validation_set", required=False, choices=["single_image", "image_folder", "validation_set"], help="Contribution of mask when overlaying on top of RGB image.", ) group.add_argument( "--evaluation.detection.path", type=str, default=None, help="Path of the image or image folder (only required for single_image and image_folder modes).", ) group.add_argument( "--evaluation.detection.num-classes", type=int, default=None, help="Number of segmentation classes used during training.", ) group.add_argument( "--evaluation.detection.resize-input-images", action="store_true", default=False, help="Resize input images to fixed size during detection evaluation.", ) return parser ================================================ FILE: corenet/data/datasets/detection/coco_base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import Any, Dict, List, Mapping, Optional, Tuple, Union import numpy as np import torch from pycocotools import mask as coco_mask from pycocotools.coco import COCO from torch import Tensor from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.detection.base_detection import BaseDetectionDataset from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.utils import logger @DATASET_REGISTRY.register(name="coco", type="detection") class COCODetection(BaseDetectionDataset): """Base class for the MS COCO Object Detection Dataset. Sub-classes should implement training and validation transform functions. Args: opts: command-line arguments .. note:: This class implements basic functions (e.g., reading image and annotations), and does not implement training/validation transforms. Detector specific sub-classes should extend this class and implement those methods. See `coco_ssd.py` as an example for SSD. """ def __init__( self, opts, *args, **kwargs, ) -> None: super().__init__(opts=opts, *args, **kwargs) split = "train" if self.is_training else "val" year = 2017 ann_file = os.path.join( self.root, "annotations/instances_{}{}.json".format(split, year) ) # disable printing, so that pycocotools print statements are not printed logger.disable_printing() self.coco = COCO(ann_file) self.img_dir = os.path.join(self.root, "images/{}{}".format(split, year)) self.ids = ( list(self.coco.imgToAnns.keys()) if self.is_training else list(self.coco.imgs.keys()) ) coco_categories = sorted(self.coco.getCatIds()) background_idx = 0 if getattr(opts, "dataset.detection.no_background_id") else 1 self.coco_id_to_contiguous_id = { coco_id: i + background_idx for i, coco_id in enumerate(coco_categories) } self.contiguous_id_to_coco_id = { v: k for k, v in self.coco_id_to_contiguous_id.items() } self.num_classes = len(self.contiguous_id_to_coco_id.keys()) + background_idx # enable printing logger.enable_printing() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != COCODetection: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.detection.no-background-id", action="store_true", default=False, help="Do not include background id in detection class labels. Defaults to False.", ) return parser def _evaluation_transforms( self, size: tuple, *args, **kwargs ) -> T.BaseTransformation: """Evaluation or Inference transforms (Resize (Optional) --> Tensor). .. note:: Resizing the input to the same resolution as the detector's input is not enabled by default. It can be enabled by passing **--evaluation.detection.resize-input-images** flag. """ aug_list = [] if getattr(self.opts, "evaluation.detection.resize_input_images"): aug_list.append(T.Resize(opts=self.opts, img_size=size)) aug_list.append(T.ToTensor(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) def __getitem__( self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and labels of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["targets"]["box_labels"]: Shape is [Num of boxes] output_data["targets"]["box_coordinates"]: Shape is [Num of boxes, 4] output_data["targets"]["image_id"]: Shape is [1] output_data["targets"]["image_width"]: Shape is [1] output_data["targets"]["image_height"]: Shape is [1] """ crop_size_h, crop_size_w, img_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) image_id = self.ids[img_index] image, img_name = self.get_image(image_id=image_id) im_width, im_height = image.size boxes, labels, mask = self.get_boxes_and_labels( image_id=image_id, image_width=im_width, image_height=im_height, include_masks=True, ) data = { "image": image, "box_labels": labels, "box_coordinates": boxes, "mask": mask, } if transform_fn is not None: data = transform_fn(data) output_data = { "samples": { "image": data["image"], }, "targets": { "box_labels": data["box_labels"], "box_coordinates": data["box_coordinates"], "mask": data["mask"], "image_id": torch.tensor(image_id), "image_width": torch.tensor(im_width), "image_height": torch.tensor(im_height), }, } return output_data def __len__(self): return len(self.ids) def get_boxes_and_labels( self, image_id: int, image_width: int, image_height: int, *args, include_masks=False, **kwargs, ) -> Tuple[np.ndarray, np.ndarray, Optional[np.ndarray]]: """Get the boxes and label information for a given image_id Args: image_id: Image ID image_width: Width of the image image_height: Height of the image include_masks: Return instance masks or not Returns: A tuple of length 3: * Numpy array containing bounding box information in xyxy format. The shape of array is [Num_of_boxes, 4]. * Numpy array containing labels for each of the box. The shape of array is [Num_of_boxes] * When include_masks is enabled, a numpy array of instance masks is returned. The shape of the array is [Num_of_boxes, image_height, image_width] """ ann_ids = self.coco.getAnnIds(imgIds=image_id) ann = self.coco.loadAnns(ann_ids) # filter crowd annotations ann = [obj for obj in ann if obj["iscrowd"] == 0] boxes = np.array( [self._xywh2xyxy(obj["bbox"], image_width, image_height) for obj in ann], np.float32, ).reshape((-1, 4)) labels = np.array( [self.coco_id_to_contiguous_id[obj["category_id"]] for obj in ann], np.int64, ).reshape((-1,)) # remove invalid boxes keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0]) boxes = boxes[keep] labels = labels[keep] masks = None if include_masks: masks = [] for obj in ann: rle = coco_mask.frPyObjects( obj["segmentation"], image_height, image_width ) m = coco_mask.decode(rle) if len(m.shape) < 3: mask = m.astype(np.uint8) else: mask = (np.sum(m, axis=2) > 0).astype(np.uint8) masks.append(mask) if len(masks) > 0: masks = np.stack(masks, axis=0) else: masks = np.zeros(shape=(0, image_height, image_width), dtype=np.uint8) masks = masks.astype(np.uint8) masks = torch.from_numpy(masks) masks = masks[keep] assert len(boxes) == len(labels) == len(masks) return boxes, labels, masks else: return boxes, labels, None def _xywh2xyxy( self, box: List[int], image_width: int, image_height: int ) -> List[int]: """Convert boxes from xywh format to xyxy format""" x1, y1, w, h = box return [ max(0, x1), max(0, y1), min(x1 + w, image_width), min(y1 + h, image_height), ] def get_image(self, image_id: int) -> Tuple: """Return the PIL image for a given image id""" file_name = self.coco.loadImgs(image_id)[0]["file_name"] image_file = os.path.join(self.img_dir, file_name) image = self.read_image_pil(image_file) return image, file_name def extra_repr(self) -> str: return super().extra_repr() + f"\n\t num_classes={self.num_classes}" @staticmethod def class_names() -> List[str]: """Name of the classes in the COCO dataset""" return [ "background", "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush", ] ================================================ FILE: corenet/data/datasets/detection/coco_mask_rcnn.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List, Mapping, Tuple, Union import torch from torch import Tensor from corenet.data.collate_fns import COLLATE_FN_REGISTRY from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.detection.coco_base import COCODetection from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose @DATASET_REGISTRY.register(name="coco_mask_rcnn", type="detection") class COCODetectionMaskRCNN(COCODetection): """Dataset class for the MS COCO Object Detection using Mask RCNN .""" @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != COCODetectionMaskRCNN: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.detection.coco-mask-rcnn.use-lsj-aug", action="store_true", help="Use large scale jitter augmentation for training Mask RCNN model", ) return parser def _training_transforms( self, size: Tuple[int, int], *args, **kwargs ) -> T.BaseTransformation: """Data augmentation during training. Default order of transformation is Resize, RandomHorizontalFlip, ToTensor. When large-scale jittering is enabled, Resize is replaced with ScaleJitter and FixedSizeCrop Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ if getattr(self.opts, "dataset.detection.coco_mask_rcnn.use_lsj_aug"): # Apply large scale jittering, following https://arxiv.org/abs/2012.07177 aug_list = [ T.ScaleJitter(opts=self.opts), T.FixedSizeCrop(opts=self.opts), T.RandomHorizontalFlip(opts=self.opts), T.ToTensor(opts=self.opts), ] else: # standard augmentation for Mask-RCNN aug_list = [ T.Resize(opts=self.opts, img_size=size), T.RandomHorizontalFlip(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def _validation_transforms( self, size: Tuple[int, int], *args, **kwargs ) -> T.BaseTransformation: """Data augmentation during validation or evaluation. Default order of transformation is Resize, ToTensor. Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ aug_list = [ T.Resize(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def __getitem__( self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and labels of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["samples"]["label]["labels"]: Shape is [Num of boxes] output_data["samples"]["label"]["boxes"]: Shape is [Num of boxes, 4] output_data["samples"]["label"]["masks"]: Shape is [Num of boxes, Height, Width] output_data["targets"]["image_id"]: Shape is [1] output_data["targets"]["image_width"]: Shape is [1] output_data["targets"]["image_height"]: Shape is [1] """ crop_size_h, crop_size_w, img_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) image_id = self.ids[img_index] image, img_name = self.get_image(image_id=image_id) im_width, im_height = image.size boxes, labels, mask = self.get_boxes_and_labels( image_id=image_id, image_width=im_width, image_height=im_height, include_masks=True, ) data = { "image": image, "box_labels": labels, "box_coordinates": boxes, "mask": mask, } if transform_fn is not None: data = transform_fn(data) output_data = { "samples": { "image": data["image"], # PyTorch Mask RCNN implementation expect labels as an input. Because we do not want to change # the training infrastructure, we pass labels as part of image key and # handle it in the model. "label": { "labels": data["box_labels"], "boxes": data["box_coordinates"], "masks": data["mask"], }, }, "targets": { "image_id": torch.tensor(image_id), "image_width": torch.tensor(im_width), "image_height": torch.tensor(im_height), }, } return output_data @COLLATE_FN_REGISTRY.register(name="coco_mask_rcnn_collate_fn") def coco_mask_rcnn_collate_fn( batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]], opts: argparse.Namespace, *args, **kwargs ) -> Mapping[str, Union[List[Tensor], Mapping[str, List[Tensor]]]]: """Combines a list of dictionaries into a single dictionary by concatenating matching fields. For expected keys, see the keys in the output of `__getitem__` function of COCODetectionMaskRCNN class. Args: batch: A list of dictionaries opts: Command-line arguments Returns: A dictionary with `samples` and `targets` as keys. """ new_batch = {"samples": {"image": [], "label": []}, "targets": []} for b_id, batch_ in enumerate(batch): new_batch["samples"]["image"].append(batch_["samples"]["image"]) new_batch["samples"]["label"].append(batch_["samples"]["label"]) new_batch["targets"].append(batch_["targets"]) return new_batch ================================================ FILE: corenet/data/datasets/detection/coco_ssd.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import List, Mapping, Tuple, Union import torch from torch import Tensor from corenet.data.collate_fns import COLLATE_FN_REGISTRY from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.detection.coco_base import COCODetection from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.modeling.anchor_generator import build_anchor_generator from corenet.modeling.matcher_det import build_matcher from corenet.utils import logger @DATASET_REGISTRY.register(name="coco_ssd", type="detection") class COCODetectionSSD(COCODetection): """Dataset class for the MS COCO Object Detection using Single Shot Object Detector (SSD). Args: opts: Command-line arguments """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: if getattr(opts, "matcher.name") != "ssd": logger.error("For SSD, we need --matcher.name as ssd") anchor_gen_name = getattr(opts, "anchor_generator.name") if anchor_gen_name is None or anchor_gen_name != "ssd": logger.error("For SSD, we need --anchor-generator.name to be ssd") super().__init__(opts=opts, *args, **kwargs) # we build the anchor generator and matching inside the dataset # so that we can use it with variable batch samplers. self.anchor_box_generator = build_anchor_generator(opts=opts, is_numpy=True) self.match_prior = build_matcher(opts=opts) # output strides for generating anchors self.output_strides = self.anchor_box_generator.output_strides def _training_transforms(self, size: Tuple[int, int], *args, **kwargs) -> Compose: """Data augmentation during training. Order of transformation is SSDCroping, PhotometricDistort, RandomHorizontalFlip, Resize, BoxPercentCoords, ToTensor Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.common.Compose.` """ aug_list = [ T.SSDCroping(opts=self.opts), T.PhotometricDistort(opts=self.opts), T.RandomHorizontalFlip(opts=self.opts), T.Resize(opts=self.opts, img_size=size), T.BoxPercentCoords(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def _validation_transforms(self, size: Tuple[int, int], *args, **kwargs) -> Compose: """Data augmentation during validation or evaluation. Default order of transformation is Resize, BoxPercentCoords, ToTensor. Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.common.Compose.` """ aug_list = [ T.Resize(opts=self.opts), T.BoxPercentCoords(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def generate_anchors(self, height: int, width: int) -> Tensor: """Given the height and width of the input to the SSD model, generate anchors Args: height: Height of the input image to the SSD model width: Width of the input image to the SSD model Returns: Tensor containing anchor locations """ anchors = [] for output_stride in self.output_strides: if output_stride == -1: fm_width = fm_height = 1 else: fm_width = int(math.ceil(width / output_stride)) fm_height = int(math.ceil(height / output_stride)) fm_anchor = self.anchor_box_generator( fm_height=fm_height, fm_width=fm_width, fm_output_stride=output_stride, ) anchors.append(fm_anchor) anchors = torch.cat(anchors, dim=0) return anchors def __getitem__( self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and labels of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["targets"]["box_labels"]: Shape is [Num of matched boxes] output_data["targets"]["box_coordinates"]: Shape is [Num of matched boxes, 4] output_data["targets"]["image_id"]: Shape is [1] output_data["targets"]["image_width"]: Shape is [1] output_data["targets"]["image_height"]: Shape is [1] """ crop_size_h, crop_size_w, img_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) image_id = self.ids[img_index] image, img_fname = self.get_image(image_id=image_id) im_width, im_height = image.size boxes, labels, _ = self.get_boxes_and_labels( image_id=image_id, image_width=im_width, image_height=im_height ) data = {"image": image, "box_labels": labels, "box_coordinates": boxes} data = transform_fn(data) # convert to priors anchors = self.generate_anchors(height=crop_size_h, width=crop_size_w) gt_coordinates, gt_labels = self.match_prior( gt_boxes=data["box_coordinates"], gt_labels=data["box_labels"], anchors=anchors, ) output_data = { "samples": {"image": data.pop("image")}, "targets": { "box_labels": gt_labels, "box_coordinates": gt_coordinates, "image_id": torch.tensor(image_id), "image_width": torch.tensor(im_width), "image_height": torch.tensor(im_height), }, } return output_data def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\tmatcher={self.match_prior}" f"\n\tanchor_generator={self.anchor_box_generator}" ) return extra_repr_str @COLLATE_FN_REGISTRY.register(name="coco_ssd_collate_fn") def coco_ssd_collate_fn( batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]], opts: argparse.Namespace, ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Combines a list of dictionaries into a single dictionary by concatenating matching fields. For expected keys, see the keys in the output of `__getitem__` function of COCODetectionSSD class. Args: batch: A list of dictionaries opts: Command-line arguments Returns: A dictionary with `samples` and `targets` as keys. """ new_batch = { "samples": {"image": []}, "targets": { "box_labels": [], "box_coordinates": [], "image_id": [], "image_width": [], "image_height": [], }, } for b_id, batch_ in enumerate(batch): # prepare inputs new_batch["samples"]["image"].append(batch_["samples"]["image"]) # prepare outputs new_batch["targets"]["box_labels"].append(batch_["targets"]["box_labels"]) new_batch["targets"]["box_coordinates"].append( batch_["targets"]["box_coordinates"] ) new_batch["targets"]["image_id"].append(batch_["targets"]["image_id"]) new_batch["targets"]["image_width"].append(batch_["targets"]["image_width"]) new_batch["targets"]["image_height"].append(batch_["targets"]["image_height"]) # stack inputs new_batch["samples"]["image"] = torch.stack(new_batch["samples"]["image"], dim=0) # stack outputs new_batch["targets"]["box_labels"] = torch.stack( new_batch["targets"]["box_labels"], dim=0 ) new_batch["targets"]["box_coordinates"] = torch.stack( new_batch["targets"]["box_coordinates"], dim=0 ) new_batch["targets"]["image_id"] = torch.stack( new_batch["targets"]["image_id"], dim=0 ) new_batch["targets"]["image_width"] = torch.stack( new_batch["targets"]["image_width"], dim=0 ) new_batch["targets"]["image_height"] = torch.stack( new_batch["targets"]["image_height"], dim=0 ) return new_batch ================================================ FILE: corenet/data/datasets/language_modeling/__init__.py ================================================ ================================================ FILE: corenet/data/datasets/language_modeling/base_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random import re import string from typing import Dict, Iterator, Optional import torch from torch import Tensor from corenet.data.datasets.dataset_base import BaseIterableDataset from corenet.data.text_tokenizer import build_tokenizer def _process_text(text: str) -> str: """Process text to identify low-length content. This processing step follows SlimPajama. Citation: @misc{cerebras2023slimpajama, author = {Soboleva, Daria and Al-Khateeb, Faisal and Myers, Robert and Steeves, Jacob R and Hestness, Joel and Dey, Nolan}, title = {{SlimPajama: A 627B token cleaned and deduplicated version of RedPajama}}, month = June, year = 2023, url = {https://huggingface.co/datasets/cerebras/SlimPajama-627B}, howpublished = {https://www.cerebras.net/blog/slimpajama-a-627b-token-cleaned-and-deduplicated-version-of-redpajama}, } Args: text: Input text sequence. Returns: Processed text sequence. """ text = text.lower() text = text.translate(str.maketrans("", "", string.punctuation)) text = re.sub(r"\s+", " ", text.strip()) return text class BaseLMIterableDataset(BaseIterableDataset): """Base class for language modeling datasets. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.shuffle_data = getattr(opts, "dataset.language_modeling.shuffle_data") self._rng = random.Random(self.seed) self.sequence_length = getattr( opts, "dataset.language_modeling.sequence_length" ) self.min_tokens_per_text = getattr( opts, "dataset.language_modeling.min_tokens_per_text" ) self.min_characters_per_text = getattr( opts, "dataset.language_modeling.min_characters_per_text" ) self.tokenizer = build_tokenizer(opts) @property def pad_token_id(self) -> int: """Index corresponding to padding token.""" return self.tokenizer.pad_token_id @property def vocab_size(self) -> int: """Vocabulary size.""" return self.tokenizer.vocab_size @property def seed(self) -> int: """Seed for initializing random state.""" opts = self.opts return getattr(opts, "dataset.language_modeling.random_seed") def _tokenize_text(self, text: str) -> Optional[Dict[str, Tensor]]: """Convert input text into tokens. Args: text: Input text sequence. Returns: For valid sequences, dictionary containing 1D tensors with token indices for input samples and target labels. The shape of tensors is [sequence length]. Otherwise, None is returned. ...note: To study the effect of multiple tokenizations, we do 'on-the-fly' tokenization. Pre-training text corpora are often noisy and may contain low-length sequences. To deal such text sequences, we apply two filtering methods: 1. We process the text and check if the number of characters in the text sequence are less than the specified threshold or not. If it is, then we skip such sequences. 2. After tokenizing the sequence, we check for the number of tokens. If they are smaller than the pre-defined threshold, then such sequences are skipped. """ if len(_process_text(text)) < self.min_characters_per_text: return None tokenized_text = self.tokenizer(text) n_tokens = tokenized_text.shape[0] if n_tokens < self.min_tokens_per_text: return None # In language modeling, the target sequence is generated by shifting the input sequence by one position. valid_seq_length = min(n_tokens, self.sequence_length + 1) content_tensor = torch.full( size=(self.sequence_length + 1,), fill_value=self.pad_token_id, dtype=torch.long, ) content_tensor[:valid_seq_length] = tokenized_text[:valid_seq_length] return { "samples": content_tensor[:-1], "targets": content_tensor[1:], } @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == BaseLMIterableDataset: group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.language-modeling.sequence-length", type=int, default=2048, help="Tokenized sequence length. Defaults to 2048.", ) group.add_argument( "--dataset.language-modeling.min-tokens-per-text", type=int, default=0, help="Minimum number of tokens per text after tokenization. " "This flag allows us to skip short text sequences and avoid excessive padding. Defaults to 0.", ) group.add_argument( "--dataset.language-modeling.min-characters-per-text", type=int, default=0, help="Minimum number of characters in a text sequence before tokenization. " "This flag allows us to skip short text sequences. Defaults to 0.", ) group.add_argument( "--dataset.language-modeling.shuffle-data", action="store_true", default=False, help="The pre-training corpora consist of multiple text files. " "This flag can be utilized to enable shuffling of these data files. It defaults to False, " "with the note that the user is responsible for implementing the shuffling operation.", ) group.add_argument( "--dataset.language-modeling.random-seed", type=int, default=0, help="Random seed for shuffling data files. Defaults to 0.", ) return parser def generate_sample( self, scaled_rank: int, scaled_world_size: int ) -> Iterator[Dict[str, Tensor]]: """Generate input and labels. Args: scaled_rank: Scaled rank. It represents the unique identifier assigned to each process within a distributed system. The total number of processes is determined by multiplying the number of available GPUs by the number of dataset workers. This scaling ensures that each process has a distinct and consistent identification, preventing duplicated data sampling and facilitating efficient coordination across the distributed environment. scaled_world_size: Scaled world size. It represents the combined count of processes involved in distributed system. It is determined by multiplying the number of available GPUs (a.k.a., world size) by the number of dataset workers. Yields: This function should yield a dictionary containing 'samples' and 'targets' as keys corresponding to the input and label of a sample, respectively. The shape of input and label tensors is [sequence length]. ...note: Iterable datasets can generate duplicate content across different multi-processing workers. To avoid this, the rank and world size are scaled, so each worker can process a different content file. Child classes must implement 'generate_sample' function correctly. """ raise NotImplementedError( "Child class must implement 'generate_sample' function." ) def __iter__(self) -> Iterator[Dict[str, Tensor]]: """Returns an iterator over the dataset. Yields: A dictionary containing 'samples' and 'targets' as keys corresponding to the input and label of a sample, respectively. The shape of input and label tensors is [sequence length]. """ # scale the rank and world size to deal with multiprocessing and distributed training. scaled_world_size = self.world_size * self.num_workers scaled_rank = self.rank * self.num_workers + self.worker_id yield from self.generate_sample( scaled_rank=scaled_rank, scaled_world_size=scaled_world_size ) def extra_repr(self) -> str: return ( f"\n\tvocab_size={self.vocab_size}" f"\n\tpad_token_id={self.pad_token_id}" f"\n\tmin_characters_per_text={self.min_characters_per_text}" f"\n\tmin_tokens_per_text={self.min_tokens_per_text}" f"\n\tshuffle={self.shuffle_data}" ) ================================================ FILE: corenet/data/datasets/language_modeling/commonsense_170k.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import fcntl import os from typing import Dict, Iterator import pandas as pd from torch import Tensor from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset from corenet.utils.common_utils import construct_local_path_from_remote from corenet.utils.download_utils import get_local_path @DATASET_REGISTRY.register(name="commonsense_170k", type="language_modeling") class CommonSense170k(BaseLMIterableDataset): """ The CommonSense 170k dataset, as defined in LLM-Adapters (https://arxiv.org/pdf/2304.01933.pdf). This is a simple concatenation of: - boolq - piqa - social_i_qa - hellaswag - winogrande - ARC-Easy - ARC-Challenge - openbookqa CommonSense170k processes prompts uniformly for all of its sub-datasets. See @generate_prompt_and_response. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.json_path = getattr( opts, "dataset.language_modeling.commonsense_170k.path" ) if self.json_path is None: raise ValueError( "--dataset.language-modeling.commonsense-170k.path " "is required." ) json_path = self._download_if_required(self.json_path) self.data = pd.read_json(json_path) def generate_sample( self, scaled_rank: int, scaled_world_size: int ) -> Iterator[Dict[str, Tensor]]: num_elems = len(self.data) chosen_elems = list(range(scaled_rank, num_elems, scaled_world_size)) self._rng.shuffle(chosen_elems) shuffled_data = self.data.loc[chosen_elems] for sample in shuffled_data.iterrows(): sample = sample[1].to_dict() sample = generate_prompt_and_response(sample) tokenized_sample = self._tokenize_text(sample) yield tokenized_sample @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == CommonSense170k: group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.language-modeling.commonsense-170k.path", default=None, help="Path to the commonsense 170k json dataset file. " "Default is None. Note, the dataset file is currently " "available in the LLM-Adapters repository at " "https://github.com/AGI-Edgerunners/LLM-Adapters/blob/main" "/ft-training_set/commonsense_170k.json.", ) return parser def _download_if_required(self, remote_file_path: str) -> str: """ Download @remote_file_path if it isn't already downloaded. Args: remote_file_path: The file to possibly download. Returns: The local path to the file. """ local_file_path = construct_local_path_from_remote( remote_path=remote_file_path, local_dir=DATA_CACHE_DIR ) with open(local_file_path + ".lock", "a") as lock_file: try: fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX) if os.path.isfile(local_file_path): return local_file_path local_file_path = get_local_path( opts=self.opts, path=remote_file_path, cache_loc=DATA_CACHE_DIR, max_retries=20, force_delete=False, use_start_rank=False, sync_ranks=False, ) finally: fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN) return local_file_path def generate_prompt_and_response(data_point: Dict[str, str]) -> str: """ Generate the prompt and response for a given data point. Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters Args: data_point: A data point with the following keys: "instruction", "input", "output", and "answer". The "input" field can contain an empty string if an input is not used by the evaluation. """ if data_point["input"]: return f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction: {data_point["instruction"]} ### Input: {data_point["input"]} ### Response: {data_point["output"]}""" # noqa: E501 else: return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {data_point["instruction"]} ### Response: {data_point["output"]}""" # noqa: E501 ================================================ FILE: corenet/data/datasets/language_modeling/general_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import fcntl import math import os import pickle import time from functools import partial from pathlib import Path from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple import pandas as pd from pyarrow import parquet as pq from torch import Tensor from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset from corenet.options.parse_args import JsonValidator from corenet.utils import logger from corenet.utils.common_utils import construct_local_path_from_remote from corenet.utils.download_utils import get_local_path def check_list_of_dicts_with_mandatory_keys( data: List[Dict], mandatory_keys: List[str] ) -> None: """ Check if a variable is a list of dictionaries, and each dictionary contains mandatory keys. Args: data: The data to check. mandatory_keys: The list of mandatory keys that must be present in each dictionary. Raises: Raises an error if the data is not a list of dictionaries or if any dictionary is missing mandatory keys. """ if not isinstance(data, list): logger.error(f"Expected type of data is list. Got: {type(data)}.") for item in data: if not isinstance(item, dict): logger.error(f"Item in the list is not a dictionary. Got: {item}.") item_keys = set(item.keys()) if not item_keys.intersection(mandatory_keys): logger.error( f"Dictionary is missing mandatory keys. Got: {item_keys}, expected: {mandatory_keys}." ) @DATASET_REGISTRY.register(name="general_lm", type="language_modeling") class GeneralLMDataset(BaseLMIterableDataset): """ A dataset class for general language modeling tasks. The class can read and yield data from variety of file formats. Currently supported formats are '.parquet', '.jsonl', and '.json.gz'. Args: opts: Command-line arguments. """ _dataset_name = "general_lm" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) data_info = self._prepare_dataset() self.data_info = data_info # During training, we will store the data state. This helps in resuming # training in case of failures. self._state = None self._target_state = None @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Arguments related to General LM dataset.""" if cls == GeneralLMDataset: group = parser.add_argument_group(cls.__name__) for mode in ["train", "val", "test"]: group.add_argument( f"--dataset.language-modeling.general-lm.{mode}-data-info", type=JsonValidator(List[Dict[str, Any]]), default=None, nargs="+", help=f"Name of the parquet files for the {mode} set. Defaults to None (i.e., user needs to specify the value).", ) group.add_argument( "--dataset.language-modeling.general-lm.data-state", default=None, type=str, nargs="+", help="A list containing the filenames that each process was processing before crash. Defaults to None.", ) group.add_argument( "--dataset.language-modeling.general-lm.reader-chunk-size", type=int, default=1024, help="Number of documents to read from a dataset file at a time. Defaults to 1024.", ) group.add_argument( "--dataset.language-modeling.general-lm.document-split-size", default=2048, type=int, help="The length of each sequence when splitting a larger document. Defaults to 2048 words.", ) group.add_argument( "--dataset.language-modeling.general-lm.data-state-save-interval", default=15, type=int, help="Data state save interval in minutes. Defaults to 15 minutes.", ) return parser def _reset_data_state(self) -> None: """Reset the data state. The data state has following keys: 1. epoch: It stores the current epoch index. 2. file: Name of the file it is currently processing. 3. chunk: Chunk index. Note that each file may contains multiple documents, and for efficiency, we read them in chunks. 4. _time: Time (in seconds) at which state is saved. """ self._state = { "epoch": 0, "file": None, "chunk": 0, "_time": 0, } self._target_state = { "epoch": 0, "file": None, "chunk": 0, "_time": 0, } def extra_repr(self) -> str: return super().extra_repr() + ( f"\n\tnum_files={self.num_files}" f"\n\tdocument_split_size={self.document_split_size}" f"\n\treader_chunk_size={self.reader_chunk_size}" ) @property def reader_chunk_size(self) -> int: """Number of documents to read from a dataset file at a time.""" return getattr( self.opts, "dataset.language_modeling.general_lm.reader_chunk_size" ) @property def save_loc(self) -> str: """Location path where artifacts (e.g., data state) will be stored.""" save_dir = getattr(self.opts, "common.results_loc") run_label = getattr(self.opts, "common.run_label") res_dir = "{}/{}".format(save_dir, run_label) Path(res_dir).mkdir(exist_ok=True, parents=True) return res_dir @property def num_files(self) -> int: """Total number of files.""" return len(self.data_info["file_paths"]) @property def document_split_size(self) -> int: """The length of each sequence when splitting a larger document.""" return getattr( self.opts, "dataset.language_modeling.general_lm.document_split_size" ) def _load_data_state(self) -> None: """Load data state. The data state file is read using 'dataset.language_modeling.general_lm.data_state' argument. The values for this argument are expected as a list, and can be specified in a configuration file or via command line. Recommended way to specify this argument is using configuration file as the number of state files could be large. """ data_state_file_paths = getattr( self.opts, "dataset.language_modeling.general_lm.data_state" ) if data_state_file_paths is not None: for data_state_fpath in data_state_file_paths: if not data_state_fpath.endswith( f"data_state_{self.rank}_{self.worker_id}.pkl" ): continue # Load only for the current process data_state_fpath = get_local_path( self.opts, path=data_state_fpath, force_delete=False, use_start_rank=False, sync_ranks=False, ) with open(data_state_fpath, "rb") as fh: self._target_state = pickle.load(fh) logger.info( f"Loaded dataset state {self._target_state} from {data_state_fpath} for {self.worker_id} worker on {self.rank}." ) break def _save_data_state(self, **kwargs) -> None: """Save data state. The data states are saved for each worker on each rank. These states help us resume the training in case it crashes. """ ((key, value),) = kwargs.items() state = self._state # The time is in seconds, so minutes are converted to seconds by multiplying with 60 save_every_k_seconds = ( getattr( self.opts, "dataset.language_modeling.general_lm.data_state_save_interval", ) * 60 ) if key == "chunk": # We read files in chunks since each file could contain millions of documents. # Saving the chunk index allows us to resume training from nearly the same document in case of a failure. if time.time() < state["_time"] + save_every_k_seconds: return state["chunk"] = value elif key == "file": # The pre-training corpora consists of multiple files, each containing several documents. # We save the file name to resume training from the same file in case of a failure. state["chunk"] = 0 state["file"] = value elif key == "epoch": # As workers or processes may complete iteration over files at different rates due to varying content lengths, # we store the epoch index to ensure correct shuffling and enable seamless resuming of training in case of failure. state["chunk"] = 0 state["file"] = None state["epoch"] = value else: raise KeyError(f"Got unexpected key={key}.") state["_time"] = time.time() # save the file information in a file so that we can use it to resume training (if it fails) Path(f"{self.save_loc}/data_states").mkdir(exist_ok=True, parents=True) local_file_path = ( f"{self.save_loc}/data_states/data_state_{self.rank}_{self.worker_id}.pkl" ) with open(local_file_path + ".lock", "a") as lock_file: try: fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX) with open( f"{self.save_loc}/data_states/data_state_{self.rank}_{self.worker_id}.pkl", "wb", ) as fh: pickle.dump(self._state, fh) finally: fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN) def _prepare_dataset(self) -> Dict[str, List[str]]: """Prepare the dataset. Each dataset contains multiple files and each file could contain several documents. Specifying each file for each dataset is cubersome. To address this, we use file identifier in each dataset. Let's say that dataset, 'dummy_dataset', contain 26 files with a format '.json.gz' and it's structure is similar to below structure dummy_dataset/ ├── dummy_0000.json.gz ├── dummy_0001.json.gz ├── dummy_0002.json.gz ├── ... ├── dummy_0025.json.gz Instead of individually specifying each file, we use a dictionary with three keys: 1. "file_name": This contains the base name of the files. If multiple files are present, each filename is expected to include a file identifier. 2. "text_key": Documents within each file are stored as dictionaries with various keys for different information, including text content and metadata. This parameter specifies the key within each document that corresponds to the text content. 3. "file_id_range": This specifies the range of file identifiers present in the dataset. An example for above dummy dataset is given below: { "file_name": "dummy_dataset/dummy_{file_id:04d}.json.gz, "text_key": "text", "file_id_range": [0, 26] } Returns: A dictionary with the following information: 1. 'file_paths': A list containing file paths. 2. 'text_keys': A list containing text keys. ...note: Some datasets may have single file. In such a case, we do not need to specify 'file_id' as part of the 'file_name'. However, we still need to pass 'file_id_range' as it is an expected key. An example of specifying such datasets is shown below: { "file_name": "dummy_book.jsonl, "text_key": "text", "file_id_range": [0, 1] } """ opts = self.opts mode = self.mode assert mode in ( "train", "val", "test", ), f"Mode should be either train or test or val. Got {mode}." data_info = getattr( opts, f"dataset.language_modeling.{self._dataset_name}.{mode}_data_info", ) if data_info is None: logger.error( f"Please specify dataset information using 'dataset.language_modeling.{self._dataset_name}.{mode}_data_info' variable in config file. Got None." ) mandatory_keys = ["file_name", "text_key", "file_id_range"] check_list_of_dicts_with_mandatory_keys(data_info, mandatory_keys) file_names = [] text_keys = [] for item in data_info: file_id_range = item["file_id_range"] if isinstance(file_id_range, list) and len(file_id_range) == 2: file_names_i = [] for file_id in range(file_id_range[0], file_id_range[1]): file_name = item["file_name"].format(file_id=file_id) file_names_i.append(file_name) file_names.extend(file_names_i) # each file is expected to have the same text key. text_keys.extend([item["text_key"]] * len(file_names_i)) else: logger.error( f"File id range is expected as a list of 2 elements. Got: {file_id_range}." ) if len(file_names) != len(text_keys): logger.error( f"The number of file names does not match the number of text keys. Got: {len(file_names)} and {len(text_keys)}." ) if self.shuffle_data: file_names, text_keys = self._shuffle_fn( file_names=file_names, text_keys=text_keys ) return { "file_paths": file_names, "text_keys": text_keys, } def _download_if_required(self, remote_file_path: str) -> str: """Optionally download the files. This function allows us to download files from remote location (e.g., S3). Args: remote_file_path: Remote file path. Return: The local file path of the downloaded file. ...note: This repository has implemented standard transfer clients such as HTTP, HTTPS, and S3. However, users may utilize other data storage clients. In such cases, custom clients should be implemented and registered to ensure proper functionality of this function """ local_file_path = construct_local_path_from_remote( remote_path=remote_file_path, local_dir=DATA_CACHE_DIR ) with open(local_file_path + ".lock", "a") as lock_file: try: fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX) if os.path.isfile(local_file_path): return local_file_path local_file_path = get_local_path( opts=self.opts, path=remote_file_path, cache_loc=DATA_CACHE_DIR, max_retries=20, force_delete=False, use_start_rank=False, sync_ranks=False, ) finally: fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN) return local_file_path def _skip_document_chunks(self, chunks: Iterable[Any]) -> Iterator[Any]: """Yield chunks of data from an iterable, optionally skipping chunks based on a resume chunk index. Args: chunks: An iterable containing data to be chunked. Yields: Chunks of the data. """ for chunk_counter, chunk in enumerate(chunks): if chunk_counter < self._target_state["chunk"]: continue else: self._target_state["chunk"] = 0 self._save_data_state(chunk=chunk_counter) yield chunk def _split_document_into_sequences( self, documents: List[str], word_separator: str = " " ) -> Iterator[Any]: """Split document into sequences. Some documents may be very large and contain millions of words. Tokenizing such documents is very slow and slows down the training. To deal with such large documents, we divide them into small sequences and process each sequence independently. Args: documents: List of text documents. word_separator: The delimiter used to separate individual words. Defaults to space. Yields: A text sequence with desired number of words. """ for document in documents: words = document.split(word_separator) for i in range(0, len(words), self.document_split_size): text = word_separator.join(words[i : i + self.document_split_size]) yield text def _read_data_from_parquet( self, file_path: str, text_key: str, **reader_kwargs ) -> Iterator[Dict[str, Tensor]]: """Read data from the parquet file. Args: file_path: Path of the parquet file. text_key: Key name corresponding to content in the parquet file. Yields: A dictionary containing 1D tensors with token indices for input samples and target labels. The shape of the tensors matches that of the output from the '_tokenize_text' function. """ pq_table = pq.ParquetFile(file_path, **reader_kwargs) for document_chunks in self._skip_document_chunks( pq_table.iter_batches( batch_size=self.reader_chunk_size, columns=[text_key], ) ): document_chunks_pd = document_chunks.to_pandas()[text_key] for text in self._split_document_into_sequences(document_chunks_pd): tokenized_text = self._tokenize_text(text) if tokenized_text is not None: yield tokenized_text def _read_data_from_json( self, file_path: str, text_key: str, **reader_kwargs ) -> Iterator[Dict[str, Tensor]]: """Read data from the jsonl and json.gz files. When the format is 'json.gz', then reader_kwargs contain 'compression' as a key with value 'gzip'. See '_get_file_reader' function for reader_kwargs. Args: file_path: Path of the parquet file. Yields: A dictionary containing 1D tensors with token indices for input samples and target labels. The shape of the tensors matches that of the output from the '_tokenize_text' function. """ document_chunks = pd.read_json( file_path, lines=True, chunksize=self.reader_chunk_size, **reader_kwargs ) for documents in self._skip_document_chunks(document_chunks): # each chunk contains multiple text for text in self._split_document_into_sequences(documents[text_key]): tokenized_text = self._tokenize_text(text) if tokenized_text is not None: yield tokenized_text def _get_file_reader(self, file_path: str) -> Callable: """Returns the function used to read a file based on its extension.""" reader_kwargs = {} if file_path.endswith("parquet"): reader = self._read_data_from_parquet elif file_path.endswith("json.gz"): reader = self._read_data_from_json reader_kwargs["compression"] = "gzip" elif file_path.endswith("jsonl"): reader = self._read_data_from_json else: raise NotImplementedError(f"File format is not supported.") return partial(reader, **reader_kwargs) def generate_sample( self, scaled_rank: int, scaled_world_size: int ) -> Iterator[Any]: """Generate input and labels. Args: scaled_rank: Scaled rank. scaled_world_size: Scaled world size. Yields: Yields a dictionary containing 'samples' and 'targets' as keys corresponding to the input and label of a sample, respectively. The shape of the tensors matches that of the output from the '_tokenize_text' function. """ self._reset_data_state() self._load_data_state() file_paths = self.data_info["file_paths"] text_keys = self.data_info["text_keys"] total_files = len(file_paths) if total_files % scaled_world_size != 0: padding = ( math.ceil(total_files / scaled_world_size) * scaled_world_size ) - total_files padd_file_paths, padd_text_keys = self._shuffle_fn( file_names=file_paths, text_keys=text_keys, k=padding ) file_paths += padd_file_paths text_keys += padd_text_keys total_files = len(file_paths) # split files among each node file_paths_process_i = file_paths[scaled_rank:total_files:scaled_world_size] text_keys_process_i = text_keys[scaled_rank:total_files:scaled_world_size] prev_file_path = None # some of the files may have fewer tokens compared to other files. # Therefore, some processes may finish before other processes. To deal with such # scenarios, sample data indefinitely. epoch_counter = -1 while True: epoch_counter += 1 if epoch_counter > 0: # shuffle file_paths_process_i, text_keys_process_i = self._shuffle_fn( file_names=file_paths_process_i, text_keys=text_keys_process_i ) if epoch_counter < self._target_state["epoch"]: # increment the epoch counter till we reach the point where current process crashed. continue else: self._target_state["epoch"] = 0 for remote_file_path, text_key in zip( file_paths_process_i, text_keys_process_i ): if ( self._target_state["file"] is not None and self._target_state["file"] in file_paths_process_i ): if remote_file_path != self._target_state["file"]: # skip the files till we reach the current file path that was being used before training crashed. continue else: # We reached the file that was fully iterated before training crashed. # Skip this file and reset the state self._target_state["file"] = None continue local_file_path = self._download_if_required(remote_file_path) logger.info( f"Processing {local_file_path} on worker {self.worker_id} of rank {self.rank}" ) if prev_file_path is None: prev_file_path = local_file_path reader = self._get_file_reader(file_path=local_file_path) yield from reader(file_path=local_file_path, text_key=text_key) self._save_data_state(file=remote_file_path) self._save_data_state(epoch=epoch_counter + 1) def _shuffle_fn( self, file_names: List[str], text_keys: List[str], k: Optional[int] = None ) -> Tuple[List[str], List[str]]: """Shuffle the file names and text keys. Args: file_names: List of file names. text_keys: List of text keys. k: Number of files to randomly select. Returns: A tuple containing file names and text keys. When 'k' is specified, a tuple containing k-sized list of file names and text keys is returned. ...note: This shuffling function is only applicable during training mode or when k is specified. For validation and testing when k is not specified, it does not perform any operation. """ if self.is_training or k is not None: _temp = list(zip(file_names, text_keys)) if k is not None: _temp = self._rng.choices(_temp, k=k) else: self._rng.shuffle(_temp) return zip(*_temp) return file_names, text_keys ================================================ FILE: corenet/data/datasets/multi_modal_img_text/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import ( BaseMultiModalImgText, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( arguments_zero_shot_image_classification_dataset, ) def arguments_multi_modal_img_text( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: parser = arguments_zero_shot_image_classification_dataset(parser) parser = BaseMultiModalImgText.add_arguments(parser) return parser ================================================ FILE: corenet/data/datasets/multi_modal_img_text/base_multi_modal_img_text.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, List, Mapping, Optional, Tuple, Union from urllib.parse import urlsplit import torch from PIL import Image from torch import Tensor from corenet.constants import DATA_CACHE_DIR from corenet.data.collate_fns import COLLATE_FN_REGISTRY from corenet.data.datasets.dataset_base import BaseImageDataset from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( build_zero_shot_image_classification_dataset, ) from corenet.data.datasets.utils.text import caption_preprocessing from corenet.data.io.transfer_clients import BaseClient, get_transfer_client from corenet.data.text_tokenizer import build_tokenizer from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.utils import logger class BaseMultiModalImgText(BaseImageDataset): """ Base class for Image-Text multi-modal learning. Args: opts: Command-line arguments. ...note: As a standard practice, we use web image-text datasets for pre-training and measure the zero-shot performance on standard image classification datasets for validation/evaluation purposes. """ def __init__( self, opts, *args, **kwargs, ) -> None: super().__init__( opts=opts, *args, **kwargs, ) self.text_tokenizer = build_tokenizer(opts=opts) self.cache_loc = DATA_CACHE_DIR self._transfer_client = None if not self.is_training: self.cached_zero_shot_captions = None self.cached_max_seq_length = None self.dataset = build_zero_shot_image_classification_dataset( self.opts, *args, **kwargs ) else: self.dataset = self.get_image_text_dataset() def get_image_text_dataset(self) -> Optional[Any]: """Helper function to download or process image-text dataset. Recommended way for downloading image-text datasets is to download on-the-fly. In such a case, we do not need to implement this function and return None. See 'corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py' as an example. However, for small datasets (e.g., Flickr), we can download the dataset before training is started. In such a case, we need to implement this function. See 'corenet/data/datasets/multi_modal_img_text/flickr.py' as an example. """ raise NotImplementedError("Child classes must implement this function.") def _get_transfer_client(self, file_path: str) -> BaseClient: """Get transfer client for a given file path. Args: opts: Command-line arguments. file_path: File path. Returns: An instance of BaseTransferClient. ...note: 1. Some of the clients are not pickle-able (e.g., S3). Therefore, this function should not be called inside the '__init__' function. 2. This function is added as a class function so that we can re-use it in future sub-classes. """ if self._transfer_client is None: opts = self.opts client_name = urlsplit(file_path).scheme.lower() self._transfer_client = get_transfer_client( opts, transfer_client_name=client_name, force_delete=False, only_download_on_start_rank=False, synchronize_distributed_ranks=False, parallel_download=False, ) return self._transfer_client @property def vocab_size(self) -> int: """Vocabulary size.""" return self.text_tokenizer.vocab_size @property def padding_index(self) -> Optional[int]: """Padding index. ...note: If padding index is specified and the length of tokenized caption is less than desired context length, then tokenized caption is padded with the value of padding index. """ return getattr(self.opts, "dataset.multi_modal_img_text.padding_index") @property def context_length(self) -> int: """Context length for text encoder.""" opts = self.opts context_length = getattr(opts, "dataset.multi_modal_img_text.context_length") assert context_length is not None return context_length @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add dataset-specific arguments to the parser.""" if cls == BaseMultiModalImgText: group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.multi-modal-img-text.context-length", type=int, default=77, help="Context length for the text model. Defaults to 77, the same as in the CLIP paper.", ) group.add_argument( "--dataset.multi-modal-img-text.padding-index", type=int, default=None, help="Padding index. Defaults to None.", ) group.add_argument( "--dataset.multi-modal-img-text.trunc-seq-len", action="store_true", default=False, help="Many sequences in a batch do not have lengths equal to specified context length. Enabling this flag " "allows us to truncate the sequences such that the sequence length of a batch is equal to sequence " "with max. non-padded tokens. Defaults to False.", ) return parser def _transform_text(self, text_tensor: Tensor) -> Tuple[Tensor, int]: """Helper function to transform the text tensor. If the text tensor is smaller than the context length, it pads it with zeros and replaces the last token with EOT token. Args: text_tensor: Text tensor with N tokens. Shape is (N,). Returns: A Tuple of text tensor (whole length is equal to context length) and length of the tensor. ...note: 1. If length of tokenized text is greater than context length, then it will be truncated. 2. If length of tokenized text is smaller than context length, then it is padded. """ captions_tensor = torch.zeros(size=(self.context_length,), dtype=torch.long) text_len = text_tensor.shape[0] if text_len > self.context_length: text_tensor = text_tensor[: self.context_length] text_tensor[-1] = self.text_tokenizer.eot_token_id text_len = self.context_length captions_tensor[:text_len] = text_tensor[:text_len] return captions_tensor, text_len def _training_transforms( self, size: Tuple[int, int], *args, **kwargs ) -> T.BaseTransformation: """Data augmentation during training. The default order is RandomResizedCrop, Optional[RandAugment or AutoAugment], ToTensor, Optional[RandomErase] Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` .. note:: 1. AutoAugment and RandAugment are mutually exclusive. 2. Mixup and CutMix are applied on batches are implemented in trainer. """ aug_list = [ T.RandomResizedCrop(opts=self.opts, size=size), ] auto_augment = getattr( self.opts, "image_augmentation.auto_augment.enable", False ) rand_augment = getattr( self.opts, "image_augmentation.rand_augment.enable", False ) if auto_augment and rand_augment: logger.error( "AutoAugment and RandAugment are mutually exclusive. Use either of them, but not both" ) elif auto_augment: aug_list.append(T.AutoAugment(opts=self.opts)) elif rand_augment: aug_list.append(T.RandAugment(opts=self.opts)) aug_list.append(T.ToTensor(opts=self.opts)) if getattr(self.opts, "image_augmentation.random_erase.enable", False): aug_list.append(T.RandomErasing(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) def _validation_transforms( self, size: Union[Tuple, int], *args, **kwargs ) -> T.BaseTransformation: """Data transforms during validation or evaluation The order is Resize, CenterCrop, ToTensor Args: size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ aug_list = [ T.Resize(opts=self.opts), T.CenterCrop(opts=self.opts), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=aug_list) def _process_img_caption( self, input_img: Image.Image, captions_str: Union[str, List[str], List[List[str]]], img_transform_fn: T.BaseTransformation, ) -> Tuple[Tensor, Tensor, int]: """Apply data augmentation to images and pre-processing to text captions Args: input_img: Input PIL Image captions_str: Text captions img_transform_fn: Image transform functions Returns: A tuple of image tensor, caption tensor, and max. sequence length of a sequence in caption tensor. ...note: Zero-shot captions are the same for all images, so we cache them after tokenization during evaluation. If tokenized cached captions are available, they are returned. """ data = {"image": input_img} img_tensor = img_transform_fn(data)["image"] if ( hasattr(self, "cached_zero_shot_captions") and self.cached_zero_shot_captions is not None ): # return the tokenized cached captions return ( img_tensor, self.cached_zero_shot_captions, self.cached_max_seq_length, ) max_seq_len = 0 # process caption if isinstance(captions_str, str): captions_tensor, max_seq_len = self._transform_text( self.text_tokenizer(caption_preprocessing(captions_str)) ) elif isinstance(captions_str, List): captions_tensor = [] for captions_str_i in captions_str: if isinstance(captions_str_i, List): # captions_str is [ [Num_templates_per_class] * Num_classes] captions_tensor_i = [] for captions_str_i_j in captions_str_i: seq, seq_len = self._transform_text( self.text_tokenizer(caption_preprocessing(captions_str_i_j)) ) captions_tensor_i.append(seq) max_seq_len = max(max_seq_len, seq_len) captions_tensor_i = torch.stack(captions_tensor_i, dim=0) captions_tensor.append(captions_tensor_i) elif isinstance(captions_str_i, str): # captions_str is [Num_templates_per_image] seq, seq_len = self._transform_text( self.text_tokenizer(caption_preprocessing(captions_str_i)) ) captions_tensor.append(seq) max_seq_len = max(max_seq_len, seq_len) else: logger.error( "Got captions_str of type {}: {} from {}".format( type(captions_str_i), captions_str_i, captions_str ) ) # the shape of tensor is [Num_classes, captions_per_class, caption_length] # or [Captions_per_image, caption_length] captions_tensor = torch.stack(captions_tensor, dim=0) else: captions_tensor = None logger.error( "Captions should be either string, List[String] or List[List[str]]" ) if ( hasattr(self, "cached_zero_shot_captions") and self.cached_zero_shot_captions is None ): # Cache the tokenized captions during evaluation because they are the same for all images. self.cached_zero_shot_captions = captions_tensor self.cached_max_seq_length = max_seq_len return img_tensor, captions_tensor, max_seq_len def get_zero_shot_image_text_pair( self, sample_index: int ) -> Tuple[Image.Image, Union[str, List[str], List[List[str]]], int]: """Get image-text pair for zero-shot dataset along with classification label. Args: sample_index: Sample index Returns: A tuple of PIL image, captions, and class label """ assert ( self.dataset is not None ), f"For zero-shot image-classification datasets, {self.dataset} should not be None." img_path, captions_str, class_label = self.dataset[sample_index] input_img = self.read_image_pil(img_path) return input_img, captions_str, class_label def get_image_text_dataset_pair(self, sample_index: int) -> Tuple[Image.Image, str]: """Get image and text caption pair from the noisy image-text dataset. Sub-classes may implement this method to use '__getitem__' of BaseMultiModalImgText class.""" raise NotImplementedError( f"Child classes may implement this function to use '__getitem__' of {self.__class__.__name__}." ) def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and label of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["samples"]["text"]: Shape is * [Context_Length] (single caption, as in CLIP datasets) * [Num_classes, Num_Captions, Context_length] (multiple captions per class, as in 0-shot Imagenet dataset) output_data["samples"]["padding_mask"]: Same as output_data["samples"]["text"] output_data["samples"]["max_seq_len"]: Shape is [1] output_data["targets"]: Shape is [1] """ crop_size_h, crop_size_w, sample_index = sample_size_and_index transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) if self.is_training: # read captions and image path from image-text dataset. input_img, captions_str = self.get_image_text_dataset_pair(sample_index) # for image-text datasets, we do not have class labels. So, we set to -1. class_label = -1 else: # read captions and image path from zero-shot image classification dataset input_img, captions_str, class_label = self.get_zero_shot_image_text_pair( sample_index ) ( img_tensor, captions_tensor, max_seq_len, ) = self._process_img_caption( input_img=input_img, captions_str=captions_str, img_transform_fn=transform_fn, ) padding_mask = None if self.padding_index is not None: padding_mask = captions_tensor == self.padding_index data = { "samples": { "image": img_tensor, "text": captions_tensor, "padding_mask": padding_mask, "max_seq_len": max_seq_len, }, "targets": class_label, "zero_shot": not self.is_training, } return data def __len__(self) -> int: return len(self.dataset) def __repr__(self) -> str: if self.is_training: return super().__repr__() return self.dataset.__repr__() @COLLATE_FN_REGISTRY.register(name="multi_modal_img_text_collate_fn") def multi_modal_img_text_collate_fn( batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]], opts: argparse.Namespace, ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Combines a list of dictionaries into a single dictionary by concatenating matching fields.""" images = [] text_tokens = [] padding_mask = [] labels = [] truncate_seq_len = getattr(opts, "dataset.multi_modal_img_text.trunc_seq_len") zero_shot = batch[0].pop("zero_shot") max_seq_len_in_batch = 1 # at least one token is required in the sequence for i, batch_i in enumerate(batch): inputs_i = batch_i.pop("samples") img_tensor = inputs_i.pop("image") if img_tensor is None: continue images.append(img_tensor) labels.append(batch_i.pop("targets")) text_data = inputs_i.pop("text") pad_mask = inputs_i.pop("padding_mask") max_seq_len_in_batch = max(max_seq_len_in_batch, inputs_i.pop("max_seq_len", 0)) if not zero_shot or (zero_shot and i == 0): # For zero-shot, all text captions are the same # so, we only aggregate for one batch element text_tokens.append(text_data) if pad_mask is not None: padding_mask.append(pad_mask) images = torch.stack(images, dim=0) text_tokens = torch.stack(text_tokens, dim=0) # truncate tokens based on the max. seq length if not truncate_seq_len: max_seq_len_in_batch = text_tokens.shape[-1] text_tokens = text_tokens[..., :max_seq_len_in_batch] if len(padding_mask) != 0: padding_mask = torch.stack(padding_mask, dim=0) padding_mask = padding_mask[..., :max_seq_len_in_batch] else: padding_mask = None labels = torch.tensor(labels, dtype=torch.long) channels_last = getattr(opts, "common.channels_last") if channels_last: images = images.to(memory_format=torch.channels_last) return { "samples": { "image": images, "text": text_tokens, "padding_mask": padding_mask, }, "targets": labels, } ================================================ FILE: corenet/data/datasets/multi_modal_img_text/flickr.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import json import os from typing import Dict, List, Tuple from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import ( BaseMultiModalImgText, ) @DATASET_REGISTRY.register(name="flickr", type="multi_modal_image_text") class FlickrDataset(BaseMultiModalImgText): """ Dataset loader for Flickr-30k and Flickr-8k datasets. For more info see: http://hockenmaier.cs.illinois.edu/8k-pictures.html https://shannon.cs.illinois.edu/DenotationGraph/ Splits: train, val, and test Also known in literature as Karpathy splits https://cs.stanford.edu/people/karpathy/deepimagesent/ Tracking license info: Captions have CC BY 3.0 license (see links above). Splits are under BSD License (see Github of NeuralTalk by Karpathy et. al.). Images are from Flickr. We do not own them and are only used for research purposes. """ def get_image_text_dataset(self) -> List[Dict[str, str]]: """ The data under `self.root` is expected to consist of: dataset.json # Karpathy splits + captions images/ # Raw images The metdatadata cap be downloaded from: https://cs.stanford.edu/people/karpathy/deepimagesent/flickr30k.zip Images can be obtained from: Flickr-8k: http://hockenmaier.cs.illinois.edu/8k-pictures.html Flickr-30k: https://shannon.cs.illinois.edu/DenotationGraph/ """ metadata_path = os.path.join(self.root, "dataset.json") with open(metadata_path, "r") as metadata_file: metadata = json.load(metadata_file)["images"] split = self.mode samples = [ { "image_name": sample["filename"], "captions": [x["raw"] for x in sample["sentences"]], } for sample in metadata if sample["split"] == split ] if self.is_training: # For training, flatten the captions by copying each image multiple times # This way at each epoch, each caption will be seen 1 time but each image # will be seen #num_captions (= 5) times. samples = [ {"image_name": sample["image_name"], "captions": caption} for sample in samples for caption in sample["captions"] ] # No need for shuffling, since dataloader takes care of it return samples def __getitem__( self, sample_size_and_index: Tuple[int, int, int] ) -> Dict[str, Dict]: """Return the sample given an index, a pre-specified height and width. Args: sample_size_and_index: Tuple of (crop size height, crop size width, image index) Returns: A dict like: { "samples": { "image": FloatTensor of shape [C, H, W] -> [B, C, H, W] after collate "text": LongTensor of shape if is_training: [num_tokens] -> [B, T] after collate o.w.: [num_captions, num_tokens] -> [B, N, T] after collate "padding_mask": Optional; same size as text "max_seq_len": int indicating the maximum caption length (T) Gets removed after collate }, "targets": -1 } """ crop_size_h, crop_size_w, img_index = sample_size_and_index crop_size = (crop_size_h, crop_size_w) transform_fn = self.get_augmentation_transforms(size=crop_size) sample = self.dataset[img_index] img_path = os.path.join(self.root, "images", sample["image_name"]) captions = sample["captions"] input_img = self.read_image_pil(img_path) img_tensor, captions_tensor, max_seq_len = self._process_img_caption( input_img=input_img, captions_str=captions, img_transform_fn=transform_fn, zero_shot=self.zero_shot_dataset is not None, ) data = { "samples": { "image": img_tensor, "text": captions_tensor, "padding_mask": ( (captions_tensor == self.padding_index) if self.padding_index is not None else None ), "max_seq_len": max_seq_len, }, "targets": -1, } return data ================================================ FILE: corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import fcntl import glob import io import os import pickle import random import shutil import tarfile import time from pathlib import Path from typing import Tuple import pybase64 from PIL import Image, ImageFile from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import ( BaseMultiModalImgText, ) from corenet.utils import logger from corenet.utils.download_utils import get_local_path # To enable reading truncated images, we update the default values of following variables in PIL Image.MAX_IMAGE_PIXELS = None ImageFile.LOAD_TRUNCATED_IMAGES = True TAR_FILE_EXTN = "tar.gz" TAR_FILE_EXTRACTION_CODE = "r:gz" SAMPLE_FILE_EXTN = "pkl" @DATASET_REGISTRY.register(name="img_text_tar", type="multi_modal_image_text") class ImgTextTarDataset(BaseMultiModalImgText): """ImgTextTarDataset class for datasets that store Image-Text pairs as tar files, each tar file with multiple image-text pairs. Assuming that dataset has 10M image-text pairs and each tar file can contains 10000 files, then we can create 1000 tar files. The first tar file, 0.tar.gz, would contain files from 0 to 9999, the second tar file, 1.tar.gz, would contain files from 10000 to 19999, and so on. With 'image_text_data' as the root directory, the expected structure for the training data would be: image_text_data/ ├── metadata.pkl ├── 0.tar.gz ├── 1.tar.gz ├── 2.tar.gz ├── 3.tar.gz .... ├── 1000.tar.gz The metadata is a dictionary containing information about the dataset, and is stored as a pickle file. It should have following keys: 1. total_tar_files: Total number of tar files in the dataset 2. max_files_per_tar: Maximum number of files inside each tar file. 3. tar_file_names: List containing names of the tar files. Each tar file contains the information about image-text files in the pickle format. For example, the content after extracting '0.tar.gz' (assuming it contains 1000 pickle files) would look like this. 0/ ├── 0.pkl │ ├── image │ ├── text ├── 1.pkl ├── ... ├── 9999.pkl Each image-text pair is stored as a dictionary with 'image' and 'text' as keys in a pickle file. The value corresponding to key 'image' corresponds to an image in binary format and the value corresponding to key 'text' corresponds to text caption. ...note: 1. Recommended size of each tar file is about 1GB. 2. Metadata should be stored in the same folder as the tar files. 3. Metadata should be stored as a pickle file. 4. We assume that data is stored in S3. Please make appropriate changes for other storage clients. 5. We generally expect the same number of files per tar. However, due to filtering, the number of files in a given tar could be below the expected number of files. In such cases, we over-sample from that tar file. ...note: For evaluation, we use standard image classification dataset. Please see 'BaseImageClassificationDataset' for expected dataset structure for classification datasets. """ def _metadata_file_path(self) -> str: """Read metadata file path from command-line arguments.""" opts = self.opts metadata_file_path = getattr( opts, f"dataset.multi_modal_img_text.img_text_tar.metadata_file" ) if not metadata_file_path: logger.error( f"Please specify metadata file path using 'dataset.multi_modal_img_text.img_text_tar.metadata_file'." ) return metadata_file_path def _metadata(self): """Read the metadata content. ...note: The metadata file is expected to have following keys: 1. total_tar_files: Total number of tar files in the dataset 2. max_files_per_tar: Maximum number of files inside each tar file. 3. tar_file_names: List containing names of the tar files. """ opts = self.opts metadata_file_path = self._metadata_file_path() # download the metadata file metadata_file_local_path = get_local_path( opts, path=metadata_file_path, force_delete=False, use_start_rank=True, sync_ranks=False, ) with open(metadata_file_local_path, "rb") as handle: metadata = pickle.load(handle) if not {"total_tar_files", "max_files_per_tar", "tar_file_names"}.issubset( metadata.keys() ): logger.error( f"Metadata file in {self.__class__.__name__} should have following keys: \ total_tar_files, max_files_per_tar, tar_file_names" ) return metadata @property def total_tar_files(self) -> int: """Total number of tar files in the dataset.""" metadata = self._metadata() return metadata["total_tar_files"] @property def max_files_per_tar(self) -> int: """Maximum number of files inside each tar file.""" metadata = self._metadata() return metadata["max_files_per_tar"] def get_image_text_dataset(self) -> None: """Override the parent class function to return nothing. Because tar files are downloaded on-the-fly, so any dataset specific pre-processings are skipped here. """ pass def _get_folder_index(self, sample_index) -> int: """Returns the index of the folder containing the file corresponding to the given sample index. Args: sample_index: Sample index. Returns: Folder index. ...note: Each folder is expected to contain a maximum of `max_files_per_tar` files. """ return sample_index // self.max_files_per_tar @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add ImgTextTarDataset dataset-specific arguments to the parser.""" if cls == ImgTextTarDataset: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.multi-modal-img-text.img-text-tar.metadata-file", type=str, default=None, help="Location of the metadata file storing information about file indices and corresponding tar files. " "Defaults to None.", ) return parser def _download_and_extract_tar_file(self, sample_index: int) -> int: """Download and extract the tar file. The tar files are pre-assumably stored in remote location (e.g., S3 bucket) and, if required, are downloaded and extracted to local directory @self.cache_loc. Because of distributed and multi-process training, we first extract them in the same location as downloaded, and then move to @self.cache_loc. Args: sample_index: Sample index. Returns: Index of the folder in which sample may be present. ...note: Each tar file may have samples less than @self.max_files_per_tar because of filtering criteria. """ # Retrieve the folder index that may contain the sample. folder_idx = self._get_folder_index(sample_index) metadata_file_path = self._metadata_file_path() remote_directory = os.path.dirname(metadata_file_path) remote_file_path = f"{remote_directory}/{folder_idx}.{TAR_FILE_EXTN}" with open( f"{self.cache_loc}/{folder_idx}.{TAR_FILE_EXTN}.lock", "a" ) as lock_file: try: fcntl.flock(lock_file, fcntl.LOCK_EX) if os.path.isdir(f"{self.cache_loc}/{folder_idx}"): return folder_idx transfer_client = self._get_transfer_client( file_path=metadata_file_path ) local_tar_file_path = transfer_client.download( remote_file_paths=remote_file_path, dst_dir=self.cache_loc ) # extract the tar file in the same location where tar file is downloaded tar_file_basename = os.path.basename(local_tar_file_path) with tarfile.open(local_tar_file_path, TAR_FILE_EXTRACTION_CODE) as tar: tar.extractall( path=local_tar_file_path.replace(tar_file_basename, "") ) # move extracted tar file to @self.cache_loc shutil.move( local_tar_file_path.replace(f".{TAR_FILE_EXTN}", ""), self.cache_loc ) # Delete the tar file if os.path.exists(local_tar_file_path): os.remove(local_tar_file_path) finally: fcntl.flock(lock_file, fcntl.LOCK_UN) return folder_idx def get_image_text_dataset_pair(self, sample_index: int) -> Tuple[Image.Image, str]: """Get image-text pair from the dataset. Args: sample_index: Sample index. Returns: Returns a tuple of image and text caption for a given sample index. """ # Check if this folder exists. If not, then download the tar file and extract it. folder_idx = self._download_and_extract_tar_file(sample_index=sample_index) file_name = f"{self.cache_loc}/{folder_idx}/{sample_index}.{SAMPLE_FILE_EXTN}" if not Path(file_name).exists(): # Each tar file is supposed to have certain number of samples, but # it may not have all samples (because some samples may be corrupted and are filtered). # Therefore, if file does not exist, we randomly sample the file from a folder and return its content. # This helps in avoiding errors related to tensor mismatch shapes (usually arises when each GPU has different batch size) # when gathering the image and text embeddings from all GPUs in contrastive loss. files_in_folder = glob.glob( f"{self.cache_loc}/{folder_idx}/*.{SAMPLE_FILE_EXTN}" ) assert len(files_in_folder) > 0 file_name = random.choice(files_in_folder) with open(file_name, "rb") as handle: data = pickle.load(handle) img_bytes = pybase64.b64decode(data["image"], validate=True) image = Image.open(io.BytesIO(img_bytes)).convert("RGBA").convert("RGB") if "texts" in data: caption_str = data["texts"] elif "text" in data: caption_str = data["text"] else: raise NotImplementedError("Text key not found.") return image, caption_str def __len__(self) -> int: """Number of samples in the dataset. The dataset comprises of multiple tar files, with each tar file containing 'max_files_per_tar'. Therefore, the dataset could have maximum of @total_tar_files * @max_files_per_tar samples. ...note: For evaluation, we use standard image classification datasets. Therefore, during evaluation, we return length of such datasets. """ if self.is_training: return self.total_tar_files * self.max_files_per_tar else: return super().__len__() def extra_repr(self) -> str: extra_repr_str = super().extra_repr() return ( extra_repr_str + f"\n\tnum_tar_files={self.total_tar_files}" f"\n\tmax_files_per_tar={self.max_files_per_tar}" f"\n\tpadding_index={self.padding_index}" ) ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import ( BaseZeroShotImageClassificationDataset, ) from corenet.utils.registry import Registry ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY = Registry( registry_name="zero_shot_datasets", base_class=BaseZeroShotImageClassificationDataset, lazy_load_dirs=[ "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification" ], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_zero_shot_image_classification_dataset( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: """Helper function to get zero-shot dataset arguments""" parser = BaseZeroShotImageClassificationDataset.add_arguments(parser=parser) parser = ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.all_arguments(parser) return parser def build_zero_shot_image_classification_dataset( opts: argparse.Namespace, *args, **kwargs ) -> BaseZeroShotImageClassificationDataset: """Helper function to build the zero shot image classification dataset.""" zero_shot_dataset_name = getattr( opts, "dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name" ) return ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY[zero_shot_dataset_name]( opts, *args, **kwargs ) ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/base_zero_shot_image_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List, Tuple from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.templates import ( generate_text_prompts_clip, ) class BaseZeroShotImageClassificationDataset(BaseImageClassificationDataset): """Base dataset class for zero shot image classification tasks. ...note: The directory structure for zero-shot image classification datasets should be the same as the image classification datasets. See 'BaseImageClassificationDataset' for more details. """ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == BaseZeroShotImageClassificationDataset: group = parser.add_argument_group(cls.__name__) group.add_argument( "--dataset.multi-modal-img-text.zero-shot-img-cls-dataset-name", type=str, default=None, help="Name of the dataset for zero-shot image classification evaluation. Defaults to None.", ) return parser def __getitem__(self, img_index: int) -> Tuple[str, List[List[str]], int]: """Returns image path and text templates for a given image index. Args: img_index: Index of the image. Returns: Tuple containing image path, list of captions, and image label """ img_path, image_label = self.samples[img_index] return img_path, self.text_prompts, image_label @property def class_names(self) -> List[str]: """Returns the list containing the name of the classes in the dataset. The order of class names in the returned list determine the numerical class label. """ raise NotImplementedError( "Sub-classes should define `class_names` that returns the list of class" " names in the order of class labels." ) @property def text_prompts(self) -> List[List[str]]: """Generates text prompts. A nested list that represents prompts for multiple classes is returned. Each inner list contains a list of prompts for a specific class. """ class_names = self.class_names text_prompts = [] for class_name in class_names: text_prompts.append(self.generate_text_prompts(class_name.lower())) return text_prompts def generate_text_prompts(self, class_name: str) -> List[str]: """Return a list of prompts for the given class name.""" return generate_text_prompts_clip(class_name) ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY, BaseZeroShotImageClassificationDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_class_names import ( IMAGENET_CLASS_NAMES, ) @ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name="imagenet") class ImageNetDatasetZeroShot(BaseZeroShotImageClassificationDataset): """ImageNet dataset for zero-shot evaluation of image-text models.""" @property def class_names(self) -> List[str]: """Return the name of the classes present in the dataset.""" return IMAGENET_CLASS_NAMES ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_a.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List from corenet.data.datasets.classification.imagenet_a import ( IMAGENET_A_CLASS_SUBLIST, ImageNetADataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import ( BaseZeroShotImageClassificationDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_class_names import ( IMAGENET_CLASS_NAMES, ) @ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name="imagenet_a") class ImageNetADatasetZeroShot(BaseZeroShotImageClassificationDataset): """ImageNetA Dataset for zero-shot evaluation of Image-text models.""" @property def class_names(self) -> List[str]: """Return the name of the classes present in the dataset.""" return [ IMAGENET_CLASS_NAMES[ImageNetADataset.class_id_to_imagenet_class_id(i)] for i in range(len(IMAGENET_A_CLASS_SUBLIST)) ] ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_class_names.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # IMAGENET_CLASS_NAMES = [ "tench", "goldfish", "great white shark", "tiger shark", "hammerhead shark", "electric ray", "stingray", "rooster", "hen", "ostrich", "brambling", "goldfinch", "house finch", "junco", "indigo bunting", "American robin", "bulbul", "jay", "magpie", "chickadee", "American dipper", "kite (bird of prey)", "bald eagle", "vulture", "great grey owl", "fire salamander", "smooth newt", "newt", "spotted salamander", "axolotl", "American bullfrog", "tree frog", "tailed frog", "loggerhead sea turtle", "leatherback sea turtle", "mud turtle", "terrapin", "box turtle", "banded gecko", "green iguana", "Carolina anole", "desert grassland whiptail lizard", "agama", "frilled-necked lizard", "alligator lizard", "Gila monster", "European green lizard", "chameleon", "Komodo dragon", "Nile crocodile", "American alligator", "triceratops", "worm snake", "ring-necked snake", "eastern hog-nosed snake", "smooth green snake", "kingsnake", "garter snake", "water snake", "vine snake", "night snake", "boa constrictor", "African rock python", "Indian cobra", "green mamba", "sea snake", "Saharan horned viper", "eastern diamondback rattlesnake", "sidewinder rattlesnake", "trilobite", "harvestman", "scorpion", "yellow garden spider", "barn spider", "European garden spider", "southern black widow", "tarantula", "wolf spider", "tick", "centipede", "black grouse", "ptarmigan", "ruffed grouse", "prairie grouse", "peafowl", "quail", "partridge", "african grey parrot", "macaw", "sulphur-crested cockatoo", "lorikeet", "coucal", "bee eater", "hornbill", "hummingbird", "jacamar", "toucan", "duck", "red-breasted merganser", "goose", "black swan", "tusker", "echidna", "platypus", "wallaby", "koala", "wombat", "jellyfish", "sea anemone", "brain coral", "flatworm", "nematode", "conch", "snail", "slug", "sea slug", "chiton", "chambered nautilus", "Dungeness crab", "rock crab", "fiddler crab", "red king crab", "American lobster", "spiny lobster", "crayfish", "hermit crab", "isopod", "white stork", "black stork", "spoonbill", "flamingo", "little blue heron", "great egret", "bittern bird", "crane bird", "limpkin", "common gallinule", "American coot", "bustard", "ruddy turnstone", "dunlin", "common redshank", "dowitcher", "oystercatcher", "pelican", "king penguin", "albatross", "grey whale", "killer whale", "dugong", "sea lion", "Chihuahua", "Japanese Chin", "Maltese", "Pekingese", "Shih Tzu", "King Charles Spaniel", "Papillon", "toy terrier", "Rhodesian Ridgeback", "Afghan Hound", "Basset Hound", "Beagle", "Bloodhound", "Bluetick Coonhound", "Black and Tan Coonhound", "Treeing Walker Coonhound", "English foxhound", "Redbone Coonhound", "borzoi", "Irish Wolfhound", "Italian Greyhound", "Whippet", "Ibizan Hound", "Norwegian Elkhound", "Otterhound", "Saluki", "Scottish Deerhound", "Weimaraner", "Staffordshire Bull Terrier", "American Staffordshire Terrier", "Bedlington Terrier", "Border Terrier", "Kerry Blue Terrier", "Irish Terrier", "Norfolk Terrier", "Norwich Terrier", "Yorkshire Terrier", "Wire Fox Terrier", "Lakeland Terrier", "Sealyham Terrier", "Airedale Terrier", "Cairn Terrier", "Australian Terrier", "Dandie Dinmont Terrier", "Boston Terrier", "Miniature Schnauzer", "Giant Schnauzer", "Standard Schnauzer", "Scottish Terrier", "Tibetan Terrier", "Australian Silky Terrier", "Soft-coated Wheaten Terrier", "West Highland White Terrier", "Lhasa Apso", "Flat-Coated Retriever", "Curly-coated Retriever", "Golden Retriever", "Labrador Retriever", "Chesapeake Bay Retriever", "German Shorthaired Pointer", "Vizsla", "English Setter", "Irish Setter", "Gordon Setter", "Brittany dog", "Clumber Spaniel", "English Springer Spaniel", "Welsh Springer Spaniel", "Cocker Spaniel", "Sussex Spaniel", "Irish Water Spaniel", "Kuvasz", "Schipperke", "Groenendael dog", "Malinois", "Briard", "Australian Kelpie", "Komondor", "Old English Sheepdog", "Shetland Sheepdog", "collie", "Border Collie", "Bouvier des Flandres dog", "Rottweiler", "German Shepherd Dog", "Dobermann", "Miniature Pinscher", "Greater Swiss Mountain Dog", "Bernese Mountain Dog", "Appenzeller Sennenhund", "Entlebucher Sennenhund", "Boxer", "Bullmastiff", "Tibetan Mastiff", "French Bulldog", "Great Dane", "St. Bernard", "husky", "Alaskan Malamute", "Siberian Husky", "Dalmatian", "Affenpinscher", "Basenji", "pug", "Leonberger", "Newfoundland dog", "Great Pyrenees dog", "Samoyed", "Pomeranian", "Chow Chow", "Keeshond", "brussels griffon", "Pembroke Welsh Corgi", "Cardigan Welsh Corgi", "Toy Poodle", "Miniature Poodle", "Standard Poodle", "Mexican hairless dog (xoloitzcuintli)", "grey wolf", "Alaskan tundra wolf", "red wolf or maned wolf", "coyote", "dingo", "dhole", "African wild dog", "hyena", "red fox", "kit fox", "Arctic fox", "grey fox", "tabby cat", "tiger cat", "Persian cat", "Siamese cat", "Egyptian Mau", "cougar", "lynx", "leopard", "snow leopard", "jaguar", "lion", "tiger", "cheetah", "brown bear", "American black bear", "polar bear", "sloth bear", "mongoose", "meerkat", "tiger beetle", "ladybug", "ground beetle", "longhorn beetle", "leaf beetle", "dung beetle", "rhinoceros beetle", "weevil", "fly", "bee", "ant", "grasshopper", "cricket insect", "stick insect", "cockroach", "praying mantis", "cicada", "leafhopper", "lacewing", "dragonfly", "damselfly", "red admiral butterfly", "ringlet butterfly", "monarch butterfly", "small white butterfly", "sulphur butterfly", "gossamer-winged butterfly", "starfish", "sea urchin", "sea cucumber", "cottontail rabbit", "hare", "Angora rabbit", "hamster", "porcupine", "fox squirrel", "marmot", "beaver", "guinea pig", "common sorrel horse", "zebra", "pig", "wild boar", "warthog", "hippopotamus", "ox", "water buffalo", "bison", "ram (adult male sheep)", "bighorn sheep", "Alpine ibex", "hartebeest", "impala (antelope)", "gazelle", "arabian camel", "llama", "weasel", "mink", "European polecat", "black-footed ferret", "otter", "skunk", "badger", "armadillo", "three-toed sloth", "orangutan", "gorilla", "chimpanzee", "gibbon", "siamang", "guenon", "patas monkey", "baboon", "macaque", "langur", "black-and-white colobus", "proboscis monkey", "marmoset", "white-headed capuchin", "howler monkey", "titi monkey", "Geoffroy's spider monkey", "common squirrel monkey", "ring-tailed lemur", "indri", "Asian elephant", "African bush elephant", "red panda", "giant panda", "snoek fish", "eel", "silver salmon", "rock beauty fish", "clownfish", "sturgeon", "gar fish", "lionfish", "pufferfish", "abacus", "abaya", "academic gown", "accordion", "acoustic guitar", "aircraft carrier", "airliner", "airship", "altar", "ambulance", "amphibious vehicle", "analog clock", "apiary", "apron", "trash can", "assault rifle", "backpack", "bakery", "balance beam", "balloon", "ballpoint pen", "Band-Aid", "banjo", "baluster / handrail", "barbell", "barber chair", "barbershop", "barn", "barometer", "barrel", "wheelbarrow", "baseball", "basketball", "bassinet", "bassoon", "swimming cap", "bath towel", "bathtub", "station wagon", "lighthouse", "beaker", "military hat (bearskin or shako)", "beer bottle", "beer glass", "bell tower", "baby bib", "tandem bicycle", "bikini", "ring binder", "binoculars", "birdhouse", "boathouse", "bobsleigh", "bolo tie", "poke bonnet", "bookcase", "bookstore", "bottle cap", "hunting bow", "bow tie", "brass memorial plaque", "bra", "breakwater", "breastplate", "broom", "bucket", "buckle", "bulletproof vest", "high-speed train", "butcher shop", "taxicab", "cauldron", "candle", "cannon", "canoe", "can opener", "cardigan", "car mirror", "carousel", "tool kit", "cardboard box / carton", "car wheel", "automated teller machine", "cassette", "cassette player", "castle", "catamaran", "CD player", "cello", "mobile phone", "chain", "chain-link fence", "chain mail", "chainsaw", "storage chest", "chiffonier", "bell or wind chime", "china cabinet", "Christmas stocking", "church", "movie theater", "cleaver", "cliff dwelling", "cloak", "clogs", "cocktail shaker", "coffee mug", "coffeemaker", "spiral or coil", "combination lock", "computer keyboard", "candy store", "container ship", "convertible", "corkscrew", "cornet", "cowboy boot", "cowboy hat", "cradle", "construction crane", "crash helmet", "crate", "infant bed", "Crock Pot", "croquet ball", "crutch", "cuirass", "dam", "desk", "desktop computer", "rotary dial telephone", "diaper", "digital clock", "digital watch", "dining table", "dishcloth", "dishwasher", "disc brake", "dock", "dog sled", "dome", "doormat", "drilling rig", "drum", "drumstick", "dumbbell", "Dutch oven", "electric fan", "electric guitar", "electric locomotive", "entertainment center", "envelope", "espresso machine", "face powder", "feather boa", "filing cabinet", "fireboat", "fire truck", "fire screen", "flagpole", "flute", "folding chair", "football helmet", "forklift", "fountain", "fountain pen", "four-poster bed", "freight car", "French horn", "frying pan", "fur coat", "garbage truck", "gas mask or respirator", "gas pump", "goblet", "go-kart", "golf ball", "golf cart", "gondola", "gong", "gown", "grand piano", "greenhouse", "radiator grille", "grocery store", "guillotine", "hair clip", "hair spray", "half-track", "hammer", "hamper", "hair dryer", "hand-held computer", "handkerchief", "hard disk drive", "harmonica", "harp", "combine harvester", "hatchet", "holster", "home theater", "honeycomb", "hook", "hoop skirt", "gymnastic horizontal bar", "horse-drawn vehicle", "hourglass", "iPod", "clothes iron", "carved pumpkin", "jeans", "jeep", "T-shirt", "jigsaw puzzle", "rickshaw", "joystick", "kimono", "knee pad", "knot", "lab coat", "ladle", "lampshade", "laptop computer", "lawn mower", "lens cap", "letter opener", "library", "lifeboat", "lighter", "limousine", "ocean liner", "lipstick", "slip-on shoe", "lotion", "music speaker", "loupe magnifying glass", "sawmill", "magnetic compass", "messenger bag", "mailbox", "tights", "one-piece bathing suit", "manhole cover", "maraca", "marimba", "mask", "matchstick", "maypole", "maze", "measuring cup", "medicine cabinet", "megalith", "microphone", "microwave oven", "military uniform", "milk can", "minibus", "miniskirt", "minivan", "missile", "mitten", "mixing bowl", "mobile home", "ford model t", "modem", "monastery", "monitor", "moped", "mortar and pestle", "graduation cap", "mosque", "mosquito net", "vespa", "mountain bike", "tent", "computer mouse", "mousetrap", "moving van", "muzzle", "metal nail", "neck brace", "necklace", "baby pacifier", "notebook computer", "obelisk", "oboe", "ocarina", "odometer", "oil filter", "pipe organ", "oscilloscope", "overskirt", "bullock cart", "oxygen mask", "product packet / packaging", "paddle", "paddle wheel", "padlock", "paintbrush", "pajamas", "palace", "pan flute", "paper towel", "parachute", "parallel bars", "park bench", "parking meter", "railroad car", "patio", "payphone", "pedestal", "pencil case", "pencil sharpener", "perfume", "Petri dish", "photocopier", "plectrum", "Pickelhaube", "picket fence", "pickup truck", "pier", "piggy bank", "pill bottle", "pillow", "ping-pong ball", "pinwheel", "pirate ship", "drink pitcher", "block plane", "planetarium", "plastic bag", "plate rack", "farm plow", "plunger", "Polaroid camera", "pole", "police van", "poncho", "pool table", "soda bottle", "plant pot", "potter's wheel", "power drill", "prayer rug", "printer", "prison", "missile", "projector", "hockey puck", "punching bag", "purse", "quill", "quilt", "race car", "racket", "radiator", "radio", "radio telescope", "rain barrel", "recreational vehicle", "fishing casting reel", "reflex camera", "refrigerator", "remote control", "restaurant", "revolver", "rifle", "rocking chair", "rotisserie", "eraser", "rugby ball", "ruler measuring stick", "sneaker", "safe", "safety pin", "salt shaker", "sandal", "sarong", "saxophone", "scabbard", "weighing scale", "school bus", "schooner", "scoreboard", "CRT monitor", "screw", "screwdriver", "seat belt", "sewing machine", "shield", "shoe store", "shoji screen / room divider", "shopping basket", "shopping cart", "shovel", "shower cap", "shower curtain", "ski", "balaclava ski mask", "sleeping bag", "slide rule", "sliding door", "slot machine", "snorkel", "snowmobile", "snowplow", "soap dispenser", "soccer ball", "sock", "solar thermal collector", "sombrero", "soup bowl", "keyboard space bar", "space heater", "space shuttle", "spatula", "motorboat", "spider web", "spindle", "sports car", "spotlight", "stage", "steam locomotive", "through arch bridge", "steel drum", "stethoscope", "scarf", "stone wall", "stopwatch", "stove", "strainer", "tram", "stretcher", "couch", "stupa", "submarine", "suit", "sundial", "sunglasses", "sunglasses", "sunscreen", "suspension bridge", "mop", "sweatshirt", "swim trunks / shorts", "swing", "electrical switch", "syringe", "table lamp", "tank", "tape player", "teapot", "teddy bear", "television", "tennis ball", "thatched roof", "front curtain", "thimble", "threshing machine", "throne", "tile roof", "toaster", "tobacco shop", "toilet seat", "torch", "totem pole", "tow truck", "toy store", "tractor", "semi-trailer truck", "tray", "trench coat", "tricycle", "trimaran", "tripod", "triumphal arch", "trolleybus", "trombone", "hot tub", "turnstile", "typewriter keyboard", "umbrella", "unicycle", "upright piano", "vacuum cleaner", "vase", "vaulted or arched ceiling", "velvet fabric", "vending machine", "vestment", "viaduct", "violin", "volleyball", "waffle iron", "wall clock", "wallet", "wardrobe", "military aircraft", "sink", "washing machine", "water bottle", "water jug", "water tower", "whiskey jug", "whistle", "hair wig", "window screen", "window shade", "Windsor tie", "wine bottle", "airplane wing", "wok", "wooden spoon", "wool", "split-rail fence", "shipwreck", "sailboat", "yurt", "website", "comic book", "crossword", "traffic or street sign", "traffic light", "dust jacket", "menu", "plate", "guacamole", "consomme", "hot pot", "trifle", "ice cream", "popsicle", "baguette", "bagel", "pretzel", "cheeseburger", "hot dog", "mashed potatoes", "cabbage", "broccoli", "cauliflower", "zucchini", "spaghetti squash", "acorn squash", "butternut squash", "cucumber", "artichoke", "bell pepper", "cardoon", "mushroom", "Granny Smith apple", "strawberry", "orange", "lemon", "fig", "pineapple", "banana", "jackfruit", "cherimoya (custard apple)", "pomegranate", "hay", "carbonara", "chocolate syrup", "dough", "meatloaf", "pizza", "pot pie", "burrito", "red wine", "espresso", "tea cup", "eggnog", "mountain", "bubble", "cliff", "coral reef", "geyser", "lakeshore", "promontory", "sandbar", "beach", "valley", "volcano", "baseball player", "bridegroom", "scuba diver", "rapeseed", "daisy", "yellow lady's slipper", "corn", "acorn", "rose hip", "horse chestnut seed", "coral fungus", "agaric", "gyromitra", "stinkhorn mushroom", "earth star fungus", "hen of the woods mushroom", "bolete", "corn cob", "toilet paper", ] ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_r.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List from corenet.data.datasets.classification.imagenet_r import ( IMAGENET_R_CLASS_SUBLIST, ImageNetRDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import ( BaseZeroShotImageClassificationDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import ( IMAGENET_CLASS_NAMES, ) @ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name="imagenet_r") class ImageNetRDatasetZeroShot( BaseZeroShotImageClassificationDataset, ImageNetRDataset ): """ImageNet-R dataset for zero-shot evaluation of Image-text models.""" @property def class_names(self) -> List[str]: """Return the name of the classes present in the dataset.""" return [ IMAGENET_CLASS_NAMES[ImageNetRDataset.class_id_to_imagenet_class_id(i)] for i in range(len(IMAGENET_R_CLASS_SUBLIST)) ] ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_sketch.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List from corenet.data.datasets.classification.imagenet_sketch import ImageNetSketchDataset from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import ( ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import ( BaseZeroShotImageClassificationDataset, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import ( IMAGENET_CLASS_NAMES, ) @ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name="imagenet_sketch") class ImageNetSketchDatasetZeroShot( BaseZeroShotImageClassificationDataset, ImageNetSketchDataset ): """ImageNet-Sketch Dataset for zero-shot evaluation of Image-text models.""" @property def class_names(self) -> List[str]: """Return the name of the classes present in the dataset.""" return IMAGENET_CLASS_NAMES ================================================ FILE: corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/templates.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List CLIP_TEMPLATES = [ "a bad photo of a {class_name}.", "a photo of many {class_name}.", "a sculpture of a {class_name}.", "a photo of the hard to see {class_name}.", "a low resolution photo of the {class_name}.", "a rendering of a {class_name}.", "graffiti of a {class_name}.", "a bad photo of the {class_name}.", "a cropped photo of the {class_name}.", "a tattoo of a {class_name}.", "the embroidered {class_name}.", "a photo of a hard to see {class_name}.", "a bright photo of a {class_name}.", "a photo of a clean {class_name}.", "a photo of a dirty {class_name}.", "a dark photo of the {class_name}.", "a drawing of a {class_name}.", "a photo of my {class_name}.", "the plastic {class_name}.", "a photo of the cool {class_name}.", "a close-up photo of a {class_name}.", "a black and white photo of the {class_name}.", "a painting of the {class_name}.", "a painting of a {class_name}.", "a pixelated photo of the {class_name}.", "a sculpture of the {class_name}.", "a bright photo of the {class_name}.", "a cropped photo of a {class_name}.", "a plastic {class_name}.", "a photo of the dirty {class_name}.", "a jpeg corrupted photo of a {class_name}.", "a blurry photo of the {class_name}.", "a photo of the {class_name}.", "a good photo of the {class_name}.", "a rendering of the {class_name}.", "a {class_name} in a video game.", "a photo of one {class_name}.", "a doodle of a {class_name}.", "a close-up photo of the {class_name}.", "a photo of a {class_name}.", "the origami {class_name}.", "the {class_name} in a video game.", "a sketch of a {class_name}.", "a doodle of the {class_name}.", "a origami {class_name}.", "a low resolution photo of a {class_name}.", "the toy {class_name}.", "a rendition of the {class_name}.", "a photo of the clean {class_name}.", "a photo of a large {class_name}.", "a rendition of a {class_name}.", "a photo of a nice {class_name}.", "a photo of a weird {class_name}.", "a blurry photo of a {class_name}.", "a cartoon {class_name}.", "art of a {class_name}.", "a sketch of the {class_name}.", "a embroidered {class_name}.", "a pixelated photo of a {class_name}.", "itap of the {class_name}.", "a jpeg corrupted photo of the {class_name}.", "a good photo of a {class_name}.", "a plushie {class_name}.", "a photo of the nice {class_name}.", "a photo of the small {class_name}.", "a photo of the weird {class_name}.", "the cartoon {class_name}.", "art of the {class_name}.", "a drawing of the {class_name}.", "a photo of the large {class_name}.", "a black and white photo of a {class_name}.", "the plushie {class_name}.", "a dark photo of a {class_name}.", "itap of a {class_name}.", "graffiti of the {class_name}.", "a toy {class_name}.", "itap of my {class_name}.", "a photo of a cool {class_name}.", "a photo of a small {class_name}.", "a tattoo of the {class_name}.", ] def generate_text_prompts_clip(class_name) -> List[str]: """Return a list of prompts for the given class name.""" return [template.format(class_name=class_name) for template in CLIP_TEMPLATES] ================================================ FILE: corenet/data/datasets/segmentation/__init__.py ================================================ ================================================ FILE: corenet/data/datasets/segmentation/ade20k.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import List import numpy as np from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.segmentation.base_segmentation import ( BaseImageSegmentationDataset, ) @DATASET_REGISTRY.register(name="ade20k", type="segmentation") class ADE20KDataset(BaseImageSegmentationDataset): """Dataset class for the ADE20K dataset The structure of the dataset should be something like this: :: ADEChallengeData2016/annotations/training/*.png ADEChallengeData2016/annotations/validation/*.png ADEChallengeData2016/images/training/*.jpg ADEChallengeData2016/images/validation/*.jpg Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) root = self.root image_dir = os.path.join( root, "images", "training" if self.is_training else "validation" ) annotation_dir = os.path.join( root, "annotations", "training" if self.is_training else "validation" ) images = [] masks = [] for file_name in os.listdir(image_dir): if file_name.endswith(".jpg"): img_f_name = "{}/{}".format(image_dir, file_name) mask_f_name = "{}/{}".format( annotation_dir, file_name.replace("jpg", "png") ) if os.path.isfile(img_f_name) and os.path.isfile(mask_f_name): images.append(img_f_name) masks.append(mask_f_name) self.images = images self.masks = masks self.ignore_label = 255 self.background_idx = 0 self.check_dataset() @staticmethod def adjust_mask_value() -> int: """Adjust the mask value by this factor""" # because we do not include background index for ADE20k, we shift mask labels by 1 return 1 @staticmethod def color_palette() -> List[int]: """Class index to RGB color mapping. The list index corresponds to class id. Note that the color list is flattened.""" color_codes = [ [0, 0, 0], # background [120, 120, 120], [180, 120, 120], [6, 230, 230], [80, 50, 50], [4, 200, 3], [120, 120, 80], [140, 140, 140], [204, 5, 255], [230, 230, 230], [4, 250, 7], [224, 5, 255], [235, 255, 7], [150, 5, 61], [120, 120, 70], [8, 255, 51], [255, 6, 82], [143, 255, 140], [204, 255, 4], [255, 51, 7], [204, 70, 3], [0, 102, 200], [61, 230, 250], [255, 6, 51], [11, 102, 255], [255, 7, 71], [255, 9, 224], [9, 7, 230], [220, 220, 220], [255, 9, 92], [112, 9, 255], [8, 255, 214], [7, 255, 224], [255, 184, 6], [10, 255, 71], [255, 41, 10], [7, 255, 255], [224, 255, 8], [102, 8, 255], [255, 61, 6], [255, 194, 7], [255, 122, 8], [0, 255, 20], [255, 8, 41], [255, 5, 153], [6, 51, 255], [235, 12, 255], [160, 150, 20], [0, 163, 255], [140, 140, 140], [250, 10, 15], [20, 255, 0], [31, 255, 0], [255, 31, 0], [255, 224, 0], [153, 255, 0], [0, 0, 255], [255, 71, 0], [0, 235, 255], [0, 173, 255], [31, 0, 255], [11, 200, 200], [255, 82, 0], [0, 255, 245], [0, 61, 255], [0, 255, 112], [0, 255, 133], [255, 0, 0], [255, 163, 0], [255, 102, 0], [194, 255, 0], [0, 143, 255], [51, 255, 0], [0, 82, 255], [0, 255, 41], [0, 255, 173], [10, 0, 255], [173, 255, 0], [0, 255, 153], [255, 92, 0], [255, 0, 255], [255, 0, 245], [255, 0, 102], [255, 173, 0], [255, 0, 20], [255, 184, 184], [0, 31, 255], [0, 255, 61], [0, 71, 255], [255, 0, 204], [0, 255, 194], [0, 255, 82], [0, 10, 255], [0, 112, 255], [51, 0, 255], [0, 194, 255], [0, 122, 255], [0, 255, 163], [255, 153, 0], [0, 255, 10], [255, 112, 0], [143, 255, 0], [82, 0, 255], [163, 255, 0], [255, 235, 0], [8, 184, 170], [133, 0, 255], [0, 255, 92], [184, 0, 255], [255, 0, 31], [0, 184, 255], [0, 214, 255], [255, 0, 112], [92, 255, 0], [0, 224, 255], [112, 224, 255], [70, 184, 160], [163, 0, 255], [153, 0, 255], [71, 255, 0], [255, 0, 163], [255, 204, 0], [255, 0, 143], [0, 255, 235], [133, 255, 0], [255, 0, 235], [245, 0, 255], [255, 0, 122], [255, 245, 0], [10, 190, 212], [214, 255, 0], [0, 204, 255], [20, 0, 255], [255, 255, 0], [0, 153, 255], [0, 41, 255], [0, 255, 204], [41, 0, 255], [41, 255, 0], [173, 0, 255], [0, 245, 255], [71, 0, 255], [122, 0, 255], [0, 255, 184], [0, 92, 255], [184, 255, 0], [0, 133, 255], [255, 214, 0], [25, 194, 194], [102, 255, 0], [92, 0, 255], ] color_codes = np.asarray(color_codes).flatten() return list(color_codes) @staticmethod def class_names() -> List[str]: """Class index (index of a list corresponds to class id) to class name""" return [ "background", "wall", "building", "sky", "floor", "tree", "ceiling", "road", "bed ", "windowpane", "grass", "cabinet", "sidewalk", "person", "earth", "door", "table", "mountain", "plant", "curtain", "chair", "car", "water", "painting", "sofa", "shelf", "house", "sea", "mirror", "rug", "field", "armchair", "seat", "fence", "desk", "rock", "wardrobe", "lamp", "bathtub", "railing", "cushion", "base", "box", "column", "signboard", "chest of drawers", "counter", "sand", "sink", "skyscraper", "fireplace", "refrigerator", "grandstand", "path", "stairs", "runway", "case", "pool table", "pillow", "screen door", "stairway", "river", "bridge", "bookcase", "blind", "coffee table", "toilet", "flower", "book", "hill", "bench", "countertop", "stove", "palm", "kitchen island", "computer", "swivel chair", "boat", "bar", "arcade machine", "hovel", "bus", "towel", "light", "truck", "tower", "chandelier", "awning", "streetlight", "booth", "television receiver", "airplane", "dirt track", "apparel", "pole", "land", "bannister", "escalator", "ottoman", "bottle", "buffet", "poster", "stage", "van", "ship", "fountain", "conveyer belt", "canopy", "washer", "plaything", "swimming pool", "stool", "barrel", "basket", "waterfall", "tent", "bag", "minibike", "cradle", "oven", "ball", "food", "step", "tank", "trade name", "microwave", "pot", "animal", "bicycle", "lake", "dishwasher", "screen", "blanket", "sculpture", "hood", "sconce", "vase", "traffic light", "tray", "ashcan", "fan", "pier", "crt screen", "plate", "monitor", "bulletin board", "shower", "radiator", "glass", "clock", "flag", ] ================================================ FILE: corenet/data/datasets/segmentation/base_segmentation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import List, Mapping, Optional, Tuple, Union import numpy as np import torch from PIL import Image from torch import Tensor from corenet.data.datasets.dataset_base import BaseImageDataset from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.utils import logger from corenet.utils.color_map import Colormap class BaseImageSegmentationDataset(BaseImageDataset): """Base Dataset class for Image Segmentation datasets. Sub-classes must define `ignore_label` and `background_idx` variable. Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.masks = None self.images = None # ignore label and background indices are dataset specific. So, child classes # need to implement these self.ignore_label = None self.background_idx = None @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseImageSegmentationDataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) # segmentation evaluation related arguments group.add_argument( "--evaluation.segmentation.apply-color-map", action="store_true", default=False, help="Apply color map to different classes in segmentation masks. Useful in visualization " "+ some competitions (e.g, PASCAL VOC) accept submissions with colored segmentation masks." "Defaults to False.", ) group.add_argument( "--evaluation.segmentation.save-overlay-rgb-pred", action="store_true", default=False, help="Enable this flag to visualize predicted masks on top of input image. " "Defaults to False.", ) group.add_argument( "--evaluation.segmentation.save-masks", action="store_true", default=False, help="Save predicted masks without colormaps. Useful for submitting to " "competitions like Cityscapes. Defaults to False.", ) group.add_argument( "--evaluation.segmentation.overlay-mask-weight", default=0.5, type=float, help="Contribution of mask when overlaying on top of RGB image. Defaults to 0.5.", ) group.add_argument( "--evaluation.segmentation.mode", type=str, default="validation_set", choices=["single_image", "image_folder", "validation_set"], help="Contribution of mask when overlaying on top of RGB image. Defaults to validation_set.", ) group.add_argument( "--evaluation.segmentation.path", type=str, default=None, help="Path of the image or image folder (only required for single_image and image_folder modes). " "Defaults to None.", ) group.add_argument( "--evaluation.segmentation.resize-input-images", action="store_true", default=False, help="Enable resizing input images while maintaining aspect ratio during segmentation evaluation." "Defaults to False.", ) group.add_argument( "--evaluation.segmentation.resize-input-images-fixed-size", action="store_true", default=False, help="Enable resizing input images to fixed size during segmentation evaluation. " "Defaults to False.", ) return parser def check_dataset(self) -> None: # TODO: Remove this check in future assert self.masks is not None, "Please specify masks for segmentation data" assert self.images is not None, "Please specify images for segmentation data" assert ( self.ignore_label is not None ), "Please specify ignore label for segmentation dataset" assert ( self.background_idx is not None ), "Please specify background index for segmentation dataset" def _training_transforms(self, size: Tuple[int, int]) -> T.BaseTransformation: """Data augmentation during training. Order of transformation is RandomShortSizeResize, RandomHorizontalFlip, RandomCrop, Optional[RandomGaussianBlur], Optional[PhotometricDistort], Optional[RandomRotate]. If random order is enabled, then the order of transforms is shuffled, with an exception to RandomShortSizeResize. These transforms are followed by ToTensor. Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ first_aug = T.RandomShortSizeResize(opts=self.opts) aug_list = [ T.RandomHorizontalFlip(opts=self.opts), T.RandomCrop(opts=self.opts, size=size, ignore_idx=self.ignore_label), ] if getattr(self.opts, "image_augmentation.random_gaussian_noise.enable"): aug_list.append(T.RandomGaussianBlur(opts=self.opts)) if getattr(self.opts, "image_augmentation.photo_metric_distort.enable"): aug_list.append(T.PhotometricDistort(opts=self.opts)) if getattr(self.opts, "image_augmentation.random_rotate.enable"): aug_list.append(T.RandomRotate(opts=self.opts)) if getattr(self.opts, "image_augmentation.random_order.enable"): new_aug_list = [ first_aug, T.RandomOrder(opts=self.opts, img_transforms=aug_list), T.ToTensor(opts=self.opts), ] return Compose(opts=self.opts, img_transforms=new_aug_list) else: aug_list.insert(0, first_aug) aug_list.append(T.ToTensor(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) def _validation_transforms( self, size: Tuple[int, int], *args, **kwargs ) -> T.BaseTransformation: """Data augmentation during validation. Order of transformation is Resize, ToTensor Args: size: Size for resizing the input image. Expected to be a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` """ aug_list = [T.Resize(opts=self.opts), T.ToTensor(opts=self.opts)] return Compose(opts=self.opts, img_transforms=aug_list) def _evaluation_transforms( self, size: Union[int, Tuple[int, int]], *args, **kwargs ) -> T.BaseTransformation: """Data augmentation during testing/evaluation. Order of transformation is Optional[Resize], ToTensor Args: size: Size for resizing the input image. Expected to be an int or a tuple (height, width) Returns: An instance of `corenet.data.transforms.image_pil.BaseTransformation.` ...note:: When `evaluation.segmentation.resize_input_images` is enabled, then images are resized while maintaining the aspect ratio. If size is a tuple of integers, then min(size) is used as a size. When `evaluation.segmentation.resize_input_images_fixed_size` is enabled, then images are resized to the given size. """ aug_list = [] resize_maintain_ar = getattr( self.opts, "evaluation.segmentation.resize_input_images" ) resize_fixed_size = getattr( self.opts, "evaluation.segmentation.resize_input_images_fixed_size" ) if resize_maintain_ar: assert resize_fixed_size is False # A standard practice for tasks of segmentation is to resize images while maintaining # aspect ratio. To do so during evaluation, we pass min(img_size) as size as an # argument to resize function. The resize function then resizes image while # maintaining aspect ratio. aug_list.append(T.Resize(opts=self.opts, img_size=min(size))) elif resize_fixed_size: assert resize_maintain_ar is False # we want to resize while maintaining aspect ratio. So, we pass size as an # argument to resize function aug_list.append(T.Resize(opts=self.opts, img_size=size)) # default is no resizing aug_list.append(T.ToTensor(opts=self.opts)) return Compose(opts=self.opts, img_transforms=aug_list) @staticmethod def adjust_mask_value() -> int: """Adjust the mask value by this factor""" # Some datasets (e.g., ADE20k) requires us to adjust the mask value. # By default, we set to 0. But child classes can adjust it return 0 def __len__(self) -> int: """Number of samples in segmentation dataset""" return len(self.images) @staticmethod def color_palette() -> List[int]: """Class index to RGB color mapping. The list index corresponds to class id. Note that the color list is flattened.""" # Child classes may override this method (optionally) return Colormap().get_color_map_list() @staticmethod def class_names() -> List[str]: """Class index to name. The list index should correspond to class id""" # Child classes may implement these methods (optionally) raise NotImplementedError @staticmethod def read_mask_pil(path: str) -> Optional[Image.Image]: """Reads mask image and returns as a PIL image""" try: mask = Image.open(path) if mask.mode != "L": logger.error("Mask mode should be L. Got: {}".format(mask.mode)) return mask except: return None @staticmethod def convert_mask_to_tensor(mask: Image.Image) -> Tensor: """Convert PIL mask to Tensor""" # convert to tensor mask = np.array(mask) if len(mask.shape) > 2 and mask.shape[-1] > 1: mask = np.ascontiguousarray(mask.transpose(2, 0, 1)) return torch.as_tensor(mask, dtype=torch.long) def __getitem__( self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and labels of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["targets"]["mask"]: Shape is [Height, Width] """ crop_size_h, crop_size_w, img_index = sample_size_and_index transform = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) mask = self.read_mask_pil(self.masks[img_index]) img = self.read_image_pil(self.images[img_index]) if (img.size[0] != mask.size[0]) or (img.size[1] != mask.size[1]): logger.error( "Input image and mask sizes are different. Input size: {} and Mask size: {}".format( img.size, mask.size ) ) data = {"image": img} if not self.is_evaluation: data["mask"] = mask data = transform(data) if self.is_evaluation: # for evaluation purposes, resize only the input and not mask data["mask"] = self.convert_mask_to_tensor(mask) output_data = { "samples": data["image"], # ignore dataset specific indices in mask "targets": data["mask"] - self.adjust_mask_value(), } if self.is_evaluation: im_width, im_height = img.size img_name = self.images[img_index].split(os.sep)[-1].replace("jpg", "png") mask = output_data.pop("targets") output_data["targets"] = { "mask": mask, "file_name": img_name, "im_width": im_width, "im_height": im_height, } return output_data ================================================ FILE: corenet/data/datasets/segmentation/coco_segmentation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import List, Mapping, Optional, Tuple, Union import numpy as np from pycocotools import mask from pycocotools.coco import COCO from torch import Tensor from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.segmentation.base_segmentation import ( BaseImageSegmentationDataset, ) @DATASET_REGISTRY.register(name="coco", type="segmentation") class COCOSegmentationDataset(BaseImageSegmentationDataset): """Dataset class for the COCO dataset that maps classes to PASCAL VOC classes Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) year = 2017 split = "train" if self.is_training else "val" ann_file = os.path.join( self.root, "annotations/instances_{}{}.json".format(split, year) ) self.img_dir = os.path.join(self.root, "images/{}{}".format(split, year)) self.split = split self.coco = COCO(ann_file) self.coco_mask = mask self.ids = list(self.coco.imgs.keys()) self.ignore_label = 255 self.background_idx = 0 def __getitem__( self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]: """Returns the sample corresponding to the input sample index. Returned sample is transformed into the size specified by the input. Args: sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index) Returns: A dictionary with `samples` and `targets` as keys corresponding to input and labels of a sample, respectively. Shapes: The shape of values in output dictionary, output_data, are as follows: output_data["samples"]["image"]: Shape is [Channels, Height, Width] output_data["targets"]["mask"]: Shape is [Height, Width] """ crop_size_h, crop_size_w, img_index = sample_size_and_index _transform = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w)) coco = self.coco img_id = self.ids[img_index] img_metadata = coco.loadImgs(img_id)[0] path = img_metadata["file_name"] rgb_img = self.read_image_pil(os.path.join(self.img_dir, path)) cocotarget = coco.loadAnns(coco.getAnnIds(imgIds=img_id)) mask = self._gen_seg_mask( cocotarget, img_metadata["height"], img_metadata["width"] ) data = {"image": rgb_img, "mask": None if self.is_evaluation else mask} data = _transform(data) if self.is_evaluation: # for evaluation purposes, resize only the input and not mask data["mask"] = mask output_data = {"samples": data["image"], "targets": data["mask"]} if self.is_evaluation: im_width, im_height = rgb_img.size img_name = path.replace("jpg", "png") mask = output_data.pop("targets") output_data["targets"] = { "mask": mask, "file_name": img_name, "im_width": im_width, "im_height": im_height, } return output_data def _gen_seg_mask(self, target, h: int, w: int) -> np.ndarray: """Generates a mask in PASCAL VOC format""" mask = np.zeros((h, w), dtype=np.uint8) coco_mask = self.coco_mask coco_to_pascal = self.coco_to_pascal_mapping() for instance in target: rle = coco_mask.frPyObjects(instance["segmentation"], h, w) m = coco_mask.decode(rle) cat = instance["category_id"] if cat in coco_to_pascal: c = coco_to_pascal.index(cat) else: continue if len(m.shape) < 3: mask[:, :] += (mask == 0) * (m * c) else: mask[:, :] += (mask == 0) * (((np.sum(m, axis=2)) > 0) * c).astype( np.uint8 ) return mask def __len__(self) -> int: return len(self.ids) @staticmethod def class_names() -> List[str]: """PASCAL VOC classes names""" return [ "background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "potted_plant", "sheep", "sofa", "train", "tv_monitor", ] @staticmethod def coco_to_pascal_mapping() -> List[int]: """COCO to PASCAL VOC class mapping""" return [ 0, 5, 2, 16, 9, 44, 6, 3, 17, 62, 21, 67, 18, 19, 4, 1, 64, 20, 63, 7, 72, ] ================================================ FILE: corenet/data/datasets/segmentation/coco_stuff.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import List import numpy as np from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.segmentation.base_segmentation import ( BaseImageSegmentationDataset, ) @DATASET_REGISTRY.register(name="coco_stuff", type="segmentation") class COCOStuffDataset(BaseImageSegmentationDataset): """`COCOStuff `_ dataset. The segmenation mask IDs are from 0 to 171 with 0 representing unlabelled/background area. So, it comprises of a total of 172 classes. The dataset includes annotation for all 164k images in COCO 2017 dataset. With 'cocostuff' as the root directory, the expected structure of images and annotations is as follows: cocostuff/ ├── images/ │ ├── train2017/ │ │ ├── *.jpg │ ├── val2017/ │ │ ├── *.jpg ├── annotations/ │ ├── train2017/ │ │ ├── *.png │ ├── val2017/ │ │ ├── *.png ...note: The dataset has total of 182 classes, but labels are provided only for 171 classes. Therefore, unnannotated classes needs to be remapped before training. This can be done by running the following script: >>> python tools/converter_coco_stuff.py --src-dir cocostuff/annotations Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) root = self.root year = 2017 split = "train" if self.is_training else "val" img_dir = os.path.join(root, "images/{}{}".format(split, year)) annotation_dir = os.path.join(root, "annotations/{}{}".format(split, year)) self.masks = [] self.images = [] file_names = os.listdir(img_dir) for file_name in file_names: if not file_name.endswith(".jpg"): continue jpg_file = os.path.join(img_dir, file_name) png_file = os.path.join(annotation_dir, file_name.replace(".jpg", ".png")) self.images.append(jpg_file) self.masks.append(png_file) self.ignore_label = 255 self.background_idx = 0 self.check_dataset() @staticmethod def color_palette() -> List[int]: """Class index to RGB color mapping. The list index corresponds to class id. Note that the color list is flattened.""" color_codes = [ [0, 0, 0], [0, 192, 64], [0, 192, 64], [0, 64, 96], [128, 192, 192], [0, 64, 64], [0, 192, 224], [0, 192, 192], [128, 192, 64], [0, 192, 96], [128, 192, 64], [128, 32, 192], [0, 0, 224], [0, 0, 64], [0, 160, 192], [128, 0, 96], [128, 0, 192], [0, 32, 192], [128, 128, 224], [0, 0, 192], [128, 160, 192], [128, 128, 0], [128, 0, 32], [128, 32, 0], [128, 0, 128], [64, 128, 32], [0, 160, 0], [0, 0, 0], [192, 128, 160], [0, 32, 0], [0, 128, 128], [64, 128, 160], [128, 160, 0], [0, 128, 0], [192, 128, 32], [128, 96, 128], [0, 0, 128], [64, 0, 32], [0, 224, 128], [128, 0, 0], [192, 0, 160], [0, 96, 128], [128, 128, 128], [64, 0, 160], [128, 224, 128], [128, 128, 64], [192, 0, 32], [128, 96, 0], [128, 0, 192], [0, 128, 32], [64, 224, 0], [0, 0, 64], [128, 128, 160], [64, 96, 0], [0, 128, 192], [0, 128, 160], [192, 224, 0], [0, 128, 64], [128, 128, 32], [192, 32, 128], [0, 64, 192], [0, 0, 32], [64, 160, 128], [128, 64, 64], [128, 0, 160], [64, 32, 128], [128, 192, 192], [0, 0, 160], [192, 160, 128], [128, 192, 0], [128, 0, 96], [192, 32, 0], [128, 64, 128], [64, 128, 96], [64, 160, 0], [0, 64, 0], [192, 128, 224], [64, 32, 0], [0, 192, 128], [64, 128, 224], [192, 160, 0], [0, 192, 0], [192, 128, 96], [192, 96, 128], [0, 64, 128], [64, 0, 96], [64, 224, 128], [128, 64, 0], [192, 0, 224], [64, 96, 128], [128, 192, 128], [64, 0, 224], [192, 224, 128], [128, 192, 64], [192, 0, 96], [192, 96, 0], [128, 64, 192], [0, 128, 96], [0, 224, 0], [64, 64, 64], [128, 128, 224], [0, 96, 0], [64, 192, 192], [0, 128, 224], [128, 224, 0], [64, 192, 64], [128, 128, 96], [128, 32, 128], [64, 0, 192], [0, 64, 96], [0, 160, 128], [192, 0, 64], [128, 64, 224], [0, 32, 128], [192, 128, 192], [0, 64, 224], [128, 160, 128], [192, 128, 0], [128, 64, 32], [128, 32, 64], [192, 0, 128], [64, 192, 32], [0, 160, 64], [64, 0, 0], [192, 192, 160], [0, 32, 64], [64, 128, 128], [64, 192, 160], [128, 160, 64], [64, 128, 0], [192, 192, 32], [128, 96, 192], [64, 0, 128], [64, 64, 32], [0, 224, 192], [192, 0, 0], [192, 64, 160], [0, 96, 192], [192, 128, 128], [64, 64, 160], [128, 224, 192], [192, 128, 64], [192, 64, 32], [128, 96, 64], [192, 0, 192], [0, 192, 32], [64, 224, 64], [64, 0, 64], [128, 192, 160], [64, 96, 64], [64, 128, 192], [0, 192, 160], [192, 224, 64], [64, 128, 64], [128, 192, 32], [192, 32, 192], [64, 64, 192], [0, 64, 32], [64, 160, 192], [192, 64, 64], [128, 64, 160], [64, 32, 192], [192, 192, 192], [0, 64, 160], [192, 160, 192], [192, 192, 0], [128, 64, 96], [192, 32, 64], [192, 64, 128], [64, 192, 96], [64, 160, 64], [64, 64, 0], ] color_codes = np.asarray(color_codes).flatten() return list(color_codes) @staticmethod def class_names() -> List[str]: """Class index to class name mapping. Class index corresponds to list index""" return [ "unlabeled", "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush", "banner", "blanket", "branch", "bridge", "building-other", "bush", "cabinet", "cage", "cardboard", "carpet", "ceiling-other", "ceiling-tile", "cloth", "clothes", "clouds", "counter", "cupboard", "curtain", "desk-stuff", "dirt", "door-stuff", "fence", "floor-marble", "floor-other", "floor-stone", "floor-tile", "floor-wood", "flower", "fog", "food-other", "fruit", "furniture-other", "grass", "gravel", "ground-other", "hill", "house", "leaves", "light", "mat", "metal", "mirror-stuff", "moss", "mountain", "mud", "napkin", "net", "paper", "pavement", "pillow", "plant-other", "plastic", "platform", "playingfield", "railing", "railroad", "river", "road", "rock", "roof", "rug", "salad", "sand", "sea", "shelf", "sky-other", "skyscraper", "snow", "solid-other", "stairs", "stone", "straw", "structural-other", "table", "tent", "textile-other", "towel", "tree", "vegetable", "wall-brick", "wall-concrete", "wall-other", "wall-panel", "wall-stone", "wall-tile", "wall-wood", "water-other", "waterdrops", "window-blind", "window-other", "wood", ] ================================================ FILE: corenet/data/datasets/segmentation/pascal_voc.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from typing import List import numpy as np from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.segmentation.base_segmentation import ( BaseImageSegmentationDataset, ) @DATASET_REGISTRY.register(name="pascal", type="segmentation") class PascalVOCDataset(BaseImageSegmentationDataset): """Dataset class for the PASCAL VOC 2012 dataset The structure of PASCAL VOC dataset should be like this: :: pascal_voc/VOCdevkit/VOC2012/Annotations pascal_voc/VOCdevkit/VOC2012/JPEGImages pascal_voc/VOCdevkit/VOC2012/SegmentationClass pascal_voc/VOCdevkit/VOC2012/SegmentationClassAug_Visualization pascal_voc/VOCdevkit/VOC2012/ImageSets pascal_voc/VOCdevkit/VOC2012/list pascal_voc/VOCdevkit/VOC2012/SegmentationClassAug pascal_voc/VOCdevkit/VOC2012/SegmentationObject Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) use_coco_data = getattr(opts, "dataset.pascal.use_coco_data") coco_root_dir = getattr(opts, "dataset.pascal.coco_root_dir") root = self.root voc_root_dir = os.path.join(root, "VOC2012") voc_list_dir = os.path.join(voc_root_dir, "list") coco_data_file = None if self.is_training: # use the PASCAL VOC 2012 train data with augmented data data_file = os.path.join(voc_list_dir, "train_aug.txt") if use_coco_data and coco_root_dir is not None: coco_data_file = os.path.join(coco_root_dir, "train_2017.txt") assert os.path.isfile( coco_data_file ), "COCO data file does not exist at: {}".format(coco_root_dir) else: data_file = os.path.join(voc_list_dir, "val.txt") self.images = [] self.masks = [] with open(data_file, "r") as lines: for line in lines: line_split = line.split(" ") rgb_img_loc = voc_root_dir + os.sep + line_split[0].strip() mask_img_loc = voc_root_dir + os.sep + line_split[1].strip() assert os.path.isfile( rgb_img_loc ), "RGB file does not exist at: {}".format(rgb_img_loc) assert os.path.isfile( mask_img_loc ), "Mask image does not exist at: {}".format(rgb_img_loc) self.images.append(rgb_img_loc) self.masks.append(mask_img_loc) # if COCO data (mapped in PASCAL VOC format) needs to be used during training if self.is_training and coco_data_file is not None: with open(coco_data_file, "r") as lines: for line in lines: line_split = line.split(" ") rgb_img_loc = coco_root_dir + os.sep + line_split[0].rstrip() mask_img_loc = coco_root_dir + os.sep + line_split[1].rstrip() assert os.path.isfile(rgb_img_loc) assert os.path.isfile(mask_img_loc) self.images.append(rgb_img_loc) self.masks.append(mask_img_loc) self.use_coco_data = use_coco_data self.ignore_label = 255 self.background_idx = 0 self.check_dataset() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != PascalVOCDataset: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--dataset.pascal.use-coco-data", action="store_true", default=False, help="Use MS-COCO data for training with PASCAL VOC dataset. Defaults to False.", ) group.add_argument( "--dataset.pascal.coco-root-dir", type=str, default=None, help="Location of MS-COCO data. Defaults to None.", ) return parser @staticmethod def color_palette() -> List[int]: """Class index to RGB color mapping. The list index corresponds to class id. Note that the color list is flattened.""" color_codes = [ [0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0], [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128], [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0], [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128], [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0], [0, 64, 128], ] color_codes = np.asarray(color_codes).flatten() return list(color_codes) @staticmethod def class_names() -> List[str]: """Class index to class name mapping. Class index corresponds to list index""" return [ "background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "potted_plant", "sheep", "sofa", "train", "tv_monitor", ] ================================================ FILE: corenet/data/datasets/utils/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/data/datasets/utils/common.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import collections import os import random from typing import Any, List, Optional, Tuple, Union IMG_EXTENSIONS = ( ".jpg", ".jpeg", ".png", ".ppm", ".bmp", ".pgm", ".tif", ".tiff", ".webp", ) def file_has_valid_image_extension(filename: str) -> bool: return file_has_allowed_extension(filename, IMG_EXTENSIONS) def file_has_allowed_extension( filename: str, extensions: Union[str, Tuple[str, ...]] ) -> bool: """Checks if a file has an allowed extension. Args: filename: Path to a file. extensions: A string or a tuple of strings specifying the file extensions. Returns: True if the filename ends with one of given extensions, else False """ return filename.lower().endswith(extensions) def get_image_paths(directory: str) -> List[str]: """Returns a list of paths to all image files in the input directory and its subdirectories.""" image_paths = [] for root, _, fnames in sorted(os.walk(directory, topdown=False)): for fname in sorted(fnames): path = os.path.join(root, fname) if file_has_valid_image_extension(path): image_paths.append(path) return image_paths def select_random_subset( random_seed: int, num_total_samples: int, num_samples_to_select: Optional[int] = None, percentage_of_samples_to_select: Optional[float] = None, ) -> List[int]: """ Randomly selects a subset of samples. Only one of `num_samples_to_select` and `percentage_of_samples_to_select` should be provided. Selects all the samples if neither of them are provided. Args: random_seed: An integer seed to use for random selection. num_total_samples: Total number of samples in the set that is being subsampled. num_samples_to_select: An optional integer indicating the number of samples to select. percentage_of_samples_to_select: An optional float in the range (0,100] indicating the percentage of samples to select. Returns: A list of (integer) indices of the selected samples. Raises: ValueError if both `num_samples_to_select` and `percentage_of_samples_to_select` are provided. """ if ( num_samples_to_select is not None and percentage_of_samples_to_select is not None ): raise ValueError( "Only one of `num_samples_to_select` and `percentage_of_samples_to_select` should be provided." ) if num_samples_to_select is not None and num_samples_to_select < 1: raise ValueError("`num_samples_to_select` should be greater than 0.") if percentage_of_samples_to_select is not None: if not 0 < percentage_of_samples_to_select <= 100: raise ValueError( "`percentage_of_samples_to_select` should be in the range (0, 100]." ) sample_indices = list(range(num_total_samples)) rng = random.Random(random_seed) rng.shuffle(sample_indices) if num_samples_to_select is None and percentage_of_samples_to_select is None: return sample_indices if num_samples_to_select is None: num_samples_to_select = int( percentage_of_samples_to_select * num_total_samples / 100 ) num_samples_to_select = min(num_samples_to_select, num_total_samples) return sample_indices[:num_samples_to_select] def select_samples_by_category( sample_category_labels: List[Any], random_seed: int, num_samples_per_category: Optional[int] = None, percentage_of_samples_per_category: Optional[float] = None, ) -> List[int]: """ Randomly selects a specified number/percentage of samples from each category. Only one of `num_samples_per_category` and `percentage_of_samples_per_category` should be provided. Selects all the samples if neither of them are provided. Args: sample_category_labels: A list of category labels. random_seed: An integer seed to use for random selection. num_samples_per_category: An optional integer indicating the number of samples to select from each category. percentage_of_samples_per_category: An optional float in the range (0, 100] indicating the percentage of samples to select from each category. Returns: A list of (integer) indices of the selected samples. Raises: ValueError if both `num_samples_per_category` and `percentage_of_samples_per_category` are provided. """ if ( num_samples_per_category is not None and percentage_of_samples_per_category is not None ): raise ValueError( "Only one of `num_samples_per_category` and `percentage_of_samples_per_category` should be provided." ) if num_samples_per_category is None and percentage_of_samples_per_category is None: return list(range(len(sample_category_labels))) if num_samples_per_category is not None and num_samples_per_category < 1: raise ValueError("`num_samples_per_category` should be greater than 0.") if percentage_of_samples_per_category is not None: if not 0 < percentage_of_samples_per_category <= 100: raise ValueError( "`percentage_of_samples_per_category` should be in the range (0, 100]." ) category_specific_samples = collections.defaultdict(list) for ind, label in enumerate(sample_category_labels): category_specific_samples[label].append(ind) rng = random.Random(random_seed) selected_sample_indices = [] for label, sample_indices in category_specific_samples.items(): rng.shuffle(sample_indices) if num_samples_per_category: num_samples = num_samples_per_category else: num_samples = int( percentage_of_samples_per_category * len(sample_indices) / 100 ) num_samples = min(num_samples, len(sample_indices)) selected_sample_indices += sample_indices[:num_samples] return selected_sample_indices ================================================ FILE: corenet/data/datasets/utils/text.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import re import urllib import ftfy def caption_preprocessing(caption: str) -> str: """Removes the unwanted tokens (e.g., HTML tokens, next line, unwanted spaces) from the text.""" # captions may contain HTML tokens. Remove them html_re = re.compile("<.*?>") caption = urllib.parse.unquote(str(caption)) caption = caption.replace("+", " ") caption = re.sub(html_re, "", str(caption)) # remove the next line caption = caption.strip("\n") # remove unwanted spaces caption = re.sub(" +", " ", caption) caption = ftfy.fix_text(caption) return caption.strip().lower() ================================================ FILE: corenet/data/datasets/utils/video.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """Contains helper functions for reading from video detection datasets. NOTE: Annotations are stored via a @rectangles_dict of the form: Dict: key -> identity: Annotation list of Dicts for different timestamps: timestamp (float): The timestamp representing the seconds since the video began, ex. 1.2 is 1.2 seconds into the video. x0 (float): Normalized pixel space coordinate of top left of bounding box. y0 (float): Normalized pixel space coordinate of top left of bounding box. x1 (float): Normalized pixel space coordinate of bottom right of bounding box. y1 (float): Normalized pixel space coordinate of bottom right of bounding box. (int): Label of the class. The key to this field depends on the dataset. is_visible (bool): []Optional] Whether bounding box is visible. See `tests/data/datasets/utils/video_test.py` for an example of this dictionary. """ import functools from typing import Any, Collection, Dict, List, Literal, Optional, Tuple, Union import numpy as np from corenet.utils import logger EPS = 1e-6 def _simultaneous( this_timestamp: float, other_timestamp: float, time_eps: float = EPS, ) -> bool: return abs(this_timestamp - other_timestamp) < time_eps def _before(this_timestamp: float, other_timestamp: float) -> bool: return ( not _simultaneous(this_timestamp, other_timestamp) and this_timestamp < other_timestamp ) def fetch_labels_from_timestamps( class_label_name: str, timestamps: List[float], rectangles_dict: Dict[str, List[Dict[str, Any]]], interpolation_cutoff_threshold_sec: Optional[float] = None, progressible_labels: Optional[Collection[int]] = None, carry_over_keys: Optional[Union[List[str], Literal[True]]] = None, required_keys: Optional[List[str]] = None, ) -> Dict[str, List[Dict[str, Any]]]: """Returns object labels for the specified video frame timestamps. The result will retain the structure of `rectangles_dict`, but just ensure that the timestamp values are as requested. If `progressible_labels` are supplied, the `"progress"` field will be included. This field represents the 'normalized' amount of time that the class label has existed temporally. See tests/data/datasets/utils/test_video.py:test_fetch_frame_with_progress for examples. This fetching function can be used for (per-frame) video classification pipelines. Args: class_label_name: The field name in `rectangles_dict` that maps to the class label. timestamps: A list of timestamps to fectch label from. rectangles_dict: (See docstring at top of file.) interpolation_cutoff_threshold_sec: Threshold under which we allow interpolation. In some `rectangles_dict`s, the labels (within the same track) are so far apart (e.g. 10 seconds) that interpolation is non-sensical. Thus this value prevents unrelated labels from being interpolated. progressible_labels: Set of labels for which to calculate `"progress"` for the resulting bounding boxes. If None, no `"progress"` field will be included. carry_over_keys: A list of keywords that specifies which keys should be carried over from the previous rectangle during interpolation. Defaults to None. True means to carry over all keys. required_keys: A list of keywords that specifies which keywords need to be included in a new bounding_box in addition to the @class_label_name. Defaults to None. Returns: Dict containing the labels, still indexable by track id. """ if progressible_labels is not None and len(progressible_labels) > 1: raise NotImplementedError( "Currently only the calculation of one progressible label is supported;" f" got labels={progressible_labels}." ) labels = [] for timestamp in timestamps: labels.append( _fetch_frame_label( class_label_name, timestamp, rectangles_dict, interpolation_cutoff_threshold_sec, progressible_labels, carry_over_keys, required_keys, ) ) # Reslice @labels to be a dict of lists. ret = {} for label in labels: # @label is a dict with a key and dict of values. for k, v in label.items(): if k not in ret: ret[k] = [] ret[k].append(v) return ret def _make_fake_bbox( rectangles_dict: Dict[str, List[Dict[str, Any]]], timestamp: float, progressible_labels: Optional[Collection[int]] = None, required_keys: Optional[List[str]] = None, ) -> Dict[str, Any]: """Creates a fake bounding box annotation. Args: rectangles_dict: dictionary of annotations. timestamp: timestamp for make bounding box. progressive_labels: whether to add progressive labels or not. required_keys: A list of keywords that specifies which keywords need to be included in a new bounding_box in addition to the class_label_name. Defaults to None. Returns: bounding box annotation at @timestamp that is not visible with all other values set to None. """ keys = rectangles_dict[list(rectangles_dict.keys())[0]][0].keys() res = {key: None for key in keys} res["is_visible"] = False res["timestamp"] = timestamp if required_keys is not None: for key in required_keys: res[key] = None if progressible_labels is not None and len(progressible_labels) > 0: res["progress"] = None return res def _fetch_frame_label( class_label_name: str, timestamp: float, rectangles_dict: Dict[str, List[Dict[str, Any]]], interpolation_cutoff_threshold_sec: Optional[float] = None, progressible_labels: Optional[Collection[int]] = None, carry_over_keys: Optional[Union[List[str], Literal[True]]] = None, required_keys: Optional[List[str]] = None, ) -> Dict[str, Dict[str, Any]]: """Returns object labels for the specified video frame timestamp. The result will retain the structure of `rectangles_dict`, but just ensure that the timestamp value is as requested. If `progressible_labels` are supplied, the `"progress"` field will be included. This field represents the 'normalized' amount of time that the class label has existed temporally. See tests/data/datasets/utils/test_video.py:test_fetch_frame_with_progress for examples. This fetching function can be used for (per-frame) video classification pipelines. Args: class_label_name: The field name in `rectangles_dict` that maps to the class label. timestamps: A list of timestamps to fectch label from. rectangles_dict: (See docstring at top of file.) interpolation_cutoff_threshold_sec: Threshold under which we allow interpolation. In some `rectangles_dict`s, the labels (within the same track) are so far apart (e.g. 10 seconds) that interpolation is non-sensical. Thus this value prevents unrelated labels from being interpolated. progressible_labels: Set of label values for which to calculate `"progress"` for the resulting bounding boxes. If None, no `"progress"` field will be included. carry_over_keys: A list of keywords that specifies which keys should be carried over from the previous rectangle during interpolation. Defaults to None. True means to carry over all keys. required_keys: A list of keywords that specifies which keywords need to be included in a new bounding_box in addition to the class_label_name. Defaults to None. Returns: Dict containing the labels, still indexable by track id. """ ret = {} for track_label, track_rectangles in rectangles_dict.items(): all_times = [a["timestamp"] for a in track_rectangles] if not (all_times) == sorted(all_times): raise RuntimeError("all_times should be sorted.") if _before(timestamp, all_times[0]) or _before(all_times[-1], timestamp): # The track doesn't exist or has ceased to exist. ret[track_label] = _make_fake_bbox( rectangles_dict, timestamp, progressible_labels, required_keys ) continue idx = np.searchsorted(np.array(all_times), timestamp, side="right") # idx may be at the start/end if the timestamp is within EPS before_idx = max(idx - 1, 0) after_idx = min(idx, len(all_times) - 1) before_time = all_times[before_idx] after_time = all_times[after_idx] # Either box for interpolation is invisible. if ( not track_rectangles[before_idx]["is_visible"] or not track_rectangles[after_idx]["is_visible"] ): # We make a fake annotation for invisible boxes. ret[track_label] = _make_fake_bbox( rectangles_dict, timestamp, progressible_labels, required_keys ) continue # Boxes for interpolation are too far away. if ( interpolation_cutoff_threshold_sec is not None and after_time - before_time > interpolation_cutoff_threshold_sec ): ret[track_label] = _make_fake_bbox( rectangles_dict, timestamp, progressible_labels, required_keys ) continue # pylint: disable=unbalanced-tuple-unpacking x0, x1, y0, y1 = _interpolate_bounding_box( track_rectangles[before_idx], track_rectangles[after_idx], timestamp - before_time, after_time - before_time, ) if carry_over_keys is None: new_label = {} elif carry_over_keys is True: # Copy the whole thing - bbox coords/timestamp are overridden below new_label = {**track_rectangles[before_idx]} else: new_label = { key: track_rectangles[before_idx][key] for key in carry_over_keys if key in track_rectangles[before_idx] } if required_keys is not None: for key in required_keys: new_label[key] = track_rectangles[before_idx].get(key, None) # New label will have updated coordinates and timestamp. new_label["x0"] = x0 new_label["x1"] = x1 new_label["y0"] = y0 new_label["y1"] = y1 new_label["timestamp"] = timestamp if progressible_labels is not None: progress = None if track_rectangles[before_idx][class_label_name] in progressible_labels: search_fn = functools.partial( _search_for_label_edge_timestamp, class_label_name, track_rectangles, before_idx, interpolation_cutoff_threshold_sec=interpolation_cutoff_threshold_sec, ) start_timestamp = search_fn(-1) end_timestamp = search_fn(+1) progress = (timestamp - start_timestamp) / ( end_timestamp - start_timestamp ) new_label["progress"] = progress _assert_progress_repr(class_label_name, progressible_labels, new_label) ret[track_label] = new_label return ret def _assert_progress_repr( class_label_name: str, progressible_labels: Optional[Collection[int]], new_label: Dict[str, Any], ) -> None: if progressible_labels is None: assert "progress" not in new_label else: assert "progress" in new_label if new_label[class_label_name] in progressible_labels: # We shouldn't ever return a 'progressible label' while not returning the # `"progress"` field. assert 0.0 <= new_label["progress"] <= 1.0 else: # We shouldn't ever return the `"progress"` field while not returning a # 'progressible label'. assert new_label["progress"] == None def _search_for_label_edge_timestamp( class_label_name: str, track_rectangles: List[Dict[str, Any]], cur_idx: int, step: int, interpolation_cutoff_threshold_sec: Optional[float] = None, ) -> float: """Find the timestamp of the furthest invisible annotation that has the same label with `class_label_name`. Args: class_label_name: The string name of the target class's annotation to search. track_rectangles: The annotation of an identity across time. cur_idx: The index of the annotation in `track_rectangles` to start searching. step: The step to search for the timestamp. A positive step indicates the timstamp should be after `cur_idx`'s; while a negative step indicates the timestamp should be before `cur_idx`'s. interpolation_cutoff_threshold_sec: The threshold of timestamp difference where the label value changes. Returns: The edge timestamp. """ label = track_rectangles[cur_idx][class_label_name] def in_bounds(idx: int) -> bool: return 0 <= idx < len(track_rectangles) while True: cur_idx += step if not in_bounds(cur_idx): # If the original video clips were split into smaller clips before running # this pipeline (which occurs with some datasets), then there is a chance # that this annotation was split into two separate clips. However, since the # label is at the edge of the clip, we don't know if it was split, or if the # label just coinciedentally starts/ends at this edge of the video. logger.warning( "Annotation is potentially split across video clips. This " "makes the 'progress' calculation inherently unreliable." ) break cur_rectangle = track_rectangles[cur_idx] if cur_rectangle[class_label_name] != label or not cur_rectangle["is_visible"]: break outside_idx = cur_idx # First encountered outside label idx. inside_idx = cur_idx - step # Last known 'inside' label idx. inside_timestamp = track_rectangles[inside_idx]["timestamp"] if in_bounds(outside_idx): # Since we know that the label at `outside_idx` is valid, but different than the # relevant action, we can interpolate halfway between (of course, only if the # labels are within the threshold). outside_timestamp = track_rectangles[outside_idx]["timestamp"] if step > 0 and ( interpolation_cutoff_threshold_sec is None or ( abs(inside_timestamp - outside_timestamp) < interpolation_cutoff_threshold_sec ) ): # In this case, `outside_idx` is at the first timestamp which has a # differing label. Since we use the "floor" convention for computing the # label, `outside_timestamp` is our upper bound. return outside_timestamp return inside_timestamp def _interpolate_bounding_box( before: Dict[str, Any], after: Dict[str, Any], delta: float, range_delta: float, ) -> Tuple[float, float, float, float]: """Given two adjacent bounding box annotations, return an interpolated label. Note that @delta and @range_delta must be positive, and @delta must be between 0 and `range_delta`, inclusively. Args: before: Bounding box label with lesser timestamp. after: Bounding box label with greater timestamp. delta: Time after `before` to compute label. range_delta: Time separating `before` and `after`. Returns: Bounding box label that is linearly interpolated between `before` and `after`. """ if range_delta < 0: raise ValueError( f"@range_delta must be positive. Got range_delta={range_delta}." ) if range_delta < 1e-5: return [before[key] for key in ["x0", "x1", "y0", "y1"]] if delta < 0 or delta - range_delta > EPS: # Some floating point arithmetic causes delta-range_delta to be a small value # above zero even if they're equal. Hence the epsilon. raise ValueError( f"@delta must be between 0 and @range_delta, inclusively. Got delta={delta}," f"range_delta={range_delta}." ) ret = [] for key in ["x0", "x1", "y0", "y1"]: alpha = 1.0 - delta / range_delta ret.append(before[key] * alpha + after[key] * (1.0 - alpha)) return ret ================================================ FILE: corenet/data/io/__init__.py ================================================ ================================================ FILE: corenet/data/io/transfer_clients.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os import random import time from argparse import ArgumentParser from functools import cached_property from pathlib import Path from typing import List, Optional, Union from urllib.parse import urlparse import boto3 import requests from boto3.s3.transfer import S3Transfer, TransferConfig from joblib import Parallel, delayed from corenet.constants import if_test_env from corenet.utils import logger, resources from corenet.utils.common_utils import construct_local_path_from_remote from corenet.utils.ddp_utils import dist_barrier, is_master, is_start_rank_node from corenet.utils.registry import Registry from corenet.utils.retry_utils import run_with_retries class BaseClient(object): """Base class for transfer clients. Args: opts: Command-line arguments. max_retries: Maximum download retries. Defaults to 5. force_delete: Force the file to be deleted if it is present locally. The local path is a concatenation of 'dst_location' and basename of 'remote_file' only_download_on_start_rank: Download the files on the start rank of each node. synchronize_distributed_ranks: Synchronize DDP ranks after downloading. parallel_download: If enabled, files are downloaded in parallel in 'download_multiple_files' function. max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus. ...note: During regular training, setting 'force_delete' to 'None' is equivalent to specifying 'force_delete=True.' However, when running tests with pytest, 'None' is interpreted as 'False' to optimize test execution speed. """ def __init__( self, opts: argparse.Namespace, max_retries: int = 5, force_delete: Optional[bool] = None, only_download_on_start_rank: bool = True, synchronize_distributed_ranks: bool = True, parallel_download: bool = False, max_download_workers: int = 1, *args, **kwargs, ) -> None: n_cpus = resources.cpu_count() if max_download_workers < 1 or max_download_workers > n_cpus: raise RuntimeError( "Maximum number of download workers should be between 1 and number of" f" available CPUs. Got: {max_download_workers}." ) self.opts = opts self.max_retries = max_retries self.force_delete = force_delete self.download_on_start_rank = only_download_on_start_rank self.synchronize_distributed_ranks = synchronize_distributed_ranks self.parallel_download = parallel_download self.is_master_node = is_master(opts) self.n_download_workers = max_download_workers @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add client-specific arguments.""" if cls != BaseClient: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser return parser @cached_property def start_rank_node(self) -> bool: """Check whether this process runs on the starting rank of its node.""" opts = self.opts return is_start_rank_node(opts) @cached_property def sync_distributed_ranks(self) -> bool: """Synchronize the ranks during distributed training.""" opts = self.opts sync_ranks = self.synchronize_distributed_ranks # 'ddp.use_distributed' is a private argument, therefore, default value is set. return getattr(opts, "ddp.use_distributed", False) and sync_ranks def _download_fn(self, remote_path: str, local_path: str) -> None: """Attempts downloading 'remote_path' to 'local_path' without retries. Args: remote_path: Remote file path. local_path: Local path where file should be downloaded. """ raise NotImplementedError( f"Child classes of {self.__class__.__name__} must implement downloading logic." ) def _download_with_retries(self, remote_path: str, local_path: str) -> None: """Download 'remote_path' to 'local_path' with retries.""" run_with_retries( self._download_fn, max_retries=self.max_retries, args=(remote_path, local_path), function_name=f"download {remote_path} using {type(self).__name__}", ) def _download_single_file(self, remote_path: str, dst_dir: str) -> str: """Download single remote file locally. Args: remote_path: Path of the remote file. dst_dir: Local storage directory. Returns: Local file path. """ force_delete = self.force_delete if force_delete is None: # An alternative approach is to move this logic to the argument's default value in the function signature: # def get_local_path(..., force_delete = if_test_env(False, otherwise=True), ...): # But that won't always work because pytest may set PYTEST_CURRENT_TEST env set loading this module. force_delete = if_test_env(False, otherwise=True) local_path = construct_local_path_from_remote( remote_path=remote_path, local_dir=dst_dir ) if os.path.isfile(local_path) and force_delete: # If file exists, remove it and then download again if self.download_on_start_rank: # Remove the file from start rank and let other ranks in DDP keep waiting till file is deleted if is_start_rank_node(self.opts): os.remove(local_path) else: while not os.path.isfile(local_path): time.sleep(if_test_env(0, otherwise=1)) continue else: # All ranks in DDP deletes the file os.remove(local_path) if not os.path.isfile(local_path): if self.download_on_start_rank: # Download the file using start rank and let other ranks in DDP keep waiting till file is downloaded if self.start_rank_node: self._download_with_retries(remote_path, local_path) else: while not os.path.isfile(local_path): time.sleep(if_test_env(0, otherwise=1)) continue else: # All ranks in DDP downloads the file self._download_with_retries(remote_path, local_path) if self.sync_distributed_ranks: # synchronize between ranks dist_barrier() return local_path def _download_multiple_files( self, remote_file_paths: List[str], dst_dir: str ) -> List[str]: """Download multiple remote files locally either sequentially or simultaneously. Args: remote_file_paths: List of remote file paths. dst_dir: Local storage directory. Returns: List of local file paths. """ total_files = len(remote_file_paths) if total_files < 1: raise RuntimeError("Need at least one file for downloading.") if self.parallel_download and total_files > 1: n_workers = min(self.n_download_workers, total_files) local_paths = Parallel(n_jobs=n_workers)( delayed(self._download_single_file)(remote_file_path, dst_dir) for remote_file_path in remote_file_paths ) else: local_paths = [ self._download_single_file( remote_path=remote_file_path, dst_dir=dst_dir ) for remote_file_path in remote_file_paths ] return local_paths def download( self, remote_file_paths: Union[str, List[str]], dst_dir: str ) -> Union[str, List[str]]: """Download remote files locally. Args: remote_file_paths: Single (or list) remote file path(s). dst_dir: Local storage directory. Returns: Single (or list) local file path(s). """ Path(dst_dir).mkdir(exist_ok=True, parents=True) if isinstance(remote_file_paths, List): return self._download_multiple_files(remote_file_paths, dst_dir) elif isinstance(remote_file_paths, str): return self._download_single_file(remote_file_paths, dst_dir) else: raise NotImplementedError( f"Supported file paths for downloading are string or List[str]. Got: {type(remote_file_paths)}." ) TRANSFER_CLIENT_REGISTRY = Registry( registry_name="transfer_client_registry", base_class=BaseClient, lazy_load_dirs=["corenet/data/io"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) @TRANSFER_CLIENT_REGISTRY.register(name="s3") class S3Client(BaseClient): """Client to download files from S3.""" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: endpoint_url = getattr(opts, "common.s3.endpoint_url") aws_access_key_id = getattr(opts, "common.s3.aws_access_key_id") aws_secret_access_key = getattr(opts, "common.s3.aws_secret_access_key") aws_session_token = getattr(opts, "common.s3.aws_session_token") super().__init__(opts, *args, **kwargs) self.boto_transfer_client = self.init_client( endpoint_url=endpoint_url, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, aws_session_token=aws_session_token, ) def transfer_config(self) -> TransferConfig: multipart_chunksize = getattr(self.opts, "common.s3.multipart_chunksize") transfer_config = TransferConfig( multipart_chunksize=multipart_chunksize, num_download_attempts=self.max_retries, ) return transfer_config def init_client( self, endpoint_url: Optional[str] = None, aws_access_key_id: Optional[str] = None, aws_secret_access_key: Optional[str] = None, aws_session_token: Optional[str] = None, ) -> S3Transfer: """Initialize S3Transfer client. Args: endpoint_url: Endpoint URL. If none, botocore will automatically construct the appropriate URL to use when communicating with a service. aws_access_key_id: The access key to use when creating the client. If None, the credentials configured for the session will automatically be used. aws_secret_access_key: The secret key to use when creating the client. Same semantics as 'aws_access_key_id'. aws_session_token: The session token to use when creating the client. Same semantics as 'aws_access_key_id'. Returns: An instance of 'S3Transfer'. """ transfer_config = self.transfer_config() self.boto_client = boto3.client( service_name="s3", endpoint_url=endpoint_url, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, aws_session_token=aws_session_token, ) boto_transfer_client = S3Transfer(self.boto_client, transfer_config) return boto_transfer_client @classmethod def add_arguments(cls, parser: ArgumentParser) -> ArgumentParser: """S3 client specific arguments. ...note: More details can be found in boto3, an AWS SDK for Python. """ if cls != S3Client: return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--common.s3.endpoint-url", type=str, default=None, help="Endpoint URL for S3 client. Defaults to None.", ) group.add_argument( "--common.s3.aws-access-key-id", type=str, default=None, help="AWS Access key id. Defaults to None.", ) group.add_argument( "--common.s3.aws-secret-access-key", type=str, default=None, help="AWS secret access key. Defaults to None.", ) group.add_argument( "--common.s3.aws-session-token", type=str, default=None, help="AWS session token. Defaults to None.", ) group.add_argument( "--common.s3.multipart-chunksize", type=str, default=64 * 1024 * 1024, help="The partition size of each part for a multipart transfer. Defaults to 64 MB.", ) return parser def _download_fn(self, remote_path: str, local_path: str) -> None: parsed_url = urlparse(remote_path) self.boto_transfer_client.download_file( bucket=parsed_url.netloc, key=parsed_url.path.lstrip("/"), filename=local_path, ) @TRANSFER_CLIENT_REGISTRY.register(name="http") class HTTPClient(BaseClient): """Client to download files from HTTP.""" def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @cached_property def proxies(self): return { "https": os.environ.get("HTTPS_PROXY", None), "http": os.environ.get("HTTP_PROXY", None), } def _download_fn(self, remote_path: str, local_path: str) -> None: response = requests.get(remote_path, stream=True) if response.status_code == 403: # Try with the HTTP/HTTPS proxy from ENV response = requests.get(remote_path, stream=True, proxies=self.proxies) if response.status_code == 200: with open(local_path, "wb") as f: f.write(response.raw.read()) else: raise IOError(f"Download failed with status code {response.status_code}.") @TRANSFER_CLIENT_REGISTRY.register(name="https") class HTTPSClient(HTTPClient): """Client to download files from HTTPS.""" def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) def get_transfer_client( opts: argparse.Namespace, transfer_client_name: str, max_retries: int = 5, force_delete: Optional[bool] = None, only_download_on_start_rank: bool = True, synchronize_distributed_ranks: bool = True, parallel_download: bool = False, max_download_workers: int = 1, raise_error_if_transfer_client_not_present: bool = True, ) -> Optional[BaseClient]: """ Helper function to get transfer client. Args: opts: Command-line arguments. transfer_client_name: Name of the transfer client. max_retries: Maximum download retries. Defaults to 5. force_delete: Force the file to be deleted if it is present in the `cache_loc`. only_download_on_start_rank: Download the files on the start rank of each node. synchronize_distributed_ranks: Synchronize DDP ranks after downloading. parallel_download: If enabled, files are downloaded in parallel. max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus. raise_error_if_transfer_client_not_present: Raise an error if client is not present. Returns: The transfer client requested will be returned if it's available. Otherwise, an error will be raised if the 'raise_error_if_transfer_client_not_present' flag is set to True, or None will be returned. ...note: In certain places, we may want to control the error handling different (e.g., 'get_local_path' is a no-op when path is a local). To enable such case, use 'raise_error_if_transfer_client_not_present' flag. """ if transfer_client_name in TRANSFER_CLIENT_REGISTRY.keys(): client_cls = TRANSFER_CLIENT_REGISTRY[transfer_client_name] client = client_cls( opts, max_retries=max_retries, force_delete=force_delete, only_download_on_start_rank=only_download_on_start_rank, synchronize_distributed_ranks=synchronize_distributed_ranks, parallel_download=parallel_download, max_download_workers=max_download_workers, ) return client elif raise_error_if_transfer_client_not_present: raise RuntimeError( f"Requested transfer client, i.e. {transfer_client_name}, is not available. \ Available clients are {list(TRANSFER_CLIENT_REGISTRY.keys())}" ) else: return None def transfer_client_arguments( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: """Transfer client arguments.""" return TRANSFER_CLIENT_REGISTRY.all_arguments(parser) ================================================ FILE: corenet/data/loader/__init__.py ================================================ ================================================ FILE: corenet/data/loader/dataloader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys from typing import Callable, Dict, List, Optional, Union import torch from torch.utils.data import DataLoader from corenet.data.datasets.dataset_base import BaseDataset, BaseIterableDataset from corenet.data.sampler import Sampler class CoreNetDataLoader(DataLoader): """Data loader class that combines a dataset and a sampler, and provides an iterable over the given dataset. Args: dataset: Dataset from which to load the data. batch_size: How many samples per batch to load. batch_sampler: Defines the strategy to returns a batch of indices at a time. num_workers: Number of subprocesses to use for data loading. Defaults to 1. pin_memory: If ``True``, the data loader will copy Tensors into device/CUDA pinned memory before returning them. persistent_workers: If ``True``, the data loader will not shutdown the worker processes after a dataset has been consumed once. This allows to maintain the workers `Dataset` instances alive. Defaults to False. collate_fn: Merges a list of samples to form a mini-batch of Tensor(s). Typically used when using batched loading from a map-style dataset. prefetch_factor: Number of batches loaded in advance by each worker. The value of ``2`` means there will be a total of 2 * num_workers batches prefetched across all workers. Default value depends on the value for num_workers. If num_workers=0, then the default value of prefetch_factor is ``None``. Otherwise, it is ``2`` for num_workers>0. """ def __init__( self, dataset: Union[BaseDataset, BaseIterableDataset], batch_size: int, batch_sampler: Sampler, num_workers: Optional[int] = 1, pin_memory: Optional[bool] = False, persistent_workers: Optional[bool] = False, collate_fn: Optional[ Callable[[List[Union[Dict, torch.Tensor]]], Union[Dict, torch.Tensor]] ] = None, prefetch_factor: Optional[int] = None, *args, **kwargs ): if num_workers == 0 and prefetch_factor is not None: # prefecting can only be done during multiprocessing, so disabling it. prefetch_factor = None if num_workers > 0 and prefetch_factor is None: # setting prefetch factor to 2 (same as PyTorch's default value for this condition.) prefetch_factor = 2 super(CoreNetDataLoader, self).__init__( dataset=dataset, batch_size=batch_size, batch_sampler=batch_sampler, num_workers=num_workers, pin_memory=pin_memory, persistent_workers=persistent_workers, collate_fn=collate_fn, prefetch_factor=prefetch_factor, *args, **kwargs ) def update_indices(self, new_indices: List, *args, **kwargs): """Update indices in the dataset class""" if hasattr(self.batch_sampler, "img_indices") and hasattr( self.batch_sampler, "update_indices" ): self.batch_sampler.update_indices(new_indices) def __len__(self) -> int: """Number of samples in the dataset. ...note: The length of Iterable datasets is set to 'sys.maxsize' because '__len__' could be inaccurate with naive multi-processing data loading for such datasets, as samples may be duplicated. Similar to PyTorch's recommendation, we also discourage the use of '__len__' for iterable datasets, and generally trust the corresponding iterable dataset class for correct implementation. """ return ( sys.maxsize if isinstance(self.dataset, BaseIterableDataset) else len(self.dataset) ) def get_sample_indices(self) -> List: """Sample IDs""" return self.batch_sampler.img_indices ================================================ FILE: corenet/data/sampler/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Callable, Dict, Mapping, Optional, Union from torch.utils.data.sampler import Sampler from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP from corenet.utils.registry import Registry SAMPLER_REGISTRY = Registry( registry_name="data_samplers", base_class=Sampler, # lazily import the samplers lazy_load_dirs=["corenet/data/sampler"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def build_sampler( opts: argparse.Namespace, n_data_samples: Union[int, Mapping[str, int]], is_training: bool = False, get_item_metadata: Optional[Callable[[int], Dict]] = None, *args, **kwargs ) -> Sampler: """Helper function to build data sampler from command-line arguments Args: opts: Command-line arguments n_data_samples: Number of data samples. It can be an integer specifying number of data samples for a given task or a mapping of task name and data samples per task in case of a chain sampler. get_item_metadata: A callable that provides sample metadata, given sample index. is_training: Training mode or not. Defaults to False. Returns: Data sampler over which we can iterate. """ sampler_name = getattr(opts, "sampler.name") is_distributed = getattr(opts, "ddp.use_distributed") if ( is_distributed and sampler_name.split("_")[-1] != "ddp" and sampler_name != "chain_sampler" ): # In case of a DDP environment, add `_ddp` to sampler name if not present # with an exception to chain_sampler (which is nothing but a loop over existing samplers) sampler_name = sampler_name + "_ddp" sampler = SAMPLER_REGISTRY[sampler_name]( opts, n_data_samples=n_data_samples, is_training=is_training, get_item_metadata=get_item_metadata, ) return sampler def add_sampler_arguments( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: """Add sampler arguments to parser from SAMPLER_REGISTRY, BaseSampler, and BaseSamplerDDP""" parser = SAMPLER_REGISTRY.all_arguments(parser) parser = BaseSampler.add_arguments(parser) parser = BaseSamplerDDP.add_arguments(parser) return parser ================================================ FILE: corenet/data/sampler/base_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import math import random from typing import Any, Iterator, List, Tuple import numpy as np import torch import torch.distributed as dist from torch.utils.data.sampler import Sampler class BaseSampler(Sampler): """Base class for standard and DataParallel Sampler. Every subclass should implement `__iter__` method, providing a way to iterate over indices of dataset elements. Args: opts: Command line arguments. n_data_samples: Number of samples in the dataset. is_training: Training mode or not. """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: # max between 1 and number of available GPUs. 1 because for supporting CPUs n_gpus: int = max(1, torch.cuda.device_count()) batch_size_gpu0: int = get_batch_size_from_opts(opts, is_training=is_training) n_samples_per_gpu = int(math.ceil(n_data_samples * 1.0 / n_gpus)) total_size = n_samples_per_gpu * n_gpus indexes = [idx for idx in range(n_data_samples)] # This ensures that we can divide the batches evenly across GPUs indexes += indexes[: (total_size - n_data_samples)] assert total_size == len(indexes) self.img_indices = indexes self.n_samples = total_size self.batch_size_gpu0 = batch_size_gpu0 self.n_gpus = n_gpus self.shuffle = True if is_training else False self.epoch = 0 self.num_repeats = 1 self.trunc_rep_aug = False self.start_shuffling_from_epoch = getattr( opts, "sampler.start_shuffling_from_epoch" ) if is_training: # enable these arguments for repeated data augmentation # https://openaccess.thecvf.com/content_CVPR_2020/papers/Hoffer_Augment_Your_Batch_Improving_Generalization_Through_Instance_Repetition_CVPR_2020_paper.pdf self.num_repeats = getattr(opts, "sampler.num_repeats") self.trunc_rep_aug = getattr(opts, "sampler.truncated_repeat_aug_sampler") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser # add sampler-specific arguments group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.name", type=str, default=None, help=( "Name of the sampler. Defaults to None (i.e., user needs to specify the sampler if using MAP-style datasets)." "Note that this argument is not applicable to iterable datasets." ), ) group.add_argument( "--sampler.num-repeats", type=int, default=1, help="Repeat the training dataset samples by this factor in each epoch (aka repeated augmentation). " "This effectively increases samples per epoch. As an example, if dataset has 10000 samples " "and sampler.num_repeats is set to 2, then total samples in each epoch would be 20000. " "Defaults to 1.", ) group.add_argument( "--sampler.truncated-repeat-aug-sampler", action="store_true", default=False, help="When enabled, it restricts the sampler to load a subset of the training dataset such that" "number of samples obtained after repetition are the same as the original dataset." "As an example, if dataset has 10000 samples, sampler.num_repeats is set to 2, and " "sampler.truncated_repeat_aug_sampler is enabled, then the sampler would sample " "10000 samples in each epoch. Defaults to False.", ) group.add_argument( "--sampler.start-shuffling-from-epoch", default=0, type=int, help="Shuffle data indices during training from this epoch onwards. Defaults to 0 (i.e., shuffle from the first epoch).", ) return parser def get_indices(self) -> List[int]: """Returns a list of indices of dataset elements to iterate over. ...note: If repeated augmentation is enabled, then indices will be repeated. """ img_indices = copy.deepcopy(self.img_indices) if self.shuffle: random.seed(self.epoch) if self.epoch >= self.start_shuffling_from_epoch: random.shuffle(img_indices) if self.num_repeats > 1: # Apply repeated augmentation """Assume that we have [0, 1, 2, 3] samples. With repeated augmentation, we first repeat the samples [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3] and then select 4 samples [0, 0, 0, 1]. Note that we do shuffle at the beginning, so samples are not the same at every iteration. """ n_samples_before_repeat = len(img_indices) img_indices = np.repeat(img_indices, repeats=self.num_repeats) img_indices = list(img_indices) if self.trunc_rep_aug: img_indices = img_indices[:n_samples_before_repeat] return img_indices def __iter__(self) -> Iterator[Tuple[Any, ...]]: raise NotImplementedError def __len__(self) -> int: return len(self.img_indices) * (1 if self.trunc_rep_aug else self.num_repeats) def set_epoch(self, epoch: int) -> None: """Helper function to set epoch in each sampler.""" self.epoch = epoch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: """Helper function to update scales in each sampler. This is typically useful in variable-batch sampler. Subclass is expected to implement this function. By default, we do not do anything """ def update_indices(self, new_indices: List[int]) -> None: """Update indices to new indices. This function might be useful for sample-efficient training.""" self.img_indices = new_indices def extra_repr(self) -> str: extra_repr_str = ( f"\n\t num_repeat={self.num_repeats}" f"\n\t trunc_rep_aug={self.trunc_rep_aug}" ) return extra_repr_str def __repr__(self) -> str: return "{}({}\n)".format(self.__class__.__name__, self.extra_repr()) class BaseSamplerDDP(Sampler): """Base class for DistributedDataParallel Sampler. Every subclass should implement `__iter__` method, providing a way to iterate over indices of dataset elements. Args: opts: Command line arguments. n_data_samples: Number of samples in the dataset. is_training: Training or validation mode. """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: batch_size_gpu0: int = get_batch_size_from_opts(opts, is_training=is_training) if not dist.is_available(): raise RuntimeError("Requires distributed package to be available") num_replicas = dist.get_world_size() rank = dist.get_rank() gpus_node_i = max(1, torch.cuda.device_count()) num_samples_per_replica = int(math.ceil(n_data_samples * 1.0 / num_replicas)) total_size = num_samples_per_replica * num_replicas img_indices = [idx for idx in range(n_data_samples)] img_indices += img_indices[: (total_size - n_data_samples)] assert len(img_indices) == total_size self.img_indices = img_indices self.n_samples_per_replica = num_samples_per_replica self.shuffle = True if is_training else False self.epoch = 0 self.rank = rank self.batch_size_gpu0 = batch_size_gpu0 self.num_replicas = num_replicas self.skip_sample_indices = [] self.node_id = rank // gpus_node_i self.num_nodes = max(1, num_replicas // gpus_node_i) self.local_rank = rank % gpus_node_i self.num_gpus_node_i = gpus_node_i self.sharding = False self.num_repeats = 1 self.trunc_rep_aug = False self.disable_shuffle_sharding = False if is_training: self.sharding = getattr(opts, "sampler.use_shards") self.num_repeats = getattr(opts, "sampler.num_repeats") self.trunc_rep_aug = getattr(opts, "sampler.truncated_repeat_aug_sampler") self.disable_shuffle_sharding = getattr( opts, "sampler.disable_shuffle_sharding" ) sample_multiplier = 1 if self.trunc_rep_aug else self.num_repeats self.n_samples_per_replica = num_samples_per_replica * sample_multiplier self.start_shuffling_from_epoch = getattr( opts, "sampler.start_shuffling_from_epoch" ) def get_indices_rank_i(self) -> List[int]: """Returns a list of indices of dataset elements for each rank to iterate over. ...note: 1. If repeated augmentation is enabled, then indices will be repeated. 2. If sharding is enabled, then each rank will process a subset of the dataset. """ img_indices = copy.deepcopy(self.img_indices) if self.shuffle: random.seed(self.epoch) if self.sharding: """If we have 8 samples, say [0, 1, 2, 3, 4, 5, 6, 7], and we have two nodes, then node 0 will receive first 4 samples and node 1 will receive last 4 samples. note: This strategy is useful when dataset is large and we want to process subset of dataset on each node. """ # compute number pf samples per node. # Each node may have multiple GPUs # Node id = rank // num_gpus_per_rank samples_per_node = int(math.ceil(len(img_indices) / self.num_nodes)) indices_node_i = img_indices[ self.node_id * samples_per_node : (self.node_id + 1) * samples_per_node ] # Ensure that each node has equal number of samples if len(indices_node_i) < samples_per_node: indices_node_i += indices_node_i[ : (samples_per_node - len(indices_node_i)) ] # Note: For extremely large datasets, we may want to disable shuffling for efficient data loading if ( not self.disable_shuffle_sharding and self.epoch >= self.start_shuffling_from_epoch ): # shuffle the indices within a node. random.shuffle(indices_node_i) if self.num_repeats > 1: """Assume that we have [0, 1, 2, 3] samples in rank_i. With repeated augmentation, we first repeat the samples [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3] and then select 4 samples [0, 0, 0, 1]. Note shuffling at the beginning """ # Apply repeated augmentation n_samples_before_repeat = len(indices_node_i) indices_node_i = np.repeat(indices_node_i, repeats=self.num_repeats) indices_node_i = list(indices_node_i) if self.trunc_rep_aug: indices_node_i = indices_node_i[:n_samples_before_repeat] # divide the samples among each GPU in a node indices_rank_i = indices_node_i[ self.local_rank : len(indices_node_i) : self.num_gpus_node_i ] else: """If we have 8 samples, say [0, 1, 2, 3, 4, 5, 6, 7], and we have two nodes, then node 0 will receive [0, 2, 4, 6] and node 1 will receive [1, 3, 4, 7]. note: This strategy is useful when each data sample is stored independently, and is default in many frameworks """ if self.epoch >= self.start_shuffling_from_epoch: random.shuffle(img_indices) if self.num_repeats > 1: # Apply repeated augmentation n_samples_before_repeat = len(img_indices) img_indices = np.repeat(img_indices, repeats=self.num_repeats) img_indices = list(img_indices) if self.trunc_rep_aug: img_indices = img_indices[:n_samples_before_repeat] # divide the samples among each GPU in a node indices_rank_i = img_indices[ self.rank : len(img_indices) : self.num_replicas ] else: indices_rank_i = img_indices[ self.rank : len(self.img_indices) : self.num_replicas ] return indices_rank_i def __iter__(self) -> Iterator[Tuple[Any, ...]]: raise NotImplementedError def __len__(self) -> int: return (len(self.img_indices) // self.num_replicas) * ( 1 if self.trunc_rep_aug else self.num_repeats ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseSamplerDDP: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.use-shards", action="store_true", default=False, help="Use data sharding. Only applicable to DDP. Defaults to False.", ) group.add_argument( "--sampler.disable-shuffle-sharding", action="store_true", default=False, help="Disable shuffling while sharding for extremely large datasets. Defaults to False.", ) return parser def set_epoch(self, epoch: int) -> None: """Helper function to set epoch in each sampler.""" self.epoch = epoch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: """Helper function to update scales in each sampler. This is typically useful in variable-batch sampler Subclass is expected to implement this function. By default, we do not do anything """ def update_indices(self, new_indices: List[int]) -> None: """Update indices to new indices. This function might be useful for sample-efficient training.""" self.img_indices = new_indices def extra_repr(self) -> str: extra_repr_str = ( f"\n\t num_repeat={self.num_repeats}" f"\n\t trunc_rep_aug={self.trunc_rep_aug}" f"\n\t sharding={self.sharding}" f"\n\t disable_shuffle_sharding={self.disable_shuffle_sharding}" ) return extra_repr_str def __repr__(self): return "{}({}\n)".format(self.__class__.__name__, self.extra_repr()) def get_batch_size_from_opts( opts: argparse.Namespace, is_training: bool = False ) -> int: """Helper function to extract batch size for training or validation/test Args: opts: command line argument is_training: Training or validation mode. Default: False Returns: Returns an integer """ batch_size_gpu0 = int( getattr(opts, "dataset.train_batch_size0") if is_training else getattr(opts, "dataset.val_batch_size0") ) return batch_size_gpu0 ================================================ FILE: corenet/data/sampler/batch_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Iterator, Tuple from corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP @SAMPLER_REGISTRY.register(name="batch_sampler") class BatchSampler(BaseSampler): """Standard Batch Sampler for data parallel. This sampler yields batches of fixed batch size and spatial resolutions. Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) # spatial dimensions crop_size_w: int = getattr(opts, "sampler.bs.crop_size_width") crop_size_h: int = getattr(opts, "sampler.bs.crop_size_height") self.crop_size_w = crop_size_w self.crop_size_h = crop_size_h def __iter__(self) -> Iterator[Tuple[int, int, int]]: img_indices = self.get_indices() start_index = 0 batch_size = self.batch_size_gpu0 n_samples = len(img_indices) while start_index < n_samples: end_index = min(start_index + batch_size, n_samples) batch_ids = img_indices[start_index:end_index] start_index += batch_size if len(batch_ids) > 0: batch = [ (self.crop_size_h, self.crop_size_w, b_id) for b_id in batch_ids ] yield batch def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\tbase_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\tbase_batch_size={self.batch_size_gpu0}" ) return extra_repr_str @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BatchSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.bs.crop-size-width", default=DEFAULT_IMAGE_WIDTH, type=int, help="Base crop size (along width) during training", ) group.add_argument( "--sampler.bs.crop-size-height", default=DEFAULT_IMAGE_HEIGHT, type=int, help="Base crop size (along height) during training", ) return parser @SAMPLER_REGISTRY.register(name="batch_sampler_ddp") class BatchSamplerDDP(BaseSamplerDDP): """DDP variant of BatchSampler Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) crop_size_w: int = getattr( opts, "sampler.bs.crop_size_width", DEFAULT_IMAGE_WIDTH ) crop_size_h: int = getattr( opts, "sampler.bs.crop_size_height", DEFAULT_IMAGE_HEIGHT ) self.crop_size_w = crop_size_w self.crop_size_h = crop_size_h def __iter__(self) -> Iterator[Tuple[int, int, int]]: indices_rank_i = self.get_indices_rank_i() start_index = 0 batch_size = self.batch_size_gpu0 n_samples_rank_i = len(indices_rank_i) while start_index < n_samples_rank_i: end_index = min(start_index + batch_size, n_samples_rank_i) batch_ids = indices_rank_i[start_index:end_index] n_batch_samples = len(batch_ids) if n_batch_samples != batch_size: batch_ids += indices_rank_i[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [ (self.crop_size_h, self.crop_size_w, b_id) for b_id in batch_ids ] yield batch def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\tbase_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\tbase_batch_size={self.batch_size_gpu0}" ) return extra_repr_str ================================================ FILE: corenet/data/sampler/chain_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from __future__ import annotations import argparse import copy import itertools import json from typing import Iterator, List, Mapping, Optional, Tuple from torch.utils.data.sampler import Sampler from corenet.data.sampler import SAMPLER_REGISTRY, build_sampler from corenet.options.utils import flatten_yaml_as_dict from corenet.utils import logger @SAMPLER_REGISTRY.register(name="chain_sampler") class ChainSampler(Sampler): """ This class is a wrapper for iterating over datasets for multiple or similar tasks, typically useful for multi-task training. `task_name` and `sampler_config` are two mandatory keys that allows us to use task-specific data samplers. For specifying batch sizes, we use `train_batch_size0`, and `val_batch_size0` as keys for training and validation sets. Note that the batch sizes are scaled automatically depending on the number of GPUs. Args: opts: Command-line arguments data_samplers: dictionary containing different samplers Example:: # Example yaml config for combining different samplers is given below. # Please note that configuration for each sampler should start with `-` in `chain_sampler`. sampler: name: "chain_sampler" chain_sampler_mode: "sequential" chain_sampler: - task_name: "segmentation" train_batch_size0: 10 sampler_config: name: "variable_batch_sampler" use_shards: false num_repeats: 4 truncated_repeat_aug_sampler: false vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 768 min_crop_size_height: 256 max_crop_size_height: 768 check_scale: 16 - task_name: "classification" train_batch_size0: 20 sampler_config: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 """ _SUPPORTED_SAMPLING_MODES = ["sequential", "interleave"] def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: data_samplers = ChainSampler.build_chain_sampler(opts, *args, **kwargs) sampling_mode = getattr(opts, "sampler.chain_sampler_mode") if sampling_mode is None: logger.error(f"Sampling mode can't be None in {self.__class__.__name__}") if not isinstance(sampling_mode, str): logger.error( f"Sampling mode in {self.__class__.__name__} should be a type of string. Got: {type(sampling_mode)}" ) if sampling_mode not in self._SUPPORTED_SAMPLING_MODES: logger.error( f"Supported sampling mode in {self.__class__.__name__} are {self._SUPPORTED_SAMPLING_MODES}. " f"Got: {sampling_mode}" ) self.samplers_dict = data_samplers self.sampling_mode = sampling_mode @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add arguments for chain sampler.""" if cls != ChainSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument("--sampler.chain-sampler", type=json.loads, action="append") group.add_argument( "--sampler.chain-sampler-mode", type=str, default="sequential", choices=cls._SUPPORTED_SAMPLING_MODES, help="Chain sampler mode. Defaults to sequential.", ) return parser @classmethod def build_chain_sampler( cls, opts: argparse.Namespace, n_data_samples: Mapping[str, int], is_training: bool = False, *args, **kwargs, ) -> Mapping[str, Sampler]: """Build chain sampler from command line arguments and sampler registry Args: opts: command-line arguments n_data_samples: Mapping containing the task name and number of dataset samples in task-specific dataset is_training: Training mode or not Returns: A dictionary, sampler_dict, containing information about sampler name and module. """ chain_sampler_opts = getattr(opts, "sampler.chain_sampler") if chain_sampler_opts is None: logger.error( f"sampler.chain_sampler in {cls.__name__} can't be None. Please specify " f"sampler.chain_sampler using a yaml file." ) if not isinstance(chain_sampler_opts, List): logger.error( f"Chain sampler options are expected as a List. " f"Got type: {type(chain_sampler_opts)} and values: {chain_sampler_opts}" ) num_samplers = len(chain_sampler_opts) if num_samplers < 1: logger.error("We need at least one sampler if using chain sampler") sampler_dict = {} for i, sampler_opts_ in enumerate(chain_sampler_opts): task_name = sampler_opts_.get("task_name", None) if task_name is None: logger.error("task_name is a mandatory key when using chain sampler") # get sampler configuration sampler_opts_as_dict = sampler_opts_.get("sampler_config", None) if sampler_opts_as_dict is None: logger.error( "sampler_config is a mandatory key when using chain sampler" ) train_batch_size = sampler_opts_.get("train_batch_size0", None) val_batch_size = sampler_opts_.get("val_batch_size0", None) # flatten the dictionary sampler_opts_as_dict = flatten_yaml_as_dict(sampler_opts_as_dict) # create a local copy and override the global opts with task-specific sampler opts sampler_opts = copy.deepcopy(opts) # `sampler_opts_as_dict` only contains the values of command-line arguments that are # defined in the yaml file. Therefore, if a user misses few arguments, we won't have access # to default values, leading to an error. To avoid this, we create a local copy of global # command-line arguments and update it with `sampler_opts_as_dict` arguments for k, v in sampler_opts_as_dict.items(): # we need to prefix each argument with sampler because we define individual samplers as # `sampler.vbs.*` and not `vbs.*` setattr(sampler_opts, "sampler." + k, v) # override the batch size of sampler if train_batch_size is not None: setattr(sampler_opts, "dataset.train_batch_size0", train_batch_size) if val_batch_size is not None: setattr(sampler_opts, "dataset.val_batch_size0", val_batch_size) if not isinstance(n_data_samples, Mapping): logger.error( "For chain sampler, we need n_data_samples as a dictionary with key as a task name " f"and value as number of data points. Got: {n_data_samples}" ) if task_name not in n_data_samples: logger.error( f"Sample mapping from dataset has following keys ({n_data_samples.keys()}) " f"and does not contain {task_name}. Please check." ) # build the sampler for the task sampler_dict[task_name] = build_sampler( opts=sampler_opts, n_data_samples=n_data_samples[task_name], is_training=is_training, *args, **kwargs, ) # see if the keys in n_data_samples and sampler_dict are the same or not # i.e., intersection is null. is_intersection = n_data_samples.keys().isdisjoint(sampler_dict) assert is_intersection is False, ( f"The keys in n_data_samples and sampler_dict are not the same. " f"Got: {n_data_samples.keys()} and {sampler_dict.keys()}" ) return sampler_dict def _sequential_sampling(self) -> List[Tuple]: """Assuming we have samples from N datasets, then this function first iterates over the entire first dataset, then the entire second dataset, and so on Example: Dataset 1: [A, B, C] Dataset 2: [D, E, F, G, H] The result of this sampler would be something like this [A, B, C, D, E, F, G, H] """ for task_name, dataset_sampler in self.samplers_dict.items(): for batch_data in dataset_sampler: # append dataset name to the batch data yield [x + (task_name,) for x in batch_data] def _interleave_sampling(self) -> List[Tuple]: """Assuming we have samples from N datasets, then this function yields a batch from first dataset, then a batch from second dataset, and so on. In other words, batches are sampled from N datasets in a round-robin fashion. Example: Dataset 1: [A, B, C] Dataset 2: [D, E, F, G, H] The result of this sampler would be [A, D, B, E, C, F, G, H] """ items = self.samplers_dict.items() task_names, sampler_names = zip(*items) num_active_samplers = len(sampler_names) next_samplers = itertools.cycle( iter(data_sampler).__next__ for data_sampler in sampler_names ) while num_active_samplers: try: for i, next_sampler in enumerate(next_samplers): yield [ x + (task_names[i % num_active_samplers],) for x in next_sampler() ] except StopIteration: # Remove the sampler that we just exhausted from the cycle. num_active_samplers -= 1 next_samplers = itertools.cycle( itertools.islice(next_samplers, num_active_samplers) ) def __iter__(self) -> Iterator[Tuple]: if self.sampling_mode == "sequential": return self._sequential_sampling() elif self.sampling_mode == "interleave": return self._interleave_sampling() def __len__(self) -> int: return sum( [ len(dataset_sampler) for task_name, dataset_sampler in self.samplers_dict.items() ] ) def set_epoch(self, epoch: int) -> None: """Helper function to set epoch in each sampler. Args: epoch: Current epoch Returns: Nothing """ for task_name, dataset_sampler in self.samplers_dict.items(): if hasattr(dataset_sampler, "set_epoch"): dataset_sampler.set_epoch(epoch) def update_scales( self, epoch: int, is_master_node: Optional[bool] = False, *args, **kwargs ) -> None: """Helper function to update scales in each sampler. This is typically useful for variable-batch samplers Args: epoch: Current epoch is_master_node: Master node or not. Returns: Nothing """ for task_name, dataset_sampler in self.samplers_dict.items(): if hasattr(dataset_sampler, "update_scales"): dataset_sampler.update_scales( epoch, is_master_node=is_master_node, *args, **kwargs ) def update_indices(self, new_indices: List[int]) -> None: """Update sample indices of the datasets with these new indices. Args: new_indices: Filtered indices of the samples that needs to be used in next epoch. Returns: Nothing ...note: This function is useful for sample-efficient training. This function may be implemented in future (depending on use-case) """ raise NotImplementedError def __repr__(self) -> str: repr_str = f"{self.__class__.__name__}(\n" for k, v in self.samplers_dict.items(): repr_str += f"{k} --> " + v.__repr__().replace("\n\t", "\n\t\t").replace( "\n)", "\n\t)" ) repr_str += "\n" repr_str += "\n)" return repr_str ================================================ FILE: corenet/data/sampler/multi_scale_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Iterator, Tuple from corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP from corenet.data.sampler.utils import image_batch_pairs from corenet.utils import logger @SAMPLER_REGISTRY.register(name="multi_scale_sampler") class MultiScaleSampler(BaseSampler): """Multi-scale batch sampler for data parallel. This sampler yields batches of fixed batch size, but each batch has different spatial resolution. Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) crop_size_w = getattr(opts, "sampler.msc.crop_size_width") crop_size_h = getattr(opts, "sampler.msc.crop_size_height") min_crop_size_w = getattr(opts, "sampler.msc.min_crop_size_width") max_crop_size_w = getattr(opts, "sampler.msc.max_crop_size_width") min_crop_size_h = getattr(opts, "sampler.msc.min_crop_size_height") max_crop_size_h = getattr(opts, "sampler.msc.max_crop_size_height") check_scale_div_factor = getattr(opts, "sampler.msc.check_scale") max_img_scales = getattr(opts, "sampler.msc.max_n_scales") scale_inc = getattr(opts, "sampler.msc.scale_inc") self.min_crop_size_w = min_crop_size_w self.max_crop_size_w = max_crop_size_w self.min_crop_size_h = min_crop_size_h self.max_crop_size_h = max_crop_size_h self.crop_size_w = crop_size_w self.crop_size_h = crop_size_h self.max_img_scales = max_img_scales self.check_scale_div_factor = check_scale_div_factor self.scale_inc = scale_inc if is_training: self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.n_gpus, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) # over-ride the batch-size self.img_batch_tuples = [ (h, w, self.batch_size_gpu0) for h, w, b in self.img_batch_tuples ] else: self.img_batch_tuples = [(crop_size_h, crop_size_w, self.batch_size_gpu0)] @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != MultiScaleSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.msc.crop-size-width", default=DEFAULT_IMAGE_WIDTH, type=int, help=f"Base crop size (along width) during training. Defaults to {DEFAULT_IMAGE_WIDTH}.", ) group.add_argument( "--sampler.msc.crop-size-height", default=DEFAULT_IMAGE_HEIGHT, type=int, help=f"Base crop size (along height) during training. Defaults to {DEFAULT_IMAGE_HEIGHT}.", ) group.add_argument( "--sampler.msc.min-crop-size-width", default=160, type=int, help="Min. crop size along width during training. Defaults to 160.", ) group.add_argument( "--sampler.msc.max-crop-size-width", default=320, type=int, help="Max. crop size along width during training. Defaults to 320.", ) group.add_argument( "--sampler.msc.min-crop-size-height", default=160, type=int, help="Min. crop size along height during training. Defaults to 160.", ) group.add_argument( "--sampler.msc.max-crop-size-height", default=320, type=int, help="Max. crop size along height during training. Defaults to 320.", ) group.add_argument( "--sampler.msc.max-n-scales", default=5, type=int, help="Max. scales in variable batch sampler. Defaults to 5.", ) group.add_argument( "--sampler.msc.check-scale", default=32, type=int, help="Image scales should be divisible by this factor. Defaults to 32.", ) group.add_argument( "--sampler.msc.scale-inc", action="store_true", default=False, help="Increase image scales during training. Defaults to False.", ) return parser def __iter__(self) -> Iterator[Tuple[int, int, int]]: img_indices = self.get_indices() start_index = 0 n_samples = len(img_indices) while start_index < n_samples: crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, n_samples) batch_ids = img_indices[start_index:end_index] n_batch_samples = len(batch_ids) if len(batch_ids) != batch_size: batch_ids += img_indices[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [(crop_h, crop_w, b_id) for b_id in batch_ids] yield batch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: if type(self).update_scales is not MultiScaleSampler.update_scales: # Do nothing when a subclass overrides this method and calls super().update_scales return if is_master_node and self.scale_inc: logger.warning( f"Update scale function is not yet implemented for {self.__class__.__name__}." ) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\t base_batch_size={self.batch_size_gpu0}" f"\n\t scales={self.img_batch_tuples}" ) return extra_repr_str @SAMPLER_REGISTRY.register(name="multi_scale_sampler_ddp") class MultiScaleSamplerDDP(BaseSamplerDDP): """DDP version of MultiScaleSampler Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) crop_size_w = getattr(opts, "sampler.msc.crop_size_width") crop_size_h = getattr(opts, "sampler.msc.crop_size_height") min_crop_size_w = getattr(opts, "sampler.msc.min_crop_size_width") max_crop_size_w = getattr(opts, "sampler.msc.max_crop_size_width") min_crop_size_h = getattr(opts, "sampler.msc.min_crop_size_height") max_crop_size_h = getattr(opts, "sampler.msc.max_crop_size_height") check_scale_div_factor = getattr(opts, "sampler.msc.check_scale") max_img_scales = getattr(opts, "sampler.msc.max_n_scales") scale_inc = getattr(opts, "sampler.msc.scale_inc") self.crop_size_h = crop_size_h self.crop_size_w = crop_size_w self.min_crop_size_h = min_crop_size_h self.max_crop_size_h = max_crop_size_h self.min_crop_size_w = min_crop_size_w self.max_crop_size_w = max_crop_size_w self.max_img_scales = max_img_scales self.check_scale_div_factor = check_scale_div_factor self.scale_inc = scale_inc if is_training: self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.num_replicas, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) self.img_batch_tuples = [ (h, w, self.batch_size_gpu0) for h, w, b in self.img_batch_tuples ] else: self.img_batch_tuples = [ (self.crop_size_h, self.crop_size_w, self.batch_size_gpu0) ] def __iter__(self) -> Iterator[Tuple[int, int, int]]: indices_rank_i = self.get_indices_rank_i() start_index = 0 n_samples_rank_i = len(indices_rank_i) while start_index < n_samples_rank_i: crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, n_samples_rank_i) batch_ids = indices_rank_i[start_index:end_index] n_batch_samples = len(batch_ids) if n_batch_samples != batch_size: batch_ids += indices_rank_i[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [(crop_h, crop_w, b_id) for b_id in batch_ids] yield batch def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\t base_batch_size={self.batch_size_gpu0}" f"\n\t scales={self.img_batch_tuples}" ) return extra_repr_str def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: if type(self).update_scales is not MultiScaleSamplerDDP.update_scales: # Do nothing when a subclass overrides this method and calls super().update_scales return if is_master_node and self.scale_inc: logger.warning( f"Update scale function is not yet implemented for {self.__class__.__name__}" ) ================================================ FILE: corenet/data/sampler/utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional, Tuple, Union import numpy as np from corenet.utils.math_utils import make_divisible def image_batch_pairs( crop_size_w: int, crop_size_h: int, batch_size_gpu0: int, max_scales: Optional[float] = 5, check_scale_div_factor: Optional[int] = 32, min_crop_size_w: Optional[int] = 160, max_crop_size_w: Optional[int] = 320, min_crop_size_h: Optional[int] = 160, max_crop_size_h: Optional[int] = 320, *args, **kwargs ) -> List[Tuple[int, int, int]]: """This function creates batch and image size pairs. For a given batch size and image size, different image sizes are generated and batch size is adjusted so that GPU memory can be utilized efficiently. Args: crop_size_w: Base Image width (e.g., 224) crop_size_h: Base Image height (e.g., 224) batch_size_gpu0: Batch size on GPU 0 for base image max_scales: Number of scales. How many image sizes that we want to generate between min and max scale factors. Default: 5 check_scale_div_factor: Check if image scales are divisible by this factor. Default: 32 min_crop_size_w: Min. crop size along width. Default: 160 max_crop_size_w: Max. crop size along width. Default: 320 min_crop_size_h: Min. crop size along height. Default: 160 max_crop_size_h: Max. crop size along height. Default: 320 Returns: a sorted list of tuples. Each index is of the form (h, w, batch_size) """ width_dims = create_intervallic_integer_list( crop_size_w, min_crop_size_w, max_crop_size_w, max_scales, check_scale_div_factor, ) height_dims = create_intervallic_integer_list( crop_size_h, min_crop_size_h, max_crop_size_h, max_scales, check_scale_div_factor, ) img_batch_tuples = set() n_elements = crop_size_w * crop_size_h * batch_size_gpu0 for crop_h, crop_y in zip(height_dims, width_dims): # compute the batch size for sampled image resolutions with respect to the base resolution _bsz = max(1, int(round(n_elements / (crop_h * crop_y), 2))) img_batch_tuples.add((crop_h, crop_y, _bsz)) img_batch_tuples = list(img_batch_tuples) return sorted(img_batch_tuples) def make_video_pairs( crop_size_h: int, crop_size_w: int, min_crop_size_h: int, max_crop_size_h: int, min_crop_size_w: int, max_crop_size_w: int, default_frames: int, max_scales: Optional[int] = 5, check_scale_div_factor: Optional[int] = 32, *args, **kwargs ) -> List[Tuple[int, int, int]]: """This function creates number of frames and spatial size pairs for videos. Args: crop_size_h: Base Image height (e.g., 224) crop_size_w: Base Image width (e.g., 224) min_crop_size_w: Min. crop size along width. max_crop_size_w: Max. crop size along width. min_crop_size_h: Min. crop size along height. max_crop_size_h: Max. crop size along height. default_frames: Default number of frames per clip in a video. max_scales: Number of scales. Default: 5 check_scale_div_factor: Check if spatial scales are divisible by this factor. Default: 32. Returns: A sorted list of tuples. Each index is of the form (h, w, n_frames) """ width_dims = create_intervallic_integer_list( crop_size_w, min_crop_size_w, max_crop_size_w, max_scales, check_scale_div_factor, ) height_dims = create_intervallic_integer_list( crop_size_h, min_crop_size_h, max_crop_size_h, max_scales, check_scale_div_factor, ) batch_pairs = set() n_elements = crop_size_w * crop_size_h * default_frames for h, w in zip(height_dims, width_dims): n_frames = max(1, int(round(n_elements / (h * w), 2))) batch_pairs.add((h, w, n_frames)) return sorted(list(batch_pairs)) def create_intervallic_integer_list( base_val: Union[int, float], min_val: float, max_val: float, num_scales: Optional[int] = 5, scale_div_factor: Optional[int] = 1, ) -> List[int]: """This function creates a list of `n` integer values that scales `base_val` between `min_scale` and `max_scale`. Args: base_val: The base value to scale. min_val: The lower end of the value. max_val: The higher end of the value. n: Number of scaled values to generate. scale_div_factor: Check if scaled values are divisible by this factor. Returns: a sorted list of tuples. Each index is of the form (h, w, n_frames) """ values = set(np.linspace(min_val, max_val, num_scales)) values.add(base_val) values = [make_divisible(v, scale_div_factor) for v in values] return sorted(values) def make_tuple_list(*val_list: List) -> List[Tuple]: """Make a list of values to a list of the tuples. Where ith element in each list is in the ith tuple of the returned list. For example: [[1, 2], [3, 4], [5, 6]] is converted to [(1, 3, 5), (2, 4, 6)]. Args: val_list: A list of m list, where each element is a list of n values. Return: A list of size n, where each value is a tupe if m values. """ return list(zip(*val_list)) ================================================ FILE: corenet/data/sampler/variable_batch_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Iterator, Tuple from corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP from corenet.data.sampler.utils import image_batch_pairs from corenet.utils import logger @SAMPLER_REGISTRY.register(name="variable_batch_sampler") class VariableBatchSampler(BaseSampler): """Variably-size multi-scale batch sampler ` for data parallel. This sampler yields batches with variable spatial resolution and batch size. Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) crop_size_w = getattr(opts, "sampler.vbs.crop_size_width") crop_size_h = getattr(opts, "sampler.vbs.crop_size_height") min_crop_size_w = getattr(opts, "sampler.vbs.min_crop_size_width") max_crop_size_w = getattr(opts, "sampler.vbs.max_crop_size_width") min_crop_size_h = getattr(opts, "sampler.vbs.min_crop_size_height") max_crop_size_h = getattr(opts, "sampler.vbs.max_crop_size_height") check_scale_div_factor = getattr(opts, "sampler.vbs.check_scale") max_img_scales = getattr(opts, "sampler.vbs.max_n_scales") scale_inc = getattr(opts, "sampler.vbs.scale_inc") min_scale_inc_factor = getattr(opts, "sampler.vbs.min_scale_inc_factor") max_scale_inc_factor = getattr(opts, "sampler.vbs.max_scale_inc_factor") scale_ep_intervals = getattr(opts, "sampler.vbs.ep_intervals") if isinstance(scale_ep_intervals, int): scale_ep_intervals = [scale_ep_intervals] self.min_crop_size_w = min_crop_size_w self.max_crop_size_w = max_crop_size_w self.min_crop_size_h = min_crop_size_h self.max_crop_size_h = max_crop_size_h self.crop_size_w = crop_size_w self.crop_size_h = crop_size_h self.min_scale_inc_factor = min_scale_inc_factor self.max_scale_inc_factor = max_scale_inc_factor self.scale_ep_intervals = scale_ep_intervals self.max_img_scales = max_img_scales self.check_scale_div_factor = check_scale_div_factor self.scale_inc = scale_inc if is_training: self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.n_gpus, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) else: self.img_batch_tuples = [(crop_size_h, crop_size_w, self.batch_size_gpu0)] def __iter__(self) -> Iterator[Tuple[int, int, int]]: img_indices = self.get_indices() start_index = 0 n_samples = len(img_indices) while start_index < n_samples: crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, n_samples) batch_ids = img_indices[start_index:end_index] n_batch_samples = len(batch_ids) if len(batch_ids) != batch_size: batch_ids += img_indices[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [(crop_h, crop_w, b_id) for b_id in batch_ids] yield batch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: """Update the scales in variable batch sampler at specified epoch intervals during training.""" if epoch in self.scale_ep_intervals and self.scale_inc: self.min_crop_size_w += int( self.min_crop_size_w * self.min_scale_inc_factor ) self.max_crop_size_w += int( self.max_crop_size_w * self.max_scale_inc_factor ) self.min_crop_size_h += int( self.min_crop_size_h * self.min_scale_inc_factor ) self.max_crop_size_h += int( self.max_crop_size_h * self.max_scale_inc_factor ) self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.n_gpus, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) if is_master_node: logger.log("Scales updated in {}".format(self.__class__.__name__)) logger.log("New scales: {}".format(self.img_batch_tuples)) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\t base_batch_size={self.batch_size_gpu0}" f"\n\t scales={self.img_batch_tuples}" f"\n\t scale_inc={self.scale_inc}" f"\n\t min_scale_inc_factor={self.min_scale_inc_factor}" f"\n\t max_scale_inc_factor={self.max_scale_inc_factor}" f"\n\t ep_intervals={self.scale_ep_intervals}" ) return extra_repr_str @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != VariableBatchSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.vbs.crop-size-width", default=DEFAULT_IMAGE_WIDTH, type=int, help=f"Base crop size (along width) during training. Defaults to {DEFAULT_IMAGE_WIDTH}.", ) group.add_argument( "--sampler.vbs.crop-size-height", default=DEFAULT_IMAGE_HEIGHT, type=int, help=f"Base crop size (along height) during training. Defaults to {DEFAULT_IMAGE_HEIGHT}.", ) group.add_argument( "--sampler.vbs.min-crop-size-width", default=160, type=int, help="Min. crop size along width during training. Defaults to 160.", ) group.add_argument( "--sampler.vbs.max-crop-size-width", default=320, type=int, help="Max. crop size along width during training. Defaults to 320.", ) group.add_argument( "--sampler.vbs.min-crop-size-height", default=160, type=int, help="Min. crop size along height during training. Defaults to 160.", ) group.add_argument( "--sampler.vbs.max-crop-size-height", default=320, type=int, help="Max. crop size along height during training. Defaults to 320.", ) group.add_argument( "--sampler.vbs.max-n-scales", default=5, type=int, help="Max. scales in variable batch sampler. Defaults to 5.", ) group.add_argument( "--sampler.vbs.check-scale", default=32, type=int, help="Image scales should be divisible by this factor. Defaults to 32.", ) group.add_argument( "--sampler.vbs.ep-intervals", default=[40], type=int, help="Epoch intervals at which scales should be adjusted. Defaults to 40.", ) group.add_argument( "--sampler.vbs.min-scale-inc-factor", default=1.0, type=float, help="Factor by which we should increase the minimum scale. Defaults to 1.0", ) group.add_argument( "--sampler.vbs.max-scale-inc-factor", default=1.0, type=float, help="Factor by which we should increase the maximum scale. Defaults to 1.0", ) group.add_argument( "--sampler.vbs.scale-inc", action="store_true", default=False, help="Increase image scales during training. Defaults to False.", ) return parser @SAMPLER_REGISTRY.register(name="variable_batch_sampler_ddp") class VariableBatchSamplerDDP(BaseSamplerDDP): """DDP version of VariableBatchSampler Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) crop_size_w = getattr(opts, "sampler.vbs.crop_size_width") crop_size_h = getattr(opts, "sampler.vbs.crop_size_height") min_crop_size_w = getattr(opts, "sampler.vbs.min_crop_size_width") max_crop_size_w = getattr(opts, "sampler.vbs.max_crop_size_width") min_crop_size_h = getattr(opts, "sampler.vbs.min_crop_size_height") max_crop_size_h = getattr(opts, "sampler.vbs.max_crop_size_height") check_scale_div_factor = getattr(opts, "sampler.vbs.check_scale") max_img_scales = getattr(opts, "sampler.vbs.max_n_scales") scale_inc = getattr(opts, "sampler.vbs.scale_inc") min_scale_inc_factor = getattr(opts, "sampler.vbs.min_scale_inc_factor") max_scale_inc_factor = getattr(opts, "sampler.vbs.max_scale_inc_factor") scale_ep_intervals = getattr(opts, "sampler.vbs.ep_intervals") if isinstance(scale_ep_intervals, int): scale_ep_intervals = [scale_ep_intervals] self.crop_size_h = crop_size_h self.crop_size_w = crop_size_w self.min_crop_size_h = min_crop_size_h self.max_crop_size_h = max_crop_size_h self.min_crop_size_w = min_crop_size_w self.max_crop_size_w = max_crop_size_w self.min_scale_inc_factor = min_scale_inc_factor self.max_scale_inc_factor = max_scale_inc_factor self.scale_ep_intervals = scale_ep_intervals self.max_img_scales = max_img_scales self.check_scale_div_factor = check_scale_div_factor self.scale_inc = scale_inc if is_training: self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.num_replicas, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) else: self.img_batch_tuples = [ (self.crop_size_h, self.crop_size_w, self.batch_size_gpu0) ] def __iter__(self) -> Iterator[Tuple[int, int, int]]: indices_rank_i = self.get_indices_rank_i() start_index = 0 n_samples_rank_i = len(indices_rank_i) while start_index < n_samples_rank_i: crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, n_samples_rank_i) batch_ids = indices_rank_i[start_index:end_index] n_batch_samples = len(batch_ids) if n_batch_samples != batch_size: batch_ids += indices_rank_i[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [(crop_h, crop_w, b_id) for b_id in batch_ids] yield batch def update_scales(self, epoch: int, is_master_node=False, *args, **kwargs) -> None: """Update the scales in variable batch sampler at specified epoch intervals during training.""" if (epoch in self.scale_ep_intervals) and self.scale_inc: self.min_crop_size_w += int( self.min_crop_size_w * self.min_scale_inc_factor ) self.max_crop_size_w += int( self.max_crop_size_w * self.max_scale_inc_factor ) self.min_crop_size_h += int( self.min_crop_size_h * self.min_scale_inc_factor ) self.max_crop_size_h += int( self.max_crop_size_h * self.max_scale_inc_factor ) self.img_batch_tuples = image_batch_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, batch_size_gpu0=self.batch_size_gpu0, n_gpus=self.num_replicas, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, ) if is_master_node: logger.log("Scales updated in {}".format(self.__class__.__name__)) logger.log("New scales: {}".format(self.img_batch_tuples)) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})" f"\n\t base_batch_size={self.batch_size_gpu0}" f"\n\t scales={self.img_batch_tuples}" f"\n\t scale_inc={self.scale_inc}" f"\n\t min_scale_inc_factor={self.min_scale_inc_factor}" f"\n\t max_scale_inc_factor={self.max_scale_inc_factor}" f"\n\t ep_intervals={self.scale_ep_intervals}" ) return extra_repr_str ================================================ FILE: corenet/data/sampler/video_batch_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Iterator, Tuple from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.batch_sampler import BatchSampler, BatchSamplerDDP @SAMPLER_REGISTRY.register(name="video_batch_sampler") class VideoBatchSampler(BatchSampler): """Standard Batch Sampler for videos. This sampler yields batches of fixed (1) batch size, (2) spatial resolutions, (3) frames per clip, and (4) number of clips per video. Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) self.default_frames = getattr(opts, "sampler.bs.num_frames_per_clip") self.clips_per_video = getattr(opts, "sampler.bs.clips_per_video") def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]: indices = self.get_indices() start_index = 0 batch_size = self.batch_size_gpu0 indices_len = len(indices) while start_index < indices_len: end_index = min(start_index + batch_size, indices_len) batch_ids = indices[start_index:end_index] start_index += batch_size if len(batch_ids) > 0: batch = [ ( self.crop_size_h, self.crop_size_w, b_id, self.default_frames, self.clips_per_video, ) for b_id in batch_ids ] yield batch @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.Namespace: if cls != VideoBatchSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.bs.num-frames-per-clip", default=8, type=int, help="Number of frames per video clip. Defaults to 8.", ) group.add_argument( "--sampler.bs.clips-per-video", default=1, type=int, help="Number of clips per video. Defaults to 1.", ) return parser def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t n_clips={self.clips_per_video}" f"\n\t n_frames_per_clip={self.default_frames}" ) return extra_repr_str @SAMPLER_REGISTRY.register(name="video_batch_sampler_ddp") class VideoBatchSamplerDDP(BatchSamplerDDP): """DDP version of VideoBatchSampler Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) self.default_frames = getattr(opts, "sampler.bs.num_frames_per_clip") self.clips_per_video = getattr(opts, "sampler.bs.clips_per_video") def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]: indices_rank_i = self.get_indices_rank_i() start_index = 0 batch_size = self.batch_size_gpu0 indices_len = len(indices_rank_i) while start_index < indices_len: end_index = min(start_index + batch_size, indices_len) batch_ids = indices_rank_i[start_index:end_index] n_batch_samples = len(batch_ids) if n_batch_samples != batch_size: batch_ids += indices_rank_i[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [ ( self.crop_size_h, self.crop_size_w, b_id, self.default_frames, self.clips_per_video, ) for b_id in batch_ids ] yield batch def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t n_clips={self.clips_per_video}" f"\n\t n_frames_per_clip={self.default_frames}" ) return extra_repr_str ================================================ FILE: corenet/data/sampler/video_clip_batch_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math import random from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple import numpy as np from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP from corenet.data.sampler.variable_batch_sampler import ( VariableBatchSampler, VariableBatchSamplerDDP, ) from corenet.utils import logger @SAMPLER_REGISTRY.register(name="video_clip_batch_sampler") class VideoClipBatchSampler(VariableBatchSampler): """ Batch sampler for videos. Different with VideoBatchSampler that samples each video the same number of clips despite the length of the video, VideoClipBatchSampler samples number of clips proportional to the length of the video. In addition, by setting scales of image (--sampler.vbs.min-crop-size-width, --sampler.vbs.mmax-crop-size-width, --sampler.vbs.min-crop-size-height, --sampler.vbs.mmax-crop-size-height, --sampler.vbs.max-n-scales) and frame rate (--sampler.vcbs.min-clip-fps-scale, --sampler.vcbs.max-clip-fps-scale and --sampler.vcbs.video-fps-num-scales), this sampler can also sample videos with variable image size and frame rate. When VideoClipBatchSampler is used, a tuple (crop_h, crop_w, video_id, num_frames, num_clips, video_fps, audio_fps, num_samples_per_clip) is returned. (`crop_h`, `crop_w`) is the image size to use, `video_id` is the index of the video the current clips come from, `num_clips` is the number of clip to sample from the current video, which is proportional to the length of the video; `video_fps` and `audio_fps` is the frame rate of video and audio to sample; `num_samples_per_clip` is the number of samples to generate for each clip at training time, this variable is only valid at training time. Note that the variable image size and frame rate are only applied during the training time. The batch size is adjusted accordingly with the image size and video length. By setting `--sampler.vcbs.max-num-clips-per-batch`, we have a upper bound of a batch in case a certain video is too long and cause OOM problem. Args: opts: Command line argument. n_data_samples: Number of samples in the dataset. is_training: Training or validation mode. Default: False. get_item_metadata: A callable that provides sample metadata, given sample index. """ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Batch sampler for videos", description="Arguments related to variable batch sampler", ) group.add_argument( "--sampler.vcbs.num-frames-per-clip", default=8, type=int, help="Number of frames per video clip. Default to 8.", ) group.add_argument( "--sampler.vcbs.video-fps", type=int, default=8, help="The desired frame rate of the clip. Default to 8.", ) group.add_argument( "--sampler.vcbs.audio-fps", type=int, default=16000, help="The frame rate of audio. Default to 16000.", ) group.add_argument( "--sampler.vcbs.min-clip-fps-scale", type=float, default=1, help="The minimal scale to apply to the desired video/audio frame rate of" " the clip. Default to 1.", ) group.add_argument( "--sampler.vcbs.max-clip-fps-scale", type=float, default=2.5, help="The maximal scale to apply to desired video/audio frame rate of the" " clip. Default to 2.5.", ) group.add_argument( "--sampler.vcbs.video-fps-num-scales", type=float, default=5, help="The maximal scale to apply to desired frame rate of the clip. Default" " to 5.", ) group.add_argument( "--sampler.vcbs.num-clips-per-second-train", type=float, default=1.0, help="The number of clips per second for training, default to 1. This is" " used to determine the frequency to sample.", ) group.add_argument( "--sampler.vcbs.num-clips-per-second-val", type=float, default=4.0, help="The number of clips per second for validation, default to 4. This is" "used to determine the frequency to sample.", ) group.add_argument( "--sampler.vcbs.max-num-clips-per-batch", type=int, default=50, help="The maximal number of clips per batch, default to 50. This is used to" " avoid memory leak if videos are too long.", ) group.add_argument( "--sampler.vcbs.num-samples-per-clip", type=int, default=1, help="The number of samples to generate for each clip at training time." " Default to 1.", ) return parser def __init__( self, opts, n_data_samples: int, is_training: Optional[bool] = False, get_item_metadata: Optional[Callable[[int], Dict]] = None, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) self.default_frames = getattr(opts, "sampler.vcbs.num_frames_per_clip") self.video_fps = getattr(opts, "sampler.vcbs.video_fps") self.audio_fps = getattr(opts, "sampler.vcbs.audio_fps") self.min_fps_scale = getattr(opts, "sampler.vcbs.min_clip_fps_scale") self.max_fps_scale = getattr(opts, "sampler.vcbs.max_clip_fps_scale") self.num_fps_scale = getattr(opts, "sampler.vcbs.video_fps_num_scales") self.num_samples_per_clip = getattr(opts, "sampler.vcbs.num_samples_per_clip") self.num_clips_per_second_train = getattr( opts, "sampler.vcbs.num_clips_per_second_train" ) self.num_clips_per_second_val = getattr( opts, "sampler.vcbs.num_clips_per_second_val" ) self.max_num_clips_per_batch = getattr( opts, "sampler.vcbs.max_num_clips_per_batch" ) self.is_training = is_training self.get_item_metadata = get_item_metadata if is_training: frame_rate_scales = np.linspace( self.min_fps_scale, self.max_fps_scale, self.num_fps_scale, ) self.frame_rate_scales = list(set(frame_rate_scales) | {1}) else: self.frame_rate_scales = [1.0] self.num_samples_per_clip = 1 def __iter__(self) -> Iterator[List]: indices = self.get_indices() start_index = 0 n_samples = len(indices) while start_index < n_samples: crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples) h_scale = crop_h / self.crop_size_h w_scale = crop_w / self.crop_size_w max_num_clips_per_batch = int( self.max_num_clips_per_batch / (h_scale * w_scale) ) fps_scale = random.choice(self.frame_rate_scales) video_fps = int(self.video_fps * fps_scale) audio_fps = int(self.audio_fps * fps_scale) # Find the maximal batch size to contain no more than # `self.max_num_clips_per_batch` clips. batch_end_index = min(start_index + batch_size, n_samples) end_index = start_index sum_batch_clips = 0 num_batch_clips = [] while end_index < batch_end_index: # Computed the weighted number of clips in the batch, taking video # length, image size into account to make sure the batch fits into the # memory. num_clips_per_second = ( self.num_clips_per_second_train if self.is_training else self.num_clips_per_second_val ) metadata = self.get_item_metadata(indices[end_index]) if num_clips_per_second > 0: num_clips = max( 1, int(metadata["video_duration"] * num_clips_per_second), ) else: clip_duration = self.default_frames / self.video_fps num_clips = int( metadata["total_video_frames"] - clip_duration * metadata["video_fps"] ) num_clips = min(num_clips, max_num_clips_per_batch) sum_batch_clips += num_clips if sum_batch_clips > max_num_clips_per_batch: break num_batch_clips.append(num_clips) end_index += 1 video_ids = indices[start_index:end_index] start_index += len(video_ids) if len(video_ids) > 0: batch = [ ( crop_h, crop_w, video_id, self.default_frames, num_batch_clips[i], video_fps, audio_fps, self.num_samples_per_clip, ) for i, video_id in enumerate(video_ids) ] yield batch else: logger.warning("No data in the current batch.") def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n \t base_im_size=(h={}, w={})\n \t base_batch_size={}\n \t video_fps={}\n \taudio_fps={}\n \tn_frames={}".format( self.crop_size_h, self.crop_size_w, self.batch_size_gpu0, self.video_fps, self.audio_fps, self.default_frames, ) repr_str += self.extra_repr() repr_str += "\n)" return repr_str @SAMPLER_REGISTRY.register(name="video_clip_batch_sampler_ddp") class VideoClipBatchSamplerDDP(BaseSamplerDDP): """Wraps the VideoClipBatchSampler to make it work with DDP. This is needed for because we do not know how long the epoch will be, and it is imperative that all replicas take the same number of steps. This approach could be used to adapt any non DDP sampler. """ def __init__( self, *args, **kwargs, ) -> None: self.inner = VideoClipBatchSampler(*args, **kwargs) super().__init__(*args, **kwargs) def __iter__(self) -> Iterator[List]: """Returns VideoClipBatchSampler samples divided up between DDP nodes.""" batches = list(self.inner) while len(batches) % self.num_replicas != 0: for batch in reversed(batches): if len(batch) > 1: batches.append([batch.pop()]) break else: batches.pop() for i in range(self.rank, len(batches), self.num_replicas): yield batches[i] def __len__(self) -> int: return int(math.ceil(len(self.inner) / self.num_replicas)) def set_epoch(self, epoch: int) -> None: self.epoch = epoch self.inner.set_epoch(epoch) def update_scales(self, *args, **kwargs) -> None: return self.inner.update_scales(*args, **kwargs) def update_indices(self, new_indices: List[int]) -> None: return self.inner.update_indices(*args, **kwargs) def extra_repr(self) -> str: return self.inner.extra_repr() ================================================ FILE: corenet/data/sampler/video_variable_seq_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Iterator, Optional, Tuple from corenet.data.sampler import SAMPLER_REGISTRY from corenet.data.sampler.utils import make_video_pairs from corenet.data.sampler.variable_batch_sampler import ( VariableBatchSampler, VariableBatchSamplerDDP, ) from corenet.utils import logger @SAMPLER_REGISTRY.register(name="video_variable_seq_sampler") class VideoVariableSeqSampler(VariableBatchSampler): """Extends `Variably-size multi-scale batch sampler ` for videos. This sampler yields batches of variable (1) batch size, (2) spatial resolutions, (3) frames per clip, and (4) number of clips per video. Args: opts: command line argument n_data_samples: Number of samples in the dataset is_training: Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) self.default_frames = getattr(opts, "sampler.vbs.num_frames_per_clip") min_clips_per_video = getattr(opts, "sampler.vbs.min_clips_per_video") self.max_clips_per_video = getattr(opts, "sampler.vbs.max_clips_per_video") self.clips_per_video = getattr(opts, "sampler.vbs.clips_per_video") if min_clips_per_video is None: logger.error( "Please specify min. clips per video using --sampler.vbs.min-clips-per-video." ) self.min_clips_per_video = min_clips_per_video self.random_video_clips = False if is_training: # override img_batch_tuples self.img_batch_tuples = make_video_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, default_frames=self.default_frames, ) self.random_video_clips = getattr(opts, "sampler.vbs.random_video_clips") else: if self.clips_per_video is None: logger.error( "For modes other than training, clips per video can't be None" ) self.img_batch_tuples = [ (self.crop_size_h, self.crop_size_w, self.default_frames) ] @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != VideoVariableSeqSampler: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--sampler.vbs.num-frames-per-clip", default=8, type=int, help="Default frames per video. Defaults to 8", ) group.add_argument( "--sampler.vbs.random-video-clips", action="store_true", default=False, help="Sample number of clips per video randomly during training between min and max values specified using " "--sampler.vbs.min-clips-per-video and --sampler.vbs.max-clips-per-video arguments respectively", ) group.add_argument( "--sampler.vbs.min-clips-per-video", type=int, default=1, help="Minimum number of clips per video. Used only for training. Defaults to 1.", ) group.add_argument( "--sampler.vbs.max-clips-per-video", type=int, default=5, help="Maximum number of clips per video. Used only for training. Defaults to 5.", ) group.add_argument( "--sampler.vbs.clips-per-video", type=int, default=1, help="Number of clips per video. Defaults to 1.", ) group.add_argument( "--sampler.vbs.min-frames-per-clip", type=int, default=8, help="Minimum number of frames per clip. Defaults to 8.", ) return parser def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]: indices = self.get_indices() start_index = 0 indices_len = len(indices) while start_index < indices_len: if self.random_video_clips: # randomly sample number of clips and adjust frames per clip n_clips = max( 1, random.randint(self.min_clips_per_video, self.max_clips_per_video), ) batch_size = max( self.batch_size_gpu0, self.batch_size_gpu0 * (self.clips_per_video // n_clips), ) else: n_clips = self.clips_per_video batch_size = self.batch_size_gpu0 crop_h, crop_w, n_frames = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, indices_len) batch_ids = indices[start_index:end_index] n_batch_samples = len(batch_ids) if len(batch_ids) != batch_size: batch_ids += indices[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [ (crop_h, crop_w, b_id, n_frames, n_clips) for b_id in batch_ids ] yield batch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: if type(self).update_scales is not VideoVariableSeqSampler.update_scales: # Do nothing when a subclass overrides this method and calls super().update_scales return if is_master_node and self.scale_inc: logger.warning( f"Update scale function is not yet implemented for {self.__class__.__name__}" ) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t var_num_clips_training=(min={self.min_clips_per_video}, max={self.max_clips_per_video})" f"\n\t fixed_num_clips_val={self.clips_per_video}" ) return extra_repr_str @SAMPLER_REGISTRY.register(name="video_variable_seq_sampler_ddp") class VideoVariableSeqSamplerDDP(VariableBatchSamplerDDP): """DDP variant of VideoVariableSeqSampler Args: opts: command line argument n_data_samples (int): Number of samples in the dataset is_training (Optional[bool]): Training or validation mode. Default: False """ def __init__( self, opts: argparse.Namespace, n_data_samples: int, is_training: Optional[bool] = False, *args, **kwargs, ) -> None: super().__init__( opts=opts, n_data_samples=n_data_samples, is_training=is_training ) self.default_frames = getattr(opts, "sampler.vbs.num_frames_per_clip") self.random_video_clips = False self.min_clips_per_video = getattr(opts, "sampler.vbs.min_clips_per_video") self.max_clips_per_video = getattr(opts, "sampler.vbs.max_clips_per_video") self.clips_per_video = getattr(opts, "sampler.vbs.clips_per_video") if self.min_clips_per_video is None: logger.error( "Please specify min. clips per video using --sampler.vbs.min-clips-per-video." ) if is_training: # override img_batch_tuples self.img_batch_tuples = make_video_pairs( crop_size_h=self.crop_size_h, crop_size_w=self.crop_size_w, min_crop_size_h=self.min_crop_size_h, max_crop_size_h=self.max_crop_size_h, min_crop_size_w=self.min_crop_size_w, max_crop_size_w=self.max_crop_size_w, max_scales=self.max_img_scales, check_scale_div_factor=self.check_scale_div_factor, default_frames=self.default_frames, ) self.random_video_clips = getattr(opts, "sampler.vbs.random_video_clips") else: if self.clips_per_video is None: logger.error( "For modes other than training, clips per video can't be None" ) self.img_batch_tuples = [ (self.crop_size_h, self.crop_size_w, self.default_frames) ] def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]: indices_rank_i = self.get_indices_rank_i() start_index = 0 n_samples_rank_i = len(indices_rank_i) while start_index < n_samples_rank_i: if self.random_video_clips: # randomly sample number of clips and adjust batch size n_clips = max( 1, random.randint(self.min_clips_per_video, self.max_clips_per_video), ) batch_size = max( self.batch_size_gpu0, self.batch_size_gpu0 * (self.clips_per_video // n_clips), ) else: n_clips = self.clips_per_video batch_size = self.batch_size_gpu0 crop_h, crop_w, n_frames = random.choice(self.img_batch_tuples) end_index = min(start_index + batch_size, n_samples_rank_i) batch_ids = indices_rank_i[start_index:end_index] n_batch_samples = len(batch_ids) if n_batch_samples != batch_size: batch_ids += indices_rank_i[: (batch_size - n_batch_samples)] start_index += batch_size if len(batch_ids) > 0: batch = [ (crop_h, crop_w, b_id, n_frames, n_clips) for b_id in batch_ids ] yield batch def update_scales( self, epoch: int, is_master_node: bool = False, *args, **kwargs ) -> None: if type(self).update_scales is not VideoVariableSeqSamplerDDP.update_scales: # Do nothing when a subclass overrides this method and calls super().update_scales return if is_master_node and self.scale_inc: logger.warning( f"Update scale function is not yet implemented for {self.__class__.__name__}" ) def extra_repr(self) -> str: extra_repr_str = super().extra_repr() extra_repr_str += ( f"\n\t var_num_clips_training=(min={self.min_clips_per_video}, max={self.max_clips_per_video})" f"\n\t fixed_num_clips_val={self.clips_per_video}" ) return extra_repr_str ================================================ FILE: corenet/data/text_tokenizer/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.text_tokenizer.base_tokenizer import BaseTextTokenizer from corenet.utils import logger from corenet.utils.registry import Registry TOKENIZER_REGISTRY = Registry( "tokenizer", base_class=BaseTextTokenizer, lazy_load_dirs=[ "corenet/data/text_tokenizer", "corenet/third_party/data/text_tokenizer", ], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_tokenizer(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: # add arguments for text_tokenizer parser = BaseTextTokenizer.add_arguments(parser) # add class specific arguments parser = TOKENIZER_REGISTRY.all_arguments(parser) return parser def build_tokenizer(opts, *args, **kwargs) -> BaseTextTokenizer: """Helper function to build the text tokenizer from command-line arguments. Args: opts: Command-line arguments Returns: Image projection head module. """ tokenizer_name = getattr(opts, "text_tokenizer.name", None) # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if tokenizer_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") tokenizer = TOKENIZER_REGISTRY[tokenizer_name](opts, *args, **kwargs) return tokenizer ================================================ FILE: corenet/data/text_tokenizer/base_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any from torch import Tensor, nn from corenet.utils import logger class BaseTextTokenizer(nn.Module): """Base class for text tokenizers. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace) -> None: super().__init__() self.opts = opts @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == BaseTextTokenizer: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--text-tokenizer.name", type=str, default=None, help="Name of the text tokenizer (e.g., clip). Defaults to None.", ) group.add_argument( "--text-tokenizer.sot-token", type=str, default=None, help=f"Start of the text token. Defaults to None (i.e., users must specify the value if it needs to be used.).", ) group.add_argument( "--text-tokenizer.eot-token", type=str, default=None, help=f"End of the text token. Defaults to None (i.e., users must specify the value if it needs to be used.).", ) group.add_argument( "--text-tokenizer.pad-token", type=str, default=None, help=f"Pad token. Defaults to None (i.e., users must specify the value if it needs to be used.).", ) return parser @property def vocab_size(self) -> int: """Text vocabulary size.""" raise NotImplementedError("Child classes must implement this method.") @property def eot_token(self) -> str: """End of text token.""" eot = getattr(self.opts, "text_tokenizer.eot_token") if eot is None: logger.error( "EOT token can't be None. Please specify using 'text_tokenizer.eot_token' in config file." ) return eot @property def eot_token_id(self) -> int: """Token index for EOT token.""" raise NotImplementedError("Child classes must implement this method.") @property def sot_token(self) -> str: """Start of text token.""" sot = getattr(self.opts, "text_tokenizer.sot_token") if sot is None: logger.error( "SOT token can't be None. Please specify using 'text_tokenizer.sot_token' in config file." ) return sot @property def sot_token_id(self) -> int: """Start of token index.""" raise NotImplementedError("Child classes must implement this method.") @property def pad_token(self) -> str: """Padding token.""" pad = getattr(self.opts, "text_tokenizer.pad_token") if pad is None: logger.error( "Padding token can't be None. Please specify using 'text_tokenizer.pad_token' in config file." ) return pad @property def pad_token_id(self) -> int: """Padding index.""" raise NotImplementedError("Child classes must implement this method.") def tok_encode(self, input_sentence: str) -> Tensor: """Encodes a sentence into a tensor of token ids.""" raise NotImplementedError("Child classes must implement this method.") def tok_decode(self, token_ids: Any) -> str: """Decodes token ids into a sentence.""" raise NotImplementedError("Child classes must implement this method.") def forward(self, input_sentence: str) -> Tensor: """Tokenize the input sentence. Args: input_sentence: Pre-processed input sentence. Returns: Tensor containing tokenized sequence. ...note: Input sentence should be pre-processed (e.g., lower case). """ tokenized_sentence = self.tok_encode(input_sentence) return tokenized_sentence ================================================ FILE: corenet/data/text_tokenizer/clip_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor from torchtext.transforms import CLIPTokenizer from corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer from corenet.utils import logger from corenet.utils.download_utils import get_local_path @TOKENIZER_REGISTRY.register(name="clip") class ClipTokenizer(BaseTextTokenizer): """Tokenizer for CLIP. This tokenizer uses torchtext's CLIP Tokenizer to tokenize input sentence into token ids. Please see `torchtext documentation `_ for details. Args: opts: Command line arguments. """ def __init__(self, opts: argparse.Namespace) -> None: merges_path = getattr(opts, "text_tokenizer.clip.merges_path") if merges_path is None: logger.error( "Please specify BPE merge file using --text-tokenizer.clip.merges-path argument" ) # DDP case is handled internally merges_path = get_local_path(opts, path=merges_path, force_delete=False) encoder_json_path = getattr(opts, "text_tokenizer.clip.encoder_json_path") if encoder_json_path is None: logger.error( "Please specify Encoder JSON file using --text-tokenizer.clip.encoder-json-path argument" ) encoder_json_path = get_local_path( opts, path=encoder_json_path, force_delete=False ) super().__init__(opts) self.tokenizer = CLIPTokenizer( merges_path=merges_path, encoder_json_path=encoder_json_path ) # BPE encodings is a dict, where keys are tokens and values are token_ids self.bpe_encodings = self.tokenizer.bpe.bpe_encoder_ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == ClipTokenizer: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--text-tokenizer.clip.merges-path", type=str, default=None, help="Path to bpe merges file. Defaults to None.", ) group.add_argument( "--text-tokenizer.clip.encoder-json-path", type=str, default=None, help="Path to BPE encoder json file. This file is used to infer `num_merges`. Defaults to None.", ) return parser @property def vocab_size(self) -> int: """Text vocabulary size.""" return len(self.bpe_encodings) @property def eot_token(self) -> str: """End of text token.""" return "<|endoftext|>" @property def eot_token_id(self) -> int: """Token index for EOT token.""" return int(self.tokenizer(self.eot_token)[0]) @property def sot_token(self) -> str: """Start of text token.""" return "<|startoftext|>" @property def sot_token_id(self) -> int: """Start of token index.""" return int(self.tokenizer(self.sot_token)[0]) def tok_encode(self, input_sentence: str) -> Tensor: """Encodes a sentence into a tensor of token ids. ...note: SOT and EOT tokens are added to input sentence before tokenization. """ input_sentence = f"{self.sot_token} {input_sentence} {self.eot_token}" # tokenizer returns indices as a string tokenized_sentence = self.tokenizer(input_sentence) # convert string to int and then create a tensor tokenized_sentence = torch.tensor( [int(cap) for cap in tokenized_sentence], dtype=torch.long ) return tokenized_sentence ================================================ FILE: corenet/data/text_tokenizer/sentencepiece_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from argparse import Namespace from typing import List, Union import ftfy import torch from torch import Tensor from corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer from corenet.utils import logger from corenet.utils.ddp_utils import is_rank_0_worker_0 from corenet.utils.download_utils import get_local_path @TOKENIZER_REGISTRY.register(name="sentence_piece") class SentencePieceTokenizer(BaseTextTokenizer): """Sentence piece tokenizer. Args: opts: Command-line arguments. ...note: Sentence piece library needs to be installed in order to use this tokenizer. It can be installed as: ``` pip install -e '.[sentencepiece]' ``` """ def __init__(self, opts: Namespace) -> None: super().__init__(opts) try: from sentencepiece import SentencePieceProcessor except ModuleNotFoundError: raise ModuleNotFoundError("Please install sentencepiece library.") spm_model_path = getattr(self.opts, "text_tokenizer.sentence_piece.model_path") if spm_model_path is None: logger.error( f"Model path can't be None in {self.__class__.__name__}. Please specify using 'text_tokenizer.sentence_piece.model_path' in config file." ) spm_model_local_path = get_local_path( opts=self.opts, path=spm_model_path, force_delete=False, use_start_rank=True, sync_ranks=False, ) self.log_warning_once_on_rank0_worker0 = is_rank_0_worker_0(opts) self.sp_model = SentencePieceProcessor(model_file=spm_model_local_path) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add arguments related to sentence piece tokenizer.""" if cls == SentencePieceTokenizer: group = parser.add_argument_group(cls.__name__) group.add_argument( "--text-tokenizer.sentence-piece.model-path", type=str, default=None, help="Sentence piece model path. Defaults to None (i.e., user need to supply the model path).", ) group.add_argument( "--text-tokenizer.sentence-piece.enable-nfc-normalization", action="store_true", default=False, help="Normalize the text using NFC normalization. This is useful when pre-training. Defaults to False.", ) group.add_argument( "--text-tokenizer.sentence-piece.append-sot-token", action="store_true", default=False, help="Append start of text token before tokenized text. Defaults to False.", ) group.add_argument( "--text-tokenizer.sentence-piece.append-eot-token", action="store_true", default=False, help="Append end of text token after tokenized text. Defaults to False.", ) return parser @property def vocab_size(self) -> int: """Vocabulary size.""" v_size = self.sp_model.vocab_size() assert ( isinstance(v_size, int) and v_size > 0 ), f"Vocabulary size should be a positive integer. Got: {v_size}" return v_size @property def sot_token_id(self) -> int: """Start of text token index.""" sot = self.sp_model.bos_id() assert ( isinstance(sot, int) and sot > 0 ), f"The start of text index should be a non-negative integer. Got: {sot}." return sot @property def eot_token_id(self) -> int: """End of text token index.""" eot = self.sp_model.eos_id() assert ( isinstance(eot, int) and eot > 0 ), f"The end of text index should be a non-negative integer. Got: {eot}." return eot @property def pad_token_id(self) -> int: """Padding index. ...note: If the padding index is None or -1, we set it equal to the vocabulary size. Consequently, the range of indices in the vocabulary changes from '[0, vocab_size)' to '[0, vocab_size]'. This adjustment is primarily made to accommodate variable sequence lengths during LLM pre-training. Users should exclude the padding index from consideration in the loss function. They should also increase the size of embedding layer and classification layer in the model configuration to accommodate padding index if it is None or -1. """ pad_id = self.sp_model.pad_id() assert pad_id is None or ( isinstance(pad_id, int) and pad_id >= -1 ), f"The padding index should be None or an integer greater than or equal to -1. Got: {pad_id}." if pad_id is None or pad_id == -1: pad_id = self.vocab_size if self.log_warning_once_on_rank0_worker0: logger.warning( "Padding index is -1. Because -1 index does not work with embedding layer, we change it to vocab size." ) self.log_warning_once_on_rank0_worker0 = False return pad_id def tok_encode(self, input_sentence: str) -> Tensor: """Encodes a sentence into a tensor of token ids. Args: input_sentence: Input sentence to be tokenized. Returns: A tensor containing token indices. """ if getattr(self.opts, "text_tokenizer.sentence_piece.enable_nfc_normalization"): # normalize the text input_sentence = ftfy.fix_text(input_sentence, normalization="NFC") # tokenized sequence is returned as a list. tokenized_seq = self.sp_model.Encode(input_sentence) if getattr(self.opts, "text_tokenizer.sentence_piece.append_sot_token"): tokenized_seq = [self.sot_token_id] + tokenized_seq if getattr(self.opts, "text_tokenizer.sentence_piece.append_eot_token"): tokenized_seq = tokenized_seq + [self.eot_token_id] # convert a list into tensor tokenized_seq = torch.tensor(tokenized_seq, dtype=torch.long) return tokenized_seq def tok_decode(self, token_ids: Union[torch.Tensor, List[int]]) -> str: """Decodes token ids into a sentence. Args: token_ids: Token indices as a list of integers or a 1D integer tensor. Returns: A decoded sequence. """ if isinstance(token_ids, torch.Tensor): assert token_ids.dim() == 1 and token_ids.dtype in [ torch.int, torch.int64, torch.int32, torch.int8, ] token_ids = token_ids.numpy().tolist() assert isinstance(token_ids, list) and all( isinstance(x, int) for x in token_ids ) return self.sp_model.Decode(token_ids) ================================================ FILE: corenet/data/transforms/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.transforms.base_transforms import BaseTransformation from corenet.utils.registry import Registry TRANSFORMATIONS_REGISTRY = Registry( "transformation", base_class=BaseTransformation, lazy_load_dirs=["corenet/data/transforms"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_augmentation(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: # add arguments for base image projection layer parser = BaseTransformation.add_arguments(parser) # add augmentation specific arguments parser = TRANSFORMATIONS_REGISTRY.all_arguments(parser) return parser ================================================ FILE: corenet/data/transforms/audio.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math import pathlib import random from typing import Callable, Dict, List, Optional, Union import torch import torchaudio from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation from corenet.data.transforms.audio_aux import mfccs @TRANSFORMATIONS_REGISTRY.register(name="audio_gain", type="audio") class Gain(BaseTransformation): """ This class implements gain augmentation for audio. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) self.gain_levels = getattr(opts, "audio_augmentation.gain.levels") self.enable = getattr(opts, "audio_augmentation.gain.enable") self.share_clip_params = getattr( opts, "audio_augmentation.gain.share_clip_params" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--audio-augmentation.gain.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.gain.levels", type=float, default=[0], nargs="+", help="Gain levels to use for augmentation (in dB). Defaults to [0] (no gain).", ) group.add_argument( "--audio-augmentation.gain.share-clip-params", action="store_true", help="Pick the same gain levels for each clip in the batch if set True.", ) return parser def __call__(self, data: Dict) -> Dict: """ This function implements the gain transformation by scaling the input audio with a specific constant determined from the gain_levels Args: data: A dictionary containing {"samples": {"audio": @audio}}, where @audio is a tensor of shape [num_channels, sequence_length]. Returns: The modified dictionary with the augmented audio. """ if self.gain_levels == [0]: return data audio = data["samples"]["audio"] if self.share_clip_params: gain_level = random.choice(self.gain_levels) data["samples"]["audio"] = 10.0 ** (gain_level / 20.0) * audio else: new_audio = torch.empty_like(audio) for i in range(audio.shape[0]): gain_level = random.choice(self.gain_levels) new_audio[i] = 10.0 ** (gain_level / 20.0) * audio[i] data["samples"]["audio"] = new_audio return data def __repr__(self) -> str: return "{}(gain_levels={}, enable={}, share_clip_parameters={})".format( self.__class__.__name__, self.gain_levels, self.enable, self.share_clip_parameters, ) @TRANSFORMATIONS_REGISTRY.register(name="audio_ambient_noise", type="audio") class Noise(BaseTransformation): """ This class implements ambient noise augmentation for audio. """ def __init__( self, opts: argparse.Namespace, is_training: bool = True, noise_files_dir: Optional[str] = None, *args, **kwargs, ) -> None: super().__init__(opts=opts) self.gain_levels = getattr(opts, "audio_augmentation.noise.levels") self.cache_size = getattr(opts, "audio_augmentation.noise.cache_size") self.refresh_freq = getattr(opts, "audio_augmentation.noise.refresh_freq") self.refresh_counter = self.refresh_freq self.noise_files_dir = noise_files_dir if self.noise_files_dir is None: self.noise_files_dir = getattr(opts, "audio_augmentation.noise.files_dir") self.noise_files = [] self.pointer = 0 if self.noise_files_dir is not None: self.noise_files = sorted( pathlib.Path(self.noise_files_dir).glob("**/*.wav") ) if is_training: random.shuffle(self.noise_files) self.noise_waves = self.load_noise_files(cache_size=self.cache_size) if len(self.noise_files) == 0: raise ValueError( "--audio-augmentation.noise.files-dir must be provided for this augmentation" ) self.enable = getattr(opts, "audio_augmentation.noise.enable") def load_noise_files(self, cache_size: int) -> List[torch.TensorType]: """ This method caches a list of noise files for on the fly augmentation. """ noise_waves = [] for i in range(cache_size): noise_wav_file = self.noise_files[self.pointer % len(self.noise_files)] self.pointer += 1 noise, sample_rate = torchaudio.load(str(noise_wav_file)) assert ( noise.dtype == torch.float32 ), f"Expected noise file {noise_wav_file} to decode to float32 audio, but got {noise.dtype}." noise_waves.append((noise, sample_rate)) return noise_waves @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--audio-augmentation.noise.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.noise.levels", type=float, default=[-100], nargs="+", help="Gain levels to use for noise augmentation (in dB). Defaults to " "[-100], means almost no augmentation (10^-5 noise signal).", ) group.add_argument( "--audio-augmentation.noise.cache-size", type=int, default=10, help="Number of augmentation noises to cache. Defaults to 10.", ) group.add_argument( "--audio-augmentation.noise.files-dir", type=str, default=None, help="Directory path that stores the noise files to be added. Defaults to None.", ) group.add_argument( "--audio-augmentation.noise.refresh-freq", type=int, default=0, help="Frequency to refresh noise files (default 0 means never refresh).", ) return parser def __call__(self, data: Dict) -> Dict: """ This function adds a random noise sample selected from the noise samples provided in the noise directory scaled by a random gain. The sample should contain floating-point values in [-1, 1]. Args: data: A dictionary containing {"samples": {"audio": @audio}}, where @audio is a tensor of shape [num_channels, sequence_length]. Returns: The modified dictionary with the augmented audio. """ audio = data["samples"]["audio"] assert audio.shape[0] in [1, 2] gain_level = random.choice(self.gain_levels) noise_wave, noise_fps = random.choice(self.noise_waves) # @noise_wave is in [num_channels, sequence_length] format. assert math.isclose(data["metadata"]["audio_fps"], noise_fps, rel_tol=1e-6) if noise_wave.shape[-1] >= audio.shape[-1]: random_start_point = random.randint( 0, noise_wave.shape[-1] - audio.shape[-1] ) noise_wave = noise_wave[ :, random_start_point : random_start_point + audio.shape[-1] ] else: noise_wave = torch.nn.functional.pad( noise_wave.unsqueeze(0), (0, audio.shape[-1] - noise_wave.shape[-1]), mode="circular", ) # @noise_wave is in [1, num_channels, sequence_length] format. noise_wave = noise_wave[0] augmented_audio = audio + 10.0 ** (gain_level / 20.0) * noise_wave data["samples"]["audio"] = augmented_audio self.refresh_counter -= 1 if ( self.refresh_counter <= 0 and self.refresh_freq > 0 and self.noise_files_dir is not None ): # Refresh cache when met refresh criteria. self.noise_waves = self.load_noise_files(self.cache_size) self.refresh_counter = self.refresh_freq return data def __repr__(self) -> str: return "{}(gain_levels={}, noise_files_dir={}, enable={})".format( self.__class__.__name__, self.gain_levels, self.noise_files_dir, self.enable, ) @TRANSFORMATIONS_REGISTRY.register(name="set_fixed_length", type="audio") class SetFixedLength(BaseTransformation): """Set the audio buffer to a fixed length.""" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.length = getattr(opts, "audio_augmentation.set_fixed_length.length") self.enable = getattr(opts, "audio_augmentation.set_fixed_length.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.set-fixed-length.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.set-fixed-length.length", default=16000, type=int, help="Length to which to trim or pad the audio buffer. Defaults to 16000.", ) return parser def __call__( self, data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]], *args, **kwargs, ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]: """ Apply the transformation to the input data. Input data must have {"samples": {"audio": torch.Tensor}}. The audio must be [C, N] in shape, where C is the number of channels, and N is the number of samples. Returns: The transformed batch. """ audio = data["samples"]["audio"] if not audio.shape[0] in (1, 2): raise ValueError(f"Expected channels first. Got audio shape {audio.shape}") if audio.shape[1] < self.length: audio = torch.nn.functional.pad(audio, (0, self.length - audio.shape[1])) else: audio = audio[:, 0 : self.length] data["samples"]["audio"] = audio return data def __repr__(self) -> str: return f"{self.__class__.__name__}(length={self.length}, enable={self.enable})" @TRANSFORMATIONS_REGISTRY.register(name="roll", type="audio") class Roll(BaseTransformation): """Perform a roll augmentation by shifting the window in a circular manner.""" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.window = getattr(opts, "audio_augmentation.roll.window") self.enable = getattr(opts, "audio_augmentation.roll.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.roll.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.roll.window", default=0.1, type=float, help="Maximum fraction of the audio buffer to move. Defaults to 0.1.", ) return parser def __call__( self, data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]], *args, **kwargs, ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]: """ Apply the transformation to the input data. Input data must have {"samples": {"audio": torch.Tensor}}. The audio must be [C, N] in shape, where C is the number of channels, and N is the number of samples. Returns: The transformed batch. """ audio = data["samples"]["audio"] C, N = audio.shape if not C in (1, 2): raise ValueError(f"Unexpected number of channels {C}") audio = torch.roll( audio, torch.randint(-int(N * self.window), int(N * self.window), [1]).item(), 1, ) data["samples"]["audio"] = audio return data def __repr__(self) -> str: return f"{self.__class__.__name__}(window={self.window}, enable={self.enable})" @TRANSFORMATIONS_REGISTRY.register(name="mfccs", type="audio") class MFCCs(BaseTransformation): def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.num_mfccs = getattr(opts, "audio_augmentation.mfccs.num_mfccs") self.window_length = getattr(opts, "audio_augmentation.mfccs.window_length") self.num_frames = getattr(opts, "audio_augmentation.mfccs.num_frames") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.mfccs.num-mfccs", default=20, type=int, help="Number of MFCC features. Defaults to 20.", ) group.add_argument( "--audio-augmentation.mfccs.window-length", type=float, default=0.023, help="Window length (unit: seconds) for MFCC calculation. Defaults to 0.023.", ) group.add_argument( "--audio-augmentation.mfccs.num-frames", type=int, default=8, help="Number of sub-time-slice temporal components. This argument is used" " for splitting the temporal dimension of the spectrogram into frames." " Defaults to 8.", ) return parser def __call__(self, data: Dict, *args, **kwargs) -> Dict: """ Converts the audio signal of the samples to MFCC features. See the documentation of @corenet.modeling.misc.get_mfcc_features for further details. Args: { "samples": { "audio": torch.FloatTensor[num_clips x temporal_size x num_channels] "metadata": { "audio_fps": float } } }, Returns: { "samples": { "audio": torch.FloatTensor[num_clips, C, num_mfccs, num_frames, ceil(spectrogram_length/num_frames)] } } """ audio_fps = data["samples"]["metadata"]["audio_fps"] audio_image = mfccs.get_mfcc_features( data["samples"]["audio"], sampling_rate=audio_fps, num_mfccs=self.num_mfccs, window_length=self.window_length, num_frames=self.num_frames, ).detach() data["samples"]["audio"] = audio_image return data def __repr__(self) -> str: return ( f"{self.__class__.__name__}(num_mfccs={self.num_mfccs},window_length=" f"{self.window_length}, num_frames={self.num_frames})" ) class LambdaAudio(BaseTransformation): """ Similar to @torchvision.transforms.Lambda, applies a user-defined lambda on the audio samples as a transform. """ def __init__( self, opts: argparse.Namespace, func: Callable[[torch.Tensor], torch.Tensor], *args, **kwargs, ) -> None: self.func = func super(LambdaAudio, self).__init__(opts, *args, **kwargs) def __call__(self, data: Dict, *args, **kwargs) -> Dict: data["samples"]["audio"] = self.func(data["samples"]["audio"]) return data @TRANSFORMATIONS_REGISTRY.register(name="audio-resample", type="audio") class AudioResample(BaseTransformation): """Resample audio to a specified framerate.""" @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> None: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.audio-resample.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.audio-resample.audio-fps", default=16000, type=int, help="Frames per second in the incoming audio stream. Defaults to 16000.", ) return parser def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.sample_rate = getattr(opts, "audio_augmentation.audio_resample.audio_fps") self.effects = [["rate", str(self.sample_rate)]] self.enable = getattr(opts, "audio_augmentation.audio_resample.enable") def __call__(self, data: Dict, *args, **kwargs) -> Dict: """Reample audio to the specified audio fps. Args: data: A dict of data input in the following format: { "samples": { "audio": torch.FloatTensor[num_clips x temporal_size x num_channels] "metadata": { "audio_fps": float } } }, Returns: { "samples": { "audio": torch.FloatTensor[num_clips x temporal_size x num_channels] "metadata": { "audio_fps": float } } } """ audio = data["samples"]["audio"] audio_rate = data["samples"]["metadata"]["audio_fps"] resampled_audio = [] for audio_tensor in audio: ( resampled_audio_tensor, sample_rate, ) = torchaudio.sox_effects.apply_effects_tensor( audio_tensor, audio_rate, self.effects, channels_first=False ) resampled_audio.append(resampled_audio_tensor) data["samples"]["audio"] = torch.stack(resampled_audio, dim=0) data["samples"]["metadata"]["audio_fps"] = self.sample_rate return data def __repr__(self) -> str: return f"{self.__class__.__name__}(sample_rate={self.sample_rate}, enable={self.enable})" @TRANSFORMATIONS_REGISTRY.register(name="standardize_channels", type="audio") class StandardizeChannels(BaseTransformation): def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: self.num_channels = getattr( opts, "audio_augmentation.standardize_channels.num_channels" ) self.enable = getattr(opts, "audio_augmentation.standardize_channels.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.standardize-channels.num-channels", default=2, type=int, help="Number of output audio channels. Defaults to 2.", ) group.add_argument( "--audio-augmentation.standardize-channels.enable", default=False, action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) return parser def __call__(self, data: Dict, *args, **kwargs) -> Dict: """Ensures all audio samples have a specific number of channels. To reduce the number of audio channels from 2 to 1, the average values of the two channels is used. Args: data (Dict): { "samples": { "audio": Tensor[N,T,C] where N is the number of audio clips, T is the audio sequence length, and C is the number of channels. } } Tensor shape abbreviations: N: Number of clips. T, T_audio, T_video: Temporal lengths. C: Number of color channels. H, W: Height, Width. Returns: Dict: _description_ """ if not self.enable: return data audio = data["samples"]["audio"] # N, T, C assert audio.ndim == 3, f"Invalid audio dimension {audio.ndim}. Expected 3." num_input_channels = audio.shape[2] if num_input_channels == self.num_channels: return data if (num_input_channels, self.num_channels) == (1, 2): audio = audio.repeat(1, 1, 2) # N, T, 2 elif (num_input_channels, self.num_channels) == (2, 1): audio = audio.mean(dim=2, keepdim=True) # N, T, 1 else: raise NotImplementedError( f"The logic for standardizing audio channels with input shape of" f" {audio.shape} to {self.num_channels} channels is not implemented." ) data["samples"]["audio"] = audio return data def __repr__(self) -> str: return f"{self.__class__.__name__}(num_channels={self.num_channels}, enable={self.enable})" @TRANSFORMATIONS_REGISTRY.register(name="gaussian-audio-noise", type="audio") class GaussianAudioNoise(BaseTransformation): """Add Gaussian audio noise with a standard deviation randomly chosen from a user-specified range.""" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: self._min_scale, self._max_scale = getattr( opts, "audio_augmentation.gaussian_noise.audio_noise_scale_range" ) self.enable = getattr(opts, "audio_augmentation.gaussian_noise.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> None: group = parser.add_argument_group(cls.__name__) group.add_argument( "--audio-augmentation.gaussian-noise.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.gaussian-noise.audio-noise-scale-range", type=float, nargs=2, default=(0.000, 0.005), help="The standard deviation of the noise will be between the high " "and low end of this scale. Defaults to (0.000, 0.005)", ) return parser def __call__(self, data: Dict, *args, **kwargs) -> Dict: """Applies gaussian noise between specified limits to the input audio signal Args: data (Dict): { "samples": { "audio": Tensor[num_clips, num_frames, num_channels] } } Returns: data (Dict): { "samples": { "audio": Tensor[num_clips, num_frames, num_channels] } } """ scale = random.uniform(self._min_scale, self._max_scale) noise = torch.randn_like(data["samples"]["audio"]) * scale data["samples"]["audio"] += noise return data def __repr__(self) -> str: return ( f"{self.__class__.__name__}(noise scale={self._min_scale}-" f"{self._max_scale}, enable={self.enable})" ) ================================================ FILE: corenet/data/transforms/audio_aux/__init__.py ================================================ ================================================ FILE: corenet/data/transforms/audio_aux/mfccs.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math import torch from corenet.utils import logger def get_mfccs( data: torch.Tensor, sampling_rate: float, num_mfccs: int, window_length: float = 0.023, ) -> torch.Tensor: """Get Mel Frequency Cepstral Coefficients from an audio signal. Explanation of Mel-Frequency Cepstral Coefficients (MFCCs): > https://librosa.org/doc/main/generated/librosa.stft.html#librosa.stft Args: data: one channel of the audio signal, as a 1-D tensor. sampling_rate: the sampling rate of the audio. num_mfccs: the number of cepstral coefficients to use. window_length: the window length used for computing the spectrogram. By default, we choose 23ms, which is a good value for human speech. """ try: from torchaudio.transforms import ( MFCC, # Importing torchaudio takes ~0.6 s, but often not needed. That's why it is imported inside this function. ) except ImportError: logger.error("Torchaudio is not installed. Please install it.") n_fft = sampling_rate * window_length # Round to the nearest power of 2. n_fft = 2 ** round(math.log2(n_fft)) return MFCC( sample_rate=sampling_rate, n_mfcc=num_mfccs, melkwargs={ "n_fft": n_fft, # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/filters.py#L132 "n_mels": 128, # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/feature/spectral.py#L2027 "hop_length": 512, "mel_scale": "slaney", # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/filters.py#L136 "norm": "slaney", }, )(data.float()) def calculate_mfccs( audio: torch.Tensor, sampling_rate: float, num_mfccs: int, window_length: float = 0.023, ) -> torch.Tensor: """Calculate MFCCs on a batch of data. Args: audio: the audio signal, in [batch_size, num_channels, temporal_size] order. sampling_rate: the sampling rate of the audio signal. num_mfccs: the number of coefficients to use. window_length: the window length used for computing the spectrogram. By default, we choose 23ms, which is a good value for human speech. """ if audio.dim() != 3: raise ValueError(f"Expected 3 dimensions, got {audio.dim()}") spectrogram_length = get_mfccs( audio[0][0], sampling_rate, num_mfccs, window_length=window_length, ).shape[1] result = torch.empty( [audio.shape[0], audio.shape[1], num_mfccs, spectrogram_length], device=audio.device, dtype=audio.dtype, ) for i, element in enumerate(audio): for j, channel in enumerate(element): mfccs = get_mfccs( channel, sampling_rate, num_mfccs, window_length=window_length ) result[i, j] = mfccs return result def get_mfcc_features( audio: torch.Tensor, sampling_rate: float, num_mfccs: int, num_frames: int, window_length: float = 0.023, ) -> torch.Tensor: """Get MFCC features for a batch of audio data. Args: audio: the audio signal, in [batch_size, temporal_size, num_channels] order. sampling_rate: the sampling rate of the audio signal. num_mfccs: the number of coefficients to use. window_length: the window length used for computing the spectrogram. By default, we choose 23ms, which is a good value for human speech. num_frames: each MFCC spectrogram gets dividied into @num_frames frames (sub-time-slice temporal components) of length ceil(spectrogram_length/num_frames). Returns: MFCCs in [N, C, num_mfccs, num_frames, ceil(spectrogram_length/num_frames)] order. """ if audio.dim() != 3: raise ValueError(f"Invalid audio.dim()={audio.dim()}") if audio.shape[2] != 2: raise ValueError(f"Invalid number of channels {audio.shape[2]}") audio = audio.permute([0, 2, 1]) features = calculate_mfccs( audio, sampling_rate, num_mfccs, window_length=window_length, ) # Size: [N, C, num_mfccs, T]. return get_padded_features( features=features, num_frames=num_frames, ) def get_padded_features( features: torch.Tensor, num_frames: int, ) -> torch.Tensor: """ Splits the temporal dimension (of length T) of MFCC features into @num_frames sub-vectors (of length ``ceil(T/num_frames)``). As T may not be divisible by @num_frames, pads the temporal dimension if required. Args: features: Tensor[batchsize x C(num_audio_channels) x num_mfccs x T] num_frames: number of padded sub-vectors Returns: padded_features: Tensor (batchsize x C x num_mfccs x num_frames x ceil(T/num_frames)) """ N, C, num_mfccs, T = features.shape frame_length = math.ceil(T / num_frames) if T % num_frames != 0: padded_features = torch.zeros( [ N, C, num_mfccs, frame_length * num_frames, ], dtype=features.dtype, device=features.device, ) padded_features[:, :, :, :T] = features else: padded_features = features padded_features = padded_features.reshape(N, C, num_mfccs, num_frames, frame_length) return padded_features ================================================ FILE: corenet/data/transforms/audio_bytes.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import io import tempfile from typing import Dict, Union import numpy as np import torch import torchaudio from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation def _stream_to_wav(x: torch.Tensor, dtype: str, audio_fps: int, backend: str) -> bytes: """ Take in a tensor of audio values in [-1, 1] and save it as a wav file with values of the given @dtype. Args: x: a tensor of shape [N] or [C, N], where, C is the number of channels, and N is the number of samples. dtype: The data type to which @x should be converted before being saved. audio_fps: The audio framerate at which x should be stored. backend: The I/O backend to use for save the audio. Accepted values: sox, ffmpeg, soundfile. Returns: The bytes of the wav file. """ assert x.dtype == torch.float32 if dtype == "float32": pass elif dtype == "int32": x = x * (2**31 - 1) x = x.to(dtype=torch.int32) elif dtype == "int16": x = x * (2**15 - 1) x = x.to(dtype=torch.int16) elif dtype == "uint8": x = (x + 1) * (2**8 - 1) / 2 x = x.to(dtype=torch.uint8) if x.dim() == 1: x = x.reshape(1, -1) with tempfile.NamedTemporaryFile("rb+", suffix=".wav") as f: # The sox backend does not support writing to BytesIO. torchaudio.save(f.name, x, audio_fps, format="wav", backend=backend) byte_values = f.read() return byte_values @TRANSFORMATIONS_REGISTRY.register(name="torchaudio_save", type="audio") class TorchaudioSave(BaseTransformation): """ Encode audio with a supported file encoding. Args: opts: The global options. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.opts = opts self.encoding_dtype = getattr( self.opts, "audio_augmentation.torchaudio_save.encoding_dtype" ) self.format = getattr(self.opts, "audio_augmentation.torchaudio_save.format") self.backend = getattr(self.opts, "audio_augmentation.torchaudio_save.backend") def __call__( self, data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]] ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]: """ Serialize the input as file bytes. Args: data: A tensor of the form: { "samples": {"audio": tensor of shape [num_channels, sequence_length]}, "metadata": {"audio_fps": the audio framerate.} } Returns: The transformed data. """ x = data["samples"]["audio"] audio_fps = data["metadata"]["audio_fps"] if x.dim() == 2: # @x is [C, N] in shape. Convert to mono. if x.shape[0] in (1, 2): x = x.mean(dim=0) else: raise ValueError(f"Expected x.shape[0] to be 1 or 2, got {x.shape}") else: raise ValueError(f"Expected x.dim() == 2, got shape {x.shape}") if self.format == "wav": file_bytes = _stream_to_wav(x, self.encoding_dtype, audio_fps, self.backend) buf = np.frombuffer(file_bytes, dtype=np.uint8) # Convert to int32 so we can use negative values as padding. # The copy operation is required to avoid a warning about non-writable # tensors. buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32) data["samples"]["audio"] = buf elif self.format == "mp3": if x.dim() == 1: x = x.reshape(1, -1) with tempfile.NamedTemporaryFile("rb+", suffix=".mp3") as f: # The sox backend does not support writing to BytesIO. torchaudio.save(f.name, x, audio_fps, backend=self.backend) byte_values = f.read() buf = np.frombuffer(byte_values, dtype=np.uint8) # Convert to int32 so we can use negative values as padding. # The copy operation is required to avoid a warning about non-writable # tensors. buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32) data["samples"]["audio"] = buf else: raise NotImplementedError( f"Format {self.format} not implemented. Only 'wav' and 'mp3' are supported." ) return data def __repr__(self) -> str: return f"{self.__class__.__name__}()" @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--audio-augmentation.torchaudio-save.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--audio-augmentation.torchaudio-save.encoding-dtype", choices=("float32", "int32", "int16", "uint8"), help="The data type used in the audio encoding. Defaults to float32.", default="float32", ) group.add_argument( "--audio-augmentation.torchaudio-save.format", choices=("wav", "mp3"), default="wav", help="The format in which to save the audio. Defaults to wav.", ) group.add_argument( "--audio-augmentation.torchaudio-save.backend", choices=("ffmpeg", "sox", "soundfile"), default="sox", help=( "The I/O backend to use for save the audio. Defaults to sox, which was" " the default backend in the earlier torchaudio versions." ), ) return parser ================================================ FILE: corenet/data/transforms/base_transforms.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict class BaseTransformation(object): """ Base class for augmentation methods """ def __init__(self, opts, *args, **kwargs) -> None: self.opts = opts def __call__(self, data: Dict) -> Dict: raise NotImplementedError def __repr__(self) -> str: return "{}()".format(self.__class__.__name__) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: return parser ================================================ FILE: corenet/data/transforms/common.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, List from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation @TRANSFORMATIONS_REGISTRY.register(name="compose", type="common") class Compose(BaseTransformation): """ This method applies a list of transforms in a sequential fashion. """ def __init__(self, opts, img_transforms: List, *args, **kwargs) -> None: super().__init__(opts=opts) self.img_transforms = img_transforms def __call__(self, data: Dict) -> Dict: for t in self.img_transforms: data = t(data) return data def __repr__(self) -> str: transform_str = ", ".join("\n\t\t\t" + str(t) for t in self.img_transforms) repr_str = "{}({}\n\t\t)".format(self.__class__.__name__, transform_str) return repr_str @TRANSFORMATIONS_REGISTRY.register(name="identity", type="common") class Identity(BaseTransformation): """ This is a no-op transformation that returns its inputs unchanged. """ def __call__(self, data: Dict) -> Dict: return data def __repr__(self) -> str: return f"{self.__class__.__name__}()" ================================================ FILE: corenet/data/transforms/image_bytes.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import io from typing import Dict, Union import numpy as np import torch from PIL import Image from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation def _image_to_bytes(x: torch.Tensor, **kwargs) -> io.BytesIO: """ Take an image in [0, 1] and save it as file bytes using PIL. Args: x: an image tensor in [C, H, W] order, where C is the number of channels, and H, W are the height and width. kwargs: any keyword arguments that can be passed to PIL's Image.save(). Returns: The file bytes. """ assert x.min() >= 0 assert x.max() <= 1 x = (x * 255).byte().permute(1, 2, 0).cpu().numpy() # Bytes in H, W, C order img = Image.fromarray(x) byte_array = io.BytesIO() img.save(byte_array, **kwargs) return byte_array def _bytes_to_int32(byte_array: io.BytesIO) -> torch.Tensor: """ Convert a byte array to int32 values. Args: byte_array: The input byte array. Returns: The int32 tensor. """ buf = np.frombuffer(byte_array.getvalue(), dtype=np.uint8) # The copy operation is required to avoid a warning about non-writable # tensors. buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32) return buf @TRANSFORMATIONS_REGISTRY.register(name="pil_save", type="image_torch") class PILSave(BaseTransformation): """ Encode an image with a supported file encoding. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.file_encoding = getattr(opts, "image_augmentation.pil_save.file_encoding") self.quality = getattr(opts, "image_augmentation.pil_save.quality") self.opts = opts def __call__( self, data: Dict[str, Union[torch.Tensor, int]] ) -> Dict[str, Union[torch.Tensor, int]]: """ Serialize an image as file bytes. Args: data: A dictionary containing a key called "samples", which contains an image tensor of shape [C, H, W]. Returns: The transformed data. """ x = data["samples"] if self.file_encoding == "fCHW": x = (x * 255).byte().to(dtype=torch.int32).reshape(-1) elif self.file_encoding == "fHWC": x = (x * 255).byte().to(dtype=torch.int32).permute(1, 2, 0).reshape(-1) elif self.file_encoding == "TIFF": x = _bytes_to_int32(_image_to_bytes(x, format="tiff")) elif self.file_encoding == "PNG": x = _bytes_to_int32(_image_to_bytes(x, format="png", compress_level=0)) elif self.file_encoding == "JPEG": quality = getattr(self.opts, "image_augmentation.pil_save.quality") x = _bytes_to_int32(_image_to_bytes(x, format="jpeg", quality=quality)) else: raise NotImplementedError( f"Invalid file encoding {self.file_encoding}. Expected one of 'fCHW, fHWC, TIFF, PNG, JPEG'." ) data["samples"] = x return data def __repr__(self) -> str: return f"{self.__class__.__name__}(file_encoding={self.file_encoding}, quality={self.quality})" @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.pil-save.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.pil-save.file-encoding", choices=("fCHW", "fHWC", "TIFF", "PNG", "JPEG"), help="The type of file encoding to use. Defaults to TIFF.", default="TIFF", ) group.add_argument( "--image-augmentation.pil-save.quality", help="JPEG quality if using JPEG encoding. Defaults to 100.", type=int, default=100, ) return parser @TRANSFORMATIONS_REGISTRY.register(name="shuffle_bytes", type="image_torch") class ShuffleBytes(BaseTransformation): """ Reorder the bytes in a 1-dimensional buffer. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.mode = getattr(opts, "image_augmentation.shuffle_bytes.mode") self.stride = getattr(opts, "image_augmentation.shuffle_bytes.stride") window_size = getattr(opts, "image_augmentation.shuffle_bytes.window_size") self.window_shuffle = torch.randperm(window_size) def __call__( self, data: Dict[str, Union[torch.Tensor, int]] ) -> Dict[str, Union[torch.Tensor, int]]: """ Reorder the bytes of a 1-dimensional buffer. Args: data: A dictionary containing a key called "samples", which contains a tensor of shape [N], where N is the number of bytes. Returns: The transformed data. """ x = data["samples"] if not x.dim() == 1: raise ValueError(f"Expected 1d input, got {x.shape}") if self.mode == "reverse": x = torch.fliplr(x.view(1, -1))[0] elif self.mode == "random_shuffle": x = x[torch.randperm(x.shape[0])] elif self.mode == "cyclic_half_length": x = torch.roll(x, x.shape[0] // 2) elif self.mode == "stride": l = len(x) values = [] for i in range(self.stride): values.append(x[i :: self.stride]) x = torch.cat(values, dim=0) assert len(x) == l elif self.mode == "window_shuffle": l = len(x) window_size = self.window_shuffle.shape[0] num_windows = l // window_size values = [] for i in range(num_windows): chunk = x[i * window_size : (i + 1) * window_size] values.append(chunk[self.window_shuffle]) # Add the last bits that fall outside the shuffling window. values.append(x[num_windows * window_size :]) x = torch.cat(values, dim=0) assert len(x) == l else: raise NotImplementedError( f"mode={self.mode} not implemented. Expected one of 'reverse, random_shuffle, cyclic_half_length, stride, window_shuffle'." ) data["samples"] = x return data @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.shuffle-bytes.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.shuffle-bytes.mode", default="reverse", help="The mode to use when shuffling bytes. Defaults to 'reverse'.", choices=( "reverse", "random_shuffle", "cyclic_half_length", "stride", "window_shuffle", ), ) group.add_argument( "--image-augmentation.shuffle-bytes.stride", type=int, default=1024, help="The stride of the window used in shuffling operations that are windowed. Defaults to 1024.", ) group.add_argument( "--image-augmentation.shuffle-bytes.window-size", type=int, default=1024, help="The size of the window used in shuffling operations that are windowed. Defaults to 1024.", ) return parser @TRANSFORMATIONS_REGISTRY.register(name="mask_positions", type="image_torch") class MaskPositions(BaseTransformation): """ Mask out values in a 1-dimensional buffer using a fixed masking pattern. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.keep_frac = getattr(opts, "image_augmentation.mask_positions.keep_frac") self._cached_masks = None def _generate_masks(self, N: int) -> torch.Tensor: if self._cached_masks is None: g = torch.Generator() # We want to fix the mask across all inputs, so we fix the seed. # Choose a seed with a good balance of 0 and 1 bits. See: # https://pytorch.org/docs/stable/generated/torch.Generator.html#torch.Generator.manual_seed g.manual_seed(2147483647) random_mask = torch.zeros([N], requires_grad=False, dtype=torch.bool) random_mask[torch.randperm(N, generator=g)[: int(self.keep_frac * N)]] = 1 self._cached_masks = random_mask return self._cached_masks def __call__( self, data: Dict[str, Union[torch.Tensor, int]] ) -> Dict[str, Union[torch.Tensor, int]]: """ Mask values in a 1-dimensional buffer with a fixed masking pattern. Args: data: A dictionary containing a key called "samples", which contains a tensor of shape [N], where N is the number of bytes. Returns: The transformed data. """ x = data["samples"] mask = self._generate_masks(x.shape[0]) x = x[mask] data["samples"] = x return data @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.mask-positions.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.mask-positions.keep-frac", type=float, default=0.5, help="The fraction of bytes to keep. Defaults to 0.5.", ) return parser @TRANSFORMATIONS_REGISTRY.register(name="byte_permutation", type="image_torch") class BytePermutation(BaseTransformation): """ Remap byte values in [0, 255] to new values in [0, 255] using a permutation. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) g = torch.Generator() g.manual_seed(2147483647) self.mask = torch.randperm(256, generator=g) def __call__( self, data: Dict[str, Union[torch.Tensor, int]] ) -> Dict[str, Union[torch.Tensor, int]]: """ Remap byte values in [0, 255] to new values in [0, 255] using a permutation. Args: data: A dictionary containing a key called "samples", which contains a tensor of shape [N], where N is the number of bytes. Returns: The transformed data. """ x = data["samples"] if x.dim() != 1: raise ValueError(f"Expected 1d tensor. Got {x.shape}.") x = torch.index_select(self.mask, dim=0, index=x) data["samples"] = x return data @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.byte-permutation.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) return parser @TRANSFORMATIONS_REGISTRY.register(name="random_uniform", type="image_torch") class RandomUniformNoise(BaseTransformation): """ Add random uniform noise to integer values. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) self.opts = opts self.width_range = getattr( opts, "image_augmentation.random_uniform.width_range" ) def __call__( self, data: Dict[str, Union[torch.Tensor, int]] ) -> Dict[str, Union[torch.Tensor, int]]: """ Add random uniform noise to byte values. Args: data: A dict containing a tensor in its "samples" key. The tensor contains integers representing byte values. Integers are used because negative padding values may be added later. The shape of the tenor is [N], where N is the number of bytes. Returns: The transformed data. """ x = data["samples"] noise = torch.randint_like(x, self.width_range[0], self.width_range[1] + 1) dtype = x.dtype x = x.int() x = x + noise x = x % 256 x = x.to(dtype) data["samples"] = x return data @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-uniform.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-uniform.width-range", type=int, nargs=2, default=[-5, 5], help="The range of values from which to add noise. It is specified" " as [low, high] (inclusive). Defaults to [-5, 5].", ) return parser ================================================ FILE: corenet/data/transforms/image_pil.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import math import random from typing import Dict, List, Optional, Sequence, Tuple, Union import numpy as np import torch from PIL import Image, ImageFilter from torchvision import transforms as T from torchvision.transforms import functional as F from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation from corenet.data.transforms.utils import jaccard_numpy, setup_size from corenet.options.parse_args import JsonValidator from corenet.utils import logger INTERPOLATION_MODE_MAP = { "nearest": T.InterpolationMode.NEAREST, "bilinear": T.InterpolationMode.BILINEAR, "bicubic": T.InterpolationMode.BICUBIC, "cubic": T.InterpolationMode.BICUBIC, "box": T.InterpolationMode.BOX, "hamming": T.InterpolationMode.HAMMING, "lanczos": T.InterpolationMode.LANCZOS, } def _interpolation_modes_from_str(name: str) -> T.InterpolationMode: return INTERPOLATION_MODE_MAP[name] def _crop_fn(data: Dict, top: int, left: int, height: int, width: int) -> Dict: """Helper function for cropping""" img = data["image"] data["image"] = F.crop(img, top=top, left=left, height=height, width=width) if "mask" in data: mask = data.pop("mask") data["mask"] = F.crop(mask, top=top, left=left, height=height, width=width) if "box_coordinates" in data: boxes = data.pop("box_coordinates") area_before_cropping = (boxes[..., 2] - boxes[..., 0]) * ( boxes[..., 3] - boxes[..., 1] ) boxes[..., 0::2] = np.clip(boxes[..., 0::2] - left, a_min=0, a_max=left + width) boxes[..., 1::2] = np.clip(boxes[..., 1::2] - top, a_min=0, a_max=top + height) area_after_cropping = (boxes[..., 2] - boxes[..., 0]) * ( boxes[..., 3] - boxes[..., 1] ) area_ratio = area_after_cropping / (area_before_cropping + 1) # keep the boxes whose area is atleast 20% of the area before cropping keep = area_ratio >= 0.2 box_labels = data.pop("box_labels") data["box_coordinates"] = boxes[keep] data["box_labels"] = box_labels[keep] if "instance_mask" in data: assert "instance_coords" in data instance_masks = data.pop("instance_mask") data["instance_mask"] = F.crop( instance_masks, top=top, left=left, height=height, width=width ) instance_coords = data.pop("instance_coords") instance_coords[..., 0::2] = np.clip( instance_coords[..., 0::2] - left, a_min=0, a_max=left + width ) instance_coords[..., 1::2] = np.clip( instance_coords[..., 1::2] - top, a_min=0, a_max=top + height ) data["instance_coords"] = instance_coords return data def _resize_fn( data: Dict, size: Union[Sequence, int], interpolation: Optional[Union[T.InterpolationMode, str]] = T.InterpolationMode.BILINEAR, ) -> Dict: """Helper function for resizing""" img = data["image"] w, h = F.get_image_size(img) if isinstance(size, Sequence) and len(size) == 2: size_h, size_w = size[0], size[1] elif isinstance(size, int): if (w <= h and w == size) or (h <= w and h == size): return data if w < h: size_h = int(size * h / w) size_w = size else: size_w = int(size * w / h) size_h = size else: raise TypeError( "Supported size args are int or tuple of length 2. Got inappropriate size arg: {}".format( size ) ) if isinstance(interpolation, str): interpolation = _interpolation_modes_from_str(name=interpolation) data["image"] = F.resize( img=img, size=[size_h, size_w], interpolation=interpolation ) if "mask" in data: mask = data.pop("mask") # mask can be a PIL or Tensor. # Especially for Mask-RCNN, we may have tensors with first dimension as 0. # In that case, resize, won't work. # A workaround is that we check for the instance of a Tensor and then check its dimension. if isinstance(mask, torch.Tensor) and mask.shape[0] == 0: # It's empty tensor. resized_mask = torch.zeros( [0, size_h, size_w], dtype=mask.dtype, device=mask.device ) else: resized_mask = F.resize( img=mask, size=[size_h, size_w], interpolation=T.InterpolationMode.NEAREST, ) data["mask"] = resized_mask if "box_coordinates" in data: boxes = data.pop("box_coordinates") boxes[:, 0::2] *= 1.0 * size_w / w boxes[:, 1::2] *= 1.0 * size_h / h data["box_coordinates"] = boxes if "instance_mask" in data: assert "instance_coords" in data instance_masks = data.pop("instance_mask") resized_instance_masks = F.resize( img=instance_masks, size=[size_h, size_w], interpolation=T.InterpolationMode.NEAREST, ) data["instance_mask"] = resized_instance_masks instance_coords = data.pop("instance_coords") instance_coords = instance_coords.astype(np.float32) instance_coords[..., 0::2] *= 1.0 * size_w / w instance_coords[..., 1::2] *= 1.0 * size_h / h data["instance_coords"] = instance_coords return data def _pad_fn( data: Dict, padding: Union[int, Sequence], fill: Optional[int] = 0, padding_mode: Optional[str] = "constant", ) -> Dict: # Taken from the functional_tensor.py pad if isinstance(padding, int): pad_left = pad_right = pad_top = pad_bottom = padding elif len(padding) == 1: pad_left = pad_right = pad_top = pad_bottom = padding[0] elif len(padding) == 2: pad_left = pad_right = padding[0] pad_top = pad_bottom = padding[1] else: pad_left = padding[0] pad_top = padding[1] pad_right = padding[2] pad_bottom = padding[3] padding = [pad_left, pad_top, pad_right, pad_bottom] data["image"] = F.pad(data.pop("image"), padding, fill, padding_mode) if "mask" in data: data["mask"] = F.pad(data.pop("mask"), padding, 0, "constant") if "box_coordinates" in data: # labels remain unchanged boxes = data.pop("box_coordinates") boxes[:, 0::2] += pad_left boxes[:, 1::2] += pad_top data["box_coordinates"] = boxes return data @TRANSFORMATIONS_REGISTRY.register(name="fixed_size_crop", type="image_pil") class FixedSizeCrop(BaseTransformation): def __init__( self, opts, size: Optional[Union[int, Tuple[int, int]]] = None, *args, **kwargs ): super().__init__(opts, *args, **kwargs) # size can be passed as an argument or using config. # The argument is useful when implementing variable samplers if size is None: size = getattr(opts, "image_augmentation.fixed_size_crop.size", None) fill = getattr(opts, "image_augmentation.fixed_size_crop.fill", 0) padding_mode = getattr( opts, "image_augmentation.fixed_size_crop.padding_mode", "constant" ) size = setup_size( size, error_msg="Please provide either int or (int, int) for size in {}.".format( self.__class__.__name__ ), ) self.crop_height = size[0] self.crop_width = size[1] self.fill = fill self.padding_mode = padding_mode @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.fixed-size-crop.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.fixed-size-crop.size", type=int, nargs="+", default=None, help="Image size either as an int or (int, int).", ) group.add_argument( "--image-augmentation.fixed-size-crop.fill", type=int, default=0, help="Fill value to be used during padding operation. Defaults to 0.", ) group.add_argument( "--image-augmentation.fixed-size-crop.padding-mode", type=str, default="constant", help="Padding modes. Defaults to constant", ) return parser def __call__(self, data: Dict, *args, **kwargs) -> Dict: img = data["image"] width, height = F.get_image_size(img) new_height = min(height, self.crop_height) new_width = min(width, self.crop_width) if new_height != height or new_width != width: offset_height = max(height - self.crop_height, 0) offset_width = max(width - self.crop_width, 0) r = random.random() top = int(offset_height * r) left = int(offset_width * r) data = _crop_fn( data, top=top, left=left, height=new_height, width=new_width ) pad_bottom = max(self.crop_height - new_height, 0) pad_right = max(self.crop_width - new_width, 0) if pad_bottom != 0 or pad_right != 0: data = _pad_fn( data, padding=[0, 0, pad_right, pad_bottom], fill=self.fill, padding_mode=self.padding_mode, ) return data def __repr__(self): return "{}(crop_size=({}, {}), fill={}, padding_mode={})".format( self.__class__.__name__, self.crop_height, self.crop_width, self.fill, self.padding_mode, ) @TRANSFORMATIONS_REGISTRY.register(name="scale_jitter", type="image_pil") class ScaleJitter(BaseTransformation): """Randomly resizes the input within the scale range""" def __init__(self, opts, *args, **kwargs) -> None: target_size = getattr(opts, "image_augmentation.scale_jitter.target_size", None) if target_size is None: logger.error( "Target size can't be None in {}.".format(self.__class__.__name__) ) target_size = setup_size( target_size, error_msg="Need either an int or (int, int) for target size in {}".format( self.__class__.__name__ ), ) scale_range = getattr(opts, "image_augmentation.scale_jitter.scale_range", None) if scale_range is None: logger.error( "Scale range can't be None in {}".format(self.__class__.__name__) ) if isinstance(scale_range, Sequence) and len(scale_range) == 2: scale_range = scale_range else: logger.error( "Need (float, float) for target size in {}".format( self.__class__.__name__ ) ) if scale_range[0] > scale_range[1]: logger.error( "scale_range[1] >= scale_range[0] in {}. Got: {}".format( self.__class__.__name__, scale_range[1], scale_range[0] ) ) interpolation = getattr( opts, "image_augmentation.scale_jitter.interpolation", "bilinear" ) if isinstance(interpolation, str): interpolation = _interpolation_modes_from_str(name=interpolation) super().__init__(opts, *args, **kwargs) self.target_size = target_size self.scale_range = scale_range self.interpolation = interpolation @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.scale-jitter.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.scale-jitter.interpolation", type=str, default="bilinear", help="Interpolation method. Defaults to bilinear interpolation", ) group.add_argument( "--image-augmentation.scale-jitter.target-size", type=int, nargs="+", default=None, help="Target image size either as an int or (int, int).", ) group.add_argument( "--image-augmentation.scale-jitter.scale-range", type=float, nargs="+", default=None, help="Scale range as (float, float).", ) return parser def __call__(self, data: Dict, *args, **kwargs) -> Dict: img = data["image"] orig_width, orig_height = F.get_image_size(img) scale = self.scale_range[0] + random.random() * ( self.scale_range[1] - self.scale_range[0] ) r = ( min( self.target_size[1] / orig_height, self.target_size[0] / orig_width, ) * scale ) new_width = int(orig_width * r) new_height = int(orig_height * r) data = _resize_fn( data, size=(new_height, new_width), interpolation=self.interpolation ) return data def __repr__(self): return "{}(scale_range={}, target_size={}, interpolation={})".format( self.__class__.__name__, self.scale_range, self.target_size, self.interpolation, ) @TRANSFORMATIONS_REGISTRY.register(name="random_resized_crop", type="image_pil") class RandomResizedCrop(BaseTransformation, T.RandomResizedCrop): """ This class crops a random portion of an image and resize it to a given size. """ def __init__( self, opts: argparse.Namespace, size: Union[Sequence, int], *args, **kwargs ) -> None: interpolation = getattr( opts, "image_augmentation.random_resized_crop.interpolation" ) scale = getattr(opts, "image_augmentation.random_resized_crop.scale") ratio = getattr(opts, "image_augmentation.random_resized_crop.aspect_ratio") BaseTransformation.__init__(self, opts=opts) T.RandomResizedCrop.__init__( self, size=size, scale=scale, ratio=ratio, interpolation=interpolation, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-resized-crop.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-resized-crop.interpolation", type=str, default="bilinear", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Interpolation method for resizing. Defaults to bilinear.", ) group.add_argument( "--image-augmentation.random-resized-crop.scale", type=JsonValidator(Tuple[float, float]), default=(0.08, 1.0), help="Specifies the lower and upper bounds for the random area of the crop, before resizing." " The scale is defined with respect to the area of the original image. Defaults to " "(0.08, 1.0)", ) group.add_argument( "--image-augmentation.random-resized-crop.aspect-ratio", type=float or tuple, default=(3.0 / 4.0, 4.0 / 3.0), help="lower and upper bounds for the random aspect ratio of the crop, before resizing. " "Defaults to (3./4., 4./3.)", ) return parser def get_rrc_params(self, image: Image.Image) -> Tuple[int, int, int, int]: return T.RandomResizedCrop.get_params( img=image, scale=self.scale, ratio=self.ratio ) def __call__(self, data: Dict) -> Dict: """ Input data format: data: mapping of: { "image": [Height, Width, Channels], "mask": [Height, Width], "box_coordinates": [Num_boxes, x, y, w, h], "box_labels: : [Num_boxes], } Output data format: Same as the input """ img = data["image"] i, j, h, w = self.get_rrc_params(image=img) data = _crop_fn(data=data, top=i, left=j, height=h, width=w) return _resize_fn(data=data, size=self.size, interpolation=self.interpolation) def __repr__(self) -> str: return "{}(scale={}, ratio={}, size={}, interpolation={})".format( self.__class__.__name__, self.scale, self.ratio, self.size, self.interpolation, ) @TRANSFORMATIONS_REGISTRY.register(name="auto_augment", type="image_pil") class AutoAugment(BaseTransformation, T.AutoAugment): """ This class implements the `AutoAugment data augmentation `_ method. """ def __init__(self, opts, *args, **kwargs) -> None: policy_name = getattr( opts, "image_augmentation.auto_augment.policy", "imagenet" ) interpolation = getattr( opts, "image_augmentation.auto_augment.interpolation", "bilinear" ) if policy_name == "imagenet": policy = T.AutoAugmentPolicy.IMAGENET else: raise NotImplemented if isinstance(interpolation, str): interpolation = _interpolation_modes_from_str(name=interpolation) BaseTransformation.__init__(self, opts=opts) T.AutoAugment.__init__(self, policy=policy, interpolation=interpolation) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.auto-augment.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.auto-augment.policy", type=str, default="imagenet", help="Auto-augment policy name. Defaults to imagenet.", ) group.add_argument( "--image-augmentation.auto-augment.interpolation", type=str, default="bilinear", help="Auto-augment interpolation method. Defaults to bilinear interpolation", ) return parser def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data or "mask" in data or "instance_masks" in data: logger.error( "{} is only supported for classification tasks".format( self.__class__.__name__ ) ) img = data["image"] img = super().forward(img) data["image"] = img return data def __repr__(self) -> str: return "{}(policy={}, interpolation={})".format( self.__class__.__name__, self.policy, self.interpolation ) @TRANSFORMATIONS_REGISTRY.register(name="rand_augment", type="image_pil") class RandAugment(BaseTransformation, T.RandAugment): """ This class implements the `RandAugment data augmentation `_ method. """ def __init__(self, opts, *args, **kwargs) -> None: num_ops = getattr(opts, "image_augmentation.rand_augment.num_ops", 2) magnitude = getattr(opts, "image_augmentation.rand_augment.magnitude", 9) num_magnitude_bins = getattr( opts, "image_augmentation.rand_augment.num_magnitude_bins", 31 ) interpolation = getattr( opts, "image_augmentation.rand_augment.interpolation", "bilinear" ) BaseTransformation.__init__(self, opts=opts) if isinstance(interpolation, str): interpolation = _interpolation_modes_from_str(name=interpolation) T.RandAugment.__init__( self, num_ops=num_ops, magnitude=magnitude, num_magnitude_bins=num_magnitude_bins, interpolation=interpolation, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.rand-augment.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.rand-augment.num-ops", type=int, default=2, help="Number of augmentation transformations to apply sequentially. Defaults to 2.", ) group.add_argument( "--image-augmentation.rand-augment.magnitude", type=int, default=9, help="Magnitude for all the transformations. Defaults to 9", ) group.add_argument( "--image-augmentation.rand-augment.num-magnitude-bins", type=int, default=31, help="The number of different magnitude values. Defaults to 31.", ) group.add_argument( "--image-augmentation.rand-augment.interpolation", type=str, default="bilinear", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Desired interpolation method. Defaults to bilinear", ) return parser def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data or "mask" in data or "instance_masks" in data: logger.error( "{} is only supported for classification tasks".format( self.__class__.__name__ ) ) img = data["image"] img = super().forward(img) data["image"] = img return data def __repr__(self) -> str: return "{}(num_ops={}, magnitude={}, num_magnitude_bins={}, interpolation={})".format( self.__class__.__name__, self.num_ops, self.magnitude, self.num_magnitude_bins, self.interpolation, ) @TRANSFORMATIONS_REGISTRY.register(name="trivial_augment_wide", type="image_pil") class TrivialAugmentWide(BaseTransformation, T.TrivialAugmentWide): """ This class implements the `TrivialAugment (Wide) data augmentation `_ method. """ def __init__(self, opts, *args, **kwargs) -> None: num_magnitude_bins = getattr( opts, "image_augmentation.trivial_augment_wide.num_magnitude_bins", 31, ) interpolation = getattr( opts, "image_augmentation.trivial_augment_wide.interpolation", "bilinear", ) BaseTransformation.__init__(self, opts=opts) if isinstance(interpolation, str): interpolation = _interpolation_modes_from_str(name=interpolation) T.TrivialAugmentWide.__init__( self, num_magnitude_bins=num_magnitude_bins, interpolation=interpolation, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.trivial-augment-wide.enable", action="store_true", help="Use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.trivial-augment-wide.num-magnitude-bins", type=int, default=31, help="The number of different magnitude values. Defaults to 31.", ) group.add_argument( "--image-augmentation.trivial-augment-wide.interpolation", type=str, default="bilinear", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Desired interpolation method. Defaults to bilinear", ) return parser def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data or "mask" in data or "instance_masks" in data: logger.error( "{} is only supported for classification tasks".format( self.__class__.__name__ ) ) img = data["image"] img = super().forward(img) data["image"] = img return data def __repr__(self) -> str: return "{}(num_magnitude_bins={}, interpolation={})".format( self.__class__.__name__, self.num_magnitude_bins, self.interpolation, ) @TRANSFORMATIONS_REGISTRY.register(name="random_horizontal_flip", type="image_pil") class RandomHorizontalFlip(BaseTransformation): """ This class implements random horizontal flipping method """ def __init__(self, opts, *args, **kwargs) -> None: p = getattr(opts, "image_augmentation.random_horizontal_flip.p") super().__init__(opts=opts) self.p = p @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-horizontal-flip.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-horizontal-flip.p", type=float, default=0.5, help="Probability for applying random horizontal flip", ) return parser def __call__(self, data: Dict) -> Dict: if random.random() <= self.p: img = data["image"] width, height = F.get_image_size(img) data["image"] = F.hflip(img) if "mask" in data: mask = data.pop("mask") data["mask"] = F.hflip(mask) if "box_coordinates" in data: boxes = data.pop("box_coordinates") boxes[..., 0::2] = width - boxes[..., 2::-2] data["box_coordinates"] = boxes if "instance_mask" in data: assert "instance_coords" in data instance_coords = data.pop("instance_coords") instance_coords[..., 0::2] = width - instance_coords[..., 2::-2] data["instance_coords"] = instance_coords instance_masks = data.pop("instance_mask") data["instance_mask"] = F.hflip(instance_masks) return data def __repr__(self) -> str: return "{}(p={})".format(self.__class__.__name__, self.p) @TRANSFORMATIONS_REGISTRY.register(name="random_rotate", type="image_pil") class RandomRotate(BaseTransformation): """ This class implements random rotation method """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) self.angle = getattr(opts, "image_augmentation.random_rotate.angle", 10) self.mask_fill = getattr(opts, "image_augmentation.random_rotate.mask_fill", 0) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-rotate.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-rotate.angle", type=float, default=10, help="Angle for rotation. Defaults to 10. The angle is sampled " "uniformly from [-angle, angle]", ) group.add_argument( "--image-augmentation.random-rotate.mask-fill", default=0, help="Fill value for the segmentation mask. Defaults to 0.", ) return parser def __call__(self, data: Dict) -> Dict: data_keys = list(data.keys()) if "box_coordinates" in data_keys or "instance_mask" in data_keys: logger.error("{} supports only images and masks") rand_angle = random.uniform(-self.angle, self.angle) img = data.pop("image") data["image"] = F.rotate( img, angle=rand_angle, interpolation=F.InterpolationMode.BILINEAR, fill=0, ) if "mask" in data: mask = data.pop("mask") data["mask"] = F.rotate( mask, angle=rand_angle, interpolation=F.InterpolationMode.NEAREST, fill=self.mask_fill, ) return data def __repr__(self) -> str: return "{}(angle={}, mask_fill={})".format( self.__class__.__name__, self.angle, self.mask_fill ) @TRANSFORMATIONS_REGISTRY.register(name="resize", type="image_pil") class Resize(BaseTransformation): """ This class implements resizing operation. .. note:: Two possible modes for resizing. 1. Resize while maintaining aspect ratio. To enable this option, pass int as a size 2. Resize to a fixed size. To enable this option, pass a tuple of height and width as a size .. note:: If img_size is passed as a positional argument, then it will override size from args """ def __init__( self, opts, img_size: Optional[Union[Tuple[int, int], int]] = None, *args, **kwargs ) -> None: interpolation = getattr( opts, "image_augmentation.resize.interpolation", "bilinear" ) super().__init__(opts=opts) # img_size argument is useful for implementing multi-scale sampler size = ( getattr(opts, "image_augmentation.resize.size", None) if img_size is None else img_size ) if size is None: logger.error("Size can not be None in {}".format(self.__class__.__name__)) # Possible modes. # 1. Resize while maintaining aspect ratio. To enable this option, pass int as a size # 2. Resize to a fixed size. To enable this option, pass a tuple of height and width as a size if isinstance(size, Sequence) and len(size) == 1: # List with single integer size = size[0] elif isinstance(size, Sequence) and len(size) > 2: logger.error( "The length of size should be either 1 or 2 in {}. Got: {}".format( self.__class__.__name__, size ) ) if not (isinstance(size, Sequence) or isinstance(size, int)): logger.error( "Size needs to be either Tuple of length 2 or an integer in {}. Got: {}".format( self.__class__.__name__, size ) ) self.size = size self.interpolation = interpolation self.maintain_aspect_ratio = True if isinstance(size, int) else False @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.resize.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.resize.interpolation", type=str, default="bilinear", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Desired interpolation method for resizing. Defaults to bilinear", ) group.add_argument( "--image-augmentation.resize.size", type=int, nargs="+", default=256, help="Resize image to the specified size. If int is passed, then shorter side is resized" "to the specified size and longest side is resized while maintaining aspect ratio." "Defaults to None.", ) return parser def __call__(self, data: Dict) -> Dict: return _resize_fn(data, size=self.size, interpolation=self.interpolation) def __repr__(self) -> str: return "{}(size={}, interpolation={}, maintain_aspect_ratio={})".format( self.__class__.__name__, self.size, self.interpolation, self.maintain_aspect_ratio, ) @TRANSFORMATIONS_REGISTRY.register(name="center_crop", type="image_pil") class CenterCrop(BaseTransformation): """ This class implements center cropping method. .. note:: This class assumes that the input size is greater than or equal to the desired size. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) size = getattr(opts, "image_augmentation.center_crop.size", None) if size is None: logger.error("Size cannot be None in {}".format(self.__class__.__name__)) if isinstance(size, Sequence) and len(size) == 2: self.height, self.width = size[0], size[1] elif isinstance(size, Sequence) and len(size) == 1: self.height = self.width = size[0] elif isinstance(size, int): self.height = self.width = size else: logger.error("Scale should be either an int or tuple of ints") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.center-crop.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.center-crop.size", type=int, nargs="+", default=224, help="Center crop size. Defaults to None.", ) return parser def __call__(self, data: Dict) -> Dict: width, height = F.get_image_size(data["image"]) i = (height - self.height) // 2 j = (width - self.width) // 2 return _crop_fn(data=data, top=i, left=j, height=self.height, width=self.width) def __repr__(self) -> str: return "{}(size=(h={}, w={}))".format( self.__class__.__name__, self.height, self.width ) @TRANSFORMATIONS_REGISTRY.register(name="ssd_cropping", type="image_pil") class SSDCroping(BaseTransformation): """ This class implements cropping method for `Single shot object detector `_. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) self.iou_sample_opts = getattr( opts, "image_augmentation.ssd_crop.iou_thresholds", [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0], ) self.trials = getattr(opts, "image_augmentation.ssd_crop.n_trials", 40) self.min_aspect_ratio = getattr( opts, "image_augmentation.ssd_crop.min_aspect_ratio", 0.5 ) self.max_aspect_ratio = getattr( opts, "image_augmentation.ssd_crop.max_aspect_ratio", 2.0 ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.ssd-crop.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.ssd-crop.iou-thresholds", type=float, nargs="+", default=[0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0], help="IoU thresholds for SSD cropping. Defaults to [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]", ) group.add_argument( "--image-augmentation.ssd-crop.n-trials", type=int, default=40, help="Number of trials for SSD cropping. Defaults to 40", ) group.add_argument( "--image-augmentation.ssd-crop.min-aspect-ratio", type=float, default=0.5, help="Min. aspect ratio in SSD Cropping. Defaults to 0.5", ) group.add_argument( "--image-augmentation.ssd-crop.max-aspect-ratio", type=float, default=2.0, help="Max. aspect ratio in SSD Cropping. Defaults to 2.0", ) return parser def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data: boxes = data["box_coordinates"] # guard against no boxes if boxes.shape[0] == 0: return data image = data["image"] labels = data["box_labels"] width, height = F.get_image_size(image) while True: # randomly choose a mode min_jaccard_overalp = random.choice(self.iou_sample_opts) if min_jaccard_overalp == 0.0: return data for _ in range(self.trials): new_w = int(random.uniform(0.3 * width, width)) new_h = int(random.uniform(0.3 * height, height)) aspect_ratio = new_h / new_w if not ( self.min_aspect_ratio <= aspect_ratio <= self.max_aspect_ratio ): continue left = int(random.uniform(0, width - new_w)) top = int(random.uniform(0, height - new_h)) # convert to integer rect x1,y1,x2,y2 rect = np.array([left, top, left + new_w, top + new_h]) # calculate IoU (jaccard overlap) b/t the cropped and gt boxes ious = jaccard_numpy(boxes, rect) # is min and max overlap constraint satisfied? if not try again if ious.max() < min_jaccard_overalp: continue # keep overlap with gt box IF center in sampled patch centers = (boxes[:, :2] + boxes[:, 2:]) * 0.5 # mask in all gt boxes that above and to the left of centers m1 = (rect[0] < centers[:, 0]) * (rect[1] < centers[:, 1]) # mask in all gt boxes that under and to the right of centers m2 = (rect[2] > centers[:, 0]) * (rect[3] > centers[:, 1]) # mask in that both m1 and m2 are true mask = m1 * m2 # have any valid boxes? try again if not if not mask.any(): continue # if image size is too small, try again if (rect[3] - rect[1]) < 100 or (rect[2] - rect[0]) < 100: continue # cut the crop from the image image = F.crop(image, top=top, left=left, width=new_w, height=new_h) # take only matching gt boxes current_boxes = boxes[mask, :].copy() # take only matching gt labels current_labels = labels[mask] # should we use the box left and top corner or the crop's current_boxes[:, :2] = np.maximum(current_boxes[:, :2], rect[:2]) # adjust to crop (by subtracting crop's left,top) current_boxes[:, :2] -= rect[:2] current_boxes[:, 2:] = np.minimum(current_boxes[:, 2:], rect[2:]) # adjust to crop (by subtracting crop's left,top) current_boxes[:, 2:] -= rect[:2] data["image"] = image data["box_labels"] = current_labels data["box_coordinates"] = current_boxes if "mask" in data: mask = data.pop("mask") data["mask"] = F.crop( mask, top=top, left=left, width=new_w, height=new_h ) if "instance_mask" in data: assert "instance_coords" in data instance_masks = data.pop("instance_mask") data["instance_mask"] = F.crop( instance_masks, top=top, left=left, width=new_w, height=new_h, ) instance_coords = data.pop("instance_coords") # should we use the box left and top corner or the crop's instance_coords[..., :2] = np.maximum( instance_coords[..., :2], rect[:2] ) # adjust to crop (by subtracting crop's left,top) instance_coords[..., :2] -= rect[:2] instance_coords[..., 2:] = np.minimum( instance_coords[..., 2:], rect[2:] ) # adjust to crop (by subtracting crop's left,top) instance_coords[..., 2:] -= rect[:2] data["instance_coords"] = instance_coords return data return data @TRANSFORMATIONS_REGISTRY.register(name="photo_metric_distort", type="image_pil") class PhotometricDistort(BaseTransformation): """ This class implements Photometeric distorion. .. note:: Hyper-parameters of PhotoMetricDistort in PIL and OpenCV are different. Be careful """ def __init__(self, opts, *args, **kwargs) -> None: # contrast alpha_min = getattr( opts, "image_augmentation.photo_metric_distort.alpha_min", 0.5 ) alpha_max = getattr( opts, "image_augmentation.photo_metric_distort.alpha_max", 1.5 ) contrast = T.ColorJitter(contrast=[alpha_min, alpha_max]) # brightness beta_min = getattr( opts, "image_augmentation.photo_metric_distort.beta_min", 0.875 ) beta_max = getattr( opts, "image_augmentation.photo_metric_distort.beta_max", 1.125 ) brightness = T.ColorJitter(brightness=[beta_min, beta_max]) # saturation gamma_min = getattr( opts, "image_augmentation.photo_metric_distort.gamma_min", 0.5 ) gamma_max = getattr( opts, "image_augmentation.photo_metric_distort.gamma_max", 1.5 ) saturation = T.ColorJitter(saturation=[gamma_min, gamma_max]) # Hue delta_min = getattr( opts, "image_augmentation.photo_metric_distort.delta_min", -0.05 ) delta_max = getattr( opts, "image_augmentation.photo_metric_distort.delta_max", 0.05 ) hue = T.ColorJitter(hue=[delta_min, delta_max]) super().__init__(opts=opts) self._brightness = brightness self._contrast = contrast self._hue = hue self._saturation = saturation self.p = getattr(opts, "image_augmentation.photo_metric_distort.p", 0.5) def __repr__(self) -> str: return "{}(contrast={}, brightness={}, saturation={}, hue={})".format( self.__class__.__name__, self._contrast.contrast, self._brightness.brightness, self._saturation.saturation, self._hue.hue, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.photo-metric-distort.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.photo-metric-distort.alpha-min", type=float, default=0.5, help="Min. alpha value for contrast. Should be > 0. Defaults to 0.5", ) group.add_argument( "--image-augmentation.photo-metric-distort.alpha-max", type=float, default=1.5, help="Max. alpha value for contrast. Should be > 0. Defaults to 1.5", ) group.add_argument( "--image-augmentation.photo-metric-distort.beta-min", type=float, default=0.875, help="Min. beta value for brightness. Should be > 0. Defaults to 0.8", ) group.add_argument( "--image-augmentation.photo-metric-distort.beta-max", type=float, default=1.125, help="Max. beta value for brightness. Should be > 0. Defaults to 1.2", ) group.add_argument( "--image-augmentation.photo-metric-distort.gamma-min", type=float, default=0.5, help="Min. gamma value for saturation. Should be > 0. Defaults to 0.5", ) group.add_argument( "--image-augmentation.photo-metric-distort.gamma-max", type=float, default=1.5, help="Max. gamma value for saturation. Should be > 0. Defaults to 1.5", ) group.add_argument( "--image-augmentation.photo-metric-distort.delta-min", type=float, default=-0.05, help="Min. delta value for Hue. Should be between -1 and 1. Defaults to -0.05", ) group.add_argument( "--image-augmentation.photo-metric-distort.delta-max", type=float, default=0.05, help="Max. delta value for Hue. Should be between -1 and 1. Defaults to 0.05", ) group.add_argument( "--image-augmentation.photo-metric-distort.p", type=float, default=0.5, help="Probability for applying a distortion. Defaults to 0.5", ) return parser def _apply_transformations(self, image): r = np.random.rand(7) if r[0] < self.p: image = self._brightness(image) contrast_before = r[1] < self.p if contrast_before and r[2] < self.p: image = self._contrast(image) if r[3] < self.p: image = self._saturation(image) if r[4] < self.p: image = self._hue(image) if not contrast_before and r[5] < self.p: image = self._contrast(image) if r[6] < self.p and image.mode != "L": # Only permute channels for RGB images # [H, W, C] format image_np = np.asarray(image) n_channels = image_np.shape[2] image_np = image_np[..., np.random.permutation(range(n_channels))] image = Image.fromarray(image_np) return image def __call__(self, data: Dict) -> Dict: image = data.pop("image") data["image"] = self._apply_transformations(image) return data @TRANSFORMATIONS_REGISTRY.register(name="box_percent_coords", type="image_pil") class BoxPercentCoords(BaseTransformation): """ This class converts the box coordinates to percent """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data: boxes = data.pop("box_coordinates") image = data["image"] width, height = F.get_image_size(image) boxes = boxes.astype(np.float32) boxes[..., 0::2] /= width boxes[..., 1::2] /= height data["box_coordinates"] = boxes return data @TRANSFORMATIONS_REGISTRY.register(name="instance_processor", type="image_pil") class InstanceProcessor(BaseTransformation): """ This class processes the instance masks. """ def __init__( self, opts, instance_size: Optional[Union[int, Tuple[int, ...]]] = 16, *args, **kwargs ) -> None: super().__init__(opts=opts) self.instance_size = setup_size(instance_size) def __call__(self, data: Dict) -> Dict: if "instance_mask" in data: assert "instance_coords" in data instance_masks = data.pop("instance_mask") instance_coords = data.pop("instance_coords") instance_coords = instance_coords.astype(np.int) valid_boxes = (instance_coords[..., 3] > instance_coords[..., 1]) & ( instance_coords[..., 2] > instance_coords[..., 0] ) instance_masks = instance_masks[valid_boxes] instance_coords = instance_coords[valid_boxes] num_instances = instance_masks.shape[0] resized_instances = [] for i in range(num_instances): # format is [N, H, W] instance_m = instance_masks[i] box_coords = instance_coords[i] instance_m = F.crop( instance_m, top=box_coords[1], left=box_coords[0], height=box_coords[3] - box_coords[1], width=box_coords[2] - box_coords[0], ) # need to unsqueeze and squeeze to make F.resize work instance_m = F.resize( instance_m.unsqueeze(0), size=self.instance_size, interpolation=T.InterpolationMode.NEAREST, ).squeeze(0) resized_instances.append(instance_m) if len(resized_instances) == 0: resized_instances = torch.zeros( size=(1, self.instance_size[0], self.instance_size[1]), dtype=torch.long, ) instance_coords = np.array( [[0, 0, self.instance_size[0], self.instance_size[1]]] ) else: resized_instances = torch.stack(resized_instances, dim=0) data["instance_mask"] = resized_instances data["instance_coords"] = instance_coords.astype(np.float32) return data @TRANSFORMATIONS_REGISTRY.register(name="random_resize", type="image_pil") class RandomResize(BaseTransformation): """ This class implements random resizing method. """ def __init__(self, opts, *args, **kwargs) -> None: min_ratio = getattr(opts, "image_augmentation.random_resize.min_ratio", 0.5) max_ratio = getattr(opts, "image_augmentation.random_resize.max_ratio", 2.0) interpolation = getattr( opts, "image_augmentation.random_resize.interpolation", "bilinear" ) max_scale_long_edge = getattr( opts, "image_augmentation.random_resize.max_scale_long_edge", None ) max_scale_short_edge = getattr( opts, "image_augmentation.random_resize.max_scale_short_edge", None ) if max_scale_long_edge is None and max_scale_short_edge is not None: logger.warning( "max_scale_long_edge cannot be none when max_scale_short_edge is not None in {}. Setting both to " "None".format(self.__class__.__name__) ) max_scale_long_edge = None max_scale_short_edge = None elif max_scale_long_edge is not None and max_scale_short_edge is None: logger.warning( "max_scale_short_edge cannot be none when max_scale_long_edge is not None in {}. Setting both to " "None".format(self.__class__.__name__) ) max_scale_long_edge = None max_scale_short_edge = None super().__init__(opts=opts) self.min_ratio = min_ratio self.max_ratio = max_ratio self.max_scale_long_edge = max_scale_long_edge self.max_scale_short_edge = max_scale_short_edge self.interpolation = interpolation @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-resize.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-resize.max-scale-long-edge", type=int, default=None, help="Max. value along the longest edge. Defaults to None", ) group.add_argument( "--image-augmentation.random-resize.max-scale-short-edge", type=int, default=None, help="Max. value along the shortest edge. Defaults to None.", ) group.add_argument( "--image-augmentation.random-resize.min-ratio", type=float, default=0.5, help="Min ratio for random resizing. Defaults to 0.5", ) group.add_argument( "--image-augmentation.random-resize.max-ratio", type=float, default=2.0, help="Max ratio for random resizing. Defaults to 2.0", ) group.add_argument( "--image-augmentation.random-resize.interpolation", type=str, default="bilinear", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Desired interpolation method. Defaults to bilinear.", ) return parser def __call__(self, data: Dict) -> Dict: random_ratio = random.uniform(self.min_ratio, self.max_ratio) # compute the size width, height = F.get_image_size(data["image"]) if self.max_scale_long_edge is not None: min_hw = min(height, width) max_hw = max(height, width) scale_factor = ( min( self.max_scale_long_edge / max_hw, self.max_scale_short_edge / min_hw, ) * random_ratio ) # resize while maintaining aspect ratio new_size = int(math.ceil(height * scale_factor)), int( math.ceil(width * scale_factor) ) else: new_size = int(math.ceil(height * random_ratio)), int( math.ceil(width * random_ratio) ) # new_size should be a tuple of height and width return _resize_fn(data, size=new_size, interpolation=self.interpolation) def __repr__(self) -> str: return "{}(min_ratio={}, max_ratio={}, interpolation={}, max_long_edge={}, max_short_edge={})".format( self.__class__.__name__, self.min_ratio, self.max_ratio, self.interpolation, self.max_scale_long_edge, self.max_scale_short_edge, ) @TRANSFORMATIONS_REGISTRY.register(name="random_short_size_resize", type="image_pil") class RandomShortSizeResize(BaseTransformation): """ This class implements random resizing such that shortest side is between specified minimum and maximum values. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) short_size_min = getattr( opts, "image_augmentation.random_short_size_resize.short_side_min", None, ) short_size_max = getattr( opts, "image_augmentation.random_short_size_resize.short_side_max", None, ) max_img_dim = getattr( opts, "image_augmentation.random_short_size_resize.max_img_dim", None, ) if short_size_min is None: logger.error( "Short side minimum value can't be None in {}".format( self.__class__.__name__ ) ) if short_size_max is None: logger.error( "Short side maximum value can't be None in {}".format( self.__class__.__name__ ) ) if max_img_dim is None: logger.error( "Max. image dimension value can't be None in {}".format( self.__class__.__name__ ) ) if short_size_max <= short_size_min: logger.error( "Short side maximum value should be >= short side minimum value in {}. Got: {} and {}".format( self.__class__.__name__, short_size_max, short_size_min ) ) interpolation = getattr( opts, "image_augmentation.random_short_size_resize.interpolation", "bicubic", ) self.short_side_min = short_size_min self.short_side_max = short_size_max self.max_img_dim = max_img_dim self.interpolation = interpolation @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-short-size-resize.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-short-size-resize.short-side-min", type=int, default=None, help="Minimum value for image's shortest side. Defaults to None.", ) group.add_argument( "--image-augmentation.random-short-size-resize.short-side-max", type=int, default=None, help="Maximum value for image's shortest side. Defaults to None.", ) group.add_argument( "--image-augmentation.random-short-size-resize.interpolation", type=str, default="bicubic", choices=list(INTERPOLATION_MODE_MAP.keys()), help="Desired interpolation method. Defaults to bicubic", ) group.add_argument( "--image-augmentation.random-short-size-resize.max-img-dim", type=int, default=None, help="Max. image dimension. Defaults to None.", ) return parser def __call__(self, data: Dict) -> Dict: short_side = random.randint(self.short_side_min, self.short_side_max) img_w, img_h = data["image"].size scale = min( short_side / min(img_h, img_w), self.max_img_dim / max(img_h, img_w) ) img_w = int(img_w * scale) img_h = int(img_h * scale) data = _resize_fn(data, size=(img_h, img_w), interpolation=self.interpolation) return data def __repr__(self) -> str: return "{}(short_side_min={}, short_side_max={}, interpolation={})".format( self.__class__.__name__, self.short_side_min, self.short_side_max, self.interpolation, ) @TRANSFORMATIONS_REGISTRY.register(name="random_erasing", type="image_pil") class RandomErasing(BaseTransformation, T.RandomErasing): """ This class randomly selects a region in a tensor and erases its pixels. See `this paper `_ for details. """ def __init__(self, opts, *args, **kwargs) -> None: BaseTransformation.__init__(self, opts=opts) random_erase_p = getattr(opts, "image_augmentation.random_erase.p", 0.5) T.RandomErasing.__init__(self, p=random_erase_p) self.random_erase_p = random_erase_p @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-erase.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-erase.p", type=float, default=0.5, help="Probability that random erasing operation will be applied. Defaults to 0.5", ) return parser def __call__(self, data: Dict) -> Dict: data["image"] = super().forward(data.pop("image")) return data def __repr__(self) -> str: return "{}(random_erase_p={})".format( self.__class__.__name__, self.random_erase_p ) @TRANSFORMATIONS_REGISTRY.register(name="random_gaussian_blur", type="image_pil") class RandomGaussianBlur(BaseTransformation): """ This method randomly blurs the input image. """ def __init__(self, opts, *args, **kwargs): super().__init__(opts=opts) self.p = getattr(opts, "image_augmentation.random_gaussian_noise.p", 0.5) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-gaussian-noise.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-gaussian-noise.p", type=float, default=0.5, help="Probability for applying {}".format(cls.__name__), ) return parser def __call__(self, data: Dict) -> Dict: if random.random() < self.p: img = data.pop("image") # radius is the standard devaition of the gaussian kernel img = img.filter(ImageFilter.GaussianBlur(radius=random.random())) data["image"] = img return data @TRANSFORMATIONS_REGISTRY.register(name="random_crop", type="image_pil") class RandomCrop(BaseTransformation): """ This method randomly crops an image area. .. note:: If the size of input image is smaller than the desired crop size, the input image is first resized while maintaining the aspect ratio and then cropping is performed. """ def __init__( self, opts, size: Union[Sequence, int], ignore_idx: Optional[int] = 255, *args, **kwargs ) -> None: super().__init__(opts=opts) self.height, self.width = setup_size(size=size) self.opts = opts self.seg_class_max_ratio = getattr( opts, "image_augmentation.random_crop.seg_class_max_ratio", None ) self.ignore_idx = ignore_idx self.num_repeats = 10 self.seg_fill = getattr(opts, "image_augmentation.random_crop.mask_fill", 0) pad_if_needed = getattr( opts, "image_augmentation.random_crop.pad_if_needed", False ) self.if_needed_fn = ( self._pad_if_needed if pad_if_needed else self._resize_if_needed ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-crop.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-crop.seg-class-max-ratio", default=None, type=float, help="Max. ratio that single segmentation class can occupy. Defaults to None", ) group.add_argument( "--image-augmentation.random-crop.pad-if-needed", action="store_true", help="Pad images if needed. Defaults to False, i.e., resizing will be performed", ) group.add_argument( "--image-augmentation.random-crop.mask-fill", type=int, default=255, help="Value to fill in segmentation mask in case of padding. Defaults to 255. " "Generally, this value is the same as background or undefined class id.", ) return parser @staticmethod def get_params(img_h, img_w, target_h, target_w): if img_w == target_w and img_h == target_h: return 0, 0, img_h, img_w i = random.randint(0, max(0, img_h - target_h)) j = random.randint(0, max(0, img_w - target_w)) return i, j, target_h, target_w @staticmethod def get_params_from_box(boxes, img_h, img_w): # x, y, w, h offset = random.randint(20, 50) start_x = max(0, int(round(np.min(boxes[..., 0]))) - offset) start_y = max(0, int(round(np.min(boxes[..., 1]))) - offset) end_x = min(int(round(np.max(boxes[..., 2]))) + offset, img_w) end_y = min(int(round(np.max(boxes[..., 3]))) + offset, img_h) return start_y, start_x, end_y - start_y, end_x - start_x def get_params_from_mask(self, data, i, j, h, w): img_w, img_h = F.get_image_size(data["image"]) for _ in range(self.num_repeats): temp_data = _crop_fn( data=copy.deepcopy(data), top=i, left=j, height=h, width=w ) class_labels, cls_count = np.unique( np.array(temp_data["mask"]), return_counts=True ) valid_cls_count = cls_count[class_labels != self.ignore_idx] if valid_cls_count.size == 0: continue # compute the ratio of segmentation class with max. pixels to total pixels. # If the ratio is less than seg_class_max_ratio, then exit the loop total_valid_pixels = np.sum(valid_cls_count) max_valid_pixels = np.max(valid_cls_count) ratio = max_valid_pixels / total_valid_pixels if len(cls_count) > 1 and ratio < self.seg_class_max_ratio: break i, j, h, w = self.get_params( img_h=img_h, img_w=img_w, target_h=self.height, target_w=self.width, ) return i, j, h, w def _resize_if_needed(self, data: Dict) -> Dict: img = data["image"] w, h = F.get_image_size(img) # resize while maintaining the aspect ratio new_size = min(h + max(0, self.height - h), w + max(0, self.width - w)) return _resize_fn( data, size=new_size, interpolation=T.InterpolationMode.BILINEAR ) def _pad_if_needed(self, data: Dict) -> Dict: img = data.pop("image") w, h = F.get_image_size(img) new_h = h + max(self.height - h, 0) new_w = w + max(self.width - w, 0) pad_img = Image.new(img.mode, (new_w, new_h), color=0) pad_img.paste(img, (0, 0)) data["image"] = pad_img if "mask" in data: mask = data.pop("mask") pad_mask = Image.new(mask.mode, (new_w, new_h), color=self.seg_fill) pad_mask.paste(mask, (0, 0)) data["mask"] = pad_mask return data def __call__(self, data: Dict) -> Dict: # box_info if "box_coordinates" in data: boxes = data.get("box_coordinates") # crop the relevant area image_w, image_h = F.get_image_size(data["image"]) box_i, box_j, box_h, box_w = self.get_params_from_box( boxes, image_h, image_w ) data = _crop_fn(data, top=box_i, left=box_j, height=box_h, width=box_w) data = self.if_needed_fn(data) img_w, img_h = F.get_image_size(data["image"]) i, j, h, w = self.get_params( img_h=img_h, img_w=img_w, target_h=self.height, target_w=self.width ) if ( "mask" in data and self.seg_class_max_ratio is not None and self.seg_class_max_ratio < 1.0 ): i, j, h, w = self.get_params_from_mask(data=data, i=i, j=j, h=h, w=w) data = _crop_fn(data=data, top=i, left=j, height=h, width=w) return data def __repr__(self) -> str: return "{}(size=(h={}, w={}), seg_class_max_ratio={}, seg_fill={})".format( self.__class__.__name__, self.height, self.width, self.seg_class_max_ratio, self.seg_fill, ) @TRANSFORMATIONS_REGISTRY.register(name="to_tensor", type="image_pil") class ToTensor(BaseTransformation): """ This method converts an image into a tensor and optionally normalizes by a mean and std. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts) img_dtype = getattr(opts, "image_augmentation.to_tensor.dtype", "float") mean_std_normalization_enable = getattr( opts, "image_augmentation.to_tensor.mean_std_normalization.enable" ) normalization_mean = getattr( opts, "image_augmentation.to_tensor.mean_std_normalization.mean" ) normalization_std = getattr( opts, "image_augmentation.to_tensor.mean_std_normalization.std" ) if mean_std_normalization_enable: assert ( normalization_mean is not None ), "--image_augmentation.to_tensor.mean_std_normalization.mean must be specified when --image_augmentation.to_tensor.mean_std_normalization.enable is set to true." assert ( normalization_std is not None ), "--image_augmentation.to_tensor.mean_std_normalization.std must be specified when --image_augmentation.to_tensor.mean_std_normalization.enable is set to true." if isinstance(normalization_mean, list): assert ( len(normalization_mean) == 3 ), "--image_augmentation.to_tensor.mean_std_normalization.mean must be a list of length 3 or a scalar." if isinstance(normalization_std, list): assert ( len(normalization_std) == 3 ), "--image_augmentation.to_tensor.mean_std_normalization.std must be a list of length 3 or a scalar." self.img_dtype = torch.float self.norm_factor = 255 if img_dtype in ["half", "float16"]: self.img_dtype = torch.float16 elif img_dtype in ["uint8"]: self.img_dtype = torch.uint8 self.norm_factor = 1 self.mean_std_normalization_enable = mean_std_normalization_enable self.normalization_mean = normalization_mean self.normalization_std = normalization_std @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: parser.add_argument( "--image-augmentation.to-tensor.dtype", type=str, default="float", help="Tensor data type. Default is float", ) parser.add_argument( "--image-augmentation.to-tensor.mean-std-normalization.enable", action="store_true", default=False, help="This flag is used to normalize a tensor by a dataset's mean and std. Defaults to False.", ) parser.add_argument( "--image-augmentation.to-tensor.mean-std-normalization.mean", type=float, nargs="+", default=None, help="The mean used to normalize the input. Defaults to None.", ) parser.add_argument( "--image-augmentation.to-tensor.mean-std-normalization.std", type=float, nargs="+", default=None, help="The standard deviation used to normalize the input. Defaults to None.", ) return parser def __repr__(self): if self.mean_std_normalization_enable: return "{}(dtype={}, norm_factor={}, mean_std_normalization_enable={}, normalization_mean={}, normalization_std={})".format( self.__class__.__name__, self.img_dtype, self.norm_factor, self.mean_std_normalization_enable, self.normalization_mean, self.normalization_std, ) else: return "{}(dtype={}, norm_factor={})".format( self.__class__.__name__, self.img_dtype, self.norm_factor, ) def __call__(self, data: Dict) -> Dict: # HWC --> CHW img = data["image"] if F._is_pil_image(img): # convert PIL image to tensor img = F.pil_to_tensor(img).contiguous() data["image"] = img.to(dtype=self.img_dtype).div(self.norm_factor) if self.mean_std_normalization_enable: data["image"] = F.normalize( data["image"], mean=self.normalization_mean, std=self.normalization_std, ) if "mask" in data: mask = data.pop("mask") mask = np.array(mask) if len(mask.shape) not in (2, 3): logger.error( "Mask needs to be 2- or 3-dimensional. Got: {}".format(mask.shape) ) data["mask"] = torch.as_tensor(mask, dtype=torch.long) if "box_coordinates" in data: boxes = data.pop("box_coordinates") data["box_coordinates"] = torch.as_tensor(boxes, dtype=torch.float) if "box_labels" in data: box_labels = data.pop("box_labels") data["box_labels"] = torch.as_tensor(box_labels) if "instance_mask" in data: assert "instance_coords" in data instance_masks = data.pop("instance_mask") data["instance_mask"] = instance_masks.to(dtype=torch.long) instance_coords = data.pop("instance_coords") data["instance_coords"] = torch.as_tensor( instance_coords, dtype=torch.float ) return data @TRANSFORMATIONS_REGISTRY.register(name="random_order", type="image_pil") class RandomOrder(BaseTransformation): """ This method applies a list of all or few transforms in a random order. """ def __init__(self, opts, img_transforms: List, *args, **kwargs) -> None: super().__init__(opts=opts) self.transforms = img_transforms apply_k_factor = getattr(opts, "image_augmentation.random_order.apply_k", 1.0) assert ( 0.0 < apply_k_factor <= 1.0 ), "--image-augmentation.random-order.apply-k should be > 0 and <= 1" self.keep_t = int(math.ceil(len(self.transforms) * apply_k_factor)) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.random-order.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.random-order.apply-k", type=int, default=1.0, help="Apply K percent of transforms randomly. Value between 0 and 1. " "Defaults to 1 (i.e., apply all transforms in random order).", ) return parser def __call__(self, data: Dict) -> Dict: random.shuffle(self.transforms) for t in self.transforms[: self.keep_t]: data = t(data) return data def __repr__(self): transform_str = ", ".join(str(t) for t in self.transforms) repr_str = "{}(n_transforms={}, t_list=[{}]".format( self.__class__.__name__, self.keep_t, transform_str ) return repr_str @TRANSFORMATIONS_REGISTRY.register(name="rand_augment_timm", type="image_pil") class RandAugmentTimm(BaseTransformation): """ This class implements the `RandAugment data augmentation `_ method, as described in `ResNet Strikes Back `_ paper """ def __init__(self, opts, *args, **kwargs) -> None: config_str = getattr( opts, "image_augmentation.rand_augment.timm_config_str", "rand-m9-mstd0.5-inc1", ) super().__init__(opts=opts, *args, **kwargs) rand_augment_transform = None try: from timm.data.transforms_factory import rand_augment_transform except ModuleNotFoundError: logger.error("Please install timm library") self.config_str = config_str self.aug_fn = rand_augment_transform @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.rand-augment.use-timm-library", action="store_true", help="Use timm library for randaugment over PyTorch's implementation", ) group.add_argument( "--image-augmentation.rand-augment.timm-config-str", type=str, default="rand-m9-mstd0.5-inc1", help="Number of augmentation transformations to apply sequentially. Defaults to 2.", ) return parser def __call__(self, data: Dict) -> Dict: if "box_coordinates" in data or "mask" in data or "instance_masks" in data: logger.error( "{} is only supported for classification tasks".format( self.__class__.__name__ ) ) img = data["image"] img_size_min = min(img.size) aa_params = dict( translate_const=int(img_size_min * 0.45), img_mean=tuple([128, 128, 128]), ) img = self.aug_fn(self.config_str, aa_params)(img) data["image"] = img return data def __repr__(self) -> str: return "{}(config_str={})".format(self.__class__.__name__, self.config_str) ================================================ FILE: corenet/data/transforms/image_torch.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math import random from typing import Dict, Tuple import torch from torch import Tensor from torch.nn import functional as F_torch from torchvision.transforms import functional as F from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation from corenet.utils import logger # Copied from PyTorch Torchvision @TRANSFORMATIONS_REGISTRY.register(name="random_mixup", type="image_torch") class RandomMixup(BaseTransformation): """ Given a batch of input images and labels, this class randomly applies the `MixUp transformation `_ Args: opts (argparse.Namespace): Arguments num_classes (int): Number of classes in the dataset """ def __init__( self, opts: argparse.Namespace, num_classes: int, *args, **kwargs ) -> None: super().__init__(opts=opts, *args, **kwargs) alpha = getattr(opts, "image_augmentation.mixup.alpha") assert ( num_classes > 0 ), "Please provide a valid positive value for the num_classes." assert alpha > 0, "Alpha param can't be zero." self.num_classes = num_classes self.p = getattr(opts, "image_augmentation.mixup.p") assert ( 0.0 < self.p <= 1.0 ), "MixUp probability should be between 0 and 1, where 1 is inclusive" self.alpha = alpha self.inplace = getattr(opts, "image_augmentation.mixup.inplace") self.sample_key = getattr(opts, "image_augmentation.mixup.sample_key") self.target_key = getattr(opts, "image_augmentation.mixup.target_key") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.mixup.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.mixup.alpha", type=float, default=0.2, help="Alpha for MixUp augmentation. Defaults to 0.2", ) group.add_argument( "--image-augmentation.mixup.p", type=float, default=1.0, help="Probability for applying MixUp augmentation. Defaults to 1.0 ." " If both MixUp and CutMix are enabled," " one is used with probability 0.5 per batch.", ) group.add_argument( "--image-augmentation.mixup.inplace", action="store_true", default=False, help="Apply MixUp augmentation inplace. Defaults to False.", ) group.add_argument( "--image-augmentation.mixup.sample-key", type=str, default=None, help="Name of the key if input is a dictionart. Defaults to None.", ) group.add_argument( "--image-augmentation.mixup.target-key", type=str, default=None, help="Name of the key if target is a dictionary. Defaults to None.", ) return parser def _apply_mixup_transform( self, image_tensor: Tensor, target_tensor: Tensor ) -> Tuple[Tensor, Tensor]: if image_tensor.ndim != 4: logger.error(f"Batch ndim should be 4. Got {image_tensor.ndim}") if target_tensor.ndim != 1: logger.error(f"Target ndim should be 1. Got {target_tensor.ndim}") if not image_tensor.is_floating_point(): logger.error( f"Batch datatype should be a float tensor. Got {image_tensor.dtype}." ) if target_tensor.dtype != torch.int64: logger.error( f"Target datatype should be torch.int64. Got {target_tensor.dtype}" ) if not self.inplace: image_tensor = image_tensor.clone() target_tensor = target_tensor.clone() if target_tensor.ndim == 1: target_tensor = F_torch.one_hot( target_tensor, num_classes=self.num_classes ).to(dtype=image_tensor.dtype) # It's faster to roll the batch by one instead of shuffling it to create image pairs batch_rolled = image_tensor.roll(1, 0) target_rolled = target_tensor.roll(1, 0) # Implemented as on mixup paper, page 3. lambda_param = float( torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0] ) batch_rolled.mul_(1.0 - lambda_param) image_tensor.mul_(lambda_param).add_(batch_rolled) target_rolled.mul_(1.0 - lambda_param) target_tensor.mul_(lambda_param).add_(target_rolled) return image_tensor, target_tensor def __call__(self, data: Dict) -> Dict: """ Input data format: data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width]}, "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width]}, "targets": IntTensor of shape: [Batch] } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": IntTensor of shape: [Batch] } Output data format: Same as the input """ if torch.rand(1).item() >= self.p: return data samples, targets = data.pop("samples"), data.pop("targets") if self.sample_key is not None: samples = samples[self.sample_key] if not isinstance(samples, Tensor): logger.error( f"Samples need to be of type Tensor. Got: {type(samples)}. " f"Maybe you want to check the value of --image-augmentation.mixup.sample-key" ) if self.target_key is not None: targets = targets[self.target_key] if not isinstance(targets, Tensor): logger.error( f"Targets need to be of type Tensor. Got: {type(targets)}. " f"Maybe you want to check the value of --image-augmentation.mixup.target-key" ) samples, targets = self._apply_mixup_transform( image_tensor=samples, target_tensor=targets ) if self.sample_key is not None: if isinstance(samples, Tensor): samples = {self.sample_key: samples} else: samples[self.sample_key] = samples if self.target_key is not None: if isinstance(targets, Tensor): targets = {self.target_key: targets} else: targets[self.target_key] = targets data.update({"samples": samples, "targets": targets}) return data def __repr__(self) -> str: return "{}(num_classes={}, p={}, alpha={}, inplace={})".format( self.__class__.__name__, self.num_classes, self.p, self.alpha, self.inplace ) @TRANSFORMATIONS_REGISTRY.register(name="random_cutmix", type="image_torch") class RandomCutmix(BaseTransformation): """ Given a batch of input images and labels, this class randomly applies the `CutMix transformation `_ Args: opts (argparse.Namespace): Arguments num_classes (int): Number of classes in the dataset """ def __init__( self, opts: argparse.Namespace, num_classes: int, *args, **kwargs ) -> None: super().__init__(opts=opts, *args, **kwargs) alpha = getattr(opts, "image_augmentation.cutmix.alpha") assert ( num_classes > 0 ), "Please provide a valid positive value for the num_classes." assert alpha > 0, "Alpha param can't be zero." self.num_classes = num_classes self.p = getattr(opts, "image_augmentation.cutmix.p") assert ( 0.0 < self.p <= 1.0 ), "CutMix probability should be between 0 and 1, where 1 is inclusive" self.alpha = alpha self.inplace = getattr(opts, "image_augmentation.cutmix.inplace") self.sample_key = getattr(opts, "image_augmentation.cutmix.sample_key") self.target_key = getattr(opts, "image_augmentation.cutmix.target_key") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--image-augmentation.cutmix.enable", action="store_true", help="use {}. This flag is useful when you want to study the effect of different " "transforms.".format(cls.__name__), ) group.add_argument( "--image-augmentation.cutmix.alpha", type=float, default=1.0, help="Alpha for cutmix augmentation. Defaults to 1.0", ) group.add_argument( "--image-augmentation.cutmix.p", type=float, default=1.0, help="Probability for applying cutmix augmentation. Defaults to 1.0" " If both MixUp and CutMix are enabled," " one is used with probability 0.5 per batch.", ) group.add_argument( "--image-augmentation.cutmix.inplace", action="store_true", default=False, help="Apply cutmix operation inplace. Defaults to False", ) group.add_argument( "--image-augmentation.cutmix.sample-key", type=str, default=None, help="Name of the key if input is a dictionary. Defaults to None.", ) group.add_argument( "--image-augmentation.cutmix.target-key", type=str, default=None, help="Name of the key if target is a dictionary. Defaults to None.", ) return parser def _apply_cutmix_transform( self, image_tensor: Tensor, target_tensor: Tensor ) -> Tuple[Tensor, Tensor]: if image_tensor.ndim != 4: logger.error(f"Batch ndim should be 4. Got {image_tensor.ndim}") if target_tensor.ndim != 1: logger.error(f"Target ndim should be 1. Got {target_tensor.ndim}") if not image_tensor.is_floating_point(): logger.error( f"Batch dtype should be a float tensor. Got {image_tensor.dtype}." ) if target_tensor.dtype != torch.int64: logger.error( f"Target dtype should be torch.int64. Got {target_tensor.dtype}" ) if not self.inplace: image_tensor = image_tensor.clone() target_tensor = target_tensor.clone() if target_tensor.ndim == 1: target_tensor = F_torch.one_hot( target_tensor, num_classes=self.num_classes ).to(dtype=image_tensor.dtype) # It's faster to roll the batch by one instead of shuffling it to create image pairs batch_rolled = image_tensor.roll(1, 0) target_rolled = target_tensor.roll(1, 0) # Implemented as on cutmix paper, page 12 (with minor corrections on typos). lambda_param = float( torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0] ) W, H = F.get_image_size(image_tensor) r_x = torch.randint(W, (1,)) r_y = torch.randint(H, (1,)) r = 0.5 * math.sqrt(1.0 - lambda_param) r_w_half = int(r * W) r_h_half = int(r * H) x1 = int(torch.clamp(r_x - r_w_half, min=0)) y1 = int(torch.clamp(r_y - r_h_half, min=0)) x2 = int(torch.clamp(r_x + r_w_half, max=W)) y2 = int(torch.clamp(r_y + r_h_half, max=H)) image_tensor[:, :, y1:y2, x1:x2] = batch_rolled[:, :, y1:y2, x1:x2] lambda_param = float(1.0 - (x2 - x1) * (y2 - y1) / (W * H)) target_rolled.mul_(1.0 - lambda_param) target_tensor.mul_(lambda_param).add_(target_rolled) return image_tensor, target_tensor def __call__(self, data: Dict) -> Dict: """ Input data format: data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width]}, "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width]}, "targets": IntTensor of shape: [Batch] } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": IntTensor of shape: [Batch] } Output data format: Same as the input """ if torch.rand(1).item() >= self.p: return data samples, targets = data.pop("samples"), data.pop("targets") if self.sample_key is not None: samples = samples[self.sample_key] if not isinstance(samples, Tensor): logger.error( f"Samples need to be of type Tensor. Got: {type(samples)}. " f"Maybe you want to check the value of --image-augmentation.cutmix.sample-key" ) if self.target_key is not None: targets = targets[self.target_key] if not isinstance(targets, Tensor): logger.error( f"Targets need to be of type Tensor. Got: {type(targets)}. " f"Maybe you want to check the value of --image-augmentation.cutmix.target-key" ) samples, targets = self._apply_cutmix_transform( image_tensor=samples, target_tensor=targets ) if self.sample_key is not None: if isinstance(samples, Tensor): samples = {self.sample_key: samples} else: samples[self.sample_key] = samples if self.target_key is not None: if isinstance(targets, Tensor): targets = {self.target_key: targets} else: targets[self.target_key] = targets data.update({"samples": samples, "targets": targets}) return data def __repr__(self) -> str: return "{}(num_classes={}, p={}, alpha={}, inplace={})".format( self.__class__.__name__, self.num_classes, self.p, self.alpha, self.inplace ) def apply_mixing_transforms(opts: argparse.Namespace, data: Dict) -> Dict: """ Helper function to apply MixUp/CutMix transforms. If both MixUp and CutMix transforms are selected with 0.0 < p <= 1.0, then one of them is chosen randomly and applied. Input data format: data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width]}, "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": {"sample_key": Tensor of shape: [Batch, Channels, Height, Width}, "targets": IntTensor of shape: [Batch] } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": {"target_key": IntTensor of shape: [Batch]} } OR data: mapping of: { "samples": Tensor of shape: [Batch, Channels, Height, Width], "targets": IntTensor of shape: [Batch] } Output data format: Same as the input """ mixup_transforms = [] if getattr(opts, "image_augmentation.mixup.enable"): n_classes = getattr(opts, "model.classification.n_classes") if n_classes is None: logger.error("Please specify number of classes. Got None.") mixup_transforms.append(RandomMixup(opts=opts, num_classes=n_classes)) if getattr(opts, "image_augmentation.cutmix.enable"): n_classes = getattr(opts, "model.classification.n_classes") if n_classes is None: logger.error("Please specify number of classes. Got None.") mixup_transforms.append(RandomCutmix(opts=opts, num_classes=n_classes)) if len(mixup_transforms) > 0: _mixup_transform = random.choice(mixup_transforms) data = _mixup_transform(data) return data ================================================ FILE: corenet/data/transforms/utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any import numpy as np def setup_size(size: Any, error_msg="Need a tuple of length 2"): if size is None: raise ValueError("Size can't be None") if isinstance(size, int): return size, size elif isinstance(size, (list, tuple)) and len(size) == 1: return size[0], size[0] if len(size) != 2: raise ValueError(error_msg) return size def intersect(box_a, box_b): """Computes the intersection between box_a and box_b""" max_xy = np.minimum(box_a[:, 2:], box_b[2:]) min_xy = np.maximum(box_a[:, :2], box_b[:2]) inter = np.clip((max_xy - min_xy), a_min=0, a_max=np.inf) return inter[:, 0] * inter[:, 1] def jaccard_numpy(box_a: np.ndarray, box_b: np.ndarray): """ Computes the intersection of two boxes. Args: box_a (np.ndarray): Boxes of shape [Num_boxes_A, 4] box_b (np.ndarray): Box osf shape [Num_boxes_B, 4] Returns: intersection over union scores. Shape is [box_a.shape[0], box_a.shape[1]] """ inter = intersect(box_a, box_b) area_a = (box_a[:, 2] - box_a[:, 0]) * (box_a[:, 3] - box_a[:, 1]) # [A,B] area_b = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1]) # [A,B] union = area_a + area_b - inter return inter / union # [A,B] ================================================ FILE: corenet/data/transforms/video.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import datetime import hashlib import math import os import random import subprocess import tempfile from pathlib import Path from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union import psutil import torch import torchaudio from torch.nn import functional as F from torchvision.io import write_video from torchvision.transforms import InterpolationMode from torchvision.transforms import functional as FV from corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation from corenet.data.transforms.utils import * from corenet.options.parse_args import JsonValidator from corenet.utils import logger SUPPORTED_PYTORCH_INTERPOLATIONS = ["nearest", "bilinear", "bicubic"] def _check_interpolation(interpolation): if interpolation not in SUPPORTED_PYTORCH_INTERPOLATIONS: inter_str = "Supported interpolation modes are:" for i, j in enumerate(SUPPORTED_PYTORCH_INTERPOLATIONS): inter_str += "\n\t{}: {}".format(i, j) logger.error(inter_str) return interpolation def _crop_fn(data: Dict, i: int, j: int, h: int, w: int) -> Dict: """Crop the video in `data`. Args: data: A dictionary of data. The format is: { "samples":{ "video": A video tensor of shape [...x H x W], where H and W are the height and width. "audio": An audio tensor. } } i: The height coordinate of the top left corner of the cropped rectangle. j: The width coordinate of the top left corner of the cropped rectangle. h: The height of the cropped rectangle. w: The width of the cropped rectangle. Returns: A dictionary of the same format as `data` where `data["samples"]["videos"]` is the cropped video. """ img = data["samples"]["video"] check_rgb_video_tensor(img) crop_image = img[..., i : i + h, j : j + w] data["samples"]["video"] = crop_image mask = data.get("mask", None) if mask is not None: crop_mask = mask[..., i : i + h, j : j + w] data["samples"]["mask"] = crop_mask return data def _resize_fn( data: Dict, size: Union[Sequence, int], interpolation: Optional[str] = "bilinear", ) -> Dict: """Resize the video in `data`. Args: data: A dictionary of data. The format is: { "samples":{ "video": A video tensor of shape [... x H x W], where H and W are the height and width. "mask": An optional entry of the mask tensor of shape [... x H x W], where H and W are the height and width. "audio": An audio tensor. } } size: The size of video to resize to. interpolation: The method of interpolation to use. Choices are: "bilinear", "nearest", "linear", "bicubic", "trilinear", "area", "nearest-exact", default to "bilinear". Returns: A dictionary of the same format as `data` where `data["samples"]["videos"]` is the cropped video. """ video = data["samples"]["video"] if isinstance(size, Sequence) and len(size) == 2: size_h, size_w = size[0], size[1] elif isinstance(size, int): h, w = video.shape[-2:] if (w <= h and w == size) or (h <= w and h == size): return data if w < h: size_h = int(size * h / w) size_w = size else: size_w = int(size * w / h) size_h = size else: raise TypeError( "Supported size args are int or tuple of length 2. Got inappropriate size" " arg: {}".format(size) ) if isinstance(interpolation, str): interpolation = _check_interpolation(interpolation) n, tc1, tc2, h, w = video.shape # Since video could be either NTCHW or NCTHW format, we reshape the 5D tensor into # 4D and transpose back to 5D. video = F.interpolate( input=video.reshape(n, tc1 * tc2, h, w), size=(size_h, size_w), mode=interpolation, align_corners=True if interpolation != "nearest" else None, ) data["samples"]["video"] = video.reshape(n, tc1, tc2, size_h, size_w) mask = data["samples"].get("mask", None) if mask is not None: mask = F.interpolate(input=mask, size=(size_h, size_w), mode="nearest") data["samples"]["mask"] = mask return data def check_rgb_video_tensor(clip: torch.Tensor) -> None: """Check if the video tensor is the right type and shape. Args: clip: A video clip tensor of shape [N x C x T x H x W] or [N x C x T x H x W], where N is the number of clips, T is the number of frames of the clip, C is the number of image channels, H and W are the height and width of the frame image. """ if not isinstance(clip, torch.FloatTensor): logger.error("Video clip is not an instance of FloatTensor.") if clip.dim() != 5: logger.error("Video clip is not a 5-d tensor (NTCHW or NCTHW).") @TRANSFORMATIONS_REGISTRY.register(name="to_tensor", type="video") class ToTensor(BaseTransformation): """ This method converts an image into a tensor. Tensor shape abbreviations: N: Number of clips. T, T_audio, T_video: Temporal lengths. C: Number of color channels. H, W: Height, Width. .. note:: We do not perform any mean-std normalization. If mean-std normalization is desired, please modify this class. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts=opts) def __call__(self, data: Dict) -> Dict: # [N, C, T, H, W] or [N, T, C, H, W]. clip = data["samples"]["video"] if not isinstance(clip, torch.Tensor): clip = torch.from_numpy(clip) if not isinstance(clip, torch.FloatTensor): # Convert to float, and normalize between 0 and 1. clip = clip / 255.0 check_rgb_video_tensor(clip) data["samples"]["video"] = clip return data @TRANSFORMATIONS_REGISTRY.register(name="to_array", type="video") class ToPixelArray(BaseTransformation): """ This method is an inverse of ToTensor, converting a float tensor in range [0,1] back to a numpy uint8 array in range [0,255]. Tensor shape abbreviations: N: Number of clips. T: Temporal length. C: Number of color channels. H, W: Height, Width. """ def __call__(self, data: Dict) -> Dict: # [N, C, T, H, W] or [N, T, C, H, W]. video = data["samples"]["video"] video = (video * 255.0).round().numpy().astype(np.uint8) data["samples"]["video"] = video return data @TRANSFORMATIONS_REGISTRY.register(name="save-inputs", type="video") class SaveInputs(BaseTransformation): def __init__( self, opts: argparse.Namespace, get_frame_captions: Optional[Callable[[Dict], List[str]]] = None, *args, **kwargs, ) -> None: """Saves the clips that are returned by VideoDataset.__getitem__() to disk for debugging use cases. This transformation operates on multiple clips that are extracted out of a single raw video. The video and audio of the clips are concatenated and saved into 1 video file. 1 raw input video ==> VideoDataset.__getitem__() ==> multiple clips in data["samples"]["video"] ==> SaveInputs() ==> 1 output debugging video. This is useful for visualizing training and/or validation videos to make sure preprocessing logic is behaving as expected. Args: opts: Command line options. get_frame_captions: If provided, this function returns a list of strings (one string per video frame). The frame captions will be added to the video as subtitles. """ self.get_frame_captions = get_frame_captions self.enable = getattr(opts, "video_augmentation.save_inputs.enable") save_dir = getattr(opts, "video_augmentation.save_inputs.save_dir") if self.enable and save_dir is None: logger.error( "Please provide value for --video_augmentation.save-inputs.save-dir" ) process_start_time = datetime.datetime.fromtimestamp( psutil.Process(os.getpid()).create_time() ).strftime("%Y-%m-%d %H:%M") self.save_dir = Path(save_dir, process_start_time).expanduser() self.symlink_to_original = getattr( opts, "video_augmentation.save_inputs.symlink_to_original" ) def __call__(self, data: Dict) -> Dict: if not self.enable: return data original_path = data["samples"]["metadata"]["filename"] original_basename = os.path.basename(original_path) original_path_hash = hashlib.md5(str(original_path).encode()).hexdigest()[:5] output_video_path = Path( self.save_dir, f"{datetime.datetime.now().isoformat()[:5]}_{original_path_hash}_{original_basename}", ) self.save_video_with_annotations( data=data, output_video_path=output_video_path, ) if self.symlink_to_original: os.symlink( original_path, output_video_path.with_suffix(f".original.{output_video_path.suffix}"), ) return data @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> None: group = parser.add_argument_group(cls.__name__) group.add_argument( "--video-augmentation.save-inputs.save-dir", type=str, default=None, help=( "Path to the folder for saving output debugging videos. Defaults to" " None." ), ) group.add_argument( "--video-augmentation.save-inputs.add-labels", action="store_true", default=False, help=( "If set, write the class label on each frame of the video. Defaults to" " False." ), ) group.add_argument( "--video-augmentation.save-inputs.enable", action="store_true", default=False, help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.save-inputs.symlink-to-original", action="store_true", default=False, help=( "If True, a symlink to original video sample will be created besides" "the saved inputs for easier debugging. Defaults to False." ), ) return parser @staticmethod def _srt_format_timestamp(t: float) -> str: t = int(t * 1000) t, millis = divmod(t, 1000) t, ss = divmod(t, 60) t, mm = divmod(t, 60) hh = t return f"{0 if hh<10 else ''}{hh}:{0 if mm<10 else ''}{mm}:{ss},{millis:0>3}" def save_video_with_annotations( self, data: Dict, output_video_path: Path, ) -> None: """Save a video with audio and captions. Args: data: Dataset output dict. Schema: { "samples": { "video": Tensor[N x T X C x H x W], "audio": Tensor[N x T_audio x C], # Optional "audio_raw": Tensor[N x T_audio x C], # Optional - if provided, # "audio" will be ignored. "metadata": { "video_fps": Union[float,int], "audio_fps": Union[float,int], } } } output_video_path: Path for saving the video. get_frame_captions: A callback that receives @data as input and returns a list of captions (one string per video frame). If provided, the captions will be added to the output video as subtitles. """ video = data["samples"]["video"] # N x T x C x H x W video = video.reshape(-1, *video.shape[2:]) # (N*T) x C x H x W video_fps = data["samples"]["metadata"]["video_fps"] if "audio_raw" in data: audio = data["samples"]["audio_raw"] # N x T_audio x C else: audio = data["samples"].get("audio") # N x T_audio x C if audio is not None: audio = audio.reshape(-1, *audio.shape[2:]) # N*T_audio x C audio_fps = int(round(data["samples"]["metadata"]["audio_fps"])) video = (video * 255).round().to(dtype=torch.uint8).cpu() video = video.permute([0, 2, 3, 1]) # N x H x W x C suffix = output_video_path.suffix assert suffix in ( ".mp4", ".mov", ".mkv", ), f"{suffix} format is not supported by SaveInputs yet." output_video_path.parent.mkdir(exist_ok=True, parents=True) if audio is not None or self.get_frame_captions is not None: with tempfile.TemporaryDirectory() as tmp_dir: tmp_video = Path(tmp_dir, "video" + suffix) write_video(str(tmp_video), video_array=video, fps=video_fps) command = ["ffmpeg", "-i", tmp_video] if audio is not None: tmp_audio = str(Path(tmp_dir, "audio.wav")) torchaudio.save(tmp_audio, audio.transpose(0, 1), audio_fps) command.extend(["-i", tmp_audio]) command.extend(["-c:v", "libx264"]) if audio is not None: command.extend(["-c:a", "aac"]) if self.get_frame_captions: captions = self.get_frame_captions(data) tmp_srt = str(Path(tmp_dir, "subtitle.srt")) with open(tmp_srt, "wt") as srt: for i, caption in enumerate(captions): srt.write( f"{i+1}\n" f"{self._srt_format_timestamp(i / video_fps)} --> " f"{self._srt_format_timestamp((i+1) / video_fps)}\n" f"{caption}\n\n" ) command.extend( [ "-vf", f"subtitles={tmp_srt}:force_style='Alignment=6,Fontsize=48,Outline=8'", ] ) subprocess.check_output( [*command, f"file:{output_video_path}"], stderr=subprocess.PIPE, ) else: write_video(str(output_video_path), video_array=video, fps=video_fps) def __repr__(self) -> str: return ( "{}(save_dir={}, add_labels={}, symlink_to_original={}, enable={})".format( self.__class__.__name__, self.save_dir, self.add_labels, self.symlink_to_original, self.enable, ) ) @TRANSFORMATIONS_REGISTRY.register(name="random_resized_crop", type="video") class RandomResizedCrop(BaseTransformation): """ This class crops a random portion of an image and resize it to a given size. """ def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None: interpolation = getattr( opts, "video_augmentation.random_resized_crop.interpolation", ) scale = getattr(opts, "video_augmentation.random_resized_crop.scale") ratio = getattr( opts, "video_augmentation.random_resized_crop.aspect_ratio", ) if not isinstance(scale, Sequence) or ( isinstance(scale, Sequence) and len(scale) != 2 and 0.0 <= scale[0] < scale[1] ): logger.error( "--video-augmentation.random-resized-crop.scale should be a tuple of" f" length 2 such that 0.0 <= scale[0] < scale[1]. Got: {scale}." ) if not isinstance(ratio, Sequence) or ( isinstance(ratio, Sequence) and len(ratio) != 2 and 0.0 < ratio[0] < ratio[1] ): logger.error( "--video-augmentation.random-resized-crop.aspect-ratio should be a" f" tuple of length 2 such that 0.0 < ratio[0] < ratio[1]. Got: {ratio}." ) ratio = (round(ratio[0], 3), round(ratio[1], 3)) super().__init__(opts=opts) self.scale = scale self.size = setup_size(size=size) self.interpolation = _check_interpolation(interpolation) self.ratio = ratio self.enable = getattr(opts, "video_augmentation.random_resized_crop.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.random-resized-crop.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.random-resized-crop.interpolation", type=str, default="bilinear", choices=SUPPORTED_PYTORCH_INTERPOLATIONS, help="Desired interpolation method. Defaults to bilinear", ) group.add_argument( "--video-augmentation.random-resized-crop.scale", type=JsonValidator(Tuple[float, float]), default=(0.08, 1.0), help=( "Specifies the lower and upper bounds for the random area of the crop," " before resizing. The scale is defined with respect to the area of the" " original image. Defaults to (0.08, 1.0)." ), ) group.add_argument( "--video-augmentation.random-resized-crop.aspect-ratio", type=JsonValidator(Union[float, tuple]), default=(3.0 / 4.0, 4.0 / 3.0), help=( "lower and upper bounds for the random aspect ratio of the crop," " before resizing. Defaults to (3./4., 4./3.)." ), ) return parser def get_params(self, height: int, width: int) -> (int, int, int, int): area = height * width for _ in range(10): target_area = random.uniform(*self.scale) * area log_ratio = (math.log(self.ratio[0]), math.log(self.ratio[1])) aspect_ratio = math.exp(random.uniform(*log_ratio)) w = int(round(math.sqrt(target_area * aspect_ratio))) h = int(round(math.sqrt(target_area / aspect_ratio))) if 0 < w <= width and 0 < h <= height: i = random.randint(0, height - h) j = random.randint(0, width - w) return i, j, h, w # Fallback to central crop. in_ratio = (1.0 * width) / height if in_ratio < min(self.ratio): w = width h = int(round(w / min(self.ratio))) elif in_ratio > max(self.ratio): h = height w = int(round(h * max(self.ratio))) else: # whole image w = width h = height i = (height - h) // 2 j = (width - w) // 2 return i, j, h, w def __call__(self, data: Dict) -> Dict: clip = data["samples"]["video"] check_rgb_video_tensor(clip=clip) height, width = clip.shape[-2:] i, j, h, w = self.get_params(height=height, width=width) data = _crop_fn(data=data, i=i, j=j, h=h, w=w) return _resize_fn(data=data, size=self.size, interpolation=self.interpolation) def __repr__(self) -> str: return "{}(scale={}, ratio={}, interpolation={}, enable={})".format( self.__class__.__name__, self.scale, self.ratio, self.interpolation, self.enable, ) @TRANSFORMATIONS_REGISTRY.register(name="random_short_side_resize_crop", type="video") class RandomShortSizeResizeCrop(BaseTransformation): """ This class first randomly resizes the input video such that shortest side is between specified minimum and maximum values, and then crops a desired size video. .. note:: This class assumes that the video size after resizing is greater than or equal to the desired size. """ def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None: interpolation = getattr( opts, "video_augmentation.random_short_side_resize_crop.interpolation", ) short_size_min = getattr( opts, "video_augmentation.random_short_side_resize_crop.short_side_min", ) short_size_max = getattr( opts, "video_augmentation.random_short_side_resize_crop.short_side_max", ) if short_size_min is None: logger.error( "Short side minimum value can't be None in {}".format( self.__class__.__name__ ) ) if short_size_max is None: logger.error( "Short side maximum value can't be None in {}".format( self.__class__.__name__ ) ) if short_size_max <= short_size_min: logger.error( "Short side maximum value should be >= short side minimum value in {}." " Got: {} and {}".format( self.__class__.__name__, short_size_max, short_size_min ) ) super().__init__(opts=opts) self.short_side_min = short_size_min self.size = size self.short_side_max = short_size_max self.interpolation = _check_interpolation(interpolation) self.enable = getattr( opts, "video_augmentation.random_short_side_resize_crop.enable" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.random-short-side-resize-crop.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.random-short-side-resize-crop.interpolation", type=str, default="bilinear", choices=SUPPORTED_PYTORCH_INTERPOLATIONS, help="Desired interpolation method. Defaults to bilinear", ) group.add_argument( "--video-augmentation.random-short-side-resize-crop.short-side-min", type=int, default=None, help="Minimum value for video's shortest side. Defaults to None.", ) group.add_argument( "--video-augmentation.random-short-side-resize-crop.short-side-max", type=int, default=None, help="Maximum value for video's shortest side. Defaults to None.", ) return parser def get_params(self, height, width) -> Tuple[int, int, int, int]: th, tw = self.size if width == tw and height == th: return 0, 0, height, width i = random.randint(0, height - th) j = random.randint(0, width - tw) return i, j, th, tw def __call__(self, data: Dict) -> Dict: short_dim = random.randint(self.short_side_max, self.short_side_max) # resize the video so that shorter side is short_dim data = _resize_fn(data, size=short_dim, interpolation=self.interpolation) clip = data["samples"]["video"] check_rgb_video_tensor(clip=clip) height, width = clip.shape[-2:] i, j, h, w = self.get_params(height=height, width=width) # Crop the video. return _crop_fn(data=data, i=i, j=j, h=h, w=w) def __repr__(self) -> str: return "{}(size={}, short_size_range=({}, {}), interpolation={}, enable={})".format( self.__class__.__name__, self.size, self.short_side_min, self.short_side_max, self.interpolation, self.enable, ) @TRANSFORMATIONS_REGISTRY.register(name="random_crop", type="video") class RandomCrop(BaseTransformation): """ This method randomly crops a video area. .. note:: This class assumes that the input video size is greater than or equal to the desired size. """ def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None: size = setup_size(size=size) super().__init__(opts=opts) self.size = size self.enable = getattr(opts, "video_augmentation.random_crop.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.random-crop.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) return parser def get_params(self, height: int, width: int) -> Tuple[int, int, int, int]: th, tw = self.size if width == tw and height == th: return 0, 0, height, width i = random.randint(0, height - th) j = random.randint(0, width - tw) return i, j, th, tw def __call__(self, data: Dict) -> Dict: clip = data["samples"]["video"] check_rgb_video_tensor(clip=clip) height, width = clip.shape[-2:] i, j, h, w = self.get_params(height=height, width=width) return _crop_fn(data=data, i=i, j=j, h=h, w=w) def __repr__(self) -> str: return "{}(crop_size={}, enable={})".format( self.__class__.__name__, self.size, self.enable ) @TRANSFORMATIONS_REGISTRY.register(name="random_horizontal_flip", type="video") class RandomHorizontalFlip(BaseTransformation): """ This class implements random horizontal flipping method """ def __init__(self, opts, *args, **kwargs) -> None: p = getattr(opts, "video_augmentation.random_horizontal_flip.p", 0.5) super().__init__(opts=opts) self.p = p self.enable = getattr(opts, "video_augmentation.random_horizontal_flip.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.random-horizontal-flip.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.random-horizontal-flip.p", type=float, default=0.5, help="Probability for random horizontal flip. Defaults to 0.5.", ) return parser def __call__(self, data: Dict) -> Dict: if random.random() <= self.p: clip = data["samples"]["video"] check_rgb_video_tensor(clip=clip) clip = torch.flip(clip, dims=[-1]) data["samples"]["video"] = clip mask = data.get("mask", None) if mask is not None: mask = torch.flip(mask, dims=[-1]) data["mask"] = mask return data def __repr__(self) -> str: return ( f"{self.__class__.__name__}(flip probability={self.p}," f" enable={self.enable})" ) @TRANSFORMATIONS_REGISTRY.register(name="center_crop", type="video") class CenterCrop(BaseTransformation): """ This class implements center cropping method. .. note:: This class assumes that the input size is greater than or equal to the desired size. """ def __init__(self, opts, size: Union[Sequence, int], *args, **kwargs) -> None: super().__init__(opts=opts) if isinstance(size, Sequence) and len(size) == 2: self.height, self.width = size[0], size[1] elif isinstance(size, Sequence) and len(size) == 1: self.height = self.width = size[0] elif isinstance(size, int): self.height = self.width = size else: logger.error("Scale should be either an int or tuple of ints.") self.enable = getattr(opts, "video_augmentation.center_crop.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.center-crop.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) return parser def __call__(self, data: Dict) -> Dict: height, width = data["samples"]["video"].shape[-2:] i = (height - self.height) // 2 j = (width - self.width) // 2 return _crop_fn(data=data, i=i, j=j, h=self.height, w=self.width) def __repr__(self) -> str: return "{}(size=(h={}, w={}), enable={})".format( self.__class__.__name__, self.height, self.width, self.enable ) @TRANSFORMATIONS_REGISTRY.register(name="resize", type="video") class Resize(BaseTransformation): """ This class implements resizing operation. .. note:: Two possible modes for resizing. 1. Resize while maintaining aspect ratio. To enable this option, pass int as a size. 2. Resize to a fixed size. To enable this option, pass a tuple of height and width as a size. """ def __init__(self, opts, *args, **kwargs) -> None: size = getattr(opts, "video_augmentation.resize.size", None) if size is None: logger.error("Size can not be None in {}".format(self.__class__.__name__)) # Possible modes. # 1. Resize while maintaining aspect ratio. To enable this option, pass int as a # size. # 2. Resize to a fixed size. To enable this option, pass a tuple of height and # width as a size. if isinstance(size, Sequence) and len(size) > 2: logger.error( "The length of size should be either 1 or 2 in {}".format( self.__class__.__name__ ) ) interpolation = getattr( opts, "video_augmentation.resize.interpolation", "bilinear" ) super().__init__(opts=opts) self.size = size self.interpolation = _check_interpolation(interpolation) self.enable = getattr(opts, "video_augmentation.resize.enable") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.resize.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Defaults to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.resize.interpolation", type=str, default="bilinear", choices=SUPPORTED_PYTORCH_INTERPOLATIONS, help="Interpolation for resizing. Defaults to bilinear", ) group.add_argument( "--video-augmentation.resize.size", type=int, nargs="+", default=None, help=( "Resize video to the specified size. If int is passed, then shorter" " side is resized to the specified size and longest side is resized" " while maintaining aspect ratio. Defaults to None." ), ) return parser def __call__(self, data: Dict) -> Dict: return _resize_fn(data=data, size=self.size, interpolation=self.interpolation) def __repr__(self) -> str: return "{}(size={}, interpolation={}, enable={})".format( self.__class__.__name__, self.size, self.interpolation, self.enable ) @TRANSFORMATIONS_REGISTRY.register(name="crop_by_bounding_box", type="video") class CropByBoundingBox(BaseTransformation): """Crops video frames based on bounding boxes and adjusts the @targets "box_coordinates" annotations. Before cropping, the bounding boxes are expanded with @multiplier, while the "box_coordinates" cover the original areas of the image. Note that the cropped images may be padded with 0 values in the boundaries of the cropped image when the bounding boxes are near the edges. Frames with invalid bounding boxes (with x0=y0=x1=y1=-1, or with area <5) will be blacked out in the output. Alternatively, we could have dropped them, which is not implemented yet. """ BBOX_MIN_AREA = 5 # Minimum valid bounding box area (in pixels). def __init__( self, opts: argparse.Namespace, image_size: Optional[Tuple[int, int]] = None, is_training: bool = False, *args, **kwargs, ) -> None: super().__init__(opts=opts, *args, **kwargs) self.is_training = is_training self.multiplier = getattr( opts, "video_augmentation.crop_by_bounding_box.multiplier" ) self.multiplier_range = getattr( opts, "video_augmentation.crop_by_bounding_box.multiplier_range" ) if image_size is None: self.image_size = getattr( opts, "video_augmentation.crop_by_bounding_box.image_size" ) else: self.image_size = image_size assert image_size is not None, ( "Please provide --video-augmentation.crop-by-bounding-box.image_size" " argument." ) self.channel_first = getattr( opts, "video_augmentation.crop_by_bounding_box.channel_first" ) self.interpolation = getattr( opts, "video_augmentation.crop_by_bounding_box.interpolation" ) def __call__(self, data: Dict, *args, **kwargs) -> Dict: """ Tensor shape abbreviations: N: Number of clips. T, T_audio, T_video: Temporal lengths. C: Number of color channels. H, W: Height, Width. Args: data: mapping of: { "samples": { "video": Tensor of shape: [N, C, T, H, W] if self.channel_first else [N, T, C, H, W] }, "targets": { "traces": { "": { "box_coordinates": FloatTensor[N, T, 4], # x0, y0, x1, y1 } }, "labels": IntTensor[N, T], } } Note: This transformation does not modify the "labels". If frames that are blacked out due to having invalid bounding boxes need a different label, datasets should alter the labels according to the following logic: ``` data = CropByBoundingBox(opts)(data) trace, = data["targets"]["traces"].values() is_blacked_out = torch.all(trace["box_coordinates"] == -1, dim=2) data["targets"]["labels"][is_blacked_out] = ``` """ traces = data["targets"]["traces"] trace_identity = random.choice(list(traces.keys())) trace = traces[trace_identity] video = data["samples"]["video"] if self.channel_first: video = video.movedim(2, 1) N, T, C, H, W = video.shape expected_box_coordinates_shape = (N, T, 4) box_coordinates = trace["box_coordinates"] assert box_coordinates.shape == expected_box_coordinates_shape, ( f"Unexpected shape {trace['box_coordinates'].shape} !=" f" {expected_box_coordinates_shape}" ) if self.is_training and self.multiplier_range is not None: multiplier = random.uniform(*self.multiplier_range) else: multiplier = self.multiplier expanded_corners, box_coordinates = self.expand_boxes( trace["box_coordinates"], multiplier, height=H, width=W ) # (NxTx4, NxTx4) expanded_corners = ( (expanded_corners * torch.tensor([W, H, W, H]).float()).round().int() ) # NxTx4 result = torch.empty( [N * T, C, *self.image_size], dtype=video.dtype, device=video.device, ) for images, crop_corners, result_placeholder in zip( video.reshape(-1, C, H, W), expanded_corners.reshape(-1, 4).tolist(), result ): # TODO: add video_augmentation.crop_by_bounding_box.antialias argument to # experiment on antialias parameter of torchvision's resize function. width = crop_corners[2] - crop_corners[0] height = crop_corners[3] - crop_corners[1] if ( width * height < CropByBoundingBox.BBOX_MIN_AREA or width < 0 or height < 0 ): # If the bounding box is invalid or too small, avoid cropping. result_placeholder[...] = 0.0 # Create black frames else: result_placeholder[...] = FV.resized_crop( images, left=crop_corners[0], top=crop_corners[1], width=width, height=height, size=self.image_size, interpolation=InterpolationMode[self.interpolation.upper()], antialias=True, ) data["samples"]["video"] = result.reshape(N, T, C, *self.image_size) data["targets"]["traces"] = { trace_identity: {**trace, "box_coordinates": box_coordinates} } return data def expand_boxes( self, box_coordinates: torch.Tensor, multiplier: float, width: int, height: int ) -> Tuple[torch.Tensor, torch.Tensor]: """ Args: box_coordinates: Tensor of shape [..., 4] with (x0, y0, x1, y1) in [0,1]. multiplier: The multiplier to expand the bounding box coordinates. Outputs (tuple items): expanded_corners: Tensor of shape [..., 4] with (x0, y0, x1, y1), containing the coordinates for cropping. Because of the expansion, coordinates could be negative or >1. box_coordinates: Tensor of shape [..., 4] with (x0, y0, x1, y1) in [0,1] to be used as bounding boxes after cropping. height: Height of the frame (in pixels). width: Width of the frame (in pixels). """ x0 = box_coordinates[..., 0] # Shape: NxT y0 = box_coordinates[..., 1] x1 = box_coordinates[..., 2] y1 = box_coordinates[..., 3] area = (x1 - x0) * width * (y1 - y0) * height invisible_mask = area < CropByBoundingBox.BBOX_MIN_AREA dw = (x1 - x0) * (multiplier - 1) / 2 dh = (y1 - y0) * (multiplier - 1) / 2 expanded_corners = torch.stack( [ x0 - dw, y0 - dh, x1 + dw, y1 + dh, ], dim=-1, ) # If multiplier is 1, new box_coordinates should cover the whole image (i.e. # [0., 0., 1., 1.]), as image was cropped based on the box_coordinates. For # multiplier > 1, new box_coordinates should have a small margin within the # boundaries (i.e. [new_x0, new_y0, 1-new_x0, 1-new_y0]). box_coordinates = torch.empty_like(box_coordinates) box_coordinates[..., :2] = self.get_new_x0(multiplier) box_coordinates[..., 2:] = 1 - box_coordinates[..., :2] expanded_corners[invisible_mask] = -1 box_coordinates[invisible_mask] = -1 return expanded_corners, box_coordinates @classmethod def get_new_x0(cls, multiplier: float) -> float: # new_width = old_width * multiplier # new_x0 = [(new_width - old_width) / 2] / new_width # => new_x0 = (1 - 1/multiplier) / 2 return (1 - 1 / multiplier) / 2 @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--video-augmentation.crop-by-bounding-box.enable", action="store_true", help=( "Use {}. This flag is useful when you want to study the effect of" " different transforms. Default to False.".format(cls.__name__) ), ) group.add_argument( "--video-augmentation.crop-by-bounding-box.image-size", type=JsonValidator(Tuple[int, int]), default=None, help=( "Sizes [height, width] of the video frames after cropping. Defaults to" " None" ), ) group.add_argument( "--video-augmentation.crop-by-bounding-box.channel-first", action="store_true", default=False, help=( "If true, the video shape is [N, C, T, H, W]. Otherwise:" " [N, T, C, H, W]. Defaults to False." ), ), group.add_argument( "--video-augmentation.crop-by-bounding-box.multiplier-range", type=float, nargs=2, default=None, help=( "The bounding boxes get randomly expanded within the range before" " cropping. Useful for zooming in/out. Default None means no expansion" " of the bounding box." ), ) group.add_argument( "--video-augmentation.crop-by-bounding-box.multiplier", type=float, default=1, help=( "The bounding boxes get expanded by this multiplier before cropping." " Useful for zooming in/out. Defaults to 1." ), ) group.add_argument( "--video-augmentation.crop-by-bounding-box.interpolation", type=str, default="bilinear", choices=SUPPORTED_PYTORCH_INTERPOLATIONS, help="Desired interpolation method. Defaults to bilinear.", ) return parser def __repr__(self) -> str: return "{}(image size={}, channel_first={}, multiplier={})".format( self.__class__.__name__, self.image_size, self.channel_first, self.multiplier, ) @TRANSFORMATIONS_REGISTRY.register(name="shuffle-audios", type="video") class ShuffleAudios(BaseTransformation): def __init__( self, opts: argparse.Namespace, is_training: bool, is_evaluation: bool, item_index: int, *args, **kwargs, ) -> None: """Transforms a batch of audio-visual clips. Generates binary labels, useful for self-supervised audio-visual training. At each invocation, a subset of clips within video (batch) get their audios shuffled. The ratio of clips that participate in the shuffling is configurable by argparse options. When training, the shuffle order is random. When evaluating, the shuffle order is deterministic. Args: is_training: When False, decide to shuffle the audios or not deterministically. is_evaluation: Combined with @is_training, determines which shuffle ratio argument to use (train/val/eval). item_index: Used for deterministic shuffling based on the item_index. """ super().__init__(opts, *args, **kwargs) self.item_index = item_index self.is_training = is_training if is_training: self.shuffle_ratio = getattr( opts, "video_augmentation.shuffle_audios.shuffle_ratio_train" ) elif is_evaluation: self.shuffle_ratio = getattr( opts, "video_augmentation.shuffle_audios.shuffle_ratio_test" ) else: self.shuffle_ratio = getattr( opts, "video_augmentation.shuffle_audios.shuffle_ratio_val" ) self.generate_frame_level_targets = getattr( opts, "video_augmentation.shuffle_audios.generate_frame_level_targets", ) self.target_key = getattr(opts, "video_augmentation.shuffle_audios.target_key") self.debug_mode = getattr(opts, "video_augmentation.shuffle_audios.debug_mode") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-augmentation.shuffle-audios.shuffle-ratio-train", type=float, default=0.5, help=( "Ratio of training videos with shuffled audio samples. Defaults to 0.5." ), ) group.add_argument( "--video-augmentation.shuffle-audios.shuffle-ratio-val", type=float, default=0.5, help=( "Ratio of validation videos with shuffled audio samples. Defaults to " " 0.5." ), ) group.add_argument( "--video-augmentation.shuffle-audios.shuffle-ratio-test", type=float, default=0.5, help="Ratio of test videos with shuffled audio samples. Defaults to 0.5.", ) group.add_argument( "--video-augmentation.shuffle-audios.generate-frame-level-targets", default=False, action="store_true", help=( "If true, the generated targets will be 2-dimensional (n_clips x " "n_frames). Otherwise, targets will be 1 dimensional (n_clips)." " Defaults to False." ), ) group.add_argument( "--video-augmentation.shuffle-audios.target-key", default="is_shuffled", type=str, help=( "Defaults to 'is_shuffled'. Name of the sub-key in data['targets'] " " to store the labels tensor. For each clip index `i`, we will have" " data['targets']['is_shuffled'][i] == 0 iff audio of the clip matches" " the video, otherwise 1." ), ) group.add_argument( "--video-augmentation.shuffle-audios.debug-mode", default=False, action="store_true", help=( "If enabled, the permutation used for shuffling the clip audios will be" " added to data['samples']['metadata']['shuffled_audio_permutation']" " for debugging purposes. Defaults to False." ), ) return parser @staticmethod def _single_cycle_permutation( numel: int, is_training: bool, device: torch.device ) -> torch.LongTensor: """ Returns a permutation of values 0 to @numel-1 that has the following property: For each index 0 <= i < numel: result[i] != i. Args: numel: Number of elements in the output permutation (must be >1). is_training: If true, the output permutation will be deterministic. device: Torch device (e.g. cuda, cpu) to use for output tensor. """ assert numel > 1, "Cannot create a single-cycle permutation with <= 1 elements." deterministic_single_cycle_perm = torch.roll( torch.arange(numel, device=device), numel // 2 ) if not is_training: return deterministic_single_cycle_perm random_perm = torch.randperm(numel, device=device) random_perm_inv = torch.empty_like(random_perm) random_perm_inv[random_perm] = torch.arange(numel, device=device) # Proof that this implementation satisfies output[i] != i criteria: # 1. We know deterministic_single_cycle_perm[i] != i, because of the way it is # constructed ([n//2, n//2+1, ..., n, 1, 2, ..., n//2-1]). # 2. ``rand_perm`` is a non-deterministic random permutation, and # ``rand_perm_inv`` is the inverse of `rand_perm`. That means for each # 0 <= i < numel, we have: rand_perm_inv[rand_perm[i]] == i. # 3. Proof by contradiction: Let's assume, for 0 <= i < numel, i == output[i]: # Thus: random_perm[deterministic_single_cycle_perm[random_perm_inv]][i] == i # 4. For any two torch tensors a, b that expression `a[b]`` is valid, we have # a[b][i] == a[b[i]]. Thus, we can rewrite the assumption of step 3 as: # i == random_perm[deterministic_single_cycle_perm[random_perm_inv[i]]] # 5. Now, apply rand_perm_inv[] on both sides of the equality: # rand_perm_inv[i] == deterministic_single_cycle_perm[random_perm_inv[i]] # Then, alias rand_perm_inv[i] as x. Then we will have: # x == deterministic_single_cycle_perm[x] # 6. Assumption of step (3) leads to (5) which contradicts (1). Thus, assumption # of step (3) is false. Thus, output[i] != i return random_perm[deterministic_single_cycle_perm[random_perm_inv]] def _random_outcome(self, n: int) -> torch.Tensor: """Returns a pseudo random tensor of size n in range [0, 1]. For evaluation, the outcome is a deterministic function of n and `self.item_index` Args: n: Length of the output tensor. Returns: A tensor of length n, of random floats uniformly distributed between 0-1. The output is deterministic iff self.is_training is False. """ if self.is_training: return torch.rand(n) else: return ( (((self.item_index + 1) % torch.pi) * (torch.arange(n) + 1)) % torch.pi ) / torch.pi def _random_participants_mask(self, n: int) -> torch.BoolTensor: """Returns a pseudo random boolean tensor of size n, where exactly ``int( self.shuffle_ratio * n)`` indices are True, and the rest are False. """ x = self._random_outcome(n) x = x.argsort() < self.shuffle_ratio * n - 1e-8 return x def __call__(self, data: Dict) -> Dict: audio = data["samples"]["audio"] N = len(audio) if N == 1: shuffled_permutation = torch.tensor([0], device=audio.device) is_shuffling_participant_mask = torch.tensor([False], device=audio.device) elif N > 1: shuffled_permutation = self._single_cycle_permutation( N, device=audio.device, is_training=self.is_training ) is_shuffling_participant_mask = self._random_participants_mask(N) shuffled_permutation = torch.where( is_shuffling_participant_mask, shuffled_permutation, torch.arange(N), ) else: raise ValueError("Insufficient clips (N={N}) in batch.") data["samples"]["audio"] = audio[shuffled_permutation] if self.debug_mode: data["samples"]["metadata"][ "shuffled_audio_permutation" ] = shuffled_permutation target_dims = 2 if self.generate_frame_level_targets else 1 labels = torch.zeros( data["samples"]["video"].shape[:target_dims], device=audio.device, dtype=torch.long, ) labels[is_shuffling_participant_mask] = 1.0 # 1 means shuffled data["targets"][self.target_key] = labels return data ================================================ FILE: corenet/data/video_reader/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.data.video_reader.base_av_reader import BaseAVReader from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.registry import Registry VIDEO_READER_REGISTRY = Registry( "video_reader", base_class=BaseAVReader, lazy_load_dirs=["corenet/data/video_reader"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_video_reader(parser: argparse.ArgumentParser): parser = BaseAVReader.add_arguments(parser=parser) # add video reader specific arguments parser = VIDEO_READER_REGISTRY.all_arguments(parser) return parser def get_video_reader( opts: argparse.Namespace, log: bool = True, *args, **kwargs ) -> BaseAVReader: """Helper function to build the video reader from command-line arguments. Args: opts: Command-line arguments log: When True, the video reader details will be logged to stdout. """ video_reader_name = getattr(opts, "video_reader.name") # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if video_reader_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") video_reader = VIDEO_READER_REGISTRY[video_reader_name](opts, *args, **kwargs) is_master_node = is_master(opts) if log and is_master_node: logger.log("Video reader details: ") print("{}".format(video_reader)) return video_reader ================================================ FILE: corenet/data/video_reader/base_av_reader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Dict, Optional, Tuple, Union import av import numpy import torch import torch.nn.functional as F from torch import Tensor from corenet.data.transforms import BaseTransformation from corenet.data.transforms import image_pil as T from corenet.data.transforms.common import Compose from corenet.options.utils import ( extend_selected_args_with_prefix, extract_opts_with_prefix_replacement, ) from corenet.utils import logger class VideoDurationDoesNotMatchAudioDurationError(AssertionError): pass audio_video_duration_warnings = set() def check_audio_video_duration( vid_filename: str, audio_sec: float, video_sec: float ) -> None: """Check audio/video alignment, throw an exception or print a warning if it is off.""" difference = numpy.fabs(audio_sec - video_sec) if difference > 0.1: message = f"Audio duration {audio_sec} mismatches video duration {video_sec} for {vid_filename}" if difference > 0.2: raise VideoDurationDoesNotMatchAudioDurationError(message) if vid_filename not in audio_video_duration_warnings: audio_video_duration_warnings.add(vid_filename) logger.warning(message) class BaseAVReader(object): """ Base AudioVideo Reader Args: opts: command line arguments is_training: Training or validation mode. Default: `False`. """ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if ( cls != BaseAVReader ): # Shouldn't run for subclasses that don't override add_arguments return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--video-reader.name", type=str, default="pyav", help="Name of video reader.", ) group.add_argument( "--video-reader.fast-video-decoding", action="store_true", help="Multi-threaded fast video decoding using pyav.", ) group.add_argument( "--video-reader.frame-stack-format", type=str, default="sequence_first", choices=["sequence_first", "channel_first"], help="Sequence first (NTCHW) or channel first (NCTHW) format for stacking" " video frames.", ) # We want to be able to re-use the "image" augmentations on the video frames. # As the use of "--image-augmentation.*" argparse prefix for video datasets can # be confusing, we use "--frame-augmentation.*" prefix. parser = extend_selected_args_with_prefix( parser, match_prefix="--image-augmentation.", additional_prefix="--frame-augmentation.", ) return parser def __init__( self, opts: argparse.Namespace, is_training: Optional[bool] = False, *args, **kwargs, ): super().__init__() self.opts = opts self.fast_decoding = getattr(opts, "video_reader.fast_video_decoding") frame_stack_format = getattr( opts, "video_reader.frame_stack_format", "sequence_first" ) if frame_stack_format not in ["sequence_first", "channel_first"]: logger.error( "Frame stacking format should be either sequence_first or channel_first." ) self.channel_first_format = frame_stack_format == "channel_first" self.frame_transforms = self.get_frame_transform(opts, is_training=is_training) self.num_frames_cache = dict() @staticmethod def get_frame_transform( opts: argparse.Namespace, is_training: bool, *args, **kwargs ) -> BaseTransformation: if is_training: auto_augment = getattr( opts, "frame_augmentation.auto_augment.enable", ) rand_augment = getattr( opts, "frame_augmentation.rand_augment.enable", ) random_erase = getattr( opts, "frame_augmentation.random_erase.enable", ) # We want to be able to re-use the "image" augmentations on the video frames. # As the use of "--image-augmentation.*" argparse prefix for video datasets can # be confusing, we use "--frame-augmentation.*" prefix. frame_opts = extract_opts_with_prefix_replacement( opts, match_prefix="frame_augmentation.", replacement_prefix="image_augmentation.", ) if is_training: aug_list = [] if auto_augment and rand_augment: logger.error( "AutoAugment and RandAugment are mutually exclusive. Use either of" " them, but not both." ) elif auto_augment: aug_list.append(T.AutoAugment(opts=frame_opts)) elif rand_augment: aug_list.append(T.RandAugment(opts=frame_opts)) aug_list.append(T.ToTensor(opts=frame_opts)) if random_erase: aug_list.append(T.RandomErasing(opts=frame_opts)) return Compose(opts=frame_opts, img_transforms=aug_list) else: return T.ToTensor(opts=frame_opts) def __repr__(self): return "{}(\n\tfast_decoding={}\n\tchannel_first_format={}\n)".format( self.__class__.__name__, self.fast_decoding, self.channel_first_format, ) def check_video(self, filename: str) -> bool: try: # Adapted from basic demo: https://pyav.org/docs/stable/#basic-demo with av.open(filename) as container: # Decode the first video channel. for frame in container.decode(video=0): frame_idx = frame.index break return True except Exception as e: return False def read_video( self, filename: str, stream_idx: int = 0, audio_sample_rate: int = -1, custom_frame_transforms: Optional[BaseTransformation] = None, video_only: bool = False, *args, **kwargs, ) -> Dict: raise NotImplementedError def build_video_metadata( self, video_path: str ) -> Dict[str, Union[str, float, int]]: """Generate the metadata for a given video. Args: video_path: A video file path. Returns: The metadata of the corresponding video. The generated metadata format is: { "filename": , "video_fps": , "total_video_frames" , "video_duration": , } """ raise NotImplementedError def num_frames(self, filename: str) -> int: if filename in self.num_frames_cache: return self.num_frames_cache[filename] else: with av.open(filename) as container: total_frames = container.streams.video[0].frames self.num_frames_cache[filename] = total_frames return total_frames @staticmethod def random_sampling( total_video_frames: int, video_frames_per_clip: int, clips_per_video: int, total_audio_frames: Optional[int] = None, ) -> Tuple[Tensor, Optional[Tensor]]: """ For a given video, sample `clips_per_video` indices randomly along with aligned audio indices (optionally). Args: total_video_frames : number of video frames in the given video. video_frames_per_clip : number of frames required per clip. clips_per_video : number of clips needed from a given video. total_audio_frames : number of audio frames in the given video. Return: vclip_ids : indices corresponding to video frames [Tensor (clips_per_video x video_frames_per_clip)]. aclip_ids : indices corresponding to audio frames [Tensor (clips_per_video x audio_frames_per_clip)]. """ clip_start_frame_ids = torch.randint( total_video_frames - video_frames_per_clip + 1, (clips_per_video,) ) vclip_ids = clip_start_frame_ids[:, None] + torch.arange(video_frames_per_clip) aclip_ids = None if total_audio_frames is not None: a_start_frame = ( clip_start_frame_ids * total_audio_frames / total_video_frames ).long() a_step_size = int( video_frames_per_clip * total_audio_frames / total_video_frames ) aclip_ids = a_start_frame[:, None] + torch.arange(a_step_size) return vclip_ids, aclip_ids @staticmethod def uniform_sampling( total_video_frames: int, video_frames_per_clip: int, clips_per_video: int, total_audio_frames: Optional[int] = None, ) -> Tuple[Tensor, Optional[Tensor]]: """ For a given video, sample `clips_per_video` indices uniformly along with aligned audio indices (optionally). Args: total_video_frames : number of video frames in the given video. video_frames_per_clip : number of frames required per clip. clips_per_video : number of clips needed from a given video. total_audio_frames : number of audio frames in the given video. Return: vclip_ids : indices corresponding to video frames [Tensor (clips_per_video x video_frames_per_clip)]. aclip_ids : indices corresponding to audio frames [Tensor (clips_per_video x audio_frames_per_clip)]. """ clip_start_frame_ids = torch.linspace( 0, total_video_frames - video_frames_per_clip, clips_per_video ) vclip_ids = ( clip_start_frame_ids[:clips_per_video, None] + torch.arange(video_frames_per_clip) ).long() aclip_ids = None if total_audio_frames is not None: a_start_frame = ( clip_start_frame_ids * total_audio_frames / total_video_frames ).long() a_step_size = int( video_frames_per_clip * total_audio_frames / total_video_frames ) aclip_ids = a_start_frame[:clips_per_video, None] + torch.arange( a_step_size ) return vclip_ids, aclip_ids def read_video_file_into_clips( self, vid_filename: str, num_frames_per_clip: int, clips_per_video: int, is_training: bool, video_only: bool = False, output_video_fps: float = -1, output_audio_fps: int = -1, num_samples_per_clip: int = 1, custom_frame_transforms: Optional[BaseTransformation] = None, *args, **kwargs, ) -> Dict: """Read a video file into clips and sample the clips at the specified video/audio frame rate. First, we read all the video and audio frames into the memory, where audio is at `output_audio_fps` if specified; then we sample `clips_per_video` clips from the entire video/audio tensor. If the desired video frame rate is specified, we subsample the video at frame rate `output_video_fps`. Despite whether the video is subsampled or not, there are `num_frames_per_clip` video frames in each clip. Args: vid_filename: The path of the video to be read. num_frames_per_clip: Number of frames per clip to read. clips_per_video: Number of clips to read for each video. is training: A boolean of whether the model is in training. output_video_fps: The frame rate of the output video. Default is -1, which means no resampling is required. output_audio_fps: The frame rate of the output audio. Default is -1, which means no resampling is required. num_samples_per_clip: Number of random samples to generate per clip. custom_frame_transforms: If provided, the transformation will be used instead of the default @BaseAVReader.get_frame_transforms. Note: Be careful when customizing frame transforms, because there might exist slight differences between the data type of frames read by different AVReaders before ToTensor() gets applied. Tensor shape abbreviations: N: Number of clips. T, T_audio, T_video: Temporal lengths. C: Number of color channels. H, W: Height, Width. Returns: A dictionary of the following format { "audio": Tensor [N,T_audio,C], "video": Tensor [N,T_video,C,H,W], metadata: { "audio_fps": float, "video_fps": float, "filename": str, "video_frame_timstamps": Tensor[N,T_video] }, } """ av_data = self.read_video( vid_filename, audio_sample_rate=output_audio_fps, video_only=video_only, custom_frame_transforms=custom_frame_transforms, # At this stage, we read the video with its original frame rate, so that # we can introduce small perterbations in the frame selection process # (i.e. down sampling) during training. video_fps=-1, ) torch_video = av_data["video"] torch_audio = av_data["audio"] metadata = av_data["metadata"] original_video_fps = metadata["video_fps"] audio_fps = metadata["audio_fps"] assert isinstance( torch_video, Tensor ), f"Video read from {vid_filename} expected to be a tensor." num_video_frames = torch_video.shape[0] # If we need to downsample the frames, read the video frames the same length in # second, then downsample output frames. if output_video_fps > 0: clip_duration = num_frames_per_clip / output_video_fps num_video_frames_to_sample = min( num_video_frames, round(clip_duration * original_video_fps), ) metadata["video_fps"] = output_video_fps # If no frame resampling is required, read @num_frames_per_clip # consecutive frames. else: num_video_frames_to_sample = num_frames_per_clip clip_duration = num_frames_per_clip / original_video_fps if torch_audio is None: num_audio_frames = None else: num_audio_frames = torch_audio.shape[0] check_audio_video_duration( vid_filename, num_audio_frames / audio_fps, num_video_frames / original_video_fps, ) if num_video_frames >= num_frames_per_clip: sampling_fn = self.random_sampling if is_training else self.uniform_sampling vclip_ids, aclip_ids = sampling_fn( total_video_frames=num_video_frames, video_frames_per_clip=num_video_frames_to_sample, clips_per_video=clips_per_video, total_audio_frames=num_audio_frames, ) else: vclip_ids = aclip_ids = None num_samples_per_clip = num_samples_per_clip if is_training else 1 video_clips, metadata = self._generate_video_clips( full_video_tensor=torch_video, vclip_ids=vclip_ids, metadata=metadata, clips_per_video=clips_per_video, num_frames_per_clip=num_frames_per_clip, original_video_fps=original_video_fps, output_video_fps=output_video_fps, is_training=is_training, num_samples_per_clip=num_samples_per_clip, ) if torch_audio is None: audio_clips = None else: audio_clips = self._generate_audio_clips( full_audio_tensor=torch_audio, aclip_ids=aclip_ids, clip_duration=clip_duration, clips_per_video=clips_per_video, audio_fps=audio_fps, num_samples_per_clip=num_samples_per_clip, ) if audio_clips is not None: assert ( video_clips.shape[0] == audio_clips.shape[0] ), f"Video and audio doesn't have the same number of clips, got {video_clips.shape[0]} and {audio_clips.shape[0]}." return { "video": video_clips, "audio": audio_clips, "metadata": metadata, } def _generate_video_clips( self, full_video_tensor: torch.Tensor, vclip_ids: Optional[torch.Tensor], metadata: Dict, num_frames_per_clip: int, clips_per_video: int, original_video_fps: float, output_video_fps: float, is_training: bool, num_samples_per_clip: Optional[int], ) -> Tuple[torch.Tensor, Dict]: """Given entire video tensor of a video file and the indices of the sampled video frames, return the video clips. If there's not enough frames, the last frame will be padded. If `output_video_fps` is smaller than `original_video_fps`, video frames will be downsampled accordingly. Args: full_video_tensor: A [T x 3 x H x W] tensor of all frames of a video, where T is the total number of frames, H and W is the height and width of each frame image. vclip_ids: A [clips_per_video x N] tensor of the index of the sampled frames in `full_video_tensor`, where N is the number of sampled frames. metadata: A dictionary of the video's metadata information. num_frames_per_clip: Number of frames of the output clips. clips_per_video: Number of clips per video. original_video_fps: The frame rate of the video. output_video_fps: The frame rate of the output video clips. is_training: Whether it's in training mode. No randomness is applied if set False. num_samples_per_clip: Number of samples per clip to generate when the frames are downsampled. Returns: video_clips: A [clips_per_video x num_frames_per_clip x 3 x H x W] tensor. """ ( num_video_frames, frame_channels, frame_height, frame_width, ) = full_video_tensor.shape if num_video_frames < num_frames_per_clip: # Repeat the last frame. num_video_frames_to_pad = num_frames_per_clip - num_video_frames padded_video = torch.zeros( size=( num_frames_per_clip, frame_channels, frame_height, frame_width, ), dtype=full_video_tensor.dtype, device=full_video_tensor.device, ) padded_video[:num_video_frames] = full_video_tensor padded_video[num_video_frames:, :, :, :] = full_video_tensor[-1].unsqueeze( 0 ) num_repeats = ( clips_per_video * num_samples_per_clip if is_training else clips_per_video ) video_clips = padded_video.repeat((num_repeats, 1, 1, 1, 1)) vclip_ids = torch.zeros((num_repeats, 1)) + torch.arange(num_video_frames) vclip_ids = F.pad(vclip_ids, (0, num_video_frames_to_pad), mode="replicate") else: if 0 < output_video_fps < original_video_fps: vclip_ids = _downsample_frame_indices( frame_indices=vclip_ids, input_fps=original_video_fps, output_num_frames=num_frames_per_clip, output_fps=output_video_fps, num_samples=num_samples_per_clip, random_frames=is_training, ) else: if num_samples_per_clip > 1: # Duplicate video if multiple samples are generated for each clip at # training time. vclip_ids = torch.repeat_interleave( vclip_ids, num_samples_per_clip, dim=0 ) video_clips = full_video_tensor[vclip_ids] metadata["video_frame_timestamps"] = vclip_ids / original_video_fps if self.channel_first_format: video_clips = video_clips.transpose(1, 2) return video_clips, metadata def _generate_audio_clips( self, full_audio_tensor: torch.Tensor, aclip_ids: Optional[torch.Tensor], clip_duration: float, clips_per_video: int, audio_fps: float, num_samples_per_clip: Optional[int] = 1, ) -> torch.Tensor: """Given entire audio tensor of a video file and the indices of the sampled audio frames, pad to the desire shape if needed and return the audio clips. Args: full_audio_tensor: A [T x C] tensor of all frames of a audio, where T is the total number of frames, C is the number of channels. The audio is mono when C == 1 and stero when C == 2. aclip_ids: A [clips_per_video x N] tensor of the index of the sampled frames in `full_audio_tensor`, where N is the number of sampled frames. clip_duration: The duration in second of each clip. clips_per_video: Number of clips per video to generate. audio_fps: The frame rate of the audio. The audio is not changed in this function. num_samples_per_clip: Number of samples to generate for each clip. This is to match the shape of the video if multiple samples are generated during training. Returns: A [clips_per_video x N x C] tensor as the audio clips, where N is the number of frames within `clip_duration` time at `audio_fps` frame rate. """ num_audio_frames = full_audio_tensor.shape[0] # Compute the output clip length in second with the output fps and number of # frames. expected_num_audio_frames = int(clip_duration * audio_fps) if full_audio_tensor.shape[0] < expected_num_audio_frames: num_audio_frames_to_pad = ( expected_num_audio_frames - full_audio_tensor.shape[0] ) full_audio_tensor = F.pad( full_audio_tensor, (0, 0, 0, num_audio_frames_to_pad) ) audio_clips = full_audio_tensor.repeat((clips_per_video, 1, 1)) else: # [num_frames, channels] --> [num_clips, per_clip_audio, channels] audio_clips = full_audio_tensor[aclip_ids] num_audio_frames_to_pad = expected_num_audio_frames - audio_clips.shape[1] audio_clips = F.pad(audio_clips, (0, 0, 0, num_audio_frames_to_pad)) # Duplicate audio if multiple samples are generated for each clip at training # time. audio_clips = torch.repeat_interleave(audio_clips, num_samples_per_clip, dim=0) return audio_clips def dummy_audio_video_clips( self, clips_per_video: int, num_frames_to_sample: int, height: int, width: int, audio_fps: int = 16000, video_fps: Union[float, int] = 30, ) -> Dict: # [K, C, T, H, W] or # [K, N, T, H, W] # K --> number of clips, C --> Image channels, N --> Number of frames per clip, # H --> Height, W --> Width. video_tensor_size = ( (clips_per_video, 3, num_frames_to_sample, height, width) if self.channel_first_format else (clips_per_video, num_frames_to_sample, 3, height, width) ) video_clips = torch.zeros( size=video_tensor_size, dtype=torch.float32, device=torch.device("cpu"), ) # Dummy clips for audio audio_tensor_size = ( clips_per_video, int(num_frames_to_sample * audio_fps / video_fps), 1, ) audio_clips = torch.zeros( size=audio_tensor_size, dtype=torch.float32, device=torch.device("cpu"), ) metadata = { "video_fps": video_fps, "audio_fps": audio_fps, "filename": "dummy.mp4", } return { "video": video_clips, "audio": audio_clips, "metadata": metadata, } def _downsample_frame_indices( frame_indices: torch.Tensor, input_fps: float, output_num_frames: int, output_fps: float, num_samples: int, random_frames: bool, ) -> torch.Tensor: """Downsample frames from a frame indices at a given @output_fps and with a given @output_num_frames. This is used as a helper function for batch samplers that construct shorter video clips from a longer video clip. For example, we might load a 70-frame clip at 30fps and use it to construct 4 different batch samples corresponding to 8-frame clips at 8fps. Args: frame_indices: A [K, N] tensor as the index of each frame, where K is the batch dimension, N is the number of frames. input_fps: The frame rate to be downsampled from. output_num_frames: The number of frames to output in each sample. output_fps: The desired fps of the output frames. num_samples: The number of batch samples to construct from the data. random_frames: If False, the input indices will be used to construct a single example. If True, random offsets will be applied to the frame indices as an augmentation. Returns: output_frame_indices: A [K_out, N_out] tensor as the frame indices to sample, where: - N_out = @output_num_frames - K_out = K * @num_samples. """ if not random_frames and num_samples != 1: raise ValueError( "Frames are deterministic, so set num_samples to 1. Got num_samples={num_samples}." ) assert num_samples >= 1, f"num_samples has to be positive, got {num_samples}." assert ( input_fps > output_fps ), f"Output fps {output_fps} has to be smaller than the input fps {input_fps}." frames_per_clip = frame_indices.shape[1] assert ( frames_per_clip >= output_num_frames ), f"Need to load more frames sample, can't sample {output_num_frames} from {frames_per_clip} frames." output_frame_indices = [] desired_length_seconds = output_num_frames / output_fps num_frames_to_sample = min(frames_per_clip, int(desired_length_seconds * input_fps)) positions = (torch.linspace(0, num_frames_to_sample, output_num_frames + 1)).long() for _ in range(num_samples): if random_frames: # Choose a starting timestamp for the frames. last_valid_idx = frames_per_clip - num_frames_to_sample frame_start_idx = random.randint(0, last_valid_idx) else: # We don't apply any offsets or randomness to the video frames, so we start # the video frames at index 0. frame_start_idx = 0 selected_frame_indices = frame_indices[ :, frame_start_idx : frame_start_idx + num_frames_to_sample, ] if random_frames: # Choose the middle of the chunk as the label. Then, choose the frame at # random from the time slices. selected_frame_locations = [] for i in range(output_num_frames): # Select a random frame in the chunk. # NOTE: random.randint() is inclusive on both ends, while # torch.randint() is exclusive for the higher range. selection = random.randint(positions[i], positions[i + 1] - 1) selected_frame_locations.append(selection) else: # We choose frames deterministically. Since we don't apply any offsets to # the video, the correct frames are at the beginning of each range. selected_frame_locations = positions[:-1] output_frame_indices.append(selected_frame_indices[:, selected_frame_locations]) return torch.cat(output_frame_indices) ================================================ FILE: corenet/data/video_reader/decord_reader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys from typing import Dict, Optional, Union from corenet.data.transforms.base_transforms import BaseTransformation from corenet.utils.import_utils import ensure_library_is_available try: import decord except ImportError: pass import av import torch from corenet.data.video_reader import VIDEO_READER_REGISTRY from corenet.data.video_reader.pyav_reader import BaseAVReader from corenet.utils import logger @VIDEO_READER_REGISTRY.register(name="decord") class DecordAVReader(BaseAVReader): """ Video Reader using Decord. """ def __init__(self, *args, **kwargs): ensure_library_is_available("decord") super().__init__(*args, **kwargs) def read_video( self, av_file: str, stream_idx: int = 0, audio_sample_rate: int = -1, custom_frame_transforms: Optional[BaseTransformation] = None, video_only: bool = False, *args, **kwargs ) -> Dict: video_frames = audio_frames = None video_fps = audio_fps = None decord.bridge.set_bridge("torch") # We have to use av package to obtain audio fps, which is not available in # decord. with av.open(str(av_file)) as container: available_streams = [] for stream in container.streams: if stream.type == "audio": # Skip audio stream if audio not required. if video_only: continue audio_fps = container.streams.audio[0].sample_rate available_streams.append(stream.type) for stream_type in available_streams: if stream_type == "video": with open(str(av_file), "rb") as f: video_reader = decord.VideoReader(f, ctx=decord.cpu(0)) n_video_frames = video_reader._num_frame video_frames = [] frame_transforms = ( self.frame_transforms if custom_frame_transforms is None else custom_frame_transforms ) for _ in range(n_video_frames): video_frame = video_reader.next() # H, W, C video_frame = video_frame.permute(2, 0, 1) # C, H, W video_frame = frame_transforms({"image": video_frame})["image"] video_frames.append(video_frame) video_frames = torch.stack(video_frames) video_fps = video_reader.get_avg_fps() if stream_type == "audio": with open(str(av_file), "rb") as f: audio_reader = decord.AudioReader( f, ctx=decord.cpu(0), sample_rate=audio_sample_rate ) audio_frames = torch.tensor(audio_reader._array).transpose(0, 1) audio_fps = ( audio_sample_rate if audio_sample_rate > 0 else audio_fps ) return { "audio": audio_frames, # expected format T x C "video": video_frames, # expected format T x C x H x W "metadata": { "audio_fps": audio_fps, "video_fps": video_fps, "filename": av_file, }, } def build_video_metadata( self, video_path: str ) -> Dict[str, Union[str, float, int]]: """Generate the metadata for a given video. Args: video_path: A video file path. Returns: The metadata of the corresponding video. The generated metadata format is: { "filename": , "video_fps": , "total_video_frames" , "video_duration": , } """ vmetadata = {} vr = decord.VideoReader(video_path, ctx=decord.cpu(0), num_threads=1) with av.open(video_path) as container: vmetadata["filename"] = video_path video_stream = container.streams.video[0] vmetadata["total_video_frames"] = len(vr) vmetadata["video_fps"] = float(vr.get_avg_fps()) vmetadata["video_duration"] = ( vmetadata["total_video_frames"] / vmetadata["video_fps"] ) return vmetadata def build_audio_metadata( self, video_path: str ) -> Dict[str, Union[str, float, int]]: """Generate the audio metadata for a given video. Args: video_path: A video file path. Returns: The audio metadata of the corresponding video. The metadata format is: { "audio_channels": int, "audio_fps": int, "total_audio_frames": int, "audio_duration": float, } """ metadata = {} # Decord doesn't provide audio_fps. Thus, we use PyAV. with av.open(str(video_path)) as container: for stream in container.streams: container.seek(0) if stream.type == "audio": if "audio_fps" in metadata: raise ValueError( "Multiple audio streams exist while at most 1 is expected." ) audio_stream = container.streams.audio[0] metadata["audio_channels"] = len(audio_stream.layout.channels) metadata["audio_fps"] = audio_stream.sample_rate # `audio_stream.frames` does not work for unknown reason. metadata["total_audio_frames"] = self._get_total_audio_frames( video_path, audio_stream.sample_rate ) metadata["audio_duration"] = ( metadata["total_audio_frames"] / metadata["audio_fps"] ) return metadata @staticmethod def _get_total_audio_frames(video_path: str, sample_rate: Union[int, float]) -> int: """Returns the total number frames in the audio stream of @video_path. Args: video_path: Path to the local video file. sample_rate: Sample rate of the audio stream. """ with open(str(video_path), "rb") as f: # FIXME: Type of the @sample_rate is Union[int,float], but decord expects an # integer. We should investigate what happens when floating point values are # passed to this function. This issue might cause some misalignment between # the audio and the video. audio_reader = decord.AudioReader( f, ctx=decord.cpu(0), sample_rate=sample_rate ) result = audio_reader.shape[1] return result ================================================ FILE: corenet/data/video_reader/ffmpeg_reader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import subprocess import sys import warnings from math import isclose from typing import Any, Dict, Optional, Tuple, Union import torch from corenet.data.transforms.base_transforms import BaseTransformation from corenet.data.transforms.common import Compose from corenet.data.video_reader import VIDEO_READER_REGISTRY, ffmpeg_utils from corenet.data.video_reader.base_av_reader import BaseAVReader from corenet.utils.check import check from corenet.utils.import_utils import ensure_library_is_available try: import ffmpeg except ImportError: pass @VIDEO_READER_REGISTRY.register(name="ffmpeg") class FFMPEGReader(BaseAVReader): """ This is an experimental AVReader that decodes videos using ffmpeg subprocess. This reader handles memory better than DecordReader with large datasets. Hence, we can enable --dataset.persistent_workers and --dataset.pin_memory, without OOM Error, to speedup the training. However, the improvement in accuracy isn't guaranteed yet. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: ensure_library_is_available("ffmpeg") super().__init__(opts, *args, **kwargs) def read_video( self, filename: str, stream_idx: int = 0, audio_sample_rate: int = -1, video_fps: float = -1, custom_frame_transforms: Optional[BaseTransformation] = None, video_only: bool = False, align_audio_video: bool = False, threads: int = 1, crop_w_h_x_y: Optional[Tuple[int, int, int, int]] = None, ffmpeg_loglevel: str = "error", *args, **kwargs, ) -> Dict: """Reads the video frames and audio samples of a video file into torch Tensors. Args: filename: Path of the video file. stream_idx: Video stream index, for files with multiple video streams. This subclass only supports videos with a single video stream. Defaults to 0. audio_sample_rate: Controls the audio sample rate when reading audio. If not specified (-1), the file's original sample rate gets used. Defaults to -1. video_fps: Controls the frame rate for reading video. If not specified (-1), the file's average frame rate gets used. If the input video is encoded with dynamic frame rate, this reader instructs ffmpeg to read the video with constant (average) frame rate. custom_frame_transforms: If provided, the given transformation gets used, rather then the default ``BaseAVReader.get_frame_transform()`` for transforming individual frames. Defaults to None. video_only: When True, the audio stream gets skipped. Defaults to False. align_audio_video: When True, the audio/video tensors will be trimmed to ensure they are exactly the same temporal length. threads: Number of cpu threads to use for decoding and transforming the video. Note that we don't have full control over ffmpeg, and some ffmpeg components may ignore this flag. Defaults to 1. crop_w_h_x_y: If provided, the frames will be cropped as early as possible within ffmpeg pipeline, before being sent to Python. Defaults to None. For example, given crop_w_h_x_y=(10, 20, 50, 100), the video tensor will be a tensor of shape [T, C, 40, 30], cropped at 50<=x<60 and 100<=y<120, where T is the temporal length and is the number of channels. ffmpeg_loglevel: Controls the log level of ffmpeg library. NOTE: Values other than "error" may cause too many lines of log, and may result in buffer overflows resulting in halted training. Defaults to "error". Tensor shape abbreviations: T, T_audio, T_video: Temporal lengths. C: Number of color channels. H, W: Height, Width. Returns: A dictionary of the following format { "audio": Tensor [T_audio,C], "video": Tensor [T_video,C,H,W], metadata: { "audio_fps": float, "video_fps": float, "filename": str, }, } Note: * For random cropping, please use custom_frame_transforms argument. This argument (crop_w_h_x_y) translates to `crop=out_w:out_h:x:y` static ffmpeg cli argument that applies the same bounding box to all frames. """ if stream_idx != 0: raise NotImplementedError( f"Reading videos with stream_idx={stream_idx} is not supported yet." ) try: video_metadata = ffmpeg_utils.get_video_metadata(filename) video = ffmpeg.input( filename, threads=str(threads), loglevel=ffmpeg_loglevel, ).video if crop_w_h_x_y is not None: width, height, x, y = crop_w_h_x_y video = video.crop(width=width, height=height, x=x, y=y) else: height = video_metadata["height"] width = video_metadata["width"] if video_fps != -1: video = video.filter("fps", fps=video_fps) video = video.output( "pipe:", format="rawvideo", pix_fmt="rgb24", threads=str(threads), loglevel=ffmpeg_loglevel, ) video = video.global_args( "-threads", str(threads), "-loglevel", ffmpeg_loglevel, ) video = subprocess.run( video.compile(), capture_output=True, stdin=subprocess.DEVNULL, ).stdout with warnings.catch_warnings(): warnings.simplefilter("ignore") video = torch.frombuffer(video, dtype=torch.uint8) video = video.reshape(-1, height, width, 3) if video_fps == -1: video_fps = video_metadata["video_fps"] expected_frames = int(video_metadata["video_duration"] * video_fps) if not isclose(expected_frames, video.shape[0], rel_tol=0.05, abs_tol=1): raise ValueError( "Expected" f" {video_metadata['video_duration']}*{video_fps}={expected_frames} video" f" frames, but got {video.shape[0]} frames." ) video = video.permute(0, 3, 1, 2) # [T,H,W,C] -> [T,C,H,W] if not video_only: audio, audio_metadata = self.read_audio( filename, audio_sample_rate=audio_sample_rate, threads=threads ) audio_sample_rate = audio_metadata["audio_fps"] if align_audio_video: audio_samples_per_frame = audio_sample_rate / video_fps check( audio_samples_per_frame.is_integer(), lambda: f"Cannot align A/V: Audio sample rate {audio_sample_rate} is not divisible by video fps {video_fps}", ) frames = min( video.shape[0], audio.shape[0] // int(audio_samples_per_frame), ) video = video[:frames] audio = audio[: frames * int(audio_samples_per_frame)] except ffmpeg.Error as e: raise RuntimeError(e.stderr) from e video = self._transform_video_frames( video, ( self.frame_transforms if custom_frame_transforms is None else custom_frame_transforms ), ) result = { "audio": audio if not video_only else None, "video": video, "metadata": { "audio_fps": audio_sample_rate if not video_only else None, "video_fps": video_fps, "video_frame_timestamps": torch.arange(video.shape[0]) / video_fps, "filename": filename, }, } return result def _transform_video_frames( self, video: torch.Tensor, transformation: BaseTransformation ) -> torch.Tensor: """Applies frame_transforms to the individual video frames. Args: video: Tensor[T,C,W,H], to be transformed. frame_transforms: Transformation that operates on {"image": Tensor[C,W,H]}. Returns: Transformed tensor of shape [T,C,W,H]. Note: * If the transformation is a No-Op (ie. ``Compose([])``), returns the input as is. The No-Op transformation can be used by datasets that apply ToTensor after cropping, to save compute. """ if isinstance(transformation, Compose) and transformation.img_transforms == []: # No-Op frame transform pass else: video = torch.stack( [transformation({"image": frame})["image"] for frame in video] ) return video @classmethod def read_audio( cls, filename: str, audio_sample_rate: int = -1, threads: int = 1 ) -> Tuple[torch.Tensor, Dict[str, Any]]: """Reads the audio tensor and audio stream's metadata of a given video file. Args: filename: Path of the video file. audio_sample_rate: Controls the audio sample rate when reading audio. If not specified (-1), the file's original sample rate gets used. Defaults to -1. threads: Number of cpu threads to use for decoding and transforming the video. Note that we don't have full control over ffmpeg, and some ffmpeg components may ignore this flag. Defaults to 1. Returns: (audio_tensor, metadata) tuple, where audio_tensor has shape [T,C] and the metadata has the following schema: { "audio_fps": float, "audio_duration": float, "audio_channels": int, }. """ audio_metadata = cls.build_audio_metadata(filename) if audio_sample_rate == -1: audio_sample_rate = audio_metadata["audio_fps"] else: audio_metadata["audio_fps"] = audio_sample_rate # F16LE is 16-bit little-endian signed PCM (raw) audio. # See: https://gstreamer.freedesktop.org/documentation/additional/design/mediatype-audio-raw.html if sys.byteorder == "little": audio_format = "f32le" elif sys.byteorder == "big": audio_format = "f32be" else: raise NotImplementedError(f"Unknown byte order '{sys.byteorder}'.") audio, _ = ( ffmpeg.input(filename, threads=str(threads)) .audio.output( "pipe:", format=audio_format, acodec=f"pcm_{audio_format}", ar=str(audio_sample_rate), threads=str(threads), ) .global_args("-vn", "-threads", str(threads)) .run(capture_stdout=True, capture_stderr=True) ) audio = torch.frombuffer(audio, dtype=torch.float32) audio = audio.reshape(-1, audio_metadata["audio_channels"]) expected_frames = int(audio_metadata["audio_duration"] * audio_sample_rate) if not isclose(expected_frames, audio.shape[0], rel_tol=0.05, abs_tol=1): raise ValueError( "Expected" f" {audio_metadata['audio_duration']}*{audio_sample_rate}={expected_frames} audio" f" frames, but got {audio.shape[0]} frames." ) return audio, audio_metadata @classmethod def build_video_metadata(cls, video_path: str) -> Dict[str, Union[str, float, int]]: """Generate the metadata for a given video. Args: video_path: A video file path. Returns: The metadata of the corresponding video. The generated metadata format is: { "filename": , "video_fps": , "total_video_frames" , "video_duration": , "width": , "height": , } """ return ffmpeg_utils.get_video_metadata(video_path) @classmethod def build_audio_metadata(cls, video_path: str) -> Dict[str, Union[str, float, int]]: """Generate the audio metadata for a given video. Args: video_path: A video file path. Returns: The audio metadata of the corresponding video. The metadata format is: { "audio_channels": int, "audio_fps": int, "total_audio_frames": int, "audio_duration": float, "audio_channels": int, } """ return ffmpeg_utils.get_audio_metadata(video_path) ================================================ FILE: corenet/data/video_reader/ffmpeg_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import functools import json import logging import math import os import subprocess import tempfile import time import warnings from io import IOBase from pathlib import Path from typing import Any, Dict, List, Optional, Tuple, Union import numpy as np import torch try: import ffmpeg subprocess.check_call( ["ffmpeg", "-h"], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stdin=subprocess.DEVNULL, ) IS_FFMPEG_INSTALLED = True except (ImportError, subprocess.CalledProcessError, FileNotFoundError): ffmpeg = None IS_FFMPEG_INSTALLED = False from corenet.data.transforms.base_transforms import BaseTransformation from corenet.data.transforms.video import ToPixelArray, ToTensor from corenet.utils import logger from corenet.utils.check import check from corenet.utils.context_managers import context_tensor_threads from corenet.utils.import_utils import ensure_library_is_available from corenet.utils.io_utils import make_temp_file class FFMPEGError(Exception): def __init__(self, message: str, stderr: Union[IOBase, bytes, str]): if isinstance(stderr, IOBase): stderr = stderr.read() if isinstance(stderr, bytes): stderr = stderr.decode(errors="replace") super().__init__(f"{message}:\n{stderr}") def _parse_stream_duration(stream: Dict[str, Any]) -> float: """Extract duration (seconds) from audio/video stream headers. Args: stream: FFProbe headers (i.e. metadata) for an audio/video stream. Returns: The parsed duration of the input stream metadata, in seconds. """ if "duration" in stream: duration = float(stream["duration"]) else: duration = stream["tags"]["DURATION"] hh, mm, ss = map(float, duration.split(":")) duration = hh * 3600 + mm * 60 + ss return duration @functools.lru_cache(maxsize=2) def ffprobe(video_path: str, parse_json: bool = True) -> Union[str, Dict[str, Any]]: """Reads the container and stream metadata from video files. For further information about ffprobe, see https://ffmpeg.org/ffprobe.html. Args: video_path: Represents the path of the video file. parse_json: Determines whether the output should be a json string, or its parsed dictionary. Defaults to True, that returns a Dict. Returns: The json metadata that is generated by ffprobe CLI. """ try: output = subprocess.check_output( [ "ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", video_path, ], universal_newlines=True, stderr=subprocess.PIPE, stdin=subprocess.DEVNULL, ) if parse_json: output = json.loads(output) return output except (subprocess.CalledProcessError, TypeError, ValueError) as exc: if isinstance(exc, subprocess.CalledProcessError): stderr = exc.stderr else: stderr = str(exc) raise FFMPEGError( f"Could not extract ffmpeg metadata for {video_path}.", stderr=stderr, ) def get_video_metadata( video_path: str, return_extras: bool = False ) -> Union[Dict[str, Union[str, float, int]], Tuple[Dict, Dict]]: """Generate the metadata for a given video. Args: video_path: A video file path. return_extras: When True, returns additional information as described in "Returns" section. Defaults to False. Returns: When @return_extras is False (default), returns the following metadata: metadata = { "filename": , "video_fps": , "total_video_frames" , "video_duration": , "width": , "height": , "start_time": , # When greater than 0, the frame that ffmpeg reads # should be presented at timestamp . } When @return_extras is True, returns `(metadata, extras)` tuple, where: extras = { "raw": , # The raw json output of ffprobe (video stream). "rotation": , # Rotation of raw frames, in {0, 90, 180, 270}. } """ ensure_library_is_available(module_name="ffmpeg") probe = ffprobe(video_path) metadata = None for stream in probe["streams"]: if stream.get("codec_type") != "video": continue if stream.get("disposition", {}).get("attached_pic", 0) != 0: # In some videos, the video thumbnail image is stored as a stream with # codec_type=video and disposition.attached_pic tag. We shall skip # thumbnail image streams. continue if metadata is not None: raise ValueError(f"Found more than 1 video stream in {video_path}.") num, denom = map(int, stream["avg_frame_rate"].split("/")) frame_rate = num / denom duration = _parse_stream_duration(stream) # In older ffmpeg/ffprobe versions, rotation metadata was returned as # stream["tags"]["rotate"]. In the newer versions, rotation is returned as # stream["side_data_list"][]["rotation"]. # See: https://superuser.com/a/1724964 rotation_metadata_values = [] if "tags" in stream and "rotate" in stream["tags"]: rotation_metadata_values.append(int(stream["tags"]["rotate"])) for side_data in stream.get("side_data_list", []): if "rotation" in side_data: rotation_metadata_values.append(int(side_data["rotation"])) if rotation_metadata_values: assert ( len(set(rotation_metadata_values)) == 1 ), f"Got inconsistent rotation metadata {rotation_metadata_values}." rotation = rotation_metadata_values[0] assert ( rotation % 90 == 0 ), f"Got unexpected rotation value {rotation} in {video_path}." rotation = (rotation + 360) % 360 # Ensure positive value. else: rotation = 0 metadata = { "filename": video_path, "video_fps": frame_rate, "total_video_frames": int(math.ceil(duration * frame_rate)), "video_duration": duration, "width": (stream["width"] if rotation % 180 == 0 else stream["height"]), "height": (stream["height"] if rotation % 180 == 0 else stream["width"]), "start_time": float(stream.get("start_time", "0.0")), } if return_extras: extras = { "raw": stream, "rotation": rotation, } if metadata is None: raise ValueError(f"Could not find a video stream in {video_path}.") if return_extras: return metadata, extras else: return metadata def get_audio_metadata( video_path: str, return_extras: bool = False ) -> Union[Optional[Dict], Tuple[Optional[Dict], Dict]]: """Generate the audio metadata for a given video. Args: video_path: A video file path. Returns: When @return_extras is False (default), returns the following metadata: metadata = { "audio_fps": int, "total_audio_frames": int, "audio_duration": float, "audio_channels": int, } When @return_extras is True, returns `(metadata, extras)` tuple, where: extras = { "raw": , # The raw json output of ffprobe (audio stream). } """ probe = ffprobe(video_path) result = None extras = {"raw": None} for stream in probe["streams"]: if stream.get("codec_type") != "audio": continue if result is not None: raise ValueError(f"Found more than 1 audio stream in {video_path}.") extras["raw"] = stream sample_rate = int(stream["sample_rate"]) duration = _parse_stream_duration(stream) result = { "filename": video_path, "audio_fps": sample_rate, "total_audio_frames": int(duration * sample_rate), "audio_duration": duration, "audio_channels": int(stream["channels"]), } if return_extras: return result, extras return result def get_flags_to_replicate_audio_codec(input_filename: str) -> Dict: """Extracts ffmpeg flags to replicate input audio codec properties in the output. Args: input_filename: Path of the input audio/video file. Returns: A dictionary containing ffmpeg flags to be consumed by ffmpeg-python package. Each {key: value} entry of this dictionary will be converted to "-key value" command-line flags for ffmpeg command. Note: The goal is to replicate a close behavior to "-c:a copy" while re-encoding the audio ("-c:a copy" does not re-encode the audio). Re-encoding the audio is necessary when we trim the video during processing, because "-c:a copy" produces wrong durations. For example, you can use the following command to extract a 1.5 seconds audio clip, but you will get a 2.04 second result. But replacing "-c:a copy" with "-c:a aac" corrects the duration. ffmpeg -ss 0.5 -i ./tests/data/dummy_video.mov -c:a copy -to 1.5 /tmp/a.mov -y \ 2>/dev/null && ffprobe /tmp/a.mov 2>&1 | grep Duration As explained in https://trac.ffmpeg.org/ticket/977, one alternative is to move -ss flag to after -i, that solves the duration problem but produces out of sync audio: https://superuser.com/questions/1001299/ffmpeg-video-cutting-error-out-of-sync-audio. """ probe = ffprobe(input_filename) audio_stream = None for stream in probe["streams"]: if stream.get("codec_type") != "audio": continue if audio_stream is not None: raise ValueError(f"Found more than 1 audio stream in {input_filename}.") audio_stream = stream if audio_stream is None: raise ValueError(f"Could not find audio stream in {input_filename}.") codec_name = audio_stream["codec_name"] result = { "acodec": codec_name, "ac": audio_stream["channels"], } if codec_name == "aac": # AAC is a common mp4 audio encoding: https://trac.ffmpeg.org/wiki/Encode/AAC result["b:a"] = audio_stream["bit_rate"] elif codec_name.startswith("pcm_"): # pcm_s16le is the codec name for raw audio (stereo,16bit,little-endian) result["ar"] = audio_stream["sample_rate"] else: logging.error( "The current implementation does not know how to replicate audio codec" f" '{codec_name}'." ) return result def transform_video_file( input_filename: str, output_filename: str, transform: BaseTransformation, output_dimensions: Tuple[int, int] = None, threads: int = 1, max_pixels_per_batch: int = 1, from_timestamp: Optional[float] = None, to_timestamp: Optional[float] = None, video_fps: Optional[float] = None, ffmpeg_loglevel: str = "error", logging_interval: int = 5 * 60, encoder_acodec: str = "copy", encoder_vcodec: str = "mjpeg", encoder_flags: Optional[Dict] = None, ) -> None: """ Reads batches of video frames using ffmpeg, transforms them, and writes results back to the output file. This utility is especially useful for transforming long videos that cannot be loaded into RAM as a whole. Args: input_filename: Path to the input video file. output_filename: Path to the output video file. transform (BaseTransformation): A transformation that is compatible with the video transformations in ``corenet.data.transforms.video`` module. The transformation should expect a dict with the following schema: { "samples": { "video": Tensor[NxTxCxHxW], "metadata": { "video_fps": float, "video_frame_timestamps": Tensor[NxT], }, }, "targets": {}, } output_dimensions: Expected frame size (height, weight) of the outputs of the transformation. threads: Number of threads to use. Note that some ffmpeg components may ignore the threads option. max_pixels_per_batch: Determines the batch size for reading and processing frames. If you want to process 10 frames at a time, pass 10*C*H*W. Passing number of pixels, rather than number of frames, allows us to dynamically adapt the batch size given input video frame dimensions. from_timestamp: If provided (in seconds), only the frames after this timestamp will be written to the output file. Defaults to 0, that skips frames with negative timestamp. to_timestamp: If provided (in seconds), only the frames before this timestamp will be written to the output file. Defaults to None, when the video duration (from metadata) is used as to_timestamp. video_fps: The output fps if specified. Defaults to None. ffmpeg_loglevel: Controls the log level of ffmpeg library. NOTE: Values other than "error" may cause too much logs. In our experience, too much logs can lead to buffer overflow that cause hanging processes. Choices: "quiet", "panic", "fatal"=, "error", "warning", "info", "verbose", "debug", "trace". Defaults to "error". See: https://ffmpeg.org/ffmpeg.html logging_interval: Controls the interval of logging the progress. The unit is seconds. Defaults to 5 minutes. encoder_acodec: FFMpeg audio codec for encoding the output file. Defaults to "copy", that uses the same encoding as the input video. When @from_timestamp or @to_timestamp arguments are provided, the audio-codec should be specified (other than "copy") because we must re-encode audio to avoid lagged frames. encoder_vcodec: FFMpeg video codec for encoding the input file. Defaults to "mjpeg", that simply encodes individual frames as jpeg. As video frames are processed in python and passed to the ffmpeg as input, passing encoder_vcodec="copy" will not copy the encoding from the input file. encoder_flags: Extra ffmpeg flags to be used for output audio/video encoder. For example, pass {"b:a": "192k"} to set mjpeg audio bitrate to 192k. This argument overrides any other encoder_* argument Defaults to {}. Each {key:value} gets translated to `-key value` ffmpeg CLI flags. """ ensure_library_is_available(module_name="ffmpeg") if encoder_flags is None: encoder_flags = {} metadata = get_video_metadata(input_filename) height_in = metadata["height"] width_in = metadata["width"] if output_dimensions is None: height_out, width_out = height_in, width_in else: height_out, width_out = output_dimensions tmp_video_filename = None if video_fps is not None: # Downsample the video frame rate and store in a temp file. tmp_video_filename = make_temp_file(suffix=Path(input_filename).suffix) resample_video_command = ( ffmpeg.output( ffmpeg.input(input_filename).video.filter("fps", fps=video_fps), ffmpeg.input(input_filename).audio, filename=tmp_video_filename, ) .overwrite_output() .global_args("-threads", str(threads), "-loglevel", ffmpeg_loglevel) .compile() ) video_resample_process = subprocess.Popen( resample_video_command, # See https://github.com/kkroening/ffmpeg-python/issues/782 stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) _, stderr = video_resample_process.communicate() if video_resample_process.poll(): raise FFMPEGError("Failed to resample the video.", stderr) input_filename = tmp_video_filename else: video_fps = metadata["video_fps"] is_trimmed = from_timestamp is not None or to_timestamp is not None if is_trimmed: assert encoder_flags.get("acodec", encoder_acodec) != "copy", ( "Audio codec 'copy' is not valid when from_timestamp/to_timestamp" " arguments are provided because audio must be re-encoded." ) assert encoder_flags.get("vcodec", encoder_vcodec) != "copy", ( "Video codec 'copy' is not valid when from_timestamp/to_timestamp" " arguments are provided because audio must be re-encoded." ) if from_timestamp is None: from_timestamp = 0.0 else: assert from_timestamp >= 0.0 if to_timestamp is None: to_timestamp = metadata["video_duration"] trim_flags = { "ss": from_timestamp, "to": to_timestamp, } else: trim_flags = {} tmp_audio_filename = None video_decode_process = encoder_process = None try: video_decode_process_command: List[str] = ( ffmpeg.input(input_filename) .video.output("pipe:", format="rawvideo", pix_fmt="rgb24", **trim_flags) .global_args( "-threads", str(max(1, threads // 2)), "-loglevel", ffmpeg_loglevel, ) .compile() ) video_decode_process = subprocess.Popen( video_decode_process_command, # See https://github.com/kkroening/ffmpeg-python/issues/782 stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) processed_video = ffmpeg.input( "pipe:", format="rawvideo", pix_fmt="rgb24", s="{}x{}".format(width_out, height_out), r=video_fps, loglevel=ffmpeg_loglevel, ).video if is_trimmed: # Copy trimmed audio with re-encoding to tmp_audio_filename tmp_audio_filename = make_temp_file(suffix=Path(input_filename).suffix) extract_audio_command = ( ffmpeg.output( ffmpeg.input(input_filename) .audio.filter_("atrim", start=from_timestamp, end=to_timestamp) .filter_("asetpts", "PTS-STARTPTS"), filename=tmp_audio_filename, acodec="pcm_s16le", # Store raw audio in the intermediate file. **{"q:a": 0}, # Use highest possible quality. ) .overwrite_output() .global_args("-threads", str(threads), "-loglevel", ffmpeg_loglevel) .compile() ) extract_audio_process = subprocess.Popen( extract_audio_command, # See https://github.com/kkroening/ffmpeg-python/issues/782 stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) _, stderr = extract_audio_process.communicate() if extract_audio_process.poll(): raise FFMPEGError("Failed to re-encode the audio.", stderr) processed_audio = ffmpeg.input(tmp_audio_filename).audio else: processed_audio = ffmpeg.input(input_filename).audio encoder_flags.setdefault("acodec", encoder_acodec) encoder_flags.setdefault("vcodec", encoder_vcodec) encoder_process_command = ( ffmpeg.output( processed_video, processed_audio, output_filename, **encoder_flags, ) .global_args( "-threads", str(max(1, threads // 2)), "-loglevel", ffmpeg_loglevel, ) .overwrite_output() .compile() ) encoder_process = subprocess.Popen( encoder_process_command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) latest_log = start_time = time.time() processed_frames = 0 current_timestamp = 0.0 @functools.cache def get_total_frames(): if is_trimmed: return int((to_timestamp - from_timestamp) * video_fps) else: return get_video_metadata(input_filename)["total_video_frames"] opts = argparse.Namespace() to_tensor = ToTensor(opts) to_pixel_array = ToPixelArray(opts) with context_tensor_threads(threads): while True: max_frames = int( max(1, max_pixels_per_batch / width_in / height_in / 3) ) if time.time() > latest_log + logging_interval: logger.log( "Processing frames" f" {processed_frames}:{processed_frames+max_frames} /" f" {get_total_frames()} [{input_filename}]" f" [Velocity={processed_frames/(time.time()-start_time)*60:.1f}" " frames/minute]" ) latest_log = time.time() frames = video_decode_process.stdout.read( max_frames * width_in * height_in * 3 ) if not frames: break with warnings.catch_warnings(): warnings.simplefilter("ignore") frames = torch.frombuffer(frames, dtype=torch.uint8) frames = frames.reshape(1, -1, height_in, width_in, 3) num_frames = frames.shape[1] video_frame_timestamps = ( torch.arange(num_frames) / video_fps + current_timestamp ) video_frame_timestamps = video_frame_timestamps[None, :] frames = frames.permute(0, 1, 4, 2, 3) # NTHWC -> NTCHW data = { "samples": { "video": frames, "metadata": { "video_fps": video_fps, "video_frame_timestamps": video_frame_timestamps, "filename": input_filename, }, }, "targets": {}, } data = to_tensor(data) data = transform(data) data = to_pixel_array(data) frames = data["samples"]["video"] frames = frames.transpose(0, 1, 3, 4, 2) # NTCHW -> NTHWC if frames.shape[-1] == 1: frames = frames.repeat(3, -1) # grayscale to rgb expected_shape = (1, num_frames, height_out, width_out, 3) assert ( frames.shape == expected_shape ), f"Got shape {frames.shape}, expected {expected_shape}." assert ( frames.dtype == np.uint8 ), f"Unexpected dtype {frames.dtype}, expected uint8." processed_frames += num_frames current_timestamp += num_frames / video_fps encoder_process.stdin.write(frames.data.tobytes()) encoder_process.stdin.flush() if output_filename: encoder_process.stdin.close() video_decode_process.wait() if output_filename: encoder_process.wait() except BrokenPipeError: raise FFMPEGError( f"Encoder process failed with command='{' '.join(encoder_process.args)}'", encoder_process.stderr, ) finally: if tmp_audio_filename is not None: Path(tmp_audio_filename).unlink(missing_ok=True) if tmp_video_filename is not None: Path(tmp_video_filename).unlink(missing_ok=True) if video_decode_process is not None: _kill_subprocess(video_decode_process) if encoder_process is not None: _kill_subprocess(encoder_process) def _kill_subprocess(process: subprocess.Popen, timeout_seconds: float = 5.0) -> None: try: t0 = time.time() while process.poll() is None: process.kill() if time.time() - t0 > timeout_seconds: raise TimeoutError() time.sleep(0.1) except: logger.ignore_exception_with_warning( f"Couldn't kill subprocess with pid={getattr(subprocess, 'pid', None)}." ) def write_video( data: Dict, output_filename: str, ffmpeg_loglevel: str = "error", acodec: str = "pcm_s16le", _temp_audio_file: Optional[str] = None, ): """Write a video file (potentially with audio) from tensors. Arguments: data: A dictionary of the following format: { "audio": Tensor [T_audio,C] (optional), "video": Tensor [T_video,C,H,W], "metadata": { "audio_fps": float (optional), "video_fps": float, }, } output_filename: Filename, .mkv or .mov is recommended. ffmpeg_loglevel: Log level, see transform_video_file. acodec: Audio codec. _temp_audio_file: Internal, temporary audio file. """ if "audio" in data and _temp_audio_file is None: with tempfile.TemporaryDirectory() as td: _temp_audio_file = os.path.join(td, "temp.wav") write_audio(data, _temp_audio_file, acodec=acodec) return write_video( data, output_filename, ffmpeg_loglevel=ffmpeg_loglevel, acodec=acodec, _temp_audio_file=_temp_audio_file, ) video = data["video"] if video.is_floating_point(): video = (video * 255).round().to(torch.uint8) check(video.dtype == torch.uint8, ValueError("Expect uint8 video")) check(video.ndim == 4, ValueError("Expect 4-dimensional video")) video = video.permute(0, 2, 3, 1) # [T,C,H,W] -> [T,H,W,C] if video.shape[-1] == 1: video = video.repeat(1, 1, 1, 3) # grayscale to rgb check(video.shape[-1] == 3, ValueError("Expect 1 or 3 channel video")) output = ffmpeg.input( "pipe:", format="rawvideo", pix_fmt="rgb24", s="{}x{}".format(video.shape[2], video.shape[1]), r=data["metadata"]["video_fps"], ) if _temp_audio_file: output = ffmpeg.concat(output, ffmpeg.input(_temp_audio_file).audio, v=1, a=1) process = ( output.output(output_filename, pix_fmt="yuv420p", acodec=acodec) .overwrite_output() .global_args("-loglevel", ffmpeg_loglevel) .run_async(pipe_stdin=True) ) _, stderr = process.communicate(video.contiguous().numpy().tobytes()) if process.poll(): raise FFMPEGError("Failed to encode the video.", stderr) def write_audio( data: Dict, output_filename: str, ffmpeg_loglevel: str = "error", acodec: str = "pcm_s16le", ): """Save audio from a tensor to a file. Arguments: data: A dictionary of the following format: { "audio": Tensor [T_audio,C], "metadata": { "audio_fps": float, }, } output_filename: Filename, .wav is recommended. ffmpeg_loglevel: Log level, see transform_video_file. acodec: Audio codec. """ audio = data["audio"] if audio.is_floating_point(): audio = (audio * 32767).round().to(torch.int16) check(audio.dtype == torch.int16, ValueError("Expect int16 audio")) check(audio.ndim == 2, ValueError("Expect 2-dimensional audio")) process = ( ffmpeg.input( "pipe:", format="s16le", ar=data["metadata"]["audio_fps"], ac=audio.shape[-1], ) .output(output_filename, acodec=acodec) .overwrite_output() .global_args("-loglevel", ffmpeg_loglevel) .run_async(pipe_stdin=True) ) _, stderr = process.communicate(audio.contiguous().numpy().tobytes()) if process.poll(): raise FFMPEGError("Failed to encode the audio.", stderr) ================================================ FILE: corenet/data/video_reader/pyav_reader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, Optional, Union import av import numpy import torch from corenet.data.transforms.base_transforms import BaseTransformation from corenet.data.video_reader import VIDEO_READER_REGISTRY, BaseAVReader from corenet.utils import logger @VIDEO_READER_REGISTRY.register(name="pyav") class PyAVReader(BaseAVReader): """ Video Reader using PyAV. """ def read_video( self, av_file: str, stream_idx: int = 0, audio_sample_rate: int = -1, custom_frame_transforms: Optional[BaseTransformation] = None, video_only: bool = False, *args, **kwargs, ) -> Dict: with av.open(av_file) as container: audio_frames = video_frames = None audio_fps = video_fps = None for stream in container.streams: if self.fast_decoding: # use multi-threading for decoding stream.thread_type = "AUTO" container.seek(0) if stream.type == "audio": # Skip audio stream if audio not required. if video_only: continue # Compute audio frame stats. assert ( audio_fps is None ), f"Multiple audio streams exist in '{av_file}', while only one is expected. (stream_idx={stream_idx})" assert audio_frames is None audio_stream = container.streams.audio[stream_idx] n_audio_channels = len(audio_stream.layout.channels) audio_frames = [] if audio_sample_rate > 0: resampler = av.AudioResampler(rate=audio_sample_rate) for frame in container.decode(audio=stream_idx): if audio_sample_rate > 0: frame = resampler.resample(frame)[0] audio_frames.append( frame.to_ndarray().reshape(n_audio_channels, -1) ) audio_frames = torch.from_numpy( numpy.concatenate(audio_frames, axis=1) ).transpose(1, 0) audio_fps = ( audio_sample_rate if audio_sample_rate > 0 else audio_stream.sample_rate ) elif stream.type == "video": assert video_fps is None assert video_frames is None video_stream = container.streams.video[stream_idx] n_frames = video_stream.frames width = video_stream.width height = video_stream.height video_fps = float(video_stream.base_rate) video_frames = torch.empty( size=(n_frames, 3, height, width), dtype=torch.float ) frame_transforms = ( self.frame_transforms if custom_frame_transforms is None else custom_frame_transforms ) for i, video_frame in enumerate(container.decode(video=stream_idx)): video_frame = video_frame.to_image() video_frame = frame_transforms({"image": video_frame})["image"] video_frames[i] = video_frame return { "audio": audio_frames, "video": video_frames, "metadata": { "audio_fps": audio_fps, "video_fps": video_fps, "filename": av_file, }, } def build_video_metadata( self, video_path: str ) -> Dict[str, Union[str, float, int]]: """Generate the metadata for a given video. Args: video_path: A video file path. Returns: The metadata of the corresponding video. The generated metadata format is: { "filename": , "video_fps": , "total_video_frames" , "video_duration": , } """ vmetadata = {} with av.open(video_path) as container: vmetadata["filename"] = video_path video_stream = container.streams.video[0] # NOTE: av package may return invalid 0 as the total number of frames. vmetadata["total_video_frames"] = video_stream.frames if vmetadata["total_video_frames"] == 0: logger.warning(f"Invalid frame number 0 for {video_path}.") vmetadata["video_fps"] = float(video_stream.base_rate) vmetadata["video_duration"] = ( vmetadata["total_video_frames"] / vmetadata["video_fps"] ) return vmetadata ================================================ FILE: corenet/engine/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.engine.default_trainer import DefaultTrainer from corenet.engine.evaluation_engine import Evaluator ================================================ FILE: corenet/engine/default_trainer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import gc import shutil import time import traceback from typing import Dict, Optional, Tuple, Union import torch from torch import Tensor from torch.cuda.amp import GradScaler from corenet.constants import DEFAULT_EPOCHS, DEFAULT_ITERATIONS, if_test_env from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP from corenet.data.transforms.image_torch import apply_mixing_transforms from corenet.engine.utils import ( autocast_fn, get_batch_size, get_log_writers, log_metrics, step_log_metrics, ) from corenet.loss_fn import BaseCriteria from corenet.metrics.stats import Statistics from corenet.modeling.misc.averaging_utils import EMA from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.optims import BaseOptim from corenet.optims.scheduler import BaseLRScheduler from corenet.options.parse_args import parse_validation_metric_names from corenet.utils import logger from corenet.utils.checkpoint_utils import save_checkpoint from corenet.utils.common_utils import move_to_device from corenet.utils.ddp_utils import dist_barrier, is_master class DefaultTrainer(object): """ Default training and validation engine. Args: opts: The command-line arguments as a namespace. model: The neural network model to be trained. validation_loader: The data loader for the validation dataset. training_loader: The data loader for the training dataset. criteria: The loss function used for training. optimizer: The optimizer used for training. scheduler: The learning rate scheduler used for training. gradient_scaler: The gradient scaler for mixed precision training. start_epoch: The epoch to start training from. start_iteration: The iteration to start training from. best_metric: The best validation metric value achieved so far. model_ema: An optional instance of EMA model. """ def __init__( self, opts: argparse.Namespace, model: BaseAnyNNModel, validation_loader: CoreNetDataLoader, training_loader: CoreNetDataLoader, criteria: BaseCriteria, optimizer: BaseOptim, scheduler: BaseLRScheduler, gradient_scaler: GradScaler, start_epoch: int = 0, start_iteration: int = 0, best_metric: float = 0.0, model_ema: EMA = None, ) -> None: super(DefaultTrainer, self).__init__() self.opts = opts self.model = model self.model_ema = model_ema self.criteria = criteria self.optimizer = optimizer self.scheduler = scheduler self.gradient_scaler = gradient_scaler self.val_loader = validation_loader self.train_loader = training_loader self.device = getattr(opts, "dev.device", torch.device("cpu")) self.start_epoch = start_epoch self.best_metric = best_metric self.train_iterations = start_iteration self.is_master_node = is_master(opts) self.max_iterations_reached = False self.max_iterations = getattr( self.opts, "scheduler.max_iterations", DEFAULT_ITERATIONS ) self.use_distributed = getattr(self.opts, "ddp.use_distributed") self.log_freq = getattr(self.opts, "common.log_freq") self.accum_freq = getattr(self.opts, "common.accum_freq") self.accum_after_epoch = getattr(self.opts, "common.accum_after_epoch") self.mixed_precision_training = getattr(opts, "common.mixed_precision") self.mixed_precision_dtype = getattr(opts, "common.mixed_precision_dtype") self.train_metric_names = getattr(opts, "stats.train") if isinstance(self.train_metric_names, str): self.train_metric_names = [self.train_metric_names] assert isinstance( self.train_metric_names, list ), "Type of metric names should be list. Got: {}".format( type(self.train_metric_names) ) if "loss" not in self.train_metric_names: self.train_metric_names.append(self.train_metric_names) ( self.val_metric_names, self.ckpt_metric, self.ckpt_submetric, ) = parse_validation_metric_names(self.opts) self.save_all_checkpoints = getattr(self.opts, "common.save_all_checkpoints") self.save_location = getattr(opts, "common.exp_loc") self.log_writers = get_log_writers(self.opts, save_location=self.save_location) self.set_grad_to_none = getattr(opts, "common.set_grad_to_none") # save interval checkpoints every `save_interval_freq` updates on the master node self.save_interval_freq = getattr(opts, "common.save_interval_freq") self.eval_every_k_iterations = getattr(opts, "common.eval_every_k_iterations") def compute_grad_norm(self) -> torch.Tensor: """Computes and returns the L2 norm of the gradients.""" parameters = [p for p in self.model.parameters() if p.grad is not None] if len(parameters) == 0: return None norm_type = 2.0 # L2 norm inv_scale = 1.0 / self.gradient_scaler.get_scale() total_norm = torch.norm( torch.stack( [ torch.norm(p.grad.detach() * inv_scale, norm_type).to(self.device) for p in parameters ] ), norm_type, ) if total_norm.isnan() or total_norm.isinf(): return None return total_norm def _zero_grad(self) -> None: """Sets the gradients to zero. ...note: If 'set_grad_to_none' is enabled, gradients are set to None instead of zero. Caution should be exercised when using this option as setting gradients to None may alter certain behaviors. Refer to the PyTorch's 'torch.optim.Optimizer' documentation for detailed explanations. """ if self.set_grad_to_none: self.optimizer.zero_grad(set_to_none=True) else: self.optimizer.zero_grad() def _set_training_mode(self) -> None: """ Sets the model and criteria in training mode. """ self.model.train() self.criteria.train() def _set_eval_mode(self) -> None: """ Sets the model and criteria in eval mode. """ self.model.eval() self.criteria.eval() def _save_and_evaluate_interval_checkpoint( self, epoch: int, iterations: int, loss: torch.Tensor ) -> None: """ Optionally save the interval checkpoints and evaluate them. Args: epoch: Current epoch. iterations: Current training iteration. loss: Loss value. """ # save the checkpoint every N updates if (self.save_interval_freq > 0) and ( iterations + 1 ) % self.save_interval_freq == 0: # set the model to eval mode and perform evaluation self._set_eval_mode() save_checkpoint( iterations=iterations, epoch=epoch, model=self.model, optimizer=self.optimizer, best_metric=self.best_metric, is_best=False, save_dir=self.save_location, is_master_node=self.is_master_node, gradient_scaler=self.gradient_scaler, model_ema=self.model_ema, is_ema_best=False, max_ckpt_metric=False, k_best_checkpoints=-1, save_all_checkpoints=True, is_interval_ckpt=True, ) # set the model and criteria back to training mode self._set_training_mode() if self.is_master_node: logger.info( "Checkpoints saved after {} updates at: {}".format( iterations, self.save_location ), print_line=True, ) # evaluate the checkpoint every N updates if ( self.eval_every_k_iterations > 0 and (iterations + 1) % self.eval_every_k_iterations == 0 ): # set the model to eval mode and perform evaluation self._set_eval_mode() self.val_epoch(epoch=epoch, model=self.model) # set the model and criteria back to training mode self._set_training_mode() def train_epoch(self, epoch: int) -> Tuple[float, float]: """Train the model for one epoch. Args: epoch: Current epoch. Returns: A tuple containing average values of the training loss and the specified checkpoint metric (e.g., top1 accuracy). """ time.sleep( if_test_env(0.5, otherwise=2) ) # To prevent possible deadlock during epoch transition if self.is_master_node: logger.double_dash_line() logger.info(f"Training epoch {epoch}") train_stats = Statistics( opts=self.opts, metric_names=self.train_metric_names, is_master_node=self.is_master_node, is_distributed=self.use_distributed, log_writers=self.log_writers, ) self._set_training_mode() accum_freq = self.accum_freq if epoch >= self.accum_after_epoch else 1 max_norm = getattr(self.opts, "common.grad_clip", None) # set the gradient to zero or None self._zero_grad() epoch_start_time = time.time() batch_load_start = time.time() grad_norm = torch.tensor([0.0], dtype=torch.float, device=self.device) for batch_id, batch in enumerate(self.train_loader): if self.train_iterations > self.max_iterations: self.max_iterations_reached = True break # move to device batch = move_to_device(opts=self.opts, x=batch, device=self.device) # apply mix-up transforms if any batch = apply_mixing_transforms(opts=self.opts, data=batch) batch_load_toc = time.time() - batch_load_start samples, targets = batch["samples"], batch["targets"] batch_size = get_batch_size(samples) # update the learning rate self.optimizer = self.scheduler.update_lr( optimizer=self.optimizer, epoch=epoch, curr_iter=self.train_iterations ) with autocast_fn( enabled=self.mixed_precision_training, amp_precision=self.mixed_precision_dtype, ): # prediction pred_label = self.model(samples) # compute loss loss_dict_or_tensor: Union[Dict, Tensor] = self.criteria( input_sample=samples, prediction=pred_label, target=targets, epoch=epoch, iterations=self.train_iterations, ) if isinstance(loss_dict_or_tensor, Dict): if "total_loss" not in loss_dict_or_tensor.keys(): logger.error( "total_loss key is required for loss functions that return outputs as dictionary." ) loss = loss_dict_or_tensor["total_loss"] elif isinstance(loss_dict_or_tensor, Tensor): loss = loss_dict_or_tensor else: logger.error("Loss value should be an instance of Tensor or Dict") if isinstance(loss, torch.Tensor) and torch.isnan(loss): logger.error("Nan encountered in the loss.") # perform the backward pass with gradient accumulation [Optional] self.gradient_scaler.scale(loss).backward() if (batch_id + 1) % accum_freq == 0: if max_norm is not None: # For gradient clipping, unscale the gradients and then clip them self.gradient_scaler.unscale_(self.optimizer) torch.nn.utils.clip_grad_norm_( self.model.parameters(), max_norm=max_norm ) if "grad_norm" in self.train_metric_names: # compute grad_norm for logging purposes. # We can't use the output of clip_grad_norm_ because it returns the total norm before clipping grad_norm = self.compute_grad_norm() # optimizer step self.gradient_scaler.step(optimizer=self.optimizer) # update the scale for next batch self.gradient_scaler.update() # set the gradient to zero or None self._zero_grad() self.train_iterations += 1 if self.model_ema is not None: self.model_ema.update_parameters(self.model) train_stats.update( pred_label=pred_label, target_label=targets, extras={"loss": loss_dict_or_tensor, "grad_norm": grad_norm}, batch_time=batch_load_toc, batch_size=batch_size, ) self._save_and_evaluate_interval_checkpoint( epoch=epoch, iterations=self.train_iterations, loss=loss ) if batch_id % self.log_freq == 0 and self.is_master_node: lr = self.scheduler.retrieve_lr(self.optimizer) train_stats.iter_summary( epoch=epoch, n_processed_samples=self.train_iterations, total_samples=self.max_iterations, learning_rate=lr, elapsed_time=epoch_start_time, ) train_metrics = train_stats._compute_avg_statistics_all() for log_writer in self.log_writers: step_log_metrics( lrs=lr, log_writer=log_writer, step=self.train_iterations, metrics=train_metrics, ) batch_load_start = time.time() avg_loss = train_stats.avg_statistics( metric_name="loss", sub_metric_name="total_loss" ) train_stats.epoch_summary( epoch=epoch, stage="training", epoch_time=time.time() - epoch_start_time ) avg_ckpt_metric = train_stats.avg_statistics( metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric ) gc.collect() return avg_loss, avg_ckpt_metric def val_epoch( self, epoch: int, model: BaseAnyNNModel, extra_str="" ) -> Tuple[float, float]: """Validate the model. Args: epoch: Current epoch. model: The neural network model to be validated. extra_str: Extra string to append to the epoch summary. For example, specify whether the model is EMA or not. Returns: A tuple containing average values of the validation loss and the specified checkpoint metric (e.g., top1 accuracy). """ if self.val_loader is None: return 0.0, 0.0 time.sleep( if_test_env(0.5, otherwise=2) ) # To prevent possible deadlock during epoch transition if self.is_master_node: logger.double_dash_line() logger.info(f"Validation epoch {epoch}") validation_stats = Statistics( opts=self.opts, metric_names=self.val_metric_names, is_master_node=self.is_master_node, is_distributed=self.use_distributed, log_writers=self.log_writers, ) model.eval() if model.training: if self.is_master_node: logger.warning( "Model is in training mode. Switching to evaluation mode" ) model.eval() self.criteria.eval() if self.criteria.training: self.criteria.eval() with torch.no_grad(): epoch_start_time = time.time() # When validation dataset is an instance of Iterable dataset, then total_samples is redundant. total_samples = len(self.val_loader) processed_samples = 0 lr = self.scheduler.retrieve_lr(self.optimizer) for batch_id, batch in enumerate(self.val_loader): batch = move_to_device(opts=self.opts, x=batch, device=self.device) samples, targets = batch["samples"], batch["targets"] batch_size = get_batch_size(samples) with autocast_fn( enabled=self.mixed_precision_training, amp_precision=self.mixed_precision_dtype, ): # prediction pred_label = model(samples) # compute loss loss_dict_or_tensor = self.criteria( input_sample=samples, prediction=pred_label, target=targets ) processed_samples += batch_size validation_stats.update( pred_label=pred_label, target_label=targets, extras={"loss": loss_dict_or_tensor}, batch_time=0.0, batch_size=batch_size, # TODO: use is_evaluation? ) if batch_id % self.log_freq == 0 and self.is_master_node: validation_stats.iter_summary( epoch=epoch, n_processed_samples=processed_samples, total_samples=total_samples, elapsed_time=epoch_start_time, learning_rate=lr, ) validation_stats.epoch_summary( epoch=epoch, stage="validation" + extra_str, epoch_time=time.time() - epoch_start_time, ) avg_loss = validation_stats.avg_statistics( metric_name="loss", sub_metric_name="total_loss" ) avg_ckpt_metric = validation_stats.avg_statistics( metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric ) if avg_ckpt_metric is None: avg_ckpt_metric = avg_loss gc.collect() return avg_loss, avg_ckpt_metric def run( self, train_sampler: Optional[Union[BaseSampler, BaseSamplerDDP]] = None ) -> None: """Train and validate the model. Args: train_sampler: An optional sampler for training dataset. """ train_start_time = time.time() cfg_file = getattr(self.opts, "common.config_file", None) if cfg_file is not None and self.is_master_node: dst_cfg_file = "{}/config.yaml".format(self.save_location) shutil.copy(src=cfg_file, dst=dst_cfg_file) logger.info( "Configuration file is stored here: {}".format( logger.color_text(dst_cfg_file) ) ) keep_k_best_ckpts = getattr(self.opts, "common.k_best_checkpoints", 5) ema_best_metric = self.best_metric is_ema_best = False try: max_epochs = getattr(self.opts, "scheduler.max_epochs", DEFAULT_EPOCHS) max_checkpoint_metric = getattr(self.opts, "stats.checkpoint_metric_max") for epoch in range(self.start_epoch, max_epochs): if train_sampler is not None: # Note that we are using our owm implementations of data samplers # and we have defined this function for both distributed and non-distributed cases train_sampler.set_epoch(epoch) train_sampler.update_scales( epoch=epoch, is_master_node=self.is_master_node ) train_loss, train_ckpt_metric = self.train_epoch(epoch) val_loss, val_ckpt_metric = self.val_epoch( epoch=epoch, model=self.model ) if max_checkpoint_metric: is_best = val_ckpt_metric >= self.best_metric self.best_metric = max(val_ckpt_metric, self.best_metric) else: is_best = val_ckpt_metric <= self.best_metric self.best_metric = min(val_ckpt_metric, self.best_metric) val_ema_loss = None val_ema_ckpt_metric = None if self.model_ema is not None: val_ema_loss, val_ema_ckpt_metric = self.val_epoch( epoch=epoch, model=self.model_ema.ema_model, extra_str=" (EMA)" ) if max_checkpoint_metric: is_ema_best = val_ema_ckpt_metric >= ema_best_metric ema_best_metric = max(val_ema_ckpt_metric, ema_best_metric) else: is_ema_best = val_ema_ckpt_metric <= ema_best_metric ema_best_metric = min(val_ema_ckpt_metric, ema_best_metric) gc.collect() save_checkpoint( iterations=self.train_iterations, epoch=epoch, model=self.model, optimizer=self.optimizer, best_metric=self.best_metric, is_best=is_best, save_dir=self.save_location, is_master_node=self.is_master_node, model_ema=self.model_ema, is_ema_best=is_ema_best, ema_best_metric=ema_best_metric, gradient_scaler=self.gradient_scaler, max_ckpt_metric=max_checkpoint_metric, k_best_checkpoints=keep_k_best_ckpts, save_all_checkpoints=self.save_all_checkpoints, is_interval_ckpt=False, ) if self.is_master_node: lr_list = self.scheduler.retrieve_lr(self.optimizer) for log_writer in self.log_writers: log_metrics( lrs=lr_list, log_writer=log_writer, train_loss=train_loss, val_loss=val_loss, epoch=epoch, best_metric=self.best_metric, val_ema_loss=val_ema_loss, ckpt_metric_name=self.ckpt_metric, train_ckpt_metric=train_ckpt_metric, val_ckpt_metric=val_ckpt_metric, val_ema_ckpt_metric=val_ema_ckpt_metric, ) if self.max_iterations_reached: if self.use_distributed: dist_barrier() if self.is_master_node: logger.info("Max. iterations for training reached") break except KeyboardInterrupt as e: if self.is_master_node: logger.log("Keyboard interruption. Exiting from early training") raise e except Exception as e: if "out of memory" in str(e): logger.log("OOM exception occurred") n_gpus = getattr(self.opts, "dev.num_gpus", 1) for dev_id in range(n_gpus): mem_summary = torch.cuda.memory_summary( device=torch.device("cuda:{}".format(dev_id)), abbreviated=True ) logger.log("Memory summary for device id: {}".format(dev_id)) print(mem_summary) logger.log( f"Exception occurred that interrupted the training:\n{traceback.format_exc()}" ) raise e finally: use_distributed = getattr(self.opts, "ddp.use_distributed", False) if use_distributed: torch.distributed.destroy_process_group() torch.cuda.empty_cache() for log_writer in self.log_writers: log_writer.close() if self.is_master_node: train_end_time = time.time() hours, rem = divmod(train_end_time - train_start_time, 3600) minutes, seconds = divmod(rem, 60) train_time_str = "{:0>2}:{:0>2}:{:05.2f}".format( int(hours), int(minutes), seconds ) logger.log("Training took {}".format(train_time_str)) ================================================ FILE: corenet/engine/detection_utils/__init__.py ================================================ ================================================ FILE: corenet/engine/detection_utils/coco_map.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import io import os from contextlib import redirect_stdout from typing import List, Optional import numpy as np from pycocotools import mask as maskUtils from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval from corenet.utils import logger def coco_evaluation( opts, predictions: List[np.ndarray], split: Optional[str] = "val", year: Optional[int] = 2017, *args, **kwargs ) -> None: root = getattr(opts, "dataset.root_val", None) ann_file = os.path.join(root, "annotations/instances_{}{}.json".format(split, year)) bkrnd_id = 0 if getattr(opts, "dataset.detection.no_background_id", False) else 1 coco = COCO(ann_file) coco_categories = sorted(coco.getCatIds()) coco_id_to_contiguous_id = { coco_id: i + bkrnd_id for i, coco_id in enumerate(coco_categories) } contiguous_id_to_coco_id = {v: k for k, v in coco_id_to_contiguous_id.items()} coco_results = {"bbox": []} for i, (image_id, boxes, labels, scores, masks) in enumerate(predictions): if labels.shape[0] == 0: continue boxes = boxes.tolist() labels = labels.tolist() scores = scores.tolist() coco_results["bbox"].extend( [ { "image_id": image_id, "category_id": contiguous_id_to_coco_id[labels[k]], "bbox": [ box[0], box[1], box[2] - box[0], box[3] - box[1], ], # to xywh format "score": scores[k], } for k, box in enumerate(boxes) ] ) if masks is not None: if "segm" not in coco_results: coco_results["segm"] = [] # Masks are in [N, H, W] format rles = [ maskUtils.encode( np.array(mask[:, :, np.newaxis], dtype=np.uint8, order="F") )[0] for mask in masks ] for rle in rles: rle["counts"] = rle["counts"].decode("utf-8") coco_results["segm"].extend( [ { "image_id": image_id, "category_id": contiguous_id_to_coco_id[labels[seg_id]], "segmentation": rle, "score": scores[seg_id], } for seg_id, rle in enumerate(rles) ] ) if len(coco_results) == 0: logger.error("Cannot compute COCO stats. Please check the predictions") for iou_type, coco_result in coco_results.items(): with redirect_stdout(io.StringIO()): coco_dt = COCO.loadRes(coco, coco_result) # Run COCO evaluation coco_eval = COCOeval(coco, coco_dt, iou_type) coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize() def compute_quant_scores(opts, predictions: List, *args, **kwargs) -> None: dataset_name = getattr(opts, "dataset.name", None) if dataset_name.find("coco") > -1: coco_evaluation(opts=opts, predictions=predictions) else: raise NotImplementedError ================================================ FILE: corenet/engine/eval_detection.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import glob import os.path from typing import Dict, List, Optional, Tuple import numpy as np import torch from PIL import Image from torch import Tensor from torch.nn import functional as F from torchvision.transforms import functional as F_vision from tqdm import tqdm from corenet.constants import SUPPORTED_IMAGE_EXTNS from corenet.data import create_test_loader from corenet.data.datasets.detection.coco_base import COCODetection from corenet.engine.detection_utils.coco_map import compute_quant_scores from corenet.engine.utils import autocast_fn from corenet.modeling import get_model from corenet.modeling.models.detection import DetectionPredTuple from corenet.modeling.models.detection.base_detection import BaseDetection from corenet.options.opts import get_training_arguments from corenet.utils import logger, resources from corenet.utils.common_utils import create_directories, device_setup from corenet.utils.ddp_utils import is_master from corenet.utils.download_utils import get_local_path from corenet.utils.tensor_utils import image_size_from_opts, to_numpy from corenet.utils.visualization_utils import draw_bounding_boxes # Evaluation on MSCOCO detection task object_names = COCODetection.class_names() def predict_and_save( opts, input_tensor: Tensor, model: BaseDetection, input_np: Optional[np.ndarray] = None, device: torch.device = torch.device("cpu"), is_coco_evaluation: Optional[bool] = False, file_name: Optional[str] = None, output_stride: int = 32, orig_h: Optional[int] = None, orig_w: Optional[int] = None, ) -> Optional[Tuple[np.ndarray, np.ndarray, np.ndarray, Optional[np.ndarray]]]: """ Predict the detection outputs (e.g., bounding box) and optionally save them. Args: opts: Command-line arguments. input_tensor: Input image tensor of shape [batch size, image channels, height, width]. model: Detection model. input_np: Input image numpy array of shape [original height, original width, image channels]. The 'input_np' does not go under any pre-processing and is useful for visualization purposes. When it is `None' and 'is_coco_evaluation' is not enabled, then 'input_np' is obtained from 'input_tensor'. device: Inference device. is_coco_evaluation: Evaluating on MS-COCO object detection or not. file_name: Name of the output image file. If it is not specified, then output will not be saved. output_stride: Output stride. Checks if input dimensions are multiple of output stride or not. This argument is used to avoid dimension mismatch errors. orig_h: Original image height. This may be different from @input_tensor's height because of image transforms. Useful for visualizing detection results. orig_w: Original image width. This may be different from @input_tensor's width because of image transforms. Useful for visualizing detection results. Returns: When 'is_coco_evaluation' is enabled, the function returns a tuple that includes bounding boxes for each object, predicted labels for each box, predicted scores for each box, and instance masks for each box. Otherwise, nothing is returned. """ mixed_precision_training = getattr(opts, "common.mixed_precision") mixed_precision_dtype = getattr(opts, "common.mixed_precision_dtype") if input_np is None and not is_coco_evaluation: input_np = to_numpy(input_tensor).squeeze( # convert to numpy 0 ) # remove batch dimension curr_height, curr_width = input_tensor.shape[2:] # check if dimensions are multiple of output_stride, otherwise, we get dimension mismatch errors. # if not, then resize them new_h = (curr_height // output_stride) * output_stride new_w = (curr_width // output_stride) * output_stride if new_h != curr_height or new_w != curr_width: # resize the input image, so that we do not get dimension mismatch errors in the forward pass input_tensor = F.interpolate( input=input_tensor, size=(new_h, new_w), mode="bilinear", align_corners=False, ) # move data to device input_tensor = input_tensor.to(device) with autocast_fn( enabled=mixed_precision_training, amp_precision=mixed_precision_dtype ): # prediction # We dot scale inside the prediction function because we resize the input tensor such # that the dimensions are divisible by output stride. prediction: DetectionPredTuple = model.predict(input_tensor, is_scaling=False) if orig_w is None: assert orig_h is None orig_h, orig_w = input_np.shape[:2] elif orig_h is None: assert orig_w is None orig_h, orig_w = input_np.shape[:2] assert orig_h is not None and orig_w is not None # convert tensors to numpy boxes = prediction.boxes.cpu().numpy() labels = prediction.labels.cpu().numpy() scores = prediction.scores.cpu().numpy() masks = prediction.masks # Ensure that there is at least one mask if masks is not None and masks.shape[0] > 0: # masks are in [N, H, W] format # for interpolation, add a dummy batch dimension masks = F.interpolate( masks.unsqueeze(0), size=(orig_h, orig_w), mode="bilinear", align_corners=True, ).squeeze(0) # convert to binary masks masks = masks > 0.5 masks = masks.cpu().numpy() boxes[..., 0::2] = np.clip(a_min=0, a_max=orig_w, a=boxes[..., 0::2] * orig_w) boxes[..., 1::2] = np.clip(a_min=0, a_max=orig_h, a=boxes[..., 1::2] * orig_h) if is_coco_evaluation: return boxes, labels, scores, masks detection_res_file_name = None if file_name is not None: file_name = file_name.split(os.sep)[-1].split(".")[0] + ".jpg" res_dir = "{}/detection_results".format(getattr(opts, "common.exp_loc", None)) if not os.path.isdir(res_dir): os.makedirs(res_dir, exist_ok=True) detection_res_file_name = "{}/{}".format(res_dir, file_name) draw_bounding_boxes( image=input_np, boxes=boxes, labels=labels, scores=scores, masks=masks, # some models may not use background class which is present in class names. # adjust the class names object_names=( object_names[-model.n_detection_classes :] if hasattr(model, "n_detection_classes") else object_names ), is_bgr_format=True, save_path=detection_res_file_name, ) def read_and_process_image( opts: argparse.Namespace, file_path: str ) -> Tuple[Tensor, np.ndarray, int, int]: """Read and converts the input image into a tensor. Args: opts: Command-line arguments. file_path: Path of the image file. Returns: A tuple containing: 1. Image tensor with shape [1, C, H, W]. The tensor values are normalized between 0 and 1. 2. Original RGB image as numpy array. 3. Height of the original image. 4. Width of the original image. """ input_img = Image.open(file_path).convert("RGB") input_np = np.array(input_img) orig_w, orig_h = input_img.size # Resize the image to the resolution that detector supports res_h, res_w = image_size_from_opts(opts) input_img = F_vision.resize( input_img, size=[res_h, res_w], interpolation=F_vision.InterpolationMode.BILINEAR, ) input_tensor = F_vision.pil_to_tensor(input_img) input_tensor = input_tensor.float().div(255.0).unsqueeze(0) return input_tensor, input_np, orig_h, orig_w @torch.no_grad() def predict_labeled_dataset(opts: argparse.Namespace) -> None: """Generate predictions for the labeled dataset. This function predicts detection outputs for RGB input images and calculates detection accuracy, measured using COCO API, through comparison between predicted detection outputs and ground truth labels. Args: opts: Command-line arguments. """ device = getattr(opts, "dev.device") # set-up data loaders test_loader = create_test_loader(opts) # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) predictions = [] for batch in tqdm(test_loader): samples, targets = batch["samples"], batch["targets"] if isinstance(samples, Dict): assert ( "image" in samples ), "Samples does not contain 'image' key. Please check." input_tensor = samples["image"] elif isinstance(samples, torch.Tensor): input_tensor = samples else: raise NotImplementedError( "Only dictionary and tensor types are supported for the input sample." ) orig_w = targets["image_width"].item() orig_h = targets["image_height"].item() image_id = targets["image_id"].item() boxes, labels, scores, masks = predict_and_save( opts=opts, input_tensor=input_tensor, model=model, device=device, is_coco_evaluation=True, orig_w=orig_w, orig_h=orig_h, ) predictions.append([image_id, boxes, labels, scores, masks]) compute_quant_scores(opts=opts, predictions=predictions) @torch.no_grad() def predict_image(opts: argparse.Namespace, file_path: str) -> None: """Generate predictions for an RGB image. Note that the predictions are saved in 'common.results_loc' directory. Args: opts: Command-line arguments. file_path: Path of the image file. """ local_file_path = get_local_path(opts, file_path) if not os.path.isfile(local_file_path): logger.error("Image file does not exist at: {}".format(local_file_path)) input_tensor, input_imp_copy, orig_h, orig_w = read_and_process_image( opts, local_file_path ) file_name = os.path.basename(local_file_path) device = getattr(opts, "dev.device") # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) predict_and_save( opts=opts, input_tensor=input_tensor, input_np=input_imp_copy, file_name=file_name, model=model, device=device, orig_h=orig_h, orig_w=orig_w, ) @torch.no_grad() def predict_images_in_folder(opts: argparse.Namespace) -> None: """Generate predictions for all RGB images stored in a folder. The prediction outputs are saved in 'common.results_loc' directory. Args: opts: Command-line arguments. ...note: The path of the folder containong RGB images is supplied using 'evaluation.detection.path' argument. """ img_folder_path = getattr(opts, "evaluation.detection.path") if img_folder_path is None: logger.error( "Image folder is not passed. Please use 'evaluation.detection.path' argument to pass the location of image folder." ) elif not os.path.isdir(img_folder_path): logger.error(f"Image folder does not exist at {img_folder_path}. Please check.") img_files = [] for e in SUPPORTED_IMAGE_EXTNS: img_files_with_extn = glob.glob("{}/*{}".format(img_folder_path, e)) if len(img_files_with_extn) > 0 and isinstance(img_files_with_extn, list): img_files.extend(img_files_with_extn) if len(img_files) == 0: logger.error(f"Image files are not found at {img_folder_path}. Please check.") logger.log( f"Number of image files found at {img_folder_path} are {len(img_files)}." ) device = getattr(opts, "dev.device") # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) for image_fname in tqdm(img_files): input_tensor, input_np, orig_h, orig_w = read_and_process_image( opts, image_fname ) predict_and_save( opts=opts, input_tensor=input_tensor, input_np=input_np, file_name=os.path.basename(image_fname), model=model, device=device, orig_h=orig_h, orig_w=orig_w, ) def main_detection_evaluation(args: Optional[List[str]] = None) -> None: """Entrypoint for detection evaluation.""" opts = get_training_arguments(args=args) dataset_name = getattr(opts, "dataset.name") if dataset_name.find("coco") > -1: # replace model specific datasets (e.g., coco_ssd) with base COCO dataset setattr(opts, "dataset.name", "coco") logger.log( "For evaluation, we use a base coco dataset class instead of model-specific COCO dataset class." ) # device set-up opts = device_setup(opts) is_master_node = is_master(opts) # create the directory for saving results save_dir = getattr(opts, "common.results_loc") run_label = getattr(opts, "common.run_label") exp_dir = "{}/{}".format(save_dir, run_label) setattr(opts, "common.exp_loc", exp_dir) logger.log("Results (if any) will be stored here: {}".format(exp_dir)) create_directories(dir_path=exp_dir, is_master_node=is_master_node) num_gpus = getattr(opts, "dev.num_gpus") assert ( num_gpus <= 1 ), f"Testing of detection models is supported either on CPUs or a single GPU. Got: {num_gpus}." # DDP is required neither for a single GPU task nor for a CPU-only task. Therefore, it is disabled. # If it is required, please ensure that the DDP environment is properly initialized. setattr(opts, "ddp.use_distributed", False) dataset_workers = getattr(opts, "dataset.workers") if dataset_workers == -1: # No of data workers = no of CPUs (if not specified or -1) setattr(opts, "dataset.workers", resources.cpu_count()) logger.log("Setting number of dataset workers as number of available CPUs.") eval_mode = getattr(opts, "evaluation.detection.mode") if eval_mode == "single_image": # test a single image img_f_name = getattr(opts, "evaluation.detection.path") predict_image(opts, img_f_name) elif eval_mode == "image_folder": # test all images in a folder predict_images_in_folder(opts=opts) elif eval_mode == "validation_set": assert ( getattr(opts, "dataset.eval_batch_size0") == 1 ), "For evaluation on validation set, we need a batch size of 1." # evaluate and compute stats for labeled image dataset # This is useful for generating results for validation set and compute quantitative results predict_labeled_dataset(opts=opts) else: logger.error( f"Supported modes are 'single_image', 'image_folder', and 'validation_set'. Got: {eval_mode}." ) ================================================ FILE: corenet/engine/eval_segmentation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import glob import os from typing import List, Optional, Tuple import torch from PIL import Image from torch import Tensor from torch.nn import functional as F from torchvision.transforms import functional as F_vision from tqdm import tqdm from corenet.constants import SUPPORTED_IMAGE_EXTNS from corenet.data import create_test_loader from corenet.engine.utils import autocast_fn from corenet.metrics.confusion_mat import ConfusionMatrix from corenet.modeling import get_model from corenet.modeling.models import BaseAnyNNModel from corenet.options.opts import get_training_arguments from corenet.utils import logger, resources from corenet.utils.color_map import Colormap from corenet.utils.common_utils import create_directories, device_setup from corenet.utils.ddp_utils import is_master from corenet.utils.download_utils import get_local_path from corenet.utils.tensor_utils import image_size_from_opts from corenet.utils.visualization_utils import convert_to_cityscape_format """ Notes: 1) We have separate scripts for evaluating segmentation models because the size of input images varies and we do not want to apply any resizing operations to input because that distorts the quality and hurts the performance. 2) [Optional] We want to save the outputs in the same size as that of the input image. """ def predict_and_save( opts: argparse.Namespace, input_tensor: Tensor, file_name: str, orig_h: int, orig_w: int, model: BaseAnyNNModel, target_mask: Optional[Tensor] = None, device: torch.device = torch.device("cpu"), conf_mat: Optional[ConfusionMatrix] = None, color_map: List = None, orig_image: Optional[Image.Image] = None, adjust_label: Optional[int] = 0, is_cityscape: bool = False, ) -> None: """Predict the segmentation mask and optionally save them. Args: opts: Command-line arguments. input_tensor: Input image tensor of shape [batch size, image channels, height, width]. file_name: Name of the image file. orig_h: Original image height. This may be different from @input_tensor's height because of image transforms. orig_w: Original image width. This may be different from @input_tensor's width because of image transforms. model: Segmentation model. target_mask: Optional target segmentation mask. If supplied, it will be used for computing confusion matrix with model's mask prediction. device: Inference device. conf_mat: Instance of ConfusionMatrix. color_map: Color mapping for converting predicted binary masks into colored representations. orig_image: The original RGB image, if provided, is used for overlaying segmentation predictions. adjust_label: Increase the predicted and target mask value by this factor. is_cityscape: Generating predictions on Cityscape dataset. ...note: 1. If 'evaluation.segmentation.apply_color_map' is enabled using command-line arguments or configuration file, then masks are also converted to colored representations. 2. If 'evaluation.segmentation.save_masks' is enabled using command-line arguments or configuration file, then binary masks are also saved. """ mixed_precision_training = getattr(opts, "common.mixed_precision") mixed_precision_dtype = getattr(opts, "common.mixed_precision_dtype") output_stride = getattr(opts, "model.segmentation.output_stride") if output_stride == 1: # we set it to 32 because most of the ImageNet models have 5 downsampling stages (2^5 = 32) output_stride = 32 if orig_image is None: orig_image = F_vision.to_pil_image(input_tensor[0]) curr_h, curr_w = input_tensor.shape[2:] # check if dimensions are multiple of output_stride, otherwise, we get dimension mismatch errors. # if not, then resize them new_h = (curr_h // output_stride) * output_stride new_w = (curr_w // output_stride) * output_stride if new_h != curr_h or new_w != curr_w: # resize the input image, so that we do not get dimension mismatch errors in the forward pass input_tensor = F.interpolate( input=input_tensor, size=(new_h, new_w), mode="bilinear", align_corners=True ) file_name = file_name.split(os.sep)[-1].split(".")[0] + ".png" # move data to device input_tensor = input_tensor.to(device) if target_mask is not None: target_mask = target_mask.to(device) with autocast_fn( enabled=mixed_precision_training, amp_precision=mixed_precision_dtype ): # prediction pred = model(input_tensor, orig_size=(orig_h, orig_w)) if isinstance(pred, Tuple) and len(pred) == 2: # when segmentation mask from decoder and auxiliary decoder are returned pred = pred[0] elif isinstance(pred, Tensor): pred = pred else: raise NotImplementedError( "Predicted must should be either an instance of Tensor or Tuple[Tensor, Tensor]" ) num_classes = pred.shape[1] pred_mask = pred.argmax(1).squeeze(0) if target_mask is not None and conf_mat is not None: conf_mat.update( target=target_mask, prediction=pred, ) save_dir = getattr(opts, "common.exp_loc") # For some dataset, we need to adjust the labels. For example, we need adjust by 1 for ADE20k pred_mask = pred_mask + adjust_label if target_mask is not None: target_mask = target_mask + adjust_label # Visualize results if getattr(opts, "evaluation.segmentation.apply_color_map"): apply_color_map_to_segmentation_masks( opts=opts, orig_image=orig_image, pred_mask=pred_mask, target_mask=target_mask, save_dir=save_dir, color_map=color_map, file_name=file_name, ) if getattr(opts, "evaluation.segmentation.save_masks"): save_segmentation_masks( pred_mask=pred_mask, file_name=file_name, is_cityscape=is_cityscape, save_dir=save_dir, ) def save_segmentation_masks( pred_mask: Tensor, file_name: str, save_dir: str, is_cityscape: Optional[bool] = False, ) -> None: """Save predicted segmentation masks. The value of pixels in the segmentation mask ranges between 0 and number of classes minus one. If the segmentation dataset is Cityscapes, then segmentation masks are converted into Cityscapes format. Args: pred_mask: Predicted segmentation mask. file_name: File name. save_dir: Path of the directory where segmentation masks will be saved. is_cityscape: Predictions are on the Cityscape dataset or not. """ no_color_mask_dir = "{}/predictions_no_cmap".format(save_dir) if not os.path.isdir(no_color_mask_dir): os.makedirs(no_color_mask_dir, exist_ok=True) no_color_mask_f_name = "{}/{}".format(no_color_mask_dir, file_name) if is_cityscape: # convert mask values to cityscapes format pred_mask = convert_to_cityscape_format(img=pred_mask) pred_mask_pil = F_vision.to_pil_image(pred_mask.byte()) pred_mask_pil.save(no_color_mask_f_name) def apply_color_map_to_segmentation_masks( opts: argparse.Namespace, orig_image: Image.Image, pred_mask: Tensor, target_mask: Tensor, file_name: str, save_dir: str, color_map: Optional[List] = None, ) -> None: """Apply color map to segmentation masks. Args: orig_image: Original RGB image. pred_mask: Predicted segmentation tensor. target_mask: Ground truth segmentation tensor. file_name: File name. save_dir: Path of the directory where colored segmentation masks will be saved. color_map: Color mapping for converting predicted binary masks into colored representations. """ alpha = getattr(opts, "evaluation.segmentation.overlay_mask_weight") save_overlay_rgb_pred = getattr( opts, "evaluation.segmentation.save_overlay_rgb_pred" ) if color_map is None: color_map = Colormap().get_color_map_list() # convert predicted tensor to PIL images, apply color map and save pred_mask_pil = F_vision.to_pil_image(pred_mask.byte()) pred_mask_pil.putpalette(color_map) pred_mask_pil = pred_mask_pil.convert("RGB") pred_color_mask_dir = "{}/predictions_cmap".format(save_dir) if not os.path.isdir(pred_color_mask_dir): os.makedirs(pred_color_mask_dir, exist_ok=True) color_mask_f_name = "{}/{}".format(pred_color_mask_dir, file_name) pred_mask_pil.save(color_mask_f_name) logger.log("Predicted mask is saved at: {}".format(color_mask_f_name)) if target_mask is not None: # convert target tensor to PIL images, apply colormap, and save target_mask_pil = F_vision.to_pil_image(target_mask.byte()) target_mask_pil.putpalette(color_map) target_mask_pil = target_mask_pil.convert("RGB") target_color_mask_dir = "{}/gt_cmap".format(save_dir) if not os.path.isdir(target_color_mask_dir): os.makedirs(target_color_mask_dir, exist_ok=True) gt_color_mask_f_name = "{}/{}".format(target_color_mask_dir, file_name) target_mask_pil.save(gt_color_mask_f_name) logger.log("Target mask is saved at: {}".format(color_mask_f_name)) if save_overlay_rgb_pred and orig_image is not None: # overlay predicted mask on top of original image and save if pred_mask_pil.size != orig_image.size: # resize if input image size is not the same as predicted mask. # this is likely in case of labeled datasets where we use transforms on the input image orig_image = F_vision.resize( orig_image, size=pred_mask_pil.size[::-1], interpolation=F_vision.InterpolationMode.BILINEAR, ) overlay_img = Image.blend(pred_mask_pil, orig_image, alpha=alpha) overlay_mask_dir = "{}/predictions_overlay".format(save_dir) if not os.path.isdir(overlay_mask_dir): os.makedirs(overlay_mask_dir, exist_ok=True) overlay_mask_f_name = "{}/{}".format(overlay_mask_dir, file_name) overlay_img.save(overlay_mask_f_name) logger.log( "RGB image blended with mask is saved at: {}".format(overlay_mask_f_name) ) # save original image rgb_image_dir = "{}/rgb_images".format(save_dir) if not os.path.isdir(rgb_image_dir): os.makedirs(rgb_image_dir, exist_ok=True) rgb_image_f_name = "{}/{}".format(rgb_image_dir, file_name) orig_image.save(rgb_image_f_name) logger.log("Original RGB image is saved at: {}".format(overlay_mask_f_name)) def read_and_process_image( opts: argparse.Namespace, file_path: str ) -> Tuple[Tensor, Image.Image, int, int]: """Read and converts the input image into a tensor. Args: opts: Command-line arguments. file_path: Path of the image file. Returns: A tuple containing: 1. Image tensor with shape [1, C, H, W]. The tensor values are normalized between 0 and 1. 2. Original RGB image. 3. Height of the original image. 4. Width of the original image. """ input_img = Image.open(file_path).convert("RGB") input_pil = copy.deepcopy(input_img) orig_w, orig_h = input_img.size # Resize the image while maitaining the aspect ratio res_h, res_w = image_size_from_opts(opts) input_img = F_vision.resize( input_img, size=min(res_h, res_w), interpolation=F_vision.InterpolationMode.BILINEAR, ) input_tensor = F_vision.pil_to_tensor(input_img) input_tensor = input_tensor.float().div(255.0).unsqueeze(0) return input_tensor, input_pil, orig_h, orig_w @torch.no_grad() def predict_labeled_dataset(opts: argparse.Namespace) -> None: """Generate predictions for the labeled dataset. This function predicts segmentation labels for RGB input images and calculates segmentation accuracy, measured by mean intersection over union, through comparison between predicted segmentation masks and ground truth segmentation masks. Args: opts: Command-line arguments. """ device = getattr(opts, "dev.device", torch.device("cpu")) dataset_name = getattr(opts, "dataset.name", "") # set-up data loaders test_loader = create_test_loader(opts) # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) if model.training: logger.log("Model is in training mode. Switching to evaluation mode") model.eval() color_map = Colormap().get_color_map_list() adjust_label = 0 is_cityscape = False conf_mat = ConfusionMatrix() if hasattr(test_loader.dataset, "color_palette"): color_map = test_loader.dataset.color_palette() if hasattr(test_loader.dataset, "adjust_mask_value"): adjust_label = test_loader.dataset.adjust_mask_value() if dataset_name is not None and dataset_name.lower() == "cityscapes": is_cityscape = True for batch in tqdm(test_loader): samples, targets = batch["samples"], batch["targets"] batch_size = samples.shape[0] assert ( batch_size == 1 ), "We recommend to run segmentation evaluation with a batch size of 1" predict_and_save( opts=opts, input_tensor=samples, file_name=targets["file_name"][0], orig_w=targets["im_width"][0].item(), orig_h=targets["im_height"][0].item(), model=model, target_mask=targets["mask"], device=device, conf_mat=conf_mat, color_map=color_map, adjust_label=adjust_label, is_cityscape=is_cityscape, ) metrics = conf_mat.compute() logger.info("Quantitative results") print( "global correct: {:.2f}\naverage row correct: {}\nIoU: {}\nmean IoU: {:.2f}".format( metrics["accuracy_global"] * 100, ["{:.2f}".format(i * 100) for i in metrics["class_accuracy"]], ["{:.2f}".format(i * 100) for i in metrics["iou"]], metrics["mean_iou"] * 100, ) ) is_city_dataset = getattr(opts, "dataset.name", "") == "cityscapes" if is_city_dataset: from corenet.engine.segmentation_utils.cityscapes_iou import eval_cityscapes pred_dir = "{}/predictions_no_cmap/".format( getattr(opts, "common.exp_loc", None) ) gt_dir = os.path.join(getattr(opts, "dataset.root_val", None), "gtFine/val/") eval_cityscapes(pred_dir=pred_dir, gt_dir=gt_dir) @torch.no_grad() def predict_image(opts: argparse.Namespace, file_path: str) -> None: """Generate predictions for an RGB image. Note that the predictions are saved in 'common.results_loc' directory. Args: opts: Command-line arguments. file_path: Path of the image file. """ local_file_path = get_local_path(opts, file_path) if not os.path.isfile(local_file_path): logger.error("Image file does not exist at: {}".format(local_file_path)) input_tensor, input_pil, orig_h, orig_w = read_and_process_image( opts, local_file_path ) file_name = os.path.basename(file_path) device = getattr(opts, "dev.device") # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) if model.training: logger.log("Model is in training mode. Switching to evaluation mode") model.eval() predict_and_save( opts=opts, input_tensor=input_tensor, file_name=file_name, orig_h=orig_h, orig_w=orig_w, model=model, target_mask=None, device=device, orig_image=input_pil, ) @torch.no_grad() def predict_images_in_folder(opts: argparse.Namespace) -> None: """Generate predictions for all RGB images stored in a folder. Args: opts: Command-line arguments. ...note: The path of the folder containong RGB images is supplied using 'evaluation.segmentation.path' argument. """ img_folder_path = getattr(opts, "evaluation.segmentation.path") if img_folder_path is None: logger.error( "Location of the folder containing images is not passed. Please use --evaluation.segmentation.path " "as an argument to pass the location of the folder".format(img_folder_path) ) elif not os.path.isdir(img_folder_path): logger.error( "Folder containing images does not exist at: {}. Please check".format( img_folder_path ) ) img_files = [] for e in SUPPORTED_IMAGE_EXTNS: img_files_with_extn = glob.glob("{}/*{}".format(img_folder_path, e)) if len(img_files_with_extn) > 0 and isinstance(img_files_with_extn, list): img_files.extend(img_files_with_extn) if len(img_files) == 0: logger.error( "Number of image files found at {}: {}".format( img_folder_path, len(img_files) ) ) logger.log( "Number of image files found at {}: {}".format(img_folder_path, len(img_files)) ) device = getattr(opts, "dev.device", torch.device("cpu")) # set-up the model model = get_model(opts) model.eval() model.info() model = model.to(device=device) if model.training: logger.log("Model is in training mode. Switching to evaluation mode") model.eval() for image_fname in tqdm(img_files): input_tensor, input_pil, orig_h, orig_w = read_and_process_image( opts, file_path=image_fname ) image_fname = image_fname.split(os.sep)[-1] predict_and_save( opts=opts, input_tensor=input_tensor, file_name=image_fname, orig_h=orig_h, orig_w=orig_w, model=model, target_mask=None, device=device, orig_image=input_pil, ) def main_segmentation_evaluation(args: Optional[List[str]] = None) -> None: """Entrypoint for segmentation evaluation.""" opts = get_training_arguments(args=args) # device set-up opts = device_setup(opts) node_rank = getattr(opts, "ddp.rank") if node_rank < 0: logger.error("--rank should be >=0. Got {}".format(node_rank)) is_master_node = is_master(opts) # create the directory for saving results save_dir = getattr(opts, "common.results_loc") run_label = getattr(opts, "common.run_label") exp_dir = "{}/{}".format(save_dir, run_label) setattr(opts, "common.exp_loc", exp_dir) logger.log("Results (if any) will be stored here: {}".format(exp_dir)) create_directories(dir_path=exp_dir, is_master_node=is_master_node) num_gpus = getattr(opts, "dev.num_gpus", 1) # we disable the DDP setting for evaluating segmentation tasks setattr(opts, "ddp.use_distributed", False) dataset_workers = getattr(opts, "dataset.workers") if dataset_workers == -1: n_cpus = resources.cpu_count() # Set number of data workers to the same as number of CPUs if 'dataset.workers' is -1 setattr(opts, "dataset.workers", n_cpus) # For segmentation during inference, images are not resized to a fixed size. # Therefore, we set batch size to 1. logger.log("Setting batch size to 1 for segmentation evaluation.") setattr(opts, "dataset.train_batch_size0", 1) setattr(opts, "dataset.val_batch_size0", 1) setattr(opts, "dev.device_id", None) eval_mode = getattr(opts, "evaluation.segmentation.mode") if eval_mode == "single_image": # Predict segmentation mask for a single RGB image num_seg_classes = getattr(opts, "model.segmentation.n_classes") assert num_seg_classes is not None img_f_name = getattr(opts, "evaluation.segmentation.path") predict_image(opts, img_f_name) elif eval_mode == "image_folder": # Predict segmentation masks for all RGB images in a folder # This is useful for generating results for test set num_seg_classes = getattr(opts, "model.segmentation.n_classes") assert num_seg_classes is not None predict_images_in_folder(opts=opts) elif eval_mode == "validation_set": # evaluate and compute stats for labeled image dataset # This is useful for generating results for validation set and compute quantitative results predict_labeled_dataset(opts=opts) else: logger.error( "Supported modes are 'single_image', 'image_folder', and 'validation_set'. Got: {}".format( eval_mode ) ) ================================================ FILE: corenet/engine/evaluation_engine.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os import time import torch from corenet.constants import DEFAULT_LOG_FREQ, SUPPORTED_VIDEO_CLIP_VOTING_FN from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.engine.utils import autocast_fn, get_batch_size, get_log_writers from corenet.loss_fn.base_criteria import BaseCriteria from corenet.metrics.stats import Statistics from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.options.parse_args import parse_validation_metric_names from corenet.utils import logger from corenet.utils.common_utils import move_to_device from corenet.utils.ddp_utils import is_master class Evaluator: def __init__( self, opts: argparse.Namespace, model: BaseAnyNNModel, test_loader: CoreNetDataLoader, criteria: BaseCriteria, ) -> None: """ Evaluates the criteria on a validation or test dataset using a model. Args: opts: The command-line arguments as a namespace. model: The neural network model to be trained. test_loader: The data loader for the test dataset. criteria: The loss function used for training. """ self.opts = opts self.model = model self.criteria = criteria self.test_loader = test_loader self.device = getattr(opts, "dev.device", torch.device("cpu")) self.use_distributed = getattr(self.opts, "ddp.use_distributed", False) self.is_master_node = is_master(opts) self.stage_name = getattr(opts, "common.eval_stage_name", "evaluation") self.mixed_precision_training = getattr(opts, "common.mixed_precision", False) self.save_location = getattr(opts, "common.exp_loc") self.save_location = os.path.join(self.save_location, "eval") if not os.path.exists(self.save_location): os.makedirs(self.save_location, exist_ok=True) self.mixed_precision_dtype = getattr( opts, "common.mixed_precision_dtype", "float16" ) ( self.metric_names, self.ckpt_metric, self.ckpt_submetric, ) = parse_validation_metric_names(self.opts) self.log_writers = get_log_writers(self.opts, save_location=self.save_location) def eval_fn(self) -> None: model = self.model criteria = self.criteria log_freq = getattr(self.opts, "common.log_freq", DEFAULT_LOG_FREQ) evaluation_stats = Statistics( opts=self.opts, metric_names=self.metric_names, is_master_node=self.is_master_node, is_distributed=self.use_distributed, log_writers=self.log_writers, ) model.eval() criteria.eval() with torch.no_grad(): epoch_start_time = time.time() total_samples = len(self.test_loader) processed_samples = 0 for batch_id, batch in enumerate(self.test_loader): batch = move_to_device(opts=self.opts, x=batch, device=self.device) samples, targets = batch["samples"], batch["targets"] batch_size = get_batch_size(samples) with autocast_fn( enabled=self.mixed_precision_training, amp_precision=self.mixed_precision_dtype, ): # prediction pred_label = model(samples) loss_dict_or_tensor = criteria( input_sample=samples, prediction=pred_label, target=targets ) processed_samples += batch_size evaluation_stats.update( pred_label=pred_label, target_label=targets, extras={"loss": loss_dict_or_tensor}, batch_time=0.0, batch_size=batch_size, ) if batch_id % log_freq == 0 and self.is_master_node: evaluation_stats.iter_summary( epoch=0, n_processed_samples=processed_samples, total_samples=total_samples, elapsed_time=epoch_start_time, learning_rate=0.0, ) evaluation_stats.epoch_summary(epoch=0, stage=self.stage_name) def run(self) -> None: eval_start_time = time.time() self.eval_fn() for log_writer in self.log_writers: log_writer.close() eval_end_time = time.time() - eval_start_time logger.log("Evaluation took {} seconds".format(eval_end_time)) ================================================ FILE: corenet/engine/fsdp_trainer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import gc import time from typing import Dict, Optional, Tuple, Union import torch from torch import Tensor from corenet.constants import if_test_env from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.transforms.image_torch import apply_mixing_transforms from corenet.engine.default_trainer import DefaultTrainer from corenet.engine.utils import get_batch_size, step_log_metrics from corenet.loss_fn.base_criteria import BaseCriteria from corenet.metrics.stats import Statistics from corenet.modeling.misc.averaging_utils import EMA from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper from corenet.optims.base_optim import BaseOptim from corenet.optims.scheduler.base_scheduler import BaseLRScheduler from corenet.utils import logger from corenet.utils.common_utils import move_to_device class FSDPTrainer(DefaultTrainer): """ This class defines the training and validation code for training models with FullyShardedDataParallel. Args: opts: The command-line arguments as a namespace. model: The neural network model to be trained. validation_loader: The data loader for the validation dataset. training_loader: The data loader for the training dataset. criteria: The loss function used for training. optimizer: The optimizer used for training. scheduler: The learning rate scheduler used for training. start_epoch: The epoch to start training from. start_iteration: The iteration to start training from. best_metric: The best validation metric value achieved so far. model_ema: An optional instance of EMA model. """ def __init__( self, opts: argparse.Namespace, model: BaseAnyNNModel, validation_loader: CoreNetDataLoader, training_loader: CoreNetDataLoader, criteria: BaseCriteria, optimizer: BaseOptim, scheduler: BaseLRScheduler, start_epoch: int = 0, start_iteration: int = 0, best_metric: float = 0.0, model_ema: Optional[EMA] = None, ) -> None: if getattr(opts, "common.accum_freq") > 1: logger.error("Gradient accumumlation is not supported with FSDP") if getattr(opts, "ema.enable"): logger.error("EMA is not yet supported with FSDP") if not isinstance(model, FullyShardedDataParallelWrapper): logger.error( f"{self.__class__.__name__} expects model to be an instance of FullyShardedDataParallelWrapper" ) super().__init__( opts=opts, model=model, validation_loader=validation_loader, training_loader=training_loader, criteria=criteria, optimizer=optimizer, scheduler=scheduler, # FSDP does not use autocast for mixed-precision training and handles it internally. # So, gradient scalar is not required. gradient_scaler=None, start_epoch=start_epoch, start_iteration=start_iteration, best_metric=best_metric, model_ema=model_ema, ) def train_epoch(self, epoch: int) -> Tuple[float, float]: """Train model for one epoch. Args: epoch: Current epoch number. Returns: Average value for loss and checkpoint metric. """ time.sleep( if_test_env(0.5, otherwise=2) ) # To prevent possible deadlock during epoch transition if self.is_master_node: logger.double_dash_line() logger.info(f"Training epoch {epoch}") train_stats = Statistics( opts=self.opts, metric_names=self.train_metric_names, is_master_node=self.is_master_node, is_distributed=self.use_distributed, log_writers=self.log_writers, ) # set the training mode for model and criteria self._set_training_mode() max_norm = getattr(self.opts, "common.grad_clip") # set the gradient to zero or None self._zero_grad() epoch_start_time = time.time() batch_load_start = time.time() grad_norm = torch.tensor([0.0], dtype=torch.float, device=self.device) for batch_id, batch in enumerate(self.train_loader): if self.train_iterations > self.max_iterations: self.max_iterations_reached = True break # move to device batch = move_to_device(opts=self.opts, x=batch, device=self.device) # apply mix-up transforms if any batch = apply_mixing_transforms(opts=self.opts, data=batch) batch_load_toc = time.time() - batch_load_start samples, targets = batch["samples"], batch["targets"] batch_size = get_batch_size(samples) # update the learning rate self.optimizer = self.scheduler.update_lr( optimizer=self.optimizer, epoch=epoch, curr_iter=self.train_iterations ) # prediction pred_label = self.model(samples) # compute loss loss_dict_or_tensor: Union[Dict, Tensor] = self.criteria( input_sample=samples, prediction=pred_label, target=targets, epoch=epoch, iterations=self.train_iterations, ) if isinstance(loss_dict_or_tensor, Dict): if "total_loss" not in loss_dict_or_tensor.keys(): logger.error( "'total_loss' key is required for loss functions that return outputs as dictionary." ) loss = loss_dict_or_tensor["total_loss"] elif isinstance(loss_dict_or_tensor, Tensor): loss = loss_dict_or_tensor else: logger.error( f"Loss value should be an instance of Tensor or Dict. Got: {type(loss_dict_or_tensor)}" ) if not isinstance(loss, torch.Tensor): logger.error( f"Loss value should be an instance of Tensor. Got: {type(loss)}" ) if torch.isnan(loss): logger.error("Nan encountered in the loss.") loss.backward() if max_norm is not None: self.model.clip_grad_norm_(max_norm=max_norm) if "grad_norm" in self.train_metric_names: # compute grad_norm for logging purposes. # We can't use the output of clip_grad_norm_ because it returns the total norm before clipping grad_norm = self.compute_grad_norm() self.optimizer.step() self._zero_grad() self.train_iterations += 1 train_stats.update( pred_label=pred_label, target_label=targets, extras={"loss": loss_dict_or_tensor, "grad_norm": grad_norm}, batch_time=batch_load_toc, batch_size=batch_size, ) self._save_and_evaluate_interval_checkpoint( epoch=epoch, iterations=self.train_iterations, loss=loss ) if batch_id % self.log_freq == 0 and self.is_master_node: lr = self.scheduler.retrieve_lr(self.optimizer) train_stats.iter_summary( epoch=epoch, n_processed_samples=self.train_iterations, total_samples=self.max_iterations, learning_rate=lr, elapsed_time=epoch_start_time, ) train_metrics = train_stats._compute_avg_statistics_all() for log_writer in self.log_writers: step_log_metrics( lrs=lr, log_writer=log_writer, step=self.train_iterations, metrics=train_metrics, ) batch_load_start = time.time() avg_loss = train_stats.avg_statistics( metric_name="loss", sub_metric_name="total_loss" ) train_stats.epoch_summary(epoch=epoch, stage="training") avg_ckpt_metric = train_stats.avg_statistics( metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric ) # Python may not clean up the variables, so calling gc explicitly. gc.collect() return avg_loss, avg_ckpt_metric ================================================ FILE: corenet/engine/segmentation_utils/__init__.py ================================================ ================================================ FILE: corenet/engine/segmentation_utils/cityscapes_iou.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import glob import os import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as cityscapes_semseg_eval from corenet.utils import logger def eval_cityscapes(pred_dir: str, gt_dir: str) -> None: """Utility to evaluate on cityscapes dataset""" cityscapes_semseg_eval.args.predictionPath = pred_dir cityscapes_semseg_eval.args.predictionWalk = None cityscapes_semseg_eval.args.JSONOutput = False cityscapes_semseg_eval.args.colorized = False gt_img_list = glob.glob(os.path.join(gt_dir, "*", "*_gtFine_labelIds.png")) if len(gt_img_list) == 0: logger.error("Cannot find ground truth images at: {}".format(gt_dir)) pred_img_list = [] for gt in gt_img_list: pred_img_list.append( cityscapes_semseg_eval.getPrediction(cityscapes_semseg_eval.args, gt) ) results = cityscapes_semseg_eval.evaluateImgLists( pred_img_list, gt_img_list, cityscapes_semseg_eval.args ) logger.info("Evaluation results summary") eval_res_str = "\n\t IoU_cls: {:.2f} \n\t iIOU_cls: {:.2f} \n\t IoU_cat: {:.2f} \n\t iIOU_cat: {:.2f}".format( 100.0 * results["averageScoreClasses"], 100.0 * results["averageScoreInstClasses"], 100.0 * results["averageScoreCategories"], 100.0 * results["averageScoreInstCategories"], ) print(eval_res_str) ================================================ FILE: corenet/engine/utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os from collections.abc import MutableMapping from numbers import Number from typing import Any, Dict, List, Optional, Union import torch from torch import Tensor from torch.cuda.amp import autocast from corenet.utils import logger from corenet.utils.common_utils import create_directories from corenet.utils.ddp_utils import is_master from corenet.utils.file_logger import FileLogger str_to_torch_dtype = {"float16": torch.float16, "bfloat16": torch.bfloat16} def autocast_fn(enabled: bool, amp_precision: Optional[str] = "float16"): if enabled: # If AMP is enabled, ensure that: # 1. Device is CUDA # 2. dtype is FLOAT16 or BFLOAT16 if amp_precision not in str_to_torch_dtype: logger.error( "For Mixed-precision training, supported dtypes are {}. Got: {}".format( list(str_to_torch_dtype.keys()), amp_precision ) ) if not torch.cuda.is_available(): logger.error("For mixed-precision training, CUDA device is required.") return autocast(enabled=enabled, dtype=str_to_torch_dtype[amp_precision]) else: return autocast(enabled=False) def get_batch_size(x: Union[Tensor, Dict, List]) -> int: if isinstance(x, Tensor): return x.shape[0] elif isinstance(x, Dict): for key in ("image", "video", "audio"): if key in x: return get_batch_size(x[key]) raise NotImplementedError(f"Invalid dict keys {x.keys()}") elif isinstance(x, List): return len(x) else: raise NotImplementedError(f"Invalid type {type(x)}") def log_metrics( lrs: Union[List, float], log_writer, train_loss: float, val_loss: float, epoch: int, best_metric: float, val_ema_loss: Optional[float] = None, ckpt_metric_name: Optional[str] = None, train_ckpt_metric: Optional[float] = None, val_ckpt_metric: Optional[float] = None, val_ema_ckpt_metric: Optional[float] = None, ) -> None: if not isinstance(lrs, list): lrs = [lrs] for g_id, lr_val in enumerate(lrs): log_writer.add_scalar("LR/Group-{}".format(g_id), round(lr_val, 6), epoch) log_writer.add_scalar("Common/Best Metric", round(best_metric, 2), epoch) def flatten( dictionary: dict[str, Any], parent_key: str = "", separator: str = "/" ) -> Dict: """ Flatten a nested dictionary recursively. Args: dictionary: The dictionary to flatten. parent_key: The key of this dictionary's parent. separator: The separator to put between parent keys and child keys. Returns: The flattened dictionary. """ items = [] for key, value in dictionary.items(): new_key = parent_key + separator + key if parent_key else key if isinstance(value, MutableMapping): items.extend(flatten(value, new_key, separator=separator).items()) else: items.append((new_key, value)) return dict(items) def step_log_metrics( lrs: Union[List, float], log_writer: Any, step: int, metrics: Dict[str, Any], ) -> None: """ Log metrics for the current step of training/evaluation. Args: lrs: The learning rates. log_writer: The log_writer object to use for logging. step: The current step of training. metrics: A dictionary containing metrics to log. """ if not isinstance(lrs, list): lrs = [lrs] for g_id, lr_val in enumerate(lrs): log_writer.add_scalar("LR/Group-{}".format(g_id), round(lr_val, 6), step) if metrics is not None: flattened_metrics = flatten(metrics) for metric_name, metric_value in flattened_metrics.items(): if not (isinstance(metric_value, Number) or metric_value): continue log_writer.add_scalar(metric_name, metric_value, step) def get_log_writers(opts: argparse.Namespace, save_location: Optional[str]): is_master_node = is_master(opts) log_writers = [] if not is_master_node: return log_writers tensorboard_logging = getattr(opts, "common.tensorboard_logging", False) if tensorboard_logging and save_location is not None: try: from torch.utils.tensorboard import SummaryWriter except ImportError: logger.log( "Unable to import SummaryWriter from torch.utils.tensorboard. Disabling tensorboard logging" ) SummaryWriter = None if SummaryWriter is not None: exp_dir = "{}/tb_logs".format(save_location) create_directories(dir_path=exp_dir, is_master_node=is_master_node) log_writers.append( SummaryWriter(log_dir=exp_dir, comment="Training and Validation logs") ) bolt_logging = getattr(opts, "common.bolt_logging", False) if bolt_logging: try: from corenet.internal.utils.bolt_logger import BoltLogger except ModuleNotFoundError: BoltLogger = None if BoltLogger is None: logger.log("Unable to import bolt. Disabling bolt logging") else: log_writers.append(BoltLogger()) hub_logging = getattr(opts, "common.hub.logging", False) if hub_logging: try: from corenet.internal.utils.hub_logger import HubLogger except ModuleNotFoundError: HubLogger = None if HubLogger is None: logger.log("Unable to import hub. Disabling hub logging") else: try: hub_logger = HubLogger(opts) except Exception as ex: logger.log( f"Unable to initialize hub logger. Disabling hub logging: {ex}" ) hub_logger = None if hub_logger is not None: log_writers.append(hub_logger) file_logging = getattr(opts, "common.file_logging") if file_logging and save_location is not None: log_writers.append(FileLogger(os.path.join(save_location, "stats.pt"))) return log_writers ================================================ FILE: corenet/loss_fn/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional from corenet.loss_fn.base_criteria import BaseCriteria from corenet.utils import logger from corenet.utils.registry import Registry # Registry for loss functions. LOSS_REGISTRY = Registry( registry_name="loss_functions", base_class=BaseCriteria, lazy_load_dirs=["corenet/loss_fn"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def build_loss_fn( opts: argparse.Namespace, category: Optional[str] = "", *args, **kwargs ) -> BaseCriteria: """Helper function to build loss function from command-line arguments. Args: opts: command-line arguments category: Optional task category (e.g., classification). Specifying category may be useful for building composite loss functions. See `loss_fns.composite_loss.CompositeLoss.build_composite_loss_fn` function for an example Returns: Loss function module """ if not category: # If category is not specified, then read it from command-line arguments category = getattr(opts, "loss.category") if category is None: logger.error( "Please specify loss name using --loss.category. For composite loss function, see configuration" "example in `loss_fns.composite_loss.CompositeLoss`. Got None" ) # Get the name of loss function for a given category. # Note that loss functions (e.g., NeuralAugmentation) that are not task-specific does not have this # argument defined. In such case, we set the loss function name the same as category if hasattr(opts, f"loss.{category}.name"): loss_fn_name = getattr(opts, f"loss.{category}.name") else: loss_fn_name = category # We registered the base criteria classes for different categories using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used as a loss function. Therefore, we raise an error for such cases if loss_fn_name == "__base__": logger.error("__base__ can't be used as a loss function name. Please check.") loss_fn = LOSS_REGISTRY[loss_fn_name, category](opts, *args, **kwargs) return loss_fn def add_loss_fn_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """This method gets a parser object, and for every loss that is registered in the LOSS_REGISTRY adds its arguments to it.""" parser = BaseCriteria.add_arguments(parser=parser) parser = LOSS_REGISTRY.all_arguments(parser) return parser ================================================ FILE: corenet/loss_fn/base_criteria.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import abc import argparse from typing import Any from torch import nn from corenet.utils import logger class BaseCriteria(nn.Module, abc.ABC): """Base class for defining loss functions. Sub-classes must implement compute_loss function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super(BaseCriteria, self).__init__() self.opts = opts # small value for numerical stability purposes that sub-classes may want to use. self.eps = 1e-7 @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add criteria-specific arguments to the parser.""" if cls != BaseCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.category", type=str, default=None, help="Loss function category (e.g., classification). Defaults to None.", ) return parser @abc.abstractmethod def forward( self, input_sample: Any, prediction: Any, target: Any, *args, **kwargs ) -> Any: """Compute the loss. Args: input_sample: Input to the model. prediction: Model's output target: Ground truth labels """ raise NotImplementedError def extra_repr(self) -> str: return "" def __repr__(self) -> str: return "{}({}\n)".format(self.__class__.__name__, self.extra_repr()) ================================================ FILE: corenet/loss_fn/classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/loss_fn/classification/base_classification_criteria.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from typing import Any, Dict, Union from torch import Tensor from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria from corenet.utils import logger @LOSS_REGISTRY.register(name="__base__", type="classification") class BaseClassificationCriteria(BaseCriteria): """Base class for defining classification loss functions. Sub-classes must implement forward function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add criteria-specific arguments to the parser.""" if cls != BaseClassificationCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.classification.name", type=str, default=None, help=f"Name of the loss function in {cls.__name__}. Defaults to None.", ) return parser def _compute_loss( self, prediction: Tensor, target: Tensor, *args, **kwargs ) -> Tensor: """Sub-classes must override this function to compute loss Args: prediction: Output of the model target: ground truth Returns: Expected to return a scalar value of loss """ raise NotImplementedError def forward( self, input_sample: Any, prediction: Union[Dict[str, Tensor], Tensor], target: Tensor, *args, **kwargs, ) -> Tensor: """Computes the cross entropy loss. Args: input_sample: Input image tensor to model. prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of a dictionary, `logits` is a required key. target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes Shapes: input_sample: This loss function does not care about this argument. prediction: * When prediction is a tensor, then shape is [N, C] * When prediction is a dictionary, then the shape of prediction["logits"] is [N, C] target: The shape of target tensor is [N] Returns: Scalar loss value is returned. """ if isinstance(prediction, Tensor): return self._compute_loss( prediction=prediction, target=target, *args, **kwargs ) elif isinstance(prediction, Dict): if "logits" not in prediction: logger.error( f"logits is a required key in {self.__class__.__name__} when prediction type" f"is dictionary. Got keys: {prediction.keys()}" ) predicted_logits = prediction["logits"] if predicted_logits is None: logger.error("Predicted logits can not be None.") ce_loss = self._compute_loss( prediction=predicted_logits, target=target, *args, **kwargs ) return ce_loss else: logger.error( f"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}" ) ================================================ FILE: corenet/loss_fn/classification/binary_cross_entropy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.classification.base_classification_criteria import ( BaseClassificationCriteria, ) @LOSS_REGISTRY.register(name="binary_cross_entropy", type="classification") class BinaryCrossEntropy(BaseClassificationCriteria): """Binary cross-entropy loss for classification tasks Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.reduction = getattr( opts, "loss.classification.binary_cross_entropy.reduction", ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BinaryCrossEntropy: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.classification.binary-cross-entropy.reduction", type=str, default="mean", choices=["sum", "mean", "none", "batch_mean"], help="Specifies the reduction to apply to the output (default='mean')." " 'batch_mean' divides the sum of the loss only by the first dimension.", ) return parser def _compute_loss( self, prediction: Tensor, target: Tensor, *args, **kwargs ) -> Tensor: """The binary cross-entropy loss with logits for binary classification. The probability for class one is the Sigmoid on the logit. For multi-class problems with multiple valid labels, the loss penalizes by the given target probability of the same shape as predictions. Args: prediction: Logits of class 1 target: Ground-truth class index or probability. Shapes: prediction: [Batch size, ...] target: A tensor of similar shape to prediction if the target probability for each output is known. Or a tensor of ground-truth labels missing the last dimension of size `num_classes`. Returns: If reduction is none, then tensor of the same shape as prediction is returned. Otherwise, a scalar loss value is returned. """ if target.dim() == (prediction.dim() - 1): # Ground truth labels are hard labels. Convert to one-hot labels. target = F.one_hot(target, num_classes=prediction.shape[-1]) div_by = 1.0 if self.reduction == "batch_mean": div_by = target.shape[0] reduction = self.reduction if self.reduction != "batch_mean" else "sum" bce_loss = F.binary_cross_entropy_with_logits( input=prediction, target=target.to(prediction.dtype), reduction=reduction, ) return bce_loss / div_by def extra_repr(self) -> str: return f"\n\t reduction={self.reduction}" ================================================ FILE: corenet/loss_fn/classification/cross_entropy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.classification.base_classification_criteria import ( BaseClassificationCriteria, ) from corenet.loss_fn.utils.class_weighting import compute_class_weights @LOSS_REGISTRY.register(name="cross_entropy", type="classification") class CrossEntropy(BaseClassificationCriteria): """Cross entropy loss function for image classification tasks Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.ignore_idx = getattr( opts, "loss.classification.cross_entropy.ignore_index" ) self.use_class_wts = getattr( opts, "loss.classification.cross_entropy.class_weights" ) self.label_smoothing = getattr( opts, "loss.classification.cross_entropy.label_smoothing" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add cross-entropy criteria-specific arguments to the parser.""" if cls != CrossEntropy: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.classification.cross-entropy.class-weights", action="store_true", default=False, help=f"Use class weights in {cls.__name__}. Defaults to False.", ) group.add_argument( "--loss.classification.cross-entropy.ignore-index", type=int, default=-1, help=f"Target value that is ignored and does not contribute to " f"the input gradient in {cls.__name__}. Defaults to -1.", ) group.add_argument( "--loss.classification.cross-entropy.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) return parser def _compute_loss( self, prediction: Tensor, target: Tensor, *args, **kwargs ) -> Tensor: """Computes cross-entropy loss between prediction and target tensors. Args: prediction: Predicted tensor of shape [N, C] target: Target label tensor of shape [N] containing values between [0, C), Here, :math:`C` is the number of classes and :math:`N` is the batch size Returns: A scalar loss value """ weight = None if self.use_class_wts and self.training: n_classes = prediction.shape[1] weight = compute_class_weights(target=target, n_classes=n_classes) # for validation, we compute standard CE loss label_smoothing_val = self.label_smoothing if self.training else 0.0 return F.cross_entropy( input=prediction, target=target, weight=weight, ignore_index=self.ignore_idx, label_smoothing=label_smoothing_val, ) def extra_repr(self) -> str: return ( f"\n\t ignore_idx={self.ignore_idx}" f"\n\t class_weighting={self.use_class_wts}" f"\n\t label_smoothing={self.label_smoothing}" ) ================================================ FILE: corenet/loss_fn/classification/focal_loss.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.classification.base_classification_criteria import ( BaseClassificationCriteria, ) @LOSS_REGISTRY.register(name="focal_loss", type="classification") class FocalLoss(BaseClassificationCriteria): """Add focal loss, as introduced in RetinaNet (https://arxiv.org/pdf/1708.02002.pdf). This loss is similar to Cross Entropy, but downweights the loss from examples that are correctly classified with high confidence. This helps the classifier focus on hard examples. The weighting term is (1 - p)^gamma, where gamma is a hyperparameter. Arguments: gamma: The loss-weighting hyperparameter. weights: The class-specific loss weights, as a vector. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.gamma = getattr(opts, "loss.classification.focal_loss.gamma") self.weights = getattr(opts, "loss.classification.focal_loss.weights") if self.weights is not None: self.weights = torch.tensor(self.weights) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add Focal loss criteria-specific arguments to the parser.""" if cls != FocalLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.classification.focal-loss.gamma", type=float, default=0, help=f"Gamma of focal loss. Defaults to 0 and it's equvilent to CE loss.", ) group.add_argument( "--loss.classification.focal-loss.weights", nargs="*", default=None, type=float, help=f"Weights for {cls.__name__}. Defaults to None.", ) return parser def _compute_loss( self, prediction: Tensor, target: Tensor, *args, **kwargs ) -> Tensor: """Calculate the focal loss. Arguments: prediction: A tensor of shape [batch_size, num_classes] containing logits. targets: Either (1) a tensor of shape [batch_size] containing class ids, or (2) a tensor of shape [batch_size, num_classes] containing soft targets. Returns: A scalar loss value. """ if prediction.dim() != 2: raise ValueError(f"Expected 2 dimensions, got {prediction.dim()}") if target.dim() not in (1, 2): raise ValueError(f"Expected 1 or 2 dimensions, got {target.dim()}") if target.dim() == 1: target = F.one_hot(target, num_classes=prediction.shape[-1]) log_softmax_probabilities = torch.log_softmax(prediction, dim=-1) loss = -target * log_softmax_probabilities # Add the focal loss term. focal_term = (1 - torch.exp(log_softmax_probabilities)).pow(self.gamma) loss *= focal_term # Add the weights. if self.weights is not None: loss *= self.weights.to(loss.device) return loss.sum(dim=-1).mean() def extra_repr(self) -> str: return f"\n\t gamma={self.gamma}" f"\n\t weights={self.weights}" ================================================ FILE: corenet/loss_fn/composite_loss.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. from __future__ import annotations import argparse import copy import json from typing import Any, List, Mapping, Tuple from torch import Tensor from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria, build_loss_fn from corenet.options.utils import flatten_yaml_as_dict from corenet.utils import logger # CompositeLoss can be used with any task. Therefore, we register both name and type # as the same. @LOSS_REGISTRY.register(name="composite_loss", type="composite_loss") class CompositeLoss(BaseCriteria): """Combines different loss functions and returns the weighted sum of these losses. `loss_category` and `loss_weight` are two mandatory keys that allows us to combine different losses and compute their weighted sum. The `loss_category` specifies the category of a loss function and is a string (e.g., classification). The `loss_weight` specifies the contribution of a loss function and is a float value (e.g., 1.0). The sum of `loss_weight`s corresponding to different loss functions is not required to be 1. Args: opts: command-line arguments Example:: # Example yaml config for combining classification and neural_augmentation loss function is given below. # Please note that configuration for each loss function should start with `-` in `composite_loss`. loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" """ def __init__( self, opts: argparse.Namespace, *args, **kwargs, ) -> None: ( task_loss_fn_mapping, task_loss_wts_mapping, ) = CompositeLoss.build_composite_loss_fn(opts, *args, **kwargs) super().__init__(opts, *args, **kwargs) self.loss_fns = task_loss_fn_mapping self.loss_weights = task_loss_wts_mapping @classmethod def build_composite_loss_fn( cls, opts: argparse.Namespace, *args, **kwargs ) -> Tuple[Mapping[str, BaseCriteria], Mapping[str, float]]: """Build loss functions from command line arguments and loss registry Args: opts: command-line arguments Returns: A tuple of two dictionaries. The first dictionary, task_loss_fn_mapping, contains information about loss function category and module. The second dictionary, `task_loss_wts_mapping` contains the information about loss function category and weight. """ composite_loss_opts = getattr(opts, "loss.composite_loss") if composite_loss_opts is None: logger.error( f"{cls.__name__} can't be None. Please specify --loss.composite-loss using yaml file" ) if not isinstance(composite_loss_opts, List): logger.error( f"{cls.__name__} options are expected as a List. " f"Got type: {type(composite_loss_opts)} and values: {composite_loss_opts}" ) num_loss_fns = len(composite_loss_opts) if num_loss_fns < 1: logger.error(f"We need at least one loss function if using {cls.__name__}") task_loss_fn_mapping = {} task_loss_wts_mapping = {} for i, composite_loss_opts_as_dict in enumerate(composite_loss_opts): if "loss_category" not in composite_loss_opts_as_dict: logger.error("loss_category is a mandatory key") if "loss_weight" not in composite_loss_opts_as_dict: logger.error("Loss weight is a mandatory") loss_category = composite_loss_opts_as_dict.pop("loss_category") loss_weight = composite_loss_opts_as_dict.pop("loss_weight") if not isinstance(loss_weight, (float, int)): logger.error( f"loss weight should be either int or float. " f"Got: value={loss_weight}, type={type(loss_weight)}" ) # flatten the dictionary composite_loss_opts_as_dict = flatten_yaml_as_dict( composite_loss_opts_as_dict ) # `composite_loss_opts_as_dict` only contains the values of command-line arguments that are # defined in the yaml file. Therefore, if a user misses few arguments, we won't have access # to default values, leading to an error. To avoid this, we create a local copy of global # command-line arguments and update it with `composite_loss_opts_as_dict` arguments loss_opts = copy.deepcopy(opts) # override the global opts with loss_fn specific opts in local copy for k, v in composite_loss_opts_as_dict.items(): # we need to prefix each argument with loss because we define individual losses as # `loss.classification.*` and not `classification.*` setattr(loss_opts, "loss." + k, v) # given the category of a loss function, build the criteria task_loss_fn_mapping[loss_category] = build_loss_fn( opts=loss_opts, category=loss_category, *args, **kwargs ) task_loss_wts_mapping[loss_category] = loss_weight # see if the keys in task_loss_fn_mapping and task_loss_wts_mapping are the same or not # i.e., intersection is null. is_intersection = task_loss_fn_mapping.keys().isdisjoint(task_loss_wts_mapping) assert is_intersection is False, ( f"The keys in task_loss_fn_mapping and task_loss_wts_mapping are not the same. " f"Got: {task_loss_fn_mapping.keys()} and {task_loss_wts_mapping.keys()}" ) return task_loss_fn_mapping, task_loss_wts_mapping @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add criteria-specific arguments to the parser.""" if cls != CompositeLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument("--loss.composite-loss", type=json.loads, action="append") return parser def forward( self, input_sample: Any, prediction: Any, target: Any, *args, **kwargs ) -> Any: """Compute the weighted sum of different loss functions. Args: input_sample: Input to the model. prediction: Model's output target: Ground truth labels Returns: A mapping of the form (str: scalar loss value) with `total_loss` as a mandatory key. The other keys corresponds to loss category names and their values contain category-specific scalar loss values. total_loss is weighted sum of these category-specific losses. """ outputs = {} total_loss = 0.0 for loss_name, loss_layer in self.loss_fns.items(): loss_wt = self.loss_weights[loss_name] loss_val = loss_layer( input_sample=input_sample, prediction=prediction, target=target, *args, **kwargs, ) if not isinstance(loss_val, (Tensor, Mapping)): logger.error( "Loss value is expected as a scalar or dictionary of scalars with total_loss as a " "mandatory key." ) if isinstance(loss_val, Mapping) and "total_loss" in loss_val: loss_val = loss_val["total_loss"] if not isinstance(loss_val, Tensor): logger.error( f"Value corresponding to total_loss key in {loss_val} is expected to be scalar." f"Got: {type(loss_val)}" ) # scale the loss loss_val = loss_val * loss_wt total_loss += loss_val outputs[loss_name] = loss_val outputs.update({"total_loss": total_loss}) return outputs def train(self, mode: bool = True) -> None: """Sets the loss functions in training mode.""" for loss_name, loss_layer in self.loss_fns.items(): loss_layer.train(mode=mode) def eval(self) -> None: """Sets the loss functions in evaluation mode.""" for loss_name, loss_layer in self.loss_fns.items(): loss_layer.eval() def __repr__(self) -> str: repr_str = f"{self.__class__.__name__}(\n\t" for k, v in self.loss_fns.items(): repr_str += ( v.__repr__() .replace("\n\t", " ") .replace("\n)", f" loss_wt={self.loss_weights[k]})") ) repr_str += "\n\t" repr_str += "\n)" return repr_str ================================================ FILE: corenet/loss_fn/detection/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/loss_fn/detection/base_detection_criteria.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria @LOSS_REGISTRY.register(name="__base__", type="detection") class BaseDetectionCriteria(BaseCriteria): """Base class for defining detection loss functions. Sub-classes must implement forward function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseDetectionCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.detection.name", type=str, default=None, help=f"Name of the loss function in {cls.__name__}. Defaults to None.", ) return parser ================================================ FILE: corenet/loss_fn/detection/mask_rcnn_loss.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict import torch from torch import Tensor from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.detection.base_detection_criteria import BaseDetectionCriteria from corenet.utils import logger @LOSS_REGISTRY.register(name="mask_rcnn_loss", type="detection") class MaskRCNNLoss(BaseDetectionCriteria): """Mask RCNN loss is computed inside the MaskRCNN model. This class is a wrapper to extract loss values for different heads (RPN, classification, etc.) and compute the weighted sum. Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.classifier_weight = getattr( opts, "loss.detection.mask_rcnn_loss.classifier_weight" ) self.box_reg_weight = getattr( opts, "loss.detection.mask_rcnn_loss.box_reg_weight" ) self.mask_weight = getattr(opts, "loss.detection.mask_rcnn_loss.mask_weight") self.objectness_weight = getattr( opts, "loss.detection.mask_rcnn_loss.objectness_weight" ) self.rpn_box_reg = getattr(opts, "loss.detection.mask_rcnn_loss.rpn_box_reg") # dev.device is not a part of model arguments. so test fails. # Setting a default value so test works self.device = getattr(opts, "dev.device", torch.device("cpu")) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != MaskRCNNLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.detection.mask-rcnn-loss.classifier-weight", type=float, default=1, help=f"Weight for classifier in {cls.__name__}. Defaults to 1.", ) group.add_argument( "--loss.detection.mask-rcnn-loss.box-reg-weight", type=float, default=1, help=f"Weight for box reg in {cls.__name__}. Defaults to 1.", ) group.add_argument( "--loss.detection.mask-rcnn-loss.mask-weight", type=float, default=1, help=f"Weight for mask in {cls.__name__}. Defaults to 1.", ) group.add_argument( "--loss.detection.mask-rcnn-loss.objectness-weight", type=float, default=1, help=f"Weight for objectness in {cls.__name__}. Defaults to 1.", ) group.add_argument( "--loss.detection.mask-rcnn-loss.rpn-box-reg", type=float, default=1, help=f"Weight for rpn box reg. in {cls.__name__}. Defaults to 1.", ) return parser def forward( self, input_sample: Any, prediction: Dict[str, Tensor], *args, **kwargs, ) -> Dict[str, Tensor]: """Compute MaskRCNN loss. Args: input_sample: Input image tensor to the model. prediction: Mapping of the Maskrcnn losses. Shapes: input_sample: This loss function does not care about input to the model. prediction: Dictionary containing scalar Mask RCNN loss values. Expected keys are loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg. Returns: A mapping of (string: scalar) is returned. Output contains following keys: (total_loss, loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg). """ if not self.training: # MaskRCNN doesn't return the loss during validation. Therefore, we return 0. return {"total_loss": torch.tensor(0.0, device=self.device)} if not isinstance(prediction, Dict): logger.error( f"{self.__class__.__name__} requires prediction as a dictionary with " f"loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg as " f"mandatory keys. Got: {type(prediction)}." ) if not { "loss_classifier", "loss_box_reg", "loss_mask", "loss_objectness", "loss_rpn_box_reg", }.issubset(prediction.keys()): logger.error( f"loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg are " f"required keys in {self.__class__.__name__}. Got: {prediction.keys()}" ) total_loss = 0.0 mask_rcnn_losses = {} for loss_key, loss_wt in zip( [ "loss_classifier", "loss_box_reg", "loss_mask", "loss_objectness", "loss_rpn_box_reg", ], [ self.classifier_weight, self.box_reg_weight, self.mask_weight, self.objectness_weight, self.rpn_box_reg, ], ): loss_ = prediction[loss_key] * loss_wt total_loss += loss_ mask_rcnn_losses[loss_key] = loss_ mask_rcnn_losses.update({"total_loss": total_loss}) return mask_rcnn_losses def extra_repr(self) -> str: return ( f"\n\t classifier_wt={self.classifier_weight}" f"\n\t box_reg_weight={self.box_reg_weight}" f"\n\t mask_weight={self.mask_weight}" f"\n\t objectness_weight={self.objectness_weight}" f"\n\t rpn_box_reg={self.rpn_box_reg}" ) ================================================ FILE: corenet/loss_fn/detection/ssd_multibox_loss.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.detection.base_detection_criteria import BaseDetectionCriteria from corenet.third_party.modeling.ssd_utils import hard_negative_mining from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.tensor_utils import tensor_to_python_float @LOSS_REGISTRY.register(name="ssd_multibox_loss", type="detection") class SSDLoss(BaseDetectionCriteria): """Loss for single shot multi-box object detection Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.unscaled_reg_loss = 1e-7 self.unscaled_conf_loss = 1e-7 self.neg_pos_ratio = getattr( opts, "loss.detection.ssd_multibox_loss.neg_pos_ratio" ) self.wt_loc = 1.0 self.curr_iter = 0 self.max_iter = getattr( opts, "loss.detection.ssd_multibox_loss.max_monitor_iter" ) self.update_inter = getattr( opts, "loss.detection.ssd_multibox_loss.update_wt_freq" ) self.is_master = is_master(opts) self.label_smoothing = getattr( opts, "loss.detection.ssd_multibox_loss.label_smoothing" ) if not (0.0 <= self.label_smoothing < 1.0): logger.error( "The value of --loss.detection.ssd-multibox-loss.label-smoothing should be between 0 and 1. " "Got: {}".format(self.label_smoothing) ) # Add default value to run CI/CD smoothly self.is_distributed = getattr(opts, "ddp.use_distributed", False) self.reset_unscaled_loss_values() def reset_unscaled_loss_values(self) -> None: """Reset the unscaled coefficients for confidence and regression losses to small values""" # initialize with very small float values self.unscaled_conf_loss = 1e-7 self.unscaled_reg_loss = 1e-7 @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != SSDLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.detection.ssd-multibox-loss.neg-pos-ratio", type=int, default=3, help=f"Negative positive ratio in {cls.__name__}. Defaults to 3.", ) group.add_argument( "--loss.detection.ssd-multibox-loss.max-monitor-iter", type=int, default=-1, help=f"Number of iterations for monitoring location and " f"classification loss in {cls.__name__}. -1 means do not monitor. " f"Defaults to -1.", ) group.add_argument( "--loss.detection.ssd-multibox-loss.update-wt-freq", type=int, default=200, help=f"Update the weights after N number of iterations in {cls.__name__}. " f"Defaults to 200 iterations.", ) group.add_argument( "--loss.detection.ssd-multibox-loss.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the classification loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) return parser def forward( self, input_sample: Any, prediction: Dict[str, Tensor], target: Dict[str, Tensor], *args, **kwargs, ) -> Dict[str, Tensor]: """ Compute the SSD Loss Args: input_sample: Input image tensor to the model. prediction: Model output. It is a mapping of the form (string: Tensor) containing two mandatory keys, i.e., scores and boxes target: Ground truth labels. It is a mapping of the form (string: Tensor) containing two mandatory keys, i.e., box_labels and box_coordinates. Shape: input_sample: This loss function does not care about input to the model. prediction["scores"]: Shape is [Batch size, number of anchors, number of classes] prediction["boxes"]: Shape is [Batch size, number of anchors, 4] where 4 is the number of box coordinates target["box_labels"]: Shape is [Batch size, number of anchors] target["box_coordinates"]: Shape is [Batch size, number of anchors, 4] Returns: A mapping of (string: scalar) is returned. Output contains following keys: (total_loss, reg_loss, cls_loss). """ if not {"scores", "boxes"}.issubset(prediction.keys()): logger.error( f"scores and boxes are mandatory keys for model's output in {self.__class__.__name__}." ) if not {"box_labels", "box_coordinates"}.issubset(target.keys()): logger.error( f"box_labels and box_coordinates are mandatory keys for ground truth in {self.__class__.__name__}." ) confidence = prediction["scores"] predicted_locations = prediction["boxes"] gt_labels = target["box_labels"] gt_locations = target["box_coordinates"] num_classes = confidence.shape[-1] num_coordinates = predicted_locations.shape[-1] pos_mask = gt_labels > 0 predicted_locations = predicted_locations[pos_mask].reshape(-1, num_coordinates) gt_locations = gt_locations[pos_mask].reshape(-1, num_coordinates) num_pos = max(1, gt_locations.shape[0]) smooth_l1_loss = F.smooth_l1_loss( predicted_locations, gt_locations, reduction="sum" ) with torch.no_grad(): loss = -F.log_softmax(confidence, dim=2)[:, :, 0] mask = hard_negative_mining(loss, gt_labels, self.neg_pos_ratio) confidence = confidence[mask, :] label_smoothing = self.label_smoothing if self.training else 0.0 classification_loss = F.cross_entropy( input=confidence.reshape(-1, num_classes), target=gt_labels[mask], reduction="sum", label_smoothing=label_smoothing, ) if self.curr_iter <= self.max_iter and self.training: # classification loss may dominate localization loss or vice-versa # Therefore, to ensure that their contributions are equal towards total loss, we scale regression loss. # If classification loss contribution is less (or more), then scaling factor will be < 1 (or > 1) self.unscaled_conf_loss += tensor_to_python_float( classification_loss, is_distributed=self.is_distributed ) self.unscaled_reg_loss += tensor_to_python_float( smooth_l1_loss, is_distributed=self.is_distributed ) if ( (self.curr_iter + 1) % self.update_inter == 0 ) or self.curr_iter == self.max_iter: # weight value before update before_update = tensor_to_python_float( self.wt_loc, is_distributed=self.is_distributed ) before_update = round(before_update, 4) # update the weight value self.wt_loc = self.unscaled_conf_loss / self.unscaled_reg_loss self.reset_unscaled_loss_values() if self.is_master: # weight value after update after_update = tensor_to_python_float( self.wt_loc, is_distributed=self.is_distributed ) after_update = round(after_update, 4) logger.log( f"Updating localization loss multiplier from {before_update} to {after_update}" ) self.curr_iter += 1 if self.training and self.wt_loc > 0.0: smooth_l1_loss = smooth_l1_loss * self.wt_loc ssd_loss = (smooth_l1_loss + classification_loss) / num_pos return { "total_loss": ssd_loss, "reg_loss": smooth_l1_loss / num_pos, "cls_loss": classification_loss / num_pos, } def extra_repr(self) -> str: return ( f"\n\t neg_pos_ratio={self.neg_pos_ratio}" f"\n\t box_loss=SmoothL1" f"\n\t class_loss=CrossEntropy" f"\n\t self_weighting={True if self.max_iter > 0 else False}" ) ================================================ FILE: corenet/loss_fn/distillation/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/loss_fn/distillation/base_distillation.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from typing import Mapping, Union import torch from torch import Tensor from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria from corenet.loss_fn.utils.build_helper import build_cls_teacher_from_opts from corenet.utils import logger @LOSS_REGISTRY.register(name="__base__", type="distillation") class BaseDistillationCriteria(BaseCriteria): """Base class for defining distillation loss functions. Sub-classes must implement `_forward_distill` function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.teacher = build_cls_teacher_from_opts(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseDistillationCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.distillation.name", type=str, default=None, help="Name of the loss function. Defaults to None.", ) return parser @torch.no_grad() def _logits_from_teacher(self, input_sample: Tensor) -> Tensor: """Compute logits from teacher given input image tensor. Args: input_sample: Input image tensor Shape: input_sample: Shape is [Batch size, 3, height, width] teacher_output or teacher_output["logits"]: Shape is [Batch size, number of classes] Returns: Teacher output tensor (without softmax) ...note: The output of teacher can be Tensor or Dict[str, Tensor]. In case of dictionary, logits is a mandatory key. """ self.teacher.eval() teacher_output: Union[Tensor, Mapping[str, Tensor]] = self.teacher(input_sample) if isinstance(teacher_output, Mapping): if "logits" not in teacher_output: logger.error( "The output type of teacher is dictionary and must contain logits as a key." f"Got: {teacher_output.keys()}" ) return teacher_output["logits"] return teacher_output def _forward_distill( self, input_sample: Tensor, prediction: Tensor, *args, **kwargs ) -> Tensor: """Computes distillation loss. Args: input_sample: Input image tensor prediction: Student model's output. Shapes: input_sample: Shape is [Batch size, 3, height, width] prediction: Shape is [Batch size, number of classes] Returns: A scalar loss value. """ raise NotImplementedError def forward( self, input_sample: Tensor, prediction: Union[Mapping[str, Tensor], Tensor], target: Tensor, *args, **kwargs, ) -> Union[Mapping[str, Tensor], Tensor]: """Computes distillation loss Args: input_sample: Input image tensor. prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of a dictionary, `logits` is a required key. target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes Shapes: input_sample: The shape of input tensor is [N, C, H, W] prediction: * When prediction is a tensor, then shape is [N, C] * When prediction is a dictionary, then shape of prediction["logits"] is [N, C] target: The shape of target tensor is [N] Returns: * Scalar loss value is returned. """ if isinstance(prediction, Tensor): return self._forward_distill( input_sample=input_sample, prediction=prediction, *args, **kwargs ) elif isinstance(prediction, Mapping): if "logits" not in prediction: logger.error( f"logits is a required key in {self.__class__.__name__} when prediction type" f"is dictionary. Got keys: {prediction.keys()}" ) predicted_logits = prediction["logits"] # compute distillation loss distill_loss = self._forward_distill( input_sample=input_sample, prediction=predicted_logits, *args, **kwargs ) return distill_loss else: logger.error( f"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}" ) ================================================ FILE: corenet/loss_fn/distillation/hard_distillation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.distillation.base_distillation import BaseDistillationCriteria from corenet.utils import logger @LOSS_REGISTRY.register(name="hard_distillation", type="distillation") class HardDistillationLoss(BaseDistillationCriteria): """Hard distillation using cross-entropy for classification tasks. Given an input sample, hard-labels are generated from a teacher and cross-entropy loss is computed between hard-labels and student model's output. Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: top_k = getattr(opts, "loss.distillation.hard_distillation.topk") if top_k < 1: logger.error(f"The value of top-k should be greater than 0. Got: {top_k}") label_smoothing = getattr( opts, "loss.distillation.hard_distillation.label_smoothing" ) if not (0.0 <= label_smoothing < 1.0): logger.error( f"The value of label smoothing should be between 0 and 1. Got: {label_smoothing}" ) super().__init__(opts, *args, **kwargs) self.topk = top_k self.label_smoothing = label_smoothing @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != HardDistillationLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.distillation.hard-distillation.topk", type=int, default=1, help=f"Distill top-k labels from teacher when in {cls.__name__}. Defaults to 1.", ) group.add_argument( "--loss.distillation.hard-distillation.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the classification loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) return parser def _forward_distill( self, input_sample: Tensor, prediction: Tensor, *args, **kwargs ) -> Tensor: """ Computes cross entropy loss between students and hard labels generated from teacher. Args: input_sample: Input image tensor prediction: Output of student model Shapes: input_sample: Shape is [Batch size, 3, height, width] prediction: Shape is [Batch size, Number of classes] Returns: A scalar loss value ...note: When top-k labels extracted from teacher are used for distillation, binary cross entropy loss is used. """ with torch.no_grad(): teacher_logits = self._logits_from_teacher(input_sample) teacher_probs = F.softmax(teacher_logits, dim=-1).detach() _, teacher_topk_labels = torch.topk( teacher_probs, k=self.topk, dim=-1, largest=True, sorted=True ) if self.topk > 1: num_classes = prediction.shape[-1] teacher_topk_labels = F.one_hot( teacher_topk_labels, num_classes=num_classes ) teacher_topk_labels = teacher_topk_labels.sum(1) teacher_topk_labels = teacher_topk_labels.to(dtype=prediction.dtype) # smooth labels corresponding to multiple classes smooth_class_p = (1.0 - self.label_smoothing) / self.topk # distribute the mass over remaining classes smooth_non_class_p = self.label_smoothing / (num_classes - self.topk) teacher_topk_labels = torch.where( teacher_topk_labels == 1.0, smooth_class_p, smooth_non_class_p ) # scale by number of classes. Otherwise, the contribution is small loss = ( F.binary_cross_entropy_with_logits( input=prediction, target=teacher_topk_labels, reduction="mean" ) * num_classes ) else: teacher_topk_labels = teacher_topk_labels.reshape(-1) loss = F.cross_entropy( input=prediction, target=teacher_topk_labels, reduction="mean", label_smoothing=self.label_smoothing, ) return loss def extra_repr(self) -> str: return f"\n\t topk={self.topk}" f"\n\tlabel_smoothing={self.label_smoothing}" ================================================ FILE: corenet/loss_fn/distillation/soft_kl_distillation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.distillation.base_distillation import BaseDistillationCriteria from corenet.utils import logger @LOSS_REGISTRY.register(name="soft_kl_loss", type="distillation") class SoftKLLoss(BaseDistillationCriteria): """Soft KL Loss for classification tasks. Given an input sample, soft-labels (or probabilities) are generated from a teacher and KL loss is computed between soft-labels and student model's output. Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: temperature = getattr(opts, "loss.distillation.soft_kl_loss.temperature") if temperature <= 0.0: logger.error( f"The value of temperature in {self.__class__.__name__} should be positive." ) super().__init__(opts, *args, **kwargs) self.temperature = temperature @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != SoftKLLoss: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.distillation.soft-kl-loss.temperature", type=float, default=1.0, help=f"Temperature for KL divergence loss in {cls.__name__}. Defaults to 1.", ) return parser def _forward_distill( self, input_sample: Tensor, prediction: Tensor, *args, **kwargs ) -> Tensor: """Computes distillation loss. Args: input_sample: Input image tensor prediction: Student model's output. Shapes: input_sample: Shape is [Batch size, 3, height, width] prediction: Shape is [Batch size, number of classes] Returns: A scalar loss value. """ with torch.no_grad(): teacher_logits = self._logits_from_teacher(input_sample) teacher_lprobs = F.log_softmax( teacher_logits / self.temperature, dim=1 ).detach() student_lprobs = F.log_softmax(prediction / self.temperature, dim=-1) kl_loss = F.kl_div( student_lprobs, teacher_lprobs, reduction="batchmean", log_target=True ) return kl_loss * (self.temperature**2) def extra_repr(self) -> str: return f"\n\t temperature={self.temperature}" ================================================ FILE: corenet/loss_fn/language_modeling/__init__.py ================================================ ================================================ FILE: corenet/loss_fn/language_modeling/base_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, Optional, Union from torch import Tensor from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria from corenet.utils import logger @LOSS_REGISTRY.register(name="__base__", type="language_modeling") class BaseLanguageModelingCriteria(BaseCriteria): """Base class for defining loss functions for the task of language modeling. Args: opts: Command line arguments. ...note: Sub-classes must implement '_compute_loss' function. """ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add language modeling specific arguments to the parser.""" if cls is BaseLanguageModelingCriteria: group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.language-modeling.name", type=str, default=None, help=f"Name of the loss function in {cls.__name__}. Defaults to None.", ) return parser def _compute_loss(self, prediction: Tensor, target: Tensor) -> Tensor: """Sub-classes must override this function to compute loss. Args: prediction: Output of the model. target: Ground truth labels. Returns: Expected to return a scalar value of loss. """ raise NotImplementedError( "Sub-classes must override this function to compute loss." ) def forward( self, input_sample: Any, prediction: Union[Dict[str, Tensor], Tensor], target: Tensor, epoch: Optional[int] = None, iterations: Optional[int] = None, ) -> Union[Dict[str, Tensor], Tensor]: """Computes the loss. Args: input_sample: Input samples to model. prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of mapping, `logits` is a required key. target: Target label tensor containing values in the range `[0, vocabulary size)`. epoch: Training epoch. iterations: Training iteration. Shapes: input_sample: This loss function does not care about this argument. prediction: * When prediction is a tensor, then shape is [batch size, sequence length, vocabulary size] * When prediction is a dictionary, then the shape of prediction["logits"] is [batch size, sequence length, vocabulary size] target: The shape of target tensor is [batch size, sequence length] Returns: Either of the following is returned as an output: 1. 0-dimensional tensor containing the scalar loss value. 2. Mapping of the form (string: 0-dimensional tensor) is returned with 'total_loss' as a mandatory key. ...note: While epoch and iteration values are currently not utilized in language modeling loss functions, they may be incorporated in future developments or research. """ if isinstance(prediction, Tensor): return self._compute_loss(prediction=prediction, target=target) elif isinstance(prediction, Dict): if "logits" not in prediction: logger.error( f"logits is a required key in {self.__class__.__name__} when prediction type" f"is dictionary. Got keys: {prediction.keys()}" ) predicted_logits = prediction["logits"] if predicted_logits is None: logger.error("Predicted logits can not be None.") loss = self._compute_loss(prediction=predicted_logits, target=target) return loss else: logger.error( f"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}" ) ================================================ FILE: corenet/loss_fn/language_modeling/cross_entropy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Union from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.language_modeling.base_lm import BaseLanguageModelingCriteria @LOSS_REGISTRY.register(name="cross_entropy", type="language_modeling") class CrossEntropyLM(BaseLanguageModelingCriteria): """Cross entropy loss function for language modeling tasks. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace) -> None: super().__init__(opts) self.ignore_idx = getattr( opts, "loss.language_modeling.cross_entropy.ignore_index" ) if self.training: self.label_smoothing = getattr( opts, "loss.language_modeling.cross_entropy.label_smoothing" ) else: # for validation/test sets, we compute standard CE loss self.label_smoothing = 0.0 self.use_z_loss = getattr( opts, "loss.language_modeling.cross_entropy.use_z_loss" ) self.z_loss_eps = getattr( opts, "loss.language_modeling.cross_entropy.z_loss_eps" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add cross-entropy criteria-specific arguments to the parser.""" if cls == CrossEntropyLM: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.language-modeling.cross-entropy.ignore-index", type=int, default=-1, help=f"Target value that is ignored and does not contribute to " f"the input gradient in {cls.__name__}. Defaults to -1.", ) group.add_argument( "--loss.language-modeling.cross-entropy.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) group.add_argument( "--loss.language-modeling.cross-entropy.use-z-loss", action="store_true", default=False, help="Use z-loss with cross-entropy loss. Defaults to False.", ) group.add_argument( "--loss.language-modeling.cross-entropy.z-loss-eps", default=1.0e-4, type=float, help="Epsilon value for z-loss. Defaults to 0.0001.", ) return parser def _compute_loss( self, prediction: Tensor, target: Tensor ) -> Union[Dict[str, Tensor], Tensor]: """Computes cross-entropy loss between prediction and target tensors. Args: prediction: Predicted tensor of shape [batch size, sequence length, vocabulary size]. target: Target label tensor containing values in the range `[0, vocabulary size)`. The shape of tensor is [batch size, sequence length]. Returns: 1. If z-loss is disabled, then a 0-dimensional tensor containing scalar loss value is returned. 2. If z-loss is enabled, then a dictionary of the form (string: 0-dimensional tensor) is returned with three keys: 'total_loss', 'ce_loss', and 'z_loss'. """ batch_size, seq_length, vocab_size = prediction.shape prediction = prediction.reshape(batch_size * seq_length, vocab_size) target = target.reshape(batch_size * seq_length) ce_loss = F.cross_entropy( input=prediction, target=target, ignore_index=self.ignore_idx, label_smoothing=self.label_smoothing, ) if self.use_z_loss: # Adaption of Eq. (5) for z-loss computation in https://arxiv.org/pdf/2202.08906.pdf (non-router use-case). valid_tokens = (target != self.ignore_idx).type_as(prediction) # do not compute z_loss for ignored indices z_loss = (prediction * valid_tokens[:, None]).logsumexp(-1).pow(2).sum() z_loss *= self.z_loss_eps / valid_tokens.sum() return { "total_loss": ce_loss + z_loss, "ce_loss": ce_loss, "z_loss": z_loss, } return ce_loss def extra_repr(self) -> str: loss_info_str = ( f"\n\t ignore_idx={self.ignore_idx}" f"\n\t label_smoothing={self.label_smoothing}" ) if self.use_z_loss: loss_info_str += ( f"\n\t use_z_loss={self.use_z_loss}" f"\n\t z_loss_eps={self.z_loss_eps}" ) return loss_info_str ================================================ FILE: corenet/loss_fn/language_modeling/cross_entropy_for_kv_prediction.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List, Optional, Union import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria from corenet.utils import logger @LOSS_REGISTRY.register( name="cross_entropy_for_kv_prediction", type="language_modeling" ) class CrossEntropyForKVPrediction(BaseCriteria): """Cross entropy loss function for language modeling tasks. Used in KV Prediction experiments (https://arxiv.org/abs/2410.08391). Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace) -> None: super().__init__(opts) self.ignore_idx = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.ignore_index" ) if self.training: self.label_smoothing = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.label_smoothing", ) else: # for validation/test sets, we compute standard CE loss self.label_smoothing = 0.0 self.use_z_loss = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.use_z_loss" ) self.z_loss_eps = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.z_loss_eps" ) self.auxiliary_loss = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.auxiliary_loss", ) self.base_loss = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.base_loss" ) self.kv_loss = getattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.kv_loss" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add cross-entropy criteria-specific arguments to the parser.""" if cls == CrossEntropyForKVPrediction: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.ignore-index", type=int, default=-1, help=f"Target value that is ignored and does not contribute to " f"the input gradient in {cls.__name__}. Defaults to -1.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.use-z-loss", action="store_true", default=False, help="Use z-loss with cross-entropy loss. Defaults to False.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.z-loss-eps", default=1.0e-4, type=float, help="Epsilon value for z-loss. Defaults to 0.0001.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.auxiliary-loss", default=0.0, type=float, help="Multiplicative factor for auxiliary loss.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.base-loss", default=1.0, type=float, help="Multiplicative factor for base loss.", ) group.add_argument( "--loss.language-modeling.cross-entropy-for-kv-prediction.kv-loss", default=0.0, type=float, help="Multiplicative factor for KV loss.", ) return parser def forward( self, input_sample: Any, prediction: Union[Dict[str, Tensor], Tensor], target: Tensor, epoch: Optional[int] = None, iterations: Optional[int] = None, ) -> Union[Dict[str, Tensor], Tensor]: """Computes the loss. Args: input_sample: Input samples to model. prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of mapping, `logits` is a required key. target: Target label tensor containing values in the range `[0, vocabulary size)`. epoch: Training epoch. iterations: Training iteration. Shapes: input_sample: This loss function does not care about this argument. prediction: * When prediction is a tensor, then shape is [batch size, sequence length, vocabulary size] * When prediction is a dictionary, then the shape of prediction["logits"] is [batch size, sequence length, vocabulary size] target: The shape of target tensor is [batch size, sequence length] Returns: Either of the following is returned as an output: 1. 0-dimensional tensor containing the scalar loss value. 2. Mapping of the form (string: 0-dimensional tensor) is returned with 'total_loss' as a mandatory key. ...note: While epoch and iteration values are currently not utilized in language modeling loss functions, they may be incorporated in future developments or research. """ if isinstance(prediction, Tensor): raise ValueError(f"This loss requires a dictionary.") elif isinstance(prediction, Dict): expected_keys = { "auxiliary_logits", "past_keys", "past_values", "base_past_keys", "base_past_values", } if not expected_keys.issubset(prediction): logger.error( f"Expected keys {expected_keys=}." f"Got keys {prediction.keys()=}" ) loss = self._compute_loss( prediction=prediction["logits"], target=target, auxiliary=prediction["auxiliary_logits"], past_keys=prediction["past_keys"], past_values=prediction["past_values"], base_past_keys=prediction["base_past_keys"], base_past_values=prediction["base_past_values"], ) return loss else: logger.error( f"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}" ) def _compute_loss( self, prediction: Tensor, target: Tensor, auxiliary: Tensor, past_keys: List[Tensor], past_values: List[Tensor], base_past_keys: List[Tensor], base_past_values: List[Tensor], ) -> Union[Dict[str, Tensor], Tensor]: """Computes cross-entropy loss between prediction and target tensors. Args: prediction: Predicted tensor of shape [batch size, sequence length, vocabulary size]. target: Target label tensor containing values in the range `[0, vocabulary size)`. The shape of tensor is [batch size, sequence length]. auxiliary: The Auxiliary model's logits. A tensor of shape [batch size, sequence length, vocabulary size]. past_keys: The keys from the KV cache generated by the KV predicter. past_values: The values from the KV cache generated by the KV predicter. base_past_keys: The keys from the KV cache generated by the Base model. base_past_values: The values from the KV cache generated by the Base model. Returns: A dictionary with total_loss, base_loss, auxiliary_loss, and the key/value cache prediction losses at each layer, 'k_loss/i' and 'v_loss/i' (if the key/value cache loss is activated). """ batch_size, seq_length, vocab_size = prediction.shape prediction = prediction.reshape(batch_size * seq_length, vocab_size) target = target.reshape(batch_size * seq_length) ce_loss = F.cross_entropy( input=prediction, target=target, ignore_index=self.ignore_idx, label_smoothing=self.label_smoothing, ) ret = {"base_loss": ce_loss} if auxiliary is not None: batch_size, seq_length, vocab_size = auxiliary.shape auxiliary = auxiliary.reshape(batch_size * seq_length, vocab_size) auxiliary_loss = F.cross_entropy( input=auxiliary, target=target, ignore_index=self.ignore_idx, label_smoothing=self.label_smoothing, ) ret["auxiliary_loss"] = auxiliary_loss if self.use_z_loss: def get_zloss(x): # Adaption of Eq. (5) for z-loss computation in https://arxiv.org/pdf/2202.08906.pdf (non-router use-case). valid_tokens = (target != self.ignore_idx).type_as(x) # do not compute z_loss for ignored indices z_loss = (x * valid_tokens[:, None]).logsumexp(-1).pow(2).sum() z_loss *= self.z_loss_eps / valid_tokens.sum() return z_loss ret["z_loss_base"] = get_zloss(prediction) if auxiliary is not None: ret["z_loss_auxiliary"] = get_zloss(auxiliary) if self.kv_loss > 0: ignore_positions = target.view(batch_size, seq_length) == self.ignore_idx k_losses = get_cache_losses( base_past_keys, past_keys, ignore_positions=ignore_positions, ) total_k_loss = 0 for i, k_loss in enumerate(k_losses): ret[f"k_loss/{i}"] = k_loss total_k_loss += k_loss ret["k_loss/total"] = total_k_loss ret["k_loss/average"] = total_k_loss / len(k_losses) v_losses = get_cache_losses( base_past_values, past_values, ignore_positions=ignore_positions, ) total_v_loss = 0 for i, v_loss in enumerate(v_losses): ret[f"v_loss/{i}"] = v_loss total_v_loss += v_loss ret["v_loss/total"] = total_v_loss ret["v_loss/average"] = total_v_loss / len(v_losses) ret["total_loss"] = ( (ret["base_loss"] + ret.get("z_loss_base", 0)) * self.base_loss + (ret.get("auxiliary_loss", 0) + ret.get("z_loss_auxiliary", 0)) * self.auxiliary_loss + (ret.get("k_loss/total", 0) + ret.get("v_loss/total", 0)) * self.kv_loss ) return ret def extra_repr(self) -> str: loss_info_str = ( f"\n\t ignore_idx={self.ignore_idx}" f"\n\t label_smoothing={self.label_smoothing}" ) if self.use_z_loss: loss_info_str += ( f"\n\t use_z_loss={self.use_z_loss}" f"\n\t z_loss_eps={self.z_loss_eps}" ) if self.kv_loss: loss_info_str += f"\n\t kv_loss={self.kv_loss}" return loss_info_str def get_cache_losses( base_cache: List[Tensor], predicted_cache: List[Tensor], ignore_positions=None, ) -> List[Tensor]: """ Compute the loss between two caches. Args: base_cache: The cache from the base model, of shape [[batch_size, num_heads, seq_len, head_dim] * num_layers] predicted_cache: The predicted cache, of shape [[batch_size, num_heads, seq_len, head_dim] * num_layers] ignore_positions: A [batch_size, seq_len] tensor with positions to ignore. Returns: `list(torch.Tensor)` a list of losses. """ cache_losses = [] for layer in range(len(base_cache)): target = base_cache[layer] prediction = predicted_cache[layer] assert target.dim() == 4 assert prediction.dim() == 4 batch_size, num_heads, seq_len, dim = target.shape assert prediction.shape == target.shape if ignore_positions is not None: keep_positions = ( ignore_positions.logical_not() .view(batch_size, 1, seq_len, 1) .expand(-1, prediction.shape[1], -1, prediction.shape[3]) ) target = target[keep_positions] prediction = prediction[keep_positions] loss = F.l1_loss(prediction, target).abs() cache_losses.append(loss) return cache_losses ================================================ FILE: corenet/loss_fn/multi_modal_img_text/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/loss_fn/multi_modal_img_text/base_multi_modal_img_text_criteria.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria @LOSS_REGISTRY.register(name="__base__", type="multi_modal_image_text") class BaseMultiModalImageTextCriteria(BaseCriteria): """Base class for defining multi-modal image-text loss functions. Sub-classes must implement forward function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseMultiModalImageTextCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.multi-modal-image-text.name", type=str, default=None, help="Name of the loss function. Defaults to None.", ) return parser ================================================ FILE: corenet/loss_fn/multi_modal_img_text/contrastive_loss_clip.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, Tuple import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.multi_modal_img_text.base_multi_modal_img_text_criteria import ( BaseMultiModalImageTextCriteria, ) from corenet.utils import logger from corenet.utils.tensor_utils import gather_all_features @LOSS_REGISTRY.register(name="contrastive_loss_clip", type="multi_modal_image_text") class ContrastiveLossClip(BaseMultiModalImageTextCriteria): """Compute contrastive loss between image and text pairs. Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) # need to set these default to prevent tests for failing self.rank = getattr(opts, "ddp.rank", 0) self.use_distributed = getattr(opts, "ddp.use_distributed", False) self.device = getattr(opts, "dev.device", torch.device("cpu")) def _forward_clip( self, prediction: Dict[str, Tensor], *args, **kwargs ) -> Dict[str, Tensor]: """ Computes the contrast loss between image and text representations Args: prediction: A mapping of the form (string: Tensor). image and text are mandatory keys Shape: prediction["image"]: Shape is [N, d] prediction["text"]: Shape is [N, d] where N and d are batch size and feature dimensions, respectively. Returns: The output dictionary contains four keys (total_loss, image_loss, text_loss, logit_scale) and scalar loss value for each of these keys. total_loss is sum of image_loss and text_loss. """ if not {"image", "text"}.issubset(prediction.keys()): logger.error( f"image and text are mandatory keys for {self.__class__.__name__}." ) image_features = prediction.pop("image") text_features = prediction.pop("text") logit_scale = prediction.pop("logit_scale", 1.0) if image_features is None: logger.error(f"Image features can't be None in {self.__class__.__name__}") if text_features is None: logger.error(f"Text features can't be None in {self.__class__.__name__}") # Aggregate image and text features from all GPUs gathered_image_features, gathered_text_features = gather_features( image_features=image_features, text_features=text_features, use_distributed=self.use_distributed, ) # compute logits # [N, d] x [G x d]^T --> [N, G], where G is global batch size logits_per_image = logit_scale * ( image_features @ gathered_text_features.transpose(0, 1) ) # [N, d] x [G, d]^T --> [N, G] logits_per_text = logit_scale * ( text_features @ gathered_image_features.transpose(0, 1) ) # generate labels num_logits = logits_per_image.shape[0] contrastive_labels = torch.arange( num_logits, device=logits_per_image.device, dtype=torch.long ) # shift the labels by rank id contrastive_labels = contrastive_labels + (num_logits * self.rank) # compute cross entropy loss text_loss = F.cross_entropy(logits_per_text, contrastive_labels) * 0.5 image_loss = F.cross_entropy(logits_per_image, contrastive_labels) * 0.5 total_loss = image_loss + text_loss return { "total_loss": total_loss, "image_loss": image_loss, "text_loss": text_loss, "logit_scale": logit_scale, } def forward( self, input_sample: Any, prediction: Dict[str, Tensor], *args, **kwargs, ) -> Dict: """ Computes contrastive loss between image and text representations, optionally with neural aug Args: input_sample: Input to the model. prediction: A mapping of the form (string: Tensor). image and text are mandatory keys. Shape: input_sample: This loss function does not care about this argument. prediction["image"]: Shape is [N, d] prediction["text"]: Shape is [N, d] where N is the local batch size and d is the feature dimension. Returns: The output dictionary contains four keys (total_loss, image_loss, text_loss, logit_scale) and scalar loss value for each of these keys. total_loss is sum of image_loss and text_loss. """ if not self.training: # we typically compute zero-shot logits for monitoring the val perf. # Therefore, we return 0 for loss during validation. # Note: In future, we may compute validation loss (depending on use case) return { "total_loss": torch.tensor(0.0, dtype=torch.float, device=self.device) } clip_loss_dict = self._forward_clip(prediction=prediction) return clip_loss_dict def gather_features( image_features: Tensor, text_features: Tensor, use_distributed: bool ) -> Tuple[Tensor, Tensor]: """ Helper function that allows us to gather image and text features from all DDP ranks in a differentiable manner Args: image_features: Image features text_features: Text features use_distributed: DDP training or not Shapes: image_features: Shape is [N, d] text_features: Shape is [N, d] where N is the local batch size and d is the feature dimension. Returns: A tuple of gathered image and text features across all GPUs. In case of a DDP task, each feature tensor has a dimension of [G, d] where G=NW is the effective batch size and W is world size (or total number of GPUs). """ if use_distributed: # gather features from all ranks # [N, d] x W --> [G, d] where N and G=NW are the local and global batch sizes and W is the world size gathered_image_features = gather_all_features(features=image_features, dim=0) # [N d] x W --> [G, d] gathered_text_features = gather_all_features(features=text_features, dim=0) return gathered_image_features, gathered_text_features return image_features, text_features ================================================ FILE: corenet/loss_fn/neural_augmentation.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import math from typing import List, Mapping, Union import torch from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria from corenet.utils import logger from corenet.utils.ddp_utils import is_master # NeuralAugmentation can be used with any task. Therefore, we register both name and type # as the same. @LOSS_REGISTRY.register(name="neural_augmentation", type="neural_augmentation") class NeuralAugmentation(BaseCriteria): """Compute the augmentation loss, as described in the `RangeAugment `_ paper. Args: opts: command line arguments """ __supported_metrics = ["psnr"] def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) perceptual_metric = getattr(opts, "loss.neural_augmentation.perceptual_metric") is_master_node = is_master(opts) if perceptual_metric is None and is_master_node: logger.error( "Perceptual metric can't be none. " "Please specify perceptual metric using --loss.auxiliary.neural-augmentation.perceptual-metric argument" ) if not isinstance(perceptual_metric, str) and is_master_node: logger.error( "The type of perceptual metric is not string. Got: {}".format( type(perceptual_metric) ) ) perceptual_metric = perceptual_metric.lower() target_value = getattr(opts, "loss.neural_augmentation.target_value") self.curriculumn_learning = False self.iteration_based_training = getattr( opts, "scheduler.is_iteration_based", False ) self.target_str = f"{target_value}" alpha = getattr(opts, "loss.neural_augmentation.alpha") if perceptual_metric == "psnr": if target_value is None and is_master_node: logger.error("Target PSNR value can not be None.") if isinstance(target_value, (int, float)): if target_value < 0: if is_master_node: logger.error( "PSNR value should be >= 0 in {}. Got: {}".format( self.__class__.__name__, target_value ) ) # compute target MSE using below equation # # PSNR = 20 log10(255) - 10 log10(MSE) target_mse = 10.0 ** ((20.0 * math.log10(255.0) - target_value) / 10.0) self.target_value = torch.ones(size=(1,), dtype=torch.float).fill_( target_mse ) self.target_str = f"{target_value}" elif isinstance(target_value, (list, tuple)) and len(target_value) == 2: start_target_value = target_value[0] end_target_value = target_value[1] if start_target_value < 0 or end_target_value < 0: if is_master_node: logger.error( "PSNR value should be >= 0 in {}. Got: {}".format( self.__class__.__name__, target_value ) ) # compute target MSE using below equation # # PSNR = 20 log10(255) - 10 log10(MSE) start_target_mse = 10.0 ** ( (20.0 * math.log10(255.0) - start_target_value) / 10.0 ) end_target_mse = 10.0 ** ( (20.0 * math.log10(255.0) - end_target_value) / 10.0 ) max_steps = ( getattr(opts, "scheduler.max_iterations") if self.iteration_based_training else getattr(opts, "scheduler.max_epochs") ) if max_steps is None and is_master_node: logger.error( "Please specify {}. Got None.".format( "--scheduler.max-iterations" if self.iteration_based_training else "--scheduler.max-epochs" ) ) curriculum_method = getattr( opts, "loss.neural_augmentation.curriculum_method" ) if curriculum_method in CURRICULUM_METHOD.keys(): self.target_value = CURRICULUM_METHOD[curriculum_method]( start=start_target_mse, end=end_target_mse, period=max_steps ) else: raise NotImplementedError self.curriculumn_learning = True self.target_str = f"[{start_target_value}, {end_target_value}]" else: raise NotImplementedError # the maximum possible MSE error is computed as: # a = torch.ones((3, H, W)) * 255.0 # Max. input value is 255.0 # b = torch.zeros((3, H, W)) # min. input value is 0.0 # mse = torch.mean( (a -b) ** 2) # 65025 is the maximum mse self.alpha = alpha / 65025.0 else: if is_master_node: logger.error( "Supported perceptual metrics are: {}. Got: {}".format( self.__supported_metrics, perceptual_metric ) ) self.perceptual_metric = perceptual_metric self.device = getattr(opts, "dev.device", torch.device("cpu")) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.neural-augmentation.perceptual-metric", type=str, default="psnr", choices=cls.__supported_metrics, help=f"Name of the perceptual metric to be used in {cls.__name__}.", ) group.add_argument( "--loss.neural-augmentation.target-value", type=float, default=[40, 20], nargs="+", help=f"Target image similarity value in {cls.__name__}. Defaults to [40, 20]", ) group.add_argument( "--loss.neural-augmentation.curriculum-method", type=str, default="cosine", choices=["linear", "cosine"], help=f"Curriculum for varying the target image similarity value in {cls.__name__}." f"Supported curriculums are {cls.__supported_metrics}. Defaults to cosine", ) group.add_argument( "--loss.neural-augmentation.alpha", default=100.0, type=float, help="Scale loss value by alpha value. Defaults to 100. " "Note: When perceptual metric is PSNR, alpha value is divided by 65025", ) return parser def _forward_psnr( self, input_tensor: Tensor, augmented_tensor: Tensor, *args, **kwargs ) -> Tensor: """Compute the MSE error between input and augmented image, and minimizes the distance between MSE error and target error. Args: input_tensor: Input image of shape [N, C, H, W] augmented_tensor: Augmented image of shape [N, C, H, W] Returns: A scalar loss value """ squared_err = ((augmented_tensor - input_tensor) * 255.0) ** 2 # [B, C, H, W] --> [B] pred_mse = torch.mean(squared_err, dim=[1, 2, 3]) if self.curriculumn_learning: step = ( kwargs.get("iterations", 0) if self.iteration_based_training else kwargs.get("epoch", 0) ) if step >= len(self.target_value): step = -1 target_mse = self.target_value[step] else: target_mse = self.target_value # compute L1 loss between target and current MSE smooth_l1_loss = F.smooth_l1_loss( input=pred_mse, target=target_mse.expand_as(pred_mse).to( device=pred_mse.device, dtype=pred_mse.dtype ), reduction="mean", ) loss_na = smooth_l1_loss * self.alpha return loss_na def _compute_loss( self, input_tensor: Tensor, augmented_tensor: Tensor, *args, **kwargs ) -> Tensor: """Compute the neural augmentation loss. Args: input_tensor: Input image of shape [N, C, H, W] augmented_tensor: Augmented image of shape [N, C, H, W] Returns: A scalar value """ if augmented_tensor is None: logger.error( f"Augmented tensor can't be None in {self.__class__.__name__} during training mode." ) forward_loss_fn = getattr(self, f"_forward_{self.perceptual_metric}") loss_na = forward_loss_fn( input_tensor=input_tensor, augmented_tensor=augmented_tensor, *args, **kwargs, ) return loss_na def forward( self, input_sample: Union[Tensor, Mapping[str, Union[Tensor, List[Tensor]]]], prediction: Mapping[str, Tensor], *args, **kwargs, ) -> Tensor: """Compute the loss between input and augmented image, as described in `RangeAugment `_ paper. Args: input_sample: Input sample can either be a Tensor or a dictionary with mandatory key "image". In case of a dictionary, the values can be a Tensor or list of Tensors. prediction: Output of augmentation model. Mapping of (string: Tensor) with `augmented_tensor` as the required key. Shapes: input_sample: * Tensor: The shape of input tensor is [N, C, H, W] * Mapping[str, Tensor]: The shape of tensor is [N, C, H, W] * Mapping[str, List[Tensor]]: The length of List is N, and the shape of each tensor is [1, C, H, W] prediction: The shape of prediction["augmented_tensor"] is [N, C, H, W] Returns: A scalar loss value ...note: During validation or evaluation, neural augmentation loss is not computed and 0 is returned """ if not self.training: return torch.tensor(0.0, device=self.device, dtype=torch.float) if not isinstance(prediction, Mapping): logger.error( "Prediction needs to be an instance of Mapping and must contain augmented_tensor" " as keys" ) if isinstance(input_sample, Mapping): input_sample = input_sample["image"] if isinstance(input_sample, List): # if its a list of images, stack them input_sample = torch.stack(input_sample, dim=0) augmented_tensor = prediction["augmented_tensor"] loss_na = self._compute_loss( input_tensor=input_sample, augmented_tensor=augmented_tensor, *args, **kwargs, ) return loss_na def extra_repr(self) -> str: return ( "\n\t target_metric={}" "\n\t target_value={}" "\n\t curriculum_learning={}" "\n\t alpha={}".format( self.perceptual_metric, self.target_str, self.curriculumn_learning, self.alpha, ) ) def linear_curriculum(start: int, end: int, period: int) -> Tensor: """This function implements linear curriculum Args: start: the starting value for the set of points end: the ending value for the set of points period: size of the constructed tensor Returns: A float tensor of length period """ return torch.linspace(start=start, end=end, steps=period + 1, dtype=torch.float) def cosine_curriculum(start: int, end: int, period: int) -> Tensor: """This function implements cosine curriculum Args: start: the starting value for the set of points end: the ending value for the set of points period: size of the constructed tensor Returns: A float tensor of length period """ curr = [ end + 0.5 * (start - end) * (1 + math.cos(math.pi * i / (period + 1))) for i in range(period + 1) ] curr = torch.tensor(curr, dtype=torch.float) return curr CURRICULUM_METHOD = { "linear": linear_curriculum, "cosine": cosine_curriculum, } ================================================ FILE: corenet/loss_fn/segmentation/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/loss_fn/segmentation/base_segmentation_criteria.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from corenet.loss_fn import LOSS_REGISTRY, BaseCriteria @LOSS_REGISTRY.register(name="__base__", type="segmentation") class BaseSegmentationCriteria(BaseCriteria): """Base class for defining segmentation loss functions. Sub-classes must implement forward function. Args: opts: command line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseSegmentationCriteria: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.segmentation.name", type=str, default=None, help="Name of the loss function. Defaults to None.", ) return parser ================================================ FILE: corenet/loss_fn/segmentation/cross_entropy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Mapping, Optional, Tuple, Union from torch import Tensor from torch.nn import functional as F from corenet.loss_fn import LOSS_REGISTRY from corenet.loss_fn.segmentation.base_segmentation_criteria import ( BaseSegmentationCriteria, ) from corenet.loss_fn.utils.class_weighting import compute_class_weights from corenet.utils import logger @LOSS_REGISTRY.register(name="cross_entropy", type="segmentation") class SegCrossEntropy(BaseSegmentationCriteria): """Cross entropy loss for the task of semantic segmentation. Args: opts: command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.ignore_idx = getattr(opts, "loss.segmentation.cross_entropy.ignore_index") self.use_class_wts = getattr( opts, "loss.segmentation.cross_entropy.class_weights" ) self.aux_wt = getattr(opts, "loss.segmentation.cross_entropy.aux_weight") self.label_smoothing = getattr( opts, "loss.segmentation.cross_entropy.label_smoothing" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != SegCrossEntropy: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--loss.segmentation.cross-entropy.class-weights", action="store_true", default=False, help=f"Use class weights in {cls.__name__}. Defaults to False.", ) group.add_argument( "--loss.segmentation.cross-entropy.ignore-index", type=int, default=-1, help=f"Target value that is ignored and does not contribute to " f"the input gradient in {cls.__name__}. Defaults to -1.", ) group.add_argument( "--loss.segmentation.cross-entropy.aux-weight", type=float, # This is a typical value used in segmentation networks for auxiliary loss. # See PSPNet paper for instance: https://arxiv.org/abs/1612.01105 default=0.4, help="Weight of auxiliary segmentation loss. Defaults to 0.4.", ) group.add_argument( "--loss.segmentation.cross-entropy.label-smoothing", type=float, default=0.0, help=f"Specifies the amount of smoothing when computing the loss in {cls.__name__}, " f"where 0.0 means no smoothing. Defaults to 0.0.", ) return parser def _compute_loss( self, pred_mask: Tensor, target_mask: Tensor, weight: Optional[Tensor] = None ) -> Tensor: """Computes the cross-entropy loss Args: pred_mask: Predicted segmentation mask target_mask: Target segmentation mask whose values are in the range `[0, C)`, where :math:`C` is the number of classes weight: class weights for handling class imbalancing. Shapes: pred_mask: Shape is [Batch size, Channels, Height, Width] target_mask: Shape is [Batch size, Height, Width] weight: Shape is [C] Returns: A scalar loss value """ b, c, x_h, x_w = pred_mask.shape b, y_h, y_w = target_mask.shape # use label smoothing during training label_smoothing = self.label_smoothing if self.training else 0.0 if x_h != y_h or x_w != y_w: # if predicting mask shape is not the same as target mask, resize it using # bilinear interpolation. pred_mask = F.interpolate( pred_mask, size=(y_h, y_w), mode="bilinear", align_corners=True ) loss = F.cross_entropy( input=pred_mask, target=target_mask, weight=weight, ignore_index=self.ignore_idx, label_smoothing=label_smoothing, ) return loss def _forward_seg( self, prediction: Union[Tensor, Tuple[Tensor, Tensor]], target: Tensor, *args, **kwargs, ) -> Mapping[str, Tensor]: """Computes the segmentation loss. If prediction is a Tuple[Tensor, Tensor], then weighted sum of CE losses is computed. Args: prediction: Output of segmentation model. If auxiliary branch is enabled, then prediction is a Tuple[Tensor, Tensor]. Otherwise, it is a Tensor. target: Ground truth segmentation mask. Shapes: prediction: * When prediction is a Tensor, then shape is [Batch size, Channels, Height, Width] * When prediction is a Tuple[Tensor, Tensor], then shape of one tensor is [Batch size, Channels, Height, Width] while the other is [Batch size, Channels, Height / O, Width/ O] where O is output stride of feature map (typically 4). target: Shape is [Batch size, Height, Width] Returns: Mapping of the form (string: scalar value) is returned with total_loss as mandatory and (seg_loss, aux_loss) as optional keys. total_loss is weighted sum of seg_loss and aux_loss (when applicable). ...note: When shape of prediction and target are not the same, prediction is resized using bilinear interpolation to match the size of target. """ aux_out = None if isinstance(prediction, Tuple) and len(prediction) == 2: mask, aux_out = prediction assert isinstance(mask, Tensor) assert isinstance(aux_out, Tensor) elif isinstance(prediction, Tensor): mask = prediction assert isinstance(mask, Tensor) else: raise NotImplementedError( "For computing loss for segmentation task, we need prediction to be an instance of Tuple or Tensor" ) cls_wts = None if self.training: if self.use_class_wts: n_classes = mask.size(1) # Mask is of shape B x C x H x W cls_wts = compute_class_weights(target=target, n_classes=n_classes) seg_loss = self._compute_loss( pred_mask=mask, target_mask=target, weight=cls_wts ) if aux_out is not None: loss_aux = self._compute_loss( pred_mask=aux_out, target_mask=target, weight=cls_wts ) total_loss = seg_loss + (self.aux_wt * loss_aux) return { "total_loss": total_loss, "seg_loss": seg_loss, "aux_loss": (self.aux_wt * loss_aux), } return {"total_loss": seg_loss} else: # during validation, we do not compute aux. loss seg_loss = self._compute_loss( pred_mask=mask, target_mask=target, weight=None ) return {"total_loss": seg_loss} def forward( self, input_sample: Any, prediction: Union[ Mapping[str, Union[Tensor, Tuple[Tensor, Tensor]]], Tensor, Tuple[Tensor, Tensor], ], target: Tensor, *args, **kwargs, ) -> Mapping[str, Tensor]: """Compute CE segmentation loss Args: input_sample: Input image tensor to model. prediction: Output of model. It can be a * Tensor * Tuple[Tensor, Tensor] * Mapping[segmentation_output, Tensor] * Mapping[segmentation_output, Tuple[Tensor, Tensor]], where segmentation_output is a required key. target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes Shapes: input_sample: This loss function does not care about this argument. prediction: * When prediction is a Tensor, then shape is [Batch size, C, Height, Width] * When prediction is a Tuple[Tensor, Tensor], then shape of one tensor is [Batch size, C, Height, Width] while the other is [Batch size, C, Height / O, Width/ O] where O is the output stride of feature map (typically 4). * When prediction is a dictionary, then the shape of prediction["segmentation_output"] should be the same as described in above steps (depending on type). target: The shape of target tensor is [Batch size, Height, Width] Returns: Mapping of the form (string: scalar value) is returned with total_loss as mandatory and (seg_loss, aux_loss) as optional keys. total_loss is weighted sum of seg_loss and aux_loss (when applicable). """ if isinstance(prediction, (Tuple, Tensor)): return self._forward_seg( prediction=prediction, target=target, *args, **kwargs ) elif isinstance(prediction, Mapping): if "segmentation_output" not in prediction: logger.error( f"segmentation_output is a mandatory key in prediction when" f"type of prediction is Dict. Got: {prediction.keys()}" ) seg_loss = self._forward_seg( prediction=prediction["segmentation_output"], target=target, *args, **kwargs, ) return seg_loss else: logger.error( f"Prediction should be either a Tensor or Tuple[Tensor, Tensor] " f"or Dictionary[str, Tensor] in {self.__class__.__name__}. Got: {type(prediction)}" ) def extra_repr(self) -> str: return ( f"\n\t ignore_idx={self.ignore_idx}" f"\n\t class_weighting={self.use_class_wts}" f"\n\t label_smoothing={self.label_smoothing}" f"\n\t aux_weight={self.aux_wt}" ) ================================================ FILE: corenet/loss_fn/utils/__init__.py ================================================ ================================================ FILE: corenet/loss_fn/utils/build_helper.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from torch import nn from corenet.constants import is_test_env from corenet.modeling.models import get_model from corenet.options.utils import extract_opts_with_prefix_replacement from corenet.utils import logger def build_cls_teacher_from_opts(opts: argparse.Namespace) -> nn.Module: """Helper function to build a classification teacher model from command-line arguments Args: opts: command-line arguments Returns: A teacher model """ pretrained_model = getattr(opts, "teacher.model.classification.pretrained") pytest_env = is_test_env() if not pytest_env and pretrained_model is None: logger.error( "For distillation, please specify teacher weights using teacher.model.classification.pretrained" ) teacher_opts = extract_opts_with_prefix_replacement( opts, "teacher.model.", "model." ) # build teacher model return get_model(teacher_opts, category="classification") ================================================ FILE: corenet/loss_fn/utils/class_weighting.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from torch import Tensor def compute_class_weights( target: Tensor, n_classes: int, norm_val: float = 1.1 ) -> Tensor: """Implementation of a class-weighting scheme, as defined in Section 5.2 of `ENet `_ paper. Args: target: Tensor of shape [Batch_size, *] containing values in the range `[0, C)`. n_classes: Integer specifying the number of classes :math:`C` norm_val: Normalization value. Defaults to 1.1. This value is decided based on the `ESPNetv2 paper `_. Link: https://github.com/sacmehta/ESPNetv2/blob/b78e323039908f31347d8ca17f49d5502ef1a594/segmentation/loadData.py#L16 Returns: A :math:`C`-dimensional tensor containing class weights """ class_hist = torch.histc(target.float(), bins=n_classes, min=0, max=n_classes - 1) mask_indices = class_hist == 0 # normalize between 0 and 1 by dividing by the sum norm_hist = torch.div(class_hist, class_hist.sum()) norm_hist = torch.add(norm_hist, norm_val) # compute class weights. # samples with more frequency will have less weight and vice-versa class_wts = torch.div(torch.ones_like(class_hist), torch.log(norm_hist)) # mask the classes which do not have samples in the current batch class_wts[mask_indices] = 0.0 return class_wts.to(device=target.device) ================================================ FILE: corenet/metrics/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.utils.registry import Registry METRICS_REGISTRY = Registry( "metrics", lazy_load_dirs=["corenet/metrics"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_stats(parser: argparse.ArgumentParser): group = parser.add_argument_group(title="Statistics", description="Statistics") group.add_argument( "--stats.val", type=str, default=["loss"], nargs="+", help="Name of statistics" ) group.add_argument( "--stats.train", type=str, default=["loss"], nargs="+", help="Name of statistics", ) group.add_argument( "--stats.checkpoint-metric", type=str, default="loss", help="Metric to use for saving checkpoints", ) group.add_argument( "--stats.checkpoint-metric-max", action="store_true", default=False, help="Maximize checkpoint metric", ) group.add_argument( "--stats.coco-map.iou-types", type=str, default=["bbox"], nargs="+", choices=("bbox", "segm"), help="Types of IOU to compute for MSCoco.", ) return parser ================================================ FILE: corenet/metrics/average_precision.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import traceback from numbers import Number from typing import Dict, Union import numpy as np from sklearn.metrics import average_precision_score from torch import Tensor from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import EpochMetric from corenet.utils import logger @METRICS_REGISTRY.register("average_precision") class AveragePrecisionMetric(EpochMetric): def compute_with_aggregates( self, y_pred: Tensor, y_true: Tensor ) -> Union[Number, Dict[str, Number]]: y_pred, y_true = self.get_aggregates() y_pred = F.softmax(y_pred, dim=-1).numpy().astype(np.float32) y_true = y_true.numpy().astype(np.float32) # Clip predictions to reduce chance of getting INF y_pred = y_pred.clip(0, 1) if y_pred.ndim == 1 or y_pred.ndim == 2 and y_pred.shape[1] == 1: pass # TODO? elif y_pred.ndim == 2 and y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: logger.warning( "Expected only two classes, got prediction Tensor of shape {}".format( y_pred.shape ) ) try: ap = 100 * average_precision_score(y_true, y_pred, average=None) except ValueError as e: logger.warning("Could not compute Average Precision: {}".format(str(e))) traceback.print_exc() ap = 0 # we don't want the job to fail over a metric computation issue return ap ================================================ FILE: corenet/metrics/coco_map.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import io import os from contextlib import redirect_stdout from typing import Any, Dict, List, Optional, Union import numpy as np import torch from pycocotools import mask as maskUtils from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval from torch import Tensor from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import BaseMetric from corenet.modeling.models.detection import DetectionPredTuple from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.tensor_utils import all_gather_list @METRICS_REGISTRY.register(name="coco_map") class COCOEvaluator(BaseMetric): def __init__( self, opts, split: Optional[str] = "val", year: Optional[int] = 2017, is_distributed: Optional[bool] = False, ): # disable printing on console, so that pycocotools print statements are not printed on console logger.disable_printing() bkrnd_id = ( 0 if getattr(opts, "dataset.detection.no_background_id", False) else 1 ) iou_types = getattr(opts, "stats.coco_map.iou_types", ["bbox"]) root = getattr(opts, "dataset.root_val", None) ann_file = os.path.join( root, "annotations/instances_{}{}.json".format(split, year) ) coco_gt = COCO(ann_file) coco_categories = sorted(coco_gt.getCatIds()) self.coco_id_to_contiguous_id = { coco_id: i + bkrnd_id for i, coco_id in enumerate(coco_categories) } self.contiguous_id_to_coco_id = { v: k for k, v in self.coco_id_to_contiguous_id.items() } self.coco_gt = coco_gt self.iou_types = iou_types self.is_distributed = is_distributed self.is_master_node = is_master(opts) self.coco_results = None self.reset() # enable printing, to enable corenet log printing logger.enable_printing() def reset(self) -> None: self.coco_results = {iou_type: [] for iou_type in self.iou_types} def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any] = {}, batch_size: Optional[int] = 1, ): if not ( isinstance(prediction, Dict) and ({"detections"} <= set(list(prediction.keys()))) ): logger.error( "For coco evaluation during training, the output from the model should be a dictionary " "and should contain the results in a key called detections" ) detections = prediction["detections"] if isinstance(target, list): image_ids = torch.tensor([t["image_id"] for t in target], dtype=torch.int64) image_widths = torch.tensor( [t["image_width"] for t in target], dtype=torch.int64 ) image_heights = torch.tensor( [t["image_height"] for t in target], dtype=torch.int64 ) else: image_ids = target["image_id"] image_widths = target["image_width"] image_heights = target["image_height"] if isinstance(detections, DetectionPredTuple): detections = [detections] if not ( isinstance(detections, List) and isinstance(detections[0], DetectionPredTuple) ): logger.error( "For coco evaluation during training, the results should be stored as a List of DetectionPredTuple" ) self.prepare_cache_results( detection_results=detections, image_ids=image_ids, image_widths=image_widths, image_heights=image_heights, ) def prepare_cache_results( self, detection_results: List[DetectionPredTuple], image_ids, image_widths, image_heights, ) -> None: batch_results = {k: [] for k in self.coco_results.keys()} for detection_result, img_id, img_w, img_h in zip( detection_results, image_ids, image_widths, image_heights ): label = detection_result.labels if label.numel() == 0: # no detections continue box = detection_result.boxes score = detection_result.scores img_id, img_w, img_h = img_id.item(), img_w.item(), img_h.item() box[..., 0::2] = torch.clip(box[..., 0::2] * img_w, min=0, max=img_w) box[..., 1::2] = torch.clip(box[..., 1::2] * img_h, min=0, max=img_h) # convert box from xyxy to xywh format box[..., 2] = box[..., 2] - box[..., 0] box[..., 3] = box[..., 3] - box[..., 1] box = box.cpu().numpy() label = label.cpu().numpy() score = score.cpu().numpy() if "bbox" in batch_results: batch_results["bbox"].extend( [ { "image_id": img_id, "category_id": self.contiguous_id_to_coco_id[ label[bbox_id] ], "bbox": box[bbox_id].tolist(), "score": score[bbox_id], } for bbox_id in range(box.shape[0]) if label[bbox_id] > 0 ] ) masks = detection_result.masks if masks is not None and "segm" in batch_results: # masks are [N, H, W]. For interpolation, convert them to [1, N, H, W] and then back to [N, H, W] masks = F.interpolate( masks.unsqueeze(0), size=(img_h, img_w), mode="bilinear", align_corners=True, ).squeeze(0) masks = masks > 0.5 masks = masks.cpu().numpy() # predicted masks are in [N, H, W] format rles = [ maskUtils.encode( np.array(mask[:, :, np.newaxis], dtype=np.uint8, order="F") )[0] for mask in masks ] for rle in rles: rle["counts"] = rle["counts"].decode("utf-8") batch_results["segm"].extend( [ { "image_id": img_id, "category_id": self.contiguous_id_to_coco_id[label[seg_id]], "segmentation": rle, "score": score[seg_id], } for seg_id, rle in enumerate(rles) if label[seg_id] > 0 ] ) for k in batch_results.keys(): new_results: List[Dict] = batch_results[k] if self.is_distributed: # Gather results from all processes gathered_results: List[List[Dict]] = all_gather_list(new_results) # Flatten results as the output of all_gather will be a list of list here new_results = [x for results in gathered_results for x in results] self.coco_results[k].extend(new_results) def summarize_coco_results(self) -> Dict: stats_map = dict() for iou_type, coco_results in self.coco_results.items(): if len(coco_results) < 1: # during initial epochs, we may not have any sample results, so we can skip this part map_val = 0.0 else: try: logger.disable_printing() with redirect_stdout(io.StringIO()): coco_dt = COCO.loadRes(self.coco_gt, coco_results) coco_eval = COCOeval( cocoGt=self.coco_gt, cocoDt=coco_dt, iouType=iou_type ) coco_eval.evaluate() coco_eval.accumulate() if self.is_master_node: logger.enable_printing() logger.log("Results for IoU Metric: {}".format(iou_type)) coco_eval.summarize() map_val = coco_eval.stats[0].item() except Exception as e: map_val = 0.0 stats_map[iou_type] = map_val * 100 logger.enable_printing() return stats_map def compute(self) -> Dict[str, float]: return self.summarize_coco_results() ================================================ FILE: corenet/metrics/confusion_mat.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from numbers import Number from typing import Any, Dict, List, Optional, Union import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import BaseMetric from corenet.utils.tensor_utils import reduce_tensor_sum # TODO: tests @METRICS_REGISTRY.register("confusion_matrix") class ConfusionMatrix(BaseMetric): """ Computes the confusion matrix and is based on `FCN `_ """ def reset(self): self.confusion_mat = None self.prediction_key = "logits" def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any] = {}, batch_size: Optional[int] = 1, ): if isinstance(prediction, dict) and self.prediction_key in prediction: prediction = prediction[self.prediction_key] if isinstance(prediction, dict) or isinstance(prediction, dict): raise NotImplementedError( "ConfusionMatrix does not currently support Dict predictions or targets" ) n_classes = prediction.shape[1] if self.confusion_mat is None: self.confusion_mat = torch.zeros( (n_classes, n_classes), dtype=torch.int64, device=target.device ) with torch.no_grad(): prediction = prediction.argmax(1).flatten() target = target.flatten() k = (target >= 0) & (target < n_classes) inds = n_classes * target[k].to(torch.int64) + prediction[k] cnts = torch.bincount(inds, minlength=n_classes**2).reshape( n_classes, n_classes ) if self.is_distributed: cnts = reduce_tensor_sum(cnts) self.confusion_mat += cnts def compute(self) -> Union[Number, Dict[str, Union[Number, List[Number]]]]: if self.confusion_mat is None: print("Confusion matrix is None. Check code") return None h = self.confusion_mat.float() metrics: Dict[str, Tensor] = {} metrics["accuracy_global"] = torch.diag(h).sum() / h.sum() diag_h = torch.diag(h) metrics["class_accuracy"] = diag_h / h.sum(1) metrics["mean_class_accuracy"] = metrics["class_accuracy"].mean() metrics["iou"] = diag_h / (h.sum(1) + h.sum(0) - diag_h) metrics["mean_iou"] = metrics["iou"].mean() metrics["confusion"] = self.confusion_mat # Making sure all values are converted to Python values metrics = {k: v.detach().cpu().tolist() for k, v in metrics.items()} return metrics ================================================ FILE: corenet/metrics/image_text_retrieval.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from numbers import Number from typing import Any, Dict, Tuple, Union import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import BaseMetric from corenet.metrics.retrieval_cmc import DISTANCE_REGISTRY from corenet.utils import logger from corenet.utils.tensor_utils import all_gather_list @METRICS_REGISTRY.register("image_text_retrieval") class ImageTextRetrievalMetric(BaseMetric): """ Computes the image-text retrieval metrics for a list of images and their captions using the distance between their embeddings. Expects predictions to contain two keys: image (Tensor): [batch, hidden_dim] text (Tensor): [batch * num_captions, hidden_dim] Computes the following metrics: image2text recall@1, recall@5, recall@10, mean_rank, median_rank text2image recall@1, recall@5, recall@10, mean_rank, median_rank NOTE: each image MUST have the same number of captions. """ def __init__( self, image: str = "image", text: str = "text", opts: Dict[str, Any] = None, is_distributed: bool = False, ) -> None: # Ignoring pred_key and target_key as we won't be using them # The issue is, both text and image are in the prediction, so pred_key and # target_key don't make sense here. We can still use pred_key to support nested # dicts, but it didn't seem required. super().__init__(opts, is_distributed) self._image_key = image self._text_key = text distance_metric = getattr( opts, "stats.metrics.img_text_retrieval.distance_metric" ) self.measure = DISTANCE_REGISTRY[distance_metric] @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add metric specific arguments""" if cls == ImageTextRetrievalMetric: parser.add_argument( "--stats.metrics.img-text-retrieval.distance-metric", type=str, default="cosine", choices=list(DISTANCE_REGISTRY.keys()), help="Distance to use for nearest-neighbor calculation.", ) return parser def reset(self) -> None: self._images = [] self._texts = [] def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], batch_size: int = 1, ) -> None: images = prediction[self._image_key] texts = prediction[self._text_key] if not isinstance(images, Tensor) or not isinstance(texts, Tensor): logger.error( "ImageTextRetrievalMetric only works on Tensor, got {} and {}.".format( type(images), type(texts) ) ) return if self.is_distributed: images = all_gather_list(images) texts = all_gather_list(texts) else: images = [images.detach()] texts = [texts.detach()] self._images.extend(images) self._texts.extend(texts) def get_aggregates(self) -> Tuple[Tensor, Tensor]: self._images = [torch.cat(self._images, dim=0)] self._texts = [torch.cat(self._texts, dim=0)] return self._images[0], self._texts[0] def _text2image( self, images: Tensor, texts: Tensor, num_captions: int ) -> torch.LongTensor: """ Compute the distance between embeddings for text captions and their respective images. Args: image: A tensor of image embeddings. Shape: [batch, hidden_dim] text: A tensor of text embeddings. Shape: [batch * num_captions, hidden_dim] num_captions: The number of captions paired with a single image. Returns: A tensor containing ranks of the corresponding image among all images. """ ranks = torch.zeros(images.shape[0], dtype=torch.long) for i, image in enumerate(images): # [1, hidden_dim] dist [batch * num_captions, hidden_dim] --> [batch * num_captions] # i.e. dists of size: [num_texts] dists = self.measure(image.unsqueeze(0), texts).squeeze(0) # find the rank of the best scoring caption among num_captions inds = torch.argsort(dists) // num_captions ranks[i] = (inds == i).nonzero()[0, 0] return ranks def _image2text( self, images: Tensor, texts: Tensor, num_captions: int ) -> torch.LongTensor: """ Compute the distance between embeddings for images and their respective captions. Args: image: A tensor of image embeddings. Shape: [batch, hidden_dim] text: A tensor of text embeddings. Shape: [batch * num_captions, hidden_dim] num_captions: The number of captions paired with a single image. Returns: A tensor containing ranks of the closest caption to each image among all captions. """ ranks = torch.zeros(texts.shape[0], dtype=torch.long) for i, text in enumerate(texts): # [1, hidden_dim] cos [batch, hidden_dim] --> [batch] # i.e. dists of size: [num_images] dists = self.measure(text.unsqueeze(0), images).squeeze(0) # find the rank of the corresponding image inds = torch.argsort(dists) ranks[i] = (inds == (i // num_captions)).nonzero()[0, 0] return ranks def compute(self) -> Union[Number, Dict[str, Number]]: # image: [batch, hidden_dim] # text: [batch, num_captions, hidden_dim] or [batch * num_captions, hidden_dim] images, texts = self.get_aggregates() # make sure text shape is: [batch * num_captions, hidden_dim] if texts.dim() == 3: # [batch, num_captions, hidden_dim] --> [batch * num_captions, hidden_dim] texts = texts.reshape(-1, texts.shape[-1]) num_images = images.shape[0] num_texts = texts.shape[0] assert num_texts % num_images == 0, "Number of captions is not consistent" num_captions = num_texts // num_images with torch.no_grad(): i2t_ranks = self._image2text(images, texts, num_captions) t2i_ranks = self._text2image(images, texts, num_captions) return { "text2image": self._rank_metrics(t2i_ranks), "image2text": self._rank_metrics(i2t_ranks), } def _rank_metrics(self, ranks: torch.LongTensor) -> Dict[str, Number]: return { "recall@1": 100 * (ranks < 1).float().mean().item(), "recall@5": 100 * (ranks < 5).float().mean().item(), "recall@10": 100 * (ranks < 10).float().mean().item(), "mean_rank": 1 + ranks.float().mean().item(), "median_rank": 1 + ranks.median().item(), } ================================================ FILE: corenet/metrics/intersection_over_union.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from numbers import Number from typing import Any, Dict, Optional, Tuple, Union import numpy as np import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import AverageMetric from corenet.utils import logger def compute_miou_batch( prediction: Union[Tuple[Tensor, Tensor], Tensor], target: Tensor, epsilon: Optional[float] = 1e-7, ): if isinstance(prediction, Tuple) and len(prediction) == 2: mask = prediction[0] assert isinstance(mask, Tensor) elif isinstance(prediction, Tensor): mask = prediction assert isinstance(mask, Tensor) else: raise NotImplementedError( "For computing loss for segmentation task, we need prediction to be an instance of Tuple or Tensor" ) num_classes = mask.shape[1] pred_mask = torch.max(mask, dim=1)[1] assert ( pred_mask.dim() == 3 ), "Predicted mask tensor should be 3-dimensional (B x H x W)" pred_mask = pred_mask.byte() target = target.byte() # shift by 1 so that 255 is 0 pred_mask += 1 target += 1 pred_mask = pred_mask * (target > 0) inter = pred_mask * (pred_mask == target) area_inter = torch.histc(inter.float(), bins=num_classes, min=1, max=num_classes) area_pred = torch.histc(pred_mask.float(), bins=num_classes, min=1, max=num_classes) area_mask = torch.histc(target.float(), bins=num_classes, min=1, max=num_classes) area_union = area_pred + area_mask - area_inter + epsilon return area_inter, area_union @METRICS_REGISTRY.register(name="iou") class IOUMetric(AverageMetric): def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: """ This function gathers intersection and union metrics from different processes and converts to float. """ if isinstance(prediction, Tensor) and isinstance(target, Tensor): inter, union = compute_miou_batch(prediction=prediction, target=target) return {"inter": inter, "union": union} # elif isinstance(prediction, Dict): # logger.error("IOU metrics are not supported for a dictionary of predictions") # We will revisit it later, as per the use case. # inter_dict = {} # union_dict = {} # for k, v in prediction.items(): # inter, union = compute_miou_batch(prediction=v, target=target) # inter = tensor_to_python_float(inter, is_distributed=is_distributed) # union = tensor_to_python_float(union, is_distributed=is_distributed) # inter_dict[k] = inter # union_dict[k] = union # return inter_dict, union_dict else: logger.error("Metric monitor supports Tensor only for IoU") def compute(self) -> Union[Number, Dict[str, Number]]: averaged = super().compute() iou = averaged["inter"] / averaged["union"] if isinstance(iou, Tensor): iou = iou.cpu().numpy() # Converting iou from [0, 1] to [0, 100] # other metrics are by default in [0, 100 range] avg_iou = np.mean(iou) * 100.0 return avg_iou ================================================ FILE: corenet/metrics/metric_base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import abc import argparse from numbers import Number from typing import Any, Dict, List, Optional, Tuple, Union import numpy as np import torch from torch import Tensor from corenet.utils import logger from corenet.utils.object_utils import flatten_to_dict from corenet.utils.tensor_utils import ( all_gather_list, reduce_tensor_sum, tensor_to_python_float, ) class BaseMetric(abc.ABC): def __init__( self, opts: Optional[argparse.Namespace] = None, is_distributed: bool = False, pred: str = None, target: str = None, ): self.opts = opts # We need the default value of device for tests. self.device = getattr(opts, "dev.device", "cpu") self.is_distributed = is_distributed self.pred_key = pred self.target_key = target self.reset() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add metric specific arguments""" return parser @abc.abstractmethod def reset(self) -> None: """ Resets all aggregated data. Called at the start of every epoch. """ raise NotImplementedError @abc.abstractmethod def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], batch_size: Optional[int] = 1, ) -> None: """ Processes a new batch of predictions and targets for computing the metric. Args: predictions: model outputs for the current batch target: labels for the current batch extras: dict containing extra information. During training this includes "loss" and "grad_norm" keys. During validaiton only includes "loss". batch_size: optionally used to correctly compute the averages when the batch size varies across batches. """ raise NotImplementedError @abc.abstractmethod def compute( self, ) -> Union[Number, List, Dict[str, Any]]: """ Computes the metrics with the existing data. It gets called at every log iteration as well as the end of each epoch, e.g. train, val, valEMA. Logging happens at iteration 1 and every `common.log_freq` thereafter. Note: for computationally heavy metrics, you may want to increase `common.log_freq`. Returns: Depending on the metric, can return a scalar metric or a dictionary of metrics. Lists (or dicts of lists) are also generally accepted but not encouraged. """ raise NotImplementedError def preprocess_predictions( self, prediction: Union[Tensor, Dict] ) -> Union[Tensor, Dict]: if isinstance(prediction, dict) and self.pred_key in prediction: prediction = prediction[self.pred_key] return prediction def preprocess_targets(self, target: Union[Tensor, Dict]) -> Union[Tensor, Dict]: if isinstance(target, dict) and self.target_key in target: target = target[self.target_key] return target def summary_string(self, name: str, sep: str, values: Dict[str, Any]) -> str: """ Get a string representation of the given metric values, suitable for printing to the terminal. Note that we might not print everything inside @values, e.g. if it would create too large of an output that would make logs too verbose. Args: name: The name of the metric. sep: The separator used in the printout. values: The metric values, as output by @self.compute. Returns: A string representation of the metric. """ return f"{name:<}{sep}{values}" def is_epoch_summary_enabled_for_metric( self, metric_name: str, log_writer: Any ) -> bool: """ Determines whether to log a metric with the given @metric_name when the given @log_writer is invoked. This is mainly used to prevent logs from becoming too large. For example, we might not want to display every value in a PR curve, even though we want to calculate and store the curve. Args: metric_name: The name of the metric. log_writer: An object that can be used as a log writer (for example, a TensorBoardLogger). Returns: True if the name of the metric should be logged. False otherwise. """ return True def flatten_metric( self, values: Union[Number, List, Dict[str, Any]], metric_name: str ) -> Dict[str, Union[Number, List, Dict[str, Any]]]: """ Flatten the given metric @values, prepending @metric_name to the resulting dictionary's keys. Args: values: The values, as output by @self.compute. metric_name: The metric name key prefix. Returns: A version of @values that has been flattened, with key names starting with @metric_name. """ return flatten_to_dict(values, metric_name) class AverageMetric(BaseMetric): def reset(self): self.count = 0 self.value = None @abc.abstractmethod def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: raise NotImplementedError( "gather_metrics needs to be implemented for subclasses of AverageMetric" ) def _aggregate_ddp_sum( self, value: Union[Tensor, Number] ) -> Union[float, List[float]]: """ Given a value, sums it up across distributed workers (if distributed) and returns the value as a float (if scalar) or a Numpy array (otherwise). """ with torch.no_grad(): if not isinstance(value, Tensor): value = torch.tensor(value) value = value.to(device=self.device) value = tensor_to_python_float( value, is_distributed=self.is_distributed, reduce_op="sum", ) return value def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Optional[Dict[str, Any]] = {}, batch_size: Optional[int] = 1, ) -> None: prediction = self.preprocess_predictions(prediction) target = self.preprocess_targets(target) metric = self.gather_metrics(prediction, target, extras) if isinstance(metric, Dict): # The values should be summed over all existing workers metric = { k: self._aggregate_ddp_sum(v * batch_size) for k, v in metric.items() } if self.value is None: self.value = metric else: for k, v in metric.items(): self.value[k] += v elif isinstance(metric, Tensor): if self.value is None: self.value = 0 # The value should be summed over all existing workers self.value += self._aggregate_ddp_sum(metric * batch_size) else: raise ValueError( "gather_metrics should return a Tensor or a Dict containing Tensors. Got {}: {}".format( metric.__class__, metric ) ) # The count should be summed over all existing workers self.count += self._aggregate_ddp_sum(batch_size) def compute(self) -> Union[Number, List, Dict[str, Any]]: if self.value is None: return {} elif isinstance(self.value, Number): return self.value / self.count elif isinstance(self.value, Dict): avg_dict = {k: v / self.count for k, v in self.value.items()} return avg_dict class EpochMetric(BaseMetric): def __init__( self, opts: Optional[argparse.Namespace] = None, is_distributed: bool = False, pred: str = None, target: str = None, force_cpu: bool = True, ): super().__init__(opts, is_distributed, pred, target) self.force_cpu = force_cpu def reset(self): self._predictions: List[Tensor] = [] self._targets: List[Tensor] = [] def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any] = None, batch_size: Optional[int] = 1, ) -> None: prediction = self.preprocess_predictions(prediction) target = self.preprocess_targets(target) if not isinstance(prediction, Tensor) or not isinstance(target, Tensor): logger.error( "EpochMetric only works on Tensor, got {} and {}.".format( type(prediction), type(target) ) + " Please set pred_key or target_key by setting the proper metric name:" + " `stats.val: ['metric_name(pred=key1, target=key2)']`" ) return if self.is_distributed: prediction = all_gather_list(prediction) target = all_gather_list(target) else: prediction = [prediction] target = [target] # Detach the variables: we don't need to backprop in metrics prediction = [x.detach() for x in prediction] target = [x.detach() for x in target] # By default we move things to CPU so as to not put extra burden on GPU memory # but we allow child-classes/instances to keep the data on GPU for efficiency. if self.force_cpu: prediction = [x.cpu() for x in prediction] target = [x.cpu() for x in target] self._predictions.extend(prediction) self._targets.extend(target) def get_aggregates(self) -> Tuple[Tensor, Tensor]: """Aggregates predictions and targets. This function gets called every time `self.compute` is called, which is at every log iteration as well as the end of each epoch, e.g. train, val, valEMA. Logging happens at iteration 1 and every `common.log_freq` thereafter. Note: for computationally heavy metrics, you may want to increase `common.log_freq`. """ self._predictions = [torch.cat(self._predictions, dim=0)] self._targets = [torch.cat(self._targets, dim=0)] return self._predictions[0], self._targets[0] def compute_with_aggregates(self, predictions: Tensor, targets: Tensor): """ Computes the metrics given aggregated predictions and targets. It gets called by `self.compute`. This happens at every log iteration as well as the end of each epoch, e.g. train, val, valEMA. Logging happens at iteration 1 and every `common.log_freq` thereafter. Note: for computationally heavy metrics, you may want to increase `common.log_freq`. """ raise NotImplementedError def compute(self) -> Union[Number, List, Dict[str, Any]]: predictions, targets = self.get_aggregates() return self.compute_with_aggregates(predictions, targets) ================================================ FILE: corenet/metrics/metric_base_test.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, Dict, Union import torch from torch import Tensor from corenet.metrics.metric_base import AverageMetric class DummyMetric(AverageMetric): def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: return prediction def test_average_metric_distributed_batchsize(mocker): mocker.patch("torch.distributed.is_initialized", return_value=True) mocker.patch("torch.distributed.get_world_size", return_value=2) mocker.patch("torch.distributed.all_reduce", lambda x, *_, **__: x.add_(1)) metric = DummyMetric(None, is_distributed=True) metric.update(torch.tensor([2.0]), None, batch_size=torch.tensor([2])) # Value is 2 and batch size is 2, but we're simulating the second device # having value 1 and batch size 1 by making sure all_reduce adds 1 to both # the value and the batch size. It's as if we have [2, 2] in GPU1 and [1] # in GPU 2. Therefore the expected average is 5/3. expected_value = (2 * 2 + 1 * 1) / 3 assert metric.compute() == expected_value ================================================ FILE: corenet/metrics/misc.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from numbers import Number from typing import Any, Dict, Union import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import AverageMetric from corenet.utils import logger @METRICS_REGISTRY.register(name="loss") class LossMetric(AverageMetric): def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: """ This function gather losses from different processes and converts to float. """ if extras is None: extras = {} loss = extras.get("loss", None) if loss is None: loss = 0.0 if isinstance(loss, Tensor): return loss elif isinstance(loss, Number): return torch.tensor(loss, device=self.device) elif isinstance(loss, Dict): loss.pop(None, None) for k, v in loss.items(): if isinstance(v, Number): loss[k] = torch.tensor(loss, device=self.device) elif not isinstance(v, Tensor): logger.error( "Loss metric supports Number, Tensor, or Dict of Tensors." f" Got {v} with {type(v)} type under key {k}." ) return loss else: logger.error( "Loss metric supports Number, Tensor, or Dict of Tensors." f" Got {loss} with {type(loss)} type." ) @METRICS_REGISTRY.register(name="grad_norm") class GradNormMetric(AverageMetric): def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: if extras is None: extras = {} grad_norm = extras.get("grad_norm", None) if grad_norm is None: grad_norm = 0.0 if isinstance(grad_norm, Tensor): return grad_norm elif isinstance(grad_norm, Number): return torch.tensor(grad_norm, device=self.device) elif isinstance(grad_norm, Dict): grad_norm.pop(None, None) for k, v in grad_norm.items(): if isinstance(v, Number): grad_norm[k] = torch.tensor(grad_norm, device=self.device) elif isinstance(v, str): del grad_norm[k] elif not isinstance(v, Tensor): logger.error( "Grad-norm metric supports Number, Tensor, or Dict of Tensors." f" Got {v} with {type(v)} type under key {k}." ) return grad_norm else: logger.error( "Grad-norm metric supports Number, Tensor, or Dict of Tensors." f" Got {grad_norm} with {type(grad_norm)} type." ) ================================================ FILE: corenet/metrics/multiclass_classification_pr.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from numbers import Number from typing import Any, Dict, List, Optional, Tuple, Union import numpy as np import torch from sklearn.metrics import average_precision_score, precision_recall_curve from torch import Tensor from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import BaseMetric from corenet.utils import logger, tensor_utils from corenet.utils.file_logger import FileLogger def get_recall_at_precision( precisions: np.ndarray, recalls: np.ndarray, precision_value: float, suppress_warnings: bool = False, ) -> float: """ Compute the recall at the given @precision_value. Args: precisions: An array of shape [num_elements] with precision values. recalls: An array of shape [num_elements] with precision values. precision_value: The precision at which to obtain the recall. suppress_warnings: Suppress warnings. Returns: The recall at @precision_value. """ sort_indices = np.argsort(precisions) sorted_precisions = precisions[sort_indices] sorted_recalls = recalls[sort_indices] index = np.searchsorted(sorted_precisions, precision_value) if not suppress_warnings and not np.isclose( sorted_precisions[index], precision_value, rtol=0.01, atol=0.01 ): # The difference between the requested and true precisions are higher than expected. logger.warning( f"Found recall at precision {sorted_precisions[index]} " f"when recall at precision {precision_value} was requested." ) return float(sorted_recalls[index]) def compute_oi_f1(predictions: Tensor, targets: Tensor) -> Tuple[float, float]: """ Compute the "Optimal Instance" F1 score. The "official" computation corresponds to: 1. Compute the threshold that maximizes individual input's F1 scores separately. 2. Using those thresholds, count the true positives, false positives, and false negatives. 3. Use these values to compute the F1 score. This function also computes a simple averaging of F1 scores individually calculated from each input's optimal thresholds. Args: predictions: A tensor of shape [batch_size, num_classes, predictions_per_sample] containing predictions. targets: A tensor of shape [batch_size, num_classes, predictions_per_sample] containing targets. Returns: A tuple containing the "official" F1 and the simple average of individual F1 scores, as described above. """ if not predictions.ndim == 3: raise ValueError(f"Invalid shape {predictions.shape}") if not targets.ndim == 3: raise ValueError(f"Invalid shape {targets.shape}") batch_size = predictions.shape[0] num_classes = predictions.shape[1] official_ois_f1_scores = [] avg_of_best_f1_scores = [] for class_id in range(num_classes): true_positives = 0 false_positives = 0 false_negatives = 0 best_f1_scores = [] for idx in range(batch_size): # 1. Find the threshold that maximizes F1 score. prediction = predictions[idx, class_id] target = targets[idx, class_id] precisions, recalls, thresholds = precision_recall_curve(target, prediction) f1_scores = ( 2 * precisions * recalls / (precisions + recalls + ((precisions + recalls) == 0)) ) max_idx = np.argmax(f1_scores) threshold = thresholds[max_idx] best_f1_scores.append(f1_scores[max_idx]) # 2. Use the threshold to update counts. true_positives += ((prediction >= threshold) * (target == 1)).sum().item() false_positives += ((prediction >= threshold) * (target == 0)).sum().item() false_negatives += ((prediction < threshold) * (target == 1)).sum().item() # Store the F1 score for this class. precision = true_positives / ( true_positives + false_positives + ((true_positives + false_positives) == 0) ) recall = true_positives / ( true_positives + false_negatives + ((true_positives + false_negatives) == 0) ) official_ois_f1_scores.append( float( (2 * precision * recall) / (precision + recall + ((precision + recall) == 0)) ) ) avg_of_best_f1_scores.append(sum(best_f1_scores) / len(best_f1_scores)) return official_ois_f1_scores, avg_of_best_f1_scores @METRICS_REGISTRY.register(name="multiclass_classification_pr") class MulticlassClassificationPR(BaseMetric): """ Computes multiclass precision/recall metrics. Example .yaml configuration to use this metric (assuming your model outputs a dict with key "logits"): stats: val: ["multiclass_classification_pr(pred=logits)"] checkpoint_metric: "multiclass_classification_pr(pred=logits).macro" checkpoint_metric_max: true metrics: multiclass_classification_pr: include_curve: false """ def __init__( self, opts: Optional[argparse.Namespace] = None, is_distributed: bool = False, pred: str = None, target: str = None, ) -> None: self.all_predictions: List[torch.Tensor] = [] self.all_targets: List[torch.Tensor] = [] self.include_curve = getattr( opts, "stats.metrics.multiclass_classification_pr.include_curve" ) self.include_classwise_ap = getattr( opts, "stats.metrics.multiclass_classification_pr.include_classwise_ap" ) self.suppress_warnings = getattr( opts, "stats.metrics.multiclass_classification_pr.suppress_warnings" ) super().__init__(opts, is_distributed, pred, target) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add metric specific arguments. Args: parser: The parser to which to add the arguments. Returns: The parser. """ if cls == MulticlassClassificationPR: parser.add_argument( "--stats.metrics.multiclass-classification-pr.include-curve", action="store_true", help="If set, PR curves will be stored.", ) parser.add_argument( "--stats.metrics.multiclass-classification-pr.include-classwise-ap", action="store_true", help="If set, AP will be plotted for each class.", ) parser.add_argument( "--stats.metrics.multiclass-classification-pr.suppress-warnings", action="store_true", help="If set, warnings will be suppressed. This is useful to reduce the logs size during training.", ) return parser def reset(self) -> None: """ Resets all aggregated data. Called at the start of every epoch. """ self.all_predictions.clear() self.all_targets.clear() def update( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any] = {}, batch_size: Optional[int] = 1, ) -> None: """ Processes a new batch of predictions and targets for computing the metric. Args: predictions: model outputs for the current batch. They must be a tensor of shape [batch_size, num_classes, ...], or a dictionary with key self.pred_key containing such a tensor. target: labels for the current batch. They may be a tensor of shape [batch_size, ...], or a dictionary with key self.target_key containing such a tensor. If so, the entries are assumed to be class indices. The target may also be a tensor of shape [batch_size, num_classes, ...], or a dictionary with key self.target_key containing such a tensor. If so, the entries are assumed to be binary class labels. extras: unused. batch_size: unused. """ if isinstance(prediction, dict): if self.pred_key in prediction: prediction = prediction[self.pred_key] else: raise KeyError( f"Missing prediction key '{self.pred_key}. Existing keys: {prediction.keys()}'" ) if isinstance(target, dict): if self.target_key in target: target = target[self.target_key] else: raise KeyError( f"Missing target key '{self.target_key}. Existing keys: {target.keys()}'" ) if (prediction.ndim - target.ndim) not in (0, 1): raise ValueError( f"Invalid dimensions prediction.shape={prediction.shape}, target.shape={target.shape}" ) if target.ndim < prediction.ndim: # The target doesn't have a num_classes dimension because it has # class labels. Expand it. num_classes = prediction.shape[1] target = F.one_hot(target, num_classes=num_classes) # Change from [batch_size, ..., num_classes] to [batch_size, num_classes, ...]. new_order = ( 0, target.ndim - 1, ) + tuple(range(1, target.ndim - 1)) target = target.permute(*new_order) # Now, @target and @prediction are both in [batch_size, num_classes, ...] order. assert target.shape == prediction.shape if prediction.dim() > 2: prediction = prediction.reshape( prediction.shape[0], prediction.shape[1], -1 ) target = target.reshape(target.shape[0], target.shape[1], -1) with torch.no_grad(): if self.is_distributed: all_predictions = tensor_utils.all_gather_list( prediction.detach().cpu().contiguous() ) all_targets = tensor_utils.all_gather_list( target.detach().cpu().contiguous() ) all_predictions = torch.cat( [p.detach().cpu() for p in all_predictions], dim=0 ) all_targets = torch.cat([t.detach().cpu() for t in all_targets], dim=0) else: all_predictions = prediction.detach().cpu() all_targets = target.detach().cpu() self.all_predictions.append(all_predictions) self.all_targets.append(all_targets) def compute(self) -> Dict[str, Union[Number, List[List[Number]]]]: """ Compute the multiclass classification Precision-Recall metrics. See https://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html#sklearn.metrics.average_precision_score for details. Returns: A dictionary containing: { "micro": The "micro"-averaged precision, as defined by SKLearn. This corresponds to treating each element in the multiclass prediction separately. "macro": The "macro"-averaged precision, as defined by SKLearn. This corresponds to calculating precision-recall metrics separately for each label, then computing an unweighted mean. "weighted": The "weighted"-averaged precision, as defined by SKLearn. This corresponds to calculating precision-recall metrics separately for each label, then computing a weighted mean. "precisions": A list of lists, where element [i][j] is the j'th precision value for the i'th class. "recalls": A list of lists, where element [i][j] is the j'th precision value for the i'th class. "thresholds": A list of lists, where element [i][j] is the j'th threshold value for the i'th class. } """ if self.include_curve: metrics = { "precisions": [], "recalls": [], "thresholds": [], "ODS-F1": [], "AP": [], "Recall@P=50": [], } else: metrics = { "ODS-F1": [], "AP": [], "Recall@P=50": [], } predictions = ( torch.cat(self.all_predictions, dim=0).float().numpy() ) # [batch_size, num_classes, ...] num_classes = predictions.shape[1] targets = ( torch.cat(self.all_targets, dim=0).float().numpy() ) # [batch_size, num_classes, ...] if predictions.ndim == 3: assert targets.ndim == 3 # @predictions and @targets have shape [batch_size, num_classes, predictions_per_element]. Compute # the optimal instance score (OIS-F), which is the only metric that needs the predictions_per_element # dimension. Then, reshape to [batch_size * predictions_per_element, num_classes]. official, avg = compute_oi_f1(predictions, targets) metrics["OIS-F1-official"] = official metrics["OIS-F1-avg"] = avg predictions = predictions.transpose(0, 2, 1).reshape(-1, num_classes) targets = targets.transpose(0, 2, 1).reshape(-1, num_classes) for class_id in range(num_classes): ( precisions, recalls, thresholds, ) = precision_recall_curve(targets[:, class_id], predictions[:, class_id]) f1_scores = (2 * precisions * recalls) / ( precisions + recalls + ((precisions + recalls) == 0) ) metrics["ODS-F1"].append(f1_scores.max().item()) if self.include_curve: metrics["precisions"].append(precisions.tolist()) metrics["recalls"].append(recalls.tolist()) metrics["thresholds"].append(thresholds.tolist()) metrics["AP"].append( float( average_precision_score( targets[:, class_id], predictions[:, class_id] ) ) ) metrics["Recall@P=50"].append( get_recall_at_precision( precisions, recalls, 0.5, suppress_warnings=self.suppress_warnings ) ) for average in ["micro", "macro", "weighted"]: metrics[average] = float( average_precision_score(targets, predictions, average=average) ) if self.include_classwise_ap: for i, v in enumerate(metrics["AP"]): metrics[f"AP-class{i}"] = v return metrics def is_epoch_summary_enabled_for_metric( self, metric_name: str, log_writer: Any ) -> bool: """ Determines whether to log a metric with the given @metric_name when the given @log_writer is invoked. This is mainly used to prevent logs from becoming too large. For example, we might not want to display every value in a PR curve, even though we want to calculate and store the curve. Args: metric_name: The name of the metric. log_writer: An object that can be used as a log writer (for example, a TensorBoardLogger). Returns: True if the name of the metric should be logged. False otherwise. """ if isinstance(log_writer, FileLogger): # For FileLoggers, we log everything, including the rather large # precisions/thresholds/recalls keys. return True else: # For other loggers, we avoid the precisions/thresholds/recalls # keys. return not any( ( "precisions" in metric_name.lower(), "thresholds" in metric_name.lower(), "recalls" in metric_name.lower(), ) ) def flatten_metric( self, values: Union[Number, List, Dict[str, Any]], metric_name: str ) -> Dict[str, Union[Number, List, Dict[str, Any]]]: """ Flatten the given metric @values, prepending @metric_name to the resulting dictionary's keys. Unlike the base class's method, we do not recursively flatten. This is because we have lists of PR curve values, and we don't want to generate an enormous number of keys to avoid inefficient storage. Args: values: The values, as output by @self.compute. metric_name: The metric name key prefix. Returns: A version of @values that has been flattened, with key names starting with @metric_name. """ return {f"{metric_name}/{k}": v for k, v in values.items()} def summary_string(self, name: str, sep: str, values: Dict[str, Any]) -> str: """ Get a string representation of the given metric values, suitable for printing to the terminal. We avoid printing precision/thresholds/recalls from PR curve computation, to avoid excessively long logs. Args: name: The name of the metric. sep: The separator used in the printout. values: The metric values, as output by @self.compute. Returns: A string representation of the metric. """ filtered_keys = {"precisions", "thresholds", "recalls"} values = {k: v for k, v in values.items() if k not in filtered_keys} return super().summary_string(name, sep, values) ================================================ FILE: corenet/metrics/probability_histograms.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from numbers import Number from typing import Dict, Union import numpy as np from torch import Tensor from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import EpochMetric from corenet.utils import logger @METRICS_REGISTRY.register("prob_hist") class ProbabilityHistogramMetric(EpochMetric): def __init__( self, opts: argparse.Namespace = None, is_distributed: bool = False, pred: str = None, target: str = None, ): super().__init__(opts, is_distributed, pred, target) self.num_bins = getattr(self.opts, "stats.metrics.prob_hist.num_bins") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add metric specific arguments""" if cls == ProbabilityHistogramMetric: parser.add_argument( "--stats.metrics.prob-hist.num-bins", type=int, default=10 ) return parser def compute_with_aggregates( self, y_pred: Tensor, y_true: Tensor ) -> Union[Number, Dict[str, Number]]: y_pred = F.softmax(y_pred, dim=-1).numpy() y_true = y_true.numpy() max_confs = y_pred.max(axis=-1) max_hist = np.histogram(max_confs, bins=self.num_bins, range=[0, 1])[0] max_hist = max_hist / max_hist.sum() target_confs = np.take_along_axis(y_pred, y_true.reshape(-1, 1), 1) target_hist = np.histogram(target_confs, bins=self.num_bins, range=[0, 1])[0] target_hist = target_hist / target_hist.sum() return { "max": max_hist.tolist(), "target": target_hist.tolist(), } ================================================ FILE: corenet/metrics/psnr.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, Dict, Optional, Union import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import AverageMetric from corenet.utils import logger def compute_psnr( prediction: Tensor, target: Tensor, no_uint8_conversion: Optional[bool] = False ) -> Tensor: if not no_uint8_conversion: prediction = prediction.mul(255.0).to(torch.uint8) target = target.mul(255.0).to(torch.uint8) MAX_I = 255**2 else: MAX_I = 1 error = torch.pow(prediction - target, 2).float() mse = torch.mean(error) + 1e-10 psnr = 10.0 * torch.log10(MAX_I / mse) return psnr @METRICS_REGISTRY.register(name="psnr") class PSNRMetric(AverageMetric): def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: """ This function gathers psnr scores from different processes and converts to float. """ # We have four combinations between prediction and target types: # 1. (Tensor, Tensor) # 2. (Dict, Tensor) # 3. (Dict, Dict) # 4. (Tensor, Dict) --> This combination is rare if isinstance(prediction, Tensor) and isinstance(target, Tensor): if prediction.numel() != target.numel(): logger.error( "Prediction and target have different number of elements." "Got: Prediction={} and target={}".format( prediction.shape, target.shape ) ) psnr = compute_psnr(prediction=prediction, target=target) return psnr elif isinstance(prediction, Dict) and isinstance(target, Tensor): psnr_dict = {} for pred_k, pred_v in prediction.items(): # only compute PSNR where prediction size and target sizes are the same if isinstance(pred_v, Tensor) and (pred_v.numel() == target.numel()): psnr = compute_psnr(prediction=pred_v, target=target) psnr_dict[pred_k] = psnr return psnr_dict elif isinstance(prediction, Dict) and isinstance(target, Dict): # prediction and target dictionaries should have intersecting keys prediction_keys = prediction.keys() target_keys = target.keys() intersection_keys = list(set(prediction_keys).intersection(target_keys)) if len(intersection_keys) == 0: logger.error( "The keys in prediction and target are different. " " Got: Prediction keys={} and Target keys={}".format( prediction_keys, target_keys ) ) psnr_dict = {} for pred_k in intersection_keys: pred_v = prediction[pred_k] target_v = target[pred_k] # only compute PSNR where prediction size and target sizes are the same if ( isinstance(pred_v, Tensor) and isinstance(target_v, Tensor) and (pred_v.numel() == target_v.numel()) ): psnr = compute_psnr(prediction=pred_v, target=target_v) psnr_dict[pred_k] = psnr return psnr_dict elif isinstance(prediction, Tensor) and isinstance(target, Dict): psnr_dict = {} for target_k, target_v in target.items(): # only compute PSNR where prediction size and target sizes are the same if isinstance(target_v, Tensor) and ( prediction.numel() == target_v.numel() ): psnr = compute_psnr(prediction=prediction, target=target_v) psnr_dict[target_k] = psnr return psnr_dict else: logger.error("Metric monitor supports Tensor or Dict of Tensors") ================================================ FILE: corenet/metrics/retrieval_cmc.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy from typing import Dict, Tuple import numpy as np import torch from sklearn.metrics import average_precision_score from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import EpochMetric from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.registry import Registry DISTANCE_REGISTRY = Registry("distance_metrics") @DISTANCE_REGISTRY.register("cosine") def cosine_distance_matrix(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: """Get pair-wise cosine distances. Args: x: A feature tensor with shape (n, d). y: A feature tensor with shape (m, d). Returns: Distance tensor between features x and y with shape (n, m). """ assert len(x.shape) == len(y.shape) == 2 assert x.shape[1] == y.shape[1] cosine_sim = F.cosine_similarity(x.unsqueeze(-1), y.T.unsqueeze(0), dim=1) assert cosine_sim.shape[0] == x.shape[0] assert cosine_sim.shape[1] == y.shape[0] assert len(cosine_sim.shape) == 2 return 1 - cosine_sim @DISTANCE_REGISTRY.register("l2") def l2_distance_matrix(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: """Get pair-wise l2 distances. Args: x: A torch feature tensor with shape (n, d). y: A torch feature tensor with shape (m, d). Returns: Distance tensor between features x and y with shape (n, m). """ assert len(x.shape) == len(y.shape) == 2 assert x.shape[1] == y.shape[1] return torch.cdist(x, y, p=2) @METRICS_REGISTRY.register(name="retrieval_cmc") class RetrievalCMC(EpochMetric): """ Compute CMC-top-k and mAP metrics in retrieval setup. """ def __init__( self, opts: argparse.Namespace = None, is_distributed: bool = False, pred: str = "embedding", target: str = None, compute_map: bool = True, ) -> None: super().__init__(opts, is_distributed, pred, target) distance_metric = getattr(opts, "stats.metrics.retrieval_cmc.distance_metric") self.k = getattr(opts, "stats.metrics.retrieval_cmc.k") self.subset_fraction = float( getattr(opts, "stats.metrics.retrieval_cmc.subset_fraction") ) self.compute_map = compute_map self.get_distance_matrix = DISTANCE_REGISTRY[distance_metric] self.embedding = [] self.label = [] self.is_master = is_master(opts) if self.subset_fraction > 1.0: logger.error( "Subset fraction should be a positive number smaller than 1.0." f" Got {self.subset_fraction}" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add metric specific arguments""" if cls == RetrievalCMC: parser.add_argument( "--stats.metrics.retrieval-cmc.subset-fraction", type=float, default=1.0, help="Use fraction of gallery set for CMC calculation when set." " Defaults to 1.0", ) parser.add_argument( "--stats.metrics.retrieval-cmc.k", type=int, default=5, help="CMC top-k: percentage of query images with at least one same-class" " gallery image in their k-NN. Defaults to 5.", ) parser.add_argument( "--stats.metrics.retrieval-cmc.distance-metric", type=str, default="l2", choices=["l2", "cosine"], help="Distance to use for nearest-neighbor calculation." " Defaults to l2", ) return parser def compute_with_aggregates( self, embedding: torch.Tensor, labels: torch.Tensor ) -> Dict[str, float]: """Compute retrieval metrics over full epoch. Args: embedding: tensor of m embeddings with shape (m, d), where d is embedding dimension. labels: tensor of m labels. Returns: A dictionary of `top1`, `top-{k}` and `mAP`. """ # (Possibly) use a smaller subset if self.subset_fraction < 1.0: gallery_size = embedding.shape[0] n_subset = int(self.subset_fraction * gallery_size) mask = torch.randperm(embedding.shape[0])[:n_subset] embedding = embedding[mask] labels = labels[mask] # Same embeddings are used for both gallery and query distance_matrix = self.get_distance_matrix(embedding, embedding) if self.is_master: logger.log( f"Begin CMC calculation on embeddings with shape = {embedding.shape}." ) top1, topk = cmc_calculation( distance_matrix=distance_matrix, query_ids=labels, k=self.k, ) top1 = float(top1) topk = float(topk) if self.compute_map: retrieval_map = mean_ap(distance_matrix=distance_matrix, labels=labels) else: retrieval_map = 0 # Convert to percent and return return { "top1": 100 * top1, f"top{self.k}": 100 * topk, "mAP": 100 * retrieval_map, } def cmc_calculation( distance_matrix: torch.Tensor, query_ids: torch.Tensor, k: int = 5, ) -> Tuple[float, float]: """Compute Cumulative Matching Characteristics metric. Args: distance_matrix: pairwise distance matrix between embeddings of gallery and query sets query_ids: labels for the query data (assuming the same as gallery) k: parameter for top k retrieval Returns: cmc-top1, cmc-top5 """ distance_matrix = copy.deepcopy(distance_matrix) query_ids = copy.deepcopy(query_ids) distance_matrix.fill_diagonal_(float("inf")) _, indices = torch.sort(distance_matrix) labels = query_ids.unsqueeze(dim=0).repeat(query_ids.shape[0], 1) sorted_labels = torch.gather(labels, 1, indices) top_1 = (sorted_labels[:, 0] == query_ids).sum() / query_ids.shape[0] top_k = (sorted_labels[:, :k] == query_ids.unsqueeze(1)).sum(dim=1).clamp( max=1 ).sum() / query_ids.shape[0] return top_1, top_k def mean_ap( distance_matrix: torch.Tensor, labels: torch.Tensor, ) -> float: """Compute Mean Average Precision. Args: distance_matrix: pairwise distance matrix between embeddings of gallery and query sets, shape = (m,m) labels: labels for the query data (assuming the same as gallery), shape = (m,) Returns: mean average precision (float) """ m, n = distance_matrix.shape assert m == n # Sort and find correct matches distance_matrix, gallery_matched_indices = torch.sort(distance_matrix, dim=1) truth_mask = labels[gallery_matched_indices] == labels[:, None] distance_matrix = distance_matrix.cpu().numpy() gallery_matched_indices = gallery_matched_indices.cpu().numpy() truth_mask = truth_mask.cpu().numpy() # Compute average precision for each query average_precisions = list() for query_index in range(n): valid_sorted_match_indices = ( gallery_matched_indices[query_index, :] != query_index ) y_true = truth_mask[query_index, valid_sorted_match_indices] y_score = -distance_matrix[query_index][valid_sorted_match_indices] if not np.any(y_true): continue # if a query does not have any match, we exclude it from mAP calculation. average_precisions.append(average_precision_score(y_true, y_score)) return np.mean(average_precisions) ================================================ FILE: corenet/metrics/stats.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import sys import time import traceback from numbers import Number from typing import Any, Dict, List, Optional, Union import numpy as np import torch from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import BaseMetric from corenet.utils import logger from corenet.utils.object_utils import apply_recursively class Statistics(object): def __init__( self, opts: argparse.Namespace, metric_names: list = ["loss"], is_master_node: Optional[bool] = False, is_distributed: Optional[bool] = False, log_writers: Optional[List] = [], ) -> None: if len(metric_names) == 0: logger.error("Metric names list cannot be empty") # key is the metric name and value is the value self.metric_dict: Dict[str, BaseMetric] = {} for m_name in metric_names: if m_name in METRICS_REGISTRY: self.metric_dict[m_name] = METRICS_REGISTRY[m_name]( opts=opts, is_distributed=is_distributed ) else: if is_master_node: logger.log( "{} statistics not supported. Supported: {}".format( m_name, METRICS_REGISTRY.keys() ) ) self.round_places = 4 self.is_master_node = is_master_node self.log_writers = log_writers self.batch_time = 0 self.batch_counter = 0 def update( self, pred_label: Union[Tensor, Dict], target_label: Union[Tensor, Dict], extras: Optional[Dict[str, Any]] = None, batch_time: Optional[float] = 0.0, batch_size: Optional[int] = 1, ) -> None: """ Updates all the metrics after a batch. :param pred_label: predictions coming from a model (must be a Tensor or a Dict of Tensors) :param target_label: GT labels (Tensor or a Dict of Tensors) :param extras: Optional Dict containing extra info, usually Loss and GradNorm e.g. {"loss": loss_value, "grad_norm": gradient_norm} :param batch_time: Optional time it took to run through the batch :param n: batch size (to be used in averaging the numbers correctly) """ for metric_name, metric in self.metric_dict.items(): try: metric.update( prediction=pred_label, target=target_label, extras=extras, batch_size=batch_size, ) except Exception as e: traceback.print_exc() logger.error( "Caught an error while updating metric {}: {}".format( metric_name, e ) ) self.batch_time += batch_time self.batch_counter += 1 def _avg_statistics_all(self, sep=": ", metrics=None) -> List[str]: """ This function computes average statistics of all metrics and returns them as a list of strings. Examples: loss: 12.9152 loss: {'total_loss': 12.9152, 'reg_loss': 2.8199, 'cls_loss': 10.0953} """ if metrics is None: metrics = self._compute_avg_statistics_all() return [ self.metric_dict[name].summary_string(name, sep, avg) for name, avg in metrics.items() if isinstance(avg, Number) or avg ] def _compute_avg_statistics_all(self) -> Dict[str, Union[float, Dict]]: metric_stats = {} for metric_name, metric in self.metric_dict.items(): value = metric.compute() metric_stats[metric_name] = apply_recursively( value, lambda x: round(x * 1.0, self.round_places) ) return metric_stats # TODO: change name: avg is presumptuous def avg_statistics( self, metric_name: str, sub_metric_name: Optional[str] = None, *args, **kwargs ) -> float: """ This function computes the average statistics of a given metric. .. note:: The statistics are stored in form of a dictionary and each key-value pair can be of string and number OR string and dictionary of string and number. Examples: {'loss': 10.0, 'top-1': 50.0} {'loss': {'total_loss': 10.0, 'cls_loss': 2.0, 'reg_loss': 8.0}, 'mAP': 5.0} """ if metric_name in self.metric_dict: computed_metric = self.metric_dict[metric_name].compute() computed_metric = apply_recursively( computed_metric, lambda x: round(x * 1.0, self.round_places) ) if isinstance(computed_metric, Dict): if sub_metric_name is not None: if sub_metric_name in computed_metric: return computed_metric[sub_metric_name] else: logger.error( "{} not present in the dictionary. Available keys are: {}".format( sub_metric_name, list(computed_metric.keys()) ) ) else: return None elif isinstance(computed_metric, Number): return computed_metric else: return None return None def iter_summary( self, epoch: int, n_processed_samples: int, total_samples: int, elapsed_time: float, learning_rate: Union[float, list], ) -> None: if self.is_master_node: metric_stats = self._avg_statistics_all() el_time_str = "Elapsed time: {:5.2f}".format(time.time() - elapsed_time) if isinstance(learning_rate, float): lr_str = "LR: {:1.6f}".format(learning_rate) else: learning_rate = [round(lr, 6) for lr in learning_rate] lr_str = "LR: {}".format(learning_rate) epoch_str = "Epoch: {:3d} [{:8d}/{:8d}]".format( epoch, n_processed_samples, total_samples ) batch_str = "Avg. batch load time: {:1.3f}".format( self.batch_time / self.batch_counter ) stats_summary = [epoch_str] stats_summary.extend(metric_stats) stats_summary.append(lr_str) stats_summary.append(batch_str) stats_summary.append(el_time_str) summary_str = ", ".join(stats_summary) logger.log(summary_str) sys.stdout.flush() def epoch_summary( self, epoch: int, stage: Optional[str] = "Training", epoch_time: Optional[float] = None, ) -> None: if self.is_master_node: metrics = self._compute_avg_statistics_all() metric_stats = self._avg_statistics_all(sep="=", metrics=metrics) metric_stats_str = " || ".join(metric_stats) logger.log("*** {} summary for epoch {}".format(stage.title(), epoch)) print("\t {}".format(metric_stats_str)) sys.stdout.flush() # TODO: this step is only here for backward-compatibility. We can remove it as well shortened_stage_map = { "training": "Train", "validation": "Val", "evaluation": "Eval", "validation (EMA)": "Val_EMA", } s_stage = shortened_stage_map.get(stage, stage) for metric_name, metric in self.metric_dict.items(): values = metrics[metric_name] for log_writer in self.log_writers: for scalar_name, scalar_value in metric.flatten_metric( values, metric_name ).items(): if metric.is_epoch_summary_enabled_for_metric( scalar_name, log_writer ): log_writer.add_scalar( "{}/{}".format(s_stage, scalar_name.title()), scalar_value, epoch, ) if epoch_time is not None: for log_writer in self.log_writers: log_writer.add_scalar( "{}/{}".format(s_stage, "Epoch_Time"), epoch_time, epoch, ) ================================================ FILE: corenet/metrics/topk_accuracy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, Dict, Optional, Union from torch import Tensor from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import AverageMetric from corenet.utils import logger def top_k_accuracy( output: Tensor, target: Tensor, top_k: Optional[tuple] = (1,) ) -> list: maximum_k = max(top_k) batch_size = target.shape[0] _, pred = output.topk(maximum_k, 1, True, True) pred = pred.t() correct = pred.eq(target.reshape(1, -1).expand_as(pred)) results = [] for k in top_k: correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) acc_k = correct_k.mul_(100.0 / batch_size) results.append(acc_k) return results class TopKMetric(AverageMetric): K = 1 def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Union[Tensor, Dict[str, Tensor]]: """ This function gather top-k metrics from different processes and converts to float. """ # We have four combinations between prediction and target types: # 1. (Tensor, Tensor) # 2. (Dict, Tensor) # 3. (Dict, Dict) # 4. (Tensor, Dict) --> This combination is rare if isinstance(prediction, Tensor) and isinstance(target, Tensor): (top_k_acc,) = top_k_accuracy(prediction, target, top_k=(self.K,)) return top_k_acc elif isinstance(prediction, Dict) and isinstance(target, Tensor): top_k_dict = {} for pred_k, pred_v in prediction.items(): if ( isinstance(pred_v, Tensor) and pred_v.dim() == 2 and target.dim() == 1 ): # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size] (top_1_acc,) = top_k_accuracy(pred_v, target, top_k=(self.K,)) top_k_dict[pred_k] = top_1_acc return top_k_dict elif isinstance(prediction, Dict) and isinstance(target, Dict): # prediction and target dictionaries should have intersecting keys prediction_keys = prediction.keys() target_keys = target.keys() intersection_keys = list(set(prediction_keys).intersection(target_keys)) if len(intersection_keys) == 0: logger.error( "The keys in prediction and target are different. " " Got: Prediction keys={} and Target keys={}".format( prediction_keys, target_keys ) ) top_k_dict = {} for pred_k in intersection_keys: pred_v = prediction[pred_k] target_v = target[pred_k] if ( isinstance(pred_v, Tensor) and isinstance(target_v, Tensor) and pred_v.dim() == 2 and target_v.dim() == 1 ): # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size] (top_1_acc,) = top_k_accuracy(pred_v, target_v, top_k=(self.K,)) top_k_dict[pred_k] = top_1_acc return top_k_dict elif isinstance(prediction, Tensor) and isinstance(target, Dict): # rare but possible top_k_dict = {} for target_k, target_v in target.items(): if ( isinstance(target_v, Tensor) and prediction.dim() == 2 and target_v.dim() == 1 ): # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size] (top_1_acc,) = top_k_accuracy(prediction, target_v, top_k=(self.K,)) top_k_dict[target_k] = top_1_acc return top_k_dict else: logger.error("Metric monitor supports Tensor or Dict of Tensors") @METRICS_REGISTRY.register(name="top1") class Top1Metric(TopKMetric): K = 1 @METRICS_REGISTRY.register(name="top5") class Top5Metric(TopKMetric): K = 5 ================================================ FILE: corenet/metrics/vqa_preset_score.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """Preset score metric for VQA evaluation.""" from typing import Any, Dict, Union import torch from torch import Tensor from torch.nn import functional as F from corenet.metrics import METRICS_REGISTRY from corenet.metrics.metric_base import AverageMetric def vqa_preset_score_metric(output: Tensor, target: Tensor) -> list: """Sum the VQA preset scores for tasks with more than one ground-truth target. Score metric is an alternative to the strict 0-1 accuracy metric in multi-class classification that assigns non-zero score to partially correct answers. For example, in the Visual-Question-Answering task the question "How many cats are in this picture?" can have a correct answer '3' with score 1.0 and a partially correct answer '2' with score 0.5. All other predicted answers get score 0.0 . Arguments: output: Prediction probabilities to be scored (batch_size, n_clasess). target: Preset ground-truth score for predicted label per input (batch_size, n_classes). Returns: A tensor of a single float as the average of score on the batch. """ batch_size = target.shape[0] output = F.softmax(output, dim=-1) _, pred = output.max(1, keepdim=True) # (B, C) score = torch.gather(target, 1, pred).sum() score = score.mul_(100.0 / batch_size) return score @METRICS_REGISTRY.register(name="vqa_preset_score") class VQAPresetScoreMetric(AverageMetric): """Metric class for VQA preset score.""" def gather_metrics( self, prediction: Union[Tensor, Dict], target: Union[Tensor, Dict], extras: Dict[str, Any], ) -> Tensor: """Gather VQA score metric for given set of predictions and targets. This function accepts two combinations between prediction and target types: 1. (Tensor, Tensor) 2. (Dict, Tensor) Args: prediction: a tensor or a dictionary with `logits` as the key. target: a tensor of the same shape as prediction. extras: a dictionary with extra arguments. Not used in this class. Returns: A tensor of a single float as the average of score on the batch. """ if isinstance(prediction, Tensor) and isinstance(target, Tensor): score = vqa_preset_score_metric(prediction, target) return score elif isinstance(prediction, Dict) and isinstance(target, Tensor): pred_v = prediction["logits"] if isinstance(pred_v, Tensor) and pred_v.dim() == 2 and target.dim() == 2: score = vqa_preset_score_metric(pred_v, target) return score else: raise NotImplementedError( f"{self.__class__.__name__} only takes (Tensor, Tensor) or" " (Dict, Tensor) as prediction and target." ) ================================================ FILE: corenet/modeling/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.anchor_generator import arguments_anchor_gen from corenet.modeling.image_projection_layers import arguments_image_projection_head from corenet.modeling.layers import arguments_nn_layers from corenet.modeling.matcher_det import arguments_box_matcher from corenet.modeling.misc.averaging_utils import EMA, arguments_ema from corenet.modeling.misc.common import parameter_list from corenet.modeling.models import arguments_model, get_model from corenet.modeling.models.detection import DetectionPredTuple from corenet.modeling.neural_augmentor import arguments_neural_augmentor from corenet.modeling.text_encoders import arguments_text_encoder from corenet.options.utils import extend_selected_args_with_prefix def modeling_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: # text encoder arguments (usually for multi-modal tasks) parser = arguments_text_encoder(parser) # image projection head arguments (usually for multi-modal tasks) parser = arguments_image_projection_head(parser) # model arguments parser = arguments_model(parser) # neural network layer arguments parser = arguments_nn_layers(parser) # EMA arguments parser = arguments_ema(parser) # anchor generator arguments (for object detection) parser = arguments_anchor_gen(parser) # box matcher arguments (for object detection) parser = arguments_box_matcher(parser) # neural aug arguments parser = arguments_neural_augmentor(parser) # Add teacher as a prefix to enable distillation tasks # keep it as the last entry parser = extend_selected_args_with_prefix( parser, match_prefix="--model.", additional_prefix="--teacher.model." ) return parser ================================================ FILE: corenet/modeling/anchor_generator/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.anchor_generator.base_anchor_generator import BaseAnchorGenerator from corenet.utils import logger from corenet.utils.registry import Registry # register anchor generator ANCHOR_GEN_REGISTRY = Registry( "anchor_gen", base_class=BaseAnchorGenerator, lazy_load_dirs=["corenet/modeling/anchor_generator"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_anchor_gen(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Arguments related to anchor generator for object detection""" group = parser.add_argument_group("Anchor generator", "Anchor generator") group.add_argument( "--anchor-generator.name", type=str, help="Name of the anchor generator" ) # add class specific arguments parser = ANCHOR_GEN_REGISTRY.all_arguments(parser) return parser def build_anchor_generator(opts, *args, **kwargs): """Build anchor generator for object detection""" anchor_gen_name = getattr(opts, "anchor_generator.name") # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if anchor_gen_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") anchor_gen = ANCHOR_GEN_REGISTRY[anchor_gen_name](opts, *args, **kwargs) return anchor_gen ================================================ FILE: corenet/modeling/anchor_generator/base_anchor_generator.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple, Union import torch from torch import Tensor class BaseAnchorGenerator(torch.nn.Module): """ Base class for anchor generators for the task of object detection. """ def __init__(self, *args, **kwargs) -> None: super().__init__() self.anchors_dict = dict() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add anchor generator-specific arguments to the parser """ return parser def num_anchors_per_os(self): """Returns anchors per output stride. Child classes must implement this function.""" raise NotImplementedError @torch.no_grad() def _generate_anchors( self, height: int, width: int, output_stride: int, device: Optional[str] = "cpu", *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, ...]]: raise NotImplementedError @torch.no_grad() def _get_anchors( self, fm_height: int, fm_width: int, fm_output_stride: int, device: Optional[str] = "cpu", *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, ...]]: key = "h_{}_w_{}_os_{}".format(fm_height, fm_width, fm_output_stride) if key not in self.anchors_dict: default_anchors_ctr = self._generate_anchors( height=fm_height, width=fm_width, output_stride=fm_output_stride, device=device, *args, **kwargs ) self.anchors_dict[key] = default_anchors_ctr return default_anchors_ctr else: return self.anchors_dict[key] @torch.no_grad() def forward( self, fm_height: int, fm_width: int, fm_output_stride: int, device: Optional[str] = "cpu", *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, ...]]: """ Returns anchors for the feature map Args: fm_height (int): Height of the feature map fm_width (int): Width of the feature map fm_output_stride (int): Output stride of the feature map device (Optional, str): Device (cpu or cuda). Defaults to cpu Returns: Tensor or Tuple of Tensors """ return self._get_anchors( fm_height=fm_height, fm_width=fm_width, fm_output_stride=fm_output_stride, device=device, *args, **kwargs ) ================================================ FILE: corenet/modeling/anchor_generator/ssd_anchor_generator.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from itertools import product from typing import List, Optional import numpy as np import torch from torch import Tensor from corenet.modeling.anchor_generator import ANCHOR_GEN_REGISTRY, BaseAnchorGenerator from corenet.utils import logger @ANCHOR_GEN_REGISTRY.register(name="ssd") class SSDAnchorGenerator(BaseAnchorGenerator): """ This class generates anchors (or priors) ``on-the-fly`` for the `single shot object detector (SSD) `_. """ def __init__(self, opts, *args, **kwargs) -> None: output_strides = getattr( opts, "anchor_generator.ssd.output_strides", [32, 64, 128, 256, -1] ) aspect_ratios = getattr( opts, "anchor_generator.ssd.aspect_ratios", [[2, 3]] * len(output_strides) ) min_ratio = getattr(opts, "anchor_generator.ssd.min_scale_ratio", 0.1) max_ratio = getattr(opts, "anchor_generator.ssd.max_scale_ratio", 1.05) no_clipping = getattr(opts, "anchor_generator.ssd.no_clipping", False) step = getattr(opts, "anchor_generator.ssd.step", [1]) if isinstance(step, int): step = [step] * len(output_strides) elif isinstance(step, List) and len(step) <= len(output_strides): step = step + [1] * (len(output_strides) - len(step)) else: logger.error( "--anchor-generator.ssd.step should be either a list of ints with the same length as " "the output strides OR an integer" ) super().__init__() aspect_ratios = [list(set(ar)) for ar in aspect_ratios] output_strides_aspect_ratio = dict() for k, v in zip(output_strides, aspect_ratios): output_strides_aspect_ratio[k] = v self.output_strides_aspect_ratio = output_strides_aspect_ratio self.output_strides = output_strides self.anchors_dict = dict() self.num_output_strides = len(output_strides) self.num_aspect_ratios = len(aspect_ratios) scales = np.linspace(min_ratio, max_ratio, len(output_strides) + 1) self.sizes = dict() for i, s in enumerate(output_strides): self.sizes[s] = { "min": scales[i], "max": (scales[i] * scales[i + 1]) ** 0.5, "step": step[i], } self.clip = not no_clipping self.min_scale_ratio = min_ratio self.max_scale_ratio = max_ratio self.step = step def __repr__(self): return "{}(min_scale_ratio={}, max_scale_ratio={}, n_output_strides={}, n_aspect_ratios={}, clipping={})".format( self.__class__.__name__, self.min_scale_ratio, self.max_scale_ratio, self.num_output_strides, self.num_aspect_ratios, self.clip, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Adds SSD anchor generator-specific arguments to the parser """ group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--anchor-generator.ssd.output-strides", nargs="+", type=int, help="Output strides of the feature maps for which we want to generate anchors", ) group.add_argument( "--anchor-generator.ssd.aspect-ratios", nargs="+", type=float, action="append", help="Aspect ratios at each output stride", ) # prior box arguments # SSD sample priors between min and max box sizes. # for example, if we use feature maps from three spatial levels (or output strides), then we # sample width and height for anchor boxes as: # scales = np.linspace(min_box_size, max_box_size, len(output_strides) + 1) # min_box dimensions for the first feature map is scales[0] * feature_map_dimensions # while the max_box dimensions will be sqrt(scales[0] * scales[1]) * feature_map dimensions. And so on group.add_argument( "--anchor-generator.ssd.min-scale-ratio", type=float, help="Min. scale ratio", ) group.add_argument( "--anchor-generator.ssd.max-scale-ratio", type=float, help="Max. scale ratio", ) group.add_argument( "--anchor-generator.ssd.no-clipping", action="store_true", help="Don't clip the anchors", ) group.add_argument( "--anchor-generator.ssd.step", type=int, default=[1], nargs="+", help="Step between pixels", ) return parser def num_anchors_per_os(self) -> List: """ Returns anchors per output stride for SSD """ return [2 + 2 * len(ar) for os, ar in self.output_strides_aspect_ratio.items()] @torch.no_grad() def _generate_anchors( self, height: int, width: int, output_stride: int, device: Optional[str] = "cpu", *args, **kwargs ) -> Tensor: min_size_h = self.sizes[output_stride]["min"] min_size_w = self.sizes[output_stride]["min"] max_size_h = self.sizes[output_stride]["max"] max_size_w = self.sizes[output_stride]["max"] aspect_ratio = self.output_strides_aspect_ratio[output_stride] step = max(1, self.sizes[output_stride]["step"]) default_anchors_ctr = [] start_step = max(0, step // 2) # Note that feature maps are in NCHW format for y, x in product( range(start_step, height, step), range(start_step, width, step) ): # [x, y, w, h] format cx = (x + 0.5) / width cy = (y + 0.5) / height # small box size default_anchors_ctr.append([cx, cy, min_size_w, min_size_h]) # big box size default_anchors_ctr.append([cx, cy, max_size_w, max_size_h]) # change h/w ratio of the small sized box based on aspect ratios for ratio in aspect_ratio: ratio = ratio**0.5 default_anchors_ctr.extend( [ [cx, cy, min_size_w * ratio, min_size_h / ratio], [cx, cy, min_size_w / ratio, min_size_h * ratio], ] ) default_anchors_ctr = torch.tensor( default_anchors_ctr, dtype=torch.float, device=device ) if self.clip: default_anchors_ctr = torch.clamp(default_anchors_ctr, min=0.0, max=1.0) return default_anchors_ctr ================================================ FILE: corenet/modeling/image_projection_layers/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.image_projection_layers.base_image_projection import ( BaseImageProjectionHead, ) from corenet.utils import logger from corenet.utils.registry import Registry IMAGE_PROJECTION_HEAD_REGISTRY = Registry( "image_projection_head", base_class=BaseImageProjectionHead, lazy_load_dirs=["corenet/modeling/image_projection_layers"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_image_projection_head( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: """Register arguments of all image projection heads.""" # add arguments for base image projection layer parser = BaseImageProjectionHead.add_arguments(parser) # add class specific arguments parser = IMAGE_PROJECTION_HEAD_REGISTRY.all_arguments(parser) return parser def build_image_projection_head( opts: argparse.Namespace, in_dim: int, out_dim: int, *args, **kwargs ) -> BaseImageProjectionHead: """Helper function to build an image projection head from command-line arguments. Args: opts: Command-line arguments in_dim: Input dimension to the projection head. out_dim: Output dimension of the projection head. Returns: Image projection head module. """ # Get the name of image projection head image_projection_head_name = getattr(opts, "model.image_projection_head.name") # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if image_projection_head_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") image_projection_head = IMAGE_PROJECTION_HEAD_REGISTRY[image_projection_head_name]( opts, in_dim, out_dim, *args, **kwargs ) return image_projection_head ================================================ FILE: corenet/modeling/image_projection_layers/attention_pool_2d.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.image_projection_layers import ( IMAGE_PROJECTION_HEAD_REGISTRY, BaseImageProjectionHead, ) from corenet.modeling.layers import MultiHeadAttention, PositionalEmbedding from corenet.utils import logger @IMAGE_PROJECTION_HEAD_REGISTRY.register(name="attention_pool_nchw2nc") class AttentionPool2dHead(BaseImageProjectionHead): """This class implements attention pooling layer, as described in `Clip `_, and should be used for CNN-style models, including MobileViTs""" def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) num_embeddings = getattr( opts, "model.image_projection_head.attention_pool_nchw2nc.num_pos_embeddings", None, ) if num_embeddings is None: logger.error( "Number of embeddings can't be None in {}. Please specify using " "--model.image-projection.attention-pool-2d.num-pos-embeddings argument".format( self.__class__.__name__ ) ) sin_pos_emb = getattr( opts, "model.image_projection_head.attention_pool_nchw2nc.use_sinusoidal_pos_embeddings", False, ) num_heads = getattr( opts, "model.image_projection_head.attention_pool_nchw2nc.num_attn_heads", 8 ) self.use_pytorch_mha = getattr( opts, "model.image_projection_head.attention_pool_nchw2nc.use_pytorch_mha", False, ) self.positional_embedding = PositionalEmbedding( opts, num_embeddings=num_embeddings, embedding_dim=in_dim, padding_idx=None, is_learnable=not sin_pos_emb, sequence_first=self.use_pytorch_mha, ) self.multi_head_attn = MultiHeadAttention( embed_dim=in_dim, num_heads=num_heads, output_dim=out_dim ) self.embed_dim = in_dim self.projection_dim = out_dim if out_dim is not None else in_dim self.sin_pos_emb = sin_pos_emb self.normalize_features = not getattr( opts, "model.image_projection_head.attention_pool_nchw2nc.no_feature_normalization", False, ) self.reset_parameters() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.image-projection-head.attention-pool-nchw2nc.num-pos-embeddings", type=int, default=None, help="Number of positional embeddings", ) group.add_argument( "--model.image-projection-head.attention-pool-nchw2nc.use-sinusoidal-pos-embeddings", action="store_true", help="Use sinusoidal positional embeddings instead of learnable", ) group.add_argument( "--model.image-projection-head.attention-pool-nchw2nc.num-attn-heads", type=int, default=8, help="Number of attention heads in {}".format(cls.__name__), ) group.add_argument( "--model.image-projection-head.attention-pool-nchw2nc.no-feature-normalization", action="store_true", help="Don't normalize image features", ) group.add_argument( "--model.image-projection-head.attention-pool-nchw2nc.use-pytorch-mha", action="store_true", help="Use Pytorch Multi-head attention", ) return parser def reset_parameters(self): std = self.projection_dim**-0.5 nn.init.normal_(self.multi_head_attn.qkv_proj.weight, mean=0.0, std=std) nn.init.normal_(self.multi_head_attn.out_proj.weight, mean=0.0, std=std) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: assert ( x.dim() == 4 ), "Input should be 4-dimensional (Batch, in_channels, height, width). Got: {}".format( x.shape ) # x is [batch, in_channels, height, width] # For CNN-style architectures, including MobileViTs batch_size, in_channels, in_height, in_width = x.shape # Flatten the feature map # [batch, in_channels, height, width] --> [batch, in_channels, height*width] x = x.reshape(batch_size, in_channels, in_height * in_width) if self.use_pytorch_mha: # we need sequence first. # [batch, in_channels, height*width] --> [height*width, batch, in_channels] x = x.permute(2, 0, 1) # global pool # [height*width, batch, in_channels] --> [1, batch, in_channels] global_token = torch.mean(x, dim=0, keepdim=True) num_pixels = x.shape[0] # add positional embedding to pixels pos_emb = self.positional_embedding(num_pixels).to( device=x.device, dtype=x.dtype ) x = x + pos_emb # concat the global token with pixel tokens # [1, batch, in_channels] || [height*width, batch, in_channels] --> [1 + height*width, batch, in_channels] x = torch.cat([global_token, x], dim=0) # do attention x = self.multi_head_attn(x, use_pytorch_mha=True) # extract embeddings corresponding to global token x = x[0] else: # [batch, in_channels, height*width] --> # [batch, height*width, in_channels] x = x.transpose(1, 2) # global pool # [batch, height*width, in_channels] --> [batch, 1, in_channels] global_token = torch.mean(x, dim=1, keepdim=True) num_pixels = x.shape[1] # add positional embedding to pixels pos_emb = self.positional_embedding(num_pixels).to( device=x.device, dtype=x.dtype ) x = x + pos_emb # concat the global token with pixel tokens # [batch, 1, in_channels] || [batch, height*width, in_channels] --> [batch, 1 + height*width, in_channels] x = torch.cat([global_token, x], dim=1) # do attention x = self.multi_head_attn(x, use_pytorch_mha=False) # extract embeddings corresponding to global token x = x[:, 0] if self.normalize_features: x = F.normalize(x, dim=-1) return x ================================================ FILE: corenet/modeling/image_projection_layers/base_image_projection.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional from torch import nn from corenet.modeling.layers import LinearLayer from corenet.modeling.misc.common import parameter_list class BaseImageProjectionHead(nn.Module): """Base class that projects image representations to the same space as text representations""" def __init__(self, opts, *args, **kwargs) -> None: super().__init__() self.lr_mult = getattr(opts, "model.image_projection_head.lr_multiplier", 1.0) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): """Add model specific arguments""" group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.image-projection-head.name", type=str, default=None, help="Name of the image projection head", ) group.add_argument( "--model.image-projection-head.lr-multiplier", type=float, default=1.0, help="LR multiplier for image projection head", ) return parser def reset_parameters(self) -> None: """Reset weights of a given layer""" raise NotImplementedError def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ): param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, ) return param_list, [self.lr_mult] * len(param_list) def forward(self, input: Dict, *args, **kwargs) -> Dict: raise NotImplementedError def get_in_feature_dimension(image_classifier: nn.Module) -> int: """Return the input feature dimension to the image classification head.""" in_features = None if isinstance(image_classifier, nn.Sequential): # Classifier that uses nn.Sequential usually has global pooling and # multiple linear layers. Find the first linear layer and get its # in_features for layer in image_classifier: if isinstance(layer, (nn.Linear, LinearLayer)): in_features = layer.in_features break elif isinstance(image_classifier, (nn.Linear, LinearLayer)): in_features = image_classifier.in_features if in_features is None: raise NotImplementedError( f"Cannot get input feature dimension of {image_classifier}." ) return in_features ================================================ FILE: corenet/modeling/image_projection_layers/global_pool_2d.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.image_projection_layers import ( IMAGE_PROJECTION_HEAD_REGISTRY, BaseImageProjectionHead, ) from corenet.modeling.layers import GlobalPool from corenet.utils import logger from corenet.utils.ddp_utils import is_master @IMAGE_PROJECTION_HEAD_REGISTRY.register(name="global_pool_nchw2nc") class GlobalPool2D(BaseImageProjectionHead): """This class implements global pooling with linear projection""" def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) scale = in_dim**-0.5 self.use_identity = ( getattr( opts, "model.image_projection_head.global_pool_nchw2nc.identity_if_same_size", ) and in_dim == out_dim ) self.pool = GlobalPool(pool_type="mean", keep_dim=False) if not self.use_identity: self.proj = nn.Parameter(scale * torch.randn(size=(in_dim, out_dim))) else: if is_master(opts): logger.log( f"Using identity projection for GlobalPool2D given input/out size = {in_dim}." ) self.in_dim = in_dim self.out_dim = out_dim self.feature_normalization = not getattr( opts, "model.image_projection_head.global_pool_nchw2nc.no_feature_normalization", ) self.reset_parameters() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.image-projection-head.global-pool-nchw2nc.no-feature-normalization", action="store_true", help="Don't normalize image features. Defaults to False.", ) group.add_argument( "--model.image-projection-head.global-pool-nchw2nc.identity-if-same-size", action="store_true", help="Use identity projection when projection input/output dims" " are the same. Defaults to False.", ) return parser def reset_parameters(self): pass def forward(self, x: Tensor, *args, **kwargs) -> Tensor: # x is of shape [batch, in_dim] assert ( x.dim() == 4 ), "Input should be 4-dimensional (Batch x in_dim x in_height x in_width). Got: {}".format( x.shape ) # [batch, in_dim, in_height, in_width] --> [batch, in_dim] x = self.pool(x) # [batch, in_dim] x [in_dim, out_dim] --> [batch, out_dim] if not self.use_identity: x = x @ self.proj if self.feature_normalization: x = F.normalize(x, dim=-1) return x ================================================ FILE: corenet/modeling/image_projection_layers/simple_projection_head.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.image_projection_layers import ( IMAGE_PROJECTION_HEAD_REGISTRY, BaseImageProjectionHead, ) from corenet.utils import logger from corenet.utils.ddp_utils import is_master @IMAGE_PROJECTION_HEAD_REGISTRY.register(name="simple_projection_nc2nc") class SimpleImageProjectionHead(BaseImageProjectionHead): """This class implements simple projection head""" def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) scale = in_dim**-0.5 self.use_identity = ( getattr( opts, "model.image_projection_head.simple_projection_nc2nc.identity_if_same_size", ) and in_dim == out_dim ) if not self.use_identity: self.proj = nn.Parameter(scale * torch.randn(size=(in_dim, out_dim))) else: if is_master(opts): logger.log( f"Using identity projection for SimpleImageProjectionHead given input/out size = {in_dim}." ) self.in_dim = in_dim self.out_dim = out_dim self.feature_normalization = not getattr( opts, "model.image_projection_head.simple_projection_nc2nc.no_feature_normalization", ) self.reset_parameters() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.image-projection-head.simple-projection-nc2nc.no-feature-normalization", action="store_true", help="Don't normalize image features. Defaults to False.", ) group.add_argument( "--model.image-projection-head.simple-projection-nc2nc.identity-if-same-size", action="store_true", help="Use identity projection when projection input/output dims" " are the same. Defaults to False", ) return parser def reset_parameters(self): pass def forward(self, x: Tensor, *args, **kwargs) -> Tensor: # x is of shape [batch, in_dim] assert ( x.dim() == 2 ), "Input should be 2-dimensional (Batch x in_dim). Got: {}".format(x.shape) if not self.use_identity: # [batch, in_dim] x [in_dim, out_dim] --> [batch, out_dim] x = x @ self.proj if self.feature_normalization: x = F.normalize(x, dim=-1) return x ================================================ FILE: corenet/modeling/layers/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import importlib import inspect import os from corenet.modeling.layers.adaptive_pool import AdaptiveAvgPool2d from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.conv_layer import ( ConvLayer1d, ConvLayer2d, ConvLayer3d, NormActLayer, SeparableConv1d, SeparableConv2d, SeparableConv3d, TransposeConvLayer2d, ) from corenet.modeling.layers.dropout import Dropout, Dropout2d from corenet.modeling.layers.embedding import Embedding from corenet.modeling.layers.flash_multi_head_attention import ( FlashMultiHeadSelfAttention, ) from corenet.modeling.layers.flatten import Flatten from corenet.modeling.layers.global_pool import GlobalPool from corenet.modeling.layers.identity import Identity from corenet.modeling.layers.linear_attention import LinearSelfAttention from corenet.modeling.layers.linear_layer import GroupLinear, LinearLayer from corenet.modeling.layers.multi_head_attention import MultiHeadAttention from corenet.modeling.layers.normalization_layers import ( get_normalization_layer, norm_layers_tuple, ) from corenet.modeling.layers.pixel_shuffle import PixelShuffle from corenet.modeling.layers.pooling import AvgPool2d, MaxPool2d from corenet.modeling.layers.positional_embedding import PositionalEmbedding from corenet.modeling.layers.rotary_embeddings import RotaryEmbedding from corenet.modeling.layers.single_head_attention import SingleHeadAttention from corenet.modeling.layers.softmax import Softmax from corenet.modeling.layers.stochastic_depth import StochasticDepth from corenet.modeling.layers.upsample import UpSample __all__ = [ "ConvLayer1d", "ConvLayer2d", "ConvLayer3d", "SeparableConv1d", "SeparableConv2d", "SeparableConv3d", "NormActLayer", "TransposeConvLayer2d", "LinearLayer", "GroupLinear", "GlobalPool", "Identity", "PixelShuffle", "UpSample", "MaxPool2d", "AvgPool2d", "Dropout", "Dropout2d", "Flatten", "MultiHeadAttention", "SingleHeadAttention", "Softmax", "LinearSelfAttention", "Embedding", "PositionalEmbedding", "norm_layers_tuple", "StochasticDepth", "get_normalization_layer", "RotaryEmbedding", "FlashMultiHeadSelfAttention", ] # iterate through all classes and fetch layer specific arguments def layer_specific_args(parser: argparse.ArgumentParser): layer_dir = os.path.dirname(__file__) parsed_layers = [] for file in os.listdir(layer_dir): path = os.path.join(layer_dir, file) if ( not file.startswith("_") and not file.startswith(".") and (file.endswith(".py") or os.path.isdir(path)) ): layer_name = file[: file.find(".py")] if file.endswith(".py") else file module = importlib.import_module("corenet.modeling.layers." + layer_name) for name, cls in inspect.getmembers(module, inspect.isclass): if issubclass(cls, BaseLayer) and name not in parsed_layers: parser = cls.add_arguments(parser) parsed_layers.append(name) return parser def arguments_nn_layers(parser: argparse.ArgumentParser): # Retrieve layer specific arguments parser = layer_specific_args(parser) # activation and normalization arguments from corenet.modeling.layers.activation import arguments_activation_fn parser = arguments_activation_fn(parser) from corenet.modeling.layers.normalization import arguments_norm_layers parser = arguments_norm_layers(parser) return parser ================================================ FILE: corenet/modeling/layers/activation/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import importlib import os from typing import Optional import torch.nn from corenet.utils import logger SUPPORTED_ACT_FNS = [] ACT_FN_REGISTRY = {} def register_act_fn(name): def register_fn(cls): if name in SUPPORTED_ACT_FNS: raise ValueError( "Cannot register duplicate activation function ({})".format(name) ) SUPPORTED_ACT_FNS.append(name) ACT_FN_REGISTRY[name] = cls return cls return register_fn def arguments_activation_fn(parser: argparse.ArgumentParser): group = parser.add_argument_group( title="Non-linear functions", description="Non-linear functions" ) group.add_argument( "--model.activation.name", default="relu", type=str, help="Non-linear function name", ) group.add_argument( "--model.activation.inplace", action="store_true", help="Use non-linear functions inplace", ) group.add_argument( "--model.activation.neg-slope", default=0.1, type=float, help="Negative slope in leaky relu function", ) return parser def build_activation_layer( opts: argparse.Namespace, act_type: Optional[str] = None, inplace: Optional[bool] = None, negative_slope: Optional[float] = None, num_parameters: int = -1, ) -> torch.nn.Module: """ Helper function to build the activation function. If any of the optional arguments are not provided (i.e. None), the corresponding ``model.activation.*`` config entry will be used as default value. Args: act_type: Name of the activation layer. Default: --model.activation.name config value. inplace: If true, operation will be inplace. Default: --model.activation.inplace config value. negative_slope: Negative slope parameter for leaky_relu. Default: --model.activation.neg_slop config value. """ assert isinstance( opts, argparse.Namespace ), f"Expected first argument to be an argparse.Namespace, but received a {type(opts)}." if act_type is None: act_type = getattr(opts, "model.activation.name") if inplace is None: inplace = getattr(opts, "model.activation.inplace") if negative_slope is None: negative_slope = getattr(opts, "model.activation.neg_slope") act_type = act_type.lower() act_layer = None if act_type in ACT_FN_REGISTRY: act_layer = ACT_FN_REGISTRY[act_type]( num_parameters=num_parameters, inplace=inplace, negative_slope=negative_slope, ) else: logger.error( "Supported activation layers are: {}. Supplied argument is: {}".format( SUPPORTED_ACT_FNS, act_type ) ) return act_layer # automatically import different activation functions act_dir = os.path.dirname(__file__) for file in os.listdir(act_dir): path = os.path.join(act_dir, file) if ( not file.startswith("_") and not file.startswith(".") and (file.endswith(".py") or os.path.isdir(path)) ): model_name = file[: file.find(".py")] if file.endswith(".py") else file module = importlib.import_module( "corenet.modeling.layers.activation." + model_name ) ================================================ FILE: corenet/modeling/layers/activation/gelu.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="gelu") class GELU(nn.GELU): """ Applies the `Gaussian Error Linear Units `_ function """ def __init__(self, *args, **kwargs) -> None: super().__init__() ================================================ FILE: corenet/modeling/layers/activation/hard_sigmoid.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="hard_sigmoid") class Hardsigmoid(nn.Hardsigmoid): """ Applies the `Hard Sigmoid `_ function """ def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None: super().__init__(inplace=inplace) def forward(self, input: Tensor, *args, **kwargs) -> Tensor: if hasattr(F, "hardsigmoid"): return F.hardsigmoid(input, self.inplace) else: return F.relu(input + 3) / 6 ================================================ FILE: corenet/modeling/layers/activation/hard_swish.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="hard_swish") class Hardswish(nn.Hardswish): """ Applies the HardSwish function, as described in the paper `Searching for MobileNetv3 `_ """ def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None: super().__init__(inplace=inplace) def forward(self, input: Tensor, *args, **kwargs) -> Tensor: if hasattr(F, "hardswish"): return F.hardswish(input, self.inplace) else: x_hard_sig = F.relu(input + 3) / 6 return input * x_hard_sig ================================================ FILE: corenet/modeling/layers/activation/leaky_relu.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="leaky_relu") class LeakyReLU(nn.LeakyReLU): """ Applies a leaky relu function. See `Rectifier Nonlinearities Improve Neural Network Acoustic Models` for more details. """ def __init__( self, negative_slope: Optional[float] = 1e-2, inplace: Optional[bool] = False, *args, **kwargs ) -> None: super().__init__(negative_slope=negative_slope, inplace=inplace) ================================================ FILE: corenet/modeling/layers/activation/prelu.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="prelu") class PReLU(nn.PReLU): """ Applies the `Parametric Rectified Linear Unit `_ function """ def __init__( self, num_parameters: Optional[int] = 1, init: Optional[float] = 0.25, *args, **kwargs ) -> None: super().__init__(num_parameters=num_parameters, init=init) ================================================ FILE: corenet/modeling/layers/activation/relu.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="relu") class ReLU(nn.ReLU): """ Applies Rectified Linear Unit function """ def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None: super().__init__(inplace=inplace) ================================================ FILE: corenet/modeling/layers/activation/relu6.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="relu6") class ReLU6(nn.ReLU6): """ Applies the ReLU6 function """ def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None: super().__init__(inplace=inplace) ================================================ FILE: corenet/modeling/layers/activation/sigmoid.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="sigmoid") class Sigmoid(nn.Sigmoid): """ Applies the sigmoid function """ def __init__(self, *args, **kwargs) -> None: super().__init__() ================================================ FILE: corenet/modeling/layers/activation/swish.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="swish") class Swish(nn.SiLU): """ Applies the `Swish (also known as SiLU) `_ function. """ def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None: super().__init__(inplace=inplace) ================================================ FILE: corenet/modeling/layers/activation/tanh.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor, nn from corenet.modeling.layers.activation import register_act_fn @register_act_fn(name="tanh") class Tanh(nn.Tanh): """ Applies Tanh function """ def __init__(self, *args, **kwargs) -> None: super().__init__() ================================================ FILE: corenet/modeling/layers/adaptive_pool.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Tuple, Union from torch import Tensor, nn class AdaptiveAvgPool2d(nn.AdaptiveAvgPool2d): """ Applies a 2D adaptive average pooling over an input tensor. Args: output_size (Optional, int or Tuple[int, int]): The target output size. If a single int :math:`h` is passed, then a square output of size :math:`hxh` is produced. If a tuple of size :math:`hxw` is passed, then an output of size `hxw` is produced. Default is 1. Shape: - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`H` is the input height, and :math:`W` is the input width - Output: :math:`(N, C, h, h)` or :math:`(N, C, h, w)` """ def __init__( self, output_size: Union[int, Tuple[int, int]] = 1, *args, **kwargs ) -> None: super().__init__(output_size=output_size) ================================================ FILE: corenet/modeling/layers/base_layer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List, Optional, Tuple from torch import nn from corenet.modeling.misc.common import parameter_list class BaseLayer(nn.Module): """ Base class for neural network layers. Subclass must implement `forward` function. """ def __init__(self, *args, **kwargs) -> None: super().__init__() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add layer specific arguments""" return parser def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs ) -> Tuple[List[Dict], List[float]]: """ Get parameters for training along with the learning rate. Args: weight_decay: weight decay no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False. Returns: Returns a tuple of length 2. The first entry is a list of dictionary with three keys (params, weight_decay, param_names). The second entry is a list of floats containing learning rate for each parameter. Note: Learning rate multiplier is set to 1.0 here as it is handled inside the Central Model. """ param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs ) return param_list, [1.0] * len(param_list) def forward(self, *args, **kwargs) -> Any: """Forward function.""" raise NotImplementedError("Sub-classes should implement forward method") def __repr__(self): return "{}".format(self.__class__.__name__) ================================================ FILE: corenet/modeling/layers/conv_layer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple, Type, Union from torch import Tensor, nn from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.normalization.layer_norm import LayerNorm, LayerNorm2D_NCHW from corenet.modeling.layers.normalization_layers import get_normalization_layer from corenet.utils import logger class Conv2d(nn.Conv2d): """ Applies a 2D convolution over an input. Args: in_channels: :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`. out_channels: :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})`. kernel_size: Kernel size for convolution. stride: Stride for convolution. Default: 1. padding: Padding for convolution. Default: 0. dilation: Dilation rate for convolution. Default: 1. groups: Number of groups in convolution. Default: 1. bias: Use bias. Default: ``False``. padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular'). Default: ``zeros``. use_norm: Use normalization layer after convolution. Default: ``True``. use_act: Use activation layer after convolution (or convolution and normalization). Default: ``True``. act_name: Use specific activation function. Overrides the one specified in command line args. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})`. - Output: :math:`(N, C_{out}, H_{out}, W_{out})`. """ def __init__( self, in_channels: int, out_channels: int, kernel_size: Union[int, Tuple[int, int]], stride: Optional[Union[int, Tuple[int, int]]] = 1, padding: Optional[Union[int, Tuple[int, int]]] = 0, dilation: Optional[Union[int, Tuple[int, int]]] = 1, groups: Optional[int] = 1, bias: Optional[bool] = False, padding_mode: Optional[str] = "zeros", *args, **kwargs, ) -> None: super().__init__( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias, padding_mode=padding_mode, ) class _BaseConvNormActLayer(BaseLayer): """ Applies an N-dimensional convolution over an input. Args: opts: Command line options. in_channels: :math:`C_{out}` from an expected output of size :math:`(bs, C_{in}, X_{1}, ..., X_{N})`. out_channels: :math:`C_{out}` from an expected output of size :math:`(bs, C_{out}, Y_{1}, ..., Y_{N})`. kernel_size: Kernel size for convolution. An integer, or tuple of length ``N``. stride: Stride for convolution. An integer, or tuple of length ``N``. Default: 1. dilation: Dilation rate for convolution. An integer, or tuple of length ``N``. Default: ``1``. padding: Padding for convolution. An integer, or tuple of length ``N``. If not specified, padding is automatically computed based on kernel size and dilation range. Default : ``None`` (equivalent to ``[ int((kernel_size[i] - 1) / 2) * dilation[i] for i in range(N)]``). groups: Number of groups in convolution. Default: ``1``. bias: Use bias. Default: ``False``. padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular'). Default: ``zeros``. use_norm: Use normalization layer after convolution. Default: ``True``. use_act: Use activation layer after convolution (or convolution and normalization). Default: ``True``. norm_layer: If not None, the provided normalization layer object will be used. Otherwise, a normalization object will be created based on config ``model.normalization.*`` opts. act_layer: If not None, the provided activation function will be used. Otherwise, an activation function will be created based on config ``model.activation.*`` opts. Shape: - Input: :math:`(bs, C_{in}, X_{1}, ..., X_{N})`. - Output: :math:`(bs, C_{out}, Y_{1}, ..., Y_{N})`. .. note:: For depth-wise convolution, `groups=C_{in}=C_{out}`. """ @property def ndim(self) -> int: raise NotImplementedError("subclasses should override ndim property") @property def module_cls(self) -> Type[nn.Module]: raise NotImplementedError("subclasses should override module_cls property") def __init__( self, opts: argparse.Namespace, in_channels: int, out_channels: int, kernel_size: Union[int, Tuple[int, ...]], stride: Union[int, Tuple[int, ...]] = 1, dilation: Union[int, Tuple[int, ...]] = 1, padding: Optional[Union[int, Tuple[int, ...]]] = None, groups: int = 1, bias: bool = False, padding_mode: str = "zeros", use_norm: bool = True, use_act: bool = True, norm_layer: Optional[nn.Module] = None, act_layer: Optional[nn.Module] = None, *args, **kwargs, ) -> None: super().__init__() if norm_layer is None and use_norm: norm_type = getattr(opts, "model.normalization.name") if norm_type == "batch_norm": norm_type = f"batch_norm_{self.ndim}d" norm_layer = get_normalization_layer( opts=opts, num_features=out_channels, norm_type=norm_type ) elif norm_layer is not None and not use_norm: logger.error( f"When use_norm is False, norm_layer should be None, but norm_layer={norm_layer} is provided." ) if act_layer is None and use_act: act_layer = build_activation_layer(opts, num_parameters=out_channels) elif act_layer is not None and not use_act: logger.error( f"When use_act is False, act_layer should be None, but act_layer={act_layer} is provided." ) if ( use_norm and any(param[0] == "bias" for param in norm_layer.named_parameters()) and bias ): assert ( not bias ), "Do not use bias when using normalization layers with bias." if use_norm and isinstance(norm_layer, (LayerNorm, LayerNorm2D_NCHW)): bias = True if isinstance(kernel_size, int): kernel_size = (kernel_size,) * self.ndim if isinstance(stride, int): stride = (stride,) * self.ndim if isinstance(dilation, int): dilation = (dilation,) * self.ndim assert isinstance(kernel_size, Tuple) assert isinstance(stride, Tuple) assert isinstance(dilation, Tuple) if padding is None: padding = ( int((kernel_size[i] - 1) / 2) * dilation[i] for i in range(self.ndim) ) if in_channels % groups != 0: logger.error( "Input channels are not divisible by groups. {}%{} != 0 ".format( in_channels, groups ) ) if out_channels % groups != 0: logger.error( "Output channels are not divisible by groups. {}%{} != 0 ".format( out_channels, groups ) ) block = nn.Sequential() conv_layer = self.module_cls( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, # type: ignore stride=stride, # type: ignore padding=padding, dilation=dilation, # type: ignore groups=groups, bias=bias, padding_mode=padding_mode, ) block.add_module(name="conv", module=conv_layer) self.norm_name = None if use_norm: block.add_module(name="norm", module=norm_layer) self.norm_name = norm_layer.__class__.__name__ self.act_name = None if use_act: block.add_module(name="act", module=act_layer) self.act_name = act_layer.__class__.__name__ self.block = block self.in_channels = in_channels self.out_channels = out_channels self.stride = stride self.groups = groups self.kernel_size = conv_layer.kernel_size self.bias = bias self.dilation = dilation @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): if cls != _BaseConvNormActLayer: return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.layer.conv-init", type=str, default="kaiming_normal", help="Init type for conv layers", ) parser.add_argument( "--model.layer.conv-init-std-dev", type=float, default=None, help="Std deviation for conv layers", ) return parser def forward(self, x: Tensor) -> Tensor: return self.block(x) def __repr__(self): repr_str = self.block[0].__repr__() repr_str = repr_str[:-1] if self.norm_name is not None: repr_str += ", normalization={}".format(self.norm_name) if self.act_name is not None: repr_str += ", activation={}".format(self.act_name) repr_str += ")" return repr_str class ConvLayer1d(_BaseConvNormActLayer): ndim = 1 module_cls = nn.Conv1d class ConvLayer2d(_BaseConvNormActLayer): ndim = 2 module_cls = Conv2d class ConvLayer3d(_BaseConvNormActLayer): ndim = 3 module_cls = nn.Conv3d class TransposeConvLayer2d(BaseLayer): """ Applies a 2D Transpose convolution (aka as Deconvolution) over an input. Args: opts: Command line arguments. in_channels: :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`. out_channels: :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})`. kernel_size: Kernel size for convolution. stride: Stride for convolution. Default: 1. dilation: Dilation rate for convolution. Default: 1. groups: Number of groups in convolution. Default: 1. bias: Use bias. Default: ``False``. padding_mode: Padding mode. Default: ``zeros``. use_norm: Use normalization layer after convolution. Default: ``True``. use_act: Use activation layer after convolution (or convolution and normalization). Default: ``True``. norm_layer: If not None, the provided normalization layer object will be used. Otherwise, a normalization object will be created based on config ``model.normalization.*`` opts. padding: Padding will be done on both sides of each dimension in the input. output_padding: Additional padding on the output tensor. auto_padding: Compute padding automatically. Default: ``True``. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})`. - Output: :math:`(N, C_{out}, H_{out}, W_{out})`. """ def __init__( self, opts: argparse.Namespace, in_channels: int, out_channels: int, kernel_size: Union[int, Tuple], stride: Optional[Union[int, Tuple]] = 1, dilation: Optional[Union[int, Tuple]] = 1, groups: Optional[int] = 1, bias: Optional[bool] = False, padding_mode: Optional[str] = "zeros", use_norm: Optional[bool] = True, use_act: Optional[bool] = True, norm_layer: Optional[nn.Module] = None, padding: Optional[Union[int, Tuple]] = (0, 0), output_padding: Optional[Union[int, Tuple]] = None, auto_padding: Optional[bool] = True, ) -> None: super().__init__() if norm_layer is None and use_norm: norm_type = getattr(opts, "model.normalization.name") norm_layer = get_normalization_layer( opts=opts, num_features=out_channels, norm_type=norm_type ) elif norm_layer is not None and not use_norm: logger.error( f"When use_norm is False, norm_layer should be None, but norm_layer={norm_layer} is provided." ) if ( use_norm and any(param[0] == "bias" for param in norm_layer.named_parameters()) and bias ): assert ( not bias ), "Do not use bias when using normalization layers with bias." if use_norm and isinstance(norm_layer, (LayerNorm, LayerNorm2D_NCHW)): bias = True if isinstance(kernel_size, int): kernel_size = (kernel_size, kernel_size) if isinstance(stride, int): stride = (stride, stride) if isinstance(dilation, int): dilation = (dilation, dilation) if output_padding is None: output_padding = (stride[0] - 1, stride[1] - 1) assert isinstance(kernel_size, (tuple, list)) assert isinstance(stride, (tuple, list)) assert isinstance(dilation, (tuple, list)) if auto_padding: padding = ( int((kernel_size[0] - 1) / 2) * dilation[0], int((kernel_size[1] - 1) / 2) * dilation[1], ) if in_channels % groups != 0: logger.error( "Input channels are not divisible by groups. {}%{} != 0 ".format( in_channels, groups ) ) if out_channels % groups != 0: logger.error( "Output channels are not divisible by groups. {}%{} != 0 ".format( out_channels, groups ) ) block = nn.Sequential() conv_layer = nn.ConvTranspose2d( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias, padding_mode=padding_mode, output_padding=output_padding, ) block.add_module(name="conv", module=conv_layer) self.norm_name = None if use_norm: block.add_module(name="norm", module=norm_layer) self.norm_name = norm_layer.__class__.__name__ self.act_name = None act_type = getattr(opts, "model.activation.name", "relu") if act_type is not None and use_act: act_layer = build_activation_layer( opts, act_type=act_type, num_parameters=out_channels, ) block.add_module(name="act", module=act_layer) self.act_name = act_layer.__class__.__name__ self.block = block self.in_channels = in_channels self.out_channels = out_channels self.stride = stride self.groups = groups self.kernel_size = conv_layer.kernel_size self.bias = bias def forward(self, x: Tensor) -> Tensor: return self.block(x) def __repr__(self): repr_str = self.block[0].__repr__() repr_str = repr_str[:-1] if self.norm_name is not None: repr_str += ", normalization={}".format(self.norm_name) if self.act_name is not None: repr_str += ", activation={}".format(self.act_name) repr_str += ")" return repr_str class NormActLayer(BaseLayer): """ Applies a normalization layer followed by an activation layer. Args: opts: Command-line arguments. num_features: :math:`C` from an expected input of size :math:`(N, C, H, W)`. Shape: - Input: :math:`(N, C, H, W)`. - Output: :math:`(N, C, H, W)`. """ def __init__(self, opts, num_features, *args, **kwargs): super().__init__() block = nn.Sequential() self.norm_name = None norm_layer = get_normalization_layer(opts=opts, num_features=num_features) block.add_module(name="norm", module=norm_layer) self.norm_name = norm_layer.__class__.__name__ self.act_name = None act_layer = build_activation_layer( opts, num_parameters=num_features, ) block.add_module(name="act", module=act_layer) self.act_name = act_layer.__class__.__name__ self.block = block def forward(self, x: Tensor) -> Tensor: return self.block(x) def __repr__(self): repr_str = "{}(normalization={}, activation={})".format( self.__class__.__name__, self.norm_type, self.act_type ) return repr_str class _BaseSeparableConv(BaseLayer): """ Applies an N-dimensional depth-wise separable convolution over an N-dimensional input tensor. Args: opts: Command line arguments. in_channels: :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, X_{1}, ..., X_{N})`. out_channels: :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, Y_{1}, ..., Y_{N})`. kernel_size: Kernel size for convolution. stride: Stride for convolution. Default: 1. dilation: Dilation rate for convolution. Default: 1. use_norm: Use normalization layer after convolution. Default: ``True``. use_act: Use activation layer after convolution (or convolution and normalization). Default: ``True``. use_act_deptwise: Use activation layer after depthwise convolution (or convolution and normalization). Default: ``False``. NOTE: We recommend against using activation function in depth-wise convolution. bias: Use bias. Default: ``False``. padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular'). Default: ``zeros``. act_name: Use specific activation function. Overrides the one specified in command line args. Default: ``None``. Shape: - Input: :math:`(N, C_{in}, X_{1}, ..., X_{N})`. - Output: :math:`(N, C_{out}, Y_{1}, ..., Y_{N})`. .. note:: For depth-wise convolution, `groups=C_{in}=C_{out}`. """ def __init__( self, opts: argparse.Namespace, in_channels: int, out_channels: int, kernel_size: Union[int, Tuple[int, ...]], stride: Union[int, Tuple[int, ...]] = 1, dilation: Union[int, Tuple[int, ...]] = 1, use_norm: bool = True, use_act: bool = True, use_act_depthwise: bool = False, bias: bool = False, padding_mode: str = "zeros", act_name: Optional[str] = None, *args, **kwargs, ) -> None: super().__init__(*args, **kwargs) self.dw_conv = self.conv_layer_cls( opts=opts, in_channels=in_channels, out_channels=in_channels, kernel_size=kernel_size, stride=stride, dilation=dilation, groups=in_channels, bias=False, padding_mode=padding_mode, use_norm=True, # NOTE: We recommend against using activation function in depth-wise convolution. use_act=use_act_depthwise, act_name=act_name, ) self.pw_conv = self.conv_layer_cls( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, dilation=1, groups=1, bias=bias, padding_mode=padding_mode, use_norm=use_norm, use_act=use_act, act_name=act_name, ) self.in_channels = in_channels self.out_channels = out_channels self.stride = stride self.kernel_size = kernel_size self.dilation = dilation @property def conv_layer_cls(self): raise NotImplementedError("Subclasses should override conv_layer_cls.") def __repr__(self): repr_str = "{}(in_channels={}, out_channels={}, kernel_size={}, stride={}, dilation={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.kernel_size, self.stride, self.dilation, ) return repr_str def forward(self, x: Tensor) -> Tensor: x = self.dw_conv(x) x = self.pw_conv(x) return x class SeparableConv1d(_BaseSeparableConv): conv_layer_cls = ConvLayer1d class SeparableConv2d(_BaseSeparableConv): conv_layer_cls = ConvLayer2d class SeparableConv3d(_BaseSeparableConv): conv_layer_cls = ConvLayer3d ================================================ FILE: corenet/modeling/layers/dropout.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn class Dropout(nn.Dropout): """ This layer, during training, randomly zeroes some of the elements of the input tensor with probability `p` using samples from a Bernoulli distribution. Args: p: probability of an element to be zeroed. Default: 0.5 inplace: If set to ``True``, will do this operation in-place. Default: ``False`` Shape: - Input: :math:`(N, *)` where :math:`N` is the batch size - Output: same as the input """ def __init__( self, p: Optional[float] = 0.5, inplace: Optional[bool] = False, *args, **kwargs ) -> None: super().__init__(p=p, inplace=inplace) class Dropout2d(nn.Dropout2d): """ This layer, during training, randomly zeroes some of the elements of the 4D input tensor with probability `p` using samples from a Bernoulli distribution. Args: p: probability of an element to be zeroed. Default: 0.5 inplace: If set to ``True``, will do this operation in-place. Default: ``False`` Shape: - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the input channels, :math:`H` is the input tensor height, and :math:`W` is the input tensor width - Output: same as the input """ def __init__(self, p: float = 0.5, inplace: bool = False): super().__init__(p=p, inplace=inplace) ================================================ FILE: corenet/modeling/layers/embedding.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.normalization_layers import get_normalization_layer from corenet.utils import logger class Embedding(nn.Embedding): r"""A lookup table that stores embeddings of a fixed dictionary and size. Args: num_embeddings (int): size of the dictionary of embeddings embedding_dim (int): the size of each embedding vector padding_idx (int, optional): If specified, the entries at :attr:`padding_idx` do not contribute to the gradient; therefore, the embedding vector at :attr:`padding_idx` is not updated during training, i.e. it remains as a fixed "pad". For a newly constructed Embedding, the embedding vector at :attr:`padding_idx` will default to all zeros, but can be updated to another value to be used as the padding vector. Shape: - Input: :math:`(*)`, IntTensor or LongTensor of arbitrary shape containing the indices to extract - Output: :math:`(*, H)`, where `*` is the input shape and :math:`H=\text{embedding\_dim}` """ def __init__( self, opts, num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None, *args, **kwargs ): super().__init__( num_embeddings=num_embeddings, embedding_dim=embedding_dim, padding_idx=padding_idx, ) def reset_parameters(self) -> None: nn.init.normal_(self.weight, mean=0, std=self.embedding_dim**-0.5) if self.padding_idx is not None: nn.init.constant_(self.weight[self.padding_idx], 0) ================================================ FILE: corenet/modeling/layers/flash_multi_head_attention.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from packaging import version from torch import Tensor from torch.nn import functional as F from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.linear_layer import LinearLayer from corenet.utils import logger class FlashMultiHeadSelfAttention(BaseLayer): """Multi-head scaled dot-product attention using `flash attention `_. This layer uses efficient scaled-dot product attention implementation to reduce memory footprint and faster training. Args: in_features: Number of features in the input. head_dim: Head dimension. attn_dropout_prob: Attention dropout probability. Defaults to 0.0. qkv_features: Number of features after linear projection in QKV branch in multi-head attention. If None, qkv_features=in_features. Defaults to None. bias: Use bias or not. Defaults to False. """ def __init__( self, in_features: int, head_dim: int, attn_dropout_prob: float = 0.0, qkv_features: Optional[int] = None, bias: bool = False, ) -> None: sdpa_exists = hasattr(torch.nn.functional, "scaled_dot_product_attention") min_pytorch_supported_version = "2.0" is_supported_pytorch_version_available = version.parse( torch.__version__ ) >= version.parse(min_pytorch_supported_version) if not (sdpa_exists and is_supported_pytorch_version_available): logger.error( f"Please use PyTorch v{min_pytorch_supported_version} and above." ) if qkv_features is None: qkv_features = in_features if qkv_features % head_dim != 0: logger.error( f"QKV features should be divisible by head dimension in {self.__class__.__name__}. Got: {qkv_features} qkv_features and {head_dim} head dimension." ) num_attn_heads = qkv_features // head_dim super().__init__() self.qkv_proj = LinearLayer( in_features=in_features, out_features=3 * qkv_features, bias=bias, ) self.out_proj_attn = LinearLayer( in_features=qkv_features, out_features=in_features, bias=bias ) self.attn_dropout_prob = attn_dropout_prob self.num_heads = num_attn_heads self.head_dim = head_dim self.qkv_features = qkv_features def forward(self, x: Tensor) -> Tensor: """Forward function. Args: x: Input tensor of shape [batch size, number of tokens, embedding dim] Returns: Output tensor of the same size as the input. """ batch_size, num_tokens, embed_dim = x.shape qkv = self.qkv_proj(x) # [batch size, tokens, embedding dim] -> [batch size, tokens, 3, number of heads, head dim] qkv = qkv.reshape(batch_size, num_tokens, 3, self.num_heads, self.head_dim) # [batch size, tokens, 3, number of heads, head dim] --> [batch size, number of heads, 3, tokens, head dim] qkv = qkv.transpose(1, 3).contiguous() # [batch size, number of heads, 3, tokens, head dim] --> [batch size, number of heads, tokens, head dim] x 3 query, key, value = qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2] # efficient attention using Flash Attention CUDA kernels attn_output = F.scaled_dot_product_attention( query, key, value, attn_mask=None, dropout_p=self.attn_dropout_prob if self.training else 0, # For self-attention, causal masking is not required. is_causal=False, ) # [batch size, number of heads, tokens, head dim] --> [batch size, tokens, number of heads, head dim] attn_output = attn_output.transpose(1, 2).contiguous() # [batch size, tokens, number of heads, head dim] --> [batch size, tokens, number of heads * head dim] attn_output = attn_output.reshape(batch_size, num_tokens, self.qkv_features) y = self.out_proj_attn(attn_output) return y ================================================ FILE: corenet/modeling/layers/flatten.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn class Flatten(nn.Flatten): r""" This layer flattens a contiguous range of dimensions into a tensor. Args: start_dim (Optional[int]): first dim to flatten. Default: 1 end_dim (Optional[int]): last dim to flatten. Default: -1 Shape: - Input: :math:`(*, S_{\text{start}},..., S_{i}, ..., S_{\text{end}}, *)`,' where :math:`S_{i}` is the size at dimension :math:`i` and :math:`*` means any number of dimensions including none. - Output: :math:`(*, \prod_{i=\text{start}}^{\text{end}} S_{i}, *)`. """ def __init__(self, start_dim: Optional[int] = 1, end_dim: Optional[int] = -1): super(Flatten, self).__init__(start_dim=start_dim, end_dim=end_dim) ================================================ FILE: corenet/modeling/layers/global_pool.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List, Optional import torch from torch import Tensor from corenet.modeling.layers.base_layer import BaseLayer from corenet.utils import logger class GlobalPool(BaseLayer): """ This layers applies global pooling over a 4D or 5D input tensor Args: pool_type (Optional[str]): Pooling type. It can be mean, rms, or abs. Default: `mean` keep_dim (Optional[bool]): Do not squeeze the dimensions of a tensor. Default: `False` Shape: - Input: :math:`(N, C, H, W)` or :math:`(N, C, D, H, W)` - Output: :math:`(N, C, 1, 1)` or :math:`(N, C, 1, 1, 1)` if keep_dim else :math:`(N, C)` """ pool_types = ["mean", "rms", "abs"] def __init__( self, pool_type: Optional[str] = "mean", keep_dim: Optional[bool] = False, *args, **kwargs ) -> None: super().__init__() if pool_type not in self.pool_types: logger.error( "Supported pool types are: {}. Got {}".format( self.pool_types, pool_type ) ) self.pool_type = pool_type self.keep_dim = keep_dim @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): cls_name = "{} arguments".format(cls.__name__) group = parser.add_argument_group(title=cls_name, description=cls_name) group.add_argument( "--model.layer.global-pool", type=str, default="mean", help="Which global pooling?", ) return parser def _global_pool(self, x: Tensor, dims: List): if self.pool_type == "rms": # root mean square x = x**2 x = torch.mean(x, dim=dims, keepdim=self.keep_dim) x = x**-0.5 elif self.pool_type == "abs": # absolute x = torch.mean(torch.abs(x), dim=dims, keepdim=self.keep_dim) else: # default is mean # same as AdaptiveAvgPool x = torch.mean(x, dim=dims, keepdim=self.keep_dim) return x def forward(self, x: Tensor) -> Tensor: if x.dim() == 4: dims = [-2, -1] elif x.dim() == 5: dims = [-3, -2, -1] else: raise NotImplementedError("Currently 2D and 3D global pooling supported") return self._global_pool(x, dims=dims) def __repr__(self): return "{}(type={})".format(self.__class__.__name__, self.pool_type) ================================================ FILE: corenet/modeling/layers/identity.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor from corenet.modeling.layers.base_layer import BaseLayer class Identity(BaseLayer): """ This is a place-holder and returns the same tensor. """ def __init__(self): super(Identity, self).__init__() def forward(self, x: Tensor) -> Tensor: return x ================================================ FILE: corenet/modeling/layers/linear_attention.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor from torch.nn import functional as F from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.conv_layer import ConvLayer2d from corenet.modeling.layers.dropout import Dropout class LinearSelfAttention(BaseLayer): """ This layer applies a self-attention with linear complexity, as described in `MobileViTv2 `_ paper. This layer can be used for self- as well as cross-attention. Args: opts: command line arguments embed_dim (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` attn_dropout (Optional[float]): Dropout value for context scores. Default: 0.0 bias (Optional[bool]): Use bias in learnable layers. Default: True Shape: - Input: :math:`(N, C, P, N)` where :math:`N` is the batch size, :math:`C` is the input channels, :math:`P` is the number of pixels in the patch, and :math:`N` is the number of patches - Output: same as the input .. note:: For MobileViTv2, we unfold the feature map [B, C, H, W] into [B, C, P, N] where P is the number of pixels in a patch and N is the number of patches. Because channel is the first dimension in this unfolded tensor, we use point-wise convolution (instead of a linear layer). This avoids a transpose operation (which may be expensive on resource-constrained devices) that may be required to convert the unfolded tensor from channel-first to channel-last format in case of a linear layer. """ def __init__( self, opts, embed_dim: int, attn_dropout: Optional[float] = 0.0, bias: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__() self.qkv_proj = ConvLayer2d( opts=opts, in_channels=embed_dim, out_channels=1 + (2 * embed_dim), bias=bias, kernel_size=1, use_norm=False, use_act=False, ) self.attn_dropout = Dropout(p=attn_dropout) self.out_proj = ConvLayer2d( opts=opts, in_channels=embed_dim, out_channels=embed_dim, bias=bias, kernel_size=1, use_norm=False, use_act=False, ) self.embed_dim = embed_dim def __repr__(self): return "{}(embed_dim={}, attn_dropout={})".format( self.__class__.__name__, self.embed_dim, self.attn_dropout.p ) @staticmethod def visualize_context_scores(context_scores): # [B, 1, P, N] batch_size, channels, num_pixels, num_patches = context_scores.shape assert batch_size == 1, "For visualization purposes, use batch size of 1" assert ( channels == 1 ), "The inner-product between input and latent node (query) is a scalar" up_scale_factor = int(num_pixels**0.5) patch_h = patch_w = int(context_scores.shape[-1] ** 0.5) # [1, 1, P, N] --> [1, P, h, w] context_scores = context_scores.reshape(1, num_pixels, patch_h, patch_w) # Fold context scores [1, P, h, w] using pixel shuffle to obtain [1, 1, H, W] context_map = F.pixel_shuffle(context_scores, upscale_factor=up_scale_factor) # [1, 1, H, W] --> [H, W] context_map = context_map.squeeze() # For ease of visualization, we do min-max normalization min_val = torch.min(context_map) max_val = torch.max(context_map) context_map = (context_map - min_val) / (max_val - min_val) try: import os from glob import glob import cv2 # convert from float to byte context_map = (context_map * 255).byte().cpu().numpy() context_map = cv2.resize( context_map, (80, 80), interpolation=cv2.INTER_NEAREST ) colored_context_map = cv2.applyColorMap(context_map, cv2.COLORMAP_JET) # Lazy way to dump feature maps in attn_res folder. Make sure that directory is empty and copy # context maps before running on different image. Otherwise, attention maps will be overridden. res_dir_name = "attn_res" if not os.path.isdir(res_dir_name): os.makedirs(res_dir_name) f_name = "{}/h_{}_w_{}_index_".format(res_dir_name, patch_h, patch_w) files_cmap = glob( "{}/h_{}_w_{}_index_*.png".format(res_dir_name, patch_h, patch_w) ) idx = len(files_cmap) f_name += str(idx) cv2.imwrite("{}.png".format(f_name), colored_context_map) return colored_context_map except ModuleNotFoundError as mnfe: print("Please install OpenCV to visualize context maps") return context_map def _forward_self_attn(self, x: Tensor, *args, **kwargs) -> Tensor: # [B, C, P, N] --> [B, h + 2d, P, N] qkv = self.qkv_proj(x) # Project x into query, key and value # Query --> [B, 1, P, N] # value, key --> [B, d, P, N] query, key, value = torch.split( qkv, split_size_or_sections=[1, self.embed_dim, self.embed_dim], dim=1 ) # apply softmax along N dimension context_scores = F.softmax(query, dim=-1) # Uncomment below line to visualize context scores # self.visualize_context_scores(context_scores=context_scores) context_scores = self.attn_dropout(context_scores) # Compute context vector # [B, d, P, N] x [B, 1, P, N] -> [B, d, P, N] context_vector = key * context_scores # [B, d, P, N] --> [B, d, P, 1] context_vector = torch.sum(context_vector, dim=-1, keepdim=True) # combine context vector with values # [B, d, P, N] * [B, d, P, 1] --> [B, d, P, N] out = F.relu(value) * context_vector.expand_as(value) out = self.out_proj(out) return out def _forward_cross_attn( self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: # x --> [B, C, P, N] # x_prev = [B, C, P, M] batch_size, in_dim, kv_patch_area, kv_num_patches = x.shape q_patch_area, q_num_patches = x.shape[-2:] assert ( kv_patch_area == q_patch_area ), "The number of pixels in a patch for query and key_value should be the same" # compute query, key, and value # [B, C, P, M] --> [B, 1 + d, P, M] qk = F.conv2d( x_prev, weight=self.qkv_proj.block.conv.weight[: self.embed_dim + 1, ...], bias=self.qkv_proj.block.conv.bias[: self.embed_dim + 1, ...], ) # [B, 1 + d, P, M] --> [B, 1, P, M], [B, d, P, M] query, key = torch.split(qk, split_size_or_sections=[1, self.embed_dim], dim=1) # [B, C, P, N] --> [B, d, P, N] value = F.conv2d( x, weight=self.qkv_proj.block.conv.weight[self.embed_dim + 1 :, ...], bias=self.qkv_proj.block.conv.bias[self.embed_dim + 1 :, ...], ) # apply softmax along M dimension context_scores = F.softmax(query, dim=-1) context_scores = self.attn_dropout(context_scores) # compute context vector # [B, d, P, M] * [B, 1, P, M] -> [B, d, P, M] context_vector = key * context_scores # [B, d, P, M] --> [B, d, P, 1] context_vector = torch.sum(context_vector, dim=-1, keepdim=True) # combine context vector with values # [B, d, P, N] * [B, d, P, 1] --> [B, d, P, N] out = F.relu(value) * context_vector.expand_as(value) out = self.out_proj(out) return out def forward( self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: if x_prev is None: return self._forward_self_attn(x, *args, **kwargs) else: return self._forward_cross_attn(x, x_prev=x_prev, *args, **kwargs) ================================================ FILE: corenet/modeling/layers/linear_layer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers.base_layer import BaseLayer from corenet.utils import logger class LinearLayer(BaseLayer): """ Applies a linear transformation to the input data Args: in_features (int): number of features in the input tensor out_features (int): number of features in the output tensor bias (Optional[bool]): use bias or not channel_first (Optional[bool]): Channels are first or last dimension. If first, then use Conv2d Shape: - Input: :math:`(N, *, C_{in})` if not channel_first else :math:`(N, C_{in}, *)` where :math:`*` means any number of dimensions. - Output: :math:`(N, *, C_{out})` if not channel_first else :math:`(N, C_{out}, *)` """ def __init__( self, in_features: int, out_features: int, bias: Optional[bool] = True, channel_first: Optional[bool] = False, *args, **kwargs ) -> None: super().__init__() self.weight = nn.Parameter(torch.Tensor(out_features, in_features)) self.bias = nn.Parameter(torch.Tensor(out_features)) if bias else None self.in_features = in_features self.out_features = out_features self.channel_first = channel_first self.reset_params() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): parser.add_argument( "--model.layer.linear-init", type=str, default="xavier_uniform", help="Init type for linear layers", ) parser.add_argument( "--model.layer.linear-init-std-dev", type=float, default=0.01, help="Std deviation for Linear layers", ) return parser def reset_params(self): if self.weight is not None: torch.nn.init.xavier_uniform_(self.weight) if self.bias is not None: torch.nn.init.constant_(self.bias, 0) def forward(self, x: Tensor) -> Tensor: if self.channel_first: if not self.training: logger.error("Channel-first mode is only supported during inference") if x.dim() != 4: logger.error("Input should be 4D, i.e., (B, C, H, W) format") # only run during conversion with torch.no_grad(): return F.conv2d( input=x, weight=self.weight.clone() .detach() .reshape(self.out_features, self.in_features, 1, 1), bias=self.bias, ) else: x = F.linear(x, weight=self.weight, bias=self.bias) return x def __repr__(self): repr_str = ( "{}(in_features={}, out_features={}, bias={}, channel_first={})".format( self.__class__.__name__, self.in_features, self.out_features, True if self.bias is not None else False, self.channel_first, ) ) return repr_str class GroupLinear(BaseLayer): """ Applies a GroupLinear transformation layer, as defined `here `_, `here `_ and `here `_ Args: in_features (int): number of features in the input tensor out_features (int): number of features in the output tensor n_groups (int): number of groups bias (Optional[bool]): use bias or not feature_shuffle (Optional[bool]): Shuffle features between groups Shape: - Input: :math:`(N, *, C_{in})` - Output: :math:`(N, *, C_{out})` """ def __init__( self, in_features: int, out_features: int, n_groups: int, bias: Optional[bool] = True, feature_shuffle: Optional[bool] = False, *args, **kwargs ) -> None: if in_features % n_groups != 0: logger.error( "Input dimensions ({}) must be divisible by n_groups ({})".format( in_features, n_groups ) ) if out_features % n_groups != 0: logger.error( "Output dimensions ({}) must be divisible by n_groups ({})".format( out_features, n_groups ) ) in_groups = in_features // n_groups out_groups = out_features // n_groups super().__init__() self.weight = nn.Parameter(torch.Tensor(n_groups, in_groups, out_groups)) if bias: self.bias = nn.Parameter(torch.Tensor(n_groups, 1, out_groups)) else: self.bias = None self.out_features = out_features self.in_features = in_features self.n_groups = n_groups self.feature_shuffle = feature_shuffle self.reset_params() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): parser.add_argument( "--model.layer.group-linear-init", type=str, default="xavier_uniform", help="Init type for group linear layers", ) parser.add_argument( "--model.layer.group-linear-init-std-dev", type=float, default=0.01, help="Std deviation for group linear layers", ) return parser def reset_params(self): if self.weight is not None: torch.nn.init.xavier_uniform_(self.weight.data) if self.bias is not None: torch.nn.init.constant_(self.bias.data, 0) def _forward(self, x: Tensor) -> Tensor: bsz = x.shape[0] # [B, N] --> [B, g, N/g] x = x.reshape(bsz, self.n_groups, -1) # [B, g, N/g] --> [g, B, N/g] x = x.transpose(0, 1) # [g, B, N/g] x [g, N/g, M/g] --> [g, B, M/g] x = torch.bmm(x, self.weight) if self.bias is not None: x = torch.add(x, self.bias) if self.feature_shuffle: # [g, B, M/g] --> [B, M/g, g] x = x.permute(1, 2, 0) # [B, M/g, g] --> [B, g, M/g] x = x.reshape(bsz, self.n_groups, -1) else: # [g, B, M/g] --> [B, g, M/g] x = x.transpose(0, 1) return x.reshape(bsz, -1) def forward(self, x: Tensor) -> Tensor: if x.dim() == 2: x = self._forward(x) return x else: in_dims = x.shape[:-1] n_elements = x.numel() // self.in_features x = x.reshape(n_elements, -1) x = self._forward(x) x = x.reshape(*in_dims, -1) return x def __repr__(self): repr_str = "{}(in_features={}, out_features={}, groups={}, bias={}, shuffle={})".format( self.__class__.__name__, self.in_features, self.out_features, self.n_groups, True if self.bias is not None else False, self.feature_shuffle, ) return repr_str ================================================ FILE: corenet/modeling/layers/multi_head_attention.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.dropout import Dropout from corenet.modeling.layers.linear_layer import LinearLayer from corenet.utils import logger class MultiHeadAttention(BaseLayer): """ This layer applies a multi-head self- or cross-attention as described in `Attention is all you need `_ paper Args: embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(N, S, C_{in})` num_heads (int): Number of heads in multi-head attention attn_dropout (Optional[float]): Attention dropout. Default: 0.0 bias (Optional[bool]): Use bias or not. Default: ``True`` Shape: - Input: - Query tensor (x_q) :math:`(N, S, C_{in})` where :math:`N` is batch size, :math:`S` is number of source tokens, and :math:`C_{in}` is input embedding dim - Optional Key-Value tensor (x_kv) :math:`(N, T, C_{in})` where :math:`T` is number of target tokens - Output: same shape as the input """ def __init__( self, embed_dim: int, num_heads: int, attn_dropout: Optional[float] = 0.0, bias: Optional[bool] = True, output_dim: Optional[int] = None, coreml_compatible: Optional[bool] = False, *args, **kwargs ) -> None: if output_dim is None: output_dim = embed_dim super().__init__() if embed_dim % num_heads != 0: logger.error( "Embedding dim must be divisible by number of heads in {}. Got: embed_dim={} and num_heads={}".format( self.__class__.__name__, embed_dim, num_heads ) ) self.qkv_proj = LinearLayer( in_features=embed_dim, out_features=3 * embed_dim, bias=bias ) self.attn_dropout = Dropout(p=attn_dropout) self.out_proj = LinearLayer( in_features=embed_dim, out_features=output_dim, bias=bias ) self.head_dim = embed_dim // num_heads self.scaling = self.head_dim**-0.5 self.softmax = nn.Softmax(dim=-1) self.num_heads = num_heads self.embed_dim = embed_dim self.coreml_compatible = coreml_compatible self.use_separate_proj_weight = embed_dim != output_dim def __repr__(self): return "{}(head_dim={}, num_heads={}, attn_dropout={})".format( self.__class__.__name__, self.head_dim, self.num_heads, self.attn_dropout.p ) def forward_tracing( self, x_q: Tensor, x_kv: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, ) -> Tensor: if x_kv is None: # [N, S, C] --> # [N, S, 3C] Here, T=S qkv = self.qkv_proj(x_q) # # [N, S, 3C] --> # [N, S, C] x 3 query, key, value = torch.chunk(qkv, chunks=3, dim=-1) else: # [N, S, C] query = F.linear( x_q, weight=self.qkv_proj.weight[: self.embed_dim, ...], bias=( self.qkv_proj.bias[: self.embed_dim] if self.qkv_proj.bias is not None else None ), ) # [N, T, C] --> [N, T, 2C] kv = F.linear( x_kv, weight=self.qkv_proj.weight[self.embed_dim :, ...], bias=( self.qkv_proj.bias[self.embed_dim :] if self.qkv_proj.bias is not None else None ), ) key, value = torch.chunk(kv, chunks=2, dim=-1) query = query * self.scaling # [N, S, C] --> [N, S, c] x h, where C = c * h query = torch.chunk(query, chunks=self.num_heads, dim=-1) # [N, T, C] --> [N, T, c] x h, where C = c * h value = torch.chunk(value, chunks=self.num_heads, dim=-1) # [N, T, C] --> [N, T, c] x h, where C = c * h key = torch.chunk(key, chunks=self.num_heads, dim=-1) wt_out = [] for h in range(self.num_heads): attn_h = torch.matmul(query[h], key[h].transpose(-1, -2)) attn_h = self.softmax(attn_h) attn_h = self.attn_dropout(attn_h) out_h = torch.matmul(attn_h, value[h]) wt_out.append(out_h) wt_out = torch.cat(wt_out, dim=-1) wt_out = self.out_proj(wt_out) return wt_out def forward_default( self, x_q: Tensor, x_kv: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, ) -> Tensor: # [N, S, C] b_sz, S_len, in_channels = x_q.shape if x_kv is None: # self-attention # [N, S, C] --> [N, S, 3C] --> [N, S, 3, h, c] where C = hc qkv = self.qkv_proj(x_q).reshape(b_sz, S_len, 3, self.num_heads, -1) # [N, S, 3, h, c] --> [N, h, 3, S, C] qkv = qkv.transpose(1, 3).contiguous() # [N, h, 3, S, C] --> [N, h, S, C] x 3 query, key, value = qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2] else: T_len = x_kv.shape[1] # cross-attention # [N, S, C] query = F.linear( x_q, weight=self.qkv_proj.weight[: self.embed_dim, ...], bias=( self.qkv_proj.bias[: self.embed_dim] if self.qkv_proj.bias is not None else None ), ) # [N, S, C] --> [N, S, h, c] --> [N, h, S, c] query = ( query.reshape(b_sz, S_len, self.num_heads, self.head_dim) .transpose(1, 2) .contiguous() ) # [N, T, C] --> [N, T, 2C] kv = F.linear( x_kv, weight=self.qkv_proj.weight[self.embed_dim :, ...], bias=( self.qkv_proj.bias[self.embed_dim :] if self.qkv_proj.bias is not None else None ), ) # [N, T, 2C] --> [N, T, 2, h, c] kv = kv.reshape(b_sz, T_len, 2, self.num_heads, self.head_dim) # [N, T, 2, h, c] --> [N, h, 2, T, c] kv = kv.transpose(1, 3).contiguous() key, value = kv[:, :, 0], kv[:, :, 1] query = query * self.scaling # [N h, T, c] --> [N, h, c, T] key = key.transpose(-1, -2) # QK^T # [N, h, S, c] x [N, h, c, T] --> [N, h, S, T] attn = torch.matmul(query, key) batch_size, num_heads, num_src_tokens, num_tgt_tokens = attn.shape if attn_mask is not None: # attn_mask shape should be the same as attn assert list(attn_mask.shape) == [ batch_size, num_src_tokens, num_tgt_tokens, ], "Shape of attention mask should be [{}, {}, {}]. Got: {}".format( batch_size, num_src_tokens, num_tgt_tokens, attn_mask.shape ) # [N, S, T] --> [N, 1, S, T] attn_mask = attn_mask.unsqueeze(1) attn = attn + attn_mask if key_padding_mask is not None: # Do not attend to padding positions # key padding mask size is [N, T] assert key_padding_mask.dim() == 2 and list(key_padding_mask.shape) == [ batch_size, num_tgt_tokens, ], "Key_padding_mask should be 2-dimension with shape [{}, {}]. Got: {}".format( batch_size, num_tgt_tokens, key_padding_mask.shape ) attn = attn.masked_fill( key_padding_mask.unsqueeze(1) .unsqueeze(2) .to(torch.bool), # [N, T] --> [N, 1, 1, T] float("-inf"), ) attn_dtype = attn.dtype attn_as_float = self.softmax(attn.float()) attn = attn_as_float.to(attn_dtype) attn = self.attn_dropout(attn) # weighted sum # [N, h, S, T] x [N, h, T, c] --> [N, h, S, c] out = torch.matmul(attn, value) # [N, h, S, c] --> [N, S, h, c] --> [N, S, C] out = out.transpose(1, 2).reshape(b_sz, S_len, -1) out = self.out_proj(out) return out def forward_pytorch( self, x_q: Tensor, x_kv: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, ) -> Tensor: out, _ = F.multi_head_attention_forward( query=x_q, key=x_kv if x_kv is not None else x_q, value=x_kv if x_kv is not None else x_q, embed_dim_to_check=self.embed_dim, num_heads=self.num_heads, in_proj_weight=torch.empty([0]), in_proj_bias=self.qkv_proj.bias, bias_k=None, bias_v=None, add_zero_attn=False, dropout_p=self.attn_dropout.p, out_proj_weight=self.out_proj.weight, out_proj_bias=self.out_proj.bias, training=self.training, key_padding_mask=key_padding_mask, need_weights=False, attn_mask=attn_mask, use_separate_proj_weight=True, q_proj_weight=self.qkv_proj.weight[: self.embed_dim, ...], k_proj_weight=self.qkv_proj.weight[ self.embed_dim : 2 * self.embed_dim, ... ], v_proj_weight=self.qkv_proj.weight[2 * self.embed_dim :, ...], ) return out def forward( self, x_q: Tensor, x_kv: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: if self.coreml_compatible: # For CoreML, we follow batch-first format. Make sure the input is of the form # [Batch , Sequence, Hidden_dim] return self.forward_tracing( x_q=x_q, x_kv=x_kv, key_padding_mask=key_padding_mask, attn_mask=attn_mask, ) elif kwargs.get("use_pytorch_mha", False): # pytorch uses sequence-first format. Make sure that input is of the form [Sequence, Batch, Hidden dim] return self.forward_pytorch( x_q=x_q, x_kv=x_kv, key_padding_mask=key_padding_mask, attn_mask=attn_mask, ) else: # our default implementation format follows batch-first format. Make sure the input is of the form # [Batch , Sequence, Hidden_dim] return self.forward_default( x_q=x_q, x_kv=x_kv, key_padding_mask=key_padding_mask, attn_mask=attn_mask, ) ================================================ FILE: corenet/modeling/layers/normalization/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import importlib import os from typing import Optional import torch from corenet.modeling.layers.identity import Identity from corenet.utils import logger SUPPORTED_NORM_FNS = [] NORM_LAYER_REGISTRY = {} NORM_LAYER_CLS = [] def register_norm_fn(name): def register_fn(cls): if name in SUPPORTED_NORM_FNS: raise ValueError( "Cannot register duplicate normalization function ({})".format(name) ) SUPPORTED_NORM_FNS.append(name) NORM_LAYER_REGISTRY[name] = cls NORM_LAYER_CLS.append(cls) return cls return register_fn def build_normalization_layer( opts: argparse.Namespace, num_features: int, norm_type: Optional[str] = None, num_groups: Optional[int] = None, momentum: Optional[float] = None, ) -> torch.nn.Module: """ Helper function to build the normalization layer. The function can be used in either of below mentioned ways: Scenario 1: Set the default normalization layers using command line arguments. This is useful when the same normalization layer is used for the entire network (e.g., ResNet). Scenario 2: Network uses different normalization layers. In that case, we can override the default normalization layer by specifying the name using `norm_type` argument. """ if norm_type is None: norm_type = getattr(opts, "model.normalization.name") if num_groups is None: num_groups = getattr(opts, "model.normalization.groups") if momentum is None: momentum = getattr(opts, "model.normalization.momentum") norm_layer = None norm_type = norm_type.lower() if norm_type in NORM_LAYER_REGISTRY: # For detecting non-cuda envs, we do not use torch.cuda.device_count() < 1 # condition because tests always use CPU, even if cuda device is available. # Otherwise, we will get "ValueError: SyncBatchNorm expected input tensor to be # on GPU" Error when running tests on a cuda-enabled node (usually linux). # # Note: We provide default value for getattr(opts, ...) because the configs may # be missing "dev.device" attribute in the test env. if ( "cuda" not in str(getattr(opts, "dev.device", "cpu")) and "sync_batch" in norm_type ): # for a CPU-device, Sync-batch norm does not work. So, change to batch norm norm_type = norm_type.replace("sync_", "") norm_layer = NORM_LAYER_REGISTRY[norm_type]( normalized_shape=num_features, num_features=num_features, momentum=momentum, num_groups=num_groups, ) elif norm_type == "identity": norm_layer = Identity() else: logger.error( "Supported normalization layer arguments are: {}. Got: {}".format( SUPPORTED_NORM_FNS, norm_type ) ) return norm_layer def arguments_norm_layers(parser: argparse.ArgumentParser): group = parser.add_argument_group( title="Normalization layers", description="Normalization layers" ) group.add_argument( "--model.normalization.name", default="batch_norm", type=str, help="Normalization layer. Defaults to 'batch_norm'.", ) group.add_argument( "--model.normalization.groups", default=1, type=str, help="Number of groups in group normalization layer. Defaults to 1.", ) group.add_argument( "--model.normalization.momentum", default=0.1, type=float, help="Momentum in normalization layers. Defaults to 0.1", ) return parser # automatically import different normalization layers norm_dir = os.path.dirname(__file__) for file in os.listdir(norm_dir): path = os.path.join(norm_dir, file) if ( not file.startswith("_") and not file.startswith(".") and (file.endswith(".py") or os.path.isdir(path)) ): model_name = file[: file.find(".py")] if file.endswith(".py") else file module = importlib.import_module( "corenet.modeling.layers.normalization." + model_name ) ================================================ FILE: corenet/modeling/layers/normalization/batch_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="batch_norm") @register_norm_fn(name="batch_norm_2d") class BatchNorm2d(nn.BatchNorm2d): """ Applies a `Batch Normalization `_ over a 4D input tensor Args: num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, H, W)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`H` is the input height, and :math:`W` is the input width - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) @register_norm_fn(name="batch_norm_fp32") class BatchNorm2dFP32(BatchNorm2d): """ Applies a `Batch Normalization `_ over a 4D input tensor in FP32 """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, *args, **kwargs ) def forward(self, input: Tensor) -> Tensor: inp_dtype = input.dtype return super().forward(input.to(torch.float32)).to(inp_dtype) @register_norm_fn(name="batch_norm_1d") class BatchNorm1d(nn.BatchNorm1d): """ Applies a `Batch Normalization `_ over a 2D or 3D input tensor Args: num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C)` or :math:`(N, C, L)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C)` or :math:`(N, C, L)` where :math:`N` is the batch size, :math:`C` is the number of input channels, and :math:`L` is the sequence length - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) @register_norm_fn(name="batch_norm_3d") class BatchNorm3d(nn.BatchNorm3d): def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: """ Applies a `Batch Normalization `_ over a 5D input tensor Args: num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, D, H, W)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C, D, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`D` is the input depth, :math:`H` is the input height, and :math:`W` is the input width - Output: same shape as the input """ super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) ================================================ FILE: corenet/modeling/layers/normalization/group_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="group_norm") class GroupNorm(nn.GroupNorm): """ Applies a `Group Normalization `_ over an input tensor Args: num_groups (int): number of groups to separate the input channels into num_features (int): :math:`C` from an expected input of size :math:`(N, C, *)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` Shape: - Input: :math:`(N, C, *)` where :math:`N` is the batch size, :math:`C` is the number of input channels, and :math:`*` is the remaining dimensions of the input tensor - Output: same shape as the input .. note:: GroupNorm is the same as LayerNorm when `num_groups=1` and it is the same as InstanceNorm when `num_groups=C`. """ def __init__( self, num_groups: int, num_features: int, eps: Optional[float] = 1e-5, affine: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_groups=num_groups, num_channels=num_features, eps=eps, affine=affine ) ================================================ FILE: corenet/modeling/layers/normalization/instance_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="instance_norm") @register_norm_fn(name="instance_norm_2d") class InstanceNorm2d(nn.InstanceNorm2d): """ Applies a `Instance Normalization `_ over a 4D input tensor Args: num_features (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`H` is the input height, and :math:`W` is the input width - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) @register_norm_fn(name="instance_norm_1d") class InstanceNorm1d(nn.InstanceNorm1d): """ Applies a `Instance Normalization `_ over a 2D or 3D input tensor Args: num_features (int): :math:`C` from an expected input of size :math:`(N, C)` or :math:`(N, C, L)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C)` or :math:`(N, C, L)` where :math:`N` is the batch size, :math:`C` is the number of input channels, and :math:`L` is the sequence length - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) ================================================ FILE: corenet/modeling/layers/normalization/layer_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional, Union import torch from torch import Size, Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="layer_norm") class LayerNorm(nn.LayerNorm): r""" Applies `Layer Normalization `_ over a input tensor Args: normalized_shape (int or list or torch.Size): input shape from an expected input of size .. math:: [* \times \text{normalized\_shape}[0] \times \text{normalized\_shape}[1] \times \ldots \times \text{normalized\_shape}[-1]] If a single integer is used, it is treated as a singleton list, and this module will normalize over the last dimension which is expected to be of that specific size. eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 elementwise_affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` Shape: - Input: :math:`(N, *)` where :math:`N` is the batch size - Output: same shape as the input """ def __init__( self, normalized_shape: Union[int, List[int], Size], eps: Optional[float] = 1e-5, elementwise_affine: Optional[bool] = True, *args, **kwargs ): super().__init__( normalized_shape=normalized_shape, eps=eps, elementwise_affine=elementwise_affine, ) def forward(self, x: Tensor) -> Tensor: n_dim = x.ndim if x.shape[1] == self.normalized_shape[0] and n_dim > 2: # channel-first format s, u = torch.std_mean(x, dim=1, keepdim=True, unbiased=False) x = (x - u) / (s + self.eps) if self.weight is not None: # Using fused operation for performing affine transformation: x = (x * weight) + bias n_dim = x.ndim - 2 new_shape = [1, self.normalized_shape[0]] + [1] * n_dim x = torch.addcmul( input=self.bias.reshape(*[new_shape]), value=1.0, tensor1=x, tensor2=self.weight.reshape(*[new_shape]), ) return x elif x.shape[-1] == self.normalized_shape[0]: # channel-last format return super().forward(x) else: raise NotImplementedError( "LayerNorm is supported for channel-first and channel-last format only" ) @register_norm_fn(name="layer_norm_2d") @register_norm_fn(name="layer_norm_nchw") class LayerNorm2D_NCHW(nn.GroupNorm): """ Applies `Layer Normalization `_ over a 4D input tensor Args: num_features (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 elementwise_affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` Shape: - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`H` is the input height, and :math:`W` is the input width - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, elementwise_affine: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_channels=num_features, eps=eps, affine=elementwise_affine, num_groups=1 ) self.num_channels = num_features def __repr__(self): return "{}(num_channels={}, eps={}, affine={})".format( self.__class__.__name__, self.num_channels, self.eps, self.affine ) @register_norm_fn(name="layer_norm_fp32") class LayerNormFP32(LayerNorm): """ Applies `Layer Normalization `_ over a input tensor with FP32 precision """ def __init__( self, normalized_shape: Union[int, List[int], Size], eps: Optional[float] = 1e-5, elementwise_affine: Optional[bool] = True, *args, **kwargs ): super().__init__( normalized_shape=normalized_shape, eps=eps, elementwise_affine=elementwise_affine, *args, **kwargs ) def forward(self, x: Tensor) -> Tensor: # Convert input from dtype X to FP32 and perform normalization operation. # This may help with underflow/overflow issues that we typically see with normalization layers inp_dtype = x.dtype return super().forward(x.to(torch.float32)).to(inp_dtype) ================================================ FILE: corenet/modeling/layers/normalization/rms_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from torch import Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="rms_norm") class RMSNorm(nn.Module): def __init__( self, num_features: int, eps: float = 1e-6, *unused_args, **unused_kwargs ) -> None: """ `Root mean square (RMS) normalization layer `_. Args: num_features: The dimension of the input tensor. eps: A small value added to the denominator during normalization for numerical stability. """ super().__init__() self.eps = eps self.weight = nn.Parameter(torch.ones(num_features)) self.num_features = num_features def _norm(self, x: Tensor) -> Tensor: """Apply the RMSNorm normalization to the input tensor. Args: x: The input tensor. The shape of the input tensor is [batch size, *, num features], where * denotes any dimensions. Returns: The normalized tensor. The shape of the normalized tensor is the same as the input. """ return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) def forward(self, x: Tensor) -> Tensor: """Forward pass through the RMSNorm layer. Args: x: The input tensor. The shape of the input tensor is [batch size, *, num features], where * denotes any dimensions. Returns: The output tensor after applying RMSNorm. The shape of the output tensor is the same as the input tensor. ...note: The input is first converted to full precision and then normalized using RMSNorm. The resulting output is then converted back to its original data type. """ output = self._norm(x.float()).type_as(x) return output * self.weight def extra_repr(self) -> str: return ( super().extra_repr() + f"num_features={self.num_features}, eps={self.eps}" ) ================================================ FILE: corenet/modeling/layers/normalization/sync_batch_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from corenet.modeling.layers.normalization import register_norm_fn @register_norm_fn(name="sync_batch_norm") class SyncBatchNorm(nn.SyncBatchNorm): """ Applies a `Synchronized Batch Normalization `_ over the input tensor Args: num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, *)` eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5 momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1 affine (bool): If ``True``, use learnable affine parameters. Default: ``True`` track_running_stats: If ``True``, tracks running mean and variance. Default: ``True`` Shape: - Input: :math:`(N, C, *)` where :math:`N` is the batch size, :math:`C` is the number of input channels, :math:`*` is the remaining input dimensions - Output: same shape as the input """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) @register_norm_fn(name="sync_batch_norm_fp32") class SyncBatchNormFP32(SyncBatchNorm): """ Synchronized BN in FP32 """ def __init__( self, num_features: int, eps: Optional[float] = 1e-5, momentum: Optional[float] = 0.1, affine: Optional[bool] = True, track_running_stats: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__( num_features=num_features, eps=eps, momentum=momentum, affine=affine, track_running_stats=track_running_stats, ) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: in_dtype = x.dtype return super().forward(x.to(dtype=torch.float)).to(dtype=in_dtype) ================================================ FILE: corenet/modeling/layers/normalization_layers.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from torch import nn from corenet.modeling.layers.normalization import ( NORM_LAYER_CLS, build_normalization_layer, ) from corenet.utils import logger norm_layers_tuple = tuple(NORM_LAYER_CLS) get_normalization_layer = build_normalization_layer ================================================ FILE: corenet/modeling/layers/pixel_shuffle.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor, nn class PixelShuffle(nn.PixelShuffle): """ Rearranges elements in a tensor of shape :math:`(*, C \times r^2, H, W)` to a tensor of shape :math:`(*, C, H \times r, W \times r)`, where r is an upscale factor. Args: upscale_factor (int): factor to increase spatial resolution by Shape: - Input: :math:`(*, C \times r^2, H, W)`, where * is zero or more dimensions - Output: :math:`(*, C, H \times r, W \times r)` """ def __init__(self, upscale_factor: int, *args, **kwargs) -> None: super(PixelShuffle, self).__init__(upscale_factor=upscale_factor) def __repr__(self): return "{}(upscale_factor={})".format( self.__class__.__name__, self.upscale_factor ) ================================================ FILE: corenet/modeling/layers/pooling.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn class MaxPool2d(nn.MaxPool2d): """ Applies a 2D max pooling over a 4D input tensor. Args: kernel_size (Optional[int]): the size of the window to take a max over stride (Optional[int]): The stride of the window. Default: 2 padding (Optional[int]): Padding to be added on both sides of the tensor. Default: 1 Shape: - Input: :math:`(N, C, H_{in}, W_{in})` where :math:`N` is the batch size, :math:`C` is the input channels, :math:`H_{in}` is the input height, and :math:`W_{in}` is the input width - Output: :math:`(N, C, H_{out}, W_{out})` where :math:`H_{out}` is the output height, and :math:`W_{in}` is the output width """ def __init__( self, kernel_size: Optional[int] = 3, stride: Optional[int] = 2, padding: Optional[int] = 1, *args, **kwargs ) -> None: super().__init__(kernel_size=kernel_size, stride=stride, padding=padding) def __repr__(self): return "{}(kernel_size={}, stride={})".format( self.__class__.__name__, self.kernel_size, self.stride ) class AvgPool2d(nn.AvgPool2d): """ Applies a 2D average pooling over a 4D input tensor. Args: kernel_size (Optional[int]): the size of the window to take a max over stride (Optional[int]): The stride of the window. Default: 2 padding (Optional[int]): Padding to be added on both sides of the tensor. Default: 1 ceil_mode (Optional[bool]): When True, will use `ceil` instead of `floor` to compute the output shape. Default: False count_include_pad (Optional[bool]): When True, will include the zero-padding in the averaging calculation. Default: True divisor_override: if specified, it will be used as divisor, otherwise size of the pooling region will be used. Default: None Shape: - Input: :math:`(N, C, H_{in}, W_{in})` where :math:`N` is the batch size, :math:`C` is the input channels, :math:`H_{in}` is the input height, and :math:`W_{in}` is the input width - Output: :math:`(N, C, H_{out}, W_{out})` where :math:`H_{out}` is the output height, and :math:`W_{in}` is the output width """ def __init__( self, kernel_size: tuple, stride: Optional[tuple] = None, padding: Optional[tuple] = (0, 0), ceil_mode: Optional[bool] = False, count_include_pad: Optional[bool] = True, divisor_override: Optional[bool] = None, ): super(AvgPool2d, self).__init__( kernel_size=kernel_size, stride=stride, padding=padding, ceil_mode=ceil_mode, count_include_pad=count_include_pad, divisor_override=divisor_override, ) def __repr__(self): return "{}(upscale_factor={})".format( self.__class__.__name__, self.upscale_factor ) ================================================ FILE: corenet/modeling/layers/positional_embedding.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Optional import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers import BaseLayer class PositionalEmbedding(BaseLayer): def __init__( self, opts, num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None, is_learnable: Optional[bool] = False, sequence_first: Optional[bool] = False, interpolation_mode: Optional[str] = "bilinear", *args, **kwargs ): super().__init__(*args, **kwargs) module = ( LearnablePositionalEmbedding if is_learnable else SinusoidalPositionalEmbedding ) self.pos_embed = module( opts, num_embeddings=num_embeddings, embedding_dim=embedding_dim, padding_idx=padding_idx, sequence_first=sequence_first, interpolation_mode=interpolation_mode, *args, **kwargs ) def forward(self, seq_len: int, *args, **kwargs) -> Tensor: return self.pos_embed(seq_len, *args, **kwargs) def __repr__(self): return self.pos_embed.__repr__() class LearnablePositionalEmbedding(nn.Module): """Learnable Positional embedding""" def __init__( self, opts, num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None, sequence_first: Optional[bool] = False, interpolation_mode: Optional[str] = "bilinear", *args, **kwargs ): super().__init__() self.pos_embed = nn.Parameter(torch.empty(1, 1, num_embeddings, embedding_dim)) self.embedding_dim = embedding_dim self.num_embeddings = num_embeddings self.padding_idx = padding_idx self.sequence_first = sequence_first self.interpolation_mode = interpolation_mode self.reset_parameters() def reset_parameters(self) -> None: nn.init.trunc_normal_(self.pos_embed, mean=0, std=self.embedding_dim**-0.5) if self.padding_idx is not None: with torch.no_grad(): self.pos_embed[:, :, self.padding_idx, ...] = 0.0 def forward(self, seq_len: int, *args, **kwargs) -> Tensor: # scale pos embedding pos_embed = self.pos_embed if self.padding_idx is not None: with torch.no_grad(): pos_embed[:, :, self.padding_idx, ...] = 0.0 if seq_len != self.num_embeddings: pos_embed = F.interpolate( pos_embed, size=(seq_len, self.embedding_dim), mode=self.interpolation_mode, ) # add dummy batch dimension if self.sequence_first: # Input is of the form [Seq_len, Batch, Embedding_dim] return pos_embed.reshape(seq_len, 1, self.embedding_dim) else: # Input is of the form [Batch, Seq_len, Embedding_dim] return pos_embed.reshape(1, seq_len, self.embedding_dim) def __repr__(self): return "{}(num_embeddings={}, embedding_dim={}, padding_idx={}, sequence_first={})".format( self.__class__.__name__, self.num_embeddings, self.embedding_dim, self.padding_idx, self.sequence_first, ) class SinusoidalPositionalEmbedding(nn.Module): def __init__( self, opts, num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None, sequence_first: Optional[bool] = False, interpolation_mode: Optional[str] = "bilinear", *args, **kwargs ): super().__init__() self.padding_idx = padding_idx self.num_embeddings = num_embeddings self.embedding_dim = embedding_dim self.sequence_first = sequence_first self.interpolation_mode = interpolation_mode self.register_buffer("pos_embed", self.get_weights()) def get_weights(self) -> Tensor: """Build sinusoidal embeddings. Adapted from Fairseq.""" half_dim = self.embedding_dim // 2 emb = math.log(10000) / (half_dim - 1) emb = torch.exp(torch.arange(half_dim, dtype=torch.float) * -emb) emb = torch.arange(self.num_embeddings, dtype=torch.float).unsqueeze( 1 ) * emb.unsqueeze(0) emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=1).reshape( self.num_embeddings, -1 ) if self.embedding_dim % 2 == 1: # zero pad emb = torch.cat([emb, torch.zeros(self.num_embeddings, 1)], dim=1) # set embeddings corresponding to padding index to 0 if self.padding_idx is not None: emb[self.padding_idx, :] = 0 return emb.unsqueeze(0).unsqueeze(0) def forward(self, seq_len: int, *args, **kwargs) -> Tensor: # scale pos embedding pos_embed = self.pos_embed if seq_len != self.num_embeddings: pos_embed = F.interpolate( pos_embed, size=(seq_len, self.embedding_dim), mode=self.interpolation_mode, ) if self.sequence_first: # Input is of the form [Seq_len, Batch, Embedding_dim] return pos_embed.reshape(seq_len, 1, self.embedding_dim) else: # Input is of the form [Batch, Seq_len, Embedding_dim] return pos_embed.reshape(1, seq_len, self.embedding_dim) def __repr__(self): return "{}(num_embeddings={}, embedding_dim={}, padding_idx={}, sequence_first={})".format( self.__class__.__name__, self.num_embeddings, self.embedding_dim, self.padding_idx, self.sequence_first, ) ================================================ FILE: corenet/modeling/layers/positional_encoding.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Optional import torch from torch import Tensor, nn from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.dropout import Dropout class SinusoidalPositionalEncoding(BaseLayer): """ This layer adds sinusoidal positional embeddings to a 3D input tensor. The code has been adapted from `Pytorch tutorial `_ Args: d_model (int): dimension of the input tensor dropout (Optional[float]): Dropout rate. Default: 0.0 max_len (Optional[int]): Max. number of patches (or seq. length). Default: 5000 channels_last (Optional[bool]): Channels dimension is the last in the input tensor Shape: - Input: :math:`(N, C, P)` or :math:`(N, P, C)` where :math:`N` is the batch size, :math:`C` is the embedding dimension, :math:`P` is the number of patches - Output: same shape as the input """ def __init__( self, d_model: int, dropout: Optional[float] = 0.0, max_len: Optional[int] = 5000, channels_last: Optional[bool] = True, *args, **kwargs ) -> None: position_last = not channels_last pos_encoding = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp( torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model) ) pos_encoding[:, 0::2] = torch.sin(position * div_term) pos_encoding[:, 1::2] = torch.cos(position * div_term) # add dummy batch dimension pos_encoding = pos_encoding.unsqueeze(0) # [1 x C x P_max) patch_dim = -2 # patch dimension is second last (N, P, C) if position_last: pos_encoding = pos_encoding.transpose( 1, 2 ) # patch dimension is last (N, C, P) patch_dim = -1 # patch dimension is last (N, C, P) super().__init__() self.dropout = Dropout(p=dropout) self.patch_dim = patch_dim self.register_buffer("pe", pos_encoding) def forward_patch_last( self, x, indices: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: # seq_length should be the last dim if indices is None: x = x + self.pe[..., : x.shape[-1]] else: ndim = x.ndim repeat_size = [x.shape[0]] + [-1] * (ndim - 1) pe = self.pe.expand(repeat_size) selected_pe = torch.gather(pe, index=indices, dim=-1) x = x + selected_pe return self.dropout(x) def forward_others( self, x, indices: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: # seq_length should be the second last dim if indices is None: x = x + self.pe[..., : x.shape[-2], :] else: ndim = x.ndim repeat_size = [x.shape[0]] + [-1] * (ndim - 1) pe = self.pe.expand(repeat_size) selected_pe = torch.gather(pe, index=indices, dim=-2) x = x + selected_pe return self.dropout(x) def forward(self, x, indices: Optional[Tensor] = None, *args, **kwargs) -> Tensor: if self.patch_dim == -1: return self.forward_patch_last(x, indices=indices) else: return self.forward_others(x, indices=indices) def __repr__(self): return "{}(dropout={})".format(self.__class__.__name__, self.dropout.p) class LearnablePositionEncoding(BaseLayer): """ This layer adds learnable positional embeddings to a 3D input tensor. Args: embed_dim (int): dimension of the input tensor num_embeddings (int): number of input embeddings. This is similar to vocab size in NLP. dropout (Optional[float]): Dropout rate. Default: 0.0 channels_last (Optional[bool]): Channels dimension is the last in the input tensor Shape: - Input: :math:`(N, *, C, P)` or :math:`(N, *, P, C)` where :math:`N` is the batch size, :math:`C` is the embedding dimension, :math:`P` is the number of patches - Output: same shape as the input """ def __init__( self, embed_dim: int, num_embeddings: int, dropout: Optional[float] = 0.0, channels_last: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__() self.pos_emb = nn.Embedding( num_embeddings=num_embeddings, embedding_dim=embed_dim ) self.channel_last = channels_last self.dropout = Dropout(p=dropout) def forward(self, x, *args, **kwargs) -> Tensor: num_embeddings = x.shape[-2] if self.channel_last else x.shape[-1] posistions = torch.arange(num_embeddings, dtype=torch.int64, device=x.device) position_emb = self.pos_emb(posistions) position_emb = position_emb.expand_as(x) x = x + position_emb return self.dropout(x) def __repr__(self): return "{}(embed_dim={}, vocab_size={}, dropout={})".format( self.__class__.__name__, self.pos_emb.embedding_dim, self.pos_emb.num_embeddings, self.dropout.p, ) ================================================ FILE: corenet/modeling/layers/random_layers.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import random from typing import List, Optional from torch import Tensor from corenet.modeling.layers.base_layer import BaseLayer from corenet.utils.math_utils import bound_fn class RandomApply(BaseLayer): """ This layer randomly applies a list of modules during training. Args: module_list (List): List of modules keep_p (Optional[float]): Keep P modules from the list during training. Default: 0.8 (or 80%) """ def __init__( self, module_list: List, keep_p: Optional[float] = 0.8, *args, **kwargs ) -> None: super().__init__() n_modules = len(module_list) self.module_list = module_list self.module_indexes = [i for i in range(1, n_modules)] k = int(round(n_modules * keep_p)) self.keep_k = bound_fn(min_val=1, max_val=n_modules, value=k) def forward(self, x: Tensor) -> Tensor: if self.training: indexes = [0] + sorted(random.sample(self.module_indexes, k=self.keep_k)) for idx in indexes: x = self.module_list[idx](x) else: for layer in self.module_list: x = layer(x) return x def __repr__(self): format_string = "{}(apply_k (N={})={}, ".format( self.__class__.__name__, len(self.module_list), self.keep_k ) for layer in self.module_list: format_string += "\n\t {}".format(layer) format_string += "\n)" return format_string ================================================ FILE: corenet/modeling/layers/rotary_embeddings.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Tuple import torch from torch import Tensor def _negate_half(x: Tensor) -> Tensor: """ Computes the negative half of the input tensor along the last dimension. Args: x: Input tensor. Returns: Tensor with the negative second half preceding the first half along the last dimension. """ x1, x2 = x.chunk(2, dim=-1) return torch.cat((-x2, x1), dim=-1) def _apply_rotary_pos_emb(x: Tensor, pos_sin: Tensor, pos_cos: Tensor) -> Tensor: """ Applies rotary positional embeddings to the input tensor. Args: x: Input tensor. pos_sin: Sine positional embeddings. The shape of 'pos_sin' embeddings is [1, 1, number of key tokens, model dimension]. pos_cos: Cosine positional embeddings. The shape of 'pos_cos' embeddings is [1, 1, number of key tokens, model dimension]. Returns: Tensor with rotary positional embeddings applied. """ return (x * pos_cos) + (_negate_half(x) * pos_sin) class RotaryEmbedding(torch.nn.Module): """ The rotary position embeddings (aka RoPE) from `RoFormer `_. RoPE encodes the position information of tokens using a rotation matrix, and is able to capture explicit relative positional dependencies. Args: model_dim: The dimensionality of the model's hidden state. max_seq_length: Maximum sequence length. freq_constant: A constant used for computing frequencies. """ def __init__( self, model_dim: int, max_seq_length: int, freq_constant: int = 10000 ) -> None: inv_freq = 1.0 / ( freq_constant ** (torch.arange(0, model_dim, 2, dtype=torch.float32) / model_dim) ) super().__init__() self.model_dim = model_dim self.freq_constant = freq_constant self.max_seq_length = max_seq_length self.register_buffer("inv_freq", inv_freq, persistent=False) self._cached_cos = None self._cached_sin = None self._cached_seq_length = max_seq_length self._compute_sin_cos_embeddings(max_seq_length) def extra_repr(self) -> str: return f"\tmodel_dim={self.model_dim}, max_seq_length={self.max_seq_length}, freq_constant={self.freq_constant}" def _compute_sin_cos_embeddings( self, key_len: int, key_device: torch.device = torch.device("cpu"), key_dtype: torch.dtype = torch.float32, ) -> None: """ Compute sine and cos embeddings. Args: key_len: Number of tokens in the key embeddings in the transformer model. device: Device where the key embeddings are stored. key_dtype: Data type of the key embeddings. Returns: None ...note: We recalculate the sine and cosine embeddings if any of the following conditions are met: 1. The number of tokens in key embeddings are greater than the cached sequence length. 2. Sine and cosine caches are empty. 3. The device and data type of sine and cosine embeddings does not match with the key embeddings. """ if ( key_len > self._cached_seq_length or self._cached_cos is None or (self._cached_cos is not None and self._cached_cos.device != key_device) or (self._cached_cos is not None and self._cached_cos.dtype != key_dtype) or self._cached_sin is None or (self._cached_sin is not None and self._cached_sin.device != key_device) or (self._cached_sin is not None and self._cached_sin.dtype != key_dtype) ): self._cached_seq_length = max(key_len, self._cached_seq_length) # The shape of 'pos_index' is [number of key tokens] pos_index = torch.arange( self._cached_seq_length, dtype=torch.float32, device=self.inv_freq.device, ) # The shape of 'pos_index_theta' is [number of key tokens, model dimension] pos_index_theta = torch.einsum("i,j->ij", pos_index, self.inv_freq) # The shape of 'emb' is [number of key tokens, model dimension] emb = torch.cat((pos_index_theta, pos_index_theta), dim=-1) # the shape of cos and sin embeddings is [number of key tokens, model_dim] cos_emb = emb.cos().to(dtype=key_dtype, device=key_device) sin_emb = emb.sin().to(dtype=key_dtype, device=key_device) # the shape of cached cos and sin embeddings is [1, 1, number of key tokens, model_dim] self._cached_cos = cos_emb[None, None, :, :] self._cached_sin = sin_emb[None, None, :, :] def forward( self, query: torch.Tensor, key: torch.Tensor, ) -> Tuple[torch.Tensor, torch.Tensor]: """ The forward function of RoPE embeddings. Args: query: Query embeddings in the transformer model. The shape of query embeddings is [Batch, number of query heads, number of query tokens, model dimension]. key: Key embeddings in the transformer model. The shape of key embeddings is [Batch, number of key heads, number of key tokens, model dimension]. Returns: A tuple containing the query and key embeddings with positional information. The shape of the returned query and key embeddings is the same as the input query and key embeddings respectively. ...note: The RoPE embedding computation is done in full-precision. After the computation, input query and key tensors are casted to original input datatype. """ dim = key.shape[-1] key_len = key.shape[2] query_len = query.shape[2] assert dim == self.model_dim assert key.device == query.device assert key.dtype == query.dtype # In the context of self-attention, the lengths of keys and queries are equal. # However, in generation tasks, such as predicting the next token in a sequence, the lengths of keys and queries # can differ. For instance, when employing key-value (KV) caching for sequence prediction, the keys # represent embeddings of previous tokens and the current token, while the query corresponds # to the embedding of the current token only. assert ( key_len >= query_len ), "Number of keys has to be greater than or equal to number of queries." query_float = query.float() key_float = key.float() self._compute_sin_cos_embeddings( key_len, key_device=key_float.device, key_dtype=key_float.dtype ) query_float = _apply_rotary_pos_emb( x=query_float, pos_sin=self._cached_sin[..., key_len - query_len : key_len, :], pos_cos=self._cached_cos[..., key_len - query_len : key_len, :], ) key_float = _apply_rotary_pos_emb( x=key_float, pos_sin=self._cached_sin[..., :key_len, :], pos_cos=self._cached_cos[..., :key_len, :], ) return query_float.type_as(query), key_float.type_as(key) ================================================ FILE: corenet/modeling/layers/single_head_attention.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers.base_layer import BaseLayer from corenet.modeling.layers.dropout import Dropout from corenet.modeling.layers.linear_layer import LinearLayer class SingleHeadAttention(BaseLayer): """ This layer applies a single-head attention as described in `DeLighT `_ paper Args: embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})` attn_dropout (Optional[float]): Attention dropout. Default: 0.0 bias (Optional[bool]): Use bias or not. Default: ``True`` Shape: - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches, and :math:`C_{in}` is input embedding dim - Output: same shape as the input """ def __init__( self, embed_dim: int, attn_dropout: Optional[float] = 0.0, bias: Optional[bool] = True, *args, **kwargs ) -> None: super().__init__() self.qkv_proj = LinearLayer( in_features=embed_dim, out_features=3 * embed_dim, bias=bias ) self.attn_dropout = Dropout(p=attn_dropout) self.out_proj = LinearLayer( in_features=embed_dim, out_features=embed_dim, bias=bias ) self.softmax = nn.Softmax(dim=-1) self.embed_dim = embed_dim self.scaling = self.embed_dim**-0.5 def __repr__(self) -> str: return "{}(embed_dim={}, attn_dropout={})".format( self.__class__.__name__, self.embed_dim, self.attn_dropout.p ) def forward( self, x_q: Tensor, x_kv: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: # [N, P, C] --> [N, P, 3C] if x_kv is None: qkv = self.qkv_proj(x_q) # [N, P, 3C] --> [N, P, C] x 3 query, key, value = torch.chunk(qkv, chunks=3, dim=-1) else: query = F.linear( x_q, weight=self.qkv_proj.weight[: self.embed_dim, ...], bias=self.qkv_proj.bias[: self.embed_dim], ) # [N, P, C] --> [N, P, 2C] kv = F.linear( x_kv, weight=self.qkv_proj.weight[self.embed_dim :, ...], bias=self.qkv_proj.bias[self.embed_dim :], ) key, value = torch.chunk(kv, chunks=2, dim=-1) query = query * self.scaling # [N, P, C] --> [N, C, P] key = key.transpose(-2, -1) # QK^T # [N, P, C] x [N, C, P] --> [N, P, P] attn = torch.matmul(query, key) if attn_mask is not None: # attn_mask shape should be the same as attn assert list(attn_mask.shape) == list( attn.shape ), "Shape of attention mask and attn should be the same. Got: {} and {}".format( attn_mask.shape, attn.shape ) attn = attn + attn_mask if key_padding_mask is not None: # Do not attend to padding positions # key padding mask size is [N, P] batch_size, num_src_tokens, num_tgt_tokens = attn.shape assert key_padding_mask.dim() == 2 and list(key_padding_mask.shape) == [ batch_size, num_tgt_tokens, ], "Key_padding_mask should be 2-dimension with shape [{}, {}]. Got: {}".format( batch_size, num_tgt_tokens, key_padding_mask.shape ) attn = attn.masked_fill( key_padding_mask.unsqueeze(1).to(torch.bool), float("-inf"), ) attn = self.softmax(attn) attn = self.attn_dropout(attn) # weighted sum # [N, P, P] x [N, P, C] --> [N, P, C] out = torch.matmul(attn, value) out = self.out_proj(out) return out ================================================ FILE: corenet/modeling/layers/softmax.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import Tensor, nn class Softmax(nn.Softmax): """ Applies the Softmax function to an input tensor along the specified dimension Args: dim (int): Dimension along which softmax to be applied. Default: -1 Shape: - Input: :math:`(*)` where :math:`*` is one or more dimensions - Output: same shape as the input """ def __init__(self, dim: Optional[int] = -1, *args, **kwargs): super().__init__(dim=dim) ================================================ FILE: corenet/modeling/layers/stochastic_depth.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor from torchvision.ops import StochasticDepth as StochasticDepthTorch class StochasticDepth(StochasticDepthTorch): """ Implements the Stochastic Depth `"Deep Networks with Stochastic Depth" `_ used for randomly dropping residual branches of residual architectures. """ def __init__(self, p: float, mode: str) -> None: super().__init__(p=p, mode=mode) ================================================ FILE: corenet/modeling/layers/token_merging.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Tuple import torch from torch import nn from torch.nn import functional as F from corenet.modeling.layers import linear_layer from corenet.modeling.layers.normalization import layer_norm class TokenMerging(nn.Module): """ Merge tokens from a [batch_size, sequence_length, num_channels] tensor using a linear projection. This function also updates masks and adds padding as needed to make the sequence length divisible by the window size before merging tokens. Args: dim: Number of input channels. window: The size of the window to merge into a single token. """ def __init__(self, dim: int, window: int = 2) -> None: super().__init__() self.dim = dim self.reduction = linear_layer.LinearLayer(window * dim, dim, bias=False) self.norm = layer_norm.LayerNorm(dim) self.window = window def forward( self, x: torch.Tensor, key_padding_mask: torch.Tensor ) -> Tuple[torch.Tensor, torch.Tensor]: """ Perform token merging. Args: x: A tensor of shape [batch_size, sequence_length, num_channels]. key_padding_mask: A tensor of shape [batch_size, sequence_length] with "-inf" values at mask tokens, and "0" values at unmasked tokens. Returns: A tensor of shape [batch_size, math.ceil(sequence_length / self.window), num_channels], where @self.window is the window size. """ if key_padding_mask is not None: # Zero out the masked portion of @x to make sure it doesn't # participate in linear projections after windowing. x[key_padding_mask == float("-inf")] = 0 x, key_padding_mask = pad_x_and_mask(x, key_padding_mask, self.window) B, N, C = x.shape x = x.unfold(1, self.window, self.window) # [B, N // window, C, window] x = x.reshape(B, N // self.window, C * self.window) x = self.reduction(x) # [B, N // self.window, C] x = self.norm(x) if key_padding_mask is not None: assert key_padding_mask.shape == (B, N) key_padding_mask = key_padding_mask.unfold( 1, self.window, self.window ) # [B, N // window, window]. key_padding_mask = key_padding_mask.max(dim=-1).values # [B, N // window]. return x, key_padding_mask def extra_repr(self) -> str: return f"dim={self.dim}, window={self.window}" def pad_x_and_mask( x: torch.Tensor, key_padding_mask: torch.Tensor, window_size: int ) -> Tuple[torch.Tensor, torch.Tensor]: """ Apply padding to @x and @key_padding_mask to make their lengths divisible by @window_size. Args: x: The input tensor of shape [B, N, C]. key_padding_mask: The mask of shape [B, N]. window_size: the N dimension of @x and @key_padding_mask will be padded to make them divisble by this number. Returns: A tuple containing @x and @key_padding_mask, with padding applied. """ B, N, _ = x.shape padding = (window_size - (N % window_size)) % window_size if key_padding_mask is not None: key_padding_mask = F.pad(key_padding_mask, (0, padding), value=float("-inf")) # Apply similar padding to x which is [B, N, C] before padding. x = F.pad(x, (0, 0, 0, padding), value=0) return x, key_padding_mask ================================================ FILE: corenet/modeling/layers/upsample.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional, Tuple, Union import torch from torch import Tensor, nn class UpSample(nn.Upsample): """ This layer upsamples a given input tensor. Args: size (Optional[Union[int, Tuple[int, ...]]): Output spatial size. Default: None scale_factor (Optional[float]): Scale each spatial dimension of the input by this factor. Default: None mode (Optional[str]): Upsampling algorithm (``'nearest'``, ``'linear'``, ``'bilinear'``, ``'bicubic'`` and ``'trilinear'``. Default: ``'nearest'`` align_corners (Optional[bool]): if ``True``, the corner pixels of the input and output tensors are aligned, and thus preserving the values at those pixels. This only has effect when :attr:`mode` is ``'linear'``, ``'bilinear'``, ``'bicubic'``, or ``'trilinear'``. Default: ``None`` Shape: - Input: :math:`(N, C, W_{in})` or :math:`(N, C, H_{in}, W_{in})` or :math:`(N, C, D_{in}, H_{in}, W_{in})` - Output: :math:`(N, C, W_{out})` or :math:`(N, C, H_{out}, W_{out})` or :math:`(N, C, D_{out}, H_{out}, W_{out})` """ def __init__( self, size: Optional[Union[int, Tuple[int, ...]]] = None, scale_factor: Optional[float] = None, mode: Optional[str] = "nearest", align_corners: Optional[bool] = None, *args, **kwargs ) -> None: super().__init__( size=size, scale_factor=scale_factor, mode=mode, align_corners=align_corners ) ================================================ FILE: corenet/modeling/matcher_det/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.matcher_det.base_matcher import BaseMatcher from corenet.utils import logger from corenet.utils.registry import Registry # register BOX Matcher MATCHER_REGISTRY = Registry( "matcher", base_class=BaseMatcher, lazy_load_dirs=["corenet/modeling/matcher_det"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_box_matcher(parser: argparse.ArgumentParser): group = parser.add_argument_group("Matcher", "Matcher") group.add_argument( "--matcher.name", type=str, help="Name of the matcher. Matcher matches anchors with GT box coordinates", ) # add segmentation specific arguments parser = MATCHER_REGISTRY.all_arguments(parser) return parser def build_matcher(opts, *args, **kwargs): matcher_name = getattr(opts, "matcher.name", None) # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if matcher_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") matcher = MATCHER_REGISTRY[matcher_name](opts, *args, **kwargs) return matcher ================================================ FILE: corenet/modeling/matcher_det/base_matcher.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse class BaseMatcher(object): """ Base class for matching anchor boxes and labels for the task of object detection """ def __init__(self, opts, *args, **kwargs) -> None: super(BaseMatcher, self).__init__() self.opts = opts @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): """Add class-specific arguments""" return parser def __call__(self, *args, **kwargs): raise NotImplementedError ================================================ FILE: corenet/modeling/matcher_det/ssd_matcher.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple, Union import numpy as np import torch from torch import Tensor from corenet.modeling.matcher_det import MATCHER_REGISTRY, BaseMatcher from corenet.modeling.misc.box_utils import ( center_form_to_corner_form, convert_boxes_to_locations, convert_locations_to_boxes, corner_form_to_center_form, ) from corenet.third_party.modeling.ssd_utils import assign_priors from corenet.utils import logger @MATCHER_REGISTRY.register(name="ssd") class SSDMatcher(BaseMatcher): """ This class assigns labels to anchors via `SSD matching process `_ Args: opts: command line arguments bg_class_id: Background class index Shape: - Input: - gt_boxes: Ground-truth boxes in corner form (xyxy format). Shape is :math:`(N, 4)` where :math:`N` is the number of boxes - gt_labels: Ground-truth box labels. Shape is :math:`(N)` - anchors: Anchor boxes in center form (c_x, c_y, w, h). Shape is :math:`(M, 4)` where :math:`M` is the number of anchors - Output: - matched_boxes of shape :math:`(M, 4)` - matched_box_labels of shape :math:`(M)` """ def __init__(self, opts, bg_class_id: Optional[int] = 0, *args, **kwargs) -> None: center_variance = getattr(opts, "matcher.ssd.center_variance", None) check_variable(center_variance, "--matcher.ssd.center-variance") size_variance = getattr(opts, "matcher.ssd.size_variance", None) check_variable(val=size_variance, args_str="--matcher.ssd.size-variance") iou_threshold = getattr(opts, "matcher.ssd.iou_threshold", None) check_variable(val=iou_threshold, args_str="--matcher.ssd.iou-threshold") super().__init__(opts=opts, *args, **kwargs) self.center_variance = center_variance self.size_variance = size_variance self.iou_threshold = iou_threshold self.bg_class_id = bg_class_id def __repr__(self): return "{}(center_variance={}, size_variance={}, iou_threshold={})".format( self.__class__.__name__, self.center_variance, self.size_variance, self.iou_threshold, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add SSD Matcher specific arguments """ group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--matcher.ssd.center-variance", type=float, default=0.1, help="Center variance for matching", ) group.add_argument( "--matcher.ssd.size-variance", type=float, default=0.2, help="Size variance.", ) group.add_argument( "--matcher.ssd.iou-threshold", type=float, default=0.45, help="IOU Threshold.", ) return parser def __call__( self, gt_boxes: Union[np.ndarray, Tensor], gt_labels: Union[np.ndarray, Tensor], anchors: Tensor, ) -> Tuple[Tensor, Tensor]: if isinstance(gt_boxes, np.ndarray): gt_boxes = torch.from_numpy(gt_boxes) if isinstance(gt_labels, np.ndarray): gt_labels = torch.from_numpy(gt_labels) # convert box priors from center [c_x, c_y] to corner_form [x, y] anchors_xyxy = center_form_to_corner_form(boxes=anchors) matched_boxes_xyxy, matched_labels = assign_priors( gt_boxes, # gt_boxes are in corner form [x, y, w, h] gt_labels, anchors_xyxy, # priors are in corner form [x, y, w, h] self.iou_threshold, background_id=self.bg_class_id, ) # convert the matched boxes to center form [c_x, c_y] matched_boxes_cxcywh = corner_form_to_center_form(matched_boxes_xyxy) # Eq.(2) in paper https://arxiv.org/pdf/1512.02325.pdf boxes_for_regression = convert_boxes_to_locations( gt_boxes=matched_boxes_cxcywh, # center form prior_boxes=anchors, # center form center_variance=self.center_variance, size_variance=self.size_variance, ) return boxes_for_regression, matched_labels def convert_to_boxes( self, pred_locations: torch.Tensor, anchors: torch.Tensor ) -> Tensor: """ Decodes boxes from predicted locations and anchors. """ # decode boxes in center form boxes = convert_locations_to_boxes( pred_locations=pred_locations, anchor_boxes=anchors, center_variance=self.center_variance, size_variance=self.size_variance, ) # convert boxes from center form [c_x, c_y] to corner form [x, y] boxes = center_form_to_corner_form(boxes) return boxes def check_variable(val, args_str: str): if val is None: logger.error("{} cannot be None".format(args_str)) if not (0.0 < val < 1.0): logger.error( "The value of {} should be between 0 and 1. Got: {}".format(args_str, val) ) ================================================ FILE: corenet/modeling/misc/__init__.py ================================================ ================================================ FILE: corenet/modeling/misc/averaging_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from copy import deepcopy from typing import Optional import torch from torch import nn class EMA(object): """ For a given model, this class computes the exponential moving average of weights Args: model (torch.nn.Module): Model ema_momentum (Optional[float]): Momentum value shows the contribution of weights at current iteration. Default: 0.0005 device (Optional[str]): Device (CPU or GPU) on which model resides. Default: cpu """ def __init__( self, model: nn.Module, ema_momentum: Optional[float] = 0.0005, device: Optional[str] = "cpu", *args, **kwargs ) -> None: # make a deep copy of the model for accumulating moving average of parameters and set to eval mode self.ema_model = deepcopy(model) self.ema_model.eval() self.momentum = ema_momentum self.device = device if device: self.ema_model.to(device=device) self.ema_has_module = hasattr(self.ema_model, "module") for param in self.ema_model.parameters(): param.requires_grad = False def update_parameters(self, model): # correct a mismatch in state dict keys has_module = hasattr(model, "module") and not self.ema_has_module with torch.no_grad(): msd = model.state_dict() for k, ema_v in self.ema_model.state_dict().items(): if has_module: # .module is added if we use DistributedDataParallel or DataParallel wrappers around model k = "module." + k model_v = msd[k].detach() if self.device: model_v = model_v.to(device=self.device) ema_v.copy_((ema_v * (1.0 - self.momentum)) + (self.momentum * model_v)) def arguments_ema(parser: argparse.ArgumentParser): group = parser.add_argument_group( title="EMA", description="Exponential moving average arguments" ) group.add_argument( "--ema.enable", action="store_true", help="Use exponential moving average" ) group.add_argument( "--ema.momentum", type=float, default=0.0001, help="EMA momentum. Defaults to 0.0001.", ) return parser ================================================ FILE: corenet/modeling/misc/box_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from torch import Tensor """ This file implements different conversion functions to implement `SSD `_ object detector. Equations are written inside each function for brevity. """ def convert_locations_to_boxes( pred_locations: Tensor, anchor_boxes: Tensor, center_variance: float, size_variance: float, ) -> Tensor: """ This is an inverse of convert_boxes_to_locations function (or Eq.(2) in `SSD paper `_ Args: pred_locations (Tensor): predicted locations from detector anchor_boxes (Tensor): prior boxes in center form center_variance (float): variance value for centers (c_x and c_y) size_variance (float): variance value for size (height and width) Returns: predicted boxes tensor in center form """ # priors can have one dimension less. if anchor_boxes.dim() + 1 == pred_locations.dim(): anchor_boxes = anchor_boxes.unsqueeze(0) # T_w = log(g_w/d_w) / size_variance ==> g_w = exp(T_w * size_variance) * d_w # T_h = log(g_h/d_h) / size_variance ==> g_h = exp(T_h * size_variance) * d_h pred_size = ( torch.exp(pred_locations[..., 2:] * size_variance) * anchor_boxes[..., 2:] ) # T_cx = ((g_cx - d_cx) / d_w) / center_variance ==> g_cx = ((T_cx * center_variance) * d_w) + d_cx # T_cy = ((g_cy - d_cy) / d_w) / center_variance ==> g_cy = ((T_cy * center_variance) * d_h) + d_cy pred_center = ( pred_locations[..., :2] * center_variance * anchor_boxes[..., 2:] ) + anchor_boxes[..., :2] return torch.cat((pred_center, pred_size), dim=-1) def convert_boxes_to_locations( gt_boxes: Tensor, prior_boxes: Tensor, center_variance: float, size_variance: float ): """ This function implements Eq.(2) in the `SSD paper `_ Args: gt_boxes (Tensor): Ground truth boxes in center form (cx, cy, w, h) prior_boxes (Tensor): Prior boxes in center form (cx, cy, w, h) center_variance (float): variance value for centers (c_x and c_y) size_variance (float): variance value for size (height and width) Returns: boxes tensor for training """ # T_cx = ((g_cx - d_cx) / d_w) / center_variance; Center vairance is nothing but normalization # T_cy = ((g_cy - d_cy) / d_h) / center_variance # T_w = log(g_w/d_w) / size_variance and T_h = log(g_h/d_h) / size_varianc # priors can have one dimension less if prior_boxes.dim() + 1 == gt_boxes.dim(): prior_boxes = prior_boxes.unsqueeze(0) target_centers = ( (gt_boxes[..., :2] - prior_boxes[..., :2]) / prior_boxes[..., 2:] ) / center_variance target_size = torch.log(gt_boxes[..., 2:] / prior_boxes[..., 2:]) / size_variance return torch.cat((target_centers, target_size), dim=-1) def center_form_to_corner_form(boxes: Tensor) -> Tensor: """ This function convert boxes from center to corner form Args: boxes (Tensor): Boxes in center form (cx,cy,w,h) Returns: Boxes tensor in corner form (x,y,w,h) """ # x = c_x - (delta_w * 0.5), y = c_y - (delta_h * 0.5) # w = c_x + (delta_w * 0.5), h = c_y + (delta_h * 0.5) return torch.cat( ( boxes[..., :2] - (boxes[..., 2:] * 0.5), boxes[..., :2] + (boxes[..., 2:] * 0.5), ), dim=-1, ) def corner_form_to_center_form(boxes: torch.Tensor) -> torch.Tensor: """ This function converts boxes from corner to center form Args: boxes (Tensor): boxes in corner form (x, y, w, h) Returns: Boxes tensor in center form (c_x, c_y, w, h) """ # c_x = ( x + w ) * 0.5, c_y = (y + h) * 0.5 # delta_w = w - x, delta_h = h - y return torch.cat( ((boxes[..., :2] + boxes[..., 2:]) * 0.5, boxes[..., 2:] - boxes[..., :2]), dim=-1, ) ================================================ FILE: corenet/modeling/misc/common.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os import re from types import MethodType from typing import Dict, List, Optional, Tuple, Union import torch from torch import Tensor from corenet.utils import logger from corenet.utils.common_utils import unwrap_model_fn from corenet.utils.ddp_utils import is_master, is_start_rank_node def clean_strip( obj: Union[str, List[str]], sep: Optional[str] = ",", strip: bool = True ) -> List[str]: # Allowing list of strings as input as well as comma-separated strings if isinstance(obj, list): strings = obj else: strings = obj.split(sep) if strip: strings = [x.strip() for x in strings] strings = [x for x in strings if x] return strings def load_pretrained_model( model: torch.nn.Module, wt_loc: str, opts: argparse.Namespace, *args, **kwargs ) -> torch.nn.Module: """Helper function to load pre-trained weights. Args: model: Model whose weights will be loaded. wt_loc: Path to file to load state_dict from. opts: Input arguments. Returns: The model loaded with the given weights. """ if not os.path.isfile(wt_loc): logger.error("Pretrained file is not found here: {}".format(wt_loc)) wts = torch.load(wt_loc, map_location="cpu") is_master_node = is_start_rank_node(opts) exclude_scopes = getattr(opts, "model.resume_exclude_scopes", "") exclude_scopes: List[str] = clean_strip(exclude_scopes) missing_scopes = getattr(opts, "model.ignore_missing_scopes", "") missing_scopes: List[str] = clean_strip(missing_scopes) rename_scopes_map: List[List[str]] = getattr(opts, "model.rename_scopes_map", []) if rename_scopes_map: for entry in rename_scopes_map: if len(entry) != 2: raise ValueError( "Every entry in model.rename_scopes_map must contain exactly two string elements" " for before and after. Got {}.".format(str(entry)) ) # By default, adding scopes that we exclude to missing scopes # If you excluded something, you can't expect it to be there. missing_scopes += exclude_scopes # remove unwanted scopes if exclude_scopes: for key in wts.copy(): if any([re.match(x, key) for x in exclude_scopes]): del wts[key] if rename_scopes_map: for before, after in rename_scopes_map: wts = {re.sub(before, after, key): value for key, value in wts.items()} strict = not bool(missing_scopes) try: module = unwrap_model_fn(model) missing_keys, unexpected_keys = module.load_state_dict(wts, strict=strict) if unexpected_keys: raise Exception( "Found unexpected keys: {}." "You can ignore these keys using `model.resume_exclude_scopes`.".format( ", ".join(unexpected_keys) ) ) missing_keys = [ key for key in missing_keys if not any([re.match(x, key) for x in missing_scopes]) ] if missing_keys: raise Exception( "Missing keys detected. Did not find the following keys in pre-trained model: {}." " You can ignore the keys using `model.ignore_missing_scopes`.".format( ",".join(missing_keys) ) ) if is_master_node: logger.log("Pretrained weights are loaded from {}".format(wt_loc)) except Exception as e: if is_master_node: logger.error( "Unable to load pretrained weights from {}. Error: {}".format(wt_loc, e) ) return model def parameter_list( named_parameters, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ) -> List[Dict]: module_name = kwargs.get("module_name", "") with_decay = [] without_decay = [] with_decay_param_names = [] without_decay_param_names = [] if isinstance(named_parameters, list): for n_parameter in named_parameters: for p_name, param in n_parameter(): if ( param.requires_grad and len(param.shape) == 1 and no_decay_bn_filter_bias ): # biases and normalization layer parameters are of len 1 without_decay.append(param) without_decay_param_names.append(module_name + p_name) elif param.requires_grad: with_decay.append(param) with_decay_param_names.append(module_name + p_name) else: for p_name, param in named_parameters(): if ( param.requires_grad and len(param.shape) == 1 and no_decay_bn_filter_bias ): # biases and normalization layer parameters are of len 1 without_decay.append(param) without_decay_param_names.append(module_name + p_name) elif param.requires_grad: with_decay.append(param) with_decay_param_names.append(module_name + p_name) param_list = [ { "params": with_decay, "weight_decay": weight_decay, "param_names": with_decay_param_names, } ] if len(without_decay) > 0: param_list.append( { "params": without_decay, "weight_decay": 0.0, "param_names": without_decay_param_names, } ) return param_list def freeze_module(module: torch.nn.Module, force_eval: bool = True) -> torch.nn.Module: """ Sets requires_grad = False on all the given module parameters, and put the module in eval mode. By default, it also overrides the module's `train` method to make sure that it always stays in eval mode (ie calling ``module.train(mode=True)`` executes ``module.train(mode=False)``) >>> module = nn.Linear(10, 20).train() >>> module.training True >>> module.weight.requires_grad True >>> freeze_module(module).train().training False >>> module.weight.requires_grad False """ module.eval() for parameter in module.parameters(): parameter.requires_grad = False if force_eval: def _force_train_in_eval( self: torch.nn.Module, mode: bool = True ) -> torch.nn.Module: # ignore train/eval calls: perpetually stays in eval return self module.train = MethodType(_force_train_in_eval, module) return module def freeze_modules_based_on_opts( opts: argparse.Namespace, model: torch.nn.Module, verbose: bool = True ) -> torch.nn.Module: """ Allows for freezing immediate modules and parameters of the model using --model.freeze-modules. --model.freeze-modules should be a list of strings or a comma-separated list of regex expressions. Examples of --model.freeze-modules: "conv.*" # see example below: can freeze all (top-level) conv layers "^((?!classifier).)*$" # freezes everything except for "classifier": useful for linear probing "conv1,layer1,layer2,layer3" # freeze all layers up to layer3 >>> model = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(1, 20, 5)), ('relu1', nn.ReLU()), ('conv2', nn.Conv2d(20, 64, 5)), ('relu2', nn.ReLU()) ])) >>> opts = argparse.Namespace(**{"model.freeze_modules": "conv1"}) >>> _ = freeze_modules_based_on_opts(opts, model) INFO - Freezing module: conv1 >>> model.train() >>> model.conv1.training False >>> model.conv2.training True """ freeze_patterns = getattr(opts, "model.freeze_modules", "") freeze_patterns = clean_strip(freeze_patterns) verbose = verbose and is_master(opts) if freeze_patterns: # TODO: allow applying on all modules, not just immediate children? How? for name, module in model.named_children(): if any([re.match(p, name) for p in freeze_patterns]): freeze_module(module) if verbose: logger.info("Freezing module: {}".format(name)) for name, param in model.named_parameters(): if any([re.match(p, name) for p in freeze_patterns]): param.requires_grad = False if verbose: logger.info("Freezing parameter: {}".format(name)) if verbose and hasattr(model, "get_trainable_parameters"): param_list, _ = model.get_trainable_parameters() for params in param_list: if ( not isinstance(params["param_names"], List) or not isinstance(params["params"], List) or not isinstance(params["weight_decay"], (float, int)) ): param_types = {k: type(v) for k, v in params.items()} logger.error( "Expected parameter format: {{ params: List, weight_decay: float, param_names: List }}. " "Got: {}".format(param_types) ) # Flatten all parameter names trainable_param_names = [p for x in param_list for p in x["param_names"]] logger.info("Trainable parameters: {}".format(trainable_param_names)) return model def get_tensor_sizes(data: Union[Dict, Tensor]) -> Union[List[str], List[Tuple[int]]]: """Utility function for extracting tensor shapes (for printing purposes only).""" if isinstance(data, Dict): tensor_sizes = [] for k, v in data.items(): size_ = get_tensor_sizes(v) if size_: tensor_sizes.append(f"{k}: {size_}") return tensor_sizes elif isinstance(data, Tensor): return [*data.shape] else: return [] ================================================ FILE: corenet/modeling/misc/init_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional from torch import nn from corenet.modeling.layers import GroupLinear, LinearLayer, norm_layers_tuple from corenet.utils import logger supported_conv_inits = [ "kaiming_normal", "kaiming_uniform", "xavier_normal", "xavier_uniform", "normal", "trunc_normal", ] supported_fc_inits = [ "kaiming_normal", "kaiming_uniform", "xavier_normal", "xavier_uniform", "normal", "trunc_normal", ] def _init_nn_layers( module, init_method: Optional[str] = "kaiming_normal", std_val: Optional[float] = None, ) -> None: """ Helper function to initialize neural network module """ init_method = init_method.lower() if init_method == "kaiming_normal": if module.weight is not None: nn.init.kaiming_normal_(module.weight, mode="fan_out") if module.bias is not None: nn.init.zeros_(module.bias) elif init_method == "kaiming_uniform": if module.weight is not None: nn.init.kaiming_uniform_(module.weight, mode="fan_out") if module.bias is not None: nn.init.zeros_(module.bias) elif init_method == "xavier_normal": if module.weight is not None: nn.init.xavier_normal_(module.weight) if module.bias is not None: nn.init.zeros_(module.bias) elif init_method == "xavier_uniform": if module.weight is not None: nn.init.xavier_uniform_(module.weight) if module.bias is not None: nn.init.zeros_(module.bias) elif init_method == "normal": if module.weight is not None: std = 1.0 / module.weight.size(1) ** 0.5 if std_val is None else std_val nn.init.normal_(module.weight, mean=0.0, std=std) if module.bias is not None: nn.init.zeros_(module.bias) elif init_method == "trunc_normal": if module.weight is not None: std = 1.0 / module.weight.size(1) ** 0.5 if std_val is None else std_val nn.init.trunc_normal_(module.weight, mean=0.0, std=std) if module.bias is not None: nn.init.zeros_(module.bias) else: supported_conv_message = "Supported initialization methods are:" for i, l in enumerate(supported_conv_inits): supported_conv_message += "\n \t {}) {}".format(i, l) logger.error("{} \n Got: {}".format(supported_conv_message, init_method)) def initialize_conv_layer( module, init_method: Optional[str] = "kaiming_normal", std_val: Optional[float] = 0.01, ) -> None: """Helper function to initialize convolution layers""" _init_nn_layers(module=module, init_method=init_method, std_val=std_val) def initialize_fc_layer( module, init_method: Optional[str] = "normal", std_val: Optional[float] = 0.01 ) -> None: """Helper function to initialize fully-connected layers""" if hasattr(module, "layer"): _init_nn_layers(module=module.layer, init_method=init_method, std_val=std_val) else: _init_nn_layers(module=module, init_method=init_method, std_val=std_val) def initialize_norm_layers(module) -> None: """Helper function to initialize normalization layers""" def _init_fn(module): if hasattr(module, "weight") and module.weight is not None: nn.init.ones_(module.weight) if hasattr(module, "bias") and module.bias is not None: nn.init.zeros_(module.bias) _init_fn(module.layer) if hasattr(module, "layer") else _init_fn(module=module) def initialize_weights(opts, modules) -> None: """Helper function to initialize different layers in a model""" # weight initialization conv_init_type = getattr(opts, "model.layer.conv_init", "kaiming_normal") linear_init_type = getattr(opts, "model.layer.linear_init", "normal") conv_std = getattr(opts, "model.layer.conv_init_std_dev", None) linear_std = getattr(opts, "model.layer.linear_init_std_dev", 0.01) group_linear_std = getattr(opts, "model.layer.group_linear_init_std_dev", 0.01) if isinstance(modules, nn.Sequential): for m in modules: if isinstance(m, (nn.Conv2d, nn.Conv3d)): initialize_conv_layer( module=m, init_method=conv_init_type, std_val=conv_std ) elif isinstance(m, norm_layers_tuple): initialize_norm_layers(module=m) elif isinstance(m, (nn.Linear, LinearLayer)): initialize_fc_layer( module=m, init_method=linear_init_type, std_val=linear_std ) elif isinstance(m, GroupLinear): initialize_fc_layer( module=m, init_method=linear_init_type, std_val=group_linear_std ) else: if isinstance(modules, (nn.Conv2d, nn.Conv3d)): initialize_conv_layer( module=modules, init_method=conv_init_type, std_val=conv_std ) elif isinstance(modules, norm_layers_tuple): initialize_norm_layers(module=modules) elif isinstance(modules, (nn.Linear, LinearLayer)): initialize_fc_layer( module=modules, init_method=linear_init_type, std_val=linear_std ) elif isinstance(modules, GroupLinear): initialize_fc_layer( module=modules, init_method=linear_init_type, std_val=group_linear_std ) ================================================ FILE: corenet/modeling/models/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional from corenet.modeling.misc.common import ( freeze_modules_based_on_opts, load_pretrained_model, ) from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper from corenet.third_party.modeling import lora from corenet.utils import logger from corenet.utils.download_utils import get_local_path from corenet.utils.registry import Registry MODEL_REGISTRY = Registry( registry_name="model_registry", base_class=BaseAnyNNModel, lazy_load_dirs=["corenet/modeling/models"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def get_model( opts: argparse.Namespace, category: Optional[str] = None, model_name: Optional[str] = None, use_lora: Optional[bool] = None, *args, **kwargs, ) -> BaseAnyNNModel: """Create a task-specific model from command-line arguments. If model category (or task) and name are passed as an argument, then they are used. Otherwise, `dataset.category` and `model.{category}.name` are read from command-line arguments to read model category and name, respectively. Args: opts: Command-line arguments category: Category or task (e.g., segmentation) model_name: Model name for a specific task (e.g., vit for classification) use_lora: If False, LoRA will not be used. If True, LoRA will be used. If None, the value of @use_lora will be read from @opts. Returns: An instance of `corenet.modeling.models.BaseAnyNNModel`. """ if category is None: category = getattr(opts, "dataset.category") if model_name is None: model_name = getattr(opts, f"model.{category}.name") if model_name == "__base__": # __base__ is used to register the task-specific base classes. These classes often # provide functionalities that can be re-used by sub-classes, but does not provide # task-specific models. logger.error( f"For {category} task, model name can't be __base__. Please check." ) model = MODEL_REGISTRY[model_name, category].build_model(opts, *args, **kwargs) if use_lora is None: use_lora = getattr(opts, "model.lora.use_lora") if use_lora: lora_config = getattr(opts, "model.lora.config") lora.add_lora_layers(model, lora_config) # for some categories, we do not have pre-trained path (e.g., segmentation_head). # Therefore, we need to set the default value. pretrained_wts_path = getattr(opts, f"model.{category}.pretrained", None) if pretrained_wts_path is not None: pretrained_model_path = get_local_path(opts, path=pretrained_wts_path) model = load_pretrained_model( model=model, wt_loc=pretrained_model_path, opts=opts ) model = freeze_modules_based_on_opts(opts, model) return model def arguments_model(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: parser = BaseAnyNNModel.add_arguments(parser=parser) parser = MODEL_REGISTRY.all_arguments(parser=parser) parser = FullyShardedDataParallelWrapper.add_arguments(parser=parser) return parser ================================================ FILE: corenet/modeling/models/audio_classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/audio_classification/audio_byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Union from torch import Tensor from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.audio_classification.base_audio_classification import ( BaseAudioClassification, ) from corenet.modeling.models.classification.byteformer import ByteFormer @MODEL_REGISTRY.register(name="byteformer", type="audio_classification") class AudioByteFormer(ByteFormer, BaseAudioClassification): """Identical to byteformer.ByteFormer, but registered as an audio classification model.""" def forward(self, x: Dict[str, Tensor], *args, **kwargs) -> Tensor: """ Perform a forward pass on input bytes. The input is a dictionary containing the input tensor. The tensor is stored as an integer tensor of shape [batch_size, sequence_length]. Integer tensors are used because the tensor usually contains mask tokens. Args: x: A dictionary containing {"audio": audio_bytes}. Returns: The output logits. """ return super().forward(x["audio"], *args, **kwargs) def dummy_input_and_label(self, batch_size: int) -> Dict: """ Get a dummy input and label that could be passed to the model. Args: batch_size: The batch size to use for the generated inputs. Returns: A dict with { "samples": {"audio": tensor of shape [batch_size, sequence_length]}, "targets": tensor of shape [batch_size], } """ input_and_label = super().dummy_input_and_label(batch_size) ret = { "samples": {"audio": input_and_label["samples"]}, "targets": input_and_label["targets"], } return ret ================================================ FILE: corenet/modeling/models/audio_classification/base_audio_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel @MODEL_REGISTRY.register(name="__base__", type="audio_classification") class BaseAudioClassification(BaseAnyNNModel): """Base class for audio classification. Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" if cls != BaseAudioClassification: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.audio-classification.name", type=str, default=None, help="Name of the audio classification model. Defaults to None.", ) group.add_argument( "--model.audio-classification.pretrained", type=str, default=None, help="Path of the pretrained backbone. Defaults to None.", ) return parser ================================================ FILE: corenet/modeling/models/base_model.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from __future__ import annotations import argparse from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple import torch from torch import nn from corenet.modeling.layers import norm_layers_tuple from corenet.modeling.misc.common import get_tensor_sizes, parameter_list from corenet.modeling.misc.init_utils import initialize_weights from corenet.options.parse_args import JsonValidator from corenet.third_party.modeling import lora from corenet.utils import logger from corenet.utils.common_utils import check_frozen_norm_layer from corenet.utils.ddp_utils import is_master class BaseAnyNNModel(nn.Module): """Base class for any neural network""" def __init__(self, opts, *args, **kwargs) -> None: super().__init__() self.opts = opts @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): """Add model-specific arguments""" if cls != BaseAnyNNModel: return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.resume-exclude-scopes", type=str, default="", help="Comma-separated list of parameter scopes (regex strings) to exclude when " "loading a pre-trained model", ) group.add_argument( "--model.ignore-missing-scopes", type=str, default="", help="Comma-separated list of parameter scopes (regex strings) to ignore " "if they are missing from the pre-training model", ) group.add_argument( "--model.rename-scopes-map", type=JsonValidator(List[List[str]]), default=None, help="A mapping from checkpoint variable names to match the existing model names." " The mapping is represented as a List[List[str]], e.g. [['before', 'after'], ['this', 'that']]." " Note: only loading from Yaml file is supported for this argument.", ) group.add_argument( "--model.freeze-modules", type=str, default="", help="Comma-separated list of parameter scopes (regex strings) to freeze.", ) group.add_argument( "--model.activation-checkpointing", action="store_true", help="If enabled, layer specified in model using 'get_activation_checkpoint_submodule_class' would be used \ for activation checkpointing (a.k.a. gradient checkpointing).", ) group.add_argument( "--model.lora.config", type=JsonValidator(List[Dict[str, Any]]), help="A json-formatted configuration for the LoRA model. See corenet/modeling/models/language_modeling/lora.py for details.", ) group.add_argument( "--model.lora.use-lora", action="store_true", help="If set, use LoRA for the model. Note that parameters are " "not automatically frozen. They must be frozen with " "--model.freeze-modules.", ) return parser def reset_parameters(self, opts: argparse.Namespace) -> None: """Initialize model weights""" initialize_weights(opts=opts, modules=self.modules()) def forward(self, x: Any, *args, **kwargs) -> Any: """Implement the model-specific forward function in sub-classes.""" raise NotImplementedError def _apply_layer_wise_lr( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ): """This function can be used to adjust the learning rate of each layer in a model. The functionality of this function may vary from model to model, so we do not implement it in the base class and expects child model classes will implement this function, if desired. """ raise NotImplementedError( f"Please implement _apply_layer_wise_lr function for {type(self).__name__}" ) def get_trainable_parameters( self, weight_decay: float = 0.0, no_decay_bn_filter_bias: bool = False, module_name: str = "", *args, **kwargs, ) -> Tuple[List[Mapping], List[float]]: """Get parameters for training along with the learning rate. Args: weight_decay: weight decay no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False. Returns: Returns a tuple of length 2. The first entry is a list of dictionary with three keys (params, weight_decay, param_names). The second entry is a list of floats containing learning rate for each parameter. Note: Kwargs may contain module_name. To avoid multiple arguments with the same name, we pop it and concatenate with encoder or head name """ param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name, *args, **kwargs, ) return param_list, [1.0] * len(param_list) def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes. Child classes should implement it.""" raise NotImplementedError( f"Please implement dummy_input_and_label function for {type(self).__name__}" ) def get_exportable_model(self) -> nn.Module: """This function can be used to prepare the architecture for inference. For example, re-parameterizing branches when possible. The functionality of this method may vary from model to model, so child model classes have to implement this method, if such a transformation exists. """ return self @classmethod def freeze_norm_layers( cls, opts: argparse.Namespace, model: BaseAnyNNModel ) -> None: """Freeze normalization layers in the model Args: opts: Command-line arguments model: An instance of `BaseAnyNNModel` """ is_maseter_node = is_master(opts) for m in model.modules(): if isinstance(m, norm_layers_tuple): m.eval() m.weight.requires_grad = False m.bias.requires_grad = False m.training = False # check if layers are frozen or not frozen_state, count_norm = check_frozen_norm_layer(model) if count_norm > 0 and frozen_state and is_maseter_node: logger.error( "Something is wrong while freezing normalization layers. Please check" ) if is_maseter_node: logger.log("Normalization layers are frozen") @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: """Build a model from command-line arguments. Sub-classes must implement this method. Args: opts: Command-line arguments ...note:: This class method is useful when we have a common logic for constructing the abstract class for a given task. The concrete sub-classes typically don't override this method. """ return cls(opts, *args, **kwargs) @torch.no_grad() def info(self) -> None: """Prints model, parameters, and FLOPs on start rank.""" train_mode = False if self.training: # do profiling in eval mode train_mode = True self.eval() logger.log(logger.color_text("Model")) # print the model skeleton print(self) logger.double_dash_line(dashes=65) print("{:>35} Summary".format(self.__class__.__name__)) logger.double_dash_line(dashes=65) # compute the network parameters overall_params = sum([p.numel() for p in self.parameters()]) overall_trainable_params = sum( [p.numel() for p in self.parameters() if p.requires_grad] ) print("{:<20} = {:>8.3f} M".format("Total parameters", overall_params / 1e6)) print( "{:<20} = {:>8.3f} M\n".format( "Total trainable parameters", overall_trainable_params / 1e6 ) ) try: # Compute FLOPs using FVCore try: input_fvcore = self.dummy_input_and_label(batch_size=1)["samples"] except NotImplementedError: logger.warning( "Profiling not available, dummy_input_and_label not implemented for this model." ) return # compute flops using FVCore from fvcore.nn import FlopCountAnalysis, flop_count_table flop_analyzer = FlopCountAnalysis(self, input_fvcore) logger.log(f"FVCore Analysis:") # print input sizes input_sizes = get_tensor_sizes(input_fvcore) logger.log("Input sizes: {}".format(input_sizes)) print(flop_count_table(flop_analyzer)) logger.warning( "\n** Please be cautious when using the results in papers. " "Certain operations may or may not be accounted in FLOP computation in FVCore. " "Therefore, you want to manually ensure that FLOP computation is correct." ) uncalled_modules = flop_analyzer.uncalled_modules() if len(uncalled_modules) > 0: logger.warning(f"Uncalled Modules:\n{uncalled_modules}") else: logger.log(f"No uncalled modules detected by fvcore.") unsupported_ops = flop_analyzer.unsupported_ops() if len(unsupported_ops) > 0: logger.warning(f"Unsupported Ops:\n{unsupported_ops}") else: logger.log(f"No unsupported ops detected by fvcore.") except: logger.ignore_exception_with_warning( "Unable to compute FLOPs using FVCore. Please check" ) logger.double_dash_line(dashes=65) if train_mode: # switching back to train mode. self.train() def get_fsdp_wrap_policy(self) -> Optional[Callable[[nn.Module, bool, int], bool]]: """Returns the auto wrapping policy for FSDP. This is either ``None`` or a callable of a fixed signature. If it is ``None``, then ``module`` is wrapped with only a top-level FSDP instance without any nested wrapping. If it is a callable, then it should take in three arguments ``module: nn.Module``, ``recurse: bool``, and ``nonwrapped_numel: int`` and should return a ``bool`` specifying whether the passed-in ``module`` should be wrapped if ``recurse=False`` or if the traversal should continue down the subtree if ``recurse=True``. Additional custom arguments may be added to the callable. The ``size_based_auto_wrap_policy`` in ``torch.distributed.fsdp.wrap.py`` gives an example callable that wraps a module if the parameters in its subtree exceed 100M numel. A good practice is to print the model after wrapping and adjust as needed. """ raise NotImplementedError( "Wrapping policy to be used with FSDP is not defined." ) def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the sub-module class that needs to be checkpointed. Activations of checkpointed sub-module are stored, and recomputed during the backward pass, thus providing a trade-off between memory and compute. """ raise NotImplementedError( "Activation checkpoint submodule class is not implemented." ) ================================================ FILE: corenet/modeling/models/classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/classification/base_image_encoder.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List, Mapping, Optional, Tuple import torch from torch import Tensor, nn from torch.utils.checkpoint import checkpoint as gradient_checkpoint_fn from corenet.constants import is_test_env from corenet.modeling.layers import LinearLayer from corenet.modeling.misc.init_utils import initialize_fc_layer from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel from corenet.modeling.neural_augmentor import build_neural_augmentor from corenet.utils import logger @MODEL_REGISTRY.register(name="__base__", type="classification") class BaseImageEncoder(BaseAnyNNModel): """Base class for different image classification models""" def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.conv_1 = None self.layer_1 = None self.layer_2 = None self.layer_3 = None self.layer_4 = None self.layer_5 = None self.conv_1x1_exp = None self.classifier = None self.round_nearest = 8 # Segmentation architectures like Deeplab and PSPNet modifies the strides of the backbone # We allow that using output_stride and replace_stride_with_dilation arguments self.dilation = 1 output_stride = kwargs.get("output_stride", None) self.dilate_l4 = False self.dilate_l5 = False if output_stride == 8: self.dilate_l4 = True self.dilate_l5 = True elif output_stride == 16: self.dilate_l5 = True self.output_stride = output_stride self.model_conf_dict = dict() self.neural_augmentor = build_neural_augmentor(opts=opts, *args, **kwargs) if getattr(opts, "model.classification.gradient_checkpointing"): logger.error( "The argument, --model.classification.gradient-checkpointing, is deprecated and should not be used. \ Please implement 'get_activation_checkpoint_submodule_class' and use --model.activation-checkpointing instead." ) self.enable_layer_wise_lr_decay = getattr( opts, "model.classification.enable_layer_wise_lr_decay" ) self.layer_wise_lr_decay_rate = getattr( opts, "model.classification.layer_wise_lr_decay_rate" ) @property def n_classes(self) -> int: """Number of classes that model is or will be trained to classify.""" n_classes = getattr(self.opts, "model.classification.n_classes") if n_classes is None: logger.error( f"Number of classes in {self.__class__.__name__} cannot be None. Please specify using 'model.classification.n_classes' argument in configuration file." ) return n_classes @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add image classification model-specific arguments""" if cls != BaseImageEncoder: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.classifier-dropout", type=float, default=0.0, help="Dropout rate in classifier", ) group.add_argument( "--model.classification.name", type=str, default=None, help="Model name" ) group.add_argument( "--model.classification.n-classes", type=int, default=1000, help="Number of classes in the dataset", ) group.add_argument( "--model.classification.pretrained", type=str, default=None, help="Path of the pretrained backbone", ) group.add_argument( "--model.classification.freeze-batch-norm", action="store_true", help="Freeze batch norm layers", ) group.add_argument( "--model.classification.activation.name", default=None, type=str, help="Non-linear function name (e.g., relu)", ) group.add_argument( "--model.classification.activation.inplace", action="store_true", help="Inplace non-linear functions", ) group.add_argument( "--model.classification.activation.neg-slope", default=0.1, type=float, help="Negative slope in leaky relu", ) group.add_argument( "--model.classification.finetune-pretrained-model", action="store_true", help="Finetune a pretrained model", ) group.add_argument( "--model.classification.n-pretrained-classes", type=int, default=None, help="Number of pre-trained classes", ) group.add_argument( "--model.classification.gradient-checkpointing", action="store_true", help="Checkpoint output of each spatial level in the classification backbone. Note that" "we only take care of checkpointing in {}. If custom forward functions are used, please" "implement checkpointing accordingly. " "This option is deprecated in favor or --model.activation-checkpointing.", ) group.add_argument( "--model.classification.enable-layer-wise-lr-decay", action="store_true", default=False, help="Enable layer-wise LR.", ) group.add_argument( "--model.classification.layer-wise-lr-decay-rate", type=float, default=1.0, help="Layer-wise LR decay range. Each model needs to define how layer-wise LR should be decayed." "For ViT, we decay layer_wise_lr_decay_rate ** (n_layers - i), where i is the layer index.", ) return parser def check_model(self) -> None: """Check to see if model is adhering to the image encoder structure. Sub-classes are not required to adhere to this structure. This is only required for easy integration with downstream tasks.""" assert ( self.model_conf_dict ), "Model configuration dictionary should not be empty" assert self.conv_1 is not None, "Please implement self.conv_1" assert self.layer_1 is not None, "Please implement self.layer_1" assert self.layer_2 is not None, "Please implement self.layer_2" assert self.layer_3 is not None, "Please implement self.layer_3" assert self.layer_4 is not None, "Please implement self.layer_4" assert self.layer_5 is not None, "Please implement self.layer_5" assert self.conv_1x1_exp is not None, "Please implement self.conv_1x1_exp" assert self.classifier is not None, "Please implement self.classifier" def update_classifier(self, opts: argparse.Namespace, n_classes: int) -> None: """This function updates the classification layer in a model. Useful for fine-tuning purposes.""" logger.warning( "We encourage to use model scopes (`--model.resume-exclude-scopes`, `--model.ignore-missing-scopes`, " "and `--model.rename-scopes-map`) for updating classifier for fine-tuning tasks. We will be " "deprecating this function in future." ) linear_init_type = getattr(opts, "model.layer.linear_init", "normal") if isinstance(self.classifier, nn.Sequential): in_features = self.classifier[-1].in_features layer = LinearLayer( in_features=in_features, out_features=n_classes, bias=True ) initialize_fc_layer(layer, init_method=linear_init_type) self.classifier[-1] = layer else: in_features = self.classifier.in_features layer = LinearLayer( in_features=in_features, out_features=n_classes, bias=True ) initialize_fc_layer(layer, init_method=linear_init_type) # re-init head head_init_scale = 0.001 layer.weight.data.mul_(head_init_scale) layer.bias.data.mul_(head_init_scale) self.classifier = layer def _forward_layer(self, layer: nn.Module, x: Tensor) -> Tensor: """Run a layer of the model, optionally with checkpointing""" # Larger models with large input image size may not be able to fit into memory. # We can use gradient checkpointing to enable training with large models and large inputs return layer(x) def extract_end_points_all( self, x: Tensor, use_l5: Optional[bool] = True, use_l5_exp: Optional[bool] = False, *args, **kwargs, ) -> Dict[str, Tensor]: """Extract feature maps from different spatial levels of the model. Args: x: Input image tensor use_l5: Include features from `layer_5` in the output dictionary. Defaults to True. use_l5_exp: Include features from `conv_1x1_exp` in the output dictionary. Defaults to False. Returns: A mapping containing the name and output at each spatial-level of the model. ...note: This is useful for down-stream tasks. """ out_dict = {} # Use dictionary over NamedTuple so that JIT is happy if self.training and self.neural_augmentor is not None: x = self.neural_augmentor(x) out_dict["augmented_tensor"] = x x = self._forward_layer(self.conv_1, x) # 112 x112 x = self._forward_layer(self.layer_1, x) # 112 x112 out_dict["out_l1"] = x x = self._forward_layer(self.layer_2, x) # 56 x 56 out_dict["out_l2"] = x x = self._forward_layer(self.layer_3, x) # 28 x 28 out_dict["out_l3"] = x x = self._forward_layer(self.layer_4, x) # 14 x 14 out_dict["out_l4"] = x if use_l5: x = self._forward_layer(self.layer_5, x) # 7 x 7 out_dict["out_l5"] = x if use_l5_exp: x = self._forward_layer(self.conv_1x1_exp, x) out_dict["out_l5_exp"] = x return out_dict def extract_end_points_l4(self, x: Tensor, *args, **kwargs) -> Dict[str, Tensor]: """This function is similar to `extract_end_points_all`, with an exception that it only returns output in a dictionary form till `layer_4` of the model. """ return self.extract_end_points_all(x, use_l5=False) def extract_features(self, x: Tensor, *args, **kwargs) -> Tensor: """This function is similar to `extract_end_points_all`. However, it returns a single tensor as the output of the last layer instead of a dictionary, and is typically used during classification tasks where intermediate feature maps are not required. """ x = self._forward_layer(self.conv_1, x) x = self._forward_layer(self.layer_1, x) x = self._forward_layer(self.layer_2, x) x = self._forward_layer(self.layer_3, x) x = self._forward_layer(self.layer_4, x) x = self._forward_layer(self.layer_5, x) x = self._forward_layer(self.conv_1x1_exp, x) return x def forward_classifier(self, x: Tensor, *args, **kwargs) -> Tensor: """A helper function to extract features and running a classifier.""" # We add another classifier function so that the classifiers # that do not adhere to the structure of BaseEncoder can still # use neural augmentor x = self.extract_features(x) x = self.classifier(x) return x def forward(self, x: Any, *args, **kwargs) -> Any: """A forward function of the model, optionally training the model with neural augmentation.""" if self.neural_augmentor is not None: if self.training: x_aug = self.neural_augmentor(x) prediction = self.forward_classifier(x_aug) # .detach() out_dict = {"augmented_tensor": x_aug, "logits": prediction} else: out_dict = { "augmented_tensor": None, "logits": self.forward_classifier(x), } return out_dict else: x = self.forward_classifier(x, *args, **kwargs) return x def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ) -> Tuple[List[Mapping], List[float]]: """Get parameters for training along with the learning rate. Args: weight_decay: weight decay no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False. Returns: Returns a tuple of length 2. The first entry is a list of dictionary with three keys (params, weight_decay, param_names). The second entry is a list of floats containing learning rate for each parameter. """ if self.enable_layer_wise_lr_decay: return self._apply_layer_wise_lr( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs, ) return super().get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs, ) def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes. Child classes must override it if functionality is different. """ img_channels = 3 if is_test_env(): # We use smaller spatial resolution, for faster testing. # We use 32 because most ImageNet models do a down-sampling by a factor of 32 before # global average pooling and classification layer. height = 32 width = 32 else: # this is the typical resolution used in ImageNet datasets height = 224 width = 224 n_labels = 10 img_tensor = torch.randn( batch_size, img_channels, height, width, dtype=torch.float ) label_tensor = torch.randint(low=0, high=n_labels, size=(batch_size,)).long() return {"samples": img_tensor, "targets": label_tensor} def get_exportable_model(self) -> nn.Module: """ This function can be used to prepare the architecture for inference. For example, re-parameterizing branches when possible. The functionality of this method may vary from model to model, so child model classes have to implement this method, if such a transformation exists. """ return self @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: """Helper function to build a model. Args: opts: Command-line arguments Returns: An instance of `corenet.modeling.models.BaseAnyNNModel`. """ default_opt_info = set_model_specific_opts_before_model_building(opts) model = cls(opts, *args, **kwargs) unset_model_specific_opts_after_model_building(opts, default_opt_info) if getattr(opts, "model.classification.freeze_batch_norm"): cls.freeze_norm_layers(opts=opts, model=model) return model # TODO: Find models and configurations that uses `set_model_specific_opts_before_model_building` and # `unset_model_specific_opts_after_model_building` functions. Find a more explicit way of satisfying this requirement, # such as namespacing config entries in a more composable way so that we no longer have conflicting config entries. def set_model_specific_opts_before_model_building( opts: argparse.Namespace, ) -> Dict[str, Any]: """Override library-level defaults with model-specific default values. Args: opts: Command-line arguments Returns: A dictionary containing the name of arguments that are updated along with their original values. This dictionary is used in `unset_model_specific_opts_after_model_building` function to unset the model-specific to library-specific defaults. """ cls_act_fn = getattr(opts, "model.classification.activation.name") default_opts_info = {} if cls_act_fn is not None: # Override the default activation arguments with classification network specific arguments default_act_fn = getattr(opts, "model.activation.name", "relu") default_act_inplace = getattr(opts, "model.activation.inplace", False) default_act_neg_slope = getattr(opts, "model.activation.neg_slope", 0.1) setattr(opts, "model.activation.name", cls_act_fn) setattr( opts, "model.activation.inplace", getattr(opts, "model.classification.activation.inplace", False), ) setattr( opts, "model.activation.neg_slope", getattr(opts, "model.classification.activation.neg_slope", 0.1), ) default_opts_info["model.activation.name"] = default_act_fn default_opts_info["model.activation.inplace"] = default_act_inplace default_opts_info["model.activation.neg_slope"] = default_act_neg_slope return default_opts_info def unset_model_specific_opts_after_model_building( opts: argparse.Namespace, default_opts_info: Dict[str, Any], *ars, **kwargs ) -> None: """Given command-line arguments and a mapping of opts that needs to be unset, this function unsets the library-level defaults that were over-ridden previously in `set_model_specific_opts_before_model_building`. """ assert isinstance(default_opts_info, dict), ( f"Please ensure set_model_specific_opts_before_model_building() " f"returns a dict." ) if default_opts_info: for k, v in default_opts_info.items(): setattr(opts, k, v) ================================================ FILE: corenet/modeling/models/classification/byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import Dict, Optional, Tuple, Union import numpy as np import torch from torch import Tensor, nn from torch.nn import init from corenet.modeling.layers import ( LinearLayer, embedding, get_normalization_layer, normalization, positional_embedding, token_merging, ) from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel from corenet.modeling.models.classification.config.byteformer import get_configuration from corenet.modeling.modules import WindowedTransformerEncoder def unfold_tokens(t: Tensor, kernel_size: int) -> Tensor: """ Group tokens from tensor @t using torch.Tensor.unfold, using the given kernel size. This amounts to windowing @t using overlapping windows of size @kernel_size, with overlap of @kernel_size // 2. Args: t: A tensor of shape [batch_size, sequence_length, num_channels]. kernel_size: The kernel size. Returns: A tensor of shape [batch_size * (sequence_length - kernel_size) // (kernel_size // 2) + 1, kernel_size, num_channels]. """ t = t.unfold(dimension=1, size=kernel_size, step=kernel_size // 2) B, L, C, _ = t.shape t = t.reshape(B * L, C, kernel_size) t = t.transpose(1, 2) return t @MODEL_REGISTRY.register(name="byteformer", type="classification") class ByteFormer(BaseAnyNNModel): """ This class defines the `ByteFormer `_ architecture. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) byteformer_config = get_configuration(opts) embed_dim = byteformer_config["embed_dim"] ffn_dim = byteformer_config["ffn_dim"] n_transformer_layers = byteformer_config["n_transformer_layers"] num_heads = byteformer_config["n_attn_heads"] attn_dropout = byteformer_config["attn_dropout"] dropout = byteformer_config["dropout"] ffn_dropout = byteformer_config["ffn_dropout"] norm_layer = byteformer_config["norm_layer"] # This is usually 257 in the case of byte inputs (2**8 + 1 mask token). vocab_size = getattr(opts, "model.classification.byteformer.vocab_size") self.embeddings = embedding.Embedding( opts, num_embeddings=vocab_size, embedding_dim=embed_dim, padding_idx=-1 ) # Reinitialize everything except the padding index. init.trunc_normal_(self.embeddings.weight[:-1], std=math.sqrt(1.0 / embed_dim)) self.dummy_input_token_length = getattr( opts, "model.classification.byteformer.dummy_input_token_length" ) # Add token reduction convolution. self.conv_kernel_size = getattr( opts, "model.classification.byteformer.conv_kernel_size" ) if self.conv_kernel_size == 0: # We skip the convolution. self.token_reduction_net = None if self.conv_kernel_size is not None: self.token_reduction_net = nn.Conv1d( embed_dim, get_configuration(opts)["embed_dim"], kernel_size=self.conv_kernel_size, stride=self.conv_kernel_size // 2, bias=False, ) # Add the positional embeddings. self.max_num_tokens = getattr( opts, "model.classification.byteformer.max_num_tokens" ) self.sinusoidal_pos_embed = getattr( opts, "model.classification.byteformer.sinusoidal_pos_emb" ) self.pos_embed = positional_embedding.PositionalEmbedding( opts=opts, num_embeddings=self.max_num_tokens, embedding_dim=embed_dim, sequence_first=False, padding_idx=None, is_learnable=not self.sinusoidal_pos_embed, interpolation_mode="bilinear", ) pos_emb_drop_p = getattr(opts, "model.classification.byteformer.dropout") self.emb_dropout = nn.Dropout(p=pos_emb_drop_p) # Build the transformer backbone. window_sizes = getattr(opts, "model.classification.byteformer.window_sizes") window_shifts = getattr(opts, "model.classification.byteformer.window_shifts") downsample = getattr(opts, "model.classification.byteformer.downsample") if len(window_sizes) == 1: window_sizes = window_sizes * n_transformer_layers for x in [window_sizes, window_shifts, downsample]: if len(x) != n_transformer_layers: raise ValueError( f"Invalid argument length {len(x)} != {n_transformer_layers}" ) stochastic_dropout = getattr( opts, "model.classification.byteformer.stochastic_dropout" ) per_layer_stochastic_drop_rate = [ round(x, 3) for x in np.linspace(0, stochastic_dropout, n_transformer_layers) ] blocks = [] self.downsamplers = nn.ModuleDict() for layer_idx in range(n_transformer_layers): blocks.append( WindowedTransformerEncoder( opts=opts, embed_dim=embed_dim, ffn_latent_dim=ffn_dim, num_heads=num_heads, attn_dropout=attn_dropout, dropout=dropout, ffn_dropout=ffn_dropout, transformer_norm_layer=norm_layer, stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx], window_size=window_sizes[layer_idx], window_shift=window_shifts[layer_idx], ) ) if downsample is not None and downsample[layer_idx]: self.downsamplers[self.get_downsampler_name(layer_idx)] = ( token_merging.TokenMerging(embed_dim) ) self.transformer = nn.Sequential(*blocks) self.post_transformer_norm = get_normalization_layer( opts=opts, num_features=embed_dim, norm_type=norm_layer ) num_classes = getattr(opts, "model.classification.n_classes") self.classifier = LinearLayer(embed_dim, num_classes) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != ByteFormer: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.byteformer.dropout", type=float, default=0.0, help="Dropout in Byteformer layers. Defaults to 0.0.", ) group.add_argument( "--model.classification.byteformer.stochastic-dropout", type=float, default=0.0, help="Probability of applying stochastic dropout to " "TransformerEncoder submodules. Defaults to 0.0.", ) group.add_argument( "--model.classification.byteformer.norm-layer", type=str, default="layer_norm", help="Normalization layer in Byteformer. Defaults to LayerNorm.", choices=list(normalization.NORM_LAYER_REGISTRY.keys()), ) group.add_argument( "--model.classification.byteformer.sinusoidal-pos-emb", action="store_true", default=False, help="Use sinusoidal instead of learnable positional encoding. Defaults to False.", ) group.add_argument( "--model.classification.byteformer.use-pytorch-mha", action="store_true", default=False, help="Use PyTorch's native multi-head attention. Defaults to False.", ) group.add_argument( "--model.classification.byteformer.mode", type=str, default="tiny", help="Byteformer mode, which determines the model size. Defaults to tiny.", choices=("tiny", "small", "base", "huge"), ) group.add_argument( "--model.classification.byteformer.vocab-size", type=int, help="The vocab size of the token embedding. Defaults to 257," "corresponding to the number of unique bytes (256) plus 1 " "more for the mask token.", default=257, ) group.add_argument( "--model.classification.byteformer.max-num-tokens", type=int, help="The maximum number of tokens that can be input to the network. Defaults to 10000.", default=10000, ) group.add_argument( "--model.classification.byteformer.conv-kernel-size", type=int, default=16, help="The size of the kernel of the initial downsampling conv1d. Defaults to 16.", ) group.add_argument( "--model.classification.byteformer.window-sizes", type=int, nargs="*", default=[128], help="A list of window sizes used in shifted window attention. If the " "list is length 1, the same window size is used for all windows. " "Defaults to 128 for all windows.", ) group.add_argument( "--model.classification.byteformer.window-shifts", type=int, nargs="*", default=[0, 64] * 6, help="A list of shifts used in shifted window attention. Defaults to values that alternate between 0 and 64.", ) default_downsampling = [True, True] + ([False, True] * 4) + [False, False] group.add_argument( "--model.classification.byteformer.downsample", type=bool, nargs="*", default=default_downsampling, help="A list of boolean values, where the i'th element specifies " "whether to downsample after the transformer block with index i. " f"Defaults to {default_downsampling}.", ) group.add_argument( "--model.classification.byteformer.padding-index", default=-1, type=int, help="The index used for padding tokens. Defaults to -1.", ) group.add_argument( "--model.classification.byteformer.dummy-input-token-length", default=48564, type=int, help="The token length to use for dummy inputs. Defaults to 48564, " "corresponding to the average length of 224x224 JPEG images from " "ImageNet.", ) return parser def dummy_input_and_label(self, batch_size: int) -> Dict: """ Get a dummy input and label that could be passed to the model. Args: batch_size: The batch size to use for the generated inputs. Returns: A dict with { "samples": tensor of shape [batch_size, sequence_length], "targets": tensor of shape [batch_size], } """ n_labels = 10 max_value = 257 samples = torch.randint( 0, max_value, [batch_size, self.dummy_input_token_length] ) targets = torch.randint(low=0, high=n_labels, size=(batch_size,)).long() return {"samples": samples, "targets": targets} def apply_token_reduction_net( self, x: Tensor, x_mask: Tensor ) -> Tuple[Tensor, Tensor]: """ Apply the portion of the network used to reduce sequence lengths before the transformer backbone. Args: x: The input token embeddings of shape [batch_size, sequence_length, embed_dim]. x_mask: The input mask of shape [batch_size, sequence_length]. Returns: New versions of @x and @x_mask, downsampled along the sequence dimension by the token reduction net. """ B, N, C = x.shape if self.token_reduction_net is None: return x, x_mask x = self.token_reduction_net(x.permute(0, 2, 1)).permute(0, 2, 1) if x_mask is not None: x_mask = unfold_tokens( x_mask.reshape(B, N, 1).float(), self.conv_kernel_size ) # The mask is now [B * N, kernel_size, 1]. It contains values in {0, -inf}. x_mask = x_mask.max(dim=1).values.view(x.shape[0], x.shape[1]) assert x.shape[:2] == x_mask.shape return x, x_mask def get_backbone_inputs(self, x: Tensor) -> Tuple[Tensor, Tensor]: """ Convert input bytes into embeddings to be passed to the network's transformer backbone. Args: x: The input bytes as an integer tensor of shape [batch_size, sequence_length]. Integer tensors are expected (rather than byte tensors) since -1 is usually used for padding. Returns: The embeddings of shape [batch_size, new_sequence_length] and a mask tensor of shape [batch_size, new_sequence_length]. The mask contains 0 at unmasked positions and float(-inf) at masked positions. """ mask = torch.zeros_like(x, dtype=torch.float) mask[x == -1].fill_(float("-inf")) mask = mask.detach().requires_grad_(False) x[x == -1] = self.embeddings.padding_idx x = self.embeddings(x) x, mask = self.apply_token_reduction_net(x, mask) x = x + self.pos_embed(self.max_num_tokens)[:, : x.shape[1]] x = self.emb_dropout(x) return x, mask def backbone_forward( self, x: Tensor, key_padding_mask: Tensor ) -> Tuple[Tensor, Tensor]: """ Execute the forward pass of the network's transformer backbone. Args: x: The input embeddings as a [batch_size, sequence_length, embed_dim] tensor. key_padding_mask: The mask tensor of shape [batch_size, sequence_length]. Returns: The outputs of the backbone as a tuple. The first element is the feature tensor, and the second element is the updated key_padding_mask. """ B, S, _ = x.shape assert key_padding_mask.shape == (B, S) for layer_idx, elem in enumerate(self.transformer): x = elem(x, key_padding_mask=key_padding_mask) if self.get_downsampler(layer_idx) is not None: x, key_padding_mask = self.get_downsampler(layer_idx)( x, key_padding_mask ) x = self.post_transformer_norm(x) return x, key_padding_mask def get_downsampler_name(self, idx: int) -> str: """ Get the name of the downsampling layer with index @idx. Args: idx: The index of the downsampling layer. Returns: A string representing the name of the donwsampling layer. """ return f"downsample_{idx}" def get_downsampler(self, idx: int) -> Optional[nn.Module]: """ Get the module that performs downsampling after transformer layer @idx. If no downsampling occurs after that layer, return None. Args: idx: The desired index. Returns: The downsampling layer, or None. """ name = self.get_downsampler_name(idx) if name not in self.downsamplers: return None return self.downsamplers[name] def forward(self, x: Tensor, *args, **kwargs) -> Tensor: """ Perform a forward pass on input bytes. The tensor is stored as an integer tensor of shape [batch_size, sequence_length]. Integer tensors are used because @x usually contains mask tokens. Args: x: The input tensor of shape [batch_size, sequence_length]. Returns: The output logits. """ x, key_padding_mask = self.get_backbone_inputs(x) x, attn_mask = self.backbone_forward(x, key_padding_mask) attn_mask = attn_mask.view(x.shape[0], x.shape[1], 1) x[(attn_mask == float("-inf")).expand(-1, -1, x.shape[-1])] = 0 norms = (attn_mask == 0).sum(dim=1) x = torch.sum(x, dim=1) / norms x = self.classifier(x) return x @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: """ Helper function to build a model. Args: opts: Command-line arguments. Returns: An instance of `corenet.modeling.models.BaseAnyNNModel`. """ model = cls(opts, *args, **kwargs) if getattr(opts, "model.classification.freeze_batch_norm"): cls.freeze_norm_layers(opts=opts, model=model) return model ================================================ FILE: corenet/modeling/models/classification/config/__init__.py ================================================ ================================================ FILE: corenet/modeling/models/classification/config/byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict from corenet.utils import logger def get_configuration(opts: argparse.Namespace) -> Dict: """ Get configuration parameters associated with ByteFormer. These parameters are similar to those of DeIT (https://arxiv.org/pdf/2012.12877.pdf). Args: opts: The options configuration. Returns: A dict with keys specifying the parameters needed for ByteFormer. """ mode = getattr(opts, "model.classification.byteformer.mode") mode = mode.lower() dropout = getattr(opts, "model.classification.byteformer.dropout") norm_layer = getattr(opts, "model.classification.byteformer.norm_layer") byteformer_config = dict() if mode == "tiny": byteformer_config = { "embed_dim": 192, "n_transformer_layers": 12, "n_attn_heads": 3, "ffn_dim": 192 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.1, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "small": byteformer_config = { "embed_dim": 384, "n_transformer_layers": 12, "n_attn_heads": 6, "ffn_dim": 384 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "base": byteformer_config = { "embed_dim": 768, "n_transformer_layers": 12, "n_attn_heads": 12, "ffn_dim": 768 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "huge": byteformer_config = { "embed_dim": 1280, "n_transformer_layers": 32, "n_attn_heads": 20, # each head dimension is 64 "ffn_dim": 1280 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } else: logger.error("Got unsupported ByteFormer configuration: {}".format(mode)) return byteformer_config ================================================ FILE: corenet/modeling/models/classification/config/efficientnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from dataclasses import dataclass from functools import partial from typing import Dict from corenet.utils import logger from corenet.utils.math_utils import make_divisible @dataclass class CompoundScalingConfig: """This class stores the compound scaling configuration""" width_mult: float depth_mult: float train_resolution: int @dataclass class EfficientNetBlockConfig: """This class stores the config for each block in EfficientNet i.e. MBConv layers in Table 1 of `EfficientNet paper `_ Notably, this class takes width_mult and depth_mult as input too and adjusts layers' depth and width, as is required in different modes of EfficientNet. """ def __init__( self, expand_ratio: float, kernel: int, stride: int, in_channels: int, out_channels: int, num_layers: int, width_mult: float, depth_mult: float, ): self.expand_ratio = expand_ratio self.kernel = kernel self.stride = stride self.in_channels = int(make_divisible(in_channels * width_mult, 8)) self.out_channels = int(make_divisible(out_channels * width_mult, 8)) self.num_layers = int(math.ceil(num_layers * depth_mult)) def get_configuration(opts) -> Dict: network_mode = getattr(opts, "model.classification.efficientnet.mode") if network_mode is None: logger.error( "EfficientNet mode can't be none. Please specify --model.classification.efficientnet.mode" ) network_mode = network_mode.lower() network_config = dict() # EfficientNet scales depth, width and resolution. # We will make use of resolution in the yaml configuration file, but leave it here for the sake of completeness compound_scaling_cfg = { "b0": CompoundScalingConfig(1.0, 1.0, 224), "b1": CompoundScalingConfig(1.0, 1.1, 240), "b2": CompoundScalingConfig(1.1, 1.2, 260), "b3": CompoundScalingConfig(1.2, 1.4, 300), "b4": CompoundScalingConfig(1.4, 1.8, 380), "b5": CompoundScalingConfig(1.6, 2.2, 456), "b6": CompoundScalingConfig(1.8, 2.6, 528), "b7": CompoundScalingConfig(2.0, 3.1, 600), "b8": CompoundScalingConfig(2.2, 3.6, 672), } if network_mode in compound_scaling_cfg: compound_scaling_cfg_mode_i = compound_scaling_cfg[network_mode] width_mult = compound_scaling_cfg_mode_i.width_mult depth_mult = compound_scaling_cfg_mode_i.depth_mult # pre-feed depth and width multipliers as they are always used and same across layers. block_builder = partial( EfficientNetBlockConfig, width_mult=width_mult, depth_mult=depth_mult ) # Build the configuration at each spatial level. # The format of configuration is: (expand_ratio, kernel, stride, in_channels, out_channels, num_layers) # Configuration at output stride of 2 network_config["layer_1"] = [block_builder(1, 3, 1, 32, 16, 1)] # Configuration at output stride of 4 network_config["layer_2"] = [ block_builder(6, 3, 2, 16, 24, 2), ] # Configuration at output stride of 8 network_config["layer_3"] = [ block_builder(6, 5, 2, 24, 40, 2), ] # Configuration at output stride of 16 network_config["layer_4"] = [ block_builder(6, 3, 2, 40, 80, 3), block_builder(6, 5, 1, 80, 112, 3), ] # Configuration at output stride of 32 network_config["layer_5"] = [ block_builder(6, 5, 2, 112, 192, 4), block_builder(6, 3, 1, 192, 320, 1), ] network_config["last_channels"] = 4 * network_config["layer_5"][-1].out_channels else: logger.error( "Current supported modes for EfficientNet are b[0-7]. Got: {}".format( network_mode ) ) # Count the total number of layers throughout all blocks. # This will be used for stochastic depth (if enabled) total_layers = 0 for layer_name in ["layer_1", "layer_2", "layer_3", "layer_4", "layer_5"]: for block_config in network_config[layer_name]: total_layers += block_config.num_layers network_config["total_layers"] = total_layers return network_config ================================================ FILE: corenet/modeling/models/classification/config/fastvit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from functools import partial from typing import Dict from corenet.modeling.modules.fastvit import RepCPE from corenet.utils import logger def get_configuration(opts: argparse.Namespace) -> Dict: """Get configuration of FastViT models.""" variant = getattr(opts, "model.classification.fastvit.variant") config = dict() if variant == "T8": config = { "layers": [2, 2, 4, 2], "embed_dims": [48, 96, 192, 384], "mlp_ratios": [3, 3, 3, 3], "downsamples": [True, True, True, True], "pos_embs": None, "token_mixers": ["repmixer", "repmixer", "repmixer", "repmixer"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "T12": config = { "layers": [2, 2, 6, 2], "embed_dims": [64, 128, 256, 512], "mlp_ratios": [3, 3, 3, 3], "downsamples": [True, True, True, True], "pos_embs": None, "token_mixers": ["repmixer", "repmixer", "repmixer", "repmixer"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "S12": config = { "layers": [2, 2, 6, 2], "embed_dims": [64, 128, 256, 512], "mlp_ratios": [4, 4, 4, 4], "downsamples": [True, True, True, True], "pos_embs": None, "token_mixers": ["repmixer", "repmixer", "repmixer", "repmixer"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "SA12": config = { "layers": [2, 2, 6, 2], "embed_dims": [64, 128, 256, 512], "mlp_ratios": [4, 4, 4, 4], "downsamples": [True, True, True, True], "pos_embs": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))], "token_mixers": ["repmixer", "repmixer", "repmixer", "attention"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "SA24": config = { "layers": [4, 4, 12, 4], "embed_dims": [64, 128, 256, 512], "mlp_ratios": [4, 4, 4, 4], "downsamples": [True, True, True, True], "pos_embs": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))], "token_mixers": ["repmixer", "repmixer", "repmixer", "attention"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "SA36": config = { "layers": [6, 6, 18, 6], "embed_dims": [64, 128, 256, 512], "mlp_ratios": [4, 4, 4, 4], "downsamples": [True, True, True, True], "pos_embs": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))], "token_mixers": ["repmixer", "repmixer", "repmixer", "attention"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } elif variant == "MA36": config = { "layers": [6, 6, 18, 6], "embed_dims": [76, 152, 304, 608], "mlp_ratios": [4, 4, 4, 4], "downsamples": [True, True, True, True], "pos_embs": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))], "token_mixers": ["repmixer", "repmixer", "repmixer", "attention"], "down_patch_size": 7, "down_stride": 2, "cls_ratio": 2.0, "repmixer_kernel_size": 3, } else: logger.error( "FastViT supported variants: `T8`, `T12`, `S12`, `SA12`, `SA24`," "`SA36` and `MA36`. Please specify variant using " "--model.classification.fastvit.variant flag. Got: {}".format(variant) ) return config ================================================ FILE: corenet/modeling/models/classification/config/mobilenetv1.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Dict from corenet.utils.math_utils import make_divisible def get_configuration(opts) -> Dict: width_mult = getattr(opts, "model.classification.mobilenetv1.width_multiplier", 1.0) def scale_channels(in_channels): return make_divisible(int(math.ceil(in_channels * width_mult)), 16) config = { "conv1_out": scale_channels(32), "layer1": {"out_channels": scale_channels(64), "stride": 1, "repeat": 1}, "layer2": { "out_channels": scale_channels(128), "stride": 2, "repeat": 1, }, "layer3": { "out_channels": scale_channels(256), "stride": 2, "repeat": 1, }, "layer4": { "out_channels": scale_channels(512), "stride": 2, "repeat": 5, }, "layer5": { "out_channels": scale_channels(1024), "stride": 2, "repeat": 1, }, } return config ================================================ FILE: corenet/modeling/models/classification/config/mobilenetv2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict def get_configuration(opts) -> Dict: mobilenetv2_config = { "layer1": { "expansion_ratio": 1, "out_channels": 16, "num_blocks": 1, "stride": 1, }, "layer2": { "expansion_ratio": 6, "out_channels": 24, "num_blocks": 2, "stride": 2, }, "layer3": { "expansion_ratio": 6, "out_channels": 32, "num_blocks": 3, "stride": 2, }, "layer4": { "expansion_ratio": 6, "out_channels": 64, "num_blocks": 4, "stride": 2, }, "layer4_a": { "expansion_ratio": 6, "out_channels": 96, "num_blocks": 3, "stride": 1, }, "layer5": { "expansion_ratio": 6, "out_channels": 160, "num_blocks": 3, "stride": 2, }, "layer5_a": { "expansion_ratio": 6, "out_channels": 320, "num_blocks": 1, "stride": 1, }, } return mobilenetv2_config ================================================ FILE: corenet/modeling/models/classification/config/mobilenetv3.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict from corenet.utils import logger def get_configuration(opts) -> Dict: mv3_mode = getattr(opts, "model.classification.mobilenetv3.mode", "large") if mv3_mode is None: logger.error( "MobileNetv3 mode can't be none. Please specify --model.classification.mobilenetv3.mode" ) mv3_mode = mv3_mode.lower() mv3_config = dict() if mv3_mode == "small": # kernel_size, expansion_factor, in_channels, use_se, use_hs, stride mv3_config["layer_1"] = [[3, 1, 16, True, False, 2]] mv3_config["layer_2"] = [[3, 4.5, 24, False, False, 2]] mv3_config["layer_3"] = [[3, 3.67, 24, False, False, 1]] mv3_config["layer_4"] = [ [5, 4, 40, True, True, 2], [5, 6, 40, True, True, 1], [5, 6, 40, True, True, 1], [5, 3, 48, True, True, 1], [5, 3, 48, True, True, 1], ] mv3_config["layer_5"] = [ [5, 6, 96, True, True, 2], [5, 6, 96, True, True, 1], [5, 6, 96, True, True, 1], ] mv3_config["last_channels"] = 1024 elif mv3_mode == "large": mv3_config["layer_1"] = [[3, 1, 16, False, False, 1]] mv3_config["layer_2"] = [ [3, 4, 24, False, False, 2], [3, 3, 24, False, False, 1], ] mv3_config["layer_3"] = [ [5, 3, 40, True, False, 2], [5, 3, 40, True, False, 1], [5, 3, 40, True, False, 1], ] mv3_config["layer_4"] = [ [3, 6, 80, False, True, 2], [3, 2.5, 80, False, True, 1], [3, 2.3, 80, False, True, 1], [3, 2.3, 80, False, True, 1], [3, 6, 112, True, True, 1], [3, 6, 112, True, True, 1], ] mv3_config["layer_5"] = [ [5, 6, 160, True, True, 2], [5, 6, 160, True, True, 1], [5, 6, 160, True, True, 1], ] mv3_config["last_channels"] = 1280 else: logger.error( "Current supported modes for MobileNetv3 are small and large. Got: {}".format( mv3_mode ) ) return mv3_config ================================================ FILE: corenet/modeling/models/classification/config/mobileone.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict from corenet.utils import logger def get_configuration(opts: argparse.Namespace) -> Dict: """Get configuration of MobileOne models.""" variant = getattr(opts, "model.classification.mobileone.variant") config = dict() if variant == "s0": config = { "num_blocks_per_stage": [2, 8, 10, 1], "width_multipliers": (0.75, 1.0, 1.0, 2.0), "num_conv_branches": 4, "use_se": False, } elif variant == "s1": config = { "num_blocks_per_stage": [2, 8, 10, 1], "width_multipliers": (1.5, 1.5, 2.0, 2.5), "num_conv_branches": 1, "use_se": False, } elif variant == "s2": config = { "num_blocks_per_stage": [2, 8, 10, 1], "width_multipliers": (1.5, 2.0, 2.5, 4.0), "num_conv_branches": 1, "use_se": False, } elif variant == "s3": config = { "num_blocks_per_stage": [2, 8, 10, 1], "width_multipliers": (2.0, 2.5, 3.0, 4.0), "num_conv_branches": 1, "use_se": False, } elif variant == "s4": config = { "num_blocks_per_stage": [2, 8, 10, 1], "width_multipliers": (3.0, 3.5, 3.5, 4.0), "num_conv_branches": 1, "use_se": True, } else: logger.error( "MobileOne supported variants: `s0`, `s1`, `s2`, `s3` and `s4`. Please specify variant using " "--model.classification.mobileone.variant flag. Got: {}".format(variant) ) return config ================================================ FILE: corenet/modeling/models/classification/config/mobilevit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict from corenet.utils import logger def get_configuration(opts) -> Dict: mode = getattr(opts, "model.classification.mit.mode", "small") if mode is None: logger.error("Please specify mode") head_dim = getattr(opts, "model.classification.mit.head_dim", None) num_heads = getattr(opts, "model.classification.mit.number_heads", 4) if head_dim is not None: if num_heads is not None: logger.error( "--model.classification.mit.head-dim and --model.classification.mit.number-heads " "are mutually exclusive." ) elif num_heads is not None: if head_dim is not None: logger.error( "--model.classification.mit.head-dim and --model.classification.mit.number-heads " "are mutually exclusive." ) mode = mode.lower() if mode == "xx_small": mv2_exp_mult = 2 config = { "layer1": { "out_channels": 16, "expand_ratio": mv2_exp_mult, "num_blocks": 1, "stride": 1, "block_type": "mv2", }, "layer2": { "out_channels": 24, "expand_ratio": mv2_exp_mult, "num_blocks": 3, "stride": 2, "block_type": "mv2", }, "layer3": { # 28x28 "out_channels": 48, "transformer_channels": 64, "ffn_dim": 128, "transformer_blocks": 2, "patch_h": 2, # 8, "patch_w": 2, # 8, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer4": { # 14x14 "out_channels": 64, "transformer_channels": 80, "ffn_dim": 160, "transformer_blocks": 4, "patch_h": 2, # 4, "patch_w": 2, # 4, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer5": { # 7x7 "out_channels": 80, "transformer_channels": 96, "ffn_dim": 192, "transformer_blocks": 3, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "last_layer_exp_factor": 4, } elif mode == "x_small": mv2_exp_mult = 4 config = { "layer1": { "out_channels": 32, "expand_ratio": mv2_exp_mult, "num_blocks": 1, "stride": 1, "block_type": "mv2", }, "layer2": { "out_channels": 48, "expand_ratio": mv2_exp_mult, "num_blocks": 3, "stride": 2, "block_type": "mv2", }, "layer3": { # 28x28 "out_channels": 64, "transformer_channels": 96, "ffn_dim": 192, "transformer_blocks": 2, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer4": { # 14x14 "out_channels": 80, "transformer_channels": 120, "ffn_dim": 240, "transformer_blocks": 4, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer5": { # 7x7 "out_channels": 96, "transformer_channels": 144, "ffn_dim": 288, "transformer_blocks": 3, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "last_layer_exp_factor": 4, } elif mode == "small": mv2_exp_mult = 4 config = { "layer1": { "out_channels": 32, "expand_ratio": mv2_exp_mult, "num_blocks": 1, "stride": 1, "block_type": "mv2", }, "layer2": { "out_channels": 64, "expand_ratio": mv2_exp_mult, "num_blocks": 3, "stride": 2, "block_type": "mv2", }, "layer3": { # 28x28 "out_channels": 96, "transformer_channels": 144, "ffn_dim": 288, "transformer_blocks": 2, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer4": { # 14x14 "out_channels": 128, "transformer_channels": 192, "ffn_dim": 384, "transformer_blocks": 4, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "layer5": { # 7x7 "out_channels": 160, "transformer_channels": 240, "ffn_dim": 480, "transformer_blocks": 3, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "head_dim": head_dim, "num_heads": num_heads, "block_type": "mobilevit", }, "last_layer_exp_factor": 4, } else: raise NotImplementedError return config ================================================ FILE: corenet/modeling/models/classification/config/mobilevit_v2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict from corenet.utils.math_utils import bound_fn, make_divisible def get_configuration(opts) -> Dict: width_multiplier = getattr(opts, "model.classification.mitv2.width_multiplier", 1.0) ffn_multiplier = ( 2 # bound_fn(min_val=2.0, max_val=4.0, value=2.0 * width_multiplier) ) mv2_exp_mult = 2 # max(1.0, min(2.0, 2.0 * width_multiplier)) layer_0_dim = bound_fn(min_val=16, max_val=64, value=32 * width_multiplier) layer_0_dim = int(make_divisible(layer_0_dim, divisor=8, min_value=16)) config = { "layer0": { "img_channels": 3, "out_channels": layer_0_dim, }, "layer1": { "out_channels": int(make_divisible(64 * width_multiplier, divisor=16)), "expand_ratio": mv2_exp_mult, "num_blocks": 1, "stride": 1, "block_type": "mv2", }, "layer2": { "out_channels": int(make_divisible(128 * width_multiplier, divisor=8)), "expand_ratio": mv2_exp_mult, "num_blocks": 2, "stride": 2, "block_type": "mv2", }, "layer3": { # 28x28 "out_channels": int(make_divisible(256 * width_multiplier, divisor=8)), "attn_unit_dim": int(make_divisible(128 * width_multiplier, divisor=8)), "ffn_multiplier": ffn_multiplier, "attn_blocks": 2, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "block_type": "mobilevit", }, "layer4": { # 14x14 "out_channels": int(make_divisible(384 * width_multiplier, divisor=8)), "attn_unit_dim": int(make_divisible(192 * width_multiplier, divisor=8)), "ffn_multiplier": ffn_multiplier, "attn_blocks": 4, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "block_type": "mobilevit", }, "layer5": { # 7x7 "out_channels": int(make_divisible(512 * width_multiplier, divisor=8)), "attn_unit_dim": int(make_divisible(256 * width_multiplier, divisor=8)), "ffn_multiplier": ffn_multiplier, "attn_blocks": 3, "patch_h": 2, "patch_w": 2, "stride": 2, "mv_expand_ratio": mv2_exp_mult, "block_type": "mobilevit", }, "last_layer_exp_factor": 4, } return config ================================================ FILE: corenet/modeling/models/classification/config/regnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from dataclasses import dataclass from typing import Dict, List, Tuple, Union import numpy as np from corenet.utils import logger from corenet.utils.math_utils import make_divisible supported_modes = [ "x_200mf", "x_400mf", "x_600mf", "x_800mf", "x_1.6gf", "x_3.2gf", "x_4.0gf", "x_6.4gf", "x_8.0gf", "x_12gf", "x_16gf", "x_32gf", "y_200mf", "y_400mf", "y_800mf", "y_600mf", "y_1.6gf", "y_3.2gf", "y_4.0gf", "y_6.4gf", "y_8.0gf", "y_12gf", "y_16gf", "y_32gf", ] @dataclass class BlockParamsConfig: """ This class stores the quantized linear block params. It is adapted from torchvision.models.regnet: https://github.com/pytorch/vision/blob/c06d52b1c5f6aee36802661c3ebc6347b97cc59e/torchvision/models/regnet.py#L203 Args: depth: The total number of XBlocks in the network w_0: Initial width w_a: Width slope w_m: Width slope in the log space groups: The number of groups to use in the XBlock. Referred to se_ratio: The squeeze-excitation ratio. The number of channels in the SE module will be the input channels scaled by this ratio. bottleneck_multiplier: The number of output channels in the intermediate conv layers in bottleneck/Xblock block will be scaled by this value. quant: Block widths will be divisible by this value stride: The stride of the 3x3 conv of the XBlocks """ def __init__( self, depth: int, w_0: int, w_a: float, w_m: float, groups: int, se_ratio: float = 0.0, bottleneck_multiplier: float = 1.0, quant: int = 8, stride: int = 2, ) -> None: if w_a < 0 or w_0 <= 0 or w_m <= 1 or w_0 % 8 != 0: raise ValueError( f"Invalid RegNet settings. Need" f" w_a >= 0, given w_a={w_a};" f" w_m > 1, given w_m={w_m};" f" w_0 > 0 and w_0 % 8 == 0, given w_0={w_0}." ) # Continuous widths for each block. Each stage has a unique block width block_widths_cont = np.arange(depth) * w_a + w_0 # u_j in eq. (2) of paper block_capacity = np.round( np.log(block_widths_cont / w_0) / np.log(w_m) ) # s_j in eq. (3) of paper # Quantized block widths block_widths_quant = ( (np.round(np.divide(w_0 * np.power(w_m, block_capacity), quant)) * quant) .astype(int) .tolist() ) num_stages = len(set(block_widths_quant)) # Convert to per stage parameters split_helper = zip( block_widths_quant + [0], [0] + block_widths_quant, block_widths_quant + [0], [0] + block_widths_quant, ) splits = [w != wp or r != rp for w, wp, r, rp in split_helper] stage_widths = [w for w, t in zip(block_widths_quant, splits[:-1]) if t] stage_depths = ( np.diff([d for d, t in enumerate(splits) if t]).astype(int).tolist() ) strides = [stride] * num_stages bottleneck_multipliers = [bottleneck_multiplier] * num_stages stage_groups = [groups] * num_stages # Adjust the compatibility of stage widths and group widths stage_widths, stage_groups = self._make_widths_compatible( stage_widths, stage_groups, bottleneck_multipliers ) self.depths = stage_depths self.widths = stage_widths self.stage_groups = stage_groups self.bottleneck_multipliers = bottleneck_multipliers self.strides = strides self.se_ratio = se_ratio def _make_widths_compatible( self, stage_widths: List[int], stage_groups: List[int], bottleneck_multipliers: List[float], ) -> Tuple[List[int], List[int]]: """ Scales widths by bottleneck multipliers and adjusts them to be compatible with the specified groups. """ # Scale widths according to bottleneck multipliers widths = [ int(width * multiplier) for width, multiplier in zip(stage_widths, bottleneck_multipliers) ] group_widths_min = [ min(groups, width) for groups, width in zip(stage_groups, widths) ] # Ensure the widths are divisible by groups bottleneck_widths = [ make_divisible(width, groups) for width, groups in zip(widths, group_widths_min) ] # Undo scaling stage_widths = [ int(width / multiplier) for width, multiplier in zip(bottleneck_widths, bottleneck_multipliers) ] return stage_widths, group_widths_min def extra_repr(self) -> str: extra_repr_str = "" extra_repr_str += f"\n\tdepths={self.depths}" extra_repr_str += f"\n\twidths={self.widths}" extra_repr_str += f"\n\tstrides={self.strides}" extra_repr_str += f"\n\tstage_groups={self.stage_groups}" extra_repr_str += f"\n\tbottleneck_multipliers={self.bottleneck_multipliers}" extra_repr_str += f"\n\tse_ratio={self.se_ratio}" return extra_repr_str def __repr__(self) -> str: return "{}({}\n)".format(self.__class__.__name__, self.extra_repr()) def get_configuration( opts: argparse.Namespace, ) -> Dict[str, Dict[str, Union[int, float]]]: """Gets the RegNet model configuration for the specified RegNet mode. Args: opts: command-line arguments Returns: * A dictionary containing the configuration for each layer. Each key is of the form layer and the corresponding value is another dictionary with the following keys: depth: The depth of the stage at layer width: The width of the blocks at this stage groups: The convolution groups of each block at this stage stride: The stride of the convolutions in each block at this stage bottleneck_multiplier: The multiplier for the bottleneck conv in each of this stage's blocks se_ratio: The squeeze-excitation ratio for each block in this stage """ network_mode = getattr(opts, "model.classification.regnet.mode") if network_mode is None: logger.error( "RegNet mode can't be none. Please specify --model.classification.regnet.mode" ) network_config = dict() block_params_config = { "x_200mf": BlockParamsConfig(13, 24, 36.44, 2.49, 8), "x_400mf": BlockParamsConfig(22, 24, 24.48, 2.54, 16), "x_600mf": BlockParamsConfig(16, 48, 36.97, 2.24, 24), "x_800mf": BlockParamsConfig(16, 56, 35.73, 2.28, 16), "x_1.6gf": BlockParamsConfig(18, 80, 34.01, 2.25, 24), "x_3.2gf": BlockParamsConfig(25, 88, 26.31, 2.25, 48), "x_4.0gf": BlockParamsConfig(23, 96, 38.65, 2.43, 40), "x_6.4gf": BlockParamsConfig(17, 184, 60.83, 2.07, 56), "x_8.0gf": BlockParamsConfig(23, 80, 49.56, 2.88, 120), "x_12gf": BlockParamsConfig(19, 168, 73.36, 2.37, 112), "x_16gf": BlockParamsConfig(22, 216, 55.59, 2.1, 128), "x_32gf": BlockParamsConfig(23, 320, 69.86, 2.0, 168), "y_200mf": BlockParamsConfig(13, 24, 36.44, 2.49, 8, se_ratio=0.25), "y_400mf": BlockParamsConfig(16, 48, 27.89, 2.09, 8, se_ratio=0.25), "y_600mf": BlockParamsConfig(15, 48, 32.54, 2.32, 16, se_ratio=0.25), "y_800mf": BlockParamsConfig(14, 56, 38.84, 2.4, 16, se_ratio=0.25), "y_1.6gf": BlockParamsConfig(27, 48, 20.71, 2.65, 24, se_ratio=0.25), "y_3.2gf": BlockParamsConfig(21, 80, 42.63, 2.66, 24, se_ratio=0.25), "y_4.0gf": BlockParamsConfig(22, 96, 31.41, 2.24, 64, se_ratio=0.25), "y_6.4gf": BlockParamsConfig(25, 112, 33.22, 2.27, 72, se_ratio=0.25), "y_8.0gf": BlockParamsConfig(17, 192, 76.82, 2.19, 56, se_ratio=0.25), "y_12gf": BlockParamsConfig(19, 168, 73.36, 2.37, 112, se_ratio=0.25), "y_16gf": BlockParamsConfig(18, 200, 106.23, 2.48, 112, se_ratio=0.25), "y_32gf": BlockParamsConfig(20, 232, 115.89, 2.53, 232, se_ratio=0.25), } if network_mode in block_params_config: regnet_block_params_cfg = block_params_config[network_mode] stage_depths = regnet_block_params_cfg.depths stage_widths = regnet_block_params_cfg.widths stage_groups = regnet_block_params_cfg.stage_groups bottleneck_multipliers = regnet_block_params_cfg.bottleneck_multipliers strides = regnet_block_params_cfg.strides se_ratio = regnet_block_params_cfg.se_ratio for i, layer_name in enumerate([f"layer{i}" for i in range(1, 5)]): network_config[layer_name] = { "depth": stage_depths[i], "width": stage_widths[i], "groups": stage_groups[i], "stride": strides[i], "bottleneck_multiplier": bottleneck_multipliers[i], "se_ratio": se_ratio, } else: logger.error( f"Current supported modes for RegNet are {', '.join(supported_modes)}. Got: {network_mode}" ) return network_config ================================================ FILE: corenet/modeling/models/classification/config/resnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, List from corenet.utils import logger def add_squeeze_channels( config_dict: Dict, per_layer_squeeze_channels: List[int] ) -> None: """Given the config_dict for the specified ResNet model, for each layer, adds a new key ('squeeze_channels') with the corresponding channels for the squeeze-excitation module. Args: config_dict: The dict constructed by the get_configuration function. per_layer_squeeze_channels: A list of length 4 where the ith element specifies the number of channels for squeeze-excitation module of layer i. """ for layer, squeeze_channels in zip(range(2, 6), per_layer_squeeze_channels): config_dict[f"layer{layer}"]["squeeze_channels"] = squeeze_channels def get_configuration(opts) -> Dict: depth = getattr(opts, "model.classification.resnet.depth") # Whether to build an SE-ResNet model (https://arxiv.org/abs/1709.01507) se_resnet = getattr(opts, "model.classification.resnet.se_resnet") resnet_config = dict() if depth == 18: resnet_config["layer2"] = { "num_blocks": 2, "mid_channels": 64, "block_type": "basic", "stride": 1, } resnet_config["layer3"] = { "num_blocks": 2, "mid_channels": 128, "block_type": "basic", "stride": 2, } resnet_config["layer4"] = { "num_blocks": 2, "mid_channels": 256, "block_type": "basic", "stride": 2, } resnet_config["layer5"] = { "num_blocks": 2, "mid_channels": 512, "block_type": "basic", "stride": 2, } se_resnet_channels = [8, 8, 16, 32] elif depth == 34: resnet_config["layer2"] = { "num_blocks": 3, "mid_channels": 64, "block_type": "basic", "stride": 1, } resnet_config["layer3"] = { "num_blocks": 4, "mid_channels": 128, "block_type": "basic", "stride": 2, } resnet_config["layer4"] = { "num_blocks": 6, "mid_channels": 256, "block_type": "basic", "stride": 2, } resnet_config["layer5"] = { "num_blocks": 3, "mid_channels": 512, "block_type": "basic", "stride": 2, } se_resnet_channels = [8, 8, 16, 32] elif depth == 50: resnet_config["layer2"] = { "num_blocks": 3, "mid_channels": 64, "block_type": "bottleneck", "stride": 1, } resnet_config["layer3"] = { "num_blocks": 4, "mid_channels": 128, "block_type": "bottleneck", "stride": 2, } resnet_config["layer4"] = { "num_blocks": 6, "mid_channels": 256, "block_type": "bottleneck", "stride": 2, } resnet_config["layer5"] = { "num_blocks": 3, "mid_channels": 512, "block_type": "bottleneck", "stride": 2, } se_resnet_channels = [16, 32, 64, 128] elif depth == 101: resnet_config["layer2"] = { "num_blocks": 3, "mid_channels": 64, "block_type": "bottleneck", "stride": 1, } resnet_config["layer3"] = { "num_blocks": 4, "mid_channels": 128, "block_type": "bottleneck", "stride": 2, } resnet_config["layer4"] = { "num_blocks": 23, "mid_channels": 256, "block_type": "bottleneck", "stride": 2, } resnet_config["layer5"] = { "num_blocks": 3, "mid_channels": 512, "block_type": "bottleneck", "stride": 2, } se_resnet_channels = [16, 32, 64, 128] else: logger.error( "ResNet (or SE-ResNet) models are supported with depths of 18, 34, 50 and 101. Please specify depth using " "--model.classification.resnet.depth flag. Got: {}".format(depth) ) if se_resnet: add_squeeze_channels(resnet_config, se_resnet_channels) return resnet_config ================================================ FILE: corenet/modeling/models/classification/config/swin_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict from corenet.utils import logger def get_configuration(opts) -> Dict: mode = getattr(opts, "model.classification.swin.mode", "tiny") if mode is None: logger.error("Please specify mode") stochastic_depth_prob = getattr( opts, "model.classification.swin.stochastic_depth_prob", None ) if stochastic_depth_prob is None: default_stochastic_depth_prob = {"tiny": 0.2, "small": 0.3, "base": 0.5} stochastic_depth_prob = default_stochastic_depth_prob[mode] mode = mode.lower() if mode == "tiny": config = { "patch_size": (4, 4), "embed_dim": 96, "depths": [2, 2, 6, 2], "num_heads": [3, 6, 12, 24], "window_size": [7, 7], "stochastic_depth_prob": stochastic_depth_prob, # 0.2 "mlp_ratio": 4.0, "dropout": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "norm_layer": "layer_norm", } elif mode == "small": config = { "patch_size": (4, 4), "embed_dim": 96, "depths": [2, 2, 18, 2], "num_heads": [3, 6, 12, 24], "window_size": [7, 7], "stochastic_depth_prob": stochastic_depth_prob, # 0.3 "mlp_ratio": 4.0, "dropout": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "norm_layer": "layer_norm", } elif mode == "base": config = { "patch_size": (4, 4), "embed_dim": 128, "depths": [2, 2, 18, 2], "num_heads": [4, 8, 16, 32], "window_size": [7, 7], "stochastic_depth_prob": stochastic_depth_prob, # 0.5 "mlp_ratio": 4.0, "dropout": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "norm_layer": "layer_norm", } else: raise NotImplementedError return config ================================================ FILE: corenet/modeling/models/classification/config/vit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict from corenet.utils import logger def get_configuration(opts: argparse.Namespace) -> Dict: """ Gets the ViT model configuration. The 'tiny' and 'small' model configurations were used in the `"Training data-efficient image transformers & distillation through attention" `_ paper. The 'base', 'large', and 'huge' variants were used in the `"An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale" `_ paper. Args: opts: Command line options. Returns: vit_config: The ViT model configuration dict. """ mode = getattr(opts, "model.classification.vit.mode", "tiny") if not mode: logger.error("Please specify mode") mode = mode.lower() dropout = getattr(opts, "model.classification.vit.dropout", 0.0) norm_layer = getattr(opts, "model.classification.vit.norm_layer", "layer_norm") vit_config = dict() if mode == "test": vit_config = { "embed_dim": 128, "n_transformer_layers": 1, "n_attn_heads": 2, "ffn_dim": 128, "norm_layer": norm_layer, "pos_emb_drop_p": 0.1, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "tiny": vit_config = { "embed_dim": 192, "n_transformer_layers": 12, "n_attn_heads": 3, "ffn_dim": 192 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.1, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "small": vit_config = { "embed_dim": 384, "n_transformer_layers": 12, "n_attn_heads": 6, "ffn_dim": 384 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "base": vit_config = { "embed_dim": 768, "n_transformer_layers": 12, "n_attn_heads": 12, "ffn_dim": 768 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "large": vit_config = { "embed_dim": 1024, "n_transformer_layers": 24, "n_attn_heads": 16, "ffn_dim": 1024 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } elif mode == "huge": vit_config = { "embed_dim": 1280, "n_transformer_layers": 32, "n_attn_heads": 20, # each head dimension is 64 "ffn_dim": 1280 * 4, "norm_layer": norm_layer, "pos_emb_drop_p": 0.0, "attn_dropout": 0.0, "ffn_dropout": 0.0, "dropout": dropout, } else: logger.error("Got unsupported ViT configuration: {}".format(mode)) return vit_config ================================================ FILE: corenet/modeling/models/classification/efficientnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Callable, Optional, Tuple import torch from torch import nn from corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.efficientnet import ( EfficientNetBlockConfig, get_configuration, ) from corenet.modeling.modules import EfficientNetBlock @MODEL_REGISTRY.register(name="efficientnet", type="classification") class EfficientNet(BaseImageEncoder): """ This class defines the `EfficientNet architecture `_ """ def __init__( self, opts, *args, **kwargs: Any, ) -> None: super().__init__(opts, *args, **kwargs) classifier_dropout = getattr(opts, "model.classification.classifier_dropout") network_config = get_configuration(opts) last_channels = network_config["last_channels"] total_layers = network_config["total_layers"] stochastic_depth_prob = getattr( opts, "model.classification.efficientnet.stochastic_depth_prob", 0.2 ) # building first layer image_channels = 3 in_channels = network_config["layer_1"][0].in_channels self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=in_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": in_channels} # building inverted residual blocks prev_layers_cnt = 0 # counts the number of layers added so far for layer_name in ["layer_1", "layer_2", "layer_3", "layer_4", "layer_5"]: dilation = False if layer_name == "layer_4": dilation = self.dilate_l4 elif layer_name == "layer_5": dilation = self.dilate_l5 layer, prev_layers_cnt = self._make_layer( opts=opts, block_config=network_config[layer_name], stochastic_depth_prob=stochastic_depth_prob, prev_layers_cnt=prev_layers_cnt, total_layers=total_layers, dilate=dilation, ) setattr(self, layer_name, layer) # we have saved mappings without underscore in layer_name, so removing it self.model_conf_dict[layer_name.replace("_", "")] = { "in": network_config[layer_name][0].in_channels, "out": network_config[layer_name][-1].out_channels, } # building last several layers in_channels = network_config["layer_5"][-1].out_channels out_channels = last_channels self.conv_1x1_exp = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, use_act=True, use_norm=True, ) self.model_conf_dict["exp_before_cls"] = { "in": in_channels, "out": out_channels, } pool_type = getattr(opts, "model.layer.global_pool", "mean") self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout, inplace=True), ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=out_channels, out_features=self.n_classes, bias=True ), ) def _make_layer( self, opts, block_config, stochastic_depth_prob: float, prev_layers_cnt: int, # number of layers before calling this function total_layers: int, # Total number of layers in the network dilate: Optional[bool] = False, *args, **kwargs, ) -> Tuple[nn.Module, int]: # This is to accommodate segmentation architectures modifying strides of the backbone network. prev_dilation = self.dilation # For classification, dilation here should always be 1. block = [] count = 0 for layer_config in block_config: assert isinstance(layer_config, EfficientNetBlockConfig) in_channels = layer_config.in_channels out_channels = layer_config.out_channels for layer_idx in range(layer_config.num_layers): stride = layer_config.stride if layer_idx == 0 else 1 if dilate and stride == 2: self.dilation *= stride stride = 1 dilate = False sd_prob = ( stochastic_depth_prob * float(prev_layers_cnt + count) / total_layers ) sd_prob = round(sd_prob, 4) efficient_net_layer = EfficientNetBlock( stochastic_depth_prob=sd_prob, opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=layer_config.kernel, stride=stride, expand_ratio=layer_config.expand_ratio, dilation=prev_dilation if count == 0 else self.dilation, use_hs=False, use_se=True, use_input_as_se_dim=True, squeeze_factor=layer_config.expand_ratio * 4, act_fn_name="swish", se_scale_fn_name="sigmoid", ) block.append(efficient_net_layer) count += 1 in_channels = out_channels prev_layers_cnt += count return nn.Sequential(*block), prev_layers_cnt @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.efficientnet.mode", type=str, choices=[f"b{i}" for i in range(8)], ) group.add_argument( "--model.classification.efficientnet.stochastic-depth-prob", type=float, default=0.0, ) return parser def get_activation_checkpoint_submodule_class(self) -> Callable: return EfficientNetBlock ================================================ FILE: corenet/modeling/models/classification/fastvit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy from typing import List import torch.nn as nn from corenet.modeling.layers import GlobalPool, Identity, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.fastvit import get_configuration from corenet.modeling.modules.fastvit import ( AttentionBlock, PatchEmbed, RepMixerBlock, convolutional_stem, ) from corenet.modeling.modules.mobileone_block import MobileOneBlock from corenet.utils import logger def basic_blocks( opts: argparse.Namespace, dim: int, block_index: int, num_blocks: List[int], token_mixer_type: str, kernel_size: int = 3, mlp_ratio: float = 4.0, drop_rate: float = 0.0, drop_path_rate: float = 0.0, inference_mode: bool = False, use_layer_scale: bool = True, layer_scale_init_value: float = 1e-5, ) -> nn.Sequential: """Build FastViT blocks within a stage. Args: opts: Command line arguments. dim: Number of embedding dimensions. block_index: block index. num_blocks: List containing number of blocks per stage. token_mixer_type: Token mixer type. kernel_size: Kernel size for repmixer. mlp_ratio: MLP expansion ratio. drop_rate: Dropout rate. drop_path_rate: Drop path rate. inference_mode: Flag to instantiate block in inference mode. use_layer_scale: Flag to turn on layer scale regularization. layer_scale_init_value: Layer scale value at initialization. Returns: nn.Sequential object of all the blocks within the stage. """ blocks = [] for block_idx in range(num_blocks[block_index]): block_dpr = ( drop_path_rate * (block_idx + sum(num_blocks[:block_index])) / (sum(num_blocks) - 1) ) if token_mixer_type == "repmixer": blocks.append( RepMixerBlock( opts, dim, kernel_size=kernel_size, mlp_ratio=mlp_ratio, drop=drop_rate, drop_path=block_dpr, inference_mode=inference_mode, use_layer_scale=use_layer_scale, layer_scale_init_value=layer_scale_init_value, ) ) elif token_mixer_type == "attention": blocks.append( AttentionBlock( opts, dim, mlp_ratio=mlp_ratio, drop=drop_rate, drop_path=block_dpr, use_layer_scale=use_layer_scale, layer_scale_init_value=layer_scale_init_value, ) ) else: raise ValueError( "Token mixer type: {} not supported".format(token_mixer_type) ) blocks = nn.Sequential(*blocks) return blocks @MODEL_REGISTRY.register(name="fastvit", type="classification") class FastViT(BaseImageEncoder): """ This class implements `FastViT architecture `_ """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: cfg = get_configuration(opts=opts) super().__init__(opts, *args, **kwargs) # Warn users if model is instantiated in inference mode. inference_mode = getattr(opts, "model.classification.fastvit.inference_mode") if inference_mode: logger.warning( 'Model instantiated in "Inference mode". ' "This is not a desired mode for training." ) # Get metaformer parameters self.opts = opts image_channels = 3 layers = cfg["layers"] pos_embs = cfg["pos_embs"] embed_dims = cfg["embed_dims"] token_mixers = cfg["token_mixers"] mlp_ratios = cfg["mlp_ratios"] # Patch embedding configurations downsamples = cfg["downsamples"] down_patch_size = cfg["down_patch_size"] down_stride = cfg["down_stride"] # Get regularization parameters drop_rate = getattr(opts, "model.classification.fastvit.dropout") drop_path_rate = getattr(opts, "model.classification.fastvit.drop_path") use_layer_scale = getattr(opts, "model.classification.fastvit.use_layer_scale") layer_scale_init_value = getattr( opts, "model.classification.fastvit.layer_scale_init_value" ) if pos_embs is None: pos_embs = [None] * len(cfg["layers"]) # convolutional stem self.model_conf_dict = dict() self.conv_1 = convolutional_stem(opts, image_channels, embed_dims[0]) self.model_conf_dict["conv1"] = {"in": image_channels, "out": embed_dims[0]} self.layer_1 = Identity() self.model_conf_dict["layer1"] = {"in": embed_dims[0], "out": embed_dims[0]} # Build all stages of the network. network = [] for i in range(len(layers)): blocks_per_stage = [] # Add position embeddings if requested if pos_embs[i] is not None: blocks_per_stage.append(pos_embs[i](opts, embed_dims[i], embed_dims[i])) stage = basic_blocks( opts, embed_dims[i], i, layers, token_mixer_type=token_mixers[i], kernel_size=cfg["repmixer_kernel_size"], mlp_ratio=mlp_ratios[i], drop_rate=drop_rate, drop_path_rate=drop_path_rate, use_layer_scale=use_layer_scale, layer_scale_init_value=layer_scale_init_value, inference_mode=inference_mode, ) blocks_per_stage.append(stage) if i >= len(layers) - 1: network.append(nn.Sequential(*blocks_per_stage)) self.model_conf_dict["layer{}".format(i + 2)] = { "in": embed_dims[i], "out": embed_dims[i], } break # Downsampling+PatchEmb. between two stages if downsamples[i] or embed_dims[i] != embed_dims[i + 1]: blocks_per_stage.append( PatchEmbed( opts=opts, patch_size=down_patch_size, stride=down_stride, in_channels=embed_dims[i], embed_dim=embed_dims[i + 1], ) ) network.append(nn.Sequential(*blocks_per_stage)) self.model_conf_dict["layer{}".format(i + 2)] = { "in": embed_dims[i], "out": embed_dims[i + 1], } self.layer_2, self.layer_3, self.layer_4, self.layer_5 = network # Build 1x1 exp self.conv_1x1_exp = nn.Sequential( *[ MobileOneBlock( opts=opts, in_channels=embed_dims[-1], out_channels=int(embed_dims[-1] * cfg["cls_ratio"]), kernel_size=3, stride=1, padding=1, groups=embed_dims[-1], inference_mode=inference_mode, use_se=True, num_conv_branches=1, ) ] ) self.model_conf_dict["exp_before_cls"] = { "in": embed_dims[-1], "out": int(embed_dims[-1] * cfg["cls_ratio"]), } # Build classifier pool_type = getattr(opts, "model.layer.global_pool") self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=int(embed_dims[-1] * cfg["cls_ratio"]), out_features=self.n_classes, bias=True, ), ) self.model_conf_dict["cls"] = { "in": int(embed_dims[-1] * cfg["cls_ratio"]), "out": self.n_classes, } # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.fastvit.variant", type=str, default="T8", help="Variant string for FastViT. Default: T8", ) group.add_argument( "--model.classification.fastvit.inference-mode", type=bool, default=False, help="Flag to instantiate inference mode architecture. Default: False", ) group.add_argument( "--model.classification.fastvit.dropout", type=float, default=0.0, help="Dropout rate for regularization. Default: 0.0", ) group.add_argument( "--model.classification.fastvit.drop-path", type=float, default=0.0, help="Drop path rate. Default: 0.0", ) group.add_argument( "--model.classification.fastvit.use-layer-scale", type=bool, default=True, help="Flag to turn on layer scale regularization. Default: True", ) group.add_argument( "--model.classification.fastvit.layer-scale-init-value", type=float, default=1e-5, help="Drop path rate. Default: 1e-5", ) return parser def get_exportable_model(self) -> nn.Module: """ Method returns a reparameterized model for faster inference. Returns: Reparametrized FastViT model for faster inference. """ # Avoid editing original graph model = copy.deepcopy(self) for module in model.modules(): if hasattr(module, "reparameterize"): module.reparameterize() return model ================================================ FILE: corenet/modeling/models/classification/mobilenetv1.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, List, Optional, Tuple, Union from torch import nn from corenet.modeling.layers import ( ConvLayer2d, Dropout, GlobalPool, Identity, LinearLayer, SeparableConv2d, ) from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobilenetv1 import get_configuration from corenet.utils.math_utils import bound_fn @MODEL_REGISTRY.register(name="mobilenetv1", type="classification") class MobileNetv1(BaseImageEncoder): """ This class defines the `MobileNet architecture `_ """ def __init__(self, opts, *args, **kwargs) -> None: image_channels = 3 classifier_dropout = getattr( opts, "model.classification.classifier_dropout", 0.0 ) if classifier_dropout == 0.0: width_mult = getattr( opts, "model.classification.mobilenetv1.width_multiplier", 1.0 ) val = round(0.1 * width_mult, 3) classifier_dropout = bound_fn(min_val=0.0, max_val=0.1, value=val) super().__init__(opts, *args, **kwargs) cfg = get_configuration(opts=opts) self.model_conf_dict = dict() input_channels = cfg["conv1_out"] self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=input_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": input_channels} self.layer_1, out_channels = self._make_layer( opts=opts, mv1_config=cfg["layer1"], input_channel=input_channels ) self.model_conf_dict["layer1"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_2, out_channels = self._make_layer( opts=opts, mv1_config=cfg["layer2"], input_channel=input_channels ) self.model_conf_dict["layer2"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_3, out_channels = self._make_layer( opts=opts, mv1_config=cfg["layer3"], input_channel=input_channels ) self.model_conf_dict["layer3"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_4, out_channels = self._make_layer( opts=opts, mv1_config=cfg["layer4"], input_channel=input_channels, dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_5, out_channels = self._make_layer( opts=opts, mv1_config=cfg["layer5"], input_channel=input_channels, dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": input_channels, "out": input_channels, } pool_type = getattr(opts, "model.layer.global_pool", "mean") self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=input_channels, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": input_channels, "out": self.n_classes} # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mobilenetv1.width-multiplier", type=float, default=1.0, help="Width multiplier for MobileNetv1. Default: 1.0", ) return parser def _make_layer( self, opts, mv1_config: Union[Dict, List], input_channel: int, dilate: Optional[bool] = False, *args, **kwargs ) -> Tuple[nn.Module, int]: prev_dilation = self.dilation mv1_block = [] out_channels = mv1_config.get("out_channels") stride = mv1_config.get("stride", 1) n_repeat = mv1_config.get("repeat", 0) if stride == 2: if dilate: self.dilation *= stride stride = 1 mv1_block.append( SeparableConv2d( opts=opts, in_channels=input_channel, out_channels=out_channels, kernel_size=3, stride=stride, use_norm=True, use_act=True, dilation=prev_dilation, ), ) input_channel = out_channels for i in range(n_repeat): mv1_block.append( SeparableConv2d( opts=opts, in_channels=input_channel, out_channels=out_channels, kernel_size=3, stride=1, use_norm=True, use_act=True, dilation=self.dilation, ), ) input_channel = out_channels return nn.Sequential(*mv1_block), input_channel ================================================ FILE: corenet/modeling/models/classification/mobilenetv2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, List, Optional, Tuple, Union from torch import nn from corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobilenetv2 import get_configuration from corenet.modeling.modules import InvertedResidual from corenet.utils.math_utils import bound_fn, make_divisible @MODEL_REGISTRY.register(name="mobilenetv2", type="classification") class MobileNetV2(BaseImageEncoder): """ This class defines the `MobileNetv2 architecture `_ """ def __init__(self, opts, *args, **kwargs) -> None: width_mult = getattr( opts, "model.classification.mobilenetv2.width_multiplier", 1.0 ) cfg = get_configuration(opts=opts) image_channels = 3 input_channels = 32 last_channel = 1280 classifier_dropout = getattr( opts, "model.classification.classifier_dropout", 0.0 ) if classifier_dropout == 0.0 or classifier_dropout is None: val = round(0.2 * width_mult, 3) classifier_dropout = bound_fn(min_val=0.0, max_val=0.2, value=val) super().__init__(opts, *args, **kwargs) last_channel = make_divisible( last_channel * max(1.0, width_mult), self.round_nearest ) self.model_conf_dict = dict() self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=input_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": input_channels} self.layer_1, out_channels = self._make_layer( opts=opts, mv2_config=cfg["layer1"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer1"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_2, out_channels = self._make_layer( opts=opts, mv2_config=cfg["layer2"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer2"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_3, out_channels = self._make_layer( opts=opts, mv2_config=cfg["layer3"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer3"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_4, out_channels = self._make_layer( opts=opts, mv2_config=[cfg["layer4"], cfg["layer4_a"]], width_mult=width_mult, input_channel=input_channels, dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_5, out_channels = self._make_layer( opts=opts, mv2_config=[cfg["layer5"], cfg["layer5_a"]], width_mult=width_mult, input_channel=input_channels, dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.conv_1x1_exp = ConvLayer2d( opts=opts, in_channels=input_channels, out_channels=last_channel, kernel_size=1, stride=1, use_act=True, use_norm=True, ) self.model_conf_dict["exp_before_cls"] = { "in": input_channels, "out": last_channel, } pool_type = getattr(opts, "model.layer.global_pool", "mean") self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=last_channel, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": last_channel, "out": self.n_classes} # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mobilenetv2.width-multiplier", type=float, default=1.0, help="Width multiplier for MobileNetv2. Default: 1.0", ) return parser def _make_layer( self, opts, mv2_config: Union[Dict, List], width_mult: float, input_channel: int, dilate: Optional[bool] = False, *args, **kwargs ) -> Tuple[nn.Module, int]: prev_dilation = self.dilation mv2_block = nn.Sequential() count = 0 if isinstance(mv2_config, Dict): mv2_config = [mv2_config] for cfg in mv2_config: t = cfg.get("expansion_ratio") c = cfg.get("out_channels") n = cfg.get("num_blocks") s = cfg.get("stride") output_channel = make_divisible(c * width_mult, self.round_nearest) for block_idx in range(n): stride = s if block_idx == 0 else 1 block_name = "mv2_block_{}".format(count) if dilate and count == 0: self.dilation *= stride stride = 1 layer = InvertedResidual( opts=opts, in_channels=input_channel, out_channels=output_channel, stride=stride, expand_ratio=t, dilation=prev_dilation if count == 0 else self.dilation, ) mv2_block.add_module(name=block_name, module=layer) count += 1 input_channel = output_channel return mv2_block, input_channel ================================================ FILE: corenet/modeling/models/classification/mobilenetv3.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple from torch import nn from corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobilenetv3 import get_configuration from corenet.modeling.modules import InvertedResidualSE from corenet.utils.math_utils import bound_fn, make_divisible @MODEL_REGISTRY.register(name="mobilenetv3", type="classification") class MobileNetV3(BaseImageEncoder): """ This class implements the `MobileNetv3 architecture `_ """ def __init__(self, opts, *args, **kwargs) -> None: width_mult = getattr( opts, "model.classification.mobilenetv3.width_multiplier", 1.0 ) classifier_dropout = getattr( opts, "model.classification.classifier_dropout", 0.0 ) if classifier_dropout == 0.0 or classifier_dropout is None: val = round(0.2 * width_mult, 3) classifier_dropout = bound_fn(min_val=0.0, max_val=0.2, value=val) image_channels = 3 input_channels = make_divisible(16 * width_mult, 8) mv3_config = get_configuration(opts) super().__init__(opts, *args, **kwargs) self.conv_1 = nn.Sequential() self.conv_1.add_module( name="conv_3x3_bn", module=ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=input_channels, kernel_size=3, stride=2, use_norm=True, use_act=False, ), ) self.conv_1.add_module( name="act", module=build_activation_layer(opts, act_type="hard_swish", inplace=True), ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": input_channels} self.layer_1, out_channels = self._make_layer( opts=opts, mv3_config=mv3_config["layer_1"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer1"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_2, out_channels = self._make_layer( opts=opts, mv3_config=mv3_config["layer_2"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer2"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_3, out_channels = self._make_layer( opts=opts, mv3_config=mv3_config["layer_3"], width_mult=width_mult, input_channel=input_channels, ) self.model_conf_dict["layer3"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_4, out_channels = self._make_layer( opts=opts, mv3_config=mv3_config["layer_4"], width_mult=width_mult, input_channel=input_channels, dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.layer_5, out_channels = self._make_layer( opts=opts, mv3_config=mv3_config["layer_5"], width_mult=width_mult, input_channel=input_channels, dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.conv_1x1_exp = nn.Sequential() out_channels = 6 * input_channels self.conv_1x1_exp.add_module( name="conv_1x1", module=ConvLayer2d( opts=opts, in_channels=input_channels, out_channels=out_channels, kernel_size=1, stride=1, use_act=False, use_norm=True, ), ) self.conv_1x1_exp.add_module( name="act", module=build_activation_layer(opts, act_type="hard_swish", inplace=True), ) self.model_conf_dict["exp_before_cls"] = { "in": input_channels, "out": out_channels, } pool_type = getattr(opts, "model.layer.global_pool", "mean") last_channels = mv3_config["last_channels"] self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) self.classifier.add_module( name="fc1", module=LinearLayer( in_features=out_channels, out_features=last_channels, bias=True ), ) self.classifier.add_module( name="act", module=build_activation_layer(opts, act_type="hard_swish", inplace=True), ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=last_channels, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": 6 * input_channels, "out": self.n_classes} def _make_layer( self, opts, mv3_config, width_mult: float, input_channel: int, dilate: Optional[bool] = False, *args, **kwargs ) -> Tuple[nn.Module, int]: prev_dilation = self.dilation mv3_block = nn.Sequential() count = 0 for i in range(len(mv3_config)): for kernel_size, expansion_factor, in_channels, use_se, use_hs, stride in [ mv3_config[i] ]: block_name = "mv3_s_{}_idx_{}".format(stride, count) output_channel = make_divisible( in_channels * width_mult, self.round_nearest ) if dilate and count == 0: self.dilation *= stride stride = 1 layer = InvertedResidualSE( opts=opts, in_channels=input_channel, out_channels=output_channel, stride=stride, expand_ratio=expansion_factor, dilation=prev_dilation if count == 0 else self.dilation, act_fn_name="hard_swish" if use_hs else "relu", use_se=use_se, ) mv3_block.add_module(name=block_name, module=layer) count += 1 input_channel = output_channel return mv3_block, input_channel @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mobilenetv3.mode", type=str, default="large", help="Configuration for mobilenetv3. Default: large", choices=("small", "large"), ) group.add_argument( "--model.classification.mobilenetv3.width-multiplier", type=float, default=1.0, help="Width multiplier for mobilenetv3. Default: 1.0", ) return parser ================================================ FILE: corenet/modeling/models/classification/mobileone.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import torch.nn as nn from corenet.modeling.layers import GlobalPool, Identity, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobileone import get_configuration from corenet.modeling.modules.mobileone_block import MobileOneBlock @MODEL_REGISTRY.register(name="mobileone", type="classification") class MobileOne(BaseImageEncoder): """ This class implements `MobileOne architecture `_ """ def __init__(self, opts, *args, **kwargs) -> None: cfg = get_configuration(opts=opts) super().__init__(opts, *args, **kwargs) self.opts = opts image_channels = 3 num_blocks_per_stage = cfg["num_blocks_per_stage"] width_multipliers = cfg["width_multipliers"] use_se = cfg["use_se"] self.num_conv_branches = cfg["num_conv_branches"] self.inference_mode = getattr( opts, "model.classification.mobileone.inference_mode" ) assert len(width_multipliers) == 4 self.in_planes = min(64, int(64 * width_multipliers[0])) self.model_conf_dict = dict() # First dense conv self.conv_1 = MobileOneBlock( opts, in_channels=image_channels, out_channels=self.in_planes, kernel_size=3, stride=2, padding=1, inference_mode=self.inference_mode, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": self.in_planes} self.layer_1 = Identity() self.model_conf_dict["layer1"] = {"in": self.in_planes, "out": self.in_planes} # Build stages self.cur_layer_idx = 1 self.model_conf_dict["layer2"] = { "in": self.in_planes, "out": int(64 * width_multipliers[0]), } self.layer_2 = self._make_stage( int(64 * width_multipliers[0]), num_blocks_per_stage[0], num_se_blocks=0 ) self.model_conf_dict["layer3"] = { "in": self.in_planes, "out": int(128 * width_multipliers[1]), } self.layer_3 = self._make_stage( int(128 * width_multipliers[1]), num_blocks_per_stage[1], num_se_blocks=0 ) self.model_conf_dict["layer4"] = { "in": self.in_planes, "out": int(256 * width_multipliers[2]), } self.layer_4 = self._make_stage( int(256 * width_multipliers[2]), num_blocks_per_stage[2], num_se_blocks=int(num_blocks_per_stage[2] // 2) if use_se else 0, ) self.model_conf_dict["layer5"] = { "in": self.in_planes, "out": int(512 * width_multipliers[3]), } self.layer_5 = self._make_stage( int(512 * width_multipliers[3]), num_blocks_per_stage[3], num_se_blocks=num_blocks_per_stage[3] if use_se else 0, ) # No extra 1x1 conv before classifier self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": int(512 * width_multipliers[3]), "out": int(512 * width_multipliers[3]), } # Build classifier pool_type = getattr(opts, "model.layer.global_pool") self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=int(512 * width_multipliers[3]), out_features=self.n_classes, bias=True, ), ) self.model_conf_dict["cls"] = { "in": int(512 * width_multipliers[3]), "out": self.n_classes, } # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mobileone.variant", type=str, default="s1", help="Variant string for MobileOne. Default: s1", ) group.add_argument( "--model.classification.mobileone.inference-mode", type=bool, default=False, help="Flag to instantiate inference mode architecture. Default: False", ) return parser def _make_stage( self, planes: int, num_blocks: int, num_se_blocks: int ) -> nn.Sequential: """Build a stage of MobileOne model. Args: planes: Number of output channels. num_blocks: Number of blocks in this stage. num_se_blocks: Number of SE blocks in this stage. Returns: A stage of MobileOne model. """ # Get strides for all layers strides = [2] + [1] * (num_blocks - 1) blocks = [] for ix, stride in enumerate(strides): use_se = False if num_se_blocks > num_blocks: raise ValueError( f"Number of SE blocks ({num_se_blocks}) cannot exceed number of layers ({num_blocks})." ) if ix >= (num_blocks - num_se_blocks): use_se = True # MobileOne block with depthwise conv blocks.append( MobileOneBlock( self.opts, in_channels=self.in_planes, out_channels=self.in_planes, kernel_size=3, stride=stride, padding=1, groups=self.in_planes, inference_mode=self.inference_mode, use_se=use_se, num_conv_branches=self.num_conv_branches, ) ) # MobileOne block with pointwise conv blocks.append( MobileOneBlock( self.opts, in_channels=self.in_planes, out_channels=planes, kernel_size=1, stride=1, padding=0, groups=1, inference_mode=self.inference_mode, use_se=use_se, num_conv_branches=self.num_conv_branches, ) ) self.in_planes = planes self.cur_layer_idx += 1 return nn.Sequential(*blocks) def get_exportable_model(self) -> nn.Module: """Method returns a model where a multi-branched structure used in training is re-parameterized into a single branch for inference. Returns: Reparametrized MobileOne model for faster inference. """ # Avoid editing original graph model = copy.deepcopy(self) for module in model.modules(): if hasattr(module, "reparameterize"): module.reparameterize() return model ================================================ FILE: corenet/modeling/models/classification/mobilevit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Callable, Dict, Optional, Tuple from torch import nn from corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobilevit import get_configuration from corenet.modeling.modules import InvertedResidual, MobileViTBlock from corenet.utils import logger @MODEL_REGISTRY.register(name="mobilevit", type="classification") class MobileViT(BaseImageEncoder): """ This class implements the `MobileViT architecture `_ """ def __init__(self, opts, *args, **kwargs) -> None: classifier_dropout = getattr( opts, "model.classification.classifier_dropout", 0.0 ) pool_type = getattr(opts, "model.layer.global_pool", "mean") image_channels = 3 out_channels = 16 mobilevit_config = get_configuration(opts=opts) super().__init__(opts, *args, **kwargs) # store model configuration in a dictionary self.model_conf_dict = dict() self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=out_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": out_channels} in_channels = out_channels self.layer_1, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer1"] ) self.model_conf_dict["layer1"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_2, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer2"] ) self.model_conf_dict["layer2"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_3, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer3"] ) self.model_conf_dict["layer3"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_4, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer4"], dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_5, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer5"], dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": in_channels, "out": out_channels} in_channels = out_channels exp_channels = min(mobilevit_config["last_layer_exp_factor"] * in_channels, 960) self.conv_1x1_exp = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=exp_channels, kernel_size=1, stride=1, use_act=True, use_norm=True, ) self.model_conf_dict["exp_before_cls"] = { "in": in_channels, "out": exp_channels, } self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="dropout", module=Dropout(p=classifier_dropout, inplace=True) ) self.classifier.add_module( name="fc", module=LinearLayer( in_features=exp_channels, out_features=self.n_classes, bias=True ), ) # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mit.mode", type=str, default="small", choices=["xx_small", "x_small", "small"], help="MobileViT mode. Defaults to small", ) group.add_argument( "--model.classification.mit.attn-dropout", type=float, default=0.0, help="Dropout in attention layer. Defaults to 0.0", ) group.add_argument( "--model.classification.mit.ffn-dropout", type=float, default=0.0, help="Dropout between FFN layers. Defaults to 0.0", ) group.add_argument( "--model.classification.mit.dropout", type=float, default=0.0, help="Dropout in Transformer layer. Defaults to 0.0", ) group.add_argument( "--model.classification.mit.transformer-norm-layer", type=str, default="layer_norm", help="Normalization layer in transformer. Defaults to LayerNorm", ) group.add_argument( "--model.classification.mit.no-fuse-local-global-features", action="store_true", help="Do not combine local and global features in MobileViT block", ) group.add_argument( "--model.classification.mit.conv-kernel-size", type=int, default=3, help="Kernel size of Conv layers in MobileViT block", ) group.add_argument( "--model.classification.mit.head-dim", type=int, default=None, help="Head dimension in transformer", ) group.add_argument( "--model.classification.mit.number-heads", type=int, default=None, help="Number of heads in transformer", ) return parser def _make_layer( self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False, *args, **kwargs ) -> Tuple[nn.Sequential, int]: block_type = cfg.get("block_type", "mobilevit") if block_type.lower() == "mobilevit": return self._make_mit_layer( opts=opts, input_channel=input_channel, cfg=cfg, dilate=dilate ) else: return self._make_mobilenet_layer( opts=opts, input_channel=input_channel, cfg=cfg ) @staticmethod def _make_mobilenet_layer( opts, input_channel: int, cfg: Dict, *args, **kwargs ) -> Tuple[nn.Sequential, int]: output_channels = cfg.get("out_channels") num_blocks = cfg.get("num_blocks", 2) expand_ratio = cfg.get("expand_ratio", 4) block = [] for i in range(num_blocks): stride = cfg.get("stride", 1) if i == 0 else 1 layer = InvertedResidual( opts=opts, in_channels=input_channel, out_channels=output_channels, stride=stride, expand_ratio=expand_ratio, ) block.append(layer) input_channel = output_channels return nn.Sequential(*block), input_channel def _make_mit_layer( self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False, *args, **kwargs ) -> Tuple[nn.Sequential, int]: prev_dilation = self.dilation block = [] stride = cfg.get("stride", 1) if stride == 2: if dilate: self.dilation *= 2 stride = 1 layer = InvertedResidual( opts=opts, in_channels=input_channel, out_channels=cfg.get("out_channels"), stride=stride, expand_ratio=cfg.get("mv_expand_ratio", 4), dilation=prev_dilation, ) block.append(layer) input_channel = cfg.get("out_channels") head_dim = cfg.get("head_dim", 32) transformer_dim = cfg["transformer_channels"] ffn_dim = cfg.get("ffn_dim") if head_dim is None: num_heads = cfg.get("num_heads", 4) if num_heads is None: num_heads = 4 head_dim = transformer_dim // num_heads if transformer_dim % head_dim != 0: logger.error( "Transformer input dimension should be divisible by head dimension. " "Got {} and {}.".format(transformer_dim, head_dim) ) block.append( MobileViTBlock( opts=opts, in_channels=input_channel, transformer_dim=transformer_dim, ffn_dim=ffn_dim, n_transformer_blocks=cfg.get("transformer_blocks", 1), patch_h=cfg.get("patch_h", 2), patch_w=cfg.get("patch_w", 2), dropout=getattr(opts, "model.classification.mit.dropout", 0.1), ffn_dropout=getattr(opts, "model.classification.mit.ffn_dropout", 0.0), attn_dropout=getattr( opts, "model.classification.mit.attn_dropout", 0.1 ), head_dim=head_dim, no_fusion=getattr( opts, "model.classification.mit.no_fuse_local_global_features", False, ), conv_ksize=getattr( opts, "model.classification.mit.conv_kernel_size", 3 ), ) ) return nn.Sequential(*block), input_channel def get_activation_checkpoint_submodule_class(self) -> Callable: return MobileViTBlock ================================================ FILE: corenet/modeling/models/classification/mobilevit_v2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional, Tuple from torch import nn from corenet.modeling.layers import ConvLayer2d, GlobalPool, Identity, LinearLayer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.mobilevit_v2 import get_configuration from corenet.modeling.modules import InvertedResidual from corenet.modeling.modules import MobileViTBlockv2 as Block @MODEL_REGISTRY.register(name="mobilevit_v2", type="classification") class MobileViTv2(BaseImageEncoder): """ This class defines the `MobileViTv2 `_ architecture """ def __init__(self, opts, *args, **kwargs) -> None: pool_type = getattr(opts, "model.layer.global_pool", "mean") mobilevit_config = get_configuration(opts=opts) image_channels = mobilevit_config["layer0"]["img_channels"] out_channels = mobilevit_config["layer0"]["out_channels"] super().__init__(opts, *args, **kwargs) # store model configuration in a dictionary self.model_conf_dict = dict() self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=out_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": out_channels} in_channels = out_channels self.layer_1, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer1"] ) self.model_conf_dict["layer1"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_2, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer2"] ) self.model_conf_dict["layer2"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_3, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer3"] ) self.model_conf_dict["layer3"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_4, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer4"], dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": in_channels, "out": out_channels} in_channels = out_channels self.layer_5, out_channels = self._make_layer( opts=opts, input_channel=in_channels, cfg=mobilevit_config["layer5"], dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": in_channels, "out": out_channels} self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": out_channels, "out": out_channels, } self.classifier = nn.Sequential( GlobalPool(pool_type=pool_type, keep_dim=False), LinearLayer( in_features=out_channels, out_features=self.n_classes, bias=True ), ) # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.mitv2.attn-dropout", type=float, default=0.0, help="Dropout in attention layer. Defaults to 0.0", ) group.add_argument( "--model.classification.mitv2.ffn-dropout", type=float, default=0.0, help="Dropout between FFN layers. Defaults to 0.0", ) group.add_argument( "--model.classification.mitv2.dropout", type=float, default=0.0, help="Dropout in attention layer. Defaults to 0.0", ) group.add_argument( "--model.classification.mitv2.width-multiplier", type=float, default=1.0, help="Width multiplier. Defaults to 1.0", ) group.add_argument( "--model.classification.mitv2.attn-norm-layer", type=str, default="layer_norm_2d", help="Norm layer in attention block. Defaults to LayerNorm", ) return parser def _make_layer( self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False ) -> Tuple[nn.Sequential, int]: block_type = cfg.get("block_type", "mobilevit") if block_type.lower() == "mobilevit": return self._make_mit_layer( opts=opts, input_channel=input_channel, cfg=cfg, dilate=dilate ) else: return self._make_mobilenet_layer( opts=opts, input_channel=input_channel, cfg=cfg ) @staticmethod def _make_mobilenet_layer( opts, input_channel: int, cfg: Dict ) -> Tuple[nn.Sequential, int]: output_channels = cfg.get("out_channels") num_blocks = cfg.get("num_blocks", 2) expand_ratio = cfg.get("expand_ratio", 4) block = [] for i in range(num_blocks): stride = cfg.get("stride", 1) if i == 0 else 1 layer = InvertedResidual( opts=opts, in_channels=input_channel, out_channels=output_channels, stride=stride, expand_ratio=expand_ratio, ) block.append(layer) input_channel = output_channels return nn.Sequential(*block), input_channel def _make_mit_layer( self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False ) -> Tuple[nn.Sequential, int]: prev_dilation = self.dilation block = [] stride = cfg.get("stride", 1) if stride == 2: if dilate: self.dilation *= 2 stride = 1 layer = InvertedResidual( opts=opts, in_channels=input_channel, out_channels=cfg.get("out_channels"), stride=stride, expand_ratio=cfg.get("mv_expand_ratio", 4), dilation=prev_dilation, ) block.append(layer) input_channel = cfg.get("out_channels") attn_unit_dim = cfg["attn_unit_dim"] ffn_multiplier = cfg.get("ffn_multiplier") dropout = getattr(opts, "model.classification.mitv2.dropout", 0.0) block.append( Block( opts=opts, in_channels=input_channel, attn_unit_dim=attn_unit_dim, ffn_multiplier=ffn_multiplier, n_attn_blocks=cfg.get("attn_blocks", 1), patch_h=cfg.get("patch_h", 2), patch_w=cfg.get("patch_w", 2), dropout=dropout, ffn_dropout=getattr( opts, "model.classification.mitv2.ffn_dropout", 0.0 ), attn_dropout=getattr( opts, "model.classification.mitv2.attn_dropout", 0.0 ), conv_ksize=3, attn_norm_layer=getattr( opts, "model.classification.mitv2.attn_norm_layer", "layer_norm_2d" ), dilation=self.dilation, ) ) return nn.Sequential(*block), input_channel ================================================ FILE: corenet/modeling/models/classification/regnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, List, Tuple from torch import nn from corenet.modeling.layers import ( AdaptiveAvgPool2d, ConvLayer2d, Dropout, Flatten, Identity, LinearLayer, ) from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.regnet import ( get_configuration, supported_modes, ) from corenet.modeling.modules import AnyRegNetStage @MODEL_REGISTRY.register(name="regnet", type="classification") class RegNet(BaseImageEncoder): """ This class implements the `RegNet architecture `_ """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: image_channels = 3 classifier_dropout = getattr(opts, "model.classification.classifier_dropout") cfg = get_configuration(opts=opts) # Output channels of first conv layer stem_width = getattr(opts, "model.classification.regnet.stem_width") stochastic_depth_prob = getattr( opts, "model.classification.regnet.stochastic_depth_prob" ) stage_depths = [cfg[f"layer{i}"]["depth"] for i in range(1, 5)] super().__init__(opts, *args, **kwargs) self.model_conf_dict = dict() # Stem self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=stem_width, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = { "in": image_channels, "out": stem_width, } # Body/stages in_channels = stem_width net_num_blocks = sum(stage_depths) for stage_index in range(1, 5): # Set stochastic depths for each block in the stage stage_depth = stage_depths[stage_index - 1] start_index = sum(stage_depths[: stage_index - 1]) stochastic_depth_probs = [ round( stochastic_depth_prob * (i + start_index) / (net_num_blocks - 1), 4 ) for i in range(stage_depth) ] layer, out_channels = self._make_stage( opts=opts, width_in=in_channels, stage_config=cfg[f"layer{stage_index}"], stage_index=stage_index, stochastic_depth_probs=stochastic_depth_probs, ) setattr(self, f"layer_{stage_index}", layer) self.model_conf_dict[f"layer{stage_index}"] = { "in": in_channels, "out": out_channels, } in_channels = out_channels self.layer_5 = Identity() self.model_conf_dict["layer5"] = { "in": in_channels, "out": in_channels, } self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": in_channels, "out": in_channels, } # Head self.classifier = nn.Sequential() self.classifier.add_module( name="avg_pool", module=AdaptiveAvgPool2d(output_size=(1, 1), keep_dim=False), ) self.classifier.add_module(name="flatten", module=Flatten()) if classifier_dropout > 0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=in_channels, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": in_channels, "out": self.n_classes} self.check_model() self.reset_parameters(opts=opts) def _make_stage( self, opts: argparse.Namespace, width_in: int, stage_config: Dict, stage_index: int, stochastic_depth_probs: List[float], *args, **kwargs, ) -> Tuple[nn.Sequential, int]: stage_depth = stage_config["depth"] stage_width = stage_config["width"] groups = stage_config["groups"] stride = stage_config["stride"] bottleneck_multiplier = stage_config["bottleneck_multiplier"] se_ratio = stage_config["se_ratio"] stage = AnyRegNetStage( opts=opts, depth=stage_depth, width_in=width_in, width_out=stage_width, stride=stride, groups=groups, bottleneck_multiplier=bottleneck_multiplier, se_ratio=se_ratio, stage_index=stage_index, stochastic_depth_probs=stochastic_depth_probs, ) return stage, stage_width @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != RegNet: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.regnet.mode", type=str, default="y_4.0gf", help=f"The RegNet to use. Must be one of {', '.join(supported_modes)}. Defaults to y_4.0gf.", ) group.add_argument( "--model.classification.regnet.stochastic-depth-prob", type=float, default=0.0, help="Stochastic depth drop probability in RegNet blocks. Defaults to 0.", ) group.add_argument( "--model.classification.regnet.stem-width", type=int, default=32, help="The number of output channels of the first conv layer. Defaults to 32", ) return parser ================================================ FILE: corenet/modeling/models/classification/resnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from functools import partial from typing import Dict, List, Tuple import numpy as np from torch import nn from corenet.modeling.layers import ( ConvLayer2d, Dropout, GlobalPool, Identity, LinearLayer, ) from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.resnet import get_configuration from corenet.modeling.modules import BasicResNetBlock, BottleneckResNetBlock @MODEL_REGISTRY.register(name="resnet", type="classification") class ResNet(BaseImageEncoder): """ This class implements the `ResNet architecture `_ .. note:: Our ResNet implementation is different from the original implementation in two ways: 1. First 7x7 strided conv is replaced with 3x3 strided conv 2. MaxPool operation is replaced with another 3x3 strided depth-wise conv """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: image_channels = 3 input_channels = 64 classifier_dropout = getattr(opts, "model.classification.classifier_dropout") stochastic_depth_prob = getattr( opts, "model.classification.resnet.stochastic_depth_prob" ) pool_type = getattr(opts, "model.layer.global_pool") cfg = get_configuration(opts=opts) super().__init__(opts, *args, **kwargs) self.model_conf_dict = dict() self.conv_1 = ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=input_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": input_channels} self.layer_1 = ConvLayer2d( opts=opts, in_channels=input_channels, out_channels=input_channels, kernel_size=3, stride=2, use_norm=True, use_act=True, groups=input_channels, ) self.model_conf_dict["layer1"] = {"in": input_channels, "out": input_channels} # Stochastic depth variables block_repeats = [cfg[f"layer{i}"].get("num_blocks", 2) for i in range(2, 6)] block_start_indices = np.cumsum([0] + block_repeats[:-1]) net_num_blocks = sum(block_repeats) stochastic_depth_fn = partial( self._block_stochastic_depth_prob, stochastic_depth_prob=stochastic_depth_prob, net_num_blocks=net_num_blocks, ) start_idx = block_start_indices[0] num_blocks = cfg["layer2"]["num_blocks"] self.layer_2, out_channels = self._make_layer( opts=opts, in_channels=input_channels, layer_config=cfg["layer2"], stochastic_depth_probs=[ stochastic_depth_fn(start_idx=start_idx, idx=idx) for idx in range(num_blocks) ], ) self.model_conf_dict["layer2"] = {"in": input_channels, "out": out_channels} input_channels = out_channels start_idx = block_start_indices[1] num_blocks = cfg["layer3"]["num_blocks"] self.layer_3, out_channels = self._make_layer( opts=opts, in_channels=input_channels, layer_config=cfg["layer3"], stochastic_depth_probs=[ stochastic_depth_fn(start_idx=start_idx, idx=idx) for idx in range(num_blocks) ], ) self.model_conf_dict["layer3"] = {"in": input_channels, "out": out_channels} input_channels = out_channels start_idx = block_start_indices[2] num_blocks = cfg["layer4"]["num_blocks"] self.layer_4, out_channels = self._make_layer( opts=opts, in_channels=input_channels, layer_config=cfg["layer4"], stochastic_depth_probs=[ stochastic_depth_fn(start_idx=start_idx, idx=idx) for idx in range(num_blocks) ], dilate=self.dilate_l4, ) self.model_conf_dict["layer4"] = {"in": input_channels, "out": out_channels} input_channels = out_channels start_idx = block_start_indices[3] num_blocks = cfg["layer5"]["num_blocks"] self.layer_5, out_channels = self._make_layer( opts=opts, in_channels=input_channels, layer_config=cfg["layer5"], stochastic_depth_probs=[ stochastic_depth_fn(start_idx=start_idx, idx=idx) for idx in range(num_blocks) ], dilate=self.dilate_l5, ) self.model_conf_dict["layer5"] = {"in": input_channels, "out": out_channels} input_channels = out_channels self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": input_channels, "out": input_channels, } self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=input_channels, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": input_channels, "out": self.n_classes} # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) def _block_stochastic_depth_prob( self, stochastic_depth_prob: float, idx: int, start_idx: int, net_num_blocks: int, ): """Computes the stochastic depth probability for a particular block in the network""" return round( stochastic_depth_prob * (idx + start_idx) / (net_num_blocks - 1), 4 ) def _make_layer( self, opts: argparse.Namespace, in_channels: int, layer_config: Dict, stochastic_depth_probs: List[float], dilate: bool = False, *args, **kwargs, ) -> Tuple[nn.Sequential, int]: block_type = ( BottleneckResNetBlock if layer_config.get("block_type", "bottleneck").lower() == "bottleneck" else BasicResNetBlock ) mid_channels = layer_config.get("mid_channels") num_blocks = layer_config.get("num_blocks", 2) stride = layer_config.get("stride", 1) squeeze_channels = layer_config.get("squeeze_channels", None) previous_dilation = self.dilation if dilate: self.dilation *= stride stride = 1 out_channels = block_type.expansion * mid_channels dropout = getattr(opts, "model.classification.resnet.dropout") block = nn.Sequential() block.add_module( name="block_0", module=block_type( opts=opts, in_channels=in_channels, mid_channels=mid_channels, out_channels=out_channels, stride=stride, dilation=previous_dilation, dropout=dropout, stochastic_depth_prob=stochastic_depth_probs[0], squeeze_channels=squeeze_channels, ), ) for block_idx in range(1, num_blocks): block.add_module( name="block_{}".format(block_idx), module=block_type( opts=opts, in_channels=out_channels, mid_channels=mid_channels, out_channels=out_channels, stride=1, dilation=self.dilation, dropout=dropout, stochastic_depth_prob=stochastic_depth_probs[block_idx], squeeze_channels=squeeze_channels, ), ) return block, out_channels @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument("--model.classification.resnet.depth", type=int, default=50) group.add_argument( "--model.classification.resnet.dropout", type=float, default=0.0, help="Dropout in Resnet blocks. Defaults to 0.", ) group.add_argument( "--model.classification.resnet.stochastic-depth-prob", type=float, default=0.0, help="Stochastic depth drop probability in Resnet blocks. Defaults to 0.", ) group.add_argument( "--model.classification.resnet.se-resnet", action="store_true", default=False, help="Whether to use SE block to construct SE-ResNet model. Defaults to False.", ) return parser ================================================ FILE: corenet/modeling/models/classification/swin_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, List, Optional import torch from torch import Tensor, nn from corenet.modeling.layers import ( ConvLayer2d, Dropout, GlobalPool, Identity, LinearLayer, get_normalization_layer, ) from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.swin_transformer import ( get_configuration, ) from corenet.modeling.modules import PatchMerging, Permute, SwinTransformerBlock from corenet.utils import logger @MODEL_REGISTRY.register(name="swin", type="classification") class SwinTransformer(BaseImageEncoder): """ Implements Swin Transformer from the `"Swin Transformer: Hierarchical Vision Transformer using Shifted Windows" `_ paper. The code is adapted from `"Torchvision repository" `_ """ def __init__(self, opts, *args, **kwargs) -> None: image_channels = 3 classifier_dropout = getattr( opts, "model.classification.classifier_dropout", 0.0 ) pool_type = getattr(opts, "model.layer.global_pool", "mean") super().__init__(opts, *args, **kwargs) cfg = get_configuration(opts=opts) patch_size = cfg["patch_size"] embed_dim = cfg["embed_dim"] depths = cfg["depths"] window_size = cfg["window_size"] mlp_ratio = cfg["mlp_ratio"] num_heads = cfg["num_heads"] dropout = cfg["dropout"] attn_dropout = cfg["attn_dropout"] ffn_dropout = cfg["ffn_dropout"] stochastic_depth_prob = cfg["stochastic_depth_prob"] norm_layer = cfg["norm_layer"] # store model configuration in a dictionary self.model_conf_dict = dict() self.conv_1 = nn.Sequential( *[ ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=embed_dim, kernel_size=patch_size, stride=patch_size, use_norm=False, use_act=False, ), Permute([0, 2, 3, 1]), get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=embed_dim ), ] ) self.model_conf_dict["conv1"] = {"in": image_channels, "out": embed_dim} in_channels = embed_dim self.model_conf_dict["layer1"] = {"in": embed_dim, "out": embed_dim} # build SwinTransformer blocks layers: List[nn.Module] = [] total_stage_blocks = sum(depths) stage_block_id = 0 for i_stage in range(len(depths)): stage: List[nn.Module] = [] dim = embed_dim * 2**i_stage for i_layer in range(depths[i_stage]): # adjust stochastic depth probability based on the depth of the stage block sd_prob = ( stochastic_depth_prob * float(stage_block_id) / (total_stage_blocks - 1) ) stage.append( SwinTransformerBlock( opts, dim, num_heads[i_stage], window_size=window_size, shift_size=[ 0 if i_layer % 2 == 0 else w // 2 for w in window_size ], mlp_ratio=mlp_ratio, dropout=dropout, attn_dropout=attn_dropout, ffn_dropout=ffn_dropout, stochastic_depth_prob=sd_prob, norm_layer=norm_layer, ) ) stage_block_id += 1 # add patch merging layer if i_stage < (len(depths) - 1): stage += [PatchMerging(opts, dim, norm_layer)] layers.append(nn.Sequential(*stage)) self.model_conf_dict["layer{}".format(i_stage + 2)] = { "in": in_channels, "out": dim, } in_channels = dim self.layer_1, self.layer_2, self.layer_3, self.layer_4 = layers # For segmentation architectures, we need to disable striding at an output stride of # 8 or 16. Depending on the output stride value, we disable the striding in SwinTransformer if self.dilate_l5: for m in self.layer_3.modules(): if isinstance(m, PatchMerging): m.strided = False if self.dilate_l4: for m in self.layer_2.modules(): if isinstance(m, PatchMerging): m.strided = False self.layer_5 = nn.Sequential( *[ get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=in_channels ), Permute([0, 3, 1, 2]), ] ) self.conv_1x1_exp = Identity() self.model_conf_dict["exp_before_cls"] = { "in": in_channels, "out": in_channels, } self.classifier = nn.Sequential() self.classifier.add_module( name="global_pool", module=GlobalPool(pool_type=pool_type, keep_dim=False) ) if 0.0 < classifier_dropout < 1.0: self.classifier.add_module( name="classifier_dropout", module=Dropout(p=classifier_dropout) ) self.classifier.add_module( name="classifier_fc", module=LinearLayer( in_features=in_channels, out_features=self.n_classes, bias=True ), ) self.model_conf_dict["cls"] = {"in": in_channels, "out": self.n_classes} extract_enc_point_format = getattr( opts, "model.classification.swin.extract_end_point_format", "nchw" ) if extract_enc_point_format not in ["nchw", "nhwc"]: logger.error( "End point extraction format should be either nchw or nhwc. Got: {}".format( extract_enc_point_format ) ) self.extract_end_point_nchw_format = extract_enc_point_format == "nchw" # check model self.check_model() # weight initialization self.reset_parameters(opts=opts) def extract_end_points_all( self, x: Tensor, use_l5: Optional[bool] = True, use_l5_exp: Optional[bool] = False, *args, **kwargs ) -> Dict[str, Tensor]: # First conv layer in SwinTransformer down samples by a factor of 4, so we modify the end-point extraction # function, so that the model is compatible with down-stream heads (e.g., Mask-RCNN) out_dict = {} # Use dictionary over NamedTuple so that JIT is happy if self.training and self.neural_augmentor is not None: x = self.neural_augmentor(x) out_dict["augmented_tensor"] = x # [N, C, H, W] --> [N, H/4, W/4, C] x = self.conv_1(x) # first layer down-samples by 4, so L1 and l2 should be identity if self.extract_end_point_nchw_format: x_nchw = torch.permute(x, dims=(0, 3, 1, 2)) out_dict["out_l1"] = x_nchw out_dict["out_l2"] = x_nchw else: out_dict["out_l1"] = x out_dict["out_l2"] = x # [N, H/4, W/4, C] --> [N, H/8, W/8, C] x = self.layer_1(x) out_dict["out_l3"] = ( torch.permute(x, dims=(0, 3, 1, 2)) if self.extract_end_point_nchw_format else x ) # [N, H/8, W/8, C] --> [N, H/16, W/16, C] x = self.layer_2(x) out_dict["out_l4"] = ( torch.permute(x, dims=(0, 3, 1, 2)) if self.extract_end_point_nchw_format else x ) if use_l5: # [N, H/16, W/16, C] --> [N, H/32, W/32, C] x = self.layer_3(x) x = self.layer_4(x) # [N, H/32, W/32, C] --> [N, C, H/32, W/32] x = self.layer_5(x) out_dict["out_l5"] = ( x if self.extract_end_point_nchw_format else torch.permute(x, dims=(0, 2, 3, 1)) ) if use_l5_exp: x = self.conv_1x1_exp(x) out_dict["out_l5_exp"] = x return out_dict @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.classification.swin.mode", type=str, default="tiny", help="SwinTransformer mode. Default is swin_t", ) group.add_argument( "--model.classification.swin.stochastic-depth-prob", type=float, default=None, ) group.add_argument( "--model.classification.swin.extract-end-point-format", type=str, default="nchw", choices=["nchw", "nhwc"], help="End point extraction format in Swin Transformer. This is useful for down-stream tasks where " "task-specific heads are either in nhwc format or nchw format. Defaults to nchw.", ) return parser ================================================ FILE: corenet/modeling/models/classification/vit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import functools from typing import Callable, Dict, List, Optional, Tuple, Union import numpy as np import torch from torch import Tensor, nn from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy from corenet.modeling.layers import ( ConvLayer2d, Dropout, Identity, LinearLayer, MaxPool2d, PositionalEmbedding, TransposeConvLayer2d, get_normalization_layer, ) from corenet.modeling.misc.common import parameter_list from corenet.modeling.misc.init_utils import initialize_conv_layer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.classification.config.vit import get_configuration from corenet.modeling.modules import FlashTransformerEncoder, TransformerEncoder from corenet.utils import logger @MODEL_REGISTRY.register(name="vit", type="classification") class VisionTransformer(BaseImageEncoder): """Vision Transformer. This class defines the `Vision Transformer architecture `_. Our model implementation is inspired from `Early Convolutions Help Transformers See Better `_. Args: opts: Command-line arguments. .. note:: Our implementation is different from the original implementation in two ways: 1. Kernel size is odd. 2. Our positional encoding implementation allows us to use ViT with any multiple input scales 3. We do not use StochasticDepth 4. We do not add positional encoding to class token (if enabled), as suggested in `DeiT-3 paper `_ """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: image_channels = 3 super().__init__(opts, *args, **kwargs) vit_config = get_configuration(opts) # Typically, in the ImageNet dataset, we use 224x224 as a resolution. # For our ViT implementation, we use stride of 16. Therefore, total number of patch embeddings are (224 / 16)^2 num_patch_embeddings = (224 // 16) ** 2 embed_dim = vit_config["embed_dim"] ffn_dim = vit_config["ffn_dim"] pos_emb_drop_p = vit_config["pos_emb_drop_p"] n_transformer_layers = vit_config["n_transformer_layers"] num_heads = vit_config["n_attn_heads"] attn_dropout = vit_config["attn_dropout"] dropout = vit_config["dropout"] ffn_dropout = vit_config["ffn_dropout"] norm_layer = vit_config["norm_layer"] self.patch_emb = self._build_patch_embedding_layer( opts, image_channels=image_channels, embedding_dimension=embed_dim ) use_cls_token = not getattr(opts, "model.classification.vit.no_cls_token") stochastic_dropout = getattr( opts, "model.classification.vit.stochastic_dropout" ) per_layer_stochastic_drop_rate = [ round(x, 3) for x in np.linspace(0, stochastic_dropout, n_transformer_layers) ] self.post_transformer_norm = get_normalization_layer( opts=opts, num_features=embed_dim, norm_type=norm_layer ) use_flash_attn = getattr(opts, "model.classification.vit.use_flash_attention") if use_flash_attn: transformer_build_fn = self._build_transformer_layer_with_flash_attention else: transformer_build_fn = self._build_naive_transformer_layer self.transformer = transformer_build_fn( opts, embedding_dimension=embed_dim, ffn_dimension=ffn_dim, num_transformer_layers=n_transformer_layers, num_attention_heads=num_heads, dropout=dropout, attention_dropout=attn_dropout, ffn_dropout=ffn_dropout, normalization_layer_name=norm_layer, per_layer_stochastic_drop_rate=per_layer_stochastic_drop_rate, ) self.classifier = LinearLayer(embed_dim, self.n_classes) self.reset_parameters(opts=opts) if use_cls_token: self.cls_token = nn.Parameter(torch.zeros(size=(1, 1, embed_dim))) torch.nn.init.trunc_normal_(self.cls_token, std=0.02) else: self.cls_token = None self.pos_embed = PositionalEmbedding( opts=opts, num_embeddings=num_patch_embeddings, embedding_dim=embed_dim, sequence_first=False, padding_idx=None, is_learnable=not getattr( opts, "model.classification.vit.sinusoidal_pos_emb" ), interpolation_mode="bilinear", ) self.emb_dropout = Dropout(p=pos_emb_drop_p) self.embed_dim = embed_dim self.use_flash_attn = use_flash_attn self.model_conf_dict = { "conv1": {"in": image_channels, "out": embed_dim}, "layer1": {"in": embed_dim, "out": embed_dim}, "layer2": {"in": embed_dim, "out": embed_dim}, "layer3": {"in": embed_dim, "out": embed_dim}, "layer4": {"in": embed_dim, "out": embed_dim}, "layer5": {"in": embed_dim, "out": embed_dim}, "exp_before_cls": {"in": embed_dim, "out": embed_dim}, "cls": {"in": embed_dim, "out": self.n_classes}, } use_simple_fpn = getattr(opts, "model.classification.vit.use_simple_fpn") self.simple_fpn = None if use_simple_fpn: # for object detection, we add Simple FPN on top of ViT backbone, so that it can # generate multi-scale representations. See https://arxiv.org/abs/2203.16527 for details self.simple_fpn = self._build_simple_fpn_layers(opts, embed_dim, norm_layer) self.reset_simple_fpn_params() self.update_layer_norm_eps() def _build_patch_embedding_layer( self, opts: argparse.Namespace, image_channels: int, embedding_dimension: int ) -> nn.Sequential: """Wrapper to build patch embedding layer. Args: opts: Command-line arguments. image_channels: Number of image channels. embedding_dimension: Embedding dimension. Returns: A sequential container with three convolution layers. """ # For classification tasks, output stride is 16, while for dense prediction tasks # output stride is typically 8. We adjust default stride (i.e., [4, 2, 2]) in convolutional stem # to [2, 2, 2] to obtain a ViT model with an output stride of 8. kernel_sizes_conv_stem = [4, 2, 2] strides_conv_stem = [4, 2, 2] if self.output_stride is not None and self.output_stride not in [8, 16]: logger.error("Output stride should be 8 or 16") elif self.output_stride is not None and self.output_stride == 8: # For classification tasks, strides_conv_stem[0] = 2 conv_stem_proj_dim = max(32, embedding_dimension // 4) patch_emb = [ ConvLayer2d( opts=opts, in_channels=image_channels, out_channels=conv_stem_proj_dim, kernel_size=kernel_sizes_conv_stem[0], stride=strides_conv_stem[0], bias=False, use_norm=True, use_act=True, norm_layer=get_normalization_layer( opts=opts, num_features=conv_stem_proj_dim, norm_type="batch_norm" ), ), ConvLayer2d( opts=opts, in_channels=conv_stem_proj_dim, out_channels=conv_stem_proj_dim, kernel_size=kernel_sizes_conv_stem[1], stride=strides_conv_stem[1], bias=False, use_norm=True, use_act=True, norm_layer=get_normalization_layer( opts=opts, num_features=conv_stem_proj_dim, norm_type="batch_norm" ), ), ConvLayer2d( opts=opts, in_channels=conv_stem_proj_dim, out_channels=embedding_dimension, kernel_size=kernel_sizes_conv_stem[2], stride=strides_conv_stem[2], bias=True, use_norm=False, use_act=False, ), ] return nn.Sequential(*patch_emb) def _build_naive_transformer_layer( self, opts: argparse.Namespace, embedding_dimension: int, ffn_dimension: float, num_transformer_layers: int, num_attention_heads: int, dropout: float, attention_dropout: float, ffn_dropout: float, normalization_layer_name: str, per_layer_stochastic_drop_rate: List[float], ) -> nn.Sequential: """Wrapper to build transformer layer with unoptimized self-attention. Args: opts: Command-line arguments. embedding_dimension: Embedding dimension. ffn_dimension: Feed-forward network dimension. num_transformer_layers: Number of transformer layers. num_attention_heads: Number of attention heads. dropout: Standard dropout. attention_dropout: Attention dropout. ffn_dropout: FFN dropout. normalization_layer_name: Normalization layer name. per_layer_stochastic_drop_rate: Stochastic dropout rate for each transformer layer. Returns: A sequential container with 'num_transformer_layers' TransformerEncoder layers. """ transformer_blocks = [ TransformerEncoder( opts=opts, embed_dim=embedding_dimension, ffn_latent_dim=ffn_dimension, num_heads=num_attention_heads, attn_dropout=attention_dropout, dropout=dropout, ffn_dropout=ffn_dropout, transformer_norm_layer=normalization_layer_name, stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx], ) for layer_idx in range(num_transformer_layers) ] return nn.Sequential(*transformer_blocks) def _build_transformer_layer_with_flash_attention( self, opts: argparse.Namespace, embedding_dimension: int, ffn_dimension: float, num_transformer_layers: int, num_attention_heads: int, dropout: float, attention_dropout: float, ffn_dropout: float, normalization_layer_name: str, per_layer_stochastic_drop_rate: List[float], ) -> nn.Module: """Wrapper to build transformer layer with flash self-attention. Args: opts: Command-line arguments. embedding_dimension: Embedding dimension. ffn_dimension: Feed-forward network dimension. num_transformer_layers: Number of transformer layers. num_attention_heads: Number of attention heads. dropout: Standard dropout. attention_dropout: Attention dropout. ffn_dropout: FFN dropout. normalization_layer_name: Normalization layer name. per_layer_stochastic_drop_rate: Stochastic dropout rate for each transformer layer. Returns: A sequential container with 'num_transformer_layers' FlashTransformerEncoder layers. """ if embedding_dimension % num_attention_heads != 0: logger.error( f"Embedding dimension should be divisble by num_attention_heads. Got: {embedding_dimension} embedding dimension and {num_attention_heads} heads." ) head_dim = embedding_dimension // num_attention_heads if head_dim not in [64, 128]: logger.error( f"For flash attention, we want head dim to be 64 or 128 for better efficiency, but got head_dim as {head_dim}." ) if ffn_dimension % embedding_dimension != 0: logger.error( f"FFN dimension should be divisble by embedding dimension. Got FFN dimension as {ffn_dimension} and embedding dimension as {embedding_dimension}." ) ffn_multiplier = ffn_dimension // embedding_dimension transformer_blocks = [ FlashTransformerEncoder( opts=opts, in_features=embedding_dimension, head_dim=head_dim, attn_dropout_prob=attention_dropout, qkv_features=embedding_dimension, bias=True, dropout=dropout, ffn_dropout=ffn_dropout, ffn_multiplier=ffn_multiplier, stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx], norm_layer_name=normalization_layer_name, divisible_by=16, ) for layer_idx in range(num_transformer_layers) ] return nn.Sequential(*transformer_blocks) def update_layer_norm_eps(self) -> None: # Most ViT models use LayerNorm with 10^-6 eps. So, we update it here for m in self.modules(): if isinstance(m, nn.LayerNorm): m.eps = 1e-6 def reset_simple_fpn_params(self) -> None: # reset simple FPN parameters if self.simple_fpn is not None: for m in self.simple_fpn.modules(): if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)): initialize_conv_layer(m, init_method="kaiming_uniform") def _apply_layer_wise_lr( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ) -> Tuple[List, List]: """ This function adjusts the learning rate of each layer in transformer module. Layer-wise learning is a bit involved and requires a knowledge of how each layer is consumed during the forward pass. We adjust the learning rate of patch embedding and transformer layers while keeping the classifier and SimpleFPN at 1.0. This is because layer_wise_lr is typically applied during fine-tuning for down-stream tasks. For ViT (classification tasks), the path is like this: Patch Embedding --> Transformer --> PostNorm --> Classifier For ViT (detection tasks), the path is like this: Patch Embedding --> Transformer --> PostNorm --> SimpleFPN """ n_layers = 1 + len(self.transformer) layer_wise_lr = [ round(self.layer_wise_lr_decay_rate ** (n_layers - i), 5) for i in range(n_layers) ] module_name = kwargs.pop("module_name", "") param_list = [] param_lr_list = [] if self.neural_augmentor: neural_aug_params = parameter_list( named_parameters=self.neural_augmentor.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "neural_augmentor.", *args, **kwargs, ) param_list.extend(neural_aug_params) param_lr_list.extend([layer_wise_lr[0]] * len(neural_aug_params)) # Patch embedding related parameters embedding_params = parameter_list( named_parameters=self.patch_emb.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "patch_emb.", *args, **kwargs, ) param_list.extend(embedding_params) param_lr_list.extend([layer_wise_lr[0]] * len(embedding_params)) # positional embedding parameters pos_emb_params = parameter_list( named_parameters=self.pos_embed.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "pos_embed.", *args, **kwargs, ) param_list.extend(pos_emb_params) param_lr_list.extend([layer_wise_lr[0]] * len(pos_emb_params)) if self.cls_token is not None: # CLS token params cls_token_params = parameter_list( named_parameters=self.cls_token.named_parameters, weight_decay=0.0, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "cls_token.", *args, **kwargs, ) param_list.extend(cls_token_params) param_lr_list.extend([layer_wise_lr[0]] * len(cls_token_params)) # transformer related parameters for layer_id, transformer_layer in enumerate(self.transformer): layer_lr = layer_wise_lr[layer_id + 1] transformer_layer_params = parameter_list( named_parameters=transformer_layer.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + f"transformer.{layer_id}.", *args, **kwargs, ) param_list.extend(transformer_layer_params) param_lr_list.extend([layer_lr] * len(transformer_layer_params)) # transformer post-norm params post_transformer_norm_params = parameter_list( named_parameters=self.post_transformer_norm.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "post_transformer_norm.", *args, **kwargs, ) param_list.extend(post_transformer_norm_params) param_lr_list.extend([layer_wise_lr[-1]] * len(post_transformer_norm_params)) if self.classifier is not None: # classifier parameters classifier_params = parameter_list( named_parameters=self.classifier.named_parameters, weight_decay=0.0, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "classifier.", *args, **kwargs, ) param_list.extend(classifier_params) param_lr_list.extend([1.0] * len(classifier_params)) if self.simple_fpn is not None: # simple FPN parameters simple_fpn_params = parameter_list( named_parameters=self.simple_fpn.named_parameters, weight_decay=0.0, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "simple_fpn.", *args, **kwargs, ) param_list.extend(simple_fpn_params) param_lr_list.extend([1.0] * len(simple_fpn_params)) return param_list, param_lr_list def _build_simple_fpn_layers( self, opts: argparse.Namespace, embedding_dimension: int, normalization_layer_name: str, ) -> nn.ModuleDict: """Wrapper to build simple FPN layer. Args: opts: Command-line arguments. embedding_dimension: Embedding dimension. normalization_layer_name: Normalization layer name. Returns: A module dictionary containing convolutional layers for building SimpleFPN. """ layer_l2 = nn.Sequential( TransposeConvLayer2d( opts, in_channels=embedding_dimension, out_channels=embedding_dimension // 2, kernel_size=2, stride=2, padding=0, output_padding=0, groups=1, use_norm=True, use_act=True, norm_layer=get_normalization_layer( opts=opts, num_features=embedding_dimension // 2, norm_type=normalization_layer_name, ), ), TransposeConvLayer2d( opts, in_channels=embedding_dimension // 2, out_channels=embedding_dimension // 4, kernel_size=2, stride=2, padding=0, output_padding=0, groups=1, use_norm=False, use_act=False, bias=True, ), ) self.model_conf_dict["layer2"]["out"] = embedding_dimension // 4 layer_l3 = TransposeConvLayer2d( opts, in_channels=embedding_dimension, out_channels=embedding_dimension // 2, kernel_size=2, stride=2, padding=0, output_padding=0, groups=1, use_norm=False, use_act=False, bias=True, ) self.model_conf_dict["layer3"]["out"] = embedding_dimension // 2 layer_l4 = Identity() layer_l5 = MaxPool2d(kernel_size=2, stride=2, padding=0) simple_fpn_layers = nn.ModuleDict( { "out_l2": layer_l2, "out_l3": layer_l3, "out_l4": layer_l4, "out_l5": layer_l5, } ) return simple_fpn_layers @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == VisionTransformer: group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.classification.vit.mode", type=str, default="base", choices=["tiny", "small", "base", "large", "huge"], help="ViT mode. Default is base.", ) group.add_argument( "--model.classification.vit.dropout", type=float, default=0.0, help="Dropout in Transformer layers. Defaults to 0.0.", ) group.add_argument( "--model.classification.vit.stochastic-dropout", type=float, default=0.0, help="Stochastic Dropout in Transformer layers. Defaults to 0.0.", ) group.add_argument( "--model.classification.vit.norm-layer", type=str, default="layer_norm", help="Normalization layer to be used in Transformer layer. Defaults to LayerNorm.", ) group.add_argument( "--model.classification.vit.sinusoidal-pos-emb", action="store_true", default=False, help="Use sinusoidal instead of learnable positional embedding. Defaults to False.", ) group.add_argument( "--model.classification.vit.no-cls-token", action="store_true", default=False, help="Do not use classification token. Defaults to False.", ) group.add_argument( "--model.classification.vit.use-simple-fpn", action="store_true", default=False, help="Add simple FPN for down-stream tasks (e.g., detection). Defaults to False.", ) group.add_argument( "--model.classification.vit.use-flash-attention", action="store_true", default=False, help="Use Transformer layers with flash attention for efficiently computing scaled dot-product attention. Defaults to False.", ) return parser def extract_patch_embeddings(self, x: Tensor) -> Tuple[Tensor, Tuple[int, int]]: """Extract patch embeddings from input image tensor. Args: x: Input image tensor of size [batch, image channels, height, width] Returns: A tensor containing patch embeddings. The size of the tensor is [batch, number of patches, embedding dim]. """ # input is of shape [batch, image channels, height, width]. image channels is mostly 3 (for RGB images) batch_size = x.shape[0] # [batch, image channels, height, width] --> [batch, embedding dim, number of patches along height, number of patches along width] patch_emb = self.patch_emb(x) num_patches_height, num_patches_width = patch_emb.shape[-2:] # [batch, embedding dim, number of patches along height, number of patches along width] --> [batch, embedding dim, number of patches] patch_emb = patch_emb.flatten(2) # [batch, embedding dim, number of patches] --> [batch, number of patches, embedding dim] patch_emb = patch_emb.transpose(1, 2).contiguous() num_patches = patch_emb.shape[1] # we resize the positional encodings dynamically. pos_emb = self.pos_embed(num_patches).to(patch_emb.dtype) # add positional encodings patch_emb = pos_emb + patch_emb # add classification token if self.cls_token is not None: # [1, 1, embedding dim] --> [batch, 1, embedding dim] cls_tokens = self.cls_token.expand(batch_size, -1, -1) # Concat([batch, 1, embedding dim], [batch, number of patches, embedding dim]) --> [batch, number of patches + 1, embedding dim] patch_emb = torch.cat((cls_tokens, patch_emb), dim=1) # dropout patch_emb = self.emb_dropout(patch_emb) return patch_emb, (num_patches_height, num_patches_width) def _features_from_transformer(self, x: Tensor) -> Tuple[Tensor, Tuple[int, int]]: """Helper function to extract patch embeddings and learn inter-patch representations using transformers. Args: x: Input image tensor of size [batch, image channels, Height, Width] Returns: A tensor containing contextualized patch embeddings.The size of the tensor is [batch, number of patches, embedding dimension]. It also returns a tuple containing the number of patches along height and width dimensions. """ x, (n_h, n_w) = self.extract_patch_embeddings(x) x = self.transformer(x) x = self.post_transformer_norm(x) return x, (n_h, n_w) def extract_features( self, x: Tensor, return_image_embeddings: bool = False ) -> Tuple[Tensor, Optional[Tensor]]: """Helper function for extraction features. Args: x: Input image tensor of size [batch, image channels, height, width]. return_image_embeddings: When enabled, image embeddings are also returned. Returns: If 'return_image_embeddings=True', then both CLS_TOKEN and image embeddings are returned. Otherwise, CLS_TOKEN embedding and None are returned. The shape of CLS_TOKEN embedding is [batch, embedding dim] while the shape of image embeddings is [batch, embedding dim, num. patches height, num. patches width]. """ # [Batch, image channels, height, Width] --> [batch, CLS_TOKEN + number of patches, embedding dim] x, (n_h, n_w) = self._features_from_transformer(x) if self.cls_token is not None: # [batch, CLS_TOKEN + num. patches, embedding dim] --> [batch, embedding dim], [batch, number of patches, embedding dim] cls_embedding, image_embedding = torch.split( x, split_size_or_sections=[1, x.shape[1] - 1], dim=1 ) cls_embedding = cls_embedding.squeeze(1) else: # [batch, number of patches, embedding dim] -> [batch, embedding dim] cls_embedding = torch.mean(x, dim=1) # [batch, number of patches, embedding dim] image_embedding = x if return_image_embeddings: # reshape image embedding to 4-D tensor # [batch, number of patches, embedding dim] --> [batch, embedding dim, number of patches] image_embedding = image_embedding.transpose(1, 2).contiguous() # [batch, embedding dim, number of patches] --> [batch, embedding dim, number of patches along height, number of patches along width] image_embedding = image_embedding.reshape( image_embedding.shape[0], -1, n_h, n_w ) return cls_embedding, image_embedding else: return cls_embedding, None def forward_classifier( self, x: Tensor, return_image_embeddings: bool = False ) -> Tuple[Tensor, Optional[Tensor]]: """Forward function for classification tasks. Args: x: Input image tensor of size [batch, image channels, height, width]. return_image_embeddings: When enabled, image embeddings are also returned. Returns: The logits computed for CLS token are returned. If kwargs contain 'return_image_embeddings', then image embeddings are also returned. The shape of logits is [batch, number of classes] while the shape of image embeddings is [batch, embedding dim, num. patches height, num. patches width]. """ cls_embedding, image_embedding = self.extract_features( x, return_image_embeddings ) # classify based on CLS token logits = self.classifier(cls_embedding) return logits, image_embedding def forward( self, x: Tensor, return_image_embeddings: bool = False ) -> Union[Tensor, Dict[str, Tensor]]: """Forward function for ViT. Args: x: Input image tensor of shape [Batch, 3, Height, Width]. return_image_embeddings: When enabled, image embeddings are also returned. Returns: The output of ViT model can be one of the following: 1. If range augmentation is enabled, then a dictionary is returned with following keys 'augmented_tensor': Contains the output after applying RangeAugment. 'logits': Logit tensor 'image_embeddings': Optionally tensor containing image embeddings 2. If range augment is not enabled and return_image_embeddings is enabled, then a dictionary is returned with 'logits' and 'image_embeddings' keys. 3. A logit tensor is returned. """ if return_image_embeddings or self.neural_augmentor is not None: out_dict = {"augmented_tensor": None} if self.training and self.neural_augmentor is not None: # neural augmentor is applied during training only x = self.neural_augmentor(x) out_dict.update({"augmented_tensor": x}) logits, image_embedding = self.forward_classifier( x, return_image_embeddings ) out_dict.update({"logits": logits}) if image_embedding is not None: out_dict.update({"image_embeddings": image_embedding}) return out_dict else: logits, _ = self.forward_classifier(x) return logits def extract_end_points_all( self, x: Tensor, use_l5: Optional[bool] = True, use_l5_exp: Optional[bool] = False, ) -> Dict[str, Tensor]: """Extract feature maps from different spatial levels in the model. This function is often used in down-stream applications (e.g., segmentation) where multi-scale features are required for prediction. Args: x: Input image tensor of shape [batch, image channels, height, width]. use_l5: Extract features from spatial level 5. use_l5_exp: Extract features from the expansion layer in level 5. Returns: A mapping containing the output at each spatial level. The output keys are 'out_l1', 'out_l2', 'out_l3', 'out_l4', 'out_l5', and 'out_l5_exp'. ...note: If 'use_l5_exp' is enabled, then features from expansion layer in level 5 are returned and 'out_l5' output is set to None. Otherwise, 'out_l5_exp' is set to None. """ # this function is often used in down-stream applications (especially in segmentation and detection) if self.cls_token: logger.error("Please disable cls token for down-stream tasks") out_dict = {} if self.training and self.neural_augmentor is not None: x = self.neural_augmentor(x) out_dict["augmented_tensor"] = x cls_emb, x = self.extract_features(x, return_image_embeddings=True) out_dict["cls_embedding"] = cls_emb if self.simple_fpn is not None: # build simple FPN, as suggested in https://arxiv.org/abs/2203.16527 for k, extra_layer in self.simple_fpn.items(): out_dict[k] = extra_layer(x) else: # ViT does not have hierarchical structure by default. # Therefore, we set first four levels to None out_dict["out_l1"] = None out_dict["out_l2"] = None out_dict["out_l3"] = None out_dict["out_l4"] = None if use_l5_exp: out_dict["out_l5"] = None out_dict["out_l5_exp"] = x else: out_dict["out_l5"] = x out_dict["out_l5_exp"] = None return out_dict def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the activation checkpoint module class. For ViT, the activation checkpoint module class is TransformerEncoder or FlashTransformerEncoder. """ return FlashTransformerEncoder if self.use_flash_attn else TransformerEncoder def get_fsdp_wrap_policy( self, ) -> Optional[Callable[[torch.nn.Module, bool, int], bool]]: """Returns the FSDP wrapping policy. For ViT, we use the Transformer's wrapping policy. """ vit_auto_wrap_policy = functools.partial( transformer_auto_wrap_policy, transformer_layer_cls={ FlashTransformerEncoder if self.use_flash_attn else TransformerEncoder }, ) return vit_auto_wrap_policy ================================================ FILE: corenet/modeling/models/detection/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from collections import namedtuple DetectionPredTuple = namedtuple( typename="DetectionPredTuple", field_names=("labels", "scores", "boxes", "masks"), defaults=(None, None, None, None), ) ================================================ FILE: corenet/modeling/models/detection/base_detection.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict from torch import nn from corenet.modeling.misc.init_utils import initialize_weights from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.utils import logger @MODEL_REGISTRY.register(name="__base__", type="detection") class BaseDetection(BaseAnyNNModel): """Base class for the task of object detection Args: opts: Command-line arguments encoder: Image-encoder model (e.g., MobileNet or ResNet) """ def __init__( self, opts: argparse.Namespace, encoder: BaseImageEncoder, *args, **kwargs ) -> None: super().__init__(opts, *args, **kwargs) assert isinstance(encoder, BaseImageEncoder) self.encoder: BaseImageEncoder = encoder self.n_detection_classes = getattr(opts, "model.detection.n_classes") enc_conf = self.encoder.model_conf_dict enc_ch_l5_out_proj = check_feature_map_output_channels( enc_conf, "exp_before_cls" ) enc_ch_l5_out = check_feature_map_output_channels(enc_conf, "layer5") enc_ch_l4_out = check_feature_map_output_channels(enc_conf, "layer4") enc_ch_l3_out = check_feature_map_output_channels(enc_conf, "layer3") enc_ch_l2_out = check_feature_map_output_channels(enc_conf, "layer2") enc_ch_l1_out = check_feature_map_output_channels(enc_conf, "layer1") self.enc_l5_channels = enc_ch_l5_out self.enc_l5_channels_exp = enc_ch_l5_out_proj self.enc_l4_channels = enc_ch_l4_out self.enc_l3_channels = enc_ch_l3_out self.enc_l2_channels = enc_ch_l2_out self.enc_l1_channels = enc_ch_l1_out self.opts = opts @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" if cls != BaseDetection: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.detection.name", type=str, default=None, help="Detection model name", ) group.add_argument( "--model.detection.n-classes", type=int, default=80, help="Number of classes in the dataset. Defaults to 80.", ) group.add_argument( "--model.detection.pretrained", type=str, default=None, help="Path of the pretrained detection model. Defaults to None.", ) group.add_argument( "--model.detection.output-stride", type=int, default=None, help="Output stride of the classification network. Defaults to None.", ) group.add_argument( "--model.detection.replace-stride-with-dilation", action="store_true", default=False, help="Replace stride with dilation", ) group.add_argument( "--model.detection.freeze-batch-norm", action="store_true", default=False, help="Freeze batch norm layers in detection model. Defaults to False.", ) return parser @staticmethod def reset_layer_parameters(layer: nn.Module, opts: argparse.Namespace) -> None: """Initialize weights of a given layer""" initialize_weights(opts=opts, modules=layer.modules()) @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: output_stride = getattr(opts, "model.detection.output_stride", None) image_encoder = get_model( opts=opts, category="classification", output_stride=output_stride, *args, **kwargs ) detection_model = cls(opts=opts, encoder=image_encoder, *args, **kwargs) if getattr(opts, "model.detection.freeze_batch_norm"): cls.freeze_norm_layers(opts, model=detection_model) return detection_model def check_feature_map_output_channels(config: Dict, layer_name: str) -> int: enc_ch_l: Dict = config.get(layer_name, None) if enc_ch_l is None or not enc_ch_l: logger.error( "Encoder does not define input-output mapping for {}: Got: {}".format( layer_name, config ) ) enc_ch_l_out = enc_ch_l.get("out", None) if enc_ch_l_out is None or not enc_ch_l_out: logger.error( "Output channels are not defined in {} of the encoder. Got: {}".format( layer_name, enc_ch_l ) ) return enc_ch_l_out ================================================ FILE: corenet/modeling/models/detection/mask_rcnn.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Callable, Dict, List, Optional, Tuple, Union import torch from torch import Tensor, nn from torch.nn import functional as F # Faster and Mask-RCNN related imports from torchvision.models.detection.anchor_utils import AnchorGenerator from torchvision.models.detection.mask_rcnn import MaskRCNN from torchvision.ops import MultiScaleRoIAlign from corenet.modeling import parameter_list from corenet.modeling.layers import ConvLayer2d, Identity from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.detection import DetectionPredTuple from corenet.modeling.models.detection.base_detection import BaseDetection from corenet.modeling.models.detection.utils.rcnn_utils import ( FastRCNNConvFCHead, FastRCNNPredictor, MaskRCNNHeads, MaskRCNNPredictor, RPNHead, ) from corenet.utils import logger class MaskRCNNEncoder(nn.Module): def __init__( self, opts: argparse.Namespace, encoder: BaseImageEncoder, output_strides: List, projection_channels: int, encoder_lr_multiplier: Optional[float] = 1.0, *args, **kwargs, ) -> None: use_fpn = not getattr(opts, "model.detection.mask_rcnn.disable_fpn", False) super().__init__() # set classifier and exp layers to Identity encoder.conv_1x1_exp = Identity() encoder.classifier = Identity() # add projection layers that projects encoder feature maps to `projection_channels` backbone_proj_layers = nn.ModuleDict() self.backbone_output_strides = sorted( list({4, 8, 16, 32}.intersection(output_strides)) ) model_config = encoder.model_conf_dict self.backbone_map = {} fpn_proj_layers = nn.ModuleDict() if use_fpn else None for os in self.backbone_output_strides: if os == 4: in_channels = model_config["layer2"]["out"] backbone_os_str = "out_l2" elif os == 8: in_channels = model_config["layer3"]["out"] backbone_os_str = "out_l3" elif os == 16: in_channels = model_config["layer4"]["out"] backbone_os_str = "out_l4" elif os == 32: in_channels = model_config["layer5"]["out"] backbone_os_str = "out_l5" else: raise NotImplementedError conv_layer = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=projection_channels, kernel_size=1, use_norm=True, use_act=False, ) backbone_proj_layers.add_module(str(os), conv_layer) self.backbone_map[os] = backbone_os_str if use_fpn: fpn_layer = ConvLayer2d( opts=opts, in_channels=projection_channels, out_channels=projection_channels, kernel_size=3, use_norm=True, use_act=False, ) fpn_proj_layers.add_module(str(os), fpn_layer) # add extra layers if desired output stride is greater than 32. extra_layers = nn.ModuleDict() extra_layer_os = sorted( list((set(self.backbone_output_strides) ^ set(output_strides))) ) for os in extra_layer_os: conv_layer = ConvLayer2d( opts=opts, in_channels=projection_channels, out_channels=projection_channels, kernel_size=3, stride=2, use_norm=True, use_act=False, ) extra_layers.add_module(str(os), conv_layer) self.encoder = encoder self.backbone_proj_layers = backbone_proj_layers self.fpn_proj_layers = fpn_proj_layers self.use_fpn = use_fpn self.extra_layers = extra_layers self.out_channels = projection_channels self.augmented_tensor = None self.encoder_lr_multiplier = encoder_lr_multiplier def get_augmented_tensor(self) -> Tensor: return self.augmented_tensor def forward(self, x: Tensor) -> Dict[str, Tensor]: # extract features from the backbone network enc_end_points: Dict = self.encoder.extract_end_points_all(x) self.augmented_tensor = enc_end_points.pop("augmented_tensor", None) outputs_backbone: Dict = {} # project backbone features for os, enc_key_name in self.backbone_map.items(): x_proj = self.backbone_proj_layers[str(os)]( enc_end_points.pop(enc_key_name) ) outputs_backbone[f"{os}"] = x_proj if self.fpn_proj_layers: # FPN last_os = self.backbone_output_strides[-1] prev_fm = outputs_backbone[f"{last_os}"] prev_fm = self.fpn_proj_layers[f"{last_os}"](prev_fm) for os in self.backbone_output_strides[:-1][::-1]: curr_fm = outputs_backbone[f"{os}"] feat_shape = curr_fm.shape[-2:] inner_top_down = F.interpolate(prev_fm, size=feat_shape, mode="nearest") prev_fm = self.fpn_proj_layers[f"{os}"](curr_fm + inner_top_down) outputs_backbone[f"{os}"] = prev_fm if self.extra_layers: prev_os = self.backbone_output_strides[-1] for os, extra_layer in self.extra_layers.items(): x_proj = extra_layer(outputs_backbone[f"{prev_os}"]) outputs_backbone[f"{os}"] = x_proj prev_os = os return outputs_backbone def get_trainable_parameters( self, weight_decay: float = 0.0, no_decay_bn_filter_bias: bool = False, *args, **kwargs, ) -> Tuple[List, List]: # We need to pop the module name. Otherwise, we may pass two # variables with the same name to get_trainable_parameters function module_name = kwargs.pop("module_name", "") """Returns a list of trainable parameters""" all_params = [] all_params_lr = [] # encoder parameters if ( hasattr(self.encoder, "enable_layer_wise_lr_decay") and self.encoder.enable_layer_wise_lr_decay ): ( backbone_param_list, backbone_lr_list, ) = self.encoder.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "encoder.", *args, **kwargs, ) all_params.extend(backbone_param_list) # Scale encoder LR, if applicable if self.encoder_lr_multiplier != 1.0: backbone_lr_list = [ (lr * self.encoder_lr_multiplier) for lr in backbone_lr_list ] all_params_lr.extend(backbone_lr_list) else: backbone_param_list = parameter_list( named_parameters=self.encoder.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "encoder.", *args, **kwargs, ) all_params.extend(backbone_param_list) all_params_lr.extend( [self.encoder_lr_multiplier] * len(backbone_param_list) ) if self.backbone_proj_layers: # projection layer parameters projection_param_list = parameter_list( named_parameters=self.backbone_proj_layers.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "backbone_proj_layers.", *args, **kwargs, ) all_params.extend(projection_param_list) all_params_lr.extend([1.0] * len(projection_param_list)) if self.fpn_proj_layers: # projection layer parameters fpn_projection_param_list = parameter_list( named_parameters=self.fpn_proj_layers.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "fpn_proj_layers.", *args, **kwargs, ) all_params.extend(fpn_projection_param_list) all_params_lr.extend([1.0] * len(fpn_projection_param_list)) if self.extra_layers: # extra layer parameters extra_layer_param_list = parameter_list( named_parameters=self.extra_layers.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=module_name + "extra_layers.", *args, **kwargs, ) all_params.extend(extra_layer_param_list) all_params_lr.extend([1.0] * len(extra_layer_param_list)) return all_params, all_params_lr def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the activation checkpointing module in the encoder.""" return self.encoder.get_activation_checkpoint_submodule_class() @MODEL_REGISTRY.register(name="mask_rcnn", type="detection") class MaskRCNNDetector(BaseDetection): """This class implements a `Mask RCNN style object detector ` Args: opts: command-line arguments encoder (BaseImageEncoder): Encoder network (e.g., ResNet or MobileViT) """ def __init__(self, opts, encoder: BaseImageEncoder, *args, **kwargs) -> None: super().__init__(opts, encoder, *args, **kwargs) default_norm = self.set_norm_layer_opts() output_strides = getattr( opts, "model.detection.mask_rcnn.output_strides", [4, 8, 16, 32, 64] ) if len(output_strides) == 0: logger.error( "Please specify output strides for extracting backbone feature maps " "using --model.detection.mask-rcnn.output-strides" ) output_strides = sorted(output_strides) projection_channels = getattr( opts, "model.detection.mask_rcnn.backbone_projection_channels", 256 ) # anchor sizes and aspect ratios anchor_sizes = getattr( opts, "model.detection.mask_rcnn.anchor_sizes", [32, 64, 128, 256, 512] ) # convert to a tuples if anchor_sizes is None: logger.error("Anchor sizes can't be None") elif len(anchor_sizes) != len(output_strides): logger.error( "Number of anchor sizes should be the same as the output stride. Got: {} and {}".format( anchor_sizes, output_strides ) ) elif isinstance(anchor_sizes, List) and isinstance(anchor_sizes[0], List): # anchor sizes is a list of list. Convert to tuple anchor_sizes = tuple([tuple(a_size) for a_size in anchor_sizes]) elif isinstance(anchor_sizes, List) and isinstance(anchor_sizes[0], int): # anchor sizes is a list of integers. Convert to tuple anchor_sizes = tuple([(a_size,) for a_size in anchor_sizes]) else: raise NotImplementedError aspect_ratios = getattr( opts, "model.detection.mask_rcnn.aspect_ratio", [0.5, 1.0, 2.0] ) # ((0.5, 1.0, 2.0),) * len(anchor_sizes) if aspect_ratios is None: logger.error("Aspect ratios can't be None") elif isinstance(aspect_ratios, (int, float)): aspect_ratios = ((aspect_ratios,),) * len(anchor_sizes) elif isinstance(aspect_ratios, List): aspect_ratios = (tuple(aspect_ratios),) * len(anchor_sizes) else: raise NotImplementedError # feature map size for the bbox head box_fm_size = getattr(opts, "model.detection.mask_rcnn.bbox_head_fm_size", 7) mask_fm_size = getattr(opts, "model.detection.mask_rcnn.mask_head_fm_size", 14) # set-up the backbone backbone_lr_multiplier = getattr( opts, "model.detection.mask_rcnn.backbone_lr_multiplier" ) backbone = MaskRCNNEncoder( opts, encoder=encoder, output_strides=output_strides, projection_channels=projection_channels, encoder_lr_multiplier=backbone_lr_multiplier, ) # create RPN anchor generator rpn_anchor_generator = AnchorGenerator( sizes=anchor_sizes, aspect_ratios=aspect_ratios ) # create RPN Head rpn_head = RPNHead( opts=opts, in_channels=projection_channels, num_anchors=rpn_anchor_generator.num_anchors_per_location()[0], conv_depth=2, ) # box related parameters representation_size = getattr( opts, "model.detection.mask_rcnn.representation_size", 1024 ) output_strides_str = [str(os) for os in output_strides] box_roi_pool = MultiScaleRoIAlign( featmap_names=output_strides_str, output_size=box_fm_size, sampling_ratio=2 ) box_fm_size_conv_layer = getattr( opts, "model.detection.mask_rcnn.box_fm_size_conv_layer", [256] * 4 ) box_head = FastRCNNConvFCHead( opts=opts, input_size=(projection_channels, box_fm_size, box_fm_size), conv_layers=box_fm_size_conv_layer, fc_layers=[representation_size], ) box_predictor = FastRCNNPredictor( in_channels=representation_size, num_classes=self.n_detection_classes ) # mask related parameters mask_fm_size_conv_layer = getattr( opts, "model.detection.mask_rcnn.mask_fm_size_conv_layer", [256] * 4 ) mask_dilation = getattr(opts, "model.detection.mask_rcnn.mask_dilation", 1) mask_roi_pool = MultiScaleRoIAlign( featmap_names=output_strides_str, output_size=mask_fm_size, sampling_ratio=2 ) mask_dilation = mask_dilation mask_head = MaskRCNNHeads( opts=opts, in_channels=projection_channels, layers=mask_fm_size_conv_layer, dilation=mask_dilation, ) mask_predictor = MaskRCNNPredictor( opts=opts, in_channels=mask_fm_size_conv_layer[-1], dim_reduced=256, num_classes=self.n_detection_classes, ) # RPN and box detection related hyper-parameters rpn_pre_nms_top_n_train = getattr( opts, "model.detection.mask_rcnn.rpn_pre_nms_top_n_train", 2000 ) rpn_pre_nms_top_n_test = getattr( opts, "model.detection.mask_rcnn.rpn_pre_nms_top_n_test", 1000 ) rpn_post_nms_top_n_train = getattr( opts, "model.detection.mask_rcnn.rpn_post_nms_top_n_train", 2000 ) rpn_post_nms_top_n_test = getattr( opts, "model.detection.mask_rcnn.rpn_post_nms_top_n_test", 1000 ) rpn_nms_thresh = getattr(opts, "model.detection.mask_rcnn.rpn_nms_thresh", 0.7) rpn_fg_iou_thresh = getattr( opts, "model.detection.mask_rcnn.rpn_fg_iou_thresh", 0.7 ) rpn_bg_iou_thresh = getattr( opts, "model.detection.mask_rcnn.rpn_bg_iou_thresh", 0.3 ) rpn_batch_size_per_image = getattr( opts, "model.detection.mask_rcnn.rpn_batch_size_per_image", 256 ) rpn_positive_fraction = getattr( opts, "model.detection.mask_rcnn.rpn_positive_fraction", 0.5 ) rpn_score_thresh = getattr( opts, "model.detection.mask_rcnn.rpn_score_thresh", 0.0 ) box_score_thresh = getattr( opts, "model.detection.mask_rcnn.box_score_thresh", 0.05 ) box_nms_thresh = getattr(opts, "model.detection.mask_rcnn.box_nms_thresh", 0.5) box_detections_per_img = getattr( opts, "model.detection.mask_rcnn.box_detections_per_img", 100 ) box_fg_iou_thresh = getattr( opts, "model.detection.mask_rcnn.box_fg_iou_thresh", 0.5 ) box_bg_iou_thresh = getattr( opts, "model.detection.mask_rcnn.box_bg_iou_thresh", 0.5 ) box_batch_size_per_image = getattr( opts, "model.detection.mask_rcnn.box_batch_size_per_image", 512 ) box_positive_fraction = getattr( opts, "model.detection.mask_rcnn.box_positive_fraction", 0.25 ) # kwargs = {"_skip_resize": True} self.model = MaskRCNN( backbone=backbone, # we don't use mean-std normalization image_mean=[0.0] * 3, image_std=[1.0] * 3, # RPN parameters rpn_anchor_generator=rpn_anchor_generator, rpn_head=rpn_head, rpn_pre_nms_top_n_train=rpn_pre_nms_top_n_train, rpn_pre_nms_top_n_test=rpn_pre_nms_top_n_test, rpn_post_nms_top_n_train=rpn_post_nms_top_n_train, rpn_post_nms_top_n_test=rpn_post_nms_top_n_test, rpn_nms_thresh=rpn_nms_thresh, rpn_fg_iou_thresh=rpn_fg_iou_thresh, rpn_bg_iou_thresh=rpn_bg_iou_thresh, rpn_batch_size_per_image=rpn_batch_size_per_image, rpn_positive_fraction=rpn_positive_fraction, rpn_score_thresh=rpn_score_thresh, # Box parameters box_roi_pool=box_roi_pool, box_head=box_head, box_score_thresh=box_score_thresh, box_nms_thresh=box_nms_thresh, box_detections_per_img=box_detections_per_img, box_fg_iou_thresh=box_fg_iou_thresh, box_bg_iou_thresh=box_bg_iou_thresh, box_batch_size_per_image=box_batch_size_per_image, box_positive_fraction=box_positive_fraction, bbox_reg_weights=None, box_predictor=box_predictor, # Mask parameters mask_roi_pool=mask_roi_pool, mask_head=mask_head, mask_predictor=mask_predictor, # **kwargs ) del self.encoder self.reset_norm_layer_opts(default_norm=default_norm) self.update_layer_norm_eps() def update_layer_norm_eps(self): for m in self.modules(): if isinstance(m, nn.LayerNorm): m.eps = 1e-6 def set_norm_layer_opts(self): mask_rcnn_norm_layer = getattr( self.opts, "model.detection.mask_rcnn.norm_layer", None ) if mask_rcnn_norm_layer is None: logger.error("Please specify norm layer") default_norm = getattr(self.opts, "model.normalization.name", None) setattr(self.opts, "model.normalization.name", mask_rcnn_norm_layer) return default_norm def reset_norm_layer_opts(self, default_norm): setattr(self.opts, "model.normalization.name", default_norm) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.detection.mask-rcnn.backbone-projection-channels", type=int, default=256, help="Projection channels for the encoder in Mask-RCNN", ) group.add_argument( "--model.detection.mask-rcnn.backbone-lr-multiplier", type=float, default=1.0, help="LR multiplier for MASK RCNN head", ) group.add_argument( "--model.detection.mask-rcnn.output-strides", type=int, nargs="+", default=[4, 8, 16, 32, 64], help="Extract backbone feature maps from these output strides. " "If output stride is greater than 32, extra layers are added.", ) group.add_argument( "--model.detection.mask-rcnn.anchor-sizes", type=int, nargs="+", action="append", default=[32, 64, 128, 256, 512], help="Anchor sizes at each output stride", ) group.add_argument( "--model.detection.mask-rcnn.aspect-ratio", type=float, nargs="+", default=[0.5, 1.0, 2.0], help="Aspect ratios. These are the same for all feature maps", ) group.add_argument( "--model.detection.mask-rcnn.bbox-head-fm-size", type=int, default=7, help="Feature map size for the box head", ) group.add_argument( "--model.detection.mask-rcnn.mask-head-fm-size", type=int, default=14, help="Feature map size for the max head", ) group.add_argument( "--model.detection.mask-rcnn.representation-size", type=int, default=1024, help="Size of the intermediate representation in Mask RCNN", ) # box_fm_size_conv_layer = getattr(opts, "", [256] * 4) group.add_argument( "--model.detection.mask-rcnn.box-fm-size-conv-layer", type=int, nargs="+", default=[256] * 4, help="Feature dim of each Convolution layer in the Faster RCNN head. Defaults to [256, 256, 256, 256]", ) group.add_argument( "--model.detection.mask-rcnn.mask-fm-size-conv-layer", type=int, nargs="+", default=[256] * 4, help="Feature dim of each Convolution layer in the Mask RCNN head. Defaults to [256, 256, 256, 256]", ) group.add_argument( "--model.detection.mask-rcnn.mask-dilation", type=int, default=1, help="Dilation rate in Mask RCNN head. Defaults to 1", ) group.add_argument( "--model.detection.mask-rcnn.rpn-pre-nms-top-n-train", type=int, default=2000, help="Number of proposals to keep before applying NMS during training", ) group.add_argument( "--model.detection.mask-rcnn.rpn-pre-nms-top-n-test", type=int, default=1000, help="Number of proposals to keep before applying NMS during test", ) group.add_argument( "--model.detection.mask-rcnn.rpn-post-nms-top-n-train", type=int, default=2000, help="Number of proposals to keep after applying NMS during training", ) group.add_argument( "--model.detection.mask-rcnn.rpn-post-nms-top-n-test", type=int, default=1000, help="Number of proposals to keep after applying NMS during test", ) group.add_argument( "--model.detection.mask-rcnn.rpn-nms-thresh", type=float, default=0.7, help="NMS threshold used for postprocessing the RPN proposals", ) group.add_argument( "--model.detection.mask-rcnn.rpn-fg-iou-thresh", type=float, default=0.7, help="minimum IoU between the anchor and the GT box so that they can be " "considered as positive during training of the RPN.", ) group.add_argument( "--model.detection.mask-rcnn.rpn-bg-iou-thresh", type=float, default=0.7, help="minimum IoU between the anchor and the GT box so that they can be " "considered as negative during training of the RPN.", ) group.add_argument( "--model.detection.mask-rcnn.rpn-batch-size-per-image", type=int, default=256, help="Number of anchors that are sampled during training of the RPN for computing the loss", ) group.add_argument( "--model.detection.mask-rcnn.rpn-positive-fraction", type=float, default=0.5, help="Proportion of positive anchors in a mini-batch during training of the RPN", ) group.add_argument( "--model.detection.mask-rcnn.rpn-score-thresh", type=float, default=0.0, help="During inference, only return proposals with a classification score greater than rpn_score_thresh", ) # group.add_argument( "--model.detection.mask-rcnn.box-score-thresh", type=float, default=0.05, help="During inference, only return proposals with a classification score greater than box_score_thresh", ) group.add_argument( "--model.detection.mask-rcnn.box-nms-thresh", type=float, default=0.5, help="During inference, NMS threshold for the prediction head.", ) group.add_argument( "--model.detection.mask-rcnn.box-detections-per-img", type=int, default=100, help="Maximum number of detections per image, for all classes", ) group.add_argument( "--model.detection.mask-rcnn.box-fg-iou-thresh", type=float, default=0.5, help="Minimum IoU between the proposals and the GT box so that they can be considered as " "positive during training of the classification head", ) group.add_argument( "--model.detection.mask-rcnn.box-bg-iou-thresh", type=float, default=0.5, help="Minimum IoU between the proposals and the GT box so that they can be considered as " "negative during training of the classification head", ) group.add_argument( "--model.detection.mask-rcnn.box-batch-size-per-image", type=int, default=512, help="Number of proposals that are sampled during training of the classification head", ) group.add_argument( "--model.detection.mask-rcnn.box-positive-fraction", type=float, default=0.25, help="Proportion of positive proposals in a mini-batch during training of the classification head", ) group.add_argument( "--model.detection.mask-rcnn.norm-layer", type=str, default=None, help="Mask RCNN Norm layer", ) group.add_argument( "--model.detection.mask-rcnn.disable-fpn", action="store_true", help="Do not use FPN", ) return parser def reset_generalized_rcnn_transform(self, height, width): self.model.transform.fixed_size = (width, height) def get_trainable_parameters( self, weight_decay: float = 0.0, no_decay_bn_filter_bias: bool = False, *args, **kwargs, ) -> Tuple[List, List]: all_params = [] all_params_lr = [] # backbone parameters if hasattr(self.model.backbone, "get_trainable_parameters"): ( backbone_params, backbone_lrs, ) = self.model.backbone.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="model.backbone.", ) all_params.extend(backbone_params) all_params_lr.extend(backbone_lrs) else: logger.error( "Backbone model must implement get_trainable_parameters function." ) # rpn parameters rpn_param_list = parameter_list( named_parameters=self.model.rpn.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="model.rpn.", *args, **kwargs, ) all_params.extend(rpn_param_list) all_params_lr.extend([1.0] * len(rpn_param_list)) # ROI head params roi_param_list = parameter_list( named_parameters=self.model.roi_heads.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="model.roi_heads.", *args, **kwargs, ) all_params.extend(roi_param_list) all_params_lr.extend([1.0] * len(roi_param_list)) return all_params, all_params_lr def forward( self, x: Dict, *args, **kwargs ) -> Union[Tuple[Tensor, ...], Tuple[Any, ...], Dict]: if isinstance(x, Dict): input_tensor = x["image"] input_labels = x["label"] else: raise NotImplementedError( "Input to MaskRCNN should be a Dict of List of Tensors" ) assert isinstance(input_tensor, List) assert isinstance(input_labels, List) in_channels, in_height, in_width = input_tensor[0].shape self.reset_generalized_rcnn_transform(height=in_height, width=in_width) # The mask rcnn model expects labels, since it computes the loss. outputs = self.model(input_tensor, targets=input_labels) if not self.training: detections = [] for i, elem in enumerate(outputs): # We must normalize by image size, since this is what the downstream # evaluator expects. elem["boxes"][:, 0::2] /= input_tensor[i].shape[2] elem["boxes"][:, 1::2] /= input_tensor[i].shape[1] # predicted masks are in [N, 1, H, W] format # for evaluation, we need them in [N, H, W] format masks = elem["masks"] # [N, 1, H, W] --> [N, H, W] masks = masks.squeeze(1) elem_detections = DetectionPredTuple( labels=elem["labels"], scores=elem["scores"], boxes=elem["boxes"], masks=masks, ) detections.append(elem_detections) return {"detections": detections} if hasattr(self.model.backbone, "get_augmented_tensor"): outputs["augmented_tensor"] = self.model.backbone.get_augmented_tensor() return outputs @torch.no_grad() def predict(self, x: Tensor, *args, **kwargs) -> DetectionPredTuple: """Predict the bounding boxes given an image tensor""" assert isinstance(x, Tensor) and x.ndim == 4, "Expected 4D tensor as an input" bsz, channels, in_height, in_width = x.shape if bsz != 1: logger.error( "Prediction is supported with a batch size of 1 in {}".format( self.__class__.__name__ ) ) self.reset_generalized_rcnn_transform(height=in_height, width=in_width) outputs = self.model(x) if isinstance(outputs, List) and len(outputs) == 1: outputs = outputs[0] if isinstance(outputs, Dict) and {"boxes", "labels", "scores"}.issubset( outputs.keys() ): # resize the boxes outputs["boxes"][:, 0::2] /= in_width outputs["boxes"][:, 1::2] /= in_height # predicted masks are in [N, 1, H, W] format # for evaluation, we need them in [N, H, W] format masks = outputs["masks"] # [N, 1, H, W] --> [N, H, W] masks = masks.squeeze(1) detections = DetectionPredTuple( labels=outputs["labels"], scores=outputs["scores"], boxes=outputs["boxes"], masks=masks, ) return detections else: logger.error( "Output should be a dict with boxes, scores, and labels as keys. Got: {}".format( type(outputs) ) ) def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes.""" img_channels = 3 height = 320 width = 320 n_classes = 80 # GT boxes have the same shape as anchors. So, we use anchors as GT boxes n_boxes = 1 gt_boxes = torch.tensor([2, 20, 3, 40]).reshape(-1, 4).float() gt_box_labels = torch.randint( low=0, high=n_classes, size=(n_boxes,), dtype=torch.long, ) img_tensor = torch.randn(img_channels, height, width, dtype=torch.float) labels = { "box_labels": gt_box_labels, "box_coordinates": gt_boxes, } return { "samples": { "image": [img_tensor] * batch_size, "label": [ { "labels": gt_box_labels, "boxes": gt_boxes, "masks": torch.zeros(1, height, width, dtype=torch.long), } ] * batch_size, }, "targets": labels, } def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the activation checkpointing module class in the encoder.""" return self.model.backbone.get_activation_checkpoint_submodule_class() ================================================ FILE: corenet/modeling/models/detection/ssd.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import Any, Dict, List, Optional, Tuple, Union import torch from torch import Tensor, nn from torchvision.ops import batched_nms from corenet.modeling.anchor_generator import build_anchor_generator from corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d, SeparableConv2d from corenet.modeling.matcher_det import build_matcher from corenet.modeling.misc.init_utils import initialize_conv_layer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.detection import DetectionPredTuple from corenet.modeling.models.detection.base_detection import BaseDetection from corenet.modeling.modules import SSDHead from corenet.utils import logger from corenet.utils.common_utils import is_coreml_conversion @MODEL_REGISTRY.register(name="ssd", type="detection") class SingleShotMaskDetector(BaseDetection): """ This class implements a `Single Shot Object Detector `_ Args: opts: command-line arguments encoder (BaseImageEncoder): Encoder network (e.g., ResNet or MobileViT) """ coordinates = 4 # 4 coordinates (x1, y1, x2, y2) or (x, y, w, h) def __init__(self, opts, encoder: BaseImageEncoder) -> None: anchor_gen_name = getattr(opts, "anchor_generator.name", None) if anchor_gen_name is None or anchor_gen_name != "ssd": logger.error("For SSD, we need --anchor-generator.name to be ssd") anchor_box_generator = build_anchor_generator(opts=opts) output_strides_aspect_ratio = anchor_box_generator.output_strides_aspect_ratio output_strides = list(output_strides_aspect_ratio.keys()) anchors_aspect_ratio = list(output_strides_aspect_ratio.values()) n_os = len(output_strides) if getattr(opts, "matcher.name") != "ssd": logger.error("For SSD, we need --matcher.name as ssd") super().__init__(opts=opts, encoder=encoder) # delete layers that are not required in detection network self.encoder.classifier = None self.encoder.conv_1x1_exp = None proj_channels = getattr( opts, "model.detection.ssd.proj_channels", [512, 256, 256, 128, 128, 64] ) proj_channels = proj_channels + [128] * (n_os - len(proj_channels)) if n_os != len(anchors_aspect_ratio) != len(proj_channels): logger.error( "SSD model requires anchors to be defined for feature maps from each output stride. Also" "len(anchors_aspect_ratio) == len(output_strides) == len(proj_channels). " "Got len(output_strides)={}, len(anchors_aspect_ratio)={}, len(proj_channels)={}." " Please specify correct arguments using following arguments: " "\n--model.detection.ssd.anchors-aspect-ratio " "\n--model.detection.ssd.output-strides" "\n--model.detection.ssd.proj-channels".format( n_os, len(anchors_aspect_ratio), len(proj_channels) ) ) extra_layers = {} enc_channels_list = [] in_channels = self.enc_l5_channels extra_proj_list = [256] * (len(output_strides) - len(proj_channels)) proj_channels = proj_channels + extra_proj_list for idx, os in enumerate(output_strides): out_channels = proj_channels[idx] if os == 8: enc_channels_list.append(self.enc_l3_channels) elif os == 16: enc_channels_list.append(self.enc_l4_channels) elif os == 32: enc_channels_list.append(self.enc_l5_channels) elif os > 32 and os != -1: extra_layers["os_{}".format(os)] = SeparableConv2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=3, use_act=True, use_norm=True, stride=2, ) enc_channels_list.append(out_channels) in_channels = out_channels elif os == -1: extra_layers["os_{}".format(os)] = nn.Sequential( AdaptiveAvgPool2d(output_size=1), ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, use_act=True, use_norm=False, ), ) enc_channels_list.append(out_channels) in_channels = out_channels else: raise NotImplementedError self.extra_layers = None if not extra_layers else nn.ModuleDict(extra_layers) if self.extra_layers is not None: self.reset_layers(module=self.extra_layers) self.fpn = None if getattr(opts, "model.detection.ssd.use_fpn", False): from corenet.modeling.modules import FeaturePyramidNetwork fpn_channels = getattr(opts, "model.detection.ssd.fpn_out_channels", 256) self.fpn = FeaturePyramidNetwork( opts=opts, in_channels=enc_channels_list, output_strides=output_strides, out_channels=fpn_channels, ) # update the enc_channels_list enc_channels_list = [fpn_channels] * len(output_strides) # for FPN, we do not need to do projections proj_channels = enc_channels_list # Anchor box related parameters self.conf_threshold = getattr(opts, "model.detection.ssd.conf_threshold", 0.01) self.nms_threshold = getattr(opts, "model.detection.ssd.nms_iou_threshold", 0.5) self.top_k = getattr(opts, "model.detection.ssd.top_k", 400) self.objects_per_image = getattr( opts, "model.detection.ssd.objects_per_image", 200 ) self.anchor_box_generator = anchor_box_generator anchors_aspect_ratio = self.anchor_box_generator.num_anchors_per_os() # Create SSD detection and classification heads anchor_steps = self.anchor_box_generator.step self.ssd_heads = nn.ModuleList() for os, in_dim, proj_dim, n_anchors, step in zip( output_strides, enc_channels_list, proj_channels, anchors_aspect_ratio, anchor_steps, ): self.ssd_heads += [ SSDHead( opts=opts, in_channels=in_dim, n_classes=self.n_detection_classes, n_coordinates=self.coordinates, n_anchors=n_anchors, proj_channels=proj_dim, kernel_size=3 if os != -1 else 1, stride=step, ) ] self.anchors_aspect_ratio = anchors_aspect_ratio self.output_strides = output_strides self.match_prior = build_matcher(opts=opts) self.step = self.anchor_box_generator.step @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.detection.ssd.anchors-aspect-ratio", type=int, nargs="+", action="append", default=[[2, 3]] * 4, help="Anchors aspect ratio in each feature map obtained at different output strides.", ) group.add_argument( "--model.detection.ssd.output-strides", type=int, nargs="+", default=[16, 32, 64, 128], help="Extract feature maps from these output strides.", ) group.add_argument( "--model.detection.ssd.proj-channels", type=int, nargs="+", default=[512] * 4, help="Projection channels for feature map obtained at each output stride", ) # depreciated group.add_argument( "--model.detection.ssd.min-box-size", type=float, default=None, help="Min. box size. Value between 0 and 1. Good default value is 0.1", ) group.add_argument( "--model.detection.ssd.max-box-size", type=float, default=None, help="Max. box size. Value between 0 and 1. Good default value is 1.05", ) # Depreciated group.add_argument( "--model.detection.ssd.center-variance", type=float, default=None, help="Center variance.", ) group.add_argument( "--model.detection.ssd.size-variance", type=float, default=None, help="Size variance.", ) group.add_argument( "--model.detection.ssd.iou-threshold", type=float, default=None, help="IOU Threshold.", ) # inference related arguments group.add_argument( "--model.detection.ssd.conf-threshold", type=float, default=0.01, help="Confidence threshold. For evaluation on COCO, set to 0.01, so that we can compute mAP", ) group.add_argument( "--model.detection.ssd.top-k", type=int, default=400, help="Keep only top-k objects before NMS", ) group.add_argument( "--model.detection.ssd.objects-per-image", type=int, default=200, help="Keep only these many objects after NMS", ) group.add_argument( "--model.detection.ssd.nms-iou-threshold", type=float, default=0.5, help="NMS IoU threshold ", ) # FPN group.add_argument( "--model.detection.ssd.fpn-out-channels", type=int, default=256, help="Number of output channels in FPN", ) group.add_argument( "--model.detection.ssd.use-fpn", action="store_true", help="Use SSD with FPN", ) return parser @staticmethod def reset_layers(module) -> None: for layer in module.modules(): if isinstance(layer, nn.Conv2d): initialize_conv_layer(module=layer, init_method="xavier_uniform") @staticmethod def process_anchors_ar(anchor_ar: List) -> List: assert isinstance(anchor_ar, list) new_ar = [] for ar in anchor_ar: if ar in new_ar: continue new_ar.append(ar) return new_ar def get_backbone_features(self, x: Tensor) -> Dict[str, Tensor]: # extract features from the backbone network enc_end_points: Dict = self.encoder.extract_end_points_all(x) end_points: Dict = dict() for idx, os in enumerate(self.output_strides): if os == 8: end_points["os_{}".format(os)] = enc_end_points.pop("out_l3") elif os == 16: end_points["os_{}".format(os)] = enc_end_points.pop("out_l4") elif os == 32: end_points["os_{}".format(os)] = enc_end_points.pop("out_l5") else: x = end_points["os_{}".format(self.output_strides[idx - 1])] end_points["os_{}".format(os)] = self.extra_layers["os_{}".format(os)]( x ) if self.fpn is not None: # apply Feature Pyramid Network end_points = self.fpn(end_points) return end_points def ssd_forward( self, end_points: Dict[str, Tensor], device: Optional[torch.device] = torch.device("cpu"), *args, **kwargs ) -> Union[Tuple[Tensor, Tensor, Tensor], Tuple[Tensor, ...]]: locations = [] confidences = [] anchors = [] for os, ssd_head in zip(self.output_strides, self.ssd_heads): x = end_points["os_{}".format(os)] fm_h, fm_w = x.shape[2:] loc, pred = ssd_head(x) locations.append(loc) confidences.append(pred) anchors_fm_ctr = self.anchor_box_generator( fm_height=fm_h, fm_width=fm_w, fm_output_stride=os, device=device ) anchors.append(anchors_fm_ctr.to(device=device)) locations = torch.cat(locations, dim=1) confidences = torch.cat(confidences, dim=1) anchors = torch.cat(anchors, dim=0) anchors = anchors.unsqueeze(dim=0) return confidences, locations, anchors def forward( self, x: Union[Tensor, Dict] ) -> Union[Tuple[Tensor, ...], Tuple[Any, ...], Dict]: if isinstance(x, Dict): input_tensor = x["image"] elif isinstance(x, Tensor): input_tensor = x else: raise NotImplementedError( "Input to SSD should be either a Tensor or a Dict of Tensors" ) device = input_tensor.device backbone_end_points: Dict = self.get_backbone_features(input_tensor) if not is_coreml_conversion(self.opts): confidences, locations, anchors = self.ssd_forward( end_points=backbone_end_points, device=device ) output_dict = {"scores": confidences, "boxes": locations} if not self.training: # compute the detection results during evaluation scores = nn.Softmax(dim=-1)(confidences) boxes = self.match_prior.convert_to_boxes( pred_locations=locations, anchors=anchors ) detections = self.postprocess_detections(boxes=boxes, scores=scores) output_dict["detections"] = detections return output_dict else: return self.ssd_forward(end_points=backbone_end_points, is_prediction=False) @torch.no_grad() def predict(self, x: Tensor, *args, **kwargs) -> DetectionPredTuple: """Predict the bounding boxes given an image tensor""" bsz, channels, width, height = x.shape if bsz != 1: logger.error( "Prediction is supported with a batch size of 1 in {}".format( self.__class__.__name__ ) ) device = x.device enc_end_points: Dict = self.get_backbone_features(x) confidences, locations, anchors = self.ssd_forward( end_points=enc_end_points, device=device ) scores = nn.Softmax(dim=-1)(confidences) boxes = self.match_prior.convert_to_boxes( pred_locations=locations, anchors=anchors ) detections = self.postprocess_detections(boxes=boxes, scores=scores)[0] return detections @torch.no_grad() def postprocess_detections( self, boxes: Tensor, scores: Tensor ) -> List[DetectionPredTuple]: """Post process detections, including NMS""" # boxes [B, N, 4] # scores [B, N] # labels [B, N] batch_size = boxes.shape[0] n_classes = scores.shape[-1] device = boxes.device box_dtype = boxes.dtype scores_dtype = scores.dtype results = [] for b_id in range(batch_size): object_labels = [] object_boxes = [] object_scores = [] for class_index in range(1, n_classes): probs = scores[b_id, :, class_index] mask = probs > self.conf_threshold probs = probs[mask] if probs.size(0) == 0: continue masked_boxes = boxes[b_id, mask, :] # keep only top-k indices num_topk = min(self.top_k, probs.size(0)) probs, idxs = probs.topk(num_topk) masked_boxes = masked_boxes[idxs, ...] object_boxes.append(masked_boxes) object_scores.append(probs) object_labels.append( torch.full_like( probs, fill_value=class_index, dtype=torch.int64, device=device ) ) if len(object_scores) == 0: output = DetectionPredTuple( labels=torch.empty(0, device=device, dtype=torch.long), scores=torch.empty(0, device=device, dtype=scores_dtype), boxes=torch.empty(0, 4, device=device, dtype=box_dtype), ) else: # concatenate all results object_scores = torch.cat(object_scores, dim=0) object_boxes = torch.cat(object_boxes, dim=0) object_labels = torch.cat(object_labels, dim=0) # non-maximum suppression keep = batched_nms( object_boxes, object_scores, object_labels, self.nms_threshold ) keep = keep[: self.objects_per_image] output = DetectionPredTuple( labels=object_labels[keep], scores=object_scores[keep], boxes=object_boxes[keep], ) results.append(output) return results def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes.""" img_channels = 3 height = 320 width = 320 n_classes = 80 def generate_anchors(height, width): """Generate anchors **on-the-fly** based on the input resolution.""" anchors = [] for output_stride in self.output_strides: if output_stride == -1: fm_width = fm_height = 1 else: fm_width = int(math.ceil(width / output_stride)) fm_height = int(math.ceil(height / output_stride)) fm_anchor = self.anchor_box_generator( fm_height=fm_height, fm_width=fm_width, fm_output_stride=output_stride, ) anchors.append(fm_anchor) anchors = torch.cat(anchors, dim=0) return anchors # GT boxes have the same shape as anchors. So, we use anchors as GT boxes gt_boxes = generate_anchors(height=height, width=width) gt_boxes = gt_boxes.unsqueeze(0).expand(batch_size, -1, -1) gt_box_labels = torch.randint( low=0, high=n_classes, size=(batch_size, gt_boxes.shape[1]), dtype=torch.long, ) img_tensor = torch.randn( batch_size, img_channels, height, width, dtype=torch.float ) labels = { "box_labels": gt_box_labels, "box_coordinates": gt_boxes, } return {"samples": img_tensor, "targets": labels} ================================================ FILE: corenet/modeling/models/detection/utils/__init__.py ================================================ ================================================ FILE: corenet/modeling/models/detection/utils/rcnn_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Tuple import torch from torch import Tensor, nn from corenet.modeling.layers import ( ConvLayer2d, LinearLayer, TransposeConvLayer2d, get_normalization_layer, ) from corenet.modeling.misc.init_utils import initialize_conv_layer, initialize_fc_layer # Below classes are adapted from Torchvision version=0.12 to make the code compatible with previous torch versions. class FastRCNNConvFCHead(nn.Sequential): def __init__( self, opts, input_size: Tuple[int, int, int], conv_layers: List[int], fc_layers: List[int], *args, **kwargs, ): """ Args: input_size (Tuple[int, int, int]): the input size in CHW format. conv_layers (list): feature dimensions of each Convolution layer fc_layers (list): feature dimensions of each FCN layer """ in_channels, in_height, in_width = input_size blocks = [] previous_channels = in_channels for current_channels in conv_layers: blocks.extend( [ ConvLayer2d( opts, in_channels=previous_channels, out_channels=current_channels, kernel_size=3, stride=1, use_norm=False, use_act=False, ), replace_syncbn_with_syncbnfp32(opts, num_features=current_channels), nn.ReLU(inplace=False), ] ) previous_channels = current_channels blocks.append(nn.Flatten()) previous_channels = previous_channels * in_height * in_width for current_channels in fc_layers: blocks.append(LinearLayer(previous_channels, current_channels, bias=True)) blocks.append(nn.ReLU(inplace=True)) previous_channels = current_channels super().__init__(*blocks) for layer in self.modules(): if isinstance(layer, nn.Conv2d): initialize_conv_layer(module=layer, init_method="kaiming_normal") elif isinstance(layer, LinearLayer): initialize_fc_layer(module=layer, init_method="kaiming_uniform") class RPNHead(nn.Module): """ Adds a simple RPN Head with classification and regression heads Args: in_channels (int): number of channels of the input feature num_anchors (int): number of anchors to be predicted conv_depth (int, optional): number of convolutions """ def __init__(self, opts, in_channels: int, num_anchors: int, conv_depth=1) -> None: super().__init__() convs = [] for _ in range(conv_depth): convs.extend( [ ConvLayer2d( opts, in_channels=in_channels, out_channels=in_channels, kernel_size=3, stride=1, use_norm=False, use_act=False, bias=False, ), replace_syncbn_with_syncbnfp32(opts, num_features=in_channels), nn.ReLU(inplace=False), ] ) self.conv = nn.Sequential(*convs) self.cls_logits = ConvLayer2d( opts, in_channels=in_channels, out_channels=num_anchors, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ) self.bbox_pred = ConvLayer2d( opts, in_channels=in_channels, out_channels=num_anchors * 4, kernel_size=1, stride=1, use_act=False, use_norm=False, bias=True, ) for layer in self.modules(): if isinstance(layer, nn.Conv2d): initialize_conv_layer(module=layer, init_method="normal", std_val=0.01) def forward(self, x: List[Tensor]) -> Tuple[List[Tensor], List[Tensor]]: logits = [] bbox_reg = [] for feature in x: t = self.conv(feature) logits.append(self.cls_logits(t)) bbox_reg.append(self.bbox_pred(t)) return logits, bbox_reg class MaskRCNNHeads(nn.Sequential): def __init__(self, opts, in_channels: int, layers: List, dilation: int): """ Args: in_channels (int): number of input channels layers (list): feature dimensions of each FCN layer dilation (int): dilation rate of kernel norm_layer (callable, optional): Module specifying the normalization layer to use. Default: None """ blocks = [] next_feature = in_channels for layer_features in layers: blocks.extend( [ ConvLayer2d( opts=opts, in_channels=next_feature, out_channels=layer_features, kernel_size=3, stride=1, dilation=dilation, use_norm=False, use_act=False, bias=False, ), replace_syncbn_with_syncbnfp32( opts=opts, num_features=layer_features ), nn.ReLU(inplace=False), ] ) next_feature = layer_features super().__init__(*blocks) for layer in self.modules(): if isinstance(layer, nn.Conv2d): initialize_conv_layer(module=layer, init_method="kaiming_normal") class MaskRCNNPredictor(nn.Sequential): def __init__( self, opts, in_channels: int, dim_reduced: int, num_classes: int ) -> None: super().__init__( *[ TransposeConvLayer2d( opts, in_channels=in_channels, out_channels=dim_reduced, kernel_size=2, stride=2, padding=0, output_padding=0, use_norm=False, use_act=False, bias=False, groups=1, ), replace_syncbn_with_syncbnfp32(opts, num_features=dim_reduced), nn.ReLU(inplace=False), ConvLayer2d( opts, in_channels=dim_reduced, out_channels=num_classes, kernel_size=1, stride=1, bias=True, use_norm=False, use_act=False, ), ] ) for layer in self.modules(): if isinstance(layer, (nn.Conv2d, nn.ConvTranspose2d)): initialize_conv_layer(module=layer, init_method="kaiming_normal") class FastRCNNPredictor(nn.Module): """ Standard classification + bounding box regression layers for Fast R-CNN. Args: in_channels (int): number of input channels num_classes (int): number of output classes (including background) """ def __init__(self, in_channels: int, num_classes: int) -> None: super().__init__() self.cls_score = LinearLayer(in_channels, num_classes, bias=True) self.bbox_pred = LinearLayer(in_channels, num_classes * 4, bias=True) for layer in self.modules(): if isinstance(layer, LinearLayer): initialize_fc_layer(module=layer, init_method="kaiming_uniform") def forward(self, x: Tensor) -> Tuple[Tensor, Tensor]: if x.dim() == 4: torch._assert( list(x.shape[2:]) == [1, 1], f"x has the wrong shape, expecting the last two dimensions to be [1,1] instead of {list(x.shape[2:])}", ) x = x.flatten(start_dim=1) scores = self.cls_score(x) bbox_deltas = self.bbox_pred(x) return scores, bbox_deltas def replace_syncbn_with_syncbnfp32(opts, num_features: int) -> nn.Module: # Sync-BN with 0 batch size does not work well with AMP. To avoid that, # we replace all sync_bn in mask rcnn head with FP32 ones. norm_layer = getattr(opts, "model.normalization.name", None) if norm_layer.find("sync") > -1: return get_normalization_layer( opts, num_features=num_features, norm_type="sync_batch_norm_fp32" ) else: return get_normalization_layer(opts=opts, num_features=num_features) ================================================ FILE: corenet/modeling/models/fsdp_wrapper.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import inspect from typing import Any, Dict, Tuple import torch from torch.distributed.fsdp import ( BackwardPrefetch, CPUOffload, FullStateDictConfig, FullyShardedDataParallel, MixedPrecision, ShardingStrategy, StateDictType, ) from torch.distributed.fsdp.api import FullOptimStateDictConfig from corenet.modeling.models import BaseAnyNNModel from corenet.optims.base_optim import BaseOptim from corenet.utils import logger from corenet.utils.ddp_utils import is_master FSDP_SHARDING_STRATEGY_MAP = { # In full shard, parameters, gradients, and optimizer states are sharded (aka ZERO 3) "full_shard": ShardingStrategy.FULL_SHARD, # hybrid_shard is the same as full shard, except sharding is done within a node. # TODO: Revisit hybrid sharding in future because of the below issue. # https://github.com/pytorch/pytorch/issues/102904 # "hybrid_shard": ShardingStrategy.HYBRID_SHARD, # In no-shard, parameters, gradients, and optimizer states are not sharded "no_shard": ShardingStrategy.NO_SHARD, # In grad_op_shard, gradients and optimizer states are sharded (aka as Zero) "grad_op_shard": ShardingStrategy.SHARD_GRAD_OP, } FSDP_DATATYPE_CONVERSION = { "float16": torch.float16, "float32": torch.float32, "bfloat16": torch.bfloat16, } FSDP_BACKWARD_PREFETCH = { # pre enables prefetching next set of parameters before computing gradients for current set of parameters. "pre": BackwardPrefetch.BACKWARD_PRE, # post enables prefetching next set of parameters after computing gradients for current set of parameters. "post": BackwardPrefetch.BACKWARD_POST, } class FullyShardedDataParallelWrapper(FullyShardedDataParallel): def __init__( self, opts: argparse.Namespace, model: BaseAnyNNModel, ) -> None: param_dtype = getattr(opts, "fsdp.parameter_datatype") reduce_dtype = getattr(opts, "fsdp.gradient_reduction_datatype") buffer_dtype = getattr(opts, "fsdp.buffer_datatype") if param_dtype not in FSDP_DATATYPE_CONVERSION: logger.error( f"Supported data type for parameters in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \ Got: {param_dtype}." ) if reduce_dtype not in FSDP_DATATYPE_CONVERSION: logger.error( f"Supported data type for gradient reduction in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \ Got: {reduce_dtype}." ) if buffer_dtype not in FSDP_DATATYPE_CONVERSION: logger.error( f"Supported data type for buffer in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \ Got: {buffer_dtype}." ) prefetching_option = getattr(opts, "fsdp.backward_prefetching") if prefetching_option not in FSDP_BACKWARD_PREFETCH: logger.error( f"Supported backward pre-fetching options are {list(FSDP_BACKWARD_PREFETCH.keys())}. \ Got: {prefetching_option}." ) fsdp_precision_policy = MixedPrecision( param_dtype=FSDP_DATATYPE_CONVERSION[param_dtype], reduce_dtype=FSDP_DATATYPE_CONVERSION[reduce_dtype], buffer_dtype=FSDP_DATATYPE_CONVERSION[buffer_dtype], ) fsdp_parameters = inspect.signature(FullyShardedDataParallel).parameters # Enabling `use_orig_params` tells FSDP not to flatten parameters, and enables us to specify different LR/weight decay values. # `use_orig_params` feature is available in PyTorch versions > 2.0 extra_args_fsdp = ( dict(use_orig_params=True) if "use_orig_params" in fsdp_parameters else dict() ) if "limit_all_gathers" in fsdp_parameters and getattr( opts, "fsdp.limit_all_gathers" ): extra_args_fsdp["limit_all_gathers"] = True if "cpu_offload" in fsdp_parameters and getattr(opts, "fsdp.cpu_offload"): extra_args_fsdp["cpu_offload"] = CPUOffload(offload_params=True) sharding_strategy = getattr(opts, "fsdp.sharding_strategy") if sharding_strategy not in FSDP_SHARDING_STRATEGY_MAP: logger.error( f"Supported sharding strategies for FSDP are: {list(FSDP_SHARDING_STRATEGY_MAP.keys())}. Got: {sharding_strategy}." ) # get fsdp wrapping policy fsdp_wrap_policy = model.get_fsdp_wrap_policy() super().__init__( model, sharding_strategy=FSDP_SHARDING_STRATEGY_MAP[sharding_strategy], auto_wrap_policy=fsdp_wrap_policy, mixed_precision=fsdp_precision_policy, backward_prefetch=FSDP_BACKWARD_PREFETCH[prefetching_option], **extra_args_fsdp, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add FSDP-specific arguments""" if cls == FullyShardedDataParallelWrapper: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--fsdp.sharding-strategy", type=str, default=None, choices=list(FSDP_SHARDING_STRATEGY_MAP.keys()), help="Sharding strategy for FSDP. Defaults to None.", ) group.add_argument( "--fsdp.backward-prefetching", type=str, default="pre", choices=["pre", "post"], help="Backward prefetching. Supported modes are `pre` and `post`. \ `pre` and `post` prefetches the next set of parameters before and after \ the current set of parameter's gradient computation respectively. \ Defaults to `pre`.", ) group.add_argument( "--fsdp.parameter-datatype", type=str, default="bfloat16", choices=list(FSDP_DATATYPE_CONVERSION.keys()), help="Specify the data type of model parameters. See FSDP documentation for details. \ Defaults to `bfloat16`.", ) group.add_argument( "--fsdp.gradient-reduction-datatype", type=str, default="bfloat16", choices=list(FSDP_DATATYPE_CONVERSION.keys()), help="Specify the data type for gradient reduction. See FSDP documentation for details. \ Defaults to `bfloat16`.", ) group.add_argument( "--fsdp.buffer-datatype", type=str, default="bfloat16", choices=list(FSDP_DATATYPE_CONVERSION.keys()), help="Specify the data type for buffers. See FSDP documentation for details. \ Defaults to `bfloat16`.", ) group.add_argument( "--fsdp.limit-all-gathers", action="store_true", help="Enabling this flag allows FSDP to explicitly synchronize the CPU threads and \ prevent too many in-flight all-gathers. Enabling this can \ help lower the number of CUDA malloc retries. Defaults to `False`. \ Note: In older PyTorch versions, this flag may not be available.", ) group.add_argument( "--fsdp.cpu-offload", action="store_true", help="Enable CPU offloading. Defaults to `False`. \ Note: In older PyTorch versions, this flag may not be available.", ) return parser def get_fsdp_model_optimizer_state_dict_on_rank0( model: FullyShardedDataParallelWrapper, optimizer: BaseOptim ) -> Tuple[Dict[str, Any], Dict[str, Any]]: """ Aggregates the model and optimizer states from all shards on rank0 and return it. Args: model: Model (partially) sharded by FSDP. optimizer: Optimizer. """ with FullyShardedDataParallelWrapper.state_dict_type( model, StateDictType.FULL_STATE_DICT, # config for model state aggregation FullStateDictConfig(offload_to_cpu=True, rank0_only=True), # config for optimizer state aggregation FullOptimStateDictConfig(offload_to_cpu=True, rank0_only=True), ): model_state = model.state_dict() # Returns the state dict of optimzier for the ``model`` that is (partially) sharded by FSDP. optim_state = FullyShardedDataParallel.optim_state_dict( model=model, optim=optimizer ) return model_state, optim_state ================================================ FILE: corenet/modeling/models/language_modeling/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/language_modeling/base_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict import torch from torch import Tensor from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel @MODEL_REGISTRY.register(name="__base__", type="language_modeling") class BaseLanguageModel(BaseAnyNNModel): """Base class for language modeling. Args: opts: Command-line arguments. """ @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add LM model specific arguments""" if cls == BaseLanguageModel: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.language-modeling.name", type=str, default=None, help="Name of the language model. Defaults to None (i.e., user need to specify the model name).", ) group.add_argument( "--model.language-modeling.pretrained", type=str, default=None, help="Path of the pre-trained model. Defaults to None (i.e., user needs to specify the path of pre-trained model).", ) return parser def dummy_input_and_label(self, batch_size: int) -> Dict[str, Tensor]: """Create dummy input and labels for CI/CD purposes. Child classes must override it if functionality is different. """ seq_length = 5 return { "samples": torch.randint( low=0, high=1, size=(batch_size, seq_length) ).long(), "targets": torch.randint( low=0, high=1, size=(batch_size, seq_length) ).long(), } @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: """Helper function to build the language model. Args: opts: Command-line arguments. Returns: An instance of `corenet.modeling.models.BaseAnyNNModel`. """ model = cls(opts, *args, **kwargs) return model ================================================ FILE: corenet/modeling/models/language_modeling/general_gpt.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import functools from dataclasses import dataclass from numbers import Number from typing import Callable, Dict, List, Optional, Tuple, Union import numpy as np import torch from torch import Tensor, nn from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy from torch.nn import functional as F from corenet.modeling.layers import ( Embedding, LinearLayer, RotaryEmbedding, get_normalization_layer, norm_layers_tuple, ) from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.language_modeling.base_lm import BaseLanguageModel from corenet.utils import logger from corenet.utils.math_utils import make_divisible def compute_heads(model_dim: int, head_dim: int) -> int: """Compute the number of heads. Args: model_dim: Model dimension. head_dim: Head dimension. ...note: If model dimension is not divisible by head dimension, ValueError is raised. Otherwise, integer denoting number of heads in multi-head attention is returned. """ if model_dim % head_dim == 0: return model_dim // head_dim else: raise ValueError( f"Model dimension should be divisible by head dimension. Got: {model_dim} and {head_dim}." ) @dataclass class GPTConfig: vocab_size: int = 32000 max_context_length: int = 2048 num_transformer_layers: int = 12 model_dim: int = 2048 head_dim: int = 128 qkv_multipliers: Union[Number, List[Number]] = 1.0 num_query_heads: int = compute_heads(model_dim=model_dim, head_dim=head_dim) # This variable allows to switch between multi-head attention, group query attention, and multi-query attention. # When num_gqa_groups == 1, then it is multi-head attention. # When 1 < num_gqa_groups < num_heads and num_heads is divisible by num_gqa_groups, then it is group query attention # When num_gqa_groups == num_heads, then it is multi-query attention num_gqa_groups: int = 1 # Multipliers for the feed-forward network. ffn_multipliers: Union[Number, List[Number]] = 4.0 # use FFN with Gated Linear Unit (GLU) ffn_with_glu: bool = True ffn_dim_divisor: int = 256 activation_fn_name: str = "swish" normalization_layer_name: str = "rms_norm" normalize_qk_projections: bool = False share_input_output_layers: bool = False rope_freq_constant: int = 10000 # Note that rope_max_length is set to twice of max_context_length. # This allows flexibility in token lengths during training or fine-tuning. rope_max_length: int = 4096 def __post_init__(self) -> None: if self.num_gqa_groups is not None: head_multiple_of = self.num_gqa_groups else: head_multiple_of = 2 if isinstance(self.qkv_multipliers, Number): # All attention layers have the same latent dimensions, resulting in uniform allocation of parameters. qkv_dim = make_divisible( self.model_dim * self.qkv_multipliers, divisor=self.head_dim * head_multiple_of, ) query_dims = [int(qkv_dim)] * self.num_transformer_layers elif ( isinstance(self.qkv_multipliers, (tuple, list)) and len(self.qkv_multipliers) == 2 ): # Each attention layer have different latent dimensions assuming qkv_multipliers[0] != qkv_multipliers[1]. # This results in variable allocation of parameters in attention layer. # This scaling is known as layer-wise or block-wise scaling: https://arxiv.org/abs/2008.00623 qkv_multipliers = [ round(v, 2) for v in np.linspace( self.qkv_multipliers[0], self.qkv_multipliers[1], num=self.num_transformer_layers, dtype=float, ) ] # Make sure that scaled model dimension is divisible by scaled head dimension. query_dims = [ int( make_divisible( self.model_dim * m, divisor=self.head_dim * head_multiple_of ) ) for m in qkv_multipliers ] else: raise NotImplementedError( f"QKV multipliers should be a single number or a list containing exactly two numbers. Got: {qkv_multipliers}." ) # compute the number of query, key, and value heads # For multi-head and multi-query attention, the number of heads for query, key, and value are the same. # For group query attention, the number of key and value heads are the same. self.num_query_heads = [ int(compute_heads(q_dim, self.head_dim)) for q_dim in query_dims ] self.num_kv_heads = [ q_heads // self.num_gqa_groups for q_heads in self.num_query_heads ] # Feed-forward network (FFN) multipliers if isinstance(self.ffn_multipliers, Number): # All FFN layers have the same latent dimensions, resulting in uniform allocation of parameters. self.ffn_multipliers = [self.ffn_multipliers] * self.num_transformer_layers elif ( isinstance(self.ffn_multipliers, (tuple, list)) and len(self.ffn_multipliers) == 2 ): # Each FFN layer have different latent dimensions assuming ffn_multipliers[0] != ffn_multipliers[1]. # This results in variable allocation of parameters in FFN layer. # This scaling is known as layer-wise or block-wise scaling: https://arxiv.org/abs/2008.00623 self.ffn_multipliers = [ round(v, 2) for v in np.linspace( self.ffn_multipliers[0], self.ffn_multipliers[1], num=self.num_transformer_layers, dtype=float, ) ] else: raise NotImplementedError( f"FFN multipliers should be a single number or a list containing exactly two numbers. Got: {qkv_multipliers}." ) @classmethod def from_name( cls, model_name: str, vocab_size: int, max_context_length: int ) -> "GPTConfig": if model_name in gpt_configs: config = gpt_configs[model_name] else: raise NotImplementedError(f"{model_name} is not yet implemented") config["vocab_size"] = vocab_size config["max_context_length"] = max_context_length return cls(**config) gpt_configs = { "gpt-test": dict( num_transformer_layers=1, model_dim=128, head_dim=64, num_gqa_groups=1, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.25, 0.75), qkv_multipliers=(0.25, 0.5), ), # A sample GPT configuration. "gpt-1_3B": dict( num_transformer_layers=24, model_dim=2048, head_dim=64, max_context_length=2048, # For gated FFN, the value is around 3. while for standard FFN, the value is 4.0. ffn_multipliers=3.0, # Number of GQA groups. num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, ), "OpenELM-270M": dict( num_transformer_layers=16, model_dim=1280, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), ), "OpenELM-450M": dict( num_transformer_layers=20, model_dim=1536, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), ), "OpenELM-1_1B": dict( num_transformer_layers=28, model_dim=2048, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), ), "OpenELM-3B": dict( num_transformer_layers=36, model_dim=3072, head_dim=128, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), ), } class MultiHeadCausalAttention(nn.Module): """Multi-head causal attention. Args: opts: Command-line arguments. model_config: Model configuration. layer_idx: Layer index. """ def __init__( self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int ) -> None: super().__init__() assert ( model_config.num_query_heads[layer_idx] % model_config.num_kv_heads[layer_idx] == 0 ), f"Number of query heads are not divisible by number of key/value heads. Got: {model_config.num_query_heads[layer_idx]} and {model_config.num_kv_heads[layer_idx]}." head_dim = model_config.head_dim q_heads = model_config.num_query_heads[layer_idx] k_heads = model_config.num_kv_heads[layer_idx] v_heads = model_config.num_kv_heads[layer_idx] self.qkv_proj = LinearLayer( in_features=model_config.model_dim, out_features=(q_heads + k_heads + v_heads) * head_dim, bias=False, ) self.pos_embedding = RotaryEmbedding( model_dim=model_config.head_dim, max_seq_length=model_config.rope_max_length, freq_constant=model_config.rope_freq_constant, ) if model_config.normalize_qk_projections: self.q_norm = get_normalization_layer( opts, num_features=model_config.head_dim, norm_type=model_config.normalization_layer_name, ) self.k_norm = get_normalization_layer( opts, num_features=model_config.head_dim, norm_type=model_config.normalization_layer_name, ) else: self.q_norm = None self.k_norm = None self.out_proj = LinearLayer( in_features=q_heads * head_dim, out_features=model_config.model_dim, bias=False, ) self.head_dim = model_config.head_dim self.num_q_heads = q_heads self.num_k_heads = k_heads self.num_v_heads = v_heads self.model_dim = model_config.model_dim self.num_groups = self.num_q_heads // self.num_k_heads def extra_repr(self) -> str: return ( super().extra_repr() + f"model_dim={self.model_dim}, num_query_heads={self.num_q_heads}, num_key_heads={self.num_k_heads}, num_value_heads={self.num_v_heads}" ) def forward( self, x: Tensor, past_keys: Optional[Tensor] = None, past_values: Optional[Tensor] = None, use_kv_cache: bool = False, is_causal: bool = True, concat_kvs: bool = True, apply_k_norm_to_past_keys_before_cache_write: bool = False, apply_k_norm_before_cache_write: bool = True, ) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]: """ Forward pass of multi-head self-attention. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. past_keys: Tensor storing the cached keys. The shape of tensor is [batch size, number of key heads, sequence length, head dimension]. past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'. use_kv_cache: Cache the output of key and value projection layers for faster inference. is_causal: Specifies whether to apply causal masking in scaled dot-product attention. concat_kvs: If set, the keys produced by the QKV projection will be concatenated with the past keys. Usually this value should be True, but it needs to be False for KV Prediction experiments. apply_k_norm_to_past_keys_before_cache_write: If set, apply the key norm to past keys before updating the KV cache. This usually should be False, but is set to True for KV prediction experiments. apply_k_norm_before_cache_write: If set, apply the key norm to the current keys before concatenating them with the past keys. This usually should be True, but is set to False for KV prediction experiments. Returns: The output of the same shape as the input, optionally with a tensor containing cached keys and values. """ batch_size, seq_length, d_model = x.shape # [batch_size, seq_length, d_model] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim] qkv = self.qkv_proj(x) # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] qkv = qkv.reshape( batch_size, seq_length, self.num_q_heads + self.num_k_heads + self.num_v_heads, self.head_dim, ) # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] --> [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] qkv = qkv.transpose(1, 2) # [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim], [batch_size, num_k_heads, seq_length, head_dim], [batch_size, num_v_heads, seq_length, head_dim] queries, keys, values = qkv.split( [self.num_q_heads, self.num_k_heads, self.num_v_heads], dim=1 ) if self.q_norm is not None: queries = self.q_norm(queries) if self.k_norm is not None and apply_k_norm_before_cache_write: keys = self.k_norm(keys) if ( self.k_norm is not None and past_keys is not None and apply_k_norm_to_past_keys_before_cache_write ): past_keys = self.k_norm(past_keys) if use_kv_cache: if past_keys is not None: assert past_values is not None # concatenate past and current keys along the sequence dimension. if concat_kvs: keys = torch.cat([past_keys, keys], dim=-2) values = torch.cat([past_values, values], dim=-2) else: # Use only the past_keys and past_values as keys and values. # NOTE: we can skip the KV projection in this case. assert queries.shape[-2] == past_keys.shape[-2] assert queries.shape[-2] == past_values.shape[-2] keys = past_keys values = past_values past_keys = keys past_values = values if self.k_norm is not None and not apply_k_norm_before_cache_write: assert ( not apply_k_norm_to_past_keys_before_cache_write ), "k_norm has already been applied." keys = self.k_norm(keys) # Add positional embedding queries, keys = self.pos_embedding(queries, keys) if self.num_groups != 1: # Group-query attention. # [batch_size, num_k_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim] keys = keys.repeat_interleave(self.num_groups, dim=1) # [batch_size, num_v_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim] values = values.repeat_interleave(self.num_groups, dim=1) # scaled dot-product attention. # The output of this operation has size of [batch_size, num_q_heads, seq_length, head_dim] attn_output = F.scaled_dot_product_attention( queries, keys, values, attn_mask=None, dropout_p=0, is_causal=is_causal, ) # [batch_size, num_q_heads, seq_length, head_dim] --> [batch_size, seq_length, num_q_heads, head_dim] attn_output = attn_output.transpose(1, 2).contiguous() # [batch_size, seq_length, num_q_heads, head_dim] --> [batch_size, seq_length, num_q_heads * head_dim] attn_output = attn_output.reshape( batch_size, seq_length, self.num_q_heads * self.head_dim ) # [batch_size, seq_length, num_q_heads * head_dim] --> [batch_size, seq_length, d_model] out = self.out_proj(attn_output) return out, past_keys, past_values class FeedForwardNetwork(nn.Module): """Feed-forward network. Args: opts: Command-line arguments. model_config: Model configuration. layer_idx: Layer index. """ def __init__( self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int ) -> None: super().__init__() ffn_multiplier = model_config.ffn_multipliers[layer_idx] intermediate_dim = int( make_divisible( ffn_multiplier * model_config.model_dim, divisor=model_config.ffn_dim_divisor, ) ) if model_config.ffn_with_glu: # FFN with Gated linear unit, as described in https://arxiv.org/abs/2002.05202v1. self.proj_1 = LinearLayer( in_features=model_config.model_dim, out_features=2 * intermediate_dim, bias=False, ) self.proj_2 = LinearLayer( in_features=intermediate_dim, out_features=model_config.model_dim, bias=False, ) self.ffn_with_glu = True else: # Standard FFN, as described in https://arxiv.org/abs/1706.03762 self.proj_1 = LinearLayer( in_features=model_config.model_dim, out_features=intermediate_dim, bias=False, ) self.proj_2 = LinearLayer( in_features=intermediate_dim, out_features=model_config.model_dim, bias=False, ) self.ffn_with_glu = False self.act = build_activation_layer( opts=opts, act_type=model_config.activation_fn_name ) def extra_repr(self) -> str: return super().extra_repr() + f"(ffn_with_glu) : {self.ffn_with_glu}" def forward(self, x: Tensor) -> Tensor: """Forward function of FFN layer. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. Returns: A tensor of the same shape as the input. """ if self.ffn_with_glu: y_12 = self.proj_1(x) y_1, y_2 = y_12.chunk(2, dim=-1) y = self.act(y_1) * y_2 return self.proj_2(y) else: return self.proj_2(self.act(self.proj_1(x))) class TransformerDecoderLayer(nn.Module): """Transformer decoder layer. Args: opts: Command-line arguments. model_config: Model configuration. layer_idx: Layer index. """ def __init__( self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int ) -> None: super().__init__() self.attn = MultiHeadCausalAttention( opts, model_config=model_config, layer_idx=layer_idx ) self.ffn = FeedForwardNetwork( opts, model_config=model_config, layer_idx=layer_idx ) self.ffn_norm = get_normalization_layer( opts, num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) self.attn_norm = get_normalization_layer( opts, num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) def forward( self, x: Tensor, past_keys: Optional[Tensor] = None, past_values: Optional[Tensor] = None, use_kv_cache: bool = False, is_causal: bool = True, concat_kvs: bool = True, apply_k_norm_to_past_keys_before_cache_write=False, apply_k_norm_before_cache_write=True, ) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]: """ Forward pass of decoder layer. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. past_keys: Tensor storing the cached keys. The shape of tensor is [batch size, number of key heads, sequence length, head dimension]. past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'. use_kv_cache: Cache the output of key and value projection layers for faster inference. is_causal: Specifies whether to apply causal masking in scaled dot-product attention. Returns: The output of the same shape as the input, optionally with a tensor containing cached keys and values. """ # Pre-norm attention. y_attn = self.attn_norm(x) y_attn, past_keys, past_values = self.attn( y_attn, past_keys, past_values, use_kv_cache, is_causal, concat_kvs, apply_k_norm_to_past_keys_before_cache_write, apply_k_norm_before_cache_write, ) y_attn = x + y_attn # Pre-norm FFN. y_ffn = y_attn + self.ffn(self.ffn_norm(y_attn)) return y_ffn, past_keys, past_values @MODEL_REGISTRY.register(name="general_gpt", type="language_modeling") class GeneralGPTModel(BaseLanguageModel): """General GPT model. Args: opts: Command-line arguments. """ config = GPTConfig def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) model_name = getattr(opts, "model.language_modeling.general_gpt.model_name") if model_name is None: logger.error( "Please specify model name using 'model.language_modeling.general_gpt.model_name' parameter in your configuration file." ) vocab_size = getattr(opts, "model.language_modeling.general_gpt.vocab_size") if vocab_size is None: logger.error( "Please specify vocabulary size using 'model.language_modeling.general_gpt.vocab_size' parameter in your configuration file." ) max_context_length = getattr( opts, "model.language_modeling.general_gpt.max_context_length" ) if max_context_length is None: logger.error( "Please specify maximum context length using 'model.language_modeling.general_gpt.max_context_length' parameter in your configuration file." ) padding_index = getattr( opts, "model.language_modeling.general_gpt.padding_index" ) model_config = self.config.from_name( model_name=model_name, vocab_size=vocab_size, max_context_length=max_context_length, ) self.token_embeddings = Embedding( opts, embedding_dim=model_config.model_dim, num_embeddings=model_config.vocab_size, padding_idx=padding_index, ) self.layers = nn.ModuleList( TransformerDecoderLayer( opts, model_config=model_config, layer_idx=layer_idx ) for layer_idx in range(model_config.num_transformer_layers) ) self.norm = get_normalization_layer( opts, num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) if model_config.share_input_output_layers: self.classifier = None else: self.classifier = LinearLayer( in_features=model_config.model_dim, out_features=model_config.vocab_size, bias=False, ) self.reset_parameters(model_config=model_config) self.num_transformer_layers = model_config.num_transformer_layers @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add General GPT model arguments.""" if cls == GeneralGPTModel: group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.language-modeling.general-gpt.model-name", type=str, default=None, choices=list(gpt_configs.keys()), help="Name of the generative transformer-based LM model. Defaults to None (i.e., user need to specify the model name.).", ) group.add_argument( "--model.language-modeling.general-gpt.max-context-length", type=int, default=None, help="Maximum context length. Defaults to None (i.e., user needs to specify the maximum contenxt length value.).", ) group.add_argument( "--model.language-modeling.general-gpt.vocab-size", type=int, default=None, help="Vocabulary size. Defaults to None (i.e., user needs to specify the vocabulary size.).", ) group.add_argument( "--model.language-modeling.general-gpt.padding-index", type=int, default=None, help="Padding index. Defaults to None (i.e., no padding).", ) return parser def forward( self, model_input: Union[Tensor, Dict[str, Tensor]], concat_kvs: bool = True, apply_k_norm_to_past_keys_before_cache_write=False, apply_k_norm_before_cache_write=True, ) -> Union[Tensor, Dict[str, Tensor]]: """Forward function of GPT model. Args: model_input: Input to the model. It can be a tensor or a dictionary. In case of a tensor, the expected shape is [batch size, sequence length]. In case of a dictionary, the expected keys are 'input_ids', 'past_keys', 'past_values', 'use_kv_cache', and 'is_causal'. The shape of the values for each key is: { "input_ids": [batch size, sequence length], "past_keys": [ [batch size, number of key heads, sequence length, head dimension] ]* number of transformer layers, "past_values": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers, "use_kv_cache": boolean, "is_causal": boolean, } where 'input_ids' represents input token indices. 'past_keys' and 'past_values' represents the cached tensor outputs of key and value branch in multi-head attention respectively. These values can be None. 'use_kv_cache' indicates to use KV caching or not. 'is_causal' indicates to use causal masking in scaled dot-product attention or not. concat_kvs: If set, the keys produced by the QKV projection will be concatenated with the past keys. Usually this value should be True, but it needs to be False for KV Prediction experiments. apply_k_norm_to_past_keys_before_cache_write: If set, apply the key norm to past keys before updating the KV cache. This usually should be False, but is set to True for KV prediction experiments. apply_k_norm_before_cache_write: If set, apply the key norm to the current keys before concatenating them with the past keys. This usually should be True, but is set to False for KV prediction experiments. Returns: Output of the model. 1. When 'use_kv_cache' is enabled, a dictionary with 'logits', 'past_keys', and 'past_values' is returned. The expected shape of the values is { "logits": [batch size, sequence length, vocabular size], "past_keys": [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers, "past_values": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers, } 2. Logits tensor is returned. The shape of logits tensor is [batch size, sequence length, vocabulary size]. ...note: 1. For pre-training, 'model_input' is typically a tensor. 2. For inference, we have two scenarios. 2.a. Processing prefix or prompt: When dealing with a prefix or prompt, it is expected that the 'sequence length' is more than one and past keys or values are None. If the intention of the user is to perform generation following a prefix, it's recommended to provide the prefix inputs as a dictionary, specifying 'use_kv_cache=True', 'is_causal=True', 'past_keys=None', and 'past_values=None'. Otherwise, users should pass token indices as a tensor. 2.b. Generation: In this case, 'sequence length' should be one. In other words, one token is generated at a time with KV caching. Ideally, when using KV caching, 'is_causal' should be set to False. The generation logic may vary from task to task and we rely on user for correctly passing the inputs. """ if isinstance(model_input, dict): expected_input_keys = { "input_ids", "past_keys", "past_values", "use_kv_cache", "is_causal", } assert expected_input_keys == set( model_input.keys() ), f"Model input does not contain all keys. Expected keys are {expected_input_keys}, but got {set(model_input.keys())}." input_ids = model_input["input_ids"] past_keys = model_input["past_keys"] past_values = model_input["past_values"] use_kv_cache = model_input["use_kv_cache"] is_causal = model_input["is_causal"] if past_keys is None: assert past_values is None past_keys = [None] * self.num_transformer_layers past_values = [None] * self.num_transformer_layers elif isinstance(model_input, Tensor): input_ids = model_input past_keys = [None] * self.num_transformer_layers past_values = [None] * self.num_transformer_layers use_kv_cache = False is_causal = True else: raise NotImplementedError( f"Supported input types are either Tensor or Dictionary. Got: {type(model_input)}." ) x = self.token_embeddings(input_ids) for layer_idx in range(self.num_transformer_layers): past_keys_layer_i = past_keys[layer_idx] past_values_layer_i = past_values[layer_idx] x, past_keys_layer_i, past_values_layer_i = self.layers[layer_idx]( x, past_keys_layer_i, past_values_layer_i, use_kv_cache, is_causal, concat_kvs, apply_k_norm_to_past_keys_before_cache_write, apply_k_norm_before_cache_write, ) # update the kv cache past_keys[layer_idx] = past_keys_layer_i past_values[layer_idx] = past_values_layer_i x = self.norm(x) if self.classifier is None: logits = F.linear(x, weight=self.token_embeddings.weight) else: logits = self.classifier(x) if use_kv_cache: return { "logits": logits, "past_keys": past_keys, "past_values": past_values, } else: return logits def get_fsdp_wrap_policy( self, ) -> Callable[[torch.nn.Module, bool, int], bool]: """Returns the FSDP policy.""" general_gpt_auto_wrap_policy = functools.partial( transformer_auto_wrap_policy, transformer_layer_cls={TransformerDecoderLayer}, ) return general_gpt_auto_wrap_policy def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the layer that should be used for activation checkpointing.""" return TransformerDecoderLayer def reset_parameters(self, model_config: GPTConfig) -> None: """Initialize the parameters of language model. Args: model_config: Model configuration. """ for module in self.modules(): if isinstance(module, (LinearLayer, nn.Linear)): std = module.in_features**-0.5 torch.nn.init.normal_(module.weight, mean=0.0, std=std) if module.bias is not None: torch.nn.init.zeros_(module.bias) elif isinstance(module, (nn.Embedding, Embedding)): std = module.embedding_dim**-0.5 torch.nn.init.normal_(module.weight, mean=0.0, std=std) elif isinstance(module, norm_layers_tuple): if module.weight is not None: torch.nn.init.ones_(module.weight) if hasattr(module, "bias") and module.bias is not None: torch.nn.init.zeros_(module.bias) model_dim = model_config.model_dim n_layers = model_config.num_transformer_layers # standard deviation of output layers in transformer block is scaled, # following https://arxiv.org/pdf/2205.01068.pdf std = (model_dim**-0.5) * ((2 * n_layers) ** -0.5) for param_name, param in self.named_parameters(): if param_name.endswith("out_proj.weight") or param_name.endswith( "ffn.proj_2.weight" ): torch.nn.init.normal_(param, mean=0.0, std=std) def head_dim_at_layer(self, i: int) -> int: return self.layers[i].attn.head_dim def k_dim_at_layer(self, i: int) -> int: return self.layers[i].attn.head_dim * self.layers[i].attn.num_k_heads def v_dim_at_layer(self, i: int) -> int: return self.layers[i].attn.head_dim * self.layers[i].attn.num_v_heads def k_num_heads_at_layer(self, i: int) -> int: return self.layers[i].attn.num_k_heads def v_num_heads_at_layer(self, i: int) -> int: return self.layers[i].attn.num_v_heads ================================================ FILE: corenet/modeling/models/language_modeling/kv_prediction.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ A KV Prediction Model (https://arxiv.org/abs/2410.08391). The model contains 2 submodels. The smaller "auxiliary" model is used to quickly process context. The larger "base" model is used to perform generation without compromising accuracy. """ import argparse import copy import itertools from dataclasses import dataclass from typing import Any, Callable, Dict, List, Optional, Tuple, Union import torch from torch import Tensor, nn from corenet.modeling.models import MODEL_REGISTRY, get_model from corenet.modeling.models.language_modeling import general_gpt from corenet.modeling.models.language_modeling.base_lm import BaseLanguageModel from corenet.options.parse_args import JsonValidator from corenet.options.utils import flatten_yaml_as_dict @dataclass class LayerPrunedGPTConfig(general_gpt.GPTConfig): select_layers: Optional[List[int]] = None def __post_init__(self) -> None: super().__post_init__() if self.select_layers is not None: # Remove unselected layers. self.num_transformer_layers = len(self.select_layers) self.num_query_heads = [self.num_query_heads[i] for i in self.select_layers] self.num_kv_heads = [self.num_kv_heads[i] for i in self.select_layers] self.ffn_multipliers = [self.ffn_multipliers[i] for i in self.select_layers] @classmethod def from_name( cls, model_name: str, vocab_size: int, max_context_length: int ) -> "LayerPrunedGPTConfig": if model_name in layer_pruned_gpt_configs: config = layer_pruned_gpt_configs[model_name] else: raise NotImplementedError(f"{model_name} is not yet implemented") config["vocab_size"] = vocab_size config["max_context_length"] = max_context_length return cls(**config) layer_pruned_gpt_configs = { "gpt-test-base": dict( num_transformer_layers=3, model_dim=128, head_dim=64, num_gqa_groups=1, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.25, 0.75), qkv_multipliers=(0.25, 0.5), ), "gpt-test-aux": dict( num_transformer_layers=2, model_dim=128, head_dim=48, num_gqa_groups=1, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.25, 0.75), qkv_multipliers=(0.25, 0.5), ), "OpenELM-1_1B-0.25l": dict( num_transformer_layers=28, model_dim=2048, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), select_layers=[0, 4, 8, 12, 16, 20, 24], ), "OpenELM-1_1B-0.50l": dict( num_transformer_layers=28 // 2, model_dim=2048, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, (4.0) - (1 / (28 - 1)) * (4.0 - 0.5)), qkv_multipliers=(0.5, (1.0) - (1 / (28 - 1)) * (1.0 - 0.5)), ), "OpenELM-1_1B-0.75l": dict( num_transformer_layers=28, model_dim=2048, head_dim=64, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), select_layers=[ 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, ], ), "OpenELM-3B-0.25l": dict( num_transformer_layers=36, model_dim=3072, head_dim=128, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), select_layers=[0, 4, 8, 12, 16, 20, 24, 28, 32], ), "OpenELM-3B-0.50l": dict( num_transformer_layers=36 // 2, model_dim=3072, head_dim=128, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, (4.0) - (1 / (36 - 1)) * (4.0 - 0.5)), qkv_multipliers=(0.5, (1.0) - (1 / (36 - 1)) * (1.0 - 0.5)), ), "OpenELM-3B-0.75l": dict( num_transformer_layers=36, model_dim=3072, head_dim=128, num_gqa_groups=4, normalize_qk_projections=True, share_input_output_layers=True, # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively. ffn_multipliers=(0.5, 4.0), qkv_multipliers=(0.5, 1.0), select_layers=[ 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, ], ), } @MODEL_REGISTRY.register(name="layer_pruned_general_gpt", type="language_modeling") class LayerPrunedGeneralGPTModel(general_gpt.GeneralGPTModel): """Layer Pruned General GPT model. Functions the same as GeneralGPTModel, but provides different available model configurations. """ config = LayerPrunedGPTConfig class AuxLayerToBaseLayer(nn.Module): """ The mapping from auxiliary layers to base layers. Used in KV Prediction to map auxiliary cache layers to base cache layers. Args: auxkv_num_layers_to_basekv_num_layers: A list of length equal to the number of layers in the base model. The ith element tells which layer in the auxiliary cache gets mapped to the ith layer in the base cache. """ def __init__(self, auxkv_num_layers_to_basekv_num_layers: List[int]) -> None: super().__init__() self.auxkv_num_layers_to_basekv_num_layers = ( auxkv_num_layers_to_basekv_num_layers ) def forward( self, past_keys: List[Tensor], past_values: List[Tensor] ) -> List[Tensor]: """ Args: past_keys: [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers, past_values: Same shape as past_keys. Returns: The remapped cache. """ ret_keys = [past_keys[i] for i in self.auxkv_num_layers_to_basekv_num_layers] ret_values = [ past_values[i] for i in self.auxkv_num_layers_to_basekv_num_layers ] return [ret_keys, ret_values] class LinearAuxKVToBaseKV(nn.Module): """ A linear mapping from KV cache elements of one dimensionality to KV cache elements of another dimensionality. Args: auxiliary_k_dims: A list containing the size of the auxiliary key dimension for each layer of the auxiliary KV cache. auxiliary_v_dims: A list containing the size of the auxiliary value dimension for each layer of the auxiliary KV cache. base_k_dims: A list containing the size of the base key dimension for each layer of the base KV cache. base_v_dims: A list containing the size of the base value dimension for each layer of the base KV cache. base_k_num_heads: A list containing the number of heads for each layer of the base KV cache. base_v_num_heads: A list containing the number of heads for each layer of the base KV cache. """ def __init__( self, auxiliary_k_dims: List[int], auxiliary_v_dims: List[int], base_k_dims: List[int], base_v_dims: List[int], base_k_num_heads: List[int], base_v_num_heads: List[int], ) -> None: super().__init__() # Inputs will be [batch_size, seq_len, dim]. self.key_transforms = nn.ModuleList( [ nn.Linear(auxiliary_k_dim, base_k_dim) for auxiliary_k_dim, base_k_dim in zip(auxiliary_k_dims, base_k_dims) ] ) self.value_transforms = nn.ModuleList( [ nn.Linear(auxiliary_v_dim, base_v_dim) for auxiliary_v_dim, base_v_dim in zip(auxiliary_v_dims, base_v_dims) ] ) self.base_k_num_heads = base_k_num_heads self.base_v_num_heads = base_v_num_heads def forward( self, past_keys: List[Tensor], past_values: List[Tensor] ) -> List[List[Tensor]]: """ Args: past_keys: [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers, past_values: Same shape as past_keys. Returns: A list of two elements. The first contains the predicted keys, the second contains the predicted values. Their shapes are: - [ [batch size, output number of key heads, sequence length, output head dimension] ] * number of transformer layers - [ [batch size, output number of value heads, sequence length, output head dimension] ] * number of transformer layers """ def get_transformed_cache( transforms, caches, output_num_heads, ): rets = [] for layer_transform, layer_cache, output_num_head in zip( transforms, caches, output_num_heads ): batch_size, num_heads, seq_len, head_dim = layer_cache.shape layer_cache = layer_cache.permute(0, 2, 1, 3).reshape( batch_size, seq_len, num_heads * head_dim ) layer_cache = layer_transform(layer_cache) layer_cache = layer_cache.reshape( batch_size, seq_len, output_num_head, -1 ) # Inferred dim is new head dim. layer_cache = layer_cache.permute(0, 2, 1, 3) rets.append(layer_cache) return rets return [ get_transformed_cache( self.key_transforms, past_keys, self.base_k_num_heads ), get_transformed_cache( self.value_transforms, past_values, self.base_v_num_heads ), ] def set_as_identity(self) -> None: """ Reset this layer to compute the identity. Mainly for testing. """ for t in itertools.chain(self.key_transforms, self.value_transforms): dim1, dim2 = t.weight.shape assert dim1 == dim2, f"Expected a square matrix." matr = torch.eye(dim1, dtype=t.weight.dtype, device=t.weight.device) t.weight[:, :] = matr t.bias.fill_(0) class KVPredicter(nn.Module): """ Class containing tools needed to perform KV prediction. Args: auxkv_num_layers_to_basekv_num_layers: A list of length equal to the number of layers in the base model. The ith element tells which layer in the auxiliary cache gets mapped to the ith layer in the base cache. auxiliary_k_dims: A list containing the size of the auxiliary key dimension for each layer of the auxiliary KV cache. auxiliary_v_dims: A list containing the size of the auxiliary value dimension for each layer of the auxiliary KV cache. base_k_dims: A list containing the size of the base key dimension for each layer of the base KV cache. base_v_dims: A list containing the size of the base value dimension for each layer of the base KV cache. base_k_num_heads: A list containing the number of heads for each layer of the base KV cache. base_v_num_heads: A list containing the number of heads for each layer of the base KV cache. """ def __init__( self, auxkv_num_layers_to_basekv_num_layers: List[int], auxiliary_k_dims: List[int], auxiliary_v_dims: List[int], base_k_dims: List[int], base_v_dims: List[int], base_k_num_heads: List[int], base_v_num_heads: List[int], ) -> None: super().__init__() self.auxkv_num_layers_to_basekv_num_layers = ( auxkv_num_layers_to_basekv_num_layers ) self.auxiliary_k_dims = auxiliary_k_dims self.auxiliary_v_dims = auxiliary_v_dims self.base_k_dims = base_k_dims self.base_v_dims = base_v_dims self.base_k_num_heads = base_k_num_heads self.base_v_num_heads = base_v_num_heads self.build_kv_cache_predicters() @property def base_layers(self) -> int: return len(self.base_k_dims) @property def auxiliary_layers(self) -> int: return len(self.auxiliary_k_dims) def build_kv_cache_predicters(self) -> None: """ Initialize the KV cache prediction modules. """ # Each index should be [0, num_aux_layers). if not all( 0 <= k < self.auxiliary_layers for k in self.auxkv_num_layers_to_basekv_num_layers ): raise ValueError( "Expected layer mappings in the range " f"[0, num_aux_layers={self.auxiliary_layers}). " f"Invalid layer mappings {self.auxkv_num_layers_to_basekv_num_layers=}." ) self.auxiliary_to_base_layer_mapping = AuxLayerToBaseLayer( self.auxkv_num_layers_to_basekv_num_layers ) auxkv_num_layers_to_basekv_num_layers = ( self.auxkv_num_layers_to_basekv_num_layers ) def remap(x: List[int]) -> List[int]: return [x[i] for i in auxkv_num_layers_to_basekv_num_layers] self.auxkv_to_basekv = LinearAuxKVToBaseKV( remap(self.auxiliary_k_dims), remap(self.auxiliary_v_dims), (self.base_k_dims), (self.base_v_dims), (self.base_k_num_heads), (self.base_v_num_heads), ) def forward( self, auxiliary_outputs: Dict[str, Any] ) -> Tuple[List[torch.Tensor], List[torch.Tensor]]: """ Get the predicted KV cache for the base model using the outputs from the auxiliary model. Our prediction operates on merged heads. Thus, we need to reorganize the key-value cache to merge heads. Args: auxiliary_outputs: A dictionary with: { "logits": [batch size, sequence length, vocabular size], "past_keys": [ [batch size, number of key heads, sequence length, head dimension] ] * num_aux_layers "past_values": [ [batch size, number of value heads, sequence length, head dimension] ] * num_aux_layers } Returns: A tuple of 2 lists, containing the predictions of the KV cache for the base model: ( [ [batch size, number of key heads, sequence length, head dimension] ] * num_base_layers [ [batch size, number of value heads, sequence length, head dimension] ] * num_base_layers ) """ intermediate_cache = self.auxiliary_to_base_layer_mapping( auxiliary_outputs["past_keys"], auxiliary_outputs["past_values"] ) return self.auxkv_to_basekv(*intermediate_cache) def get_overrided_opts( opts: argparse.Namespace, config: Dict[str, Any] ) -> argparse.Namespace: """ Get a copy of @opts with overrides from @config applied. Args: opts: The opts to copy. config: A dictionary with overrides. Returns: A copy of @opts with the overrides applied. """ ret = copy.deepcopy(opts) flattened_config = flatten_yaml_as_dict(config) for k, v in flattened_config.items(): setattr(ret, k, v) return ret @MODEL_REGISTRY.register(name="kv_prediction", type="language_modeling") class KVPredictionLLM(BaseLanguageModel): """General KV Prediction LLM model. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) # As a workaround, we make this a list, to prevent the parser from throwing # an error about unexpected keys. base_model_config = getattr( opts, "model.language_modeling.kv_prediction.base_model" )[0] base_opts = get_overrided_opts(opts, base_model_config) self.base = get_model(base_opts) auxiliary_model_config = getattr( opts, "model.language_modeling.kv_prediction.auxiliary_model" )[0] auxiliary_opts = get_overrided_opts(opts, auxiliary_model_config) self.auxiliary = get_model(auxiliary_opts) # Process arguments and build the KVPredicter. auxkv_num_layers_to_basekv_num_layers = getattr( opts, "model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers", ) assert isinstance(auxkv_num_layers_to_basekv_num_layers, list) assert all(isinstance(x, int) for x in auxkv_num_layers_to_basekv_num_layers) auxiliary_k_dims = [ self.auxiliary.k_dim_at_layer(i) for i in range(len(self.auxiliary.layers)) ] auxiliary_v_dims = [ self.auxiliary.v_dim_at_layer(i) for i in range(len(self.auxiliary.layers)) ] base_k_dims = [ self.base.k_dim_at_layer(i) for i in range(len(self.base.layers)) ] base_v_dims = [ self.base.v_dim_at_layer(i) for i in range(len(self.base.layers)) ] base_k_num_heads = [ self.base.k_num_heads_at_layer(i) for i in range(len(self.base.layers)) ] base_v_num_heads = [ self.base.v_num_heads_at_layer(i) for i in range(len(self.base.layers)) ] self.predicter = KVPredicter( auxkv_num_layers_to_basekv_num_layers=auxkv_num_layers_to_basekv_num_layers, auxiliary_k_dims=auxiliary_k_dims, auxiliary_v_dims=auxiliary_v_dims, base_k_dims=base_k_dims, base_v_dims=base_v_dims, base_k_num_heads=base_k_num_heads, base_v_num_heads=base_v_num_heads, ) self.dtype = next(self.base.parameters()).dtype self.predicter.to(self.dtype) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls == KVPredictionLLM: group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.language-modeling.kv-prediction.auxkv-num-layers-to-basekv-num-layers", type=str, help="The mapping from auxiliary layers to base model layers. The element " "at index i is used to tell which Auxiliary layer is used to predict the KV " "cache at Base layer i.", ) group.add_argument( "--model.language-modeling.kv-prediction.base-model", type=JsonValidator, help="A config for the base model.", ) group.add_argument( "--model.language-modeling.kv-prediction.auxiliary-model", type=JsonValidator, help="A config for the auxiliary model.", ) return parser def predict_kv_cache(self, auxiliary_outputs: Dict[str, Any]) -> List[List[Tensor]]: """ Predict the base KV cache from the auxiliary KV cache. Args: auxiliary_outputs: The full outputs of the auxiliary model, as a dictionary: { "logits": [batch size, sequence length, vocabular size], "past_keys": [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers, "past_values": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers, } Returns: The predicted KV cache for the base model. It is a list of two elements. The first contains the predicted keys, the second contains the predicted values. Their shapes are: - [ [batch size, output number of key heads, sequence length, output head dimension] ] * number of transformer layers - [ [batch size, output number of value heads, sequence length, output head dimension] ] * number of transformer layers """ predicted_cache = self.predicter(auxiliary_outputs) return [ [x for x in predicted_cache[0]], [x for x in predicted_cache[1]], ] def forward( self, model_input: Union[Tensor, Dict[str, Tensor]], base_only: bool = False ) -> Tensor: """ Run the forward pass of the KVPredictionLLM. If the KV cache is configured to be used, we assume evaluation is happening. In this case: 1) If the cache is currently empty (which is a sign that we are still processing the prompt), we predict the KV cache with the auxiliary model and the predicter network (which contains linear layers). Then, we perform a step of generation. 2) If the cache is not currently empty, we only perform a step of generation. If the KV cache is not configured to be used, we perform a training step. This involves generating a cache prediction (using the auxiliary network and predicter network), then generating outputs with the base model using the cache prediction. Gradients flow back to the auxiliary model through the predicted KV cache. NOTE: base_only is reserved exclusively for testing purposes. Args: model_input: A model input suitable for general_gpt.GeneralGPT.forward. base_only: If set, only perform the forward pass with the base model. Used for testing. Returns: The output logits and the updated KV cache. """ # Process the inputs. if isinstance(model_input, dict): expected_input_keys = { "input_ids", "past_keys", "past_values", "use_kv_cache", "is_causal", } for expected_key in expected_input_keys: assert ( expected_key in model_input ), f"Model input does not contain {expected_key}" input_ids = model_input["input_ids"] past_keys = model_input["past_keys"] past_values = model_input["past_values"] use_kv_cache = model_input["use_kv_cache"] if past_keys is None: assert past_values is None past_keys = [None] * len(self.base.layers) past_values = [None] * len(self.base.layers) elif isinstance(model_input, Tensor): input_ids = model_input past_keys = [None] * len(self.base.layers) past_values = [None] * len(self.base.layers) use_kv_cache = False else: raise NotImplementedError( f"Supported input types are either Tensor or Dictionary. Got: {type(model_input)}." ) if base_only: if isinstance(model_input, dict): is_causal = model_input.get("is_causal", True) else: is_causal = True return self.base( { "input_ids": input_ids, "past_keys": past_keys, "past_values": past_values, "use_kv_cache": use_kv_cache, "is_causal": is_causal, } ) if use_kv_cache: # A user-provided KV cache is given. We are in evaluation mode. # There are two cases. If the past_keys and past_values # are empty, we populate the cache with the auxiliary model, then # perform a generation step. If they are not empty, we simply # proceed with the base model in generation mode. cache_is_empty = past_keys[0] is None if cache_is_empty: # Populate the KV cache, then perform a single-token # generation step with the base model. past_keys = [None] * len(self.auxiliary.layers) past_values = [None] * len(self.auxiliary.layers) auxiliary_outputs = self.auxiliary( { "input_ids": input_ids[:, :-1], "past_keys": past_keys, "past_values": past_values, "use_kv_cache": use_kv_cache, "is_causal": True, }, concat_kvs=True, apply_k_norm_to_past_keys_before_cache_write=False, # Do not apply K norm. It will be applied in the base model. apply_k_norm_before_cache_write=False, ) past_keys, past_values = self.predict_kv_cache(auxiliary_outputs) # Process the last token using the base model rather than the # auxiliary model, to ensure that only prompt processing is done # by the auxiliary model, and generation is done by the base # model. # NOTE: We also want to apply key norm to the past_keys, since # it hasn't been applied. We cannot simply apply it in the # @predict_kv_cache method because FSDP will not work properly # if we call that wrapped module individually. The key norm will # be applied because apply_k_norm_to_past_keys_before_cache_write is True. base_outputs = self.base( { "input_ids": input_ids[:, -1:], "past_keys": past_keys, "past_values": past_values, "use_kv_cache": use_kv_cache, "is_causal": False, # Attend to all the KVs. }, concat_kvs=True, apply_k_norm_to_past_keys_before_cache_write=True, # The auxiliary model didn't apply key norm. Do it with the base. apply_k_norm_before_cache_write=True, ) # Return the auxiliary and base logits. output_logits = self.merge_outputs( auxiliary_outputs["logits"], base_outputs["logits"] ) assert (output_logits.shape[1]) == (input_ids.shape[1]) past_keys = base_outputs["past_keys"] past_values = base_outputs["past_values"] return { "logits": output_logits, "past_keys": past_keys, "past_values": past_values, } else: # The cache is not empty. We assume the cache has already been populated # by the auxiliary model, and we are in "generation mode". assert input_ids.shape[1] == 1 return self.base( { "input_ids": input_ids, "past_keys": past_keys, "past_values": past_values, "use_kv_cache": use_kv_cache, "is_causal": False, }, concat_kvs=True, apply_k_norm_to_past_keys_before_cache_write=False, apply_k_norm_before_cache_write=True, ) else: # We are not using the cache. This means we are in # training mode, or we are performing likelihood # evaluations. past_keys = [None] * len(self.auxiliary.layers) past_values = [None] * len(self.auxiliary.layers) auxiliary_outputs = self.auxiliary( { "input_ids": input_ids, "past_keys": past_keys, "past_values": past_values, "use_kv_cache": True, "is_causal": True, }, concat_kvs=True, apply_k_norm_to_past_keys_before_cache_write=False, # Do not apply K norm. It will be applied in the base model. apply_k_norm_before_cache_write=False, ) past_keys, past_values = self.predict_kv_cache(auxiliary_outputs) ret = self.base( { "input_ids": input_ids, "past_keys": past_keys, "past_values": past_values, "use_kv_cache": True, "is_causal": True, }, concat_kvs=False, apply_k_norm_to_past_keys_before_cache_write=True, # The auxiliary model didn't apply key norm. Do it with the base. apply_k_norm_before_cache_write=True, ) ret["auxiliary_logits"] = auxiliary_outputs["logits"] if self.training: # Get the ground-truth KV cache so we can compute a loss over it. with torch.no_grad(): ret2 = self.base( { "input_ids": input_ids, "past_keys": None, "past_values": None, "use_kv_cache": True, "is_causal": True, }, # Make sure the key targets are normalized. apply_k_norm_before_cache_write=True, ) ret.update( { "base_past_keys": ret2["past_keys"], "base_past_values": ret2["past_values"], } ) return ret def merge_outputs(self, aux_logits: Tensor, base_logits: Tensor) -> Tensor: """ Merge the auxiliary and base logits. Args: aux_logits: The auxiliary logits. base_logits: The base logits. Returns: The merged logits. """ return torch.cat([aux_logits, base_logits], dim=1) def get_fsdp_wrap_policy( self, ) -> Callable[[torch.nn.Module, bool, int], bool]: """Returns the FSDP policy.""" return self.auxiliary.get_fsdp_wrap_policy() def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns the layer that should be used for activation checkpointing.""" return self.auxiliary.get_activation_checkpoint_submodule_class() ================================================ FILE: corenet/modeling/models/multi_modal_img_text/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/multi_modal_img_text/base_multi_modal_img_text.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel @MODEL_REGISTRY.register(name="__base__", type="multi_modal_image_text") class BaseMultiModalImageText(BaseAnyNNModel): """Base class for multi-modal image-text data Args: opts: Command-line arguments """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.lr_multiplier_img_encoder = getattr( opts, "model.multi_modal_image_text.lr_multiplier_img_encoder" ) self.lr_multiplier_text_encoder = getattr( opts, "model.multi_modal_image_text.lr_multiplier_text_encoder" ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" if cls != BaseMultiModalImageText: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.multi-modal-image-text.name", type=str, default=None, help="Name of the multi-modal image-text model", ) group.add_argument( "--model.multi-modal-image-text.lr-multiplier-img-encoder", type=float, default=1.0, help="LR multiplier for the image encoder in {}".format(cls.__name__), ) group.add_argument( "--model.multi-modal-image-text.lr-multiplier-text-encoder", type=float, default=1.0, help="LR multiplier for the text encoder in {}".format(cls.__name__), ) group.add_argument( "--model.multi-modal-image-text.pretrained", type=str, default=None, help="Path of the pretrained backbone", ) group.add_argument( "--model.multi-modal-image-text.freeze-batch-norm", action="store_true", help="Freeze batch norm layers", ) return parser ================================================ FILE: corenet/modeling/models/multi_modal_img_text/clip.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import Callable, Dict, List, Optional, Tuple, Union import torch from torch import Tensor, nn from corenet.modeling.image_projection_layers import build_image_projection_head from corenet.modeling.image_projection_layers.base_image_projection import ( get_in_feature_dimension, ) from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.multi_modal_img_text.base_multi_modal_img_text import ( BaseMultiModalImageText, ) from corenet.modeling.text_encoders import BaseTextEncoder, build_text_encoder from corenet.utils import logger from corenet.utils.ddp_utils import is_master @MODEL_REGISTRY.register(name="clip", type="multi_modal_image_text") class CLIP(BaseMultiModalImageText): """Model for contrastive language image pre-training. See `CLIP ` paper for details. Args: opts: Command-line arguments. image_encoder: Image encoder. text_encoder: Text encoder. """ def __init__( self, opts: argparse.Namespace, image_encoder: BaseImageEncoder, text_encoder: BaseTextEncoder, *args, **kwargs, ) -> None: super().__init__(opts=opts, *args, **kwargs) self.image_encoder: BaseImageEncoder = image_encoder self.text_encoder: BaseTextEncoder = text_encoder self.logit_scale = nn.Parameter(torch.ones([]) * math.log(1.0 / 0.07)) self.use_distributed = getattr(opts, "ddp.use_distributed", False) self.cached_text_features = None self.reset_parameters() @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): """Add CLIP specific arguments""" if cls == CLIP: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.multi-modal-image-text.clip.projection-dim", type=int, default=256, help="Project image and text features to this dimensionality", ) return parser def reset_parameters(self) -> None: """Helper function to reset model weights. Currently, we only reset the @logit_scale. """ torch.nn.init.constant_(self.logit_scale, math.log(1.0 / 0.07)) def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs, ) -> Tuple[List[Dict], List[float]]: """Get parameters for training along with the learning rate. Args: weight_decay: weight decay. no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False. Returns: Returns a tuple of length 2. The first entry is a list of dictionary with three keys (params, weight_decay, param_names). The second entry is a list of floats containing learning rate for each parameter. Note: Kwargs may contain module_name. To avoid multiple arguments with the same name, we pop it and concatenate with image and text encoders. """ prev_module_name = kwargs.pop("module_name", "") image_param_list, image_lr_mult = self.image_encoder.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=prev_module_name + "image_encoder.", *args, **kwargs, ) # The learning rate list from image encoder returns 1.0 as a LR multiplier. # Update the learning rate to the specified value. image_lr_mult = [self.lr_multiplier_img_encoder] * len(image_lr_mult) text_param_list, text_lr_mult = self.text_encoder.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name=prev_module_name + "text_encoder.", *args, **kwargs, ) # The learning rate list from text encoder returns 1.0 as a LR multiplier. # Update the learning rate to the specified value. text_lr_mult = [self.lr_multiplier_text_encoder] * len(text_lr_mult) # We need to add the logit scale logit_scale_param_list = [ { "params": [self.logit_scale], "weight_decay": 0.0, "param_names": ["logit_scale"], } ] logit_scale_lr_mult = [1.0] * len(logit_scale_param_list) return ( image_param_list + text_param_list + logit_scale_param_list, image_lr_mult + text_lr_mult + logit_scale_lr_mult, ) def dummy_input_and_label( self, batch_size: int ) -> Dict[str, Union[Dict[str, Tensor], Tensor]]: """Create dummy input and labels for CI/CD purposes. Child classes must override it if functionality is different. """ img_channels = 3 height = 224 width = 224 vocab_size = 10 seq_length = 5 num_obj_classes = 2 num_captions_per_class = 2 img_tensor = torch.randn( batch_size, img_channels, height, width, dtype=torch.float ) if self.training: text_tensor = torch.randint( low=0, high=vocab_size, size=(batch_size, seq_length) ).long() else: text_tensor = torch.randint( low=0, high=vocab_size, size=(batch_size, num_obj_classes, num_captions_per_class, seq_length), ).long() return { "samples": {"image": img_tensor, "text": text_tensor}, "targets": text_tensor, } def _exponentiate_and_clip_logits(self, max_scale: float = 100.0) -> Tensor: """Exponentiate and clip the logit scale. Args: max_scale: Maximum value of logit scale. Returns: A tensor of shape [1]. """ scale = self.logit_scale.exp() scale = torch.clamp(scale, 0, max_scale) return scale def _reset_cached_text_features(self, mode_str: str) -> None: """Reset cached text features. Args: mode: String specifying the mode of the model (e.g., train or eval). """ if self.cached_text_features is not None: if is_master(self.opts): logger.log( f"Resetting {self.__class__.__name__}'s cache in {mode_str} mode." ) self.cached_text_features = None def train(self, mode: bool = True): """Sets the module in training mode when @mode is enabled. ...note: We override this function to reset cached text features before starting evaluation or training. This resetting is required so that features cached from one model may not be used by other model. An example of such a use case is when training CLIP model with and without exponential moving average. """ mode_str = "train" if mode else "eval" self._reset_cached_text_features(mode_str=mode_str) return super().train(mode) def forward(self, input: Dict[str, Optional[Tensor]]) -> Dict[str, Tensor]: """Forward pass of CLIP model. Args: input: A dictionary containing tensors under keys 'image', 'text', and 'padding_mask'. The shape of inputs is: input["image"]: The shape of tensor is [batch size, image channels, image width, image height] input["text"]: For pre-training, the shape of tensor is [batch size, sequence length] For zero-shot image classification, the shape of tensor is [batch size, number of classes, number of captions, sequence length]. input["padding_mask"]: The shape of tensor is [batch size, sequence length] Returns: A dictionary containing tensors under keys 'image', 'text', 'logit_scale', 'zero_shot_image_logits', and 'augmented_tensor'. output["image"]: The shape of image embeddings is [batch size, hidden dimension] output["text"]: The shape of text embeddings during pre-training is [hidden dimension, batch size]. For zero-shot image classification, the shape is [hidden dimension, number of classes.] output["logit_scale"]: The shape of tensor is [1]. output["zero_shot_image_logits"]: The shape of tensor is [batch size, number of classes]. This is returned only during evaluation and is set to 'None' during training. output["augmented_tensor"]: The shape of tensor is [batch size, image channels, image width, image height]. This is only returned during training if RangeAugment (https://arxiv.org/abs/2212.10553) is enabled. Otherwise, it is set to None. """ images = input.get("image") text_tokens = input.get("text") padding_mask = input.get("padding_mask", None) # [batch_size, image_channels, image_height, image_width] -> [batch_size, hidden_dim] image_encoder_out = self.image_encoder(images) augmented_tensor = None if isinstance(image_encoder_out, Dict): if not {"augmented_tensor", "logits"}.issubset(image_encoder_out.keys()): logger.error( "Output of image classifier must contain logits and augmented_tensor" " as keys. Got keys: {}".format(image_encoder_out.keys()) ) image_embeddings = image_encoder_out["logits"] augmented_tensor = image_encoder_out["augmented_tensor"] elif isinstance(image_encoder_out, Tensor): image_embeddings = image_encoder_out else: logger.error("The output of image encoder should be either Dict or Tensor") if not self.training: # During zero-shot image classification, the embedding vector is returned for each class # Because the captions and classes are the same for all images in a batch, embeddings are returned only # for the first image. # [batch_size, num_classes, num_captions, sequence_length] --> [hidden_dim, num_classes] if self.cached_text_features is None: text_embeddings = self.text_encoder( text_tokens=text_tokens, key_padding_mask=padding_mask ) self.cached_text_features = text_embeddings else: text_embeddings = self.cached_text_features else: # During pre-training, the embeddings are only returned for end-of-text token. # Note that text embeddings are transposed (i.e., batch is not the first dimension). # [batch_size, sequence_length] --> [hidden_dim, batch_size] text_embeddings = self.text_encoder( text_tokens=text_tokens, key_padding_mask=padding_mask ) if not self.training: assert ( text_embeddings.shape[0] == image_embeddings.shape[1] ), "The hidden dimension of image and text towers is different. Please check." # This means that we are running a zero-shot set-up. # [batch_size, hidden_dim] x [hidden_dim, num_classes] --> [batch_size, num_classes] zero_shot_image_logits = 100.0 * image_embeddings @ text_embeddings return { "image": None, "text": None, "logit_scale": self._exponentiate_and_clip_logits(), "zero_shot_image_logits": zero_shot_image_logits, "augmented_tensor": None, } else: return { "image": image_embeddings, "text": text_embeddings, "logit_scale": self._exponentiate_and_clip_logits(), "zero_shot_image_logits": None, "augmented_tensor": augmented_tensor, } @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: """Build the CLIP model. Args: opts: Command-line arguments. Returns: An instance of CLIP model. """ projection_dim = getattr( opts, "model.multi_modal_image_text.clip.projection_dim" ) if projection_dim < 1: logger.error("Projection dimension should be > 1. Got: {}.") image_encoder: BaseImageEncoder = get_model( opts=opts, category="classification", *args, **kwargs ) text_encoder: BaseTextEncoder = build_text_encoder( opts=opts, projection_dim=projection_dim, *args, **kwargs ) # replace the classifier in image encoder with the task specific classifier image_encoder.classifier = update_image_classifier( opts, image_classifier=image_encoder.classifier, projection_dim=projection_dim, ) model = cls( opts, image_encoder=image_encoder, text_encoder=text_encoder, *args, **kwargs, ) if getattr(opts, "model.multi_modal_image_text.freeze_batch_norm"): cls.freeze_norm_layers(opts, model) return model def get_activation_checkpoint_submodule_class( self, ) -> Union[Callable, List[Callable]]: """Activation checkpoint sub-module classes. Returns: For CLIP, image and text encoders activation checkpoint sub-module classes are returned. If both of them are the same, then only image encoder's activation checkpoint sub-module class is returned because activation checkpointing is applied recursively. """ img_encoder_ckpt_module = ( self.image_encoder.get_activation_checkpoint_submodule_class() ) text_encoder_ckpt_module = ( self.text_encoder.get_activation_checkpoint_submodule_class() ) if img_encoder_ckpt_module == text_encoder_ckpt_module: return img_encoder_ckpt_module return [img_encoder_ckpt_module, text_encoder_ckpt_module] def update_image_classifier( opts, image_classifier: nn.Module, projection_dim: int, *args, **kwargs ) -> nn.Module: """Update the classifier.""" in_features = get_in_feature_dimension(image_classifier) new_img_classifier = build_image_projection_head( opts, in_dim=in_features, out_dim=projection_dim ) return new_img_classifier ================================================ FILE: corenet/modeling/models/segmentation/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/segmentation/base_seg.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict import torch from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder @MODEL_REGISTRY.register(name="__base__", type="segmentation") class BaseSegmentation(BaseAnyNNModel): """Base class for segmentation networks. Args: opts: Command-line arguments encoder: Image classification network """ def __init__(self, opts, encoder: BaseImageEncoder, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.lr_multiplier = getattr(opts, "model.segmentation.lr_multiplier") assert isinstance( encoder, BaseImageEncoder ), "encoder should be an instance of BaseEncoder" self.encoder: BaseImageEncoder = encoder self.default_norm = getattr(opts, "model.normalization.name") self.opts = opts @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add segmentation model specific arguments""" if cls != BaseSegmentation: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.segmentation.name", type=str, default=None, help="Segmentation model name. Defaults to None.", ) group.add_argument( "--model.segmentation.n-classes", type=int, # FIXME: In another PR make this default value to None and update configs. default=21, help="Number of classes in the dataset. Defaults to 21.", ) group.add_argument( "--model.segmentation.pretrained", type=str, default=None, help="Path of the pretrained segmentation model. Useful for evaluation", ) group.add_argument( "--model.segmentation.lr-multiplier", type=float, default=1.0, help="Multiply the learning rate in segmentation network (e.g., decoder) by this factor." "Defaults to 1.0.", ) group.add_argument( "--model.segmentation.classifier-dropout", type=float, default=0.1, help="Dropout rate in classifier", ) group.add_argument( "--model.segmentation.use-aux-head", action="store_true", help="Use auxiliary output", ) group.add_argument( "--model.segmentation.aux-dropout", default=0.1, type=float, help="Dropout in auxiliary branch", ) group.add_argument( "--model.segmentation.output-stride", type=int, default=None, help="Output stride in classification network", ) group.add_argument( "--model.segmentation.replace-stride-with-dilation", action="store_true", help="Replace stride with dilation", ) group.add_argument( "--model.segmentation.activation.name", default=None, type=str, help="Non-linear function type", ) group.add_argument( "--model.segmentation.activation.inplace", action="store_true", help="Inplace non-linear functions", ) group.add_argument( "--model.segmentation.activation.neg-slope", default=0.1, type=float, help="Negative slope in leaky relu", ) group.add_argument( "--model.segmentation.freeze-batch-norm", action="store_true", help="Freeze batch norm layers", ) group.add_argument( "--model.segmentation.use-level5-exp", action="store_true", default=False, help="Use output of Level 5 expansion layer in base feature extractor", ) group.add_argument( "--model.segmentation.finetune-pretrained-model", action="store_true", default=False, help="Finetune a pretrained segmentation model. Defaults to False.", ) group.add_argument( "--model.segmentation.n-pretrained-classes", type=int, default=None, help="Number of classes in the pre-trained segmentation model. " "Defaults to None.", ) group.add_argument( "--model.segmentation.norm-layer", type=str, default="batch_norm", help="Normalization layer for segmentation. Defaults to batch_norm.", ) return parser def maybe_seg_norm_layer(self): seg_norm_layer = getattr(self.opts, "model.segmentation.norm_layer") if seg_norm_layer is not None: # update the default norm layer setattr(self.opts, "model.normalization.name", seg_norm_layer) def set_default_norm_layer(self): setattr(self.opts, "model.normalization.name", self.default_norm) def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes. Child classes must override it if functionality is different. """ img_channels = 3 height = 224 width = 224 n_classes = 10 img_tensor = torch.randn( batch_size, img_channels, height, width, dtype=torch.float ) label_tensor = torch.randint( low=0, high=n_classes, size=(batch_size, height, width) ).long() return {"samples": img_tensor, "targets": label_tensor} def update_classifier(self, opts, n_classes: int) -> None: """This function updates the classification layer in a model. Useful for finetuning purposes.""" raise NotImplementedError @classmethod def set_model_specific_opts_before_model_building( cls, opts: argparse.Namespace, *args, **kwargs ) -> Dict[str, Any]: seg_act_fn = getattr(opts, "model.segmentation.activation.name") if seg_act_fn is not None: # Override the general activation arguments default_act_fn = getattr(opts, "model.activation.name", "relu") default_act_inplace = getattr(opts, "model.activation.inplace", False) default_act_neg_slope = getattr(opts, "model.activation.neg_slope", 0.1) setattr(opts, "model.activation.name", seg_act_fn) setattr( opts, "model.activation.inplace", getattr(opts, "model.segmentation.activation.inplace", False), ) setattr( opts, "model.activation.neg_slope", getattr(opts, "model.segmentation.activation.neg_slope", 0.1), ) return { "model.activation.name": default_act_fn, "model.activation.inplace": default_act_inplace, "model.activation.neg_slope": default_act_neg_slope, } return {} # TODO: Find models and configurations that uses `set_model_specific_opts_before_model_building` and # `unset_model_specific_opts_after_model_building` functions. Find a more explicit way of satisfying this requirement, # such as namespacing config entries in a more composable way so that we no longer have conflicting config entries. def set_model_specific_opts_before_model_building( opts: argparse.Namespace, ) -> Dict[str, Any]: """Override library-level defaults with model-specific default values. Args: opts: Command-line arguments Returns: A dictionary containing the name of arguments that are updated along with their original values. This dictionary is used in `unset_model_specific_opts_after_model_building` function to unset the model-specific to library-specific defaults. """ seg_act_fn = getattr(opts, "model.segmentation.activation.name") if seg_act_fn is not None: # Override the general activation arguments default_act_fn = getattr(opts, "model.activation.name", "relu") default_act_inplace = getattr(opts, "model.activation.inplace", False) default_act_neg_slope = getattr(opts, "model.activation.neg_slope", 0.1) setattr(opts, "model.activation.name", seg_act_fn) setattr( opts, "model.activation.inplace", getattr(opts, "model.segmentation.activation.inplace", False), ) setattr( opts, "model.activation.neg_slope", getattr(opts, "model.segmentation.activation.neg_slope", 0.1), ) return { "model.activation.name": default_act_fn, "model.activation.inplace": default_act_inplace, "model.activation.neg_slope": default_act_neg_slope, } return {} def unset_model_specific_opts_after_model_building( opts: argparse.Namespace, default_opts_info: Dict[str, Any], *ars, **kwargs ) -> None: """Given command-line arguments and a mapping of opts that needs to be unset, this function unsets the library-level defaults that were over-ridden previously in `set_model_specific_opts_before_model_building`. """ assert isinstance(default_opts_info, dict), ( f"Please ensure set_model_specific_opts_before_model_building() " f"returns a dict." ) for k, v in default_opts_info.items(): setattr(opts, k, v) ================================================ FILE: corenet/modeling/models/segmentation/enc_dec.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional, Tuple, Union from torch import Tensor from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model from corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder from corenet.modeling.models.segmentation.base_seg import ( BaseSegmentation, set_model_specific_opts_before_model_building, unset_model_specific_opts_after_model_building, ) @MODEL_REGISTRY.register(name="encoder_decoder", type="segmentation") class SegEncoderDecoder(BaseSegmentation): """ This class defines a encoder-decoder architecture for the task of semantic segmentation. Different segmentation heads (e.g., PSPNet and DeepLabv3) can be used Args: opts: command-line arguments encoder (BaseImageEncoder): Backbone network (e.g., MobileViT or ResNet) """ def __init__( self, opts, encoder: BaseImageEncoder, seg_head, *args, **kwargs ) -> None: super().__init__(opts=opts, encoder=encoder) # delete layers that are not required in segmentation network self.encoder.classifier = None use_l5_exp = getattr(opts, "model.segmentation.use_level5_exp") if not use_l5_exp: self.encoder.conv_1x1_exp = None self.maybe_seg_norm_layer() self.seg_head = seg_head self.use_l5_exp = use_l5_exp self.set_default_norm_layer() def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs ): """This function separates the parameters for backbone and segmentation head, so that different learning rates can be used for backbone and segmentation head """ if getattr(self.encoder, "enable_layer_wise_lr_decay"): encoder_params, enc_lr_mult = self.encoder.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="encoder.", *args, **kwargs, ) else: encoder_params, enc_lr_mult = self.encoder.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="encoder.", *args, **kwargs, ) decoder_params, dec_lr_mult = self.seg_head.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, module_name="seg_head.", *args, **kwargs, ) total_params = sum([p.numel() for p in self.parameters()]) encoder_params_count = sum([p.numel() for p in self.encoder.parameters()]) decoder_params_count = sum([p.numel() for p in self.seg_head.parameters()]) assert total_params == encoder_params_count + decoder_params_count, ( "Total network parameters are not equal to " "the sum of encoder and decoder. " "{} != {} + {}".format( total_params, encoder_params_count, decoder_params_count ) ) return encoder_params + decoder_params, enc_lr_mult + dec_lr_mult def forward( self, x: Tensor, *args, **kwargs ) -> Union[Tuple[Tensor, Tensor], Tensor, Dict]: enc_end_points: Dict = self.encoder.extract_end_points_all( x, use_l5=True, use_l5_exp=self.use_l5_exp ) if "augmented_tensor" in enc_end_points: output_dict = { "augmented_tensor": enc_end_points.pop("augmented_tensor"), "segmentation_output": self.seg_head( enc_out=enc_end_points, *args, **kwargs ), } return output_dict else: return self.seg_head(enc_out=enc_end_points, *args, **kwargs) def update_classifier(self, opts, n_classes: int) -> None: """ This function updates the classification layer in a model. Useful for finetuning purposes. """ if hasattr(self.seg_head, "update_classifier"): self.seg_head.update_classifier(opts, n_classes) @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: output_stride = getattr(opts, "model.segmentation.output_stride", None) image_encoder = get_model( opts, category="classification", output_stride=output_stride, *args, **kwargs, ) default_opt_info = set_model_specific_opts_before_model_building(opts) use_l5_exp = getattr(opts, "model.segmentation.use_level5_exp") seg_head = get_model( opts=opts, category="segmentation_head", model_name=getattr(opts, "model.segmentation.seg_head"), enc_conf=image_encoder.model_conf_dict, use_l5_exp=use_l5_exp, *args, **kwargs, ) seg_model = cls(opts, encoder=image_encoder, seg_head=seg_head, *args, **kwargs) unset_model_specific_opts_after_model_building( opts, default_opts_info=default_opt_info ) if getattr(opts, "model.segmentation.freeze_batch_norm"): cls.freeze_norm_layers(opts, model=seg_model) return seg_model ================================================ FILE: corenet/modeling/models/segmentation/heads/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/segmentation/heads/base_seg_head.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional, Tuple, Union from torch import Tensor, nn from corenet.modeling.layers import ConvLayer2d, Dropout2d, UpSample from corenet.modeling.misc.common import parameter_list from corenet.modeling.misc.init_utils import initialize_weights from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel from corenet.utils import logger @MODEL_REGISTRY.register(name="__base__", type="segmentation_head") class BaseSegHead(BaseAnyNNModel): """ Base class for segmentation heads """ def __init__( self, opts, enc_conf: dict, use_l5_exp: Optional[bool] = False, *args, **kwargs ): enc_ch_l5_exp_out = _check_out_channels(enc_conf, "exp_before_cls") enc_ch_l5_out = _check_out_channels(enc_conf, "layer5") enc_ch_l4_out = _check_out_channels(enc_conf, "layer4") enc_ch_l3_out = _check_out_channels(enc_conf, "layer3") enc_ch_l2_out = _check_out_channels(enc_conf, "layer2") enc_ch_l1_out = _check_out_channels(enc_conf, "layer1") n_seg_classes = getattr(opts, "model.segmentation.n_classes") if n_seg_classes is None: logger.error( "Please specify number of segmentation classes using --model.segmentation.n-classes. Got None." ) super().__init__(opts, *args, **kwargs) self.use_l5_exp = use_l5_exp self.enc_l5_exp_channels = enc_ch_l5_exp_out self.enc_l5_channels = enc_ch_l5_out self.enc_l4_channels = enc_ch_l4_out self.enc_l3_channels = enc_ch_l3_out self.enc_l2_channels = enc_ch_l2_out self.enc_l1_channels = enc_ch_l1_out self.n_seg_classes = n_seg_classes self.lr_multiplier = getattr(opts, "model.segmentation.lr_multiplier", 1.0) self.classifier_dropout = getattr( opts, "model.segmentation.classifier_dropout", 0.1 ) self.output_stride = getattr(opts, "model.segmentation.output_stride", 16) self.aux_head = None if getattr(opts, "model.segmentation.use_aux_head", False): drop_aux = getattr(opts, "model.segmentation.aux_dropout", 0.1) inner_channels = max(int(self.enc_l4_channels // 4), 128) self.aux_head = nn.Sequential( ConvLayer2d( opts=opts, in_channels=self.enc_l4_channels, out_channels=inner_channels, kernel_size=3, stride=1, use_norm=True, use_act=True, bias=False, groups=1, ), Dropout2d(drop_aux), ConvLayer2d( opts=opts, in_channels=inner_channels, out_channels=self.n_seg_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, groups=1, ), ) self.upsample_seg_out = None if self.output_stride != 1.0: self.upsample_seg_out = UpSample( scale_factor=self.output_stride, mode="bilinear", align_corners=True ) def forward_aux_head(self, enc_out: Dict) -> Tensor: aux_out = self.aux_head(enc_out["out_l4"]) return aux_out def forward_seg_head(self, enc_out: Dict) -> Tensor: raise NotImplementedError def forward(self, enc_out: Dict, *args, **kwargs) -> Union[Tensor, Tuple[Tensor]]: out = self.forward_seg_head(enc_out=enc_out) if self.upsample_seg_out is not None: # resize the mask based on given size mask_size = kwargs.get("orig_size", None) if mask_size is not None: self.upsample_seg_out.scale_factor = None self.upsample_seg_out.size = mask_size out = self.upsample_seg_out(out) if self.aux_head is not None and self.training: aux_out = self.forward_aux_head(enc_out=enc_out) return out, aux_out return out def reset_head_parameters(self, opts) -> None: # weight initialization initialize_weights(opts=opts, modules=self.modules()) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add segmentation head specific arguments""" group = parser.add_argument_group( title="Segmentation head arguments", description="Segmentation head arguments", ) group.add_argument( "--model.segmentation.seg-head", type=str, default=None, help="Segmentation head", ) return parser def get_trainable_parameters( self, weight_decay: float = 0.0, no_decay_bn_filter_bias: bool = False, *args, **kwargs ): param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs ) return param_list, [self.lr_multiplier] * len(param_list) def update_classifier(self, opts, n_classes: int) -> None: """ This function updates the classification layer in a model. Useful for finetuning purposes. """ raise NotImplementedError @classmethod def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel: return cls(opts, *args, **kwargs) def _check_out_channels(config: dict, layer_name: str) -> int: enc_ch_l: dict = config.get(layer_name, None) if enc_ch_l is None or not enc_ch_l: logger.error( "Encoder does not define input-output mapping for {}: Got: {}".format( layer_name, config ) ) enc_ch_l_out = enc_ch_l.get("out", None) if enc_ch_l_out is None or not enc_ch_l_out: logger.error( "Output channels are not defined in {} of the encoder. Got: {}".format( layer_name, enc_ch_l ) ) return enc_ch_l_out ================================================ FILE: corenet/modeling/models/segmentation/heads/deeplabv3.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional, Tuple import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers import ConvLayer2d from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead from corenet.modeling.modules import ASPP from corenet.options.parse_args import JsonValidator from corenet.utils import logger @MODEL_REGISTRY.register(name="deeplabv3", type="segmentation_head") class DeeplabV3(BaseSegHead): """ `DeepLabv3 `_ segmentation head. Args: opts: Command-line arguments. enc_conf: Image encoder's input-output configuration at each spatial level. use_l5_exp: Deeplabv3 segmentation head uses features from level5 of the image encoder. However, some of the models (e.g., MobileNetv3) have expansion layers at level5 of the image encoder. Features from such layers can be used by setting 'use_l5_exp=True'. aspp_in_channels: The number of channels in the input to the ASPP module. The default behavior is None, i.e., determine automatically from image encoder's configuration. ...note: Image encoder's configuration is a mapping of the form { "conv_1": {"in": in_features_1, "out": out_features_1}, "layer1": {"in": out_features_1, "out": out_features_2}, "layer2": {"in": out_features_2, "out": out_features_3}, "layer3": {"in": out_features_3, "out": out_features_4}, "layer4": {"in": out_features_4, "out": out_features_5}, "layer5": {"in": out_features_5, "out": out_features_6}, "exp_before_cls": {"in": out_features_6, "out": out_features_7}, } When 'use_l5_exp' is enabled, then output of expansion layer before classification (i.e., exp_before_cls) is used. Otherwise, the output of 'layer5' is used. """ def __init__( self, opts, enc_conf: Dict, use_l5_exp: bool = False, aspp_in_channels: Optional[int] = None, *args, **kwargs, ) -> None: atrous_rates = getattr(opts, "model.segmentation.deeplabv3.aspp_rates") out_channels = getattr(opts, "model.segmentation.deeplabv3.aspp_out_channels") is_sep_conv = getattr(opts, "model.segmentation.deeplabv3.aspp_sep_conv") dropout = getattr(opts, "model.segmentation.deeplabv3.aspp_dropout") super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp) self.aspp = nn.Sequential() if aspp_in_channels is None: aspp_in_channels = ( self.enc_l5_channels if not self.use_l5_exp else self.enc_l5_exp_channels ) self.aspp.add_module( name="aspp_layer", module=ASPP( opts=opts, in_channels=aspp_in_channels, out_channels=out_channels, atrous_rates=atrous_rates, is_sep_conv=is_sep_conv, dropout=dropout, ), ) self.classifier = ConvLayer2d( opts=opts, in_channels=out_channels, out_channels=self.n_seg_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ) self.encoder_level5_output_key = "out_l5_exp" if self.use_l5_exp else "out_l5" self.reset_head_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """DeepLabv3 specific arguments""" if cls == DeeplabV3: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.segmentation.deeplabv3.aspp-rates", type=JsonValidator(Tuple[int, int, int]), default=(6, 12, 18), help=f"Atrous rates to be used in the ASPP module in {cls.__name__} segmentation head. \ Defaults to (6, 12, 18).", ) group.add_argument( "--model.segmentation.deeplabv3.aspp-out-channels", type=int, default=256, help=f"Output channels of ASPP module in {cls.__name__} segmentation head. \ Defaults to 256.", ) group.add_argument( "--model.segmentation.deeplabv3.aspp-sep-conv", action="store_true", default=False, help=f"Use separable convolution in the ASPP module in {cls.__name__} segmentation head. \ Defaults to False.", ) group.add_argument( "--model.segmentation.deeplabv3.aspp-dropout", type=float, default=0.1, help=f"Dropout value in the ASPP module in {cls.__name__} segmentation head. \ Defaults to 0.1.", ) return parser def forward_seg_head(self, enc_out: Dict) -> Tensor: """Forward method for DeeplabV3 segmentation head. Args: enc_out: A dictionary containing the feature maps from different spatial levels in the image encoder. Returns: A 4D tensor whose spatial size is 1/output of the input image. ...note: The input to the ASPP module is a low-resolution feature map from image encoder's level 5, optionally with adjusted strides and dilation rates to (1) increase the effective receptive field, and (2) adjust the feature map size to produce high-quality segmentation outputs. """ x = enc_out[self.encoder_level5_output_key] x = self.aspp(x) x = self.classifier(x) return x @MODEL_REGISTRY.register(name="msc_deeplabv3", type="segmentation_head") class MultiScaleDeeplabV3(DeeplabV3): """Multi-scale DeepLabv3. The feature maps with different spatial levels are brought to the same spatial size using pixel shuffle and unshuffle operations. They are then concatenated and projected using a point-wise convolution. Note that CNN-based models typically down-sample the input by a factor of 32, but output stride of level 4 and level 5 are adjusted to obtain feature maps at higher resolution. On the other hand, ViT-based models down-sample the input by a factor of 16. Below is an example shown for multi-scale feature aggregation for image encoder backbone (ViT) whose expected output spatial dimension (before classification layer) is expected to be 1/16th of the the input image's spatial dimension. input (HxW) --> L1 --> L2 (H/2 * W/2) --> L3 (H/4 * W/4) --> L4 (H/8 * W/8) --> L5 (H/16 * W/16) |x0.5 | x1. | 2x | 4x |------> Concat <-------------------------------| ...note: Below is the naming convention that is used in CoreNet for layer and output key name mapping. ------------------------------ Model Layer | Output key name -------------|---------------- layer_1 | out_l1 layer_2 | out_l2 layer_3 | out_l3 layer_4 | out_l4 layer_5 | out_l5 conv_1x1_exp | out_l5_exp ------------------------------ """ def __init__(self, opts, enc_conf: Dict, *args, **kwargs) -> None: expected_encoder_output_keys = ["out_l2", "out_l3", "out_l4", "out_l5"] encoder_level5_output_key = "out_l5" if "use_l5_exp" in kwargs and kwargs["use_l5_exp"]: # some of the models (e.g., MobileNetv3) uses expansion layer in the classification backbone # When enabled, the output of expansion layer is used. expected_encoder_output_keys = ["out_l2", "out_l3", "out_l4", "out_l5_exp"] encoder_level5_output_key = "out_l5_exp" aspp_in_channels = getattr( opts, "model.segmentation.deeplabv3.aspp_in_channels" ) super().__init__( opts, enc_conf, aspp_in_channels=aspp_in_channels, *args, **kwargs ) proj_in_channels = ( # Increase in latent dimension due to pixel shuffle. (self.enc_l2_channels * 4) + (self.enc_l3_channels) # decrease in latent dimension due to pixel unshuffle. + (self.enc_l4_channels // 4) + ( (self.enc_l5_channels // 16) if encoder_level5_output_key == "out_l5" else (self.enc_l5_exp_channels // 16) ) ) self.msc_fusion = ConvLayer2d( opts, in_channels=proj_in_channels, # The output of multi-scale fusion block is fed to ASPP. Therefore, # the output channels of this block is equal to input channels in the ASPP block. out_channels=aspp_in_channels, bias=False, kernel_size=1, use_norm=True, use_act=True, ) if self.upsample_seg_out is not None: # The feature maps from different levels are fused at spatial level 3 (or L3) whose spatial size is # 1/4th of the original input image. Therefore, the output of this block should be upsampled by 4x # inside the 'forward' method. output_upsample_factor = getattr( opts, "model.segmentation.deeplabv3.output_upsample_factor" ) if output_upsample_factor is None: logger.error( f"Please specify --model.segmentation.deeplabv3.output-upsample-factor in {self.__class__.__name__}." ) self.upsample_seg_out.scale_factor = output_upsample_factor self.expected_encoder_output_keys = expected_encoder_output_keys self.encoder_level5_output_key = encoder_level5_output_key self.reset_head_parameters(opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """MultiScaleDeeplabV3 specific arguments""" if cls == MultiScaleDeeplabV3: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.segmentation.deeplabv3.aspp-in-channels", type=int, default=512, help=f"Input channels of the ASPP module. This is only used in {cls.__name__}. \ Defaults to 512.", ) group.add_argument( "--model.segmentation.deeplabv3.output-upsample-factor", type=int, default=None, help=f"Output stide of the image encoder. This argument is used on {cls.__name__}. \ Default value is None.", ) return parser def forward_seg_head(self, enc_out: Dict) -> Tensor: """Forward method for MultiScaleDeeplabV3 segmentation head. Args: enc_out: A dictionary containing the feature maps from different spatial levels in the image encoder. Returns: A 4D tensor whose spatial size is 1/4th of the input image. ...note: Often times, strides of a model are adjusted to produce a high resolution feature map. In such cases, the spatial dimensions from different levels may be different than the expected size. To address this, we dynamically check the output size of a given level is equal to output of level 3 or not. If not, feature map is interpolated using bilinear interpolation to the same size as level 3. """ if not set(self.expected_encoder_output_keys).issubset(enc_out.keys()): logger.error( f"{self.__class__.__name__} requires featuers from {self.expected_encoder_output_keys} levels \ for multi-scale fusion, but got only following levels: {enc_out.keys()}." ) # encoder outputs are in [batch, channel, height, width] format level3_spatial_dims = enc_out["out_l3"].shape[2:] out_l2_to_l3 = F.pixel_unshuffle(enc_out["out_l2"], downscale_factor=2) if out_l2_to_l3.shape[2:] != level3_spatial_dims: out_l2_to_l3 = F.interpolate( out_l2_to_l3, size=list(level3_spatial_dims), mode="bilinear", align_corners=True, ) out_l3 = enc_out["out_l3"] out_l4_to_l3 = F.pixel_shuffle(enc_out["out_l4"], upscale_factor=2) if out_l4_to_l3.shape[2:] != level3_spatial_dims: out_l4_to_l3 = F.interpolate( out_l4_to_l3, size=list(level3_spatial_dims), mode="bilinear", align_corners=True, ) out_l5_to_l3 = F.pixel_shuffle( enc_out[self.encoder_level5_output_key], upscale_factor=4 ) if out_l5_to_l3.shape[2:] != level3_spatial_dims: out_l5_to_l3 = F.interpolate( out_l5_to_l3, size=list(level3_spatial_dims), mode="bilinear", align_corners=True, ) out = torch.cat([out_l2_to_l3, out_l3, out_l4_to_l3, out_l5_to_l3], dim=1) out = self.msc_fusion(out) out = super().forward_seg_head({"out_l5": out}) return out ================================================ FILE: corenet/modeling/models/segmentation/heads/pspnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional from torch import Tensor from corenet.modeling.layers import ConvLayer2d from corenet.modeling.misc.init_utils import initialize_weights from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead from corenet.modeling.modules import PSP @MODEL_REGISTRY.register(name="pspnet", type="segmentation_head") class PSPNet(BaseSegHead): """ This class defines the segmentation head in `PSPNet architecture `_ Args: opts: command-line arguments enc_conf (Dict): Encoder input-output configuration at each spatial level use_l5_exp (Optional[bool]): Use features from expansion layer in Level5 in the encoder """ def __init__( self, opts, enc_conf: dict, use_l5_exp: Optional[bool] = False, *args, **kwargs ) -> None: psp_out_channels = getattr( opts, "model.segmentation.pspnet.psp_out_channels", 512 ) psp_pool_sizes = getattr( opts, "model.segmentation.pspnet.psp_pool_sizes", [1, 2, 3, 6] ) psp_dropout = getattr(opts, "model.segmentation.pspnet.psp_dropout", 0.1) super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp) psp_in_channels = ( self.enc_l5_channels if not self.use_l5_exp else self.enc_l5_exp_channels ) self.psp_layer = PSP( opts=opts, in_channels=psp_in_channels, out_channels=psp_out_channels, pool_sizes=psp_pool_sizes, dropout=psp_dropout, ) self.classifier = ConvLayer2d( opts=opts, in_channels=psp_out_channels, out_channels=self.n_seg_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ) self.reset_head_parameters(opts=opts) def update_classifier(self, opts, n_classes: int) -> None: """ This function updates the classification layer in a model. Useful for finetuning purposes. """ in_channels = self.classifier.in_channels conv_layer = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=n_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ) initialize_weights(opts, modules=conv_layer) self.classifier = conv_layer @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.segmentation.pspnet.psp-pool-sizes", type=int, nargs="+", default=[1, 2, 3, 6], help="Pool sizes in the PSPNet module", ) group.add_argument( "--model.segmentation.pspnet.psp-out-channels", type=int, default=512, help="Output channels of PSPNet module", ) group.add_argument( "--model.segmentation.pspnet.psp-dropout", type=float, default=0.1, help="Dropout in the PSPNet module", ) return parser def forward_seg_head(self, enc_out: Dict) -> Tensor: # low resolution features x = enc_out["out_l5_exp"] if self.use_l5_exp else enc_out["out_l5"] # Apply PSP layer x = self.psp_layer(x) out = self.classifier(x) return out ================================================ FILE: corenet/modeling/models/segmentation/heads/simple_seg_head.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Optional from torch import Tensor from corenet.modeling.layers import ConvLayer2d from corenet.modeling.models import MODEL_REGISTRY from corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead @MODEL_REGISTRY.register(name="simple_seg_head", type="segmentation_head") class SimpleSegHead(BaseSegHead): """ This class defines the simple segmentation head with merely a classification layer. This is useful for performing linear probling on segmentation task. Args: opts: command-line arguments enc_conf (Dict): Encoder input-output configuration at each spatial level use_l5_exp (Optional[bool]): Use features from expansion layer in Level5 in the encoder """ def __init__( self, opts, enc_conf: Dict, use_l5_exp: Optional[bool] = False, *args, **kwargs ) -> None: super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp) in_channels = ( self.enc_l5_channels if not self.use_l5_exp else self.enc_l5_exp_channels ) self.classifier = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=self.n_seg_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ) self.reset_head_parameters(opts=opts) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: return parser def forward_seg_head(self, enc_out: Dict) -> Tensor: x = enc_out["out_l5_exp"] if self.use_l5_exp else enc_out["out_l5"] # classify x = self.classifier(x) return x ================================================ FILE: corenet/modeling/models/video_classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: corenet/modeling/models/video_classification/base_video_encoder.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.constants import SUPPORTED_VIDEO_CLIP_VOTING_FN from corenet.modeling.misc.init_utils import initialize_weights from corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel @MODEL_REGISTRY.register(name="__base__", type="video_classification") class BaseVideoEncoder(BaseAnyNNModel): """Base class for the video backbones Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: super().__init__(opts, *args, **kwargs) self.round_nearest = 8 self.model_conf_dict = dict() self.inference_mode = getattr( opts, "model.video_classification.inference_mode", False ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != BaseVideoEncoder: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--model.video-classification.classifier-dropout", type=float, default=0.0, help="Dropout rate in classifier", ) group.add_argument( "--model.video-classification.name", type=str, default="mobilevit", help="Model name", ) group.add_argument( "--model.video-classification.n-classes", type=int, default=1000, help="Number of classes in the dataset", ) group.add_argument( "--model.video-classification.pretrained", type=str, default=None, help="Path of the pretrained backbone", ) group.add_argument( "--model.video-classification.freeze-batch-norm", action="store_true", help="Freeze batch norm layers", ) group.add_argument( "--model.video-classification.activation.name", default=None, type=str, help="Non-linear function type", ) group.add_argument( "--model.video-classification.activation.inplace", action="store_true", help="Inplace non-linear functions", ) group.add_argument( "--model.video-classification.activation.neg-slope", default=0.1, type=float, help="Negative slope in leaky relu", ) group.add_argument( "--model.video-classification.clip-out-voting-fn", type=str, default="sum", choices=SUPPORTED_VIDEO_CLIP_VOTING_FN, help="How to fuse the outputs of different clips in a video", ) group.add_argument( "--model.video-classification.inference-mode", action="store_true", help="Inference mode", ) return parser @staticmethod def reset_module_parameters(opts, module) -> None: """Reset parameters for a specific module in the network""" initialize_weights(opts=opts, modules=module) ================================================ FILE: corenet/modeling/modules/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # isort: skip_file from corenet.modeling.modules.base_module import BaseModule from corenet.modeling.modules.squeeze_excitation import SqueezeExcitation from corenet.modeling.modules.mobilenetv2 import InvertedResidual, InvertedResidualSE from corenet.modeling.modules.resnet_modules import ( BasicResNetBlock, BottleneckResNetBlock, ) from corenet.modeling.modules.aspp_block import ASPP from corenet.modeling.modules.transformer import TransformerEncoder from corenet.modeling.modules.windowed_transformer import WindowedTransformerEncoder from corenet.modeling.modules.pspnet_module import PSP from corenet.modeling.modules.mobilevit_block import MobileViTBlock, MobileViTBlockv2 from corenet.modeling.modules.feature_pyramid import FeaturePyramidNetwork from corenet.modeling.modules.ssd_heads import SSDHead, SSDInstanceHead from corenet.modeling.modules.efficientnet import EfficientNetBlock from corenet.modeling.modules.mobileone_block import MobileOneBlock, RepLKBlock from corenet.modeling.modules.swin_transformer_block import ( SwinTransformerBlock, PatchMerging, Permute, ) from corenet.modeling.modules.regnet_modules import XRegNetBlock, AnyRegNetStage from corenet.modeling.modules.flash_transformer import FlashTransformerEncoder __all__ = [ "InvertedResidual", "InvertedResidualSE", "BasicResNetBlock", "BottleneckResNetBlock", "ASPP", "TransformerEncoder", "WindowedTransformerEncoder", "SqueezeExcitation", "PSP", "MobileViTBlock", "MobileViTBlockv2", "MobileOneBlock", "RepLKBlock", "FeaturePyramidNetwork", "SSDHead", "SSDInstanceHead", "EfficientNetBlock", "SwinTransformerBlock", "PatchMerging", "Permute", "XRegNetBlock", "AnyRegNetStage", "FlashTransformerEncoder", ] ================================================ FILE: corenet/modeling/modules/aspp_block.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple import torch import torch.nn.functional as F from torch import Tensor, nn from corenet.modeling.layers import ( AdaptiveAvgPool2d, BaseLayer, ConvLayer2d, Dropout2d, SeparableConv2d, ) from corenet.modeling.modules import BaseModule from corenet.utils import logger from corenet.utils.ddp_utils import is_master class ASPP(BaseModule): """ ASPP module defined in DeepLab papers, `here `_ and `here `_ Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)` atrous_rates (Tuple[int]): atrous rates for different branches. is_sep_conv (Optional[bool]): Use separable convolution instead of standaard conv. Default: False dropout (Optional[float]): Apply dropout. Default is 0.0 Shape: - Input: :math:`(N, C_{in}, H, W)` - Output: :math:`(N, C_{out}, H, W)` """ def __init__( self, opts, in_channels: int, out_channels: int, atrous_rates: Tuple[int], is_sep_conv: Optional[bool] = False, dropout: Optional[float] = 0.0, *args, **kwargs ) -> None: in_proj = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, use_norm=True, use_act=True, ) out_proj = ConvLayer2d( opts=opts, in_channels=5 * out_channels, out_channels=out_channels, kernel_size=1, stride=1, use_norm=True, use_act=True, ) aspp_layer = ASPPSeparableConv2d if is_sep_conv else ASPPConv2d assert len(atrous_rates) == 3 modules = [in_proj] modules.extend( [ aspp_layer( opts=opts, in_channels=in_channels, out_channels=out_channels, dilation=rate, ) for rate in atrous_rates ] ) modules.append( ASPPPooling(opts=opts, in_channels=in_channels, out_channels=out_channels) ) if not (0.0 <= dropout < 1.0): if is_master(opts): logger.warning( "Dropout value in {} should be between 0 and 1. Got: {}. Setting it to 0.0".format( self.__class__.__name__, dropout ) ) dropout = 0.0 super().__init__() self.convs = nn.ModuleList(modules) self.project = out_proj self.in_channels = in_channels self.out_channels = out_channels self.atrous_rates = atrous_rates self.is_sep_conv_layer = is_sep_conv self.n_atrous_branches = len(atrous_rates) self.dropout_layer = Dropout2d(p=dropout) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: out = [] for conv in self.convs: out.append(conv(x)) out = torch.cat(out, dim=1) out = self.project(out) out = self.dropout_layer(out) return out def __repr__(self): return "{}(in_channels={}, out_channels={}, atrous_rates={}, is_aspp_sep={}, dropout={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.atrous_rates, self.is_sep_conv_layer, self.dropout_layer.p, ) class ASPPConv2d(ConvLayer2d): """ Convolution with a dilation for the ASPP module Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)` dilation (int): Dilation rate Shape: - Input: :math:`(N, C_{in}, H, W)` - Output: :math:`(N, C_{out}, H, W)` """ def __init__( self, opts, in_channels: int, out_channels: int, dilation: int, *args, **kwargs ) -> None: super().__init__( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=1, use_norm=True, use_act=True, dilation=dilation, ) def adjust_atrous_rate(self, rate: int) -> None: """This function allows to adjust the dilation rate""" self.block.conv.dilation = rate # padding is the same here # see ConvLayer to see the method for computing padding self.block.conv.padding = rate class ASPPSeparableConv2d(SeparableConv2d): """ Separable Convolution with a dilation for the ASPP module Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)` dilation (int): Dilation rate Shape: - Input: :math:`(N, C_{in}, H, W)` - Output: :math:`(N, C_{out}, H, W)` """ def __init__( self, opts, in_channels: int, out_channels: int, dilation: int, *args, **kwargs ) -> None: super().__init__( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=1, dilation=dilation, use_norm=True, use_act=True, ) def adjust_atrous_rate(self, rate: int) -> None: """This function allows to adjust the dilation rate""" self.dw_conv.block.conv.dilation = rate # padding is the same here # see ConvLayer to see the method for computing padding self.dw_conv.block.conv.padding = rate class ASPPPooling(BaseLayer): """ ASPP pooling layer Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)` Shape: - Input: :math:`(N, C_{in}, H, W)` - Output: :math:`(N, C_{out}, H, W)` """ def __init__( self, opts, in_channels: int, out_channels: int, *args, **kwargs ) -> None: super().__init__() self.aspp_pool = nn.Sequential() self.aspp_pool.add_module( name="global_pool", module=AdaptiveAvgPool2d(output_size=1) ) self.aspp_pool.add_module( name="conv_1x1", module=ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, use_norm=True, use_act=True, ), ) self.in_channels = in_channels self.out_channels = out_channels def forward(self, x: Tensor) -> Tensor: x_size = x.shape[-2:] x = self.aspp_pool(x) x = F.interpolate(x, size=x_size, mode="bilinear", align_corners=False) return x def __repr__(self): return "{}(in_channels={}, out_channels={})".format( self.__class__.__name__, self.in_channels, self.out_channels ) ================================================ FILE: corenet/modeling/modules/base_module.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any import torch from torch import Tensor, nn class BaseModule(nn.Module): """Base class for all modules""" def __init__(self, *args, **kwargs): super(BaseModule, self).__init__() def forward(self, x: Any, *args, **kwargs) -> Any: raise NotImplementedError def __repr__(self): return "{}".format(self.__class__.__name__) ================================================ FILE: corenet/modeling/modules/efficientnet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from torch import Tensor, nn from corenet.modeling.layers import StochasticDepth from corenet.modeling.modules import InvertedResidualSE class EfficientNetBlock(InvertedResidualSE): """ This class implements a variant of the inverted residual block with squeeze-excitation unit, as described in `MobileNetv3 `_ paper. This variant includes stochastic depth, as used in `EfficientNet `_ paper. Args: stochastic_depth_prob: float, For other arguments, refer to the parent class. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})` - Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ def __init__(self, stochastic_depth_prob: float, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode="row") def forward(self, x: Tensor, *args, **kwargs) -> Tensor: y = self.block(x) if self.use_res_connect: # Pass the output through the stochastic layer module, potentially zeroing it. y = self.stochastic_depth(y) # residual connection y = y + x return y def __repr__(self) -> str: return ( super().__repr__()[:-1] + f", stochastic_depth_prob={self.stochastic_depth.p})" ) ================================================ FILE: corenet/modeling/modules/fastvit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple, Union import torch import torch.nn as nn from corenet.modeling.layers import ConvLayer2d, MultiHeadAttention, StochasticDepth from corenet.modeling.layers.normalization.batch_norm import BatchNorm2d from corenet.modeling.modules import BaseModule from corenet.modeling.modules.mobileone_block import MobileOneBlock, RepLKBlock def convolutional_stem( opts: argparse.Namespace, in_channels: int, out_channels: int ) -> nn.Sequential: """ Build convolutional stem with MobileOne blocks. Args: opts: Command line arguments. in_channels: Number of input channels. out_channels: Number of output channels. Returns: nn.Sequential object with stem elements. """ inference_mode = getattr(opts, "model.classification.fastvit.inference_mode") return nn.Sequential( MobileOneBlock( opts, in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=2, padding=1, groups=1, inference_mode=inference_mode, use_se=False, num_conv_branches=1, ), MobileOneBlock( opts, in_channels=out_channels, out_channels=out_channels, kernel_size=3, stride=2, padding=1, groups=out_channels, inference_mode=inference_mode, use_se=False, num_conv_branches=1, ), MobileOneBlock( opts, in_channels=out_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0, groups=1, inference_mode=inference_mode, use_se=False, num_conv_branches=1, ), ) class PatchEmbed(BaseModule): """ Convolutional Patch embedding layer. Args: opts: Command line arguments. patch_size: Patch size for embedding computation. stride: Stride for convolutional embedding layer. in_channels: Number of channels of input tensor. embed_dim: Number of embedding dimensions. """ def __init__( self, opts: argparse.Namespace, patch_size: int, stride: int, in_channels: int, embed_dim: int, ): super().__init__() inference_mode = getattr(opts, "model.classification.fastvit.inference_mode") block = list() block.append( RepLKBlock( opts, in_channels=in_channels, out_channels=embed_dim, kernel_size=patch_size, stride=stride, groups=in_channels, small_kernel_size=3, inference_mode=inference_mode, ) ) block.append( MobileOneBlock( opts, in_channels=embed_dim, out_channels=embed_dim, kernel_size=1, stride=1, padding=0, groups=1, inference_mode=inference_mode, use_se=False, num_conv_branches=1, ) ) self.proj = nn.Sequential(*block) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H//s, W//s)`, where `s` is the stride provide while instantiating the layer. """ x = self.proj(x) return x class RepMixer(BaseModule): """ Reparameterizable token mixer For more details, please refer to our paper: `FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization` Args: opts: Command line arguments. dim: Input feature map dimension. :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, H, W)`. kernel_size: Kernel size for spatial mixing. Default: 3 use_layer_scale: If True, learnable layer scale is used. Default: ``True`` layer_scale_init_value: Initial value for layer scale. Default: 1e-5 inference_mode: If True, instantiates model in inference mode. Default: ``False`` """ def __init__( self, opts: argparse.Namespace, dim: int, kernel_size: int = 3, use_layer_scale: bool = True, layer_scale_init_value: float = 1e-5, inference_mode: bool = False, ): super().__init__() self.dim = dim self.kernel_size = kernel_size if inference_mode: self.reparam_conv = nn.Conv2d( in_channels=self.dim, out_channels=self.dim, kernel_size=self.kernel_size, stride=1, padding=self.kernel_size // 2, groups=self.dim, bias=True, ) else: self.norm = MobileOneBlock( opts, dim, dim, kernel_size, padding=kernel_size // 2, groups=dim, use_act=False, use_scale_branch=False, num_conv_branches=0, ) self.mixer = MobileOneBlock( opts, dim, dim, kernel_size, padding=kernel_size // 2, groups=dim, use_act=False, ) self.use_layer_scale = use_layer_scale if use_layer_scale: self.layer_scale = nn.Parameter( layer_scale_init_value * torch.ones((dim, 1, 1)), ) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass implements inference logic for module before and after reparameterization. Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ if hasattr(self, "reparam_conv"): x = self.reparam_conv(x) return x else: if self.use_layer_scale: x = x + self.layer_scale * (self.mixer(x) - self.norm(x)) else: x = x + self.mixer(x) - self.norm(x) return x def reparameterize(self) -> None: """ Reparameterize mixer and norm into a single convolutional layer for efficient inference. """ self.mixer.reparameterize() self.norm.reparameterize() if self.use_layer_scale: w = self.mixer.id_tensor + self.layer_scale.unsqueeze(-1) * ( self.mixer.reparam_conv.weight - self.norm.reparam_conv.weight ) b = torch.squeeze(self.layer_scale) * ( self.mixer.reparam_conv.bias - self.norm.reparam_conv.bias ) else: w = ( self.mixer.id_tensor + self.mixer.reparam_conv.weight - self.norm.reparam_conv.weight ) b = self.mixer.reparam_conv.bias - self.norm.reparam_conv.bias self.reparam_conv = nn.Conv2d( in_channels=self.dim, out_channels=self.dim, kernel_size=self.kernel_size, stride=1, padding=self.kernel_size // 2, groups=self.dim, bias=True, ) self.reparam_conv.weight.data = w self.reparam_conv.bias.data = b for para in self.parameters(): para.detach_() self.__delattr__("mixer") self.__delattr__("norm") class ConvFFN(BaseModule): """ Convolutional FFN Module. Args: opts: Command line arguments. in_channels: Number of input channels. hidden_channels: Number of channels after expansion. Default: None out_channels: Number of output channels. Default: None drop: Dropout rate. Default: ``0.0``. """ def __init__( self, opts: argparse.Namespace, in_channels: int, hidden_channels: Optional[int] = None, out_channels: Optional[int] = None, drop: float = 0.0, ): super().__init__() out_channels = out_channels or in_channels hidden_channels = hidden_channels or in_channels self.conv = ConvLayer2d( opts, in_channels=in_channels, out_channels=in_channels, kernel_size=7, padding=3, groups=in_channels, bias=False, use_act=False, ) self.fc1 = ConvLayer2d( opts, in_channels, hidden_channels, kernel_size=1, use_norm=False, bias=True ) self.fc2 = ConvLayer2d( opts, hidden_channels, out_channels, kernel_size=1, use_norm=False, use_act=False, bias=True, ) self.drop = nn.Dropout(drop) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ x = self.conv(x) x = self.fc1(x) x = self.drop(x) x = self.fc2(x) x = self.drop(x) return x class RepMixerBlock(BaseModule): """ Implementation of Metaformer block with RepMixer as token mixer. For more details on Metaformer structure, please refer to: `MetaFormer Is Actually What You Need for Vision `_ Args: opts: Command line arguments. dim: Number of embedding dimensions. kernel_size: Kernel size for repmixer. Default: 3 mlp_ratio: MLP expansion ratio. Default: 4.0 drop: Dropout rate. Default: 0.0 drop_path: Drop path rate. Default: 0.0 use_layer_scale: Flag to turn on layer scale. Default: ``True`` layer_scale_init_value: Layer scale value at initialization. Default: 1e-5 inference_mode: Flag to instantiate block in inference mode. Default: ``False`` """ def __init__( self, opts: argparse.Namespace, dim: int, kernel_size: int = 3, mlp_ratio: float = 4.0, drop: float = 0.0, drop_path: float = 0.0, use_layer_scale: bool = True, layer_scale_init_value: float = 1e-5, inference_mode: bool = False, ): super().__init__() self.token_mixer = RepMixer( opts, dim=dim, kernel_size=kernel_size, use_layer_scale=use_layer_scale, layer_scale_init_value=layer_scale_init_value, inference_mode=inference_mode, ) assert mlp_ratio > 0, "MLP ratio should be greater than 0, found: {}".format( mlp_ratio ) hidden_dim = int(dim * mlp_ratio) self.convffn = ConvFFN( opts, in_channels=dim, hidden_channels=hidden_dim, drop=drop ) self.drop_path = ( StochasticDepth(drop_path, mode="row") if drop_path > 0.0 else nn.Identity() ) self.use_layer_scale = use_layer_scale if use_layer_scale: self.layer_scale = nn.Parameter( layer_scale_init_value * torch.ones((dim, 1, 1)), ) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ if self.use_layer_scale: x = self.token_mixer(x) x = x + self.drop_path(self.layer_scale * self.convffn(x)) else: x = self.token_mixer(x) x = x + self.drop_path(self.convffn(x)) return x class AttentionBlock(BaseModule): """ Implementation of metaformer block with MHSA as token mixer. For more details on Metaformer structure, please refer to: `MetaFormer Is Actually What You Need for Vision `_ Args: opts: Command line arguments. dim: Number of embedding dimensions. mlp_ratio: MLP expansion ratio. Default: 4.0 drop: Dropout rate. Default: 0.0 drop_path: Drop path rate. Default: 0.0 use_layer_scale: Flag to turn on layer scale. Default: ``True`` layer_scale_init_value: Layer scale value at initialization. Default: 1e-5 """ def __init__( self, opts: argparse.Namespace, dim: int, mlp_ratio: float = 4.0, drop: float = 0.0, drop_path: float = 0.0, use_layer_scale: bool = True, layer_scale_init_value: float = 1e-5, ): super().__init__() self.norm = BatchNorm2d(num_features=dim) self.head_dim = 32 num_heads = dim // self.head_dim self.token_mixer = MultiHeadAttention( embed_dim=dim, num_heads=num_heads, bias=False ) assert mlp_ratio > 0, "MLP ratio should be greater than 0, found: {}".format( mlp_ratio ) hidden_dim = int(dim * mlp_ratio) self.convffn = ConvFFN( opts, in_channels=dim, hidden_channels=hidden_dim, drop=drop ) self.drop_path = ( StochasticDepth(drop_path, mode="row") if drop_path > 0.0 else nn.Identity() ) self.use_layer_scale = use_layer_scale if use_layer_scale: self.layer_scale_1 = nn.Parameter( layer_scale_init_value * torch.ones((dim, 1, 1)), ) self.layer_scale_2 = nn.Parameter( layer_scale_init_value * torch.ones((dim, 1, 1)), ) def _apply_mhsa(self, x: torch.Tensor) -> torch.Tensor: """ Perform appropriate reshaping before and after MHSA block. Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ x_norm = self.norm(x) B, C, H, W = x_norm.shape x_norm_reshaped = torch.flatten(x_norm, start_dim=2).transpose( -2, -1 ) # (B, N, C), where N = H * W out = self.token_mixer(x_norm_reshaped) out = out.transpose(-2, -1).reshape(B, C, H, W) return out def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor output from the attention block. """ if self.use_layer_scale: x = x + self.drop_path(self.layer_scale_1 * self._apply_mhsa(x)) x = x + self.drop_path(self.layer_scale_2 * self.convffn(x)) else: x = x + self.drop_path(self._apply_mhsa(x)) x = x + self.drop_path(self.convffn(x)) return x class RepCPE(BaseModule): """ Implementation of reparameterizable conditional positional encoding. For more details refer to paper: `Conditional Positional Encodings for Vision Transformers `_ Args: opts: Command line arguments. in_channels: Number of input channels. embed_dim: Number of embedding dimensions. Default: 768 spatial_shape: Spatial shape of kernel for positional encoding. Default: (7, 7) inference_mode: Flag to instantiate block in inference mode. Default: ``False`` """ def __init__( self, opts: argparse.Namespace, in_channels: int, embed_dim: int = 768, spatial_shape: Union[int, Tuple[int, int]] = (7, 7), inference_mode: bool = False, ): super(RepCPE, self).__init__() if isinstance(spatial_shape, int): spatial_shape = tuple([spatial_shape] * 2) assert isinstance(spatial_shape, Tuple), ( f'"spatial_shape" must by a sequence or int, ' f"get {type(spatial_shape)} instead." ) assert len(spatial_shape) == 2, ( f'Length of "spatial_shape" should be 2, ' f"got {len(spatial_shape)} instead." ) self.spatial_shape = spatial_shape self.embed_dim = embed_dim self.in_channels = in_channels self.groups = embed_dim if inference_mode: self.reparam_conv = nn.Conv2d( in_channels=self.in_channels, out_channels=self.embed_dim, kernel_size=self.spatial_shape, stride=1, padding=int(self.spatial_shape[0] // 2), groups=self.embed_dim, bias=True, ) else: self.pe = ConvLayer2d( opts, in_channels=in_channels, out_channels=embed_dim, kernel_size=spatial_shape, stride=1, padding=int(spatial_shape[0] // 2), use_norm=False, use_act=False, bias=True, groups=embed_dim, ) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass implements inference logic for module before and after reparameterization. Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ if hasattr(self, "reparam_conv"): x = self.reparam_conv(x) return x else: x = self.pe(x) + x return x def reparameterize(self) -> None: """Reparameterize linear branches.""" # Build equivalent Id tensor input_dim = self.in_channels // self.groups kernel_value = torch.zeros( ( self.in_channels, input_dim, self.spatial_shape[0], self.spatial_shape[1], ), dtype=self.pe.block.conv.weight.dtype, device=self.pe.block.conv.weight.device, ) for i in range(self.in_channels): kernel_value[ i, i % input_dim, self.spatial_shape[0] // 2, self.spatial_shape[1] // 2, ] = 1 id_tensor = kernel_value # Reparameterize Id tensor and conv w_final = id_tensor + self.pe.block.conv.weight b_final = self.pe.block.conv.bias # Introduce reparam conv self.reparam_conv = nn.Conv2d( in_channels=self.in_channels, out_channels=self.embed_dim, kernel_size=self.spatial_shape, stride=1, padding=int(self.spatial_shape[0] // 2), groups=self.embed_dim, bias=True, ) self.reparam_conv.weight.data = w_final self.reparam_conv.bias.data = b_final for para in self.parameters(): para.detach_() self.__delattr__("pe") ================================================ FILE: corenet/modeling/modules/feature_pyramid.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, List import torch import torch.nn.functional as F from torch import Tensor, nn from corenet.modeling.layers import ConvLayer2d, norm_layers_tuple from corenet.modeling.misc.init_utils import ( initialize_conv_layer, initialize_norm_layers, ) from corenet.modeling.modules import BaseModule from corenet.utils import logger class FeaturePyramidNetwork(BaseModule): """ This class implements the `Feature Pyramid Network `_ module for object detection. Args: opts: command-line arguments in_channels (List[int]): List of channels at different output strides output_strides (List[int]): Feature maps from these output strides will be used in FPN out_channels (int): Output channels """ def __init__( self, opts, in_channels: List[int], output_strides: List[str], out_channels: int, *args, **kwargs ) -> None: if isinstance(in_channels, int): in_channels = [in_channels] if isinstance(output_strides, int): output_strides = [output_strides] if len(in_channels) != len(output_strides): logger.error( "For {}, we need the length of input_channels to be the same as the length of output stride. " "Got: {} and {}".format( self.__class__.__name__, len(in_channels), len(output_strides) ) ) assert len(in_channels) == len(output_strides) super().__init__(*args, **kwargs) self.proj_layers = nn.ModuleDict() self.nxn_convs = nn.ModuleDict() for os, in_channel in zip(output_strides, in_channels): proj_layer = ConvLayer2d( opts=opts, in_channels=in_channel, out_channels=out_channels, kernel_size=1, bias=False, use_norm=True, use_act=False, ) nxn_conv = ConvLayer2d( opts=opts, in_channels=out_channels, out_channels=out_channels, kernel_size=3, bias=False, use_norm=True, use_act=False, ) self.proj_layers.add_module(name="os_{}".format(os), module=proj_layer) self.nxn_convs.add_module(name="os_{}".format(os), module=nxn_conv) self.num_fpn_layers = len(in_channels) self.out_channels = out_channels self.in_channels = in_channels self.output_strides = output_strides self.reset_weights() def reset_weights(self) -> None: """Resets the weights of FPN layers""" for m in self.modules(): if isinstance(m, nn.Conv2d): initialize_conv_layer(m, init_method="xavier_uniform") elif isinstance(m, norm_layers_tuple): initialize_norm_layers(m) def forward(self, x: Dict[str, Tensor], *args, **kwargs) -> Dict[str, Tensor]: assert len(x) == self.num_fpn_layers # dictionary to store results for fpn fpn_out_dict = {"os_".format(os): None for os in self.output_strides} # process the last output stride os_key = "os_{}".format(self.output_strides[-1]) prev_x = self.proj_layers[os_key](x[os_key]) prev_x = self.nxn_convs[os_key](prev_x) fpn_out_dict[os_key] = prev_x remaining_output_strides = self.output_strides[:-1] # bottom-up processing for os in remaining_output_strides[::-1]: os_key = "os_{}".format(os) # 1x1 conv curr_x = self.proj_layers[os_key](x[os_key]) # upsample prev_x = F.interpolate(prev_x, size=curr_x.shape[-2:], mode="nearest") # add prev_x = curr_x + prev_x prev_x = self.nxn_convs[os_key](prev_x) fpn_out_dict[os_key] = prev_x return fpn_out_dict def __repr__(self): return "{}(in_channels={}, output_strides={} out_channels={})".format( self.__class__.__name__, self.in_channels, self.output_strides, self.out_channels, ) ================================================ FILE: corenet/modeling/modules/flash_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import Optional from torch import Tensor, nn from corenet.modeling.layers import ( Dropout, FlashMultiHeadSelfAttention, Identity, LinearLayer, StochasticDepth, get_normalization_layer, ) from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule from corenet.utils import logger class FlashTransformerEncoder(BaseModule): """Pre-norm `Transformer encoder `_ with `flash attention `_. Args: opts: Command line arguments. in_features: Number of channels in the input. head_dim: Head dimension in multi-head attention. attn_dropout_prob: Dropout rate for attention in multi-head attention. Default: 0.0 qkv_features: Number of features after linear projection in QKV branch in multi-head attention. If none, qkv_features=in_features. Defaults to None. bias: Use bias. Defaults to False. dropout: Dropout rate. Defaults to 0.0. ffn_dropout: Dropout between FFN layers. Defaults to 0.0. ffn_multiplier: Multiplier for controlling the width in Feed-forward network (FFN). Defaults to 4.0. stochastic_dropout: Stochastic dropout setting. Default: 0.0. norm_layer_name: Normalization layer name. Defaults to "layer_norm". divisible_by: Ensure that FFN dimensions are divisible by this factor. Defaults to 16. ...note: * Enabling 'stochastic dropout' by setting 0 < stochastic_dropout < 1 drops the multi-head attention and feed-forward network layers, thus reducing the depth of the network during training. This is also known as `stochastic depth `_. On the other hand, 'dropout' drops the activations and do not change the depth of the network. * 'dropout', 'ffn_dropout', and 'stochastic_dropout' allows to address over-fitting issue. The values of these parameters are dependent on a task and should be chosen empirically. """ def __init__( self, opts: argparse.Namespace, in_features: int, head_dim: int, attn_dropout_prob: float = 0.0, qkv_features: Optional[int] = None, bias: bool = True, dropout: float = 0.0, ffn_dropout: float = 0.0, ffn_multiplier: float = 4.0, stochastic_dropout: float = 0.0, norm_layer_name: str = "layer_norm", divisible_by: int = 16, ) -> None: super().__init__() attn_unit = FlashMultiHeadSelfAttention( in_features=in_features, head_dim=head_dim, attn_dropout_prob=attn_dropout_prob, qkv_features=qkv_features, bias=bias, ) self.pre_norm_mha = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer_name, num_features=in_features ), attn_unit, Dropout(p=dropout), ) ffn_dim = int( math.ceil(in_features * ffn_multiplier / divisible_by) * divisible_by ) self.pre_norm_ffn = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer_name, num_features=in_features ), LinearLayer(in_features=in_features, out_features=ffn_dim, bias=bias), build_activation_layer(opts, num_parameters=1), Dropout(p=ffn_dropout), LinearLayer(in_features=ffn_dim, out_features=in_features, bias=bias), Dropout(p=dropout), ) self.drop_path = Identity() if stochastic_dropout > 0.0: if dropout > 0.0: logger.error( "Stochastic dropout and dropout are mutually exclusive. " "Use either of them, but not both." "Got: {} and {}".format(stochastic_dropout, dropout) ) self.drop_path = StochasticDepth(p=stochastic_dropout, mode="row") def forward(self, x: Tensor) -> Tensor: """Forward function. Args: x: Input tensor of size :math:`(N, S, d)` where :math:`N` is batch size, :math:`S` is the sequence length, and :math:`d` is input embedding dim. Returns: Output tensor of the size as the input. """ x = x + self.drop_path(self.pre_norm_mha(x)) x = x + self.drop_path(self.pre_norm_ffn(x)) return x ================================================ FILE: corenet/modeling/modules/mobilenetv2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional, Union from torch import Tensor, nn from corenet.modeling.layers import ConvLayer2d from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule, SqueezeExcitation from corenet.utils.math_utils import make_divisible class InvertedResidualSE(BaseModule): """ This class implements the inverted residual block with squeeze-excitation unit, as described in `MobileNetv3 `_ paper Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out)` expand_ratio (Union[int, float]): Expand the input channels by this factor in depth-wise conv dilation (Optional[int]): Use conv with dilation. Default: 1 stride (Optional[int]): Use convolutions with a stride. Default: 1 use_se (Optional[bool]): Use squeeze-excitation block. Default: False act_fn_name (Optional[str]): Activation function name. Default: relu se_scale_fn_name (Optional [str]): Scale activation function inside SE unit. Defaults to hard_sigmoid kernel_size (Optional[int]): Kernel size in depth-wise convolution. Defaults to 3. squeeze_factor (Optional[bool]): Squeezing factor in SE unit. Defaults to 4. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})` - Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ def __init__( self, opts, in_channels: int, out_channels: int, expand_ratio: Union[int, float], dilation: Optional[int] = 1, stride: Optional[int] = 1, use_se: Optional[bool] = False, act_fn_name: Optional[str] = "relu", se_scale_fn_name: Optional[str] = "hard_sigmoid", kernel_size: Optional[int] = 3, squeeze_factor: Optional[int] = 4, *args, **kwargs ) -> None: hidden_dim = make_divisible(int(round(in_channels * expand_ratio)), 8) act_fn = build_activation_layer(opts, act_type=act_fn_name, inplace=True) super().__init__() block = nn.Sequential() if expand_ratio != 1: block.add_module( name="exp_1x1", module=ConvLayer2d( opts, in_channels=in_channels, out_channels=hidden_dim, kernel_size=1, use_act=False, use_norm=True, ), ) block.add_module(name="act_fn_1", module=act_fn) block.add_module( name="conv_3x3", module=ConvLayer2d( opts, in_channels=hidden_dim, out_channels=hidden_dim, stride=stride, kernel_size=kernel_size, groups=hidden_dim, use_act=False, use_norm=True, dilation=dilation, ), ) block.add_module(name="act_fn_2", module=act_fn) if use_se: se = SqueezeExcitation( opts=opts, in_channels=hidden_dim, squeeze_factor=squeeze_factor, scale_fn_name=se_scale_fn_name, ) block.add_module(name="se", module=se) block.add_module( name="red_1x1", module=ConvLayer2d( opts, in_channels=hidden_dim, out_channels=out_channels, kernel_size=1, use_act=False, use_norm=True, ), ) self.block = block self.in_channels = in_channels self.out_channels = out_channels self.exp = expand_ratio self.dilation = dilation self.use_se = use_se self.stride = stride self.act_fn_name = act_fn_name self.kernel_size = kernel_size self.use_res_connect = self.stride == 1 and in_channels == out_channels def forward(self, x: Tensor, *args, **kwargs) -> Tensor: y = self.block(x) return x + y if self.use_res_connect else y def __repr__(self) -> str: return "{}(in_channels={}, out_channels={}, stride={}, exp={}, dilation={}, use_se={}, kernel_size={}, act_fn={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.stride, self.exp, self.dilation, self.use_se, self.kernel_size, self.act_fn_name, ) class InvertedResidual(BaseModule): """ This class implements the inverted residual block, as described in `MobileNetv2 `_ paper Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out)` stride (Optional[int]): Use convolutions with a stride. Default: 1 expand_ratio (Union[int, float]): Expand the input channels by this factor in depth-wise conv dilation (Optional[int]): Use conv with dilation. Default: 1 skip_connection (Optional[bool]): Use skip-connection. Default: True Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})` - Output: :math:`(N, C_{out}, H_{out}, W_{out})` .. note:: If `in_channels =! out_channels` and `stride > 1`, we set `skip_connection=False` """ def __init__( self, opts, in_channels: int, out_channels: int, stride: int, expand_ratio: Union[int, float], dilation: int = 1, skip_connection: Optional[bool] = True, *args, **kwargs ) -> None: assert stride in [1, 2] hidden_dim = make_divisible(int(round(in_channels * expand_ratio)), 8) super().__init__() block = nn.Sequential() if expand_ratio != 1: block.add_module( name="exp_1x1", module=ConvLayer2d( opts, in_channels=in_channels, out_channels=hidden_dim, kernel_size=1, use_act=True, use_norm=True, ), ) block.add_module( name="conv_3x3", module=ConvLayer2d( opts, in_channels=hidden_dim, out_channels=hidden_dim, stride=stride, kernel_size=3, groups=hidden_dim, use_act=True, use_norm=True, dilation=dilation, ), ) block.add_module( name="red_1x1", module=ConvLayer2d( opts, in_channels=hidden_dim, out_channels=out_channels, kernel_size=1, use_act=False, use_norm=True, ), ) self.block = block self.in_channels = in_channels self.out_channels = out_channels self.exp = expand_ratio self.dilation = dilation self.stride = stride self.use_res_connect = ( self.stride == 1 and in_channels == out_channels and skip_connection ) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: if self.use_res_connect: return x + self.block(x) else: return self.block(x) def __repr__(self) -> str: return "{}(in_channels={}, out_channels={}, stride={}, exp={}, dilation={}, skip_conn={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.stride, self.exp, self.dilation, self.use_res_connect, ) ================================================ FILE: corenet/modeling/modules/mobileone_block.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Tuple, Union import torch import torch.nn as nn from corenet.modeling.layers import ConvLayer2d, Identity from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.layers.normalization.batch_norm import BatchNorm2d from corenet.modeling.modules import BaseModule, SqueezeExcitation class MobileOneBlock(BaseModule): """ MobileOne building block. For more details, please refer to our paper: `An Improved One millisecond Mobile Backbone ` """ def __init__( self, opts: argparse.Namespace, in_channels: int, out_channels: int, kernel_size: int, stride: int = 1, padding: int = 0, dilation: int = 1, groups: int = 1, inference_mode: bool = False, use_se: bool = False, use_act: bool = True, use_scale_branch: bool = True, num_conv_branches: int = 1, ) -> None: """ Construct a MobileOneBlock. Args: opts: Command line arguments. in_channels: Number of channels in the input. out_channels: Number of channels produced by the block. kernel_size: Size of the convolution kernel. stride: Stride size. Default: 1 padding: Zero-padding size. Default: 0 dilation: Kernel dilation factor. Default: 1 groups: Group number. Default: 1 inference_mode: If True, instantiates model in inference mode. Default: ``False`` use_se: Whether to use SE-ReLU activations. Default: ``False`` use_act: Whether to use activation. Default: ``True`` use_scale_branch: Whether to use scale branch. Default: ``True`` num_conv_branches: Number of linear conv branches. Default: 1 """ super(MobileOneBlock, self).__init__() self.inference_mode = inference_mode self.groups = groups self.stride = stride self.padding = padding self.dilation = dilation self.kernel_size = kernel_size self.in_channels = in_channels self.out_channels = out_channels self.num_conv_branches = num_conv_branches # Check if SE-ReLU is requested if use_se: self.se = SqueezeExcitation(opts, out_channels, squeeze_factor=16) else: self.se = Identity() # Activation if use_act: self.activation = build_activation_layer(opts) else: self.activation = Identity() if inference_mode: self.reparam_conv = nn.Conv2d( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=True, ) else: # Re-parameterizable skip connection self.rbr_skip = ( BatchNorm2d(num_features=in_channels, affine=True) if out_channels == in_channels and stride == 1 else None ) # Re-parameterizable conv branches if num_conv_branches > 0: rbr_conv = list() for _ in range(self.num_conv_branches): rbr_conv.append( ConvLayer2d( opts, in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=kernel_size, stride=self.stride, padding=padding, groups=self.groups, bias=False, use_act=False, ) ) self.rbr_conv = nn.ModuleList(rbr_conv) else: self.rbr_conv = None # Re-parameterizable scale branch self.rbr_scale = None if (kernel_size > 1) and use_scale_branch: self.rbr_scale = ConvLayer2d( opts, in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=1, stride=self.stride, padding=0, groups=self.groups, bias=False, use_act=False, ) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass implements inference logic for module before and after reparameterization. Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ # Inference mode forward pass. if self.inference_mode: return self.activation(self.se(self.reparam_conv(x))) # Multi-branched train-time forward pass. # Skip branch output identity_out = 0 if self.rbr_skip is not None: identity_out = self.rbr_skip(x) # Scale branch output scale_out = 0 if self.rbr_scale is not None: scale_out = self.rbr_scale(x) # Other branches out = scale_out + identity_out if self.rbr_conv is not None: for ix in range(self.num_conv_branches): out += self.rbr_conv[ix](x) return self.activation(self.se(out)) def reparameterize(self) -> None: """ Following works like `RepVGG: Making VGG-style ConvNets Great Again` - https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched architecture used at training time to obtain a plain CNN-like structure for inference. """ if self.inference_mode: return kernel, bias = self._get_kernel_bias() self.reparam_conv = nn.Conv2d( in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=self.kernel_size, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups, bias=True, ) self.reparam_conv.weight.data = kernel self.reparam_conv.bias.data = bias # Delete un-used branches for para in self.parameters(): para.detach_() if hasattr(self, "rbr_conv"): self.__delattr__("rbr_conv") if hasattr(self, "rbr_scale"): self.__delattr__("rbr_scale") if hasattr(self, "rbr_skip"): self.__delattr__("rbr_skip") self.inference_mode = True def _get_kernel_bias(self) -> Tuple[torch.Tensor, torch.Tensor]: """ Method to obtain re-parameterized kernel and bias. Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L83 Returns: Tuple of (kernel, bias) after fusing branches. """ # get weights and bias of scale branch kernel_scale = 0 bias_scale = 0 if self.rbr_scale is not None: kernel_scale, bias_scale = self._fuse_branch_ops(self.rbr_scale.block) # Pad scale branch kernel to match conv branch kernel size. pad = self.kernel_size // 2 kernel_scale = torch.nn.functional.pad(kernel_scale, [pad, pad, pad, pad]) # get weights and bias of skip branch kernel_identity = 0 bias_identity = 0 if self.rbr_skip is not None: kernel_identity, bias_identity = self._fuse_branch_ops(self.rbr_skip) # get weights and bias of conv branches kernel_conv = 0 bias_conv = 0 if self.rbr_conv is not None: for ix in range(self.num_conv_branches): _kernel, _bias = self._fuse_branch_ops(self.rbr_conv[ix].block) kernel_conv += _kernel bias_conv += _bias kernel_final = kernel_conv + kernel_scale + kernel_identity bias_final = bias_conv + bias_scale + bias_identity return kernel_final, bias_final def _fuse_branch_ops( self, branch: Union[nn.Sequential, nn.BatchNorm2d] ) -> Tuple[torch.Tensor, torch.Tensor]: """ Method to fuse all linear ops in a branch. Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L95 Args: branch: Sequence of ops to be fused. Returns: Tuple of (kernel, bias) after fusing batchnorm. """ if isinstance(branch, nn.Sequential): kernel = branch.conv.weight return self._fuse_conv_bn(kernel, branch.norm) else: assert isinstance(branch, nn.BatchNorm2d) if not hasattr(self, "id_tensor"): input_dim = self.in_channels // self.groups kernel_value = torch.zeros( (self.in_channels, input_dim, self.kernel_size, self.kernel_size), dtype=branch.weight.dtype, device=branch.weight.device, ) for i in range(self.in_channels): kernel_value[ i, i % input_dim, self.kernel_size // 2, self.kernel_size // 2 ] = 1 self.id_tensor = kernel_value kernel = self.id_tensor return self._fuse_conv_bn(kernel, branch) @staticmethod def _fuse_conv_bn( kernel: torch.Tensor, bn: nn.BatchNorm2d ) -> Tuple[torch.Tensor, torch.Tensor]: """ Method to fuse batchnorm layer with conv layer. Args: kernel: Convolutional kernel weights. bn: Batchnorm 2d layer. Returns: Tuple of (kernel, bias) after fusing batchnorm. """ assert bn.affine, ( "Expected BatchNorm layer to have affine parameters " "instead got BatchNorm layer without affine parameters." ) running_mean = bn.running_mean running_var = bn.running_var gamma = bn.weight beta = bn.bias eps = bn.eps std = (running_var + eps).sqrt() t = (gamma / std).reshape(-1, 1, 1, 1) return kernel * t, beta - running_mean * gamma / std class RepLKBlock(BaseModule): """ This class defines overparameterized large kernel conv block in `RepLKNet `_ Reference: https://github.com/DingXiaoH/RepLKNet-pytorch Args: opts: Command-line arguments. in_channels: Number of input channels. out_channels: Number of output channels. kernel_size: Kernel size of the large kernel conv branch. stride: Stride size. Default: 1 dilation: Kernel dilation factor. Default: 1 groups: Group number. Default: 1 small_kernel_size: Kernel size of small kernel conv branch. inference_mode: If True, instantiates model in inference mode. Default: ``False`` use_act: If True, activation is used. Default: ``True`` """ def __init__( self, opts: argparse.Namespace, in_channels: int, out_channels: int, kernel_size: int, stride: int = 1, dilation: int = 1, groups: int = 1, small_kernel_size: int = None, inference_mode: bool = False, use_act: bool = True, ) -> None: super().__init__() self.stride = stride self.groups = groups self.dilation = dilation self.in_channels = in_channels self.out_channels = out_channels # Activation if use_act: self.activation = build_activation_layer(opts) else: self.activation = Identity() self.kernel_size = kernel_size self.small_kernel_size = small_kernel_size self.padding = kernel_size // 2 if inference_mode: self.lkb_reparam = nn.Conv2d( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=self.padding, dilation=self.dilation, groups=groups, bias=True, ) else: self.lkb_origin = ConvLayer2d( opts, in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=self.kernel_size, stride=self.stride, padding=self.padding, groups=self.groups, bias=False, use_act=False, ) if small_kernel_size is not None: assert ( small_kernel_size <= kernel_size ), "The kernel size for re-param cannot be larger than the large kernel" self.small_conv = ConvLayer2d( opts, in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=self.small_kernel_size, stride=self.stride, padding=self.small_kernel_size // 2, groups=self.groups, bias=False, use_act=False, ) def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor: """ Forward pass implements inference logic for module before and after reparameterization. Args: x: Input tensor of shape :math:`(B, C, H, W)`. Returns: torch.Tensor of shape :math:`(B, C, H, W)`. """ if hasattr(self, "lkb_reparam"): out = self.lkb_reparam(x) else: out = self.lkb_origin(x) if hasattr(self, "small_conv"): out += self.small_conv(x) self.activation(out) return out def _get_kernel_bias(self) -> Tuple[torch.Tensor, torch.Tensor]: """ Method to obtain re-parameterized kernel and bias. Reference: https://github.com/DingXiaoH/RepLKNet-pytorch Returns: Tuple of (kernel, bias) after fusing branches. """ lk_kernel, lk_bias = MobileOneBlock._fuse_conv_bn( self.lkb_origin.block.conv.weight, self.lkb_origin.block.norm ) if hasattr(self, "small_conv"): sk_kernel, sk_bias = MobileOneBlock._fuse_conv_bn( self.small_conv.block.conv.weight, self.small_conv.block.norm ) lk_bias += sk_bias # add to the central part lk_kernel += nn.functional.pad( sk_kernel, [(self.kernel_size - self.small_kernel_size) // 2] * 4 ) return lk_kernel, lk_bias def reparameterize(self) -> None: """ Following works like `RepVGG: Making VGG-style ConvNets Great Again` - https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched architecture used at training time to obtain a plain CNN-like structure for inference. """ kernel, bias = self._get_kernel_bias() self.lkb_reparam = nn.Conv2d( in_channels=self.in_channels, out_channels=self.out_channels, kernel_size=self.kernel_size, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups, bias=True, ) self.lkb_reparam.weight.data = kernel self.lkb_reparam.bias.data = bias self.__delattr__("lkb_origin") if hasattr(self, "small_conv"): self.__delattr__("small_conv") ================================================ FILE: corenet/modeling/modules/mobilevit_block.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Dict, Optional, Sequence, Tuple, Union import numpy as np import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers import ConvLayer2d, get_normalization_layer from corenet.modeling.modules.base_module import BaseModule from corenet.modeling.modules.transformer import LinearAttnFFN, TransformerEncoder class MobileViTBlock(BaseModule): """ This class defines the `MobileViT block `_ Args: opts: command line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` transformer_dim (int): Input dimension to the transformer unit ffn_dim (int): Dimension of the FFN block n_transformer_blocks (Optional[int]): Number of transformer blocks. Default: 2 head_dim (Optional[int]): Head dimension in the multi-head attention. Default: 32 attn_dropout (Optional[float]): Dropout in multi-head attention. Default: 0.0 dropout (Optional[float]): Dropout rate. Default: 0.0 ffn_dropout (Optional[float]): Dropout between FFN layers in transformer. Default: 0.0 patch_h (Optional[int]): Patch height for unfolding operation. Default: 8 patch_w (Optional[int]): Patch width for unfolding operation. Default: 8 transformer_norm_layer (Optional[str]): Normalization layer in the transformer block. Default: layer_norm conv_ksize (Optional[int]): Kernel size to learn local representations in MobileViT block. Default: 3 dilation (Optional[int]): Dilation rate in convolutions. Default: 1 no_fusion (Optional[bool]): Do not combine the input and output feature maps. Default: False """ def __init__( self, opts, in_channels: int, transformer_dim: int, ffn_dim: int, n_transformer_blocks: Optional[int] = 2, head_dim: Optional[int] = 32, attn_dropout: Optional[float] = 0.0, dropout: Optional[int] = 0.0, ffn_dropout: Optional[int] = 0.0, patch_h: Optional[int] = 8, patch_w: Optional[int] = 8, transformer_norm_layer: Optional[str] = "layer_norm", conv_ksize: Optional[int] = 3, dilation: Optional[int] = 1, no_fusion: Optional[bool] = False, *args, **kwargs ) -> None: conv_3x3_in = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=in_channels, kernel_size=conv_ksize, stride=1, use_norm=True, use_act=True, dilation=dilation, ) conv_1x1_in = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=transformer_dim, kernel_size=1, stride=1, use_norm=False, use_act=False, ) conv_1x1_out = ConvLayer2d( opts=opts, in_channels=transformer_dim, out_channels=in_channels, kernel_size=1, stride=1, use_norm=True, use_act=True, ) conv_3x3_out = None if not no_fusion: conv_3x3_out = ConvLayer2d( opts=opts, in_channels=2 * in_channels, out_channels=in_channels, kernel_size=conv_ksize, stride=1, use_norm=True, use_act=True, ) super().__init__() self.local_rep = nn.Sequential() self.local_rep.add_module(name="conv_3x3", module=conv_3x3_in) self.local_rep.add_module(name="conv_1x1", module=conv_1x1_in) assert transformer_dim % head_dim == 0 num_heads = transformer_dim // head_dim global_rep = [ TransformerEncoder( opts=opts, embed_dim=transformer_dim, ffn_latent_dim=ffn_dim, num_heads=num_heads, attn_dropout=attn_dropout, dropout=dropout, ffn_dropout=ffn_dropout, transformer_norm_layer=transformer_norm_layer, ) for _ in range(n_transformer_blocks) ] global_rep.append( get_normalization_layer( opts=opts, norm_type=transformer_norm_layer, num_features=transformer_dim, ) ) self.global_rep = nn.Sequential(*global_rep) self.conv_proj = conv_1x1_out self.fusion = conv_3x3_out self.patch_h = patch_h self.patch_w = patch_w self.patch_area = self.patch_w * self.patch_h self.cnn_in_dim = in_channels self.cnn_out_dim = transformer_dim self.n_heads = num_heads self.ffn_dim = ffn_dim self.dropout = dropout self.attn_dropout = attn_dropout self.ffn_dropout = ffn_dropout self.dilation = dilation self.n_blocks = n_transformer_blocks self.conv_ksize = conv_ksize def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n\t Local representations" if isinstance(self.local_rep, nn.Sequential): for m in self.local_rep: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.local_rep) repr_str += "\n\t Global representations with patch size of {}x{}".format( self.patch_h, self.patch_w ) if isinstance(self.global_rep, nn.Sequential): for m in self.global_rep: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.global_rep) if isinstance(self.conv_proj, nn.Sequential): for m in self.conv_proj: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.conv_proj) if self.fusion is not None: repr_str += "\n\t Feature fusion" if isinstance(self.fusion, nn.Sequential): for m in self.fusion: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.fusion) repr_str += "\n)" return repr_str def unfolding(self, feature_map: Tensor) -> Tuple[Tensor, Dict]: patch_w, patch_h = self.patch_w, self.patch_h patch_area = int(patch_w * patch_h) batch_size, in_channels, orig_h, orig_w = feature_map.shape new_h = int(math.ceil(orig_h / self.patch_h) * self.patch_h) new_w = int(math.ceil(orig_w / self.patch_w) * self.patch_w) interpolate = False if new_w != orig_w or new_h != orig_h: # Note: Padding can be done, but then it needs to be handled in attention function. feature_map = F.interpolate( feature_map, size=(new_h, new_w), mode="bilinear", align_corners=False ) interpolate = True # number of patches along width and height num_patch_w = new_w // patch_w # n_w num_patch_h = new_h // patch_h # n_h num_patches = num_patch_h * num_patch_w # N # [B, C, H, W] --> [B * C * n_h, p_h, n_w, p_w] reshaped_fm = feature_map.reshape( batch_size * in_channels * num_patch_h, patch_h, num_patch_w, patch_w ) # [B * C * n_h, p_h, n_w, p_w] --> [B * C * n_h, n_w, p_h, p_w] transposed_fm = reshaped_fm.transpose(1, 2) # [B * C * n_h, n_w, p_h, p_w] --> [B, C, N, P] where P = p_h * p_w and N = n_h * n_w reshaped_fm = transposed_fm.reshape( batch_size, in_channels, num_patches, patch_area ) # [B, C, N, P] --> [B, P, N, C] transposed_fm = reshaped_fm.transpose(1, 3) # [B, P, N, C] --> [BP, N, C] patches = transposed_fm.reshape(batch_size * patch_area, num_patches, -1) info_dict = { "orig_size": (orig_h, orig_w), "batch_size": batch_size, "interpolate": interpolate, "total_patches": num_patches, "num_patches_w": num_patch_w, "num_patches_h": num_patch_h, } return patches, info_dict def folding(self, patches: Tensor, info_dict: Dict) -> Tensor: n_dim = patches.dim() assert n_dim == 3, "Tensor should be of shape BPxNxC. Got: {}".format( patches.shape ) # [BP, N, C] --> [B, P, N, C] patches = patches.contiguous().view( info_dict["batch_size"], self.patch_area, info_dict["total_patches"], -1 ) batch_size, pixels, num_patches, channels = patches.size() num_patch_h = info_dict["num_patches_h"] num_patch_w = info_dict["num_patches_w"] # [B, P, N, C] --> [B, C, N, P] patches = patches.transpose(1, 3) # [B, C, N, P] --> [B*C*n_h, n_w, p_h, p_w] feature_map = patches.reshape( batch_size * channels * num_patch_h, num_patch_w, self.patch_h, self.patch_w ) # [B*C*n_h, n_w, p_h, p_w] --> [B*C*n_h, p_h, n_w, p_w] feature_map = feature_map.transpose(1, 2) # [B*C*n_h, p_h, n_w, p_w] --> [B, C, H, W] feature_map = feature_map.reshape( batch_size, channels, num_patch_h * self.patch_h, num_patch_w * self.patch_w ) if info_dict["interpolate"]: feature_map = F.interpolate( feature_map, size=info_dict["orig_size"], mode="bilinear", align_corners=False, ) return feature_map def forward_spatial(self, x: Tensor) -> Tensor: res = x fm = self.local_rep(x) # convert feature map to patches patches, info_dict = self.unfolding(fm) # learn global representations for transformer_layer in self.global_rep: patches = transformer_layer(patches) # [B x Patch x Patches x C] --> [B x C x Patches x Patch] fm = self.folding(patches=patches, info_dict=info_dict) fm = self.conv_proj(fm) if self.fusion is not None: fm = self.fusion(torch.cat((res, fm), dim=1)) return fm def forward_temporal( self, x: Tensor, x_prev: Optional[Tensor] = None ) -> Union[Tensor, Tuple[Tensor, Tensor]]: res = x fm = self.local_rep(x) # convert feature map to patches patches, info_dict = self.unfolding(fm) # learn global representations for global_layer in self.global_rep: if isinstance(global_layer, TransformerEncoder): patches = global_layer(x=patches, x_prev=x_prev) else: patches = global_layer(patches) # [B x Patch x Patches x C] --> [B x C x Patches x Patch] fm = self.folding(patches=patches, info_dict=info_dict) fm = self.conv_proj(fm) if self.fusion is not None: fm = self.fusion(torch.cat((res, fm), dim=1)) return fm, patches def forward( self, x: Union[Tensor, Tuple[Tensor]], *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, Tensor]]: if isinstance(x, Tuple) and len(x) == 2: # for spatio-temporal MobileViT return self.forward_temporal(x=x[0], x_prev=x[1]) elif isinstance(x, Tensor): # For image data return self.forward_spatial(x) else: raise NotImplementedError class MobileViTBlockv2(BaseModule): """ This class defines the `MobileViTv2 `_ block Args: opts: command line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` attn_unit_dim (int): Input dimension to the attention unit ffn_multiplier (int): Expand the input dimensions by this factor in FFN. Default is 2. n_attn_blocks (Optional[int]): Number of attention units. Default: 2 attn_dropout (Optional[float]): Dropout in multi-head attention. Default: 0.0 dropout (Optional[float]): Dropout rate. Default: 0.0 ffn_dropout (Optional[float]): Dropout between FFN layers in transformer. Default: 0.0 patch_h (Optional[int]): Patch height for unfolding operation. Default: 8 patch_w (Optional[int]): Patch width for unfolding operation. Default: 8 conv_ksize (Optional[int]): Kernel size to learn local representations in MobileViT block. Default: 3 dilation (Optional[int]): Dilation rate in convolutions. Default: 1 attn_norm_layer (Optional[str]): Normalization layer in the attention block. Default: layer_norm_2d """ def __init__( self, opts, in_channels: int, attn_unit_dim: int, ffn_multiplier: Optional[Union[Sequence[Union[int, float]], int, float]] = 2.0, n_attn_blocks: Optional[int] = 2, attn_dropout: Optional[float] = 0.0, dropout: Optional[float] = 0.0, ffn_dropout: Optional[float] = 0.0, patch_h: Optional[int] = 8, patch_w: Optional[int] = 8, conv_ksize: Optional[int] = 3, dilation: Optional[int] = 1, attn_norm_layer: Optional[str] = "layer_norm_2d", *args, **kwargs ) -> None: cnn_out_dim = attn_unit_dim conv_3x3_in = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=in_channels, kernel_size=conv_ksize, stride=1, use_norm=True, use_act=True, dilation=dilation, groups=in_channels, ) conv_1x1_in = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=cnn_out_dim, kernel_size=1, stride=1, use_norm=False, use_act=False, ) super(MobileViTBlockv2, self).__init__() self.local_rep = nn.Sequential(conv_3x3_in, conv_1x1_in) self.global_rep, attn_unit_dim = self._build_attn_layer( opts=opts, d_model=attn_unit_dim, ffn_mult=ffn_multiplier, n_layers=n_attn_blocks, attn_dropout=attn_dropout, dropout=dropout, ffn_dropout=ffn_dropout, attn_norm_layer=attn_norm_layer, ) self.conv_proj = ConvLayer2d( opts=opts, in_channels=cnn_out_dim, out_channels=in_channels, kernel_size=1, stride=1, use_norm=True, use_act=False, ) self.patch_h = patch_h self.patch_w = patch_w self.patch_area = self.patch_w * self.patch_h self.cnn_in_dim = in_channels self.cnn_out_dim = cnn_out_dim self.transformer_in_dim = attn_unit_dim self.dropout = dropout self.attn_dropout = attn_dropout self.ffn_dropout = ffn_dropout self.n_blocks = n_attn_blocks self.conv_ksize = conv_ksize self.enable_coreml_compatible_fn = getattr( opts, "common.enable_coreml_compatible_module", False ) if self.enable_coreml_compatible_fn: # we set persistent to false so that these weights are not part of model's state_dict self.register_buffer( name="unfolding_weights", tensor=self._compute_unfolding_weights(), persistent=False, ) def _compute_unfolding_weights(self) -> Tensor: # [P_h * P_w, P_h * P_w] weights = torch.eye(self.patch_h * self.patch_w, dtype=torch.float) # [P_h * P_w, P_h * P_w] --> [P_h * P_w, 1, P_h, P_w] weights = weights.reshape( (self.patch_h * self.patch_w, 1, self.patch_h, self.patch_w) ) # [P_h * P_w, 1, P_h, P_w] --> [P_h * P_w * C, 1, P_h, P_w] weights = weights.repeat(self.cnn_out_dim, 1, 1, 1) return weights def _build_attn_layer( self, opts, d_model: int, ffn_mult: Union[Sequence, int, float], n_layers: int, attn_dropout: float, dropout: float, ffn_dropout: float, attn_norm_layer: str, *args, **kwargs ) -> Tuple[nn.Module, int]: if isinstance(ffn_mult, Sequence) and len(ffn_mult) == 2: ffn_dims = ( np.linspace(ffn_mult[0], ffn_mult[1], n_layers, dtype=float) * d_model ) elif isinstance(ffn_mult, Sequence) and len(ffn_mult) == 1: ffn_dims = [ffn_mult[0] * d_model] * n_layers elif isinstance(ffn_mult, (int, float)): ffn_dims = [ffn_mult * d_model] * n_layers else: raise NotImplementedError # ensure that dims are multiple of 16 ffn_dims = [int((d // 16) * 16) for d in ffn_dims] global_rep = [ LinearAttnFFN( opts=opts, embed_dim=d_model, ffn_latent_dim=ffn_dims[block_idx], attn_dropout=attn_dropout, dropout=dropout, ffn_dropout=ffn_dropout, norm_layer=attn_norm_layer, ) for block_idx in range(n_layers) ] global_rep.append( get_normalization_layer( opts=opts, norm_type=attn_norm_layer, num_features=d_model ) ) return nn.Sequential(*global_rep), d_model def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n\t Local representations" if isinstance(self.local_rep, nn.Sequential): for m in self.local_rep: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.local_rep) repr_str += "\n\t Global representations with patch size of {}x{}".format( self.patch_h, self.patch_w, ) if isinstance(self.global_rep, nn.Sequential): for m in self.global_rep: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.global_rep) if isinstance(self.conv_proj, nn.Sequential): for m in self.conv_proj: repr_str += "\n\t\t {}".format(m) else: repr_str += "\n\t\t {}".format(self.conv_proj) repr_str += "\n)" return repr_str def unfolding_pytorch(self, feature_map: Tensor) -> Tuple[Tensor, Tuple[int, int]]: batch_size, in_channels, img_h, img_w = feature_map.shape # [B, C, H, W] --> [B, C, P, N] patches = F.unfold( feature_map, kernel_size=(self.patch_h, self.patch_w), stride=(self.patch_h, self.patch_w), ) patches = patches.reshape( batch_size, in_channels, self.patch_h * self.patch_w, -1 ) return patches, (img_h, img_w) def folding_pytorch(self, patches: Tensor, output_size: Tuple[int, int]) -> Tensor: batch_size, in_dim, patch_size, n_patches = patches.shape # [B, C, P, N] patches = patches.reshape(batch_size, in_dim * patch_size, n_patches) feature_map = F.fold( patches, output_size=output_size, kernel_size=(self.patch_h, self.patch_w), stride=(self.patch_h, self.patch_w), ) return feature_map def unfolding_coreml(self, feature_map: Tensor) -> Tuple[Tensor, Tuple[int, int]]: # im2col is not implemented in Coreml, so here we hack its implementation using conv2d # we compute the weights # [B, C, H, W] --> [B, C, P, N] batch_size, in_channels, img_h, img_w = feature_map.shape # patches = F.conv2d( feature_map, self.unfolding_weights, bias=None, stride=(self.patch_h, self.patch_w), padding=0, dilation=1, groups=in_channels, ) patches = patches.reshape( batch_size, in_channels, self.patch_h * self.patch_w, -1 ) return patches, (img_h, img_w) def folding_coreml(self, patches: Tensor, output_size: Tuple[int, int]) -> Tensor: # col2im is not supported on coreml, so tracing fails # We hack folding function via pixel_shuffle to enable coreml tracing batch_size, in_dim, patch_size, n_patches = patches.shape n_patches_h = output_size[0] // self.patch_h n_patches_w = output_size[1] // self.patch_w feature_map = patches.reshape( batch_size, in_dim * self.patch_h * self.patch_w, n_patches_h, n_patches_w ) assert ( self.patch_h == self.patch_w ), "For Coreml, we need patch_h and patch_w are the same" feature_map = F.pixel_shuffle(feature_map, upscale_factor=self.patch_h) return feature_map def resize_input_if_needed(self, x): batch_size, in_channels, orig_h, orig_w = x.shape if orig_h % self.patch_h != 0 or orig_w % self.patch_w != 0: new_h = int(math.ceil(orig_h / self.patch_h) * self.patch_h) new_w = int(math.ceil(orig_w / self.patch_w) * self.patch_w) x = F.interpolate( x, size=(new_h, new_w), mode="bilinear", align_corners=True ) return x def forward_spatial(self, x: Tensor, *args, **kwargs) -> Tensor: x = self.resize_input_if_needed(x) fm = self.local_rep(x) # convert feature map to patches if self.enable_coreml_compatible_fn: patches, output_size = self.unfolding_coreml(fm) else: patches, output_size = self.unfolding_pytorch(fm) # learn global representations on all patches patches = self.global_rep(patches) # [B x Patch x Patches x C] --> [B x C x Patches x Patch] if self.enable_coreml_compatible_fn: fm = self.folding_coreml(patches=patches, output_size=output_size) else: fm = self.folding_pytorch(patches=patches, output_size=output_size) fm = self.conv_proj(fm) return fm def forward_temporal( self, x: Tensor, x_prev: Tensor, *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, Tensor]]: x = self.resize_input_if_needed(x) fm = self.local_rep(x) # convert feature map to patches if self.enable_coreml_compatible_fn: patches, output_size = self.unfolding_coreml(fm) else: patches, output_size = self.unfolding_pytorch(fm) # learn global representations for global_layer in self.global_rep: if isinstance(global_layer, LinearAttnFFN): patches = global_layer(x=patches, x_prev=x_prev) else: patches = global_layer(patches) # [B x Patch x Patches x C] --> [B x C x Patches x Patch] if self.enable_coreml_compatible_fn: fm = self.folding_coreml(patches=patches, output_size=output_size) else: fm = self.folding_pytorch(patches=patches, output_size=output_size) fm = self.conv_proj(fm) return fm, patches def forward( self, x: Union[Tensor, Tuple[Tensor]], *args, **kwargs ) -> Union[Tensor, Tuple[Tensor, Tensor]]: if isinstance(x, Tuple) and len(x) == 2: # for spatio-temporal data (e.g., videos) return self.forward_temporal(x=x[0], x_prev=x[1]) elif isinstance(x, Tensor): # for image data return self.forward_spatial(x) else: raise NotImplementedError ================================================ FILE: corenet/modeling/modules/pspnet_module.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional, Tuple import torch import torch.nn.functional as F from torch import Tensor, nn from corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d, Dropout2d from corenet.modeling.modules import BaseModule from corenet.utils import logger class PSP(BaseModule): """ This class defines the Pyramid Scene Parsing module in the `PSPNet paper `_ Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)` pool_sizes Optional[Tuple[int, ...]]: List or Tuple of pool sizes. Default: (1, 2, 3, 6) dropout (Optional[float]): Apply dropout. Default is 0.0 """ def __init__( self, opts, in_channels: int, out_channels: int, pool_sizes: Optional[Tuple[int, ...]] = (1, 2, 3, 6), dropout: Optional[float] = 0.0, *args, **kwargs ) -> None: if not (0.0 <= dropout < 1.0): logger.error( "Dropout value in {} should be between 0 and 1. Got: {}".format( self.__class__.__name__, dropout ) ) reduction_dim = in_channels // len(pool_sizes) reduction_dim = (reduction_dim // 16) * 16 channels_after_concat = (reduction_dim * len(pool_sizes)) + in_channels super().__init__() self.psp_branches = nn.ModuleList( [ self._make_psp_layer( opts, o_size=ps, in_channels=in_channels, out_channels=reduction_dim ) for ps in pool_sizes ] ) self.fusion = nn.Sequential( ConvLayer2d( opts=opts, in_channels=channels_after_concat, out_channels=out_channels, kernel_size=3, stride=1, use_norm=True, use_act=True, ), Dropout2d(p=dropout), ) self.in_channels = in_channels self.out_channels = out_channels self.pool_sizes = pool_sizes self.inner_channels = reduction_dim self.dropout = dropout @staticmethod def _make_psp_layer( opts, o_size: int, in_channels: int, out_channels: int ) -> nn.Module: return nn.Sequential( AdaptiveAvgPool2d(output_size=(o_size, o_size)), ConvLayer2d( opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, bias=False, use_norm=True, use_act=True, ), ) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: x_size = x.shape[2:] out = [x] + [ F.interpolate( input=psp_branch(x), size=x_size, mode="bilinear", align_corners=True ) for psp_branch in self.psp_branches ] out = torch.cat(out, dim=1) out = self.fusion(out) return out def __repr__(self): return "{}(in_channels={}, out_channels={}, pool_sizes={}, inner_channels={}, dropout_2d={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.pool_sizes, self.inner_channels, self.dropout, ) ================================================ FILE: corenet/modeling/modules/regnet_modules.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List, Optional, Tuple from torch import Tensor, nn from corenet.modeling.layers import ConvLayer2d, Identity, StochasticDepth from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule, SqueezeExcitation class XRegNetBlock(BaseModule): """ This class implements the `X` block based on the ResNet bottleneck block. See figure 4 of RegNet paper `RegNet model `_ Args: opts: command-line arguments width_in: The number of input channels width_out: The number of output channels stride: Stride for convolution groups: Number of groups for convolution bottleneck_multiplier: The number of in/out channels of the intermediate conv layer will be scaled by this value se_ratio: The number squeeze-excitation ratio. The number of channels in the SE module will be scaled by this value stochastic_depth_prob: The stochastic depth probability """ def __init__( self, opts: argparse.Namespace, width_in: int, width_out: int, stride: int, groups: int, bottleneck_multiplier: float, se_ratio: float, stochastic_depth_prob: float = 0.0, # drop probability (= 1 - survival_prob) ) -> None: super().__init__() bottleneck_width = int(round(width_out * bottleneck_multiplier)) bottleneck_groups = bottleneck_width // groups conv_1x1_1 = ConvLayer2d( opts=opts, in_channels=width_in, out_channels=bottleneck_width, kernel_size=1, stride=1, use_norm=True, use_act=True, ) conv_3x3 = ConvLayer2d( opts=opts, in_channels=bottleneck_width, out_channels=bottleneck_width, kernel_size=3, stride=stride, groups=bottleneck_groups, use_norm=True, use_act=True, ) se = Identity() if se_ratio > 0: squeeze_channels = int(round(se_ratio * width_in)) se = SqueezeExcitation( opts, in_channels=bottleneck_width, squeeze_channels=squeeze_channels, ) conv_1x1_2 = ConvLayer2d( opts=opts, in_channels=bottleneck_width, out_channels=width_out, kernel_size=1, stride=1, use_norm=True, use_act=True, ) block = nn.Sequential() block.add_module("conv_1x1_1", module=conv_1x1_1) block.add_module("conv_3x3", module=conv_3x3) block.add_module("se", module=se) block.add_module("conv_1x1_2", module=conv_1x1_2) down_sample = Identity() if stride != 1 or width_out != width_in: down_sample = ConvLayer2d( opts, in_channels=width_in, out_channels=width_out, kernel_size=1, stride=stride, use_act=False, ) act_type = getattr(opts, "model.activation.name") neg_slope = getattr(opts, "model.activation.neg_slope") inplace = getattr(opts, "model.activation.inplace") final_act = build_activation_layer( opts=opts, act_type=act_type, inplace=inplace, negative_slope=neg_slope, num_parameters=width_out, ) self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode="row") self.block = block self.down_sample = down_sample self.final_act = final_act self.width_in = width_in self.width_out = width_out self.stride = stride self.groups = groups self.bottleneck_multiplier = bottleneck_multiplier self.se_ratio = se_ratio self.stochastic_depth_prob = stochastic_depth_prob def forward(self, x: Tensor) -> Tensor: """Forward pass for XRegNetBlock. Args: x: Batch of images Returns: * output of XRegNetBlock including stochastic depth layer and residual. Shape: x: :math:`(N, C_{in}, H_{in}, W_{in})` Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ out = self.block(x) out = self.stochastic_depth(out) res = self.down_sample(x) out = res + out return self.final_act(out) def __repr__(self) -> str: return "{}(width_in={}, width_out={}, stride={}, groups={}, bottleneck_multiplier={}, se_ratio={}, stochastic_depth_prob={})".format( self.__class__.__name__, self.width_in, self.width_out, self.stride, self.groups, self.bottleneck_multiplier, self.se_ratio, self.stochastic_depth_prob, ) class AnyRegNetStage(BaseModule): """ This class implements a 'stage' as defined in the `RegNet paper `_. It consists of a sequence of bottleneck blocks. Args: opts: command-line arguments depth: The number of XRegNetBlocks in the stage width_in: The number of input channels of the first block width_out: The number of output channels of each block stride: Stride for convolution of first block groups: Number of groups for the intermediate convolution (bottleneck) layer in each block bottleneck_multiplier: The number of in/out channels of the intermediate conv layer of each block will be scaled by this value se_ratio: The number squeeze-excitation ratio. The number of channels in the SE module of each block will be scaled by this value stage_depths: A list of the number of blocks in each stage stage_index: The index of the current stage being constructed stochastic_depth_prob: The stochastic depth probability """ def __init__( self, opts: argparse.Namespace, depth: int, width_in: int, width_out: int, stride: int, groups: int, bottleneck_multiplier: float, se_ratio: float, stage_index: int, stochastic_depth_probs: List[float], ) -> None: super().__init__() stage_blocks = nn.Sequential() for i, sd_prob in enumerate(stochastic_depth_probs): block = XRegNetBlock( opts, width_in=width_in if i == 0 else width_out, width_out=width_out, stride=stride if i == 0 else 1, groups=groups, bottleneck_multiplier=bottleneck_multiplier, se_ratio=se_ratio, stochastic_depth_prob=sd_prob, ) stage_blocks.add_module(f"Stage{stage_index}-Block{i}", module=block) self.stage = stage_blocks self.depth = depth self.width_in = width_in self.width_out = width_out self.stride = stride self.groups = groups self.bottleneck_multiplier = bottleneck_multiplier self.se_ratio = se_ratio self.stage_index = stage_index self.stochastic_depth_probs = stochastic_depth_probs def forward(self, x: Tensor) -> Tensor: """Forward pass through all blocks in the stage. Args: x: Batch of images. Returns: * output of passing x through all blocks in the stage. Shape: x: :math:`(N, C_{in}, H_{in}, W_{in})` Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ return self.stage(x) def __repr__(self) -> str: return "{}(depth={}, width_in={}, width_out={}, stride={}, groups={}, bottleneck_multiplier={}, se_ratio={}, stage_index={}, stochastic_depth_probs={})".format( self.__class__.__name__, self.depth, self.width_in, self.width_out, self.stride, self.groups, self.bottleneck_multiplier, self.se_ratio, self.stage_index, self.stochastic_depth_probs, ) ================================================ FILE: corenet/modeling/modules/resnet_modules.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional from torch import Tensor, nn from corenet.modeling.layers import ConvLayer2d, Dropout, Identity, StochasticDepth from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule, SqueezeExcitation class BasicResNetBlock(BaseModule): """ This class defines the Basic block in the `ResNet model `_ Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})` mid_channels (int): :math:`C_{mid}` from an expected tensor of size :math:`(N, C_{mid}, H_{out}, W_{out})` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})` stride (Optional[int]): Stride for convolution. Default: 1 dilation (Optional[int]): Dilation for convolution. Default: 1 dropout (Optional[float]): Dropout after second convolution. Default: 0.0 stochastic_depth_prob (Optional[float]): Stochastic depth drop probability (1 - survival_prob). Default: 0.0 squeeze_channels (Optional[int]): The number of channels to use in the Squeeze-Excitation block for SE-ResNet. Default: None. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})` - Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ expansion: int = 1 def __init__( self, opts: argparse.Namespace, in_channels: int, mid_channels: int, out_channels: int, stride: Optional[int] = 1, dilation: Optional[int] = 1, dropout: Optional[float] = 0.0, stochastic_depth_prob: Optional[float] = 0.0, squeeze_channels: Optional[int] = None, *args, **kwargs ) -> None: act_type = getattr(opts, "model.activation.name") neg_slope = getattr(opts, "model.activation.neg_slope") inplace = getattr(opts, "model.activation.inplace") cbr_1 = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=mid_channels, kernel_size=3, stride=stride, dilation=dilation, use_norm=True, use_act=True, ) cb_2 = ConvLayer2d( opts=opts, in_channels=mid_channels, out_channels=out_channels, kernel_size=3, stride=1, use_norm=True, use_act=False, dilation=dilation, ) block = nn.Sequential() block.add_module(name="conv_batch_act_1", module=cbr_1) block.add_module(name="conv_batch_2", module=cb_2) if 0.0 < dropout < 1.0: block.add_module(name="dropout", module=Dropout(p=dropout)) down_sample = Identity() if stride == 2: down_sample = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=stride, use_norm=True, use_act=False, ) se_block = Identity() if squeeze_channels is not None: se_block = SqueezeExcitation( opts=opts, in_channels=out_channels, squeeze_channels=squeeze_channels, ) super().__init__() # Both self.conv1 and self.downsample layers downsample the input when stride != 1 self.block = block self.down_sample = down_sample self.final_act = build_activation_layer( opts, act_type=act_type, inplace=inplace, negative_slope=neg_slope, num_parameters=out_channels, ) self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode="row") self.se_block = se_block self.stride = stride self.in_channels = in_channels self.out_channels = out_channels self.dilation = dilation self.dropout = dropout self.stochastic_depth_prob = stochastic_depth_prob self.squeeze_channels = squeeze_channels def forward(self, x: Tensor, *args, **kwargs) -> Tensor: out = self.block(x) out = self.se_block(out) res = self.down_sample(x) out = self.stochastic_depth(out) out = out + res return self.final_act(out) def __repr__(self) -> str: return "{}(in_channels={}, out_channels={}, stride={}, dilation={}, dropout={}, stochastic_depth_prob={}, squeeze_channels={})".format( self.__class__.__name__, self.in_channels, self.out_channels, self.stride, self.dilation, self.dropout, self.stochastic_depth_prob, self.squeeze_channels, ) class BottleneckResNetBlock(BaseModule): """ This class defines the Bottleneck block in the `ResNet model `_ Args: opts: command-line arguments in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})` mid_channels (int): :math:`C_{mid}` from an expected tensor of size :math:`(N, C_{mid}, H_{out}, W_{out})` out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})` stride (Optional[int]): Stride for convolution. Default: 1 dilation (Optional[int]): Dilation for convolution. Default: 1 dropout (Optional[float]): Dropout after third convolution. Default: 0.0 stochastic_depth_prob (Optional[float]): Stochastic depth drop probability (1 - survival_prob). Default: 0.0 squeeze_channels (Optional[int]): The number of channels to use in the Squeeze-Excitation block for SE-ResNet. Shape: - Input: :math:`(N, C_{in}, H_{in}, W_{in})` - Output: :math:`(N, C_{out}, H_{out}, W_{out})` """ expansion: int = 4 def __init__( self, opts: argparse.Namespace, in_channels: int, mid_channels: int, out_channels: int, stride: Optional[int] = 1, dilation: Optional[int] = 1, dropout: Optional[float] = 0.0, stochastic_depth_prob: Optional[float] = 0.0, squeeze_channels: Optional[int] = None, *args, **kwargs ) -> None: act_type = getattr(opts, "model.activation.name") neg_slope = getattr(opts, "model.activation.neg_slope") inplace = getattr(opts, "model.activation.inplace") cbr_1 = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=mid_channels, kernel_size=1, stride=1, use_norm=True, use_act=True, ) cbr_2 = ConvLayer2d( opts=opts, in_channels=mid_channels, out_channels=mid_channels, kernel_size=3, stride=stride, use_norm=True, use_act=True, dilation=dilation, ) cb_3 = ConvLayer2d( opts=opts, in_channels=mid_channels, out_channels=out_channels, kernel_size=1, stride=1, use_norm=True, use_act=False, ) block = nn.Sequential() block.add_module(name="conv_batch_act_1", module=cbr_1) block.add_module(name="conv_batch_act_2", module=cbr_2) block.add_module(name="conv_batch_3", module=cb_3) if 0.0 < dropout < 1.0: block.add_module(name="dropout", module=Dropout(p=dropout)) down_sample = Identity() if stride == 2: down_sample = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=stride, use_norm=True, use_act=False, ) elif in_channels != out_channels: down_sample = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, use_norm=True, use_act=False, ) se_block = Identity() if squeeze_channels is not None: se_block = SqueezeExcitation( opts=opts, in_channels=out_channels, squeeze_channels=squeeze_channels, ) super().__init__() self.block = block self.down_sample = down_sample self.final_act = build_activation_layer( opts, act_type=act_type, inplace=inplace, negative_slope=neg_slope, num_parameters=out_channels, ) self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode="row") self.se_block = se_block self.stride = stride self.in_channels = in_channels self.out_channels = out_channels self.mid_channels = mid_channels self.dilation = dilation self.dropout = dropout self.stochastic_depth_prob = stochastic_depth_prob self.squeeze_channels = squeeze_channels def forward(self, x: Tensor, *args, **kwargs) -> Tensor: out = self.block(x) out = self.se_block(out) res = self.down_sample(x) out = self.stochastic_depth(out) out = out + res return self.final_act(out) def __repr__(self) -> str: return "{}(in_channels={}, mid_channels={}, out_channels={}, stride={}, dilation={}, dropout={}, stochastic_depth_prob={}, squeeze_channels={})".format( self.__class__.__name__, self.in_channels, self.mid_channels, self.out_channels, self.stride, self.dilation, self.dropout, self.stochastic_depth_prob, self.squeeze_channels, ) ================================================ FILE: corenet/modeling/modules/squeeze_excitation.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import torch from torch import Tensor, nn from corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule from corenet.utils.math_utils import make_divisible class SqueezeExcitation(BaseModule): """ This class defines the Squeeze-excitation module, in the `SENet paper `_ Args: opts: command-line arguments in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` squeeze_factor (Optional[int]): Reduce :math:`C` by this factor. Default: 4 squeeze_channels (Optional[int]): This module's output channels. Overrides squeeze_factor if specified scale_fn_name (Optional[str]): Scaling function name. Default: sigmoid Shape: - Input: :math:`(N, C, H, W)` - Output: :math:`(N, C, H, W)` """ def __init__( self, opts, in_channels: int, squeeze_factor: Optional[int] = 4, squeeze_channels: Optional[int] = None, scale_fn_name: Optional[str] = "sigmoid", *args, **kwargs ) -> None: if squeeze_channels is None: squeeze_channels = max(make_divisible(in_channels // squeeze_factor, 8), 32) fc1 = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=squeeze_channels, kernel_size=1, stride=1, bias=True, use_norm=False, use_act=True, ) fc2 = ConvLayer2d( opts=opts, in_channels=squeeze_channels, out_channels=in_channels, kernel_size=1, stride=1, bias=True, use_norm=False, use_act=False, ) act_fn = build_activation_layer(opts, act_type=scale_fn_name, inplace=True) super().__init__() self.se_layer = nn.Sequential() self.se_layer.add_module( name="global_pool", module=AdaptiveAvgPool2d(output_size=1) ) self.se_layer.add_module(name="fc1", module=fc1) self.se_layer.add_module(name="fc2", module=fc2) self.se_layer.add_module(name="scale_act", module=act_fn) self.in_channels = in_channels self.squeeze_factor = squeeze_factor self.scale_fn = scale_fn_name def forward(self, x: Tensor, *args, **kwargs) -> Tensor: return x * self.se_layer(x) def __repr__(self) -> str: return "{}(in_channels={}, squeeze_factor={}, scale_fn={})".format( self.__class__.__name__, self.in_channels, self.squeeze_factor, self.scale_fn, ) ================================================ FILE: corenet/modeling/modules/ssd_heads.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional, Tuple import torch from torch import Tensor, nn from torchvision.ops.roi_align import RoIAlign from corenet.modeling.layers import ConvLayer2d, SeparableConv2d, TransposeConvLayer2d from corenet.modeling.misc.init_utils import initialize_conv_layer from corenet.modeling.modules import BaseModule class SSDHead(BaseModule): """ This class defines the `SSD object detection Head `_ Args: opts: command-line arguments in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` n_anchors (int): Number of anchors n_classes (int): Number of classes in the dataset n_coordinates (Optional[int]): Number of coordinates. Default: 4 (x, y, w, h) proj_channels (Optional[int]): Number of projected channels. If `-1`, then projection layer is not used kernel_size (Optional[int]): Kernel size in convolutional layer. If kernel_size=1, then standard point-wise convolution is used. Otherwise, separable convolution is used stride (Optional[int]): stride for feature map. If stride > 1, then feature map is sampled at this rate and predictions are made on fewer pixels as compared to the input tensor. Default: 1 """ def __init__( self, opts, in_channels: int, n_anchors: int, n_classes: int, n_coordinates: Optional[int] = 4, proj_channels: Optional[int] = -1, kernel_size: Optional[int] = 3, stride: Optional[int] = 1, *args, **kwargs ) -> None: super().__init__() proj_layer = None self.proj_channels = None if proj_channels != -1 and proj_channels != in_channels and kernel_size > 1: proj_layer = ConvLayer2d( opts=opts, in_channels=in_channels, out_channels=proj_channels, kernel_size=1, stride=1, groups=1, bias=False, use_norm=True, use_act=True, ) in_channels = proj_channels self.proj_channels = proj_channels self.proj_layer = proj_layer conv_fn = ConvLayer2d if kernel_size == 1 else SeparableConv2d if kernel_size > 1 and stride > 1: kernel_size = max(kernel_size, stride if stride % 2 != 0 else stride + 1) self.loc_cls_layer = conv_fn( opts=opts, in_channels=in_channels, out_channels=n_anchors * (n_coordinates + n_classes), kernel_size=kernel_size, stride=1, groups=1, bias=True, use_norm=False, use_act=False, ) self.n_coordinates = n_coordinates self.n_classes = n_classes self.n_anchors = n_anchors self.k_size = kernel_size self.stride = stride self.in_channel = in_channels self.reset_parameters() def __repr__(self) -> str: repr_str = "{}(in_channels={}, n_anchors={}, n_classes={}, n_coordinates={}, kernel_size={}, stride={}".format( self.__class__.__name__, self.in_channel, self.n_anchors, self.n_classes, self.n_coordinates, self.k_size, self.stride, ) if self.proj_layer is not None: repr_str += ", proj=True, proj_channels={}".format(self.proj_channels) repr_str += ")" return repr_str def reset_parameters(self) -> None: for layer in self.modules(): if isinstance(layer, nn.Conv2d): initialize_conv_layer(module=layer, init_method="xavier_uniform") def _sample_fm(self, x: Tensor) -> Tensor: height, width = x.shape[-2:] device = x.device start_step = max(0, self.stride // 2) indices_h = torch.arange( start=start_step, end=height, step=self.stride, dtype=torch.int64, device=device, ) indices_w = torch.arange( start=start_step, end=width, step=self.stride, dtype=torch.int64, device=device, ) x_sampled = torch.index_select(x, dim=-1, index=indices_w) x_sampled = torch.index_select(x_sampled, dim=-2, index=indices_h) return x_sampled def forward(self, x: Tensor, *args, **kwargs) -> Tuple[Tensor, Tensor]: batch_size = x.shape[0] if self.proj_layer is not None: x = self.proj_layer(x) # [B x C x H x W] --> [B x Anchors * (coordinates + classes) x H x W] x = self.loc_cls_layer(x) if self.stride > 1: x = self._sample_fm(x) # [B x Anchors * (coordinates + classes) x H x W] --> [B x H x W x Anchors * (coordinates + classes)] x = x.permute(0, 2, 3, 1) # [B x H x W x Anchors * (coordinates + classes)] --> [B x H*W*Anchors X (coordinates + classes)] x = x.contiguous().view(batch_size, -1, self.n_coordinates + self.n_classes) # [B x H*W*Anchors X (coordinates + classes)] --> [B x H*W*Anchors X coordinates], [B x H*W*Anchors X classes] box_locations, box_classes = torch.split( x, [self.n_coordinates, self.n_classes], dim=-1 ) return box_locations, box_classes class SSDInstanceHead(BaseModule): """ Instance segmentation head for SSD model. """ def __init__( self, opts, in_channels: int, n_classes: Optional[int] = 1, inner_dim: Optional[int] = 256, output_stride: Optional[int] = 1, output_size: Optional[int] = 8, *args, **kwargs ) -> None: """ Args: opts: command-line arguments in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)` n_classes (Optional[int]): Number of classes. Default: 1 inner_dim: (Optional[int]): Inner dimension of the instance head. Default: 256 output_stride (Optional[int]): Output stride of the feature map. Output stride is the ratio of input to the feature map size. Default: 1 output_size (Optional[int]): Output size of the instances extracted from RoIAlign layer. Default: 8 """ super().__init__() self.roi_align = RoIAlign( output_size=output_size, spatial_scale=1.0 / output_stride, sampling_ratio=2, aligned=True, ) self.seg_head = nn.Sequential( TransposeConvLayer2d( opts=opts, in_channels=in_channels, out_channels=inner_dim, kernel_size=2, stride=2, bias=True, use_norm=False, use_act=True, auto_padding=False, padding=0, output_padding=0, ), ConvLayer2d( opts=opts, in_channels=inner_dim, out_channels=n_classes, kernel_size=1, stride=1, use_norm=False, use_act=False, bias=True, ), ) self.inner_channels = inner_dim self.in_channels = in_channels self.mask_classes = n_classes self.reset_parameters() def __repr__(self) -> str: return "{}(in_channels={}, up_out_channels={}, n_classes={})".format( self.__class__.__name__, self.in_channels, self.inner_channels, self.mask_classes, ) def reset_parameters(self) -> None: for layer in self.modules(): if isinstance(layer, (nn.Conv2d, nn.ConvTranspose2d)): initialize_conv_layer(module=layer, init_method="kaiming_normal") def forward(self, x: Tensor, boxes: Tensor, *args, **kwargs) -> Tensor: rois = self.roi_align(x, boxes) rois = self.seg_head(rois) return rois ================================================ FILE: corenet/modeling/modules/swin_transformer_block.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers import ( Dropout, LinearLayer, StochasticDepth, get_normalization_layer, ) from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule """ Most of the functions and classes below are heavily borrowed from torchvision https://github.com/pytorch/vision """ def _patch_merging_pad(x): H, W, _ = x.shape[-3:] x = F.pad(x, (0, 0, 0, W % 2, 0, H % 2)) return x class Permute(BaseModule): """This module returns a view of the tensor input with its dimensions permuted. Args: dims (List[int]): The desired ordering of dimensions """ def __init__(self, dims: List[int]): super().__init__() self.dims = dims def forward(self, x: Tensor) -> Tensor: return torch.permute(x, self.dims) def __repr__(self) -> str: s = f"{self.__class__.__name__}(dims={self.dims})" return s class PatchMerging(BaseModule): """Patch Merging Layer. Args: dim (int): Number of input channels. norm_layer (str): Normalization layer name. strided (Optional[bool]): Down-sample the input by a factor of 2. Default is True. """ def __init__(self, opts, dim: int, norm_layer: str, strided: Optional[bool] = True): super().__init__() self.dim = dim self.reduction = LinearLayer( in_features=4 * dim, out_features=2 * dim, bias=False ) self.norm = get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=4 * dim ) self.strided = strided def forward(self, x: Tensor, *args, **kwargs) -> Tensor: """ Args: x (Tensor): input tensor with expected layout of [..., H, W, C] Returns: Tensor with layout of [..., H/2, W/2, 2*C] """ x = _patch_merging_pad(x) if self.strided: x0 = x[..., 0::2, 0::2, :] # ... H/s W/s C x1 = x[..., 1::2, 0::2, :] # ... H/s W/s C x2 = x[..., 0::2, 1::2, :] # ... H/s W/s C x3 = x[..., 1::2, 1::2, :] # ... H/s W/s C x = torch.cat([x0, x1, x2, x3], -1) # ... H/s W/s 4*C else: x = torch.cat([x, x, x, x], -1) # H W 4*C x = self.norm(x) x = self.reduction(x) # ... H/2 W/2 2*C return x def __repr__(self) -> str: s = f"{self.__class__.__name__}(dim={self.dim})" return s def shifted_window_attention( input: Tensor, qkv_weight: Tensor, proj_weight: Tensor, relative_position_bias: Tensor, window_size: List[int], num_heads: int, shift_size: List[int], attention_dropout: float = 0.0, dropout: float = 0.0, qkv_bias: Optional[Tensor] = None, proj_bias: Optional[Tensor] = None, ): """ Window based multi-head self attention (W-MSA) module with relative position bias. It supports both of shifted and non-shifted window. Args: input (Tensor[N, H, W, C]): The input tensor or 4-dimensions. qkv_weight (Tensor[in_dim, out_dim]): The weight tensor of query, key, value. proj_weight (Tensor[out_dim, out_dim]): The weight tensor of projection. relative_position_bias (Tensor): The learned relative position bias added to attention. window_size (List[int]): Window size. num_heads (int): Number of attention heads. shift_size (List[int]): Shift size for shifted window attention. attention_dropout (float): Dropout ratio of attention weight. Default: 0.0. dropout (float): Dropout ratio of output. Default: 0.0. qkv_bias (Tensor[out_dim], optional): The bias tensor of query, key, value. Default: None. proj_bias (Tensor[out_dim], optional): The bias tensor of projection. Default: None. Returns: Tensor[N, H, W, C]: The output tensor after shifted window attention. """ B, H, W, C = input.shape # pad feature maps to multiples of window size pad_r = (window_size[1] - W % window_size[1]) % window_size[1] pad_b = (window_size[0] - H % window_size[0]) % window_size[0] x = F.pad(input, (0, 0, 0, pad_r, 0, pad_b)) _, pad_H, pad_W, _ = x.shape shift_size = shift_size.copy() # If window size is larger than feature size, there is no need to shift window if window_size[0] >= pad_H: shift_size[0] = 0 if window_size[1] >= pad_W: shift_size[1] = 0 # cyclic shift if sum(shift_size) > 0: x = torch.roll(x, shifts=(-shift_size[0], -shift_size[1]), dims=(1, 2)) # partition windows num_windows = (pad_H // window_size[0]) * (pad_W // window_size[1]) x = x.view( B, pad_H // window_size[0], window_size[0], pad_W // window_size[1], window_size[1], C, ) x = x.permute(0, 1, 3, 2, 4, 5).reshape( B * num_windows, window_size[0] * window_size[1], C ) # B*nW, Ws*Ws, C # multi-head attention qkv = F.linear(x, qkv_weight, qkv_bias) qkv = qkv.reshape(x.size(0), x.size(1), 3, num_heads, C // num_heads).permute( 2, 0, 3, 1, 4 ) q, k, v = qkv[0], qkv[1], qkv[2] q = q * (C // num_heads) ** -0.5 attn = q.matmul(k.transpose(-2, -1)) # add relative position bias attn = attn + relative_position_bias if sum(shift_size) > 0: # generate attention mask attn_mask = x.new_zeros((pad_H, pad_W)) h_slices = ( (0, -window_size[0]), (-window_size[0], -shift_size[0]), (-shift_size[0], None), ) w_slices = ( (0, -window_size[1]), (-window_size[1], -shift_size[1]), (-shift_size[1], None), ) count = 0 for h in h_slices: for w in w_slices: attn_mask[h[0] : h[1], w[0] : w[1]] = count count += 1 attn_mask = attn_mask.view( pad_H // window_size[0], window_size[0], pad_W // window_size[1], window_size[1], ) attn_mask = attn_mask.permute(0, 2, 1, 3).reshape( num_windows, window_size[0] * window_size[1] ) attn_mask = attn_mask.unsqueeze(1) - attn_mask.unsqueeze(2) attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill( attn_mask == 0, float(0.0) ) attn = attn.view( x.size(0) // num_windows, num_windows, num_heads, x.size(1), x.size(1) ) attn = attn + attn_mask.unsqueeze(1).unsqueeze(0) attn = attn.view(-1, num_heads, x.size(1), x.size(1)) attn = F.softmax(attn, dim=-1) attn = F.dropout(attn, p=attention_dropout) x = attn.matmul(v).transpose(1, 2).reshape(x.size(0), x.size(1), C) x = F.linear(x, proj_weight, proj_bias) x = F.dropout(x, p=dropout) # reverse windows x = x.view( B, pad_H // window_size[0], pad_W // window_size[1], window_size[0], window_size[1], C, ) x = x.permute(0, 1, 3, 2, 4, 5).reshape(B, pad_H, pad_W, C) # reverse cyclic shift if sum(shift_size) > 0: x = torch.roll(x, shifts=(shift_size[0], shift_size[1]), dims=(1, 2)) # unpad features x = x[:, :H, :W, :].contiguous() return x class ShiftedWindowAttention(BaseModule): """ See :func:`shifted_window_attention`. """ def __init__( self, dim: int, window_size: List[int], shift_size: List[int], num_heads: int, qkv_bias: bool = True, proj_bias: bool = True, attention_dropout: float = 0.0, dropout: float = 0.0, ): super().__init__() if len(window_size) != 2 or len(shift_size) != 2: raise ValueError("window_size and shift_size must be of length 2") self.window_size = window_size self.shift_size = shift_size self.num_heads = num_heads self.attention_dropout = attention_dropout self.dropout = dropout self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) self.proj = nn.Linear(dim, dim, bias=proj_bias) # define a parameter table of relative position bias self.relative_position_bias_table = nn.Parameter( torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads) ) # 2*Wh-1 * 2*Ww-1, nH # get pair-wise relative position index for each token inside the window coords_h = torch.arange(self.window_size[0]) coords_w = torch.arange(self.window_size[1]) coords = torch.stack( torch.meshgrid(coords_h, coords_w, indexing="ij") ) # 2, Wh, Ww coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww relative_coords = ( coords_flatten[:, :, None] - coords_flatten[:, None, :] ) # 2, Wh*Ww, Wh*Ww relative_coords = relative_coords.permute( 1, 2, 0 ).contiguous() # Wh*Ww, Wh*Ww, 2 relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0 relative_coords[:, :, 1] += self.window_size[1] - 1 relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 relative_position_index = relative_coords.sum(-1).view(-1) # Wh*Ww*Wh*Ww self.register_buffer("relative_position_index", relative_position_index) nn.init.trunc_normal_(self.relative_position_bias_table, std=0.02) self.embed_dim = dim def __repr__(self) -> str: return "{}(embed_dim={}, window_size={}, shift_size={}, num_heads={}, dropout={}, attn_dropout={}, dropout={})".format( self.__class__.__name__, self.embed_dim, self.window_size, self.shift_size, self.num_heads, self.attention_dropout, self.dropout, ) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: """ Args: x (Tensor): Tensor with layout of [B, H, W, C] Returns: Tensor with same layout as input, i.e. [B, H, W, C] """ N = self.window_size[0] * self.window_size[1] relative_position_bias = self.relative_position_bias_table[self.relative_position_index] # type: ignore[index] relative_position_bias = relative_position_bias.view(N, N, -1) relative_position_bias = ( relative_position_bias.permute(2, 0, 1).contiguous().unsqueeze(0) ) return shifted_window_attention( x, self.qkv.weight, self.proj.weight, relative_position_bias, self.window_size, self.num_heads, shift_size=self.shift_size, attention_dropout=self.attention_dropout, dropout=self.dropout, qkv_bias=self.qkv.bias, proj_bias=self.proj.bias, ) class SwinTransformerBlock(BaseModule): """ Swin Transformer Block. Args: dim (int): Number of input channels. num_heads (int): Number of attention heads. window_size (List[int]): Window size. shift_size (List[int]): Shift size for shifted window attention. mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0. dropout (float): Dropout rate. Default: 0.0. attention_dropout (float): Attention dropout rate. Default: 0.0. stochastic_depth_prob: (float): Stochastic depth rate. Default: 0.0. norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm. attn_layer (nn.Module): Attention layer. Default: ShiftedWindowAttention """ def __init__( self, opts, embed_dim: int, num_heads: int, window_size: List[int], shift_size: List[int], mlp_ratio: float = 4.0, dropout: float = 0.0, attn_dropout: Optional[float] = 0.0, ffn_dropout: Optional[float] = 0.0, stochastic_depth_prob: float = 0.0, norm_layer: Optional[str] = "layer_norm", ): super().__init__() attn_unit = ShiftedWindowAttention( embed_dim, window_size, shift_size, num_heads, attention_dropout=attn_dropout, dropout=dropout, ) self.attn = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=embed_dim ), attn_unit, Dropout(p=dropout), ) self.stochastic_depth = StochasticDepth(stochastic_depth_prob, "row") ffn_latent_dim = int(embed_dim * mlp_ratio) act_name = build_activation_layer(opts, num_parameters=1) self.mlp = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=embed_dim ), LinearLayer(in_features=embed_dim, out_features=ffn_latent_dim, bias=True), act_name, Dropout(p=ffn_dropout), LinearLayer(in_features=ffn_latent_dim, out_features=embed_dim, bias=True), Dropout(p=dropout), ) self.embed_dim = embed_dim self.ffn_dim = ffn_latent_dim self.ffn_dropout = ffn_dropout self.std_dropout = dropout self.attn_fn_name = attn_unit.__class__.__name__ self.act_fn_name = act_name.__class__.__name__ self.norm_type = norm_layer def __repr__(self) -> str: return "{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, attn_fn={}, act_fn={}, norm_fn={})".format( self.__class__.__name__, self.embed_dim, self.ffn_dim, self.std_dropout, self.ffn_dropout, self.attn_fn_name, self.act_fn_name, self.norm_type, ) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: x = x + self.stochastic_depth(self.attn(x)) x = x + self.stochastic_depth(self.mlp(x)) return x ================================================ FILE: corenet/modeling/modules/transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional from torch import Tensor, nn from corenet.modeling.layers import ( ConvLayer2d, Dropout, Identity, LinearLayer, LinearSelfAttention, MultiHeadAttention, SingleHeadAttention, StochasticDepth, get_normalization_layer, ) from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.modules import BaseModule from corenet.utils import logger class TransformerEncoder(BaseModule): """ This class defines the pre-norm `Transformer encoder `_ Args: opts: Command line arguments. embed_dim: :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})`. ffn_latent_dim: Inner dimension of the FFN. num_heads: Number of heads in multi-head attention. Default: 8. attn_dropout: Dropout rate for attention in multi-head attention. Default: 0.0 dropout: Dropout rate. Default: 0.0. ffn_dropout: Dropout between FFN layers. Default: 0.0. transformer_norm_layer: Normalization layer. Default: layer_norm. stochastic_dropout: Stochastic dropout setting. Default: 0.0. Shape: - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches, and :math:`C_{in}` is input embedding dim - Output: same shape as the input """ def __init__( self, opts: argparse.Namespace, embed_dim: int, ffn_latent_dim: int, num_heads: Optional[int] = 8, attn_dropout: Optional[float] = 0.0, dropout: Optional[float] = 0.0, ffn_dropout: Optional[float] = 0.0, transformer_norm_layer: Optional[str] = "layer_norm", stochastic_dropout: Optional[float] = 0.0, *args, **kwargs, ) -> None: super().__init__() attn_unit = SingleHeadAttention( embed_dim=embed_dim, attn_dropout=attn_dropout, bias=True ) if num_heads > 1: attn_unit = MultiHeadAttention( embed_dim, num_heads, attn_dropout=attn_dropout, bias=True, coreml_compatible=getattr( opts, "common.enable_coreml_compatible_module", False ), ) self.pre_norm_mha = nn.Sequential( get_normalization_layer( opts=opts, norm_type=transformer_norm_layer, num_features=embed_dim ), attn_unit, Dropout(p=dropout), ) act_name = build_activation_layer(opts, num_parameters=1) self.pre_norm_ffn = nn.Sequential( get_normalization_layer( opts=opts, norm_type=transformer_norm_layer, num_features=embed_dim ), LinearLayer(in_features=embed_dim, out_features=ffn_latent_dim, bias=True), act_name, Dropout(p=ffn_dropout), LinearLayer(in_features=ffn_latent_dim, out_features=embed_dim, bias=True), Dropout(p=dropout), ) self.drop_path = Identity() if stochastic_dropout > 0.0: if dropout > 0.0: logger.error( "Stochastic dropout and dropout are mutually exclusive. " "Use either of them, but not both." "Got: {} and {}".format(stochastic_dropout, dropout) ) self.drop_path = StochasticDepth(p=stochastic_dropout, mode="row") self.embed_dim = embed_dim self.ffn_dim = ffn_latent_dim self.ffn_dropout = ffn_dropout self.stochastic_dropout = stochastic_dropout self.std_dropout = dropout self.attn_fn_name = attn_unit.__class__.__name__ self.act_fn_name = act_name.__class__.__name__ self.norm_type = transformer_norm_layer def __repr__(self) -> str: return "{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, stochastic_dropout={}, attn_fn={}, act_fn={}, norm_fn={})".format( self.__class__.__name__, self.embed_dim, self.ffn_dim, self.std_dropout, self.ffn_dropout, self.stochastic_dropout, self.attn_fn_name, self.act_fn_name, self.norm_type, ) def forward( self, x: Tensor, x_prev: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, *args, **kwargs, ) -> Tensor: # Multi-head attention res = x x = self.pre_norm_mha[0](x) # norm x = self.pre_norm_mha[1]( x_q=x, x_kv=x_prev, key_padding_mask=key_padding_mask, attn_mask=attn_mask, *args, **kwargs, ) # mha x = self.drop_path(self.pre_norm_mha[2](x)) # applying stochastic depth x = x + res # Feed forward network x = x + self.drop_path(self.pre_norm_ffn(x)) return x class LinearAttnFFN(BaseModule): """ This class defines the pre-norm transformer encoder with linear self-attention in `MobileViTv2 `_ paper Args: opts: command line arguments embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, P, N)` ffn_latent_dim (int): Inner dimension of the FFN attn_dropout (Optional[float]): Dropout rate for attention in multi-head attention. Default: 0.0 dropout (Optional[float]): Dropout rate. Default: 0.0 ffn_dropout (Optional[float]): Dropout between FFN layers. Default: 0.0 norm_layer (Optional[str]): Normalization layer. Default: layer_norm_2d Shape: - Input: :math:`(B, C_{in}, P, N)` where :math:`B` is batch size, :math:`C_{in}` is input embedding dim, :math:`P` is number of pixels in a patch, and :math:`N` is number of patches, - Output: same shape as the input """ def __init__( self, opts, embed_dim: int, ffn_latent_dim: int, attn_dropout: Optional[float] = 0.0, dropout: Optional[float] = 0.1, ffn_dropout: Optional[float] = 0.0, norm_layer: Optional[str] = "layer_norm_2d", *args, **kwargs, ) -> None: super().__init__() attn_unit = LinearSelfAttention( opts, embed_dim=embed_dim, attn_dropout=attn_dropout, bias=True ) self.pre_norm_attn = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=embed_dim ), attn_unit, Dropout(p=dropout), ) self.pre_norm_ffn = nn.Sequential( get_normalization_layer( opts=opts, norm_type=norm_layer, num_features=embed_dim ), ConvLayer2d( opts=opts, in_channels=embed_dim, out_channels=ffn_latent_dim, kernel_size=1, stride=1, bias=True, use_norm=False, use_act=True, ), Dropout(p=ffn_dropout), ConvLayer2d( opts=opts, in_channels=ffn_latent_dim, out_channels=embed_dim, kernel_size=1, stride=1, bias=True, use_norm=False, use_act=False, ), Dropout(p=dropout), ) self.embed_dim = embed_dim self.ffn_dim = ffn_latent_dim self.ffn_dropout = ffn_dropout self.std_dropout = dropout self.attn_fn_name = attn_unit.__repr__() self.norm_name = norm_layer def __repr__(self) -> str: return "{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, attn_fn={}, norm_layer={})".format( self.__class__.__name__, self.embed_dim, self.ffn_dim, self.std_dropout, self.ffn_dropout, self.attn_fn_name, self.norm_name, ) def forward( self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs ) -> Tensor: if x_prev is None: # self-attention x = x + self.pre_norm_attn(x) else: # cross-attention res = x x = self.pre_norm_attn[0](x) # norm x = self.pre_norm_attn[1](x, x_prev) # attn x = self.pre_norm_attn[2](x) # drop x = x + res # residual # Feed forward network x = x + self.pre_norm_ffn(x) return x ================================================ FILE: corenet/modeling/modules/windowed_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional, Tuple import torch from torch import Tensor from corenet.modeling.layers import token_merging from corenet.modeling.modules import transformer def window_partition(t: torch.Tensor, window_size: int) -> torch.Tensor: """ Partition tensor @t into chunks of size @window_size. @t's sequence length must be divisible by @window_size. Args: t: A tensor of shape [batch_size, sequence_length, embed_dim]. window_size: The desired window size. Returns: A tensor of shape [batch_size * sequence_length // window_size, window_size, embed_dim]. """ B, N, C = t.shape if not N % window_size == 0: raise ValueError( f"sequence length {N} must be divisible by window size {window_size}" ) t = t.reshape(B * N // window_size, window_size, C) return t def window_partition_reverse( t: torch.Tensor, B: int, num_windows: int, C: int ) -> torch.Tensor: """ Undo the @window_partition operation. Args: t: The input tensor of shape [batch_size * num_windows, window_size, embed_dim]. B: The batch size. num_windows: The number of windows. C: The embedding dimension. Returns: A tensor of shape [batch_size, num_windows * window_size, embed_dim]. """ t = t.reshape(B, num_windows * t.shape[1], C) return t def get_windows_shift_mask( N: int, window_size: int, window_shift: int, device: torch.device ) -> torch.Tensor: """ Get the mask window required due to window shifting (needed for shifted window attention). This produces a tensor with mask values for each window. Most windows don't require masking, but windows that bleed across the beginning/end of the tensor (due to shifting) require it. Args: N: The sequence length. window_size: The window size. window_shift: The window shift. device: The device on which to create the tensor. Returns: A tensor of shape [N // window_size, window_size, window_size] containing mask values. The values are 0 (unmasked) or float("-inf") (masked). """ ret = torch.zeros(N // window_size, window_size, window_size, device=device) ret[-1].fill_(float("-inf")) ret[-1, : window_size - window_shift, : window_size - window_shift] = 0 ret[-1, -window_shift:, -window_shift:] = 0 return ret def window_x_and_key_padding_mask( x: torch.Tensor, key_padding_mask: torch.Tensor, window_size: int, window_shift: int ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: """ Perform windowing on @x and @key_padding_mask in preparation for windowed attention. Args: x: The input tensor of shape [batch_size, sequence_length, num_channels]. key_padding_mask: The mask, as a tensor of shape [batch_size, sequence_length]. window_size: The window size to be used for windowed attention. window_shift: The window shift to be used for windowed attention. Returns: A tuple containing 3 tensors. The first is the windowed input. The second is the windowed mask. The third is the mask needed to perform shifted window attention (to avoid the first and last windows from bleeding into each other). """ B, N = key_padding_mask.shape assert x.shape[:2] == (B, N) x, key_padding_mask = token_merging.pad_x_and_mask(x, key_padding_mask, window_size) # Now, perform the windowing. if window_shift > 0: x = torch.roll(x, shifts=(-window_shift), dims=1) key_padding_mask = torch.roll(key_padding_mask, shifts=(-window_shift), dims=1) x_windows = window_partition(x, window_size) token_mask_windows = key_padding_mask.reshape( B * x.shape[1] // window_size, window_size ) window_mask = get_windows_shift_mask( x.shape[1], window_size, window_shift, x_windows.device ).expand(B, -1, -1, -1) window_mask = window_mask.reshape( window_mask.shape[0] * window_mask.shape[1], window_mask.shape[2], window_mask.shape[3], ) return x_windows, token_mask_windows, window_mask def unwindow_x(x_windows: torch.Tensor, B: int, N: int, C: int, window_shift: int): """ Undoes the operation of @window_x_and_attention on the input tensor @x_windows. Args: x_windows: The input tensor to unwindow. Its shape is [batch_size * padded_sequence_length // window_size, window_size, embed_dim]. B: The batch size. Referred to as batch_size in this docstring. N: The sequence length of the tensor before windowing. Referred to as sequence_length in this docstring. C: The number of channels. Referred to as embed_dim in this docstring. window_shift: The shift applied to the sequence before the windowing originally occurred. Returns: A tensor of shape [batch_size, sequence_length, embed_dim]. """ num_windows = x_windows.shape[0] // B x = window_partition_reverse(x_windows, B, num_windows, C) if window_shift > 0: x = torch.roll(x, shifts=window_shift, dims=1) x = x[:, :N] return x class WindowedTransformerEncoder(transformer.TransformerEncoder): """ This class defines the pre-norm `Transformer encoder `_ with the addition of windowed attention. This class first partitions the input sequence into a series of windows (with an optional offset to use when defining windows). Then, it calls a TransformerEncoder module. Then, it undoes windowing. Args: opts: Command line arguments. embed_dim: :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})`. ffn_latent_dim: Inner dimension of the FFN. num_heads: Number of heads in multi-head attention. Default: 8. attn_dropout: Dropout rate for attention in multi-head attention. Default: 0.0. dropout: Dropout rate. Default: 0.0. ffn_dropout: Dropout between FFN layers. Default: 0.0. transformer_norm_layer: Normalization layer. Default: layer_norm. stochastic_dropout: Stochastic dropout setting. Default: 0.0. window_size: The size of the window, if using windowed attention. Default: None. window_shift: The size of the shift, if using shifted windowed attention. Default: None. Shape: - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches, and :math:`C_{in}` is input embedding dim - Output: same shape as the input """ def __init__( self, opts: argparse.Namespace, embed_dim: int, ffn_latent_dim: int, num_heads: Optional[int] = 8, attn_dropout: Optional[float] = 0.0, dropout: Optional[float] = 0.0, ffn_dropout: Optional[float] = 0.0, transformer_norm_layer: Optional[str] = "layer_norm", stochastic_dropout: Optional[float] = 0.0, window_size: Optional[int] = None, window_shift: Optional[int] = None, *args, **kwargs, ) -> None: super().__init__( opts=opts, embed_dim=embed_dim, ffn_latent_dim=ffn_latent_dim, num_heads=num_heads, attn_dropout=attn_dropout, dropout=dropout, ffn_dropout=ffn_dropout, transformer_norm_layer=transformer_norm_layer, stochastic_dropout=stochastic_dropout, ) if window_size is None: raise ValueError("Please specify window_size") if window_shift is None: raise ValueError("Please specify window_shift") self.window_size: int = window_size self.window_shift: int = window_shift def forward( self, x: Tensor, x_prev: Optional[Tensor] = None, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, *args, **kwargs, ) -> Tensor: """ Compute the outputs of the WindowedTransformerEncoder on an input. Args: x: The input tensor, of shape [batch_size, sequence_length, embed_dim]. x_prev: The context input, if using cross-attention. Its shape is [batch_size, sequence_length_2, embed_dim]. key_padding_mask: An optional tensor of masks to be applied to the inputs @x. Its shape is [batch_size, sequence_length]. attn_mask: An optional attention mask. Its shape is [batch_size, sequence_length, sequence_length_2]. (If using self-attention, the sequence lengths will be equal.) Returns: The WindowedTransformerEncoder output. """ B, N, C = x.shape x, windowed_key_padding_mask, windows_mask = window_x_and_key_padding_mask( x, key_padding_mask, self.window_size, self.window_shift ) total_mask = windowed_key_padding_mask.unsqueeze(1) + windows_mask if attn_mask is not None: total_mask += attn_mask # If an entire window is masked out, attention is computed across # only -inf values, which gives NaN. We instead set these masks to # 0 to avoid this. fully_masked_windows = total_mask.max(dim=-1).values == float("-inf") total_mask[fully_masked_windows] = 0 x = super().forward(x, x_prev, attn_mask=attn_mask) # Undo windowing. x = unwindow_x(x, B, N, C, self.window_shift) return x def __repr__(self) -> str: # Remove closing parentheses from parent __repr__ call. ret = super().__repr__()[:-1] return f"{ret}, {self.window_size}, {self.window_shift})" ================================================ FILE: corenet/modeling/neural_augmentor/__init__.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.neural_augmentor.neural_aug import ( BaseNeuralAugmentor, build_neural_augmentor, ) def arguments_neural_augmentor( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: return BaseNeuralAugmentor.add_arguments(parser=parser) ================================================ FILE: corenet/modeling/neural_augmentor/neural_aug.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import List, Optional import torch from torch import Tensor, nn from corenet.modeling.misc.common import parameter_list from corenet.modeling.neural_augmentor.utils.neural_aug_utils import ( Clip, FixedSampler, UniformSampler, random_brightness, random_contrast, random_noise, ) from corenet.utils import logger _distribution_tuple = (UniformSampler,) class BaseNeuralAugmentor(nn.Module): """ Base class for `neural (or range) augmentation `_ """ def __init__(self, opts, *args, **kwargs): super().__init__() self.opts = opts self.lr_multiplier = getattr( opts, "model.learn_augmentation.lr_multiplier", 1.0 ) # Set variables corresponding to different transforms to None. # We will override them in child classes with learnable versions self.brightness = None self.contrast = None self.noise = None self.aug_fns = [] def _is_valid_aug_fn_list(self, aug_fns): if self.training: if len(aug_fns) == 0: logger.error( "{} needs at least one learnable function.".format( self.__class__.__name__ ) ) def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs ): """Get trainable parameters""" param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, ) return param_list, [self.lr_multiplier] * len(param_list) def __repr__(self): aug_str = "{}(".format(self.__class__.__name__) if self.brightness is not None: aug_str += "\n\tBrightness={}, ".format( self.brightness.data.shape if isinstance(self.brightness, nn.Parameter) else self.brightness ) if self.contrast is not None: aug_str += "\n\tContrast={}, ".format( self.contrast.data.shape if isinstance(self.contrast, nn.Parameter) else self.contrast ) if self.noise is not None: aug_str += "\n\tNoise={}, ".format( self.noise.data.shape if isinstance(self.noise, nn.Parameter) else self.noise ) aug_str += self.extra_repr() aug_str += ")" return aug_str @classmethod def add_arguments(cls, parser: argparse.ArgumentParser): """Add model-specific arguments""" group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.learn-augmentation.mode", type=str, default=None, choices=["basic", "distribution"], help="Neural augmentation mode", ) group.add_argument( "--model.learn-augmentation.brightness", action="store_true", help="Learn parameters for brightness", ) group.add_argument( "--model.learn-augmentation.contrast", action="store_true", help="Learn parameters for contrast", ) group.add_argument( "--model.learn-augmentation.noise", action="store_true", help="Learn parameters for noise", ) # LR multiplier group.add_argument( "--model.learn-augmentation.lr-multiplier", type=float, default=1.0, help="LR multiplier for neural aug parameters", ) return parser def _build_aug_fns(self, opts) -> List: raise NotImplementedError def _apply_brightness(self, x: Tensor, *args, **kwargs) -> Tensor: """ Apply brightness augmentation function with learnable parameters. """ # self._check_brightness_bounds() x_shape = [*x.shape] x_shape[1:] = [1] * (len(x_shape) - 1) if isinstance(self.brightness, nn.Parameter): # learning a fixed number of parameters magnitude = self.brightness elif isinstance(self.brightness, _distribution_tuple): # learning a distribution range from which parameter is sampled. magnitude = self.brightness(x_shape, device=x.device, data_type=x.dtype) else: raise NotImplementedError return random_brightness(x, magnitude, *args, **kwargs) def _apply_contrast(self, x: Tensor, *args, **kwargs) -> Tensor: """ Apply contrast augmentation function with learnable parameters. """ # self._check_contrast_bounds() x_shape = [*x.shape] x_shape[1:] = [1] * (len(x_shape) - 1) if isinstance(self.contrast, nn.Parameter): # learning a fixed number of parameters magnitude = self.contrast elif isinstance(self.contrast, _distribution_tuple): # learning a distribution range from which parameter is sampled. magnitude = self.contrast(x_shape, device=x.device, data_type=x.dtype) else: raise NotImplementedError return random_contrast(x, magnitude, *args, *kwargs) def _apply_noise(self, x: Tensor, *args, **kwargs) -> Tensor: # self._check_noise_bounds() x_shape = [*x.shape] x_shape[1:] = [1] * (len(x_shape) - 1) if isinstance(self.noise, nn.Parameter): # learning a fixed number of parameters variance = self.noise elif isinstance(self.noise, _distribution_tuple): # learning a distribution range from which parameter is sampled. variance = self.noise(x_shape, device=x.device, data_type=x.dtype) else: raise NotImplementedError return random_noise(x, variance, *args, *kwargs) def forward(self, x: Tensor, *args, **kwargs) -> Tensor: batch_size, in_channels, in_height, in_width = x.shape # Randomly apply augmentation to 50% of the samples n_aug_samples = max(1, (batch_size // 2)) # shuffle the order of augmentations random.shuffle(self.aug_fns) for aug_fn in self.aug_fns: # select 50% samples for augmentation sample_ids = torch.randperm( n=batch_size, dtype=torch.long, device=x.device )[:n_aug_samples] x_aug = torch.index_select(x, dim=0, index=sample_ids) # apply augmentation x_aug = aug_fn(x=x_aug) # copy augmented samples to tensor x = torch.index_copy(x, dim=0, source=x_aug, index=sample_ids) # clip the values so that they are between 0 and 1 x = torch.clip(x, min=0.0, max=1.0) return x class BasicNeuralAugmentor(BaseNeuralAugmentor): """ Basic neural augmentation. This class learns per-channel augmentation parameters and apply the same parameter to all images in a batch. See `neural (or range) augmentation `_ paper for details. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) aug_fns = self._build_aug_fns(opts=opts) self._is_valid_aug_fn_list(aug_fns) self.aug_fns = aug_fns def _build_aug_fns(self, opts) -> List: aug_fns = [] if getattr(opts, "model.learn_augmentation.brightness", False): self.brightness = FixedSampler( value=1.0, clip_fn=Clip(min_val=0.1, max_val=10.0) ) aug_fns.append(self._apply_brightness) if getattr(opts, "model.learn_augmentation.contrast", False): self.contrast = FixedSampler( value=1.0, clip_fn=Clip(min_val=0.1, max_val=10.0) ) aug_fns.append(self._apply_contrast) if getattr(opts, "model.learn_augmentation.noise", False): self.noise = FixedSampler(value=0.0, clip_fn=Clip(min_val=0.0, max_val=1.0)) aug_fns.append(self._apply_noise) return aug_fns class DistributionNeuralAugmentor(BaseNeuralAugmentor): """ Distribution-based neural (or range) augmentation. This class samples the augmentation parameters from a specified distribution with learnable range. See `neural (or range) augmentation `_ paper for details. """ def __init__(self, opts, *args, **kwargs) -> None: super().__init__(opts=opts, *args, **kwargs) aug_fns = self._build_aug_fns_with_uniform_dist(opts=opts) self._is_valid_aug_fn_list(aug_fns) self.aug_fns = aug_fns def _build_aug_fns_with_uniform_dist(self, opts) -> List: # need to define the learnable parameters in a way that are compatible with bucketing aug_fns = [] if getattr(opts, "model.learn_augmentation.brightness", False): self.brightness = UniformSampler( low=0.5, high=1.5, min_fn=Clip(min_val=0.1, max_val=0.9), max_fn=Clip(min_val=1.1, max_val=10.0), ) aug_fns.append(self._apply_brightness) if getattr(opts, "model.learn_augmentation.contrast", False): self.contrast = UniformSampler( low=0.5, high=1.5, min_fn=Clip(min_val=0.1, max_val=0.9), max_fn=Clip(min_val=1.1, max_val=10.0), ) aug_fns.append(self._apply_contrast) if getattr(opts, "model.learn_augmentation.noise", False): self.noise = UniformSampler( low=0.0, high=0.1, min_fn=Clip(min_val=0.0, max_val=0.00005), max_fn=Clip(min_val=0.0001, max_val=1.0), ) aug_fns.append(self._apply_noise) return aug_fns def build_neural_augmentor(opts, *args, **kwargs): mode = getattr(opts, "model.learn_augmentation.mode", None) if mode is None: mode = "none" mode = mode.lower() if mode == "distribution": return DistributionNeuralAugmentor(opts=opts, *args, **kwargs) elif mode == "basic": return BasicNeuralAugmentor(opts=opts, *args, **kwargs) else: return None ================================================ FILE: corenet/modeling/neural_augmentor/utils/__init__.py ================================================ ================================================ FILE: corenet/modeling/neural_augmentor/utils/neural_aug_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, Optional import torch from torch import Tensor, nn class Clip(nn.Module): def __init__( self, min_val: float, max_val: float, hard_clip: Optional[bool] = False, *args, **kwargs, ) -> None: super().__init__() self.min_val = min_val self.max_val = max_val self.hard_clip = hard_clip def forward(self, x: Any) -> Any: if self.hard_clip: with torch.no_grad(): return x.clamp_(min=self.min_val, max=self.max_val) else: return (torch.sigmoid(x) * (self.max_val - self.min_val)) + self.min_val def __repr__(self): return "{}(min={}, max={}, clipping={})".format( self.__class__.__name__, self.min_val, self.max_val, "hard" if self.hard_clip else "soft", ) class Identity(nn.Module): def __init__(self, *args, **kwargs): super().__init__() def forward(self, x: Any) -> Any: return x class FixedSampler(nn.Module): def __init__( self, value: float, clip_fn: Optional[nn.Module] = Identity(), *args, **kwargs, ): super().__init__() self._value = nn.Parameter(torch.FloatTensor(1, 3, 1, 1).fill_(value)) self.clip_fn = clip_fn def forward( self, sample_shape=(), data_type=torch.float, device=torch.device("cpu") ) -> Tensor: # sample values from uniform distribution return self.clip_fn(self._value) def __repr__(self): return "{}(clip_fn={})".format( self.__class__.__name__, self.clip_fn, ) class UniformSampler(nn.Module): def __init__( self, low: float, high: float, min_fn: Optional[nn.Module] = Identity(), max_fn: Optional[nn.Module] = Identity(), *args, **kwargs, ): super().__init__() self._low = nn.Parameter(torch.tensor(low, dtype=torch.float)) self._high = nn.Parameter(torch.tensor(high, dtype=torch.float)) self.min_fn = min_fn self.max_fn = max_fn def forward( self, sample_shape=(), data_type=torch.float, device=torch.device("cpu") ) -> Tensor: # sample values from uniform distribution rand_tensor = torch.rand(sample_shape, dtype=data_type, device=device) return self.low + rand_tensor * (self.high - self.low) @property def high(self): return self.max_fn(self._high) @property def low(self): return self.min_fn(self._low) def __repr__(self): return "{}(min_fn={}, max_fn={})".format( self.__class__.__name__, self.min_fn, self.max_fn, ) def random_noise(x: Tensor, variance: Tensor, *args, **kwargs) -> Tensor: """Apply random noise sampled.""" noise = torch.randn_like(x) * variance x = x + noise return x def random_contrast(x: Tensor, magnitude: Tensor, *args, **kwargs) -> Tensor: # compute per-channel mean per_channel_mean = torch.mean(x, dim=[-1, -2], keepdim=True) # contrast can be written as # (1 - contrast_factor) * per_channel_mean + img * contrast_factor x = ((1.0 - magnitude) * per_channel_mean) + (x * magnitude) return x def random_brightness(x: Tensor, magnitude: Tensor, *args, **kwargs) -> Tensor: """ Brightness function. """ x = x * magnitude return x def identity(x: Tensor, *args, **kwargs) -> Tensor: """Identity function""" return x ================================================ FILE: corenet/modeling/text_encoders/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.text_encoders.base_text_encoder import BaseTextEncoder from corenet.utils import logger from corenet.utils.registry import Registry TEXT_ENCODER_REGISTRY = Registry( "text_encoder", base_class=BaseTextEncoder, lazy_load_dirs=["corenet/modeling/text_encoders"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def arguments_text_encoder(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Register arguments of all text encoders.""" # add arguments for text_encoder parser = BaseTextEncoder.add_arguments(parser) # add class specific arguments parser = TEXT_ENCODER_REGISTRY.all_arguments(parser) return parser def build_text_encoder(opts, projection_dim: int, *args, **kwargs) -> BaseTextEncoder: """Helper function to build the text encoder from command-line arguments. Args: opts: Command-line arguments projection_dim: The dimensionality of the projection head after text encoder. Returns: Text encoder module. """ text_encoder_name = getattr(opts, "model.text.name") # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if text_encoder_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") text_encoder = TEXT_ENCODER_REGISTRY[text_encoder_name]( opts, projection_dim, *args, **kwargs ) return text_encoder ================================================ FILE: corenet/modeling/text_encoders/base_text_encoder.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Callable, Dict, Optional import torch from torch import Tensor, nn from corenet.modeling import parameter_list from corenet.modeling.layers import norm_layers_tuple from corenet.modeling.misc.init_utils import initialize_weights from corenet.utils.ddp_utils import is_master class BaseTextEncoder(nn.Module): """Base class for text encoder""" def __init__(self, opts, projection_dim: int, *args, **kwargs) -> None: is_master_node = is_master(opts) super(BaseTextEncoder, self).__init__() self.opts = opts self.projection_dim = projection_dim self.is_master_node = is_master_node @property def vocab_size(self): vocab_size = getattr(self.opts, "model.text.vocab_size") assert ( vocab_size is not None ), "Vocab size can't be None. Please specify 'model.text.vocab_size' argument." return vocab_size @property def context_length(self): context_length = getattr(self.opts, "model.text.context_length") assert ( context_length is not None ), "Context length can't be None. Please specify 'model.text.context_length' argument." return context_length @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add model specific arguments""" if cls == BaseTextEncoder: group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.text.name", type=str, default=None, help="Name of the text encoder", ) group.add_argument( "--model.text.padding-index", default=None, type=int, help="Padding index. Defaults to None.", ) group.add_argument( "--model.text.context-length", default=None, type=int, help="Context length. Defaults to None.", ) group.add_argument( "--model.text.vocab-size", default=None, type=int, help="Vocabulary size. Defaults to None.", ) return parser @property def padding_index(self) -> int: """Padding index.""" pad_index = getattr(self.opts, "model.text.padding_index") assert ( pad_index is None or pad_index > -1 ), "Padding index should be None or a non-negative number." return pad_index def reset_parameters(self): """Initialize model weights""" initialize_weights(opts=self.opts, modules=self.modules()) def get_trainable_parameters( self, weight_decay: Optional[float] = 0.0, no_decay_bn_filter_bias: Optional[bool] = False, *args, **kwargs ): param_list = parameter_list( named_parameters=self.named_parameters, weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs ) return param_list, [1.0] * len(param_list) def freeze_norm_layers(self) -> None: for m in self.modules(): if isinstance(m, norm_layers_tuple): m.eval() m.weight.requires_grad = False m.bias.requires_grad = False m.training = False def forward( self, text_tokens: Tensor, key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, *args, **kwargs ) -> Any: raise NotImplementedError def dummy_input_and_label(self, batch_size: int) -> Dict: """Create dummy input and labels for CI/CD purposes. Child classes must override it if functionality is different. """ seq_length = 77 vocab_size = 10 text_tensor = torch.randint( low=0, high=vocab_size, size=(batch_size, seq_length) ).long() return {"text": text_tensor} def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns model's submodule that needs to be checkpointed. Activations of checkpointed module are stored, and recomputed during the backward pass, thus providing a trade-off between memory and compute. """ raise NotImplementedError("Activation checkpoint module is not implemented.") ================================================ FILE: corenet/modeling/text_encoders/transformer.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from typing import Callable, Optional, Sequence import torch from torch import Tensor, nn from torch.nn import functional as F from corenet.modeling.layers import ( Dropout, Embedding, PositionalEmbedding, get_normalization_layer, ) from corenet.modeling.modules import TransformerEncoder from corenet.modeling.text_encoders import TEXT_ENCODER_REGISTRY, BaseTextEncoder from corenet.utils import logger @TEXT_ENCODER_REGISTRY.register(name="transformer") class TextTransformer(BaseTextEncoder): """Transformer-based text encoder. Args: opts: Command-line arguments. projection_dim: Projection dimension. """ def __init__(self, opts, projection_dim: int, *args, **kwargs) -> None: model_dim = getattr(opts, "model.text.transformer.model_dim") no_scale_embedding = getattr(opts, "model.text.transformer.no_scale_embedding") no_pos_embedding = getattr(opts, "model.text.transformer.no_pos_embedding") embed_dropout = getattr(opts, "model.text.transformer.embed_dropout") dropout = getattr(opts, "model.text.transformer.dropout") attn_dropout = getattr(opts, "model.text.transformer.attn_dropout") ffn_dropout = getattr(opts, "model.text.transformer.ffn_dropout") norm_layer = getattr(opts, "model.text.transformer.norm_layer") if norm_layer is None: logger.error( "Normalization layer can not be None in {}".format( self.__class__.__name__ ) ) super().__init__(opts=opts, projection_dim=projection_dim, *args, **kwargs) # token embedding layer self.embedding_layer = Embedding( opts=opts, embedding_dim=model_dim, padding_idx=self.padding_index, num_embeddings=self.vocab_size, ) self.embed_scale = 1.0 if no_scale_embedding else model_dim**-0.5 self.positional_embedding = ( None if no_pos_embedding else PositionalEmbedding( opts=opts, num_embeddings=self.context_length, embedding_dim=model_dim, padding_idx=self.padding_index, is_learnable=not getattr( opts, "model.text.transformer.sinusoidal_pos_emb" ), ) ) self.embedding_dropout = Dropout(p=embed_dropout) n_transformer_layers = getattr( opts, "model.text.transformer.n_transformer_layers" ) # FFN multipliers for transformer layer ffn_multipliers = getattr( opts, "model.text.transformer.ffn_multiplier_per_layer" ) if isinstance(ffn_multipliers, (float, int)): ffn_multipliers = [ffn_multipliers] * n_transformer_layers if not isinstance(ffn_multipliers, Sequence): logger.error( "{} expects FFN multipliers as a list, whose length is the same as number of " "transformer layers. Got: {}".format( self.__class__.__name__, type(ffn_multipliers) ) ) elif ( isinstance(ffn_multipliers, Sequence) and len(ffn_multipliers) != n_transformer_layers ): logger.error( "We need FFN multiplier for each transformer layer. Got {} ffn multipliers while number of " "transformer layers = {}".format( len(ffn_multipliers), n_transformer_layers ) ) ffn_dims = [ int(math.ceil(model_dim * ffn_mult / 16.0) * 16.0) for ffn_mult in ffn_multipliers ] # Heads for transformer layers mha_heads = getattr(opts, "model.text.transformer.n_heads_per_layer") if isinstance(mha_heads, int): mha_heads = [mha_heads] * n_transformer_layers if not isinstance(mha_heads, Sequence): logger.error( "{} expects MHA heads as a list, whose length is the same as number of " "transformer layers. Got: {}".format( self.__class__.__name__, type(mha_heads) ) ) elif isinstance(mha_heads, Sequence) and len(mha_heads) != n_transformer_layers: logger.error( "{} needs MHA heads for each transformer layer. Got {} mha heads while number of " "transformer layers = {}".format( self.__class__.__name__, len(mha_heads), n_transformer_layers ) ) self.transformer = nn.ModuleList( [ TransformerEncoder( opts=opts, embed_dim=model_dim, num_heads=mha_heads[layer_idx], ffn_latent_dim=ffn_dims[layer_idx], attn_dropout=attn_dropout, ffn_dropout=ffn_dropout, dropout=dropout, transformer_norm_layer=norm_layer, ) for layer_idx in range(n_transformer_layers) ] ) self.final_layer_norm = get_normalization_layer( opts, num_features=model_dim, norm_type=norm_layer ) self.projection_layer = nn.Parameter( torch.empty(model_dim, self.projection_dim) ) self.model_dim = model_dim self.reset_parameters_clip_style() self.classes_per_split_zero_shot = max( 1, int(getattr(opts, "model.text.transformer.classes_per_split_zero_shot")) ) self.cached_attn_mask = None def build_causal_attention_mask( self, context_length: int, batch_size: int, device: torch.device, dtype: torch.dtype, ) -> Optional[Tensor]: """Builds the causal attention mask. Args: context_length: Context length. batch_size: Batch size. device: Device on which mask should be created. dtype: Data type of the mask. Returns: An output tensor of the [batch size, context length, context length] if causal masking is enabled using 'model.text.transformer.causal_masking'. Otherwise, None is returned. """ if getattr(self.opts, "model.text.transformer.causal_masking"): if self.cached_attn_mask is None: assert context_length <= self.context_length mask = torch.empty( self.context_length, self.context_length, device=device, dtype=dtype ) mask.fill_(float("-inf")) mask.triu_(1) self.cached_attn_mask = mask mask = self.cached_attn_mask[:context_length, :context_length] # add a dummy batch dimension and repeat it. mask = mask.unsqueeze(0) mask = mask.expand(batch_size, -1, -1) return mask.to(device=device, dtype=dtype) return None def reset_parameters_clip_style(self) -> None: """This function resets the weights of Transformer model as done in the CLIP paper""" # reset the weights of the embedding and positional embedding layers nn.init.normal_(self.embedding_layer.weight, mean=0.0, std=0.02) # compute standard deviation for different linear layers in transformer model attn_std = self.model_dim**-0.5 proj_std = attn_std * ((2 * len(self.transformer)) ** -0.5) fc_std = (2 * self.model_dim) ** -0.5 for block in self.transformer: # multi-head attention QKV projection layer nn.init.normal_( block.pre_norm_mha[1].qkv_proj.weight, mean=0.0, std=attn_std ) # multi-head attention output projection layer nn.init.normal_( block.pre_norm_mha[1].out_proj.weight, mean=0.0, std=proj_std ) # FFN expansion layer nn.init.normal_(block.pre_norm_ffn[1].weight, mean=0.0, std=fc_std) # FFN reduction layer nn.init.normal_(block.pre_norm_ffn[4].weight, mean=0.0, std=proj_std) nn.init.normal_(self.projection_layer, mean=0.0, std=attn_std) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != TextTransformer: return parser group = parser.add_argument_group(title=cls.__name__) group.add_argument( "--model.text.transformer.model-dim", type=int, default=512, help="Model dimension of the transformer model", ) group.add_argument( "--model.text.transformer.no-scale-embedding", action="store_true", help="Do not scale the output of embedding layer in {}".format( cls.__name__ ), ) group.add_argument( "--model.text.transformer.no-pos-embedding", action="store_true", help="Do not add positional embeddings to the output of embedding layer in {}".format( cls.__name__ ), ) group.add_argument( "--model.text.transformer.embed-dropout", type=float, default=0.0, help="Dropout in embedding layer", ) # transformer layer parameters default_layers = 6 group.add_argument( "--model.text.transformer.n-transformer-layers", type=int, default=default_layers, help="Number of transformer layers in {}".format(cls.__name__), ) group.add_argument( "--model.text.transformer.n-heads-per-layer", type=int, default=[8] * default_layers, nargs="+", help="Number of transformer heads per transformer layer", ) group.add_argument( "--model.text.transformer.ffn-multiplier-per-layer", type=float, default=[4.0] * default_layers, nargs="+", help="FFN multiplier for each transformer layer", ) group.add_argument( "--model.text.transformer.attn-dropout", type=float, default=0.0, help="Dropout in multi-head attention", ) group.add_argument( "--model.text.transformer.ffn-dropout", type=float, default=0.0, help="Dropout between linear layers in FFN", ) group.add_argument( "--model.text.transformer.dropout", type=float, default=0.0, help="Dropout in transformer", ) group.add_argument( "--model.text.transformer.norm-layer", type=str, default="layer_norm", help="Normalization layer", ) group.add_argument( "--model.text.transformer.sinusoidal-pos-emb", action="store_true", help="Use sinusoidal positional embedding", ) group.add_argument( "--model.text.transformer.causal-masking", action="store_true", help="Use causal masking", ) group.add_argument( "--model.text.transformer.classes-per-split-zero-shot", type=int, default=20, help="Divide zero-shot classes into these many chunks, for faster processing", ) return parser def forward_embedding(self, text_tokens: Tensor) -> Tensor: """Converts the token indexes into vectors. Args: text_tokens: A tensor containing token indices. The shape of the tensor is [batch, sequence length]. Returns: An output tensor whose shape is [batch, sequence length, hidden dimension]. """ token_emb = self.embedding_layer(text_tokens) seq_len = token_emb.shape[1] if self.positional_embedding is not None: token_emb = token_emb + self.positional_embedding(seq_len).to( token_emb.dtype ) token_emb = self.embedding_dropout(token_emb) return token_emb def encode_text( self, text_tokens: Tensor, key_padding_mask: Optional[Tensor] = None, return_all_tokens: bool = False, ) -> Tensor: """ Returns token embeddings. Args: text_tokens: A tensor containing token indices. The shape of tensor is [batch size, sequence length]. key_padding_mask: A boolean tensor indicating padding token indices. return_all_tokens: A boolean flag to return all tokens. Defaults to False to return end-of-text embedding. Returns: A tensor of shape [batch size, sequence length, hidden dimension] if 'return_all_tokens' is True. Otherwise, a tensor containing end-of-text token embedding is returned. The shape is [batch size, sequence length]. """ token_emb = self.forward_embedding(text_tokens) attn_mask = self.build_causal_attention_mask( context_length=text_tokens.shape[1], batch_size=text_tokens.shape[0], device=token_emb.device, dtype=token_emb.dtype, ) for layer in self.transformer: token_emb = layer( token_emb, key_padding_mask=key_padding_mask, attn_mask=attn_mask, ) token_emb = self.final_layer_norm(token_emb) if return_all_tokens: return token_emb else: # return the token embedding corresponding to end-of-text token. token_emb = token_emb[ torch.arange(text_tokens.shape[0]), text_tokens.argmax(dim=-1) ] token_emb = token_emb @ self.projection_layer token_emb = F.normalize(token_emb, dim=-1) return token_emb def forward_zero_shot( self, text_tokens: Tensor, key_padding_mask: Optional[Tensor] = None, ) -> Tensor: """Forward function for computing text features for zero-shot image classification. Args: text_tokens: A tensor containing token indices. The shape of tensor is [batch size, number of classes, number of captions, sequence length]. key_padding_mask: A boolean tensor indicating padding token indices. Returns: A tensor of shape [number of classes, sequence length]. """ if self.training: raise NotImplementedError( "Zero-shot evaluation is only supported with eval mode" ) if text_tokens.ndim != 4: logger.error( f"For zero-shot evaluation, expected a 4D tensor whose shape is [batch size, number of classes, number of captions, sequence length]. Got: {text_tokens.shape}." ) batch_size, num_classes, num_captions, context_len = text_tokens.shape if batch_size > 1: text_tokens = text_tokens[0:1] batch_size = 1 logger.warning( "For zero-shot evaluation, text templates are the same across all images in the batch." "Got: {}. Please consider adjusting collate function.".format( batch_size ) ) text_features = [] # The input 4D tensor could be very large and lead to out of memory issues. As an example, # the ImageNet dataset has 1000 classes and 80 captions per class. Processing such a large tensor # is very expensive. For efficiency, we split the tensor along the class dimension # and then compute features. for start_idx in range(0, num_classes, self.classes_per_split_zero_shot): end_idx = min(start_idx + self.classes_per_split_zero_shot, num_classes) text_tokens_split = text_tokens[0, start_idx:end_idx, ...] num_classes_split = text_tokens_split.shape[0] text_tokens_split = text_tokens_split.reshape( num_classes_split * num_captions, context_len ) key_padding_mask_split = None if key_padding_mask is not None: key_padding_mask_split = key_padding_mask[0, start_idx:end_idx, ...] key_padding_mask_split = key_padding_mask_split.reshape( num_classes_split * num_captions, context_len ) # [num_classes_per_split * num_captions, sequence_length] --> [num_classes_per_split * num_captions, hidden_dim] class_embedding_split = self.encode_text( text_tokens=text_tokens_split, key_padding_mask=key_padding_mask_split ) # [num_classes_per_split * num_captions, hidden_dim] --> [num_classes_per_split, num_captions, hidden_dim] class_embedding_split = class_embedding_split.reshape( num_classes_split, num_captions, class_embedding_split.shape[-1] ) # Compute mean of all captions for a given class. # [num_classes_per_split, num_captions, hidden_dim] --> [num_classes_per_split, hidden_dim] mean_class_embedding_split = class_embedding_split.mean(dim=1) # Normalize the embeddings mean_class_embedding_split = F.normalize(mean_class_embedding_split, dim=-1) text_features.append(mean_class_embedding_split) # [num_classes_per_split, hidden_dim] * num_splits --> [num_classes, hidden_dim] text_features = torch.cat(text_features, dim=0) # [num_classes, hidden_dim] --> [hidden_dim, num_classes] text_features = text_features.transpose(0, 1) return text_features.contiguous() def forward( self, text_tokens: Tensor, key_padding_mask: Optional[Tensor] = None, return_all_tokens: bool = False, ) -> Tensor: """Forward function for text encoder. Args: text_tokens: A tensor containing token indices. The shape of tensor could be: 1. [batch size, sequence length] -> This input size typically corresponds to pre-training tasks (e.g., Image-Text pretraining in CLIP). 2. [batch size, number of classes, number of captions, sequence length] -> This input size typically corresponds to zero-shot image classification tasks. 3. [batch size, number of captions, sequence length] -> This input size typically corresponds to captioning tasks. key_padding_mask: A boolean tensor indicating padding token indices. return_all_tokens: A boolean flag to return all tokens. Returns: An output tensor. The shape of the output tensor is one of the following: 1. When input tensor is 4D, then the shape of the output is [hidden_dim, number of classes]. 2. When input tensor is 2D, then the shape of the output is [batch size, hidden dim]. If 'return_all_tokens' is enabled, then shape of the output is [batch size, sequence length, hidden dim]. 3. When input tensor is 3D, then the shape of the output is [batch size, number of captions, hidden dim]. If 'return_all_tokens' is enabled, then shape of the output is [batch size, number of captions, sequence length, hidden dim]. """ if text_tokens.dim() == 4: # Example use case is zero-shot image-classification evaluation return self.forward_zero_shot( text_tokens=text_tokens, key_padding_mask=key_padding_mask, ) elif text_tokens.dim() == 2: # Example use case is image-text pre-training where each image # has single caption. text_tokens = self.encode_text( text_tokens=text_tokens, key_padding_mask=key_padding_mask, return_all_tokens=return_all_tokens, ) return text_tokens elif text_tokens.dim() == 3: # Example use case is image-text pre-training where each image # has multiple captions. batch_size, num_captions, _ = text_tokens.shape text_tokens = text_tokens.reshape(batch_size * num_captions, -1) if key_padding_mask: key_padding_mask = key_padding_mask.reshape( batch_size * num_captions, -1 ) text_tokens = self.encode_text( text_tokens=text_tokens, key_padding_mask=key_padding_mask, return_all_tokens=return_all_tokens, ) text_tokens = text_tokens.reshape(batch_size, num_captions, -1) return text_tokens else: raise NotImplementedError( f"Only 2-, 3-, and 4-D tensors are supported. Got: {text_tokens.dim()}-D tensor." ) def get_activation_checkpoint_submodule_class(self) -> Callable: """Returns TextTransformer's submodule, TransformerEncoder, class needs to be checkpointed.""" return TransformerEncoder ================================================ FILE: corenet/optims/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List import torch.nn from corenet.optims.base_optim import BaseOptim from corenet.utils import logger from corenet.utils.common_utils import unwrap_model_fn from corenet.utils.registry import Registry OPTIM_REGISTRY = Registry( registry_name="optimizer_registry", base_class=BaseOptim, lazy_load_dirs=["corenet/optims"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def check_trainable_parameters( model: torch.nn.Module, model_params: List[Dict[str, Any]] ) -> None: """Helper function to check if any model parameters w/ gradients are not part of model_params. 'get_trainable_parameters' is a custom function. However, there may be instances where not all parameters are passed to the optimizer, potentially causing training instabilities and yielding undesired results. This function compares the named parameters obtained with 'get_trainable_parameters' with PyTorch's function 'model.named_parameters()'. This helps mitigate potential issues during the training phase. Args: model: An instance of torch.nn.Module. model_params: Model parameters computed using 'get_trainable_parameters' function. """ # get model parameter names model_trainable_params = [] # Activation checkpointing, enabled using --model.activation-checkpointing, adds a # prefix '_checkpoint_wrapped_module' to sub-module name. # If prefix is present in the parameter name, remove it act_ckpt_wrapped_module_name = "._checkpoint_wrapped_module" for p_name, param in model.named_parameters(): if param.requires_grad: p_name = p_name.replace(act_ckpt_wrapped_module_name, "") model_trainable_params.append(p_name) initialized_params = [] for param_info in model_params: if not isinstance(param_info, Dict): logger.error( "Expected format is a Dict with three keys: params, weight_decay, param_names" ) if not {"params", "weight_decay", "param_names"}.issubset(param_info.keys()): logger.error( "Parameter dict should have three keys: params, weight_decay, param_names" ) param_names = param_info["param_names"] if isinstance(param_names, List): param_names = [ param_name.replace(act_ckpt_wrapped_module_name, "") for param_name in param_names ] initialized_params.extend(param_names) elif isinstance(param_names, str): param_names = param_names.replace(act_ckpt_wrapped_module_name, "") initialized_params.append(param_names) else: raise NotImplementedError uninitialized_params = set(model_trainable_params) ^ set(initialized_params) if len(uninitialized_params) > 0: logger.error( "Following parameters are defined in the model, but won't be part of optimizer. " "Please check get_trainable_parameters function. " "Use --optim.bypass-parameters-check flag to bypass this check. " "Parameter list = {}".format(uninitialized_params) ) def remove_param_name_key(model_params: List) -> None: """Helper function to remove param_names key from model_params. Optimizer only takes params and weight decay as keys. However, 'get_trainable_parameters' return three keys: (1) params, (2) weight_decay and (3) param_names. The 'param_names' key is used for sanity checking in 'check_trainable_parameters' function, and is removed inside this function so that model_params can be passed to optimzier. Args: model_params: A list of dictionaries, where each dictionary element is expected to have three keys: (1) params: an instance of torch.nn.Parameter, (2) weight decay, and (3) param_names. ...note: This function should be called after 'check_trainable_parameters' function. """ for param_info in model_params: if not isinstance(param_info, Dict): logger.error( "Expected format is a Dict with three keys: params, weight_decay, param_names" ) if not {"params", "weight_decay", "param_names"}.issubset(param_info.keys()): logger.error( "Parameter dict should have three keys: params, weight_decay, param_names" ) param_info.pop("param_names") def build_optimizer(model: torch.nn.Module, opts, *args, **kwargs) -> BaseOptim: """Helper function to build an optimizer Args: model: A model opts: command-line arguments Returns: An instance of BaseOptim """ optim_name = getattr(opts, "optim.name") weight_decay = getattr(opts, "optim.weight_decay") no_decay_bn_filter_bias = getattr(opts, "optim.no_decay_bn_filter_bias") unwrapped_model = unwrap_model_fn(model) model_params, lr_mult = unwrapped_model.get_trainable_parameters( weight_decay=weight_decay, no_decay_bn_filter_bias=no_decay_bn_filter_bias, *args, **kwargs ) # check to ensure that all trainable model parameters are passed to the model if not getattr(opts, "optim.bypass_parameters_check", False): check_trainable_parameters(model=unwrapped_model, model_params=model_params) remove_param_name_key(model_params=model_params) # set the learning rate multiplier for each parameter setattr(opts, "optim.lr_multipliers", lr_mult) return OPTIM_REGISTRY[optim_name](opts, model_params, *args, **kwargs) def arguments_optimizer(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: parser = BaseOptim.add_arguments(parser) parser = OPTIM_REGISTRY.all_arguments(parser) return parser ================================================ FILE: corenet/optims/adam.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Iterable, Union from torch import Tensor from torch.optim import Adam from corenet.optims import OPTIM_REGISTRY from corenet.optims.base_optim import BaseOptim @OPTIM_REGISTRY.register(name="adam") class AdamOptimizer(BaseOptim, Adam): """ `Adam `_ optimizer Args: opts: Command-line arguments model_params: Model parameters """ def __init__( self, opts: argparse.Namespace, model_params: Iterable[Union[Tensor, Dict]], *args, **kwargs ) -> None: BaseOptim.__init__(self, opts=opts) beta1 = getattr(opts, "optim.adam.beta1") beta2 = getattr(opts, "optim.adam.beta2") ams_grad = getattr(opts, "optim.adam.amsgrad") eps = getattr(opts, "optim.adam.eps", None) Adam.__init__( self, params=model_params, lr=self.lr, betas=(beta1, beta2), eps=self.eps if eps is None else eps, weight_decay=self.weight_decay, amsgrad=ams_grad, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add arguments for ADAM optimizer""" if cls != AdamOptimizer: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--optim.adam.beta1", type=float, default=0.9, help="Value of Beta1 in ADAM optimizer. Defaults to 0.9.", ) group.add_argument( "--optim.adam.beta2", type=float, default=0.98, help="Value of Beta2 in ADAM optimizer. Defaults to 0.98.", ) group.add_argument( "--optim.adam.amsgrad", action="store_true", default=False, help="Use AMSGrad in ADAM. Defaults to False.", ) group.add_argument( "--optim.adam.eps", type=float, default=None, help="Value of epsilon in Adam optimizer. Defaults to None." "When this value is None, the default value in base optimizer is used.", ) return parser ================================================ FILE: corenet/optims/adamw.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Iterable, Union from torch import Tensor from torch.optim import AdamW from corenet.optims import OPTIM_REGISTRY from corenet.optims.base_optim import BaseOptim @OPTIM_REGISTRY.register(name="adamw") class AdamWOptimizer(BaseOptim, AdamW): """ `AdamW `_ optimizer Args: opts: Command-line arguments model_params: Model parameters """ def __init__( self, opts: argparse.Namespace, model_params: Iterable[Union[Tensor, Dict]], *args, **kwargs ) -> None: BaseOptim.__init__(self, opts=opts) beta1 = getattr(opts, "optim.adamw.beta1") beta2 = getattr(opts, "optim.adamw.beta2") ams_grad = getattr(opts, "optim.adamw.amsgrad") eps = getattr(opts, "optim.adamw.eps", None) AdamW.__init__( self, params=model_params, lr=self.lr, betas=(beta1, beta2), eps=self.eps if eps is None else eps, weight_decay=self.weight_decay, amsgrad=ams_grad, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add arguments for AdamW optimizer""" if cls != AdamWOptimizer: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--optim.adamw.beta1", type=float, default=0.9, help="Value of Beta1 in AdamW optimizer. Defaults to 0.9.", ) group.add_argument( "--optim.adamw.beta2", type=float, default=0.98, help="Value of Beta2 in AdamW optimizer. Defaults to 0.98.", ) group.add_argument( "--optim.adamw.amsgrad", action="store_true", default=False, help="Use AMSGrad in AdamW. Defaults to False.", ) group.add_argument( "--optim.adamw.eps", type=float, default=None, help="Value of epsilon in AdamW optimizer. Defaults to None." "When this value is None, the default value in base optimizer is used.", ) return parser ================================================ FILE: corenet/optims/base_optim.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.utils import logger class BaseOptim(object): """Base class for optimizer Args: opts: Command-line arguments """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: self.eps = 1e-8 self.lr = getattr(opts, "scheduler.lr") self.weight_decay = getattr(opts, "optim.weight_decay") @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """Add optimizer arguments""" if cls != BaseOptim: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--optim.name", type=str, default="sgd", help="Name of the optimizer. Defaults to SGD.", ) group.add_argument( "--optim.eps", type=float, default=1e-8, help="Optimizer epsilon value. Defaults to 1.e-8.", ) group.add_argument( "--optim.weight-decay", default=4e-5, type=float, help="Weight decay (or L2 penalty). Defaults to 4.e-5.", ) group.add_argument( "--optim.no-decay-bn-filter-bias", action="store_true", default=False, help="When enabled, the weight in normalization layers and biases in the model are not decayed." "Defaults to False.", ) group.add_argument( "--optim.bypass-parameters-check", action="store_true", default=False, help="Bypass parameter check when creating optimizer. Defaults to False", ) return parser def __repr__(self) -> str: group_dict = dict() for i, group in enumerate(self.param_groups): for key in sorted(group.keys()): if key == "params": continue if key not in group_dict: group_dict[key] = [group[key]] else: group_dict[key].append(group[key]) format_string = self.__class__.__name__ + " (" format_string += "\n" for k, v in group_dict.items(): format_string += "\t {0}: {1}\n".format(k, v) format_string += ")" return format_string ================================================ FILE: corenet/optims/scheduler/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.optims.scheduler.base_scheduler import BaseLRScheduler from corenet.utils import logger from corenet.utils.registry import Registry SCHEDULER_REGISTRY = Registry( "scheduler", base_class=BaseLRScheduler, lazy_load_dirs=["corenet/optims/scheduler"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) def build_scheduler(opts: argparse.Namespace, *args, **kwargs) -> BaseLRScheduler: scheduler_name = getattr(opts, "scheduler.name").lower() # We registered the base class using a special `name` (i.e., `__base__`) # in order to access the arguments defined inside those classes. However, these classes are not supposed to # be used. Therefore, we raise an error for such cases if scheduler_name == "__base__": logger.error("__base__ can't be used as a projection name. Please check.") scheduler = SCHEDULER_REGISTRY[scheduler_name](opts, *args, **kwargs) return scheduler def general_lr_sch_args(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="LR scheduler arguments", description="LR scheduler arguments" ) group.add_argument( "--scheduler.name", type=str, default="cosine", help="LR scheduler name" ) group.add_argument("--scheduler.lr", type=float, default=0.1, help="Learning rate") group.add_argument( "--scheduler.max-epochs", type=int, default=None, help="Max. epochs for training", ) group.add_argument( "--scheduler.max-iterations", type=int, default=None, help="Max. iterations for training", ) group.add_argument( "--scheduler.warmup-iterations", type=int, default=None, help="Warm-up iterations", ) group.add_argument( "--scheduler.warmup-init-lr", type=float, default=1e-7, help="Warm-up init lr" ) group.add_argument( "--scheduler.is-iteration-based", action="store_true", help="Is iteration type or epoch type", ) group.add_argument( "--scheduler.adjust-period-for-epochs", action="store_true", help="Adjust the period for epoch-based scheduler.", ) return parser def arguments_scheduler(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: parser = general_lr_sch_args(parser=parser) # add scheduler specific arguments parser = SCHEDULER_REGISTRY.all_arguments(parser) return parser ================================================ FILE: corenet/optims/scheduler/base_scheduler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.utils import logger class BaseLRScheduler(object): def __init__(self, opts) -> None: warmup_iterations = getattr(opts, "scheduler.warmup_iterations", None) super().__init__() self.opts = opts self.round_places = 8 self.lr_multipliers = getattr(opts, "optim.lr_multipliers", None) self.warmup_iterations = ( max(warmup_iterations, 0) if warmup_iterations is not None else 0 ) warmup_init_lr = getattr(opts, "scheduler.warmup_init_lr", 1e-7) self.warmup_init_lr = warmup_init_lr # Because of variable batch sizes, we can't determine exact number of epochs in warm-up phase. This # may result in different LR schedules when we run epoch- and iteration-based schedulers. # To reduce these differences, we use adjust_period_for_epochs arguments. # For epoch-based scheduler, this parameter value should be enabled. self.adjust_period = getattr(opts, "scheduler.adjust_period_for_epochs", False) self.warmup_epochs = 0 @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: return parser def get_lr(self, epoch: int, curr_iter: int): raise NotImplementedError def update_lr(self, optimizer, epoch: int, curr_iter: int): lr = self.get_lr(epoch=epoch, curr_iter=curr_iter) lr = max(0.0, lr) if self.lr_multipliers is not None: assert len(self.lr_multipliers) == len(optimizer.param_groups) for g_id, param_group in enumerate(optimizer.param_groups): param_group["lr"] = round( lr * self.lr_multipliers[g_id], self.round_places ) else: for param_group in optimizer.param_groups: param_group["lr"] = round(lr, self.round_places) return optimizer @staticmethod def retrieve_lr(optimizer) -> list: lr_list = [] for param_group in optimizer.param_groups: lr_list.append(param_group["lr"]) return lr_list def extra_repr(self) -> str: """Extra information to be represented in __repr__. Each line in the output string should be prefixed with ``\n\t``.""" return "" def __repr__(self) -> str: return f"{self.__class__.__name__}({self.extra_repr()}\n)" ================================================ FILE: corenet/optims/scheduler/cosine.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math from corenet.optims.scheduler import SCHEDULER_REGISTRY from corenet.optims.scheduler.base_scheduler import BaseLRScheduler @SCHEDULER_REGISTRY.register("cosine") class CosineScheduler(BaseLRScheduler): """ Cosine learning rate scheduler: https://arxiv.org/abs/1608.03983 """ def __init__(self, opts, **kwargs) -> None: is_iter_based = getattr(opts, "scheduler.is_iteration_based", True) super(CosineScheduler, self).__init__(opts=opts) max_iterations = getattr(opts, "scheduler.max_iterations", 150000) self.min_lr = getattr(opts, "scheduler.cosine.min_lr", 1e-5) self.max_lr = getattr(opts, "scheduler.cosine.max_lr", 0.4) if self.warmup_iterations > 0: self.warmup_step = ( self.max_lr - self.warmup_init_lr ) / self.warmup_iterations self.period = ( max_iterations - self.warmup_iterations + 1 if is_iter_based else getattr(opts, "scheduler.max_epochs", 350) ) self.is_iter_based = is_iter_based @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Cosine LR arguments", description="Cosine LR arguments" ) group.add_argument( "--scheduler.cosine.min-lr", type=float, default=1e-5, help="Minimum LR in Cosine LR scheduler", ) group.add_argument( "--scheduler.cosine.max-lr", type=float, default=0.1, help="Maximum LR in Cosine LR scheduler", ) return parser def get_lr(self, epoch: int, curr_iter: int) -> float: if curr_iter < self.warmup_iterations: curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step self.warmup_epochs = epoch else: if self.is_iter_based: curr_iter = curr_iter - self.warmup_iterations curr_lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * ( 1 + math.cos(math.pi * curr_iter / self.period) ) else: adjust_num = self.warmup_epochs + 1 if self.adjust_period else 0 adjust_den = self.warmup_epochs if self.adjust_period else 0 curr_lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * ( 1 + math.cos( math.pi * (epoch - adjust_num) / (self.period - adjust_den) ) ) return max(0.0, curr_lr) def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n \t min_lr={}\n \t max_lr={}\n \t period={}".format( self.min_lr, self.max_lr, self.period ) if self.warmup_iterations > 0: repr_str += "\n \t warmup_init_lr={}\n \t warmup_iters={}".format( self.warmup_init_lr, self.warmup_iterations ) repr_str += "\n )" return repr_str ================================================ FILE: corenet/optims/scheduler/cyclic.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math import numpy as np from corenet.optims.scheduler import SCHEDULER_REGISTRY from corenet.optims.scheduler.base_scheduler import BaseLRScheduler from corenet.utils import logger SUPPORTED_LAST_CYCLES = ["cosine", "linear"] @SCHEDULER_REGISTRY.register("cyclic") class CyclicLRScheduler(BaseLRScheduler): """ Cyclic LR: https://arxiv.org/abs/1811.11431 """ def __init__(self, opts, **kwargs) -> None: cycle_steps = getattr(opts, "scheduler.cyclic.steps", [25]) if cycle_steps is not None and isinstance(cycle_steps, int): cycle_steps = [cycle_steps] gamma = getattr(opts, "scheduler.cyclic.gamma", 0.5) anneal_type = getattr(opts, "scheduler.cyclic.last_cycle_type", "linear") min_lr = getattr(opts, "scheduler.cyclic.min_lr", 0.1) end_lr = getattr(opts, "scheduler.cyclic.last_cycle_end_lr", 1e-3) ep_per_cycle = getattr(opts, "scheduler.cyclic.epochs_per_cycle", 5) warmup_iterations = getattr(opts, "scheduler.warmup_iterations", 0) n_cycles = getattr(opts, "scheduler.cyclic.total_cycles", 10) - 1 max_epochs = getattr(opts, "scheduler.max_epochs", 100) if anneal_type not in SUPPORTED_LAST_CYCLES: logger.error( "Supported anneal types for {} are: {}".format( self.__class__.__name__, SUPPORTED_LAST_CYCLES ) ) if min_lr < end_lr: logger.error( "Min LR should be greater than end LR. Got: {} and {}".format( min_lr, end_lr ) ) super(CyclicLRScheduler, self).__init__(opts=opts) self.min_lr = min_lr self.cycle_length = ep_per_cycle self.end_lr = end_lr self.max_lr = self.min_lr * self.cycle_length self.last_cycle_anneal_type = anneal_type if self.warmup_iterations > 0: self.warmup_step = ( self.min_lr - self.warmup_init_lr ) / self.warmup_iterations self.n_cycles = n_cycles self.cyclic_epochs = self.cycle_length * self.n_cycles self.max_epochs = max_epochs self.last_cycle_epochs = self.max_epochs - self.cyclic_epochs assert self.max_epochs == self.cyclic_epochs + self.last_cycle_epochs self.steps = [self.max_epochs] if cycle_steps is None else cycle_steps self.gamma = gamma if cycle_steps is not None else 1 self._lr_per_cycle() self.epochs_lr_stepped = [] def _lr_per_cycle(self) -> None: lrs = list( np.linspace(self.max_lr, self.min_lr, self.cycle_length, dtype=np.float32) ) lrs = [lrs[-1]] + lrs[:-1] self.cycle_lrs = lrs @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Cyclic LR arguments", description="Cyclic LR arguments" ) group.add_argument( "--scheduler.cyclic.min-lr", default=0.1, type=float, help="Min. lr for a cycle", ) group.add_argument( "--scheduler.cyclic.last-cycle-end-lr", default=1e-3, type=float, help="End LR for the last cycle", ) group.add_argument( "--scheduler.cyclic.total-cycles", default=11, type=int, help="Number of cycles. Default is 10", ) group.add_argument( "--scheduler.cyclic.epochs-per-cycle", default=5, type=int, help="Number of epochs per cycle. Default is 5", ) group.add_argument( "--scheduler.cyclic.steps", default=None, type=int, nargs="+", help="steps at which LR should be decreased", ) group.add_argument( "--scheduler.cyclic.gamma", default=0.5, type=float, help="Factor by which LR should be decreased", ) group.add_argument( "--scheduler.cyclic.last-cycle-type", default="linear", type=str, choices=SUPPORTED_LAST_CYCLES, help="Annealing in last cycle", ) return parser def get_lr(self, epoch: int, curr_iter: int) -> float: if curr_iter < self.warmup_iterations: curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step else: if epoch <= self.cyclic_epochs: if epoch in self.steps and epoch not in self.epochs_lr_stepped: self.min_lr *= self.gamma ** (self.steps.index(epoch) + 1) self.max_lr *= self.gamma ** (self.steps.index(epoch) + 1) self._lr_per_cycle() self.epochs_lr_stepped.append(epoch) idx = epoch % self.cycle_length curr_lr = self.cycle_lrs[idx] else: base_lr = self.min_lr if self.last_cycle_anneal_type == "linear": lr_step = (base_lr - self.end_lr) / self.last_cycle_epochs curr_lr = base_lr - (epoch - self.cyclic_epochs + 1) * lr_step elif self.last_cycle_anneal_type == "cosine": curr_epoch = epoch - self.cyclic_epochs period = self.max_epochs - self.cyclic_epochs + 1 curr_lr = self.end_lr + 0.5 * (base_lr - self.end_lr) * ( 1 + math.cos(math.pi * curr_epoch / period) ) else: raise NotImplementedError return max(0.0, curr_lr) def __repr__(self): repr_str = ( "{}(\n \t C={},\n \t C_length={},\n \t C_last={},\n \t Total_Epochs={}, " "\n \t steps={},\n \t gamma={},\n \t last_cycle_anneal_method={} " "\n \t min_lr={}, \n\t max_lr={}, \n\t end_lr={}\n)".format( self.__class__.__name__, self.n_cycles, self.cycle_length, self.last_cycle_epochs, self.max_epochs, self.steps, self.gamma, self.last_cycle_anneal_type, self.min_lr, self.min_lr * self.cycle_length, self.end_lr, ) ) return repr_str ================================================ FILE: corenet/optims/scheduler/fixed.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.optims.scheduler import SCHEDULER_REGISTRY from corenet.optims.scheduler.base_scheduler import BaseLRScheduler @SCHEDULER_REGISTRY.register("fixed") class FixedLRScheduler(BaseLRScheduler): """ Fixed learning rate scheduler with optional linear warm-up strategy """ def __init__(self, opts, **kwargs) -> None: is_iter_based = getattr(opts, "scheduler.is_iteration_based", True) super(FixedLRScheduler, self).__init__(opts=opts) max_iterations = getattr(opts, "scheduler.max_iterations", 150000) self.fixed_lr = getattr(opts, "scheduler.fixed.lr", None) assert self.fixed_lr is not None if self.warmup_iterations > 0: self.warmup_step = ( self.fixed_lr - self.warmup_init_lr ) / self.warmup_iterations self.period = ( max_iterations - self.warmup_iterations + 1 if is_iter_based else getattr(opts, "scheduler.max_epochs", 350) ) self.is_iter_based = is_iter_based @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Fixed LR arguments", description="Fixed LR arguments" ) group.add_argument( "--scheduler.fixed.lr", type=float, default=None, help="LR value" ) return parser def get_lr(self, epoch: int, curr_iter: int) -> float: if curr_iter < self.warmup_iterations: curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step else: curr_lr = self.fixed_lr return max(0.0, curr_lr) def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n\tlr={}".format(self.fixed_lr) if self.warmup_iterations > 0: repr_str += "\n\twarmup_init_lr={}\n\twarmup_iters={}".format( self.warmup_init_lr, self.warmup_iterations ) repr_str += "\n )" return repr_str ================================================ FILE: corenet/optims/scheduler/multi_step.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.optims.scheduler import SCHEDULER_REGISTRY from corenet.optims.scheduler.base_scheduler import BaseLRScheduler @SCHEDULER_REGISTRY.register("multi_step") class MultiStepLRScheduler(BaseLRScheduler): """ Multi-step learning rate scheduler with optional linear warm-up strategy """ def __init__(self, opts, **kwargs) -> None: is_iter_based = getattr(opts, "scheduler.is_iteration_based", True) super().__init__(opts=opts) max_iterations = getattr(opts, "scheduler.max_iterations", 150000) self.lr = getattr(opts, "scheduler.multi_step.lr", None) assert self.lr is not None if self.warmup_iterations > 0: self.warmup_step = (self.lr - self.warmup_init_lr) / self.warmup_iterations milestones = getattr(opts, "scheduler.multi_step.milestones", None) if milestones is None: milestones = [-1] elif isinstance(milestones, int): milestones = [milestones] self.milestones = sorted( list(set(milestones)) ) # remove duplicates and sort them self.gamma = getattr(opts, "scheduler.multi_step.gamma", 1.0) self.period = ( max_iterations - self.warmup_iterations + 1 if is_iter_based else getattr(opts, "scheduler.max_epochs", 350) ) self.is_iter_based = is_iter_based @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="{} arguments".format(cls.__name__), description="{} arguments".format(cls.__name__), ) group.add_argument( "--scheduler.multi-step.lr", type=float, default=0.1, help="LR value" ) group.add_argument( "--scheduler.multi-step.gamma", type=float, default=None, help="Decay LR value by this factor", ) group.add_argument( "--scheduler.multi-step.milestones", type=int, nargs="+", default=None, help="Decay LR value at these epoch", ) return parser def get_lr(self, epoch: int, curr_iter: int) -> float: if curr_iter < self.warmup_iterations: return max(0.0, self.warmup_init_lr + curr_iter * self.warmup_step) else: if epoch in self.milestones: self.lr = self.lr * self.gamma self.milestones.remove(epoch) return max(0.0, self.lr) def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n\tlr={}\n\tmilestones={}\n\tgamma={}".format( self.lr, self.milestones, self.gamma ) if self.warmup_iterations > 0: repr_str += "\n\twarmup_init_lr={}\n\twarmup_iters={}".format( self.warmup_init_lr, self.warmup_iterations ) repr_str += "\n )" return repr_str ================================================ FILE: corenet/optims/scheduler/polynomial.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.optims.scheduler import SCHEDULER_REGISTRY from corenet.optims.scheduler.base_scheduler import BaseLRScheduler @SCHEDULER_REGISTRY.register("polynomial") class PolynomialScheduler(BaseLRScheduler): """ Polynomial LR scheduler """ def __init__(self, opts, **kwargs) -> None: is_iter_based = getattr(opts, "scheduler.is_iteration_based", False) max_iterations = getattr(opts, "scheduler.max_iterations", 50000) max_epochs = getattr(opts, "scheduler.max_epochs", 350) super(PolynomialScheduler, self).__init__(opts=opts) self.start_lr = getattr(opts, "scheduler.polynomial.start_lr", 0.1) self.end_lr = getattr(opts, "scheduler.polynomial.end_lr", 0.0) self.power = getattr(opts, "scheduler.polynomial.power", 0.9) if self.warmup_iterations > 0: self.warmup_step = ( self.start_lr - self.warmup_init_lr ) / self.warmup_iterations self.is_iter_based = is_iter_based self.max_iterations = max_iterations - self.warmup_iterations + 1 self.max_epochs = max_epochs @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Polynomial LR arguments", description="Polynomial LR arguments" ) group.add_argument( "--scheduler.polynomial.power", type=float, default=0.9, help="Polynomial power", ) group.add_argument( "--scheduler.polynomial.start-lr", type=float, default=0.1, help="Start LR in Poly LR scheduler", ) group.add_argument( "--scheduler.polynomial.end-lr", type=float, default=0.0, help="End LR in Poly LR scheduler", ) return parser def get_lr(self, epoch: int, curr_iter: int) -> float: if curr_iter < self.warmup_iterations: curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step self.warmup_epochs = epoch else: if self.is_iter_based: factor = (curr_iter - self.warmup_iterations) / self.max_iterations else: adjust_num = self.warmup_epochs + 1 if self.adjust_period else 0 adjust_den = self.warmup_epochs if self.adjust_period else 0 factor = (epoch - adjust_num) / (self.max_epochs - adjust_den) curr_lr = (self.start_lr - self.end_lr) * ( (1.0 - factor) ** self.power ) + self.end_lr return max(0.0, curr_lr) def __repr__(self) -> str: repr_str = "{}(".format(self.__class__.__name__) repr_str += "\n\tpower={}\n\tstart_lr={}".format(self.power, self.start_lr) if self.end_lr > 0: repr_str += "\n\tend_lr={}".format(self.end_lr) if self.warmup_iterations > 0: repr_str += "\n\twarmup_init_lr={}\n\twarmup_iters={}".format( self.warmup_init_lr, self.warmup_iterations ) repr_str += "\n )" return repr_str ================================================ FILE: corenet/optims/sgd.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Dict, Iterable, Union from torch import Tensor from torch.optim import SGD from corenet.optims import OPTIM_REGISTRY from corenet.optims.base_optim import BaseOptim @OPTIM_REGISTRY.register(name="sgd") class SGDOptimizer(BaseOptim, SGD): """ `SGD `_ optimizer Args: opts: Command-line arguments model_params: Model parameters """ def __init__( self, opts: argparse.Namespace, model_params: Iterable[Union[Tensor, Dict]], *args, **kwargs ) -> None: BaseOptim.__init__(self, opts=opts) nesterov = getattr(opts, "optim.sgd.nesterov") momentum = getattr(opts, "optim.sgd.momentum") SGD.__init__( self, params=model_params, lr=self.lr, momentum=momentum, weight_decay=self.weight_decay, nesterov=nesterov, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: if cls != SGDOptimizer: # Don't re-register arguments in subclasses that don't override `add_arguments()`. return parser group = parser.add_argument_group(cls.__name__) group.add_argument( "--optim.sgd.momentum", default=0.9, type=float, help="The value of momemtum in SGD. Defaults to 0.9", ) group.add_argument( "--optim.sgd.nesterov", action="store_true", default=False, help="Use nesterov momentum in SGD. Defaults to False.", ) return parser ================================================ FILE: corenet/options/__init__.py ================================================ ================================================ FILE: corenet/options/errors.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.constants import is_test_env class UnrecognizedYamlConfigEntry(Warning): # TODO: consider converting UnrecognizedYamlConfigEntry Warning to an Exception. def __init__(self, key: str) -> None: message = ( f"Yaml config key '{key}' was not recognized by argparser. If you think that you have already added " f"argument in corenet/options/opts.py file, then check for typos. If not, then please add it to corenet/options/opts.py." ) super().__init__(message) if is_test_env(): # Currently, we only raise an exception in test environment. raise ValueError(message) ================================================ FILE: corenet/options/opts.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Callable, List, Optional, Union import coremltools as ct from corenet.constants import DEFAULT_LOGS_DIR, DEFAULT_RESULTS_DIR from corenet.data.collate_fns import arguments_collate_fn from corenet.data.datasets import arguments_dataset from corenet.data.io.transfer_clients import transfer_client_arguments from corenet.data.sampler import add_sampler_arguments from corenet.data.text_tokenizer import arguments_tokenizer from corenet.data.transforms import arguments_augmentation from corenet.data.video_reader import arguments_video_reader from corenet.loss_fn import add_loss_fn_arguments from corenet.metrics import METRICS_REGISTRY, arguments_stats from corenet.modeling import modeling_arguments from corenet.optims import arguments_optimizer from corenet.optims.scheduler import arguments_scheduler from corenet.options.parse_args import JsonValidator from corenet.options.utils import load_config_file from corenet.utils import logger class ParseKwargs(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # convert values into dict override_dict = {} for val in values: if val.find("=") < 0: logger.error( "For override arguments, a key-value pair of the form key=value is expected. Got: {}".format( val ) ) val_list = val.split("=") if len(val_list) != 2: logger.error( "For override arguments, a key-value pair of the form key=value is expected with only one value per key. Got: {}".format( val ) ) override_dict[val_list[0]] = val_list[1] # determine the type of each value from parser actions and set accordingly options = parser._actions for option in options: option_dest = option.dest if option_dest in override_dict: val = override_dict[option_dest] if type(option.default) == bool and option.nargs == 0: # Boolean argument # value could be false, False, true, True override_dict[option_dest] = ( True if val.lower().find("true") > -1 else False ) elif option.nargs is None: # when nargs is not defined, it is usually a string, int, and float. override_dict[option_dest] = option.type(val) elif option.nargs in ["+", "*"]: # for list, we expect value to be comma separated val_list = val.split(",") override_dict[option_dest] = [option.type(v) for v in val_list] else: logger.error( "Following option is not yet supported for overriding. Please specify in config file. Got: {}".format( option ) ) setattr(namespace, "override_args", override_dict) def arguments_common(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group( title="Common arguments", description="Common arguments" ) group.add_argument( "--taskname", type=str, default="", help="Name of the task (can have arbitrary values)", ) group.add_argument("--common.seed", type=int, default=0, help="Random seed") group.add_argument( "--common.config-file", type=str, default=None, help="Configuration file" ) group.add_argument( "--common.results-loc", type=str, default=DEFAULT_RESULTS_DIR, help=f"Directory where results will be stored. Defaults to {DEFAULT_RESULTS_DIR}.", ) group.add_argument( "--common.logs-loc", type=str, default=DEFAULT_LOGS_DIR, help=f"Directory where logs will be stored. Defaults to {DEFAULT_LOGS_DIR}.", ) group.add_argument( "--common.run-label", type=str, default="run_1", help="Label id for the current run", ) group.add_argument( "--common.eval-stage-name", type=str, default="evaluation", help="Name to be used while logging in evaluation stage.", ) group.add_argument( "--common.resume", type=str, default=None, help="Resume location" ) group.add_argument( "--common.finetune", type=str, default=None, help="Checkpoint location to be used for finetuning", ) group.add_argument( "--common.finetune-ema", type=str, default=None, help="EMA Checkpoint location to be used for finetuning", ) group.add_argument( "--common.mixed-precision", action="store_true", help="Enable mixed precision training. Defaults to False. \ Note that this argument is not applicable for FSDP training. For mixed precision training with FSDP, \ please see respective arguments in FSDP.", ) group.add_argument( "--common.mixed-precision-dtype", type=str, default="float16", help="Mixed precision training data type", ) group.add_argument( "--common.accum-freq", type=int, default=1, help="Accumulate gradients for this number of iterations", ) group.add_argument( "--common.accum-after-epoch", type=int, default=0, help="Start accumulation after this many epochs", ) group.add_argument( "--common.log-freq", type=int, default=100, help="Display after these many iterations", ) group.add_argument( "--common.auto-resume", action="store_true", help="Resume training from the last checkpoint", ) group.add_argument( "--common.grad-clip", type=float, default=None, help="Gradient clipping value" ) group.add_argument( "--common.k-best-checkpoints", type=int, default=5, help="Keep k-best checkpoints", ) group.add_argument( "--common.save-all-checkpoints", action="store_true", default=False, help="If True, will save checkpoints from all epochs", ) group.add_argument( "--common.channels-last", action="store_true", default=False, help="Use channel last format during training. " "Note that some models may not support it, so we recommend to use it with caution.", ) group.add_argument( "--common.tensorboard-logging", action="store_true", help="Enable tensorboard logging", ) group.add_argument( "--common.file-logging", action="store_true", help="Enable file logging." ) group.add_argument( "--common.override-kwargs", nargs="*", action=ParseKwargs, help="Override arguments. Example. To override the value of --sampler.vbs.crop-size-width, " "we can pass override argument as " "--common.override-kwargs sampler.vbs.crop_size_width=512 \n " "Note that keys in override arguments do not contain -- or -", ) group.add_argument( "--common.enable-coreml-compatible-module", action="store_true", help="Use coreml compatible modules (if applicable) during inference", ) group.add_argument( "--common.debug-mode", action="store_true", help="You can use this flag for debugging purposes.", ) # intermediate checkpoint related args group.add_argument( "--common.save-interval-freq", type=int, default=0, help="Save checkpoints every N updates. Defaults to 0", ) group.add_argument( "--common.eval-every-k-iterations", type=int, default=0, help="Evaluate model every k iterations. Defaults to 0.", ) group.add_argument( "--common.set-grad-to-none", action="store_true", help="Set gradients to none instead of zero after optimization step. This can help in reducing \ GPU memory usage and can moderately improve training speed. Defaults to False. \ Please be cautious when computing grad_norm for debugging purposes.", ) try: from corenet.internal.utils.opts import arguments_internal parser = arguments_internal(parser=parser) except ModuleNotFoundError: logger.debug("Cannot load internal arguments, skipping.") return parser def arguments_ddp(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group = parser.add_argument_group(title="DDP arguments") group.add_argument( "--ddp.rank", type=int, default=0, help="Node rank for distributed training. Defaults to 0.", ) group.add_argument( "--ddp.world-size", type=int, default=-1, help="World size for DDP. Defaults to -1, meaning use all GPUs.", ) group.add_argument( "--ddp.dist-url", type=str, default=None, help="DDP URL. Defaults to None." ) group.add_argument( "--ddp.dist-port", type=int, default=30786, help="DDP Port. Only used when --ddp.dist-url is not specified. Defaults to 30768.", ) group.add_argument( "--ddp.device-id", type=int, default=None, help="Device ID. Defaults to None." ) group.add_argument( "--ddp.backend", type=str, default="nccl", help="DDP backend. Default is nccl" ) group.add_argument( "--ddp.find-unused-params", action="store_true", default=False, help="Find unused params in model. useful for debugging with DDP. Defaults to False.", ) group.add_argument( "--ddp.use-deprecated-data-parallel", action="store_true", default=False, help="Use Data parallel for training. This flag is not recommended for training and should be used only for debugging. \ The support for this flag will be deprecating in future.", ) return parser def arguments_train_eval_pipeline( parser: argparse.ArgumentParser, ) -> argparse.ArgumentParser: group = parser.add_argument_group(title="TrainEvalPipeline") group.add_argument( "--train-eval-pipeline.name", type=str, default="default", help=( "Name of the TrainEvalPipeline to use for constructing pipeline components." " Defaults to 'default' pipeline (see corenet/train_eval_pipelines/train_eval.py)" ), ) return parser def arguments_lm_eval(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add arguments related to 3rd party LM evaluation. Args: parser: The parser to add arguments to. Returns: The updated parser. """ group = parser.add_argument_group("LM Evaluation arguments") group.add_argument( "--lm-eval-wrapper.add-sot-token", action="store_true", default=False, help="Certain tokenizers (e.g., Llamav1 Tokenizer) adds start of text token. However, by default, \ some libraries set it to false, leading to inconsistent results. This flags allows to control if start of \ text token to be added to input sentence or not. ", ) group.add_argument( "--llmadapters-evaluation.datasets", type=str, default=( "boolq", "piqa", "social_i_qa", "hellaswag", "winogrande", "ARC-Easy", "ARC-Challenge", "openbookqa", ), help="The commonsense datasets on which to evaluate. Options include boolq, piqa, social_i_qa, hellaswag, winogrande, ARC-Easy, ARC-Challenge, and openbookqa.", nargs="+", choices=( "boolq", "piqa", "social_i_qa", "hellaswag", "winogrande", "ARC-Easy", "ARC-Challenge", "openbookqa", ), ) group.add_argument( "--llmadapters-evaluation.multiple-choice", action="store_true", help="If set, do multiple-choice evaluation. Otherwise, use generation-style evaluation.", ) group.add_argument( "--llmadapters-evaluation.limit", type=int, help="If set, run a limited number of evaluation samples.", default=None, ) group.add_argument( "--llmadapters-evaluation.dataset-dir", type=str, help="Directory that contains the datasets on which to evaluate.", default="LLM-Adapters/dataset/", ) group.add_argument( "--lm-harness-evaluation.tasks-info", type=JsonValidator, help="Task dictionary for LM Harness evaluation.", default=None, ) return parser def parser_to_opts(parser: argparse.ArgumentParser, args: Optional[List[str]] = None): # parse args opts = parser.parse_args(args) opts = load_config_file(opts) return opts def get_training_arguments( args: Optional[List[str]] = None, parse_args: bool = True, add_arguments: Optional[ Callable[[argparse.ArgumentParser], argparse.ArgumentParser] ] = None, ) -> Union[argparse.ArgumentParser, argparse.Namespace]: """Adds the CoreNet training arguments to the argument parser. Args: args: If provided, argparser ignores the CLI arguments and parses the given list. Defaults to None, that parses CLI arguments from `sys.argv`. parse_args: If true, parses the arguments. Otherwise, just creates the parser. Defaults to True. add_arguments: If provided, wraps the argument parser to modify the parser or to add additional arguments dynamically. Useful for entrypoint-specific arguments. Defaults to None. Returns: By default, returns the `opts` config object. If parse_args=True is passed, returns the argument parser. """ parser = argparse.ArgumentParser(description="Training arguments", add_help=True) # transfer client related arguments parser = transfer_client_arguments(parser) # dataset related arguments parser = arguments_dataset(parser=parser) # cvnet arguments, including models parser = modeling_arguments(parser=parser) # sampler related arguments parser = add_sampler_arguments(parser=parser) # collate fn related arguments parser = arguments_collate_fn(parser=parser) # transform related arguments parser = arguments_augmentation(parser=parser) # Video reader related arguments # Should appear after arguments_augmentations(parser=parser) because "--frame-augmentation.*" depends on "--image-augmentation.*" parser = arguments_video_reader(parser=parser) # loss function arguments parser = add_loss_fn_arguments(parser=parser) # optimizer arguments parser = arguments_optimizer(parser=parser) parser = arguments_scheduler(parser=parser) # DDP arguments parser = arguments_ddp(parser=parser) # stats arguments parser = arguments_stats(parser=parser) # common parser = arguments_common(parser=parser) # text tokenizer arguments parser = arguments_tokenizer(parser=parser) # metric arguments parser = METRICS_REGISTRY.all_arguments(parser=parser) parser = arguments_train_eval_pipeline(parser=parser) if add_arguments is not None: parser = add_arguments(parser) if parse_args: return parser_to_opts(parser, args) else: return parser def get_lm_eval_arguments( parse_args: Optional[bool] = True, args: Optional[List[str]] = None ) -> argparse.ArgumentParser: parser = get_training_arguments( parse_args=False, args=args, ) parser = arguments_lm_eval(parser) if parse_args: return parser_to_opts(parser, args) else: return parser def get_conversion_arguments(args: Optional[List[str]] = None): parser = get_training_arguments(parse_args=False) # Arguments related to coreml conversion group = parser.add_argument_group("Conversion arguments") group.add_argument( "--conversion.coreml-extn", type=str, default="mlmodel", help="Extension for converted model. Default is mlmodel", ) group.add_argument( "--conversion.input-image-path", type=str, default=None, help="Path of the image to be used for conversion", ) group.add_argument( "--conversion.minimum-deployment-target", type=str, default=None, choices=list([target.name for target in ct.target]), help="A member of the coremltools.target enum. Defaults to None", ) group.add_argument( "--conversion.compute-precision", type=str, default=None, choices=list([precision.name for precision in ct.precision]), help="A member of the coremltools.precision enum. Defaults to None", ) # Arguments related to server. group.add_argument( "--conversion.bucket-name", type=str, help="Model job's bucket name" ) group.add_argument("--conversion.task-id", type=str, help="Model job's id") group.add_argument( "--conversion.viewers", type=str, nargs="+", default=None, help="Users who can view your models on server", ) # parse args return parser_to_opts(parser, args=args) def get_benchmarking_arguments(args: Optional[List[str]] = None): parser = get_training_arguments(parse_args=False) # group = parser.add_argument_group("Benchmarking arguments") group.add_argument( "--benchmark.batch-size", type=int, default=1, help="Batch size for benchmarking", ) group.add_argument( "--benchmark.warmup-iter", type=int, default=10, help="Warm-up iterations" ) group.add_argument( "--benchmark.n-iter", type=int, default=100, help="Number of iterations for benchmarking", ) group.add_argument( "--benchmark.use-jit-model", action="store_true", help="Convert the model to JIT and then benchmark it", ) # parse args return parser_to_opts(parser, args=args) ================================================ FILE: corenet/options/parse_args.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import json import typing from typing import Any def parse_validation_metric_names(opts): """ This function contains common command-line parsing logic for validation metrics """ metric_names = getattr(opts, "stats.val", ["loss"]) if isinstance(metric_names, str): metric_names = [metric_names] assert isinstance( metric_names, list ), "Type of metric names should be list. Got: {}".format(type(metric_names)) if "loss" not in metric_names: metric_names.append("loss") ckpt_metric_str = getattr(opts, "stats.checkpoint_metric", "loss") ckpt_metric_arr = ckpt_metric_str.split(".") ckpt_metric = ckpt_metric_arr[0] if len(ckpt_metric_arr) == 1: ckpt_submetric_name = None else: ckpt_submetric_name = ckpt_metric_arr[-1] ckpt_metric = ckpt_metric ckpt_submetric = ckpt_submetric_name if ckpt_metric is None: # if checkpoint metric is not specified, then use loss ckpt_metric = "loss" assert ( ckpt_metric in metric_names ), "Checkpoint metric should be part of metric names. Metric names: {}, Checkpoint metric: {}".format( metric_names, ckpt_metric ) ckpt_metric = ckpt_metric.lower() return metric_names, ckpt_metric, ckpt_submetric class JsonValidator: def __init__(self, expected_type: type): """ JsonValidator(T) is function (s)->x that parses json string s into python value x, where x is of type T. Example Usage: >>> from typing import Union, List >>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.add_argument("--x", type=JsonValidator(Union[int, List[float]])) >>> assert parser.parse_args(["--x=123"]).x == 123 >>> assert parser.parse_args(["--x=[1, 2]"]).x == [1., 2.] """ self.expected_type = expected_type @classmethod def _validate_and_cast(cls, json_value: Any, expected_type: Any): type_cls = ( typing.get_origin(expected_type) or expected_type ) # typing.get_origin() returns None for non-generic types like `Any` and `int` type_args = typing.get_args(expected_type) if type_cls is typing.Any: return json_value if type_cls is float and isinstance(json_value, (int, float)): return float(json_value) elif type_cls in (int, str, bool) and isinstance(json_value, type_cls): return json_value elif type_cls is None and json_value is None: return None elif type_cls is typing.Union: for arg in type_args: try: return cls._validate_and_cast(json_value, arg) except TypeError: continue elif type_cls is dict and isinstance(json_value, dict): if not type_args: type_args = (Any, Any) type_key, type_value = type_args return { cls._validate_and_cast(key, type_key): cls._validate_and_cast( value, type_value ) for key, value in json_value.items() } elif type_cls is list and isinstance(json_value, list): if not type_args: type_args = [Any] return [cls._validate_and_cast(x, type_args[0]) for x in json_value] elif ( type_cls is tuple and isinstance(json_value, list) and (type_args is None or len(type_args) == len(json_value)) ): if type_args is None: type_args = [Any] * len(json_value) return tuple( type_cls( cls._validate_and_cast(item, type_arg) for item, type_arg in zip(json_value, type_args) ) ) raise TypeError( f"Cannot cast {json_value} with type {type(json_value)} to {expected_type}" ) def __call__(self, str_value: str) -> Any: try: value = json.loads(str_value) except json.JSONDecodeError: raise TypeError(f"Cannot parse json value '{str_value}' for {self}") return self._validate_and_cast(value, self.expected_type) def __repr__(self): return f"JSON[{self.expected_type}]" ================================================ FILE: corenet/options/utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import collections import os import re import yaml from corenet.options.errors import UnrecognizedYamlConfigEntry from corenet.utils import logger from corenet.utils.ddp_utils import is_master from corenet.utils.download_utils import get_local_path try: # Workaround for DeprecationWarning when importing Collections collections_abc = collections.abc except AttributeError: collections_abc = collections DEFAULT_CONFIG_DIR = "config" META_PARAMS_REGEX = r"tasks|include_configs" # To remove dummy entries corresponding to anchors, which are defined with a prefix `_anchor_` META_PARAMS_REGEX += r"|_anchor_.*" try: from corenet.internal.utils.opts import ( META_PARAMS_REGEX as INTERNAL_META_PARAMS_REGEX, ) except ModuleNotFoundError: pass # public version does not contain "internal" else: META_PARAMS_REGEX += "|" + INTERNAL_META_PARAMS_REGEX def flatten_yaml_as_dict(d, parent_key="", sep="."): items = [] for k, v in d.items(): new_key = parent_key + sep + k if parent_key else k if isinstance(v, collections_abc.MutableMapping): items.extend(flatten_yaml_as_dict(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items) def load_config_file(opts): config_file_name = getattr(opts, "common.config_file", None) if config_file_name is None: return opts is_master_node = is_master(opts) if is_master_node: config_file_name = get_local_path(opts=opts, path=config_file_name) if not os.path.isfile(config_file_name): if len(config_file_name.split("/")) == 1: # loading files from default config folder new_config_file_name = "{}/{}".format(DEFAULT_CONFIG_DIR, config_file_name) if not os.path.isfile(new_config_file_name) and is_master_node: logger.error( "Configuration file neither exists at {} nor at {}".format( config_file_name, new_config_file_name ) ) else: config_file_name = new_config_file_name else: # If absolute path of the file is passed if not os.path.isfile(config_file_name) and is_master_node: logger.error( "Configuration file does not exists at {}".format(config_file_name) ) setattr(opts, "common.config_file", config_file_name) with open(config_file_name, "r") as yaml_file: try: cfg = yaml.load(yaml_file, Loader=yaml.FullLoader) flat_cfg = flatten_yaml_as_dict(cfg) for k, v in flat_cfg.items(): if hasattr(opts, k): setattr(opts, k, v) elif "local_" not in k and not re.match(META_PARAMS_REGEX, k): logger.warning(UnrecognizedYamlConfigEntry(k)) except yaml.YAMLError as exc: if is_master_node: logger.error( "Error while loading config file: {}. Error message: {}".format( config_file_name, str(exc) ) ) # override arguments override_args = getattr(opts, "override_args", None) if override_args is not None: for override_k, override_v in override_args.items(): if hasattr(opts, override_k): setattr(opts, override_k, override_v) elif "local_" not in k and not re.match(META_PARAMS_REGEX, k): logger.warning(UnrecognizedYamlConfigEntry(override_k)) return opts def extend_selected_args_with_prefix( parser: argparse.ArgumentParser, match_prefix: str, additional_prefix: str ) -> argparse.ArgumentParser: """ Helper function to select arguments with certain prefix and duplicate them with a replaced prefix. An example use case is distillation, where we want to add --teacher.model.* as a prefix to all --model.* arguments. In that case, we provide the following arguments: * match_prefix="--model." * additional_prefix="--teacher.model." Args: match_prefix: Prefix to select arguments for duplication. The value should start with "--", contain no underscores, and with ".". additional_prefix: Prefix to replace the @match_prefix in duplicated arguments. The value should start with "--", contain no underscores, and with ".". """ # all arguments are stored as actions options = parser._actions regexp = r"--[^_]+\." assert re.match( regexp, match_prefix ), f"match prefix '{match_prefix}' should match regexp '{regexp}'" assert re.match( regexp, additional_prefix ), f"additional prefix '{additional_prefix}' should match regexp '{regexp}'" for option in options: option_strings = option.option_strings # option strings are stored as a list for option_string in option_strings: if option_string.startswith(match_prefix): parser.add_argument( option_string.replace(match_prefix, additional_prefix), nargs=( "?" if isinstance(option, argparse._StoreTrueAction) else option.nargs ), const=option.const, default=option.default, type=option.type, choices=option.choices, help=option.help, metavar=option.metavar, ) return parser def extract_opts_with_prefix_replacement( opts: argparse.Namespace, match_prefix: str, replacement_prefix: str, ) -> argparse.Namespace: """ Helper function to extract a copy options with certain prefix and return them with an alternative prefix. An example usage is distillation, when we have used @extend_selected_args_with_prefix to add --teacher.model.* arguments to argparser, and now we want to re-use the handlers of model.* opts by teacher.model.* opts Args: match_prefix: Prefix to select opts for extraction. The value should not contain dashes and should end with "." replacement_prefix: Prefix to replace the @match_prefix The value should not contain dashes and should end with "." """ regexp = r"[^-]+\." assert re.match( regexp, match_prefix ), f"match prefix '{match_prefix}' should match regexp '{regexp}'" assert re.match( regexp, replacement_prefix ), f"replacement prefix '{replacement_prefix}' should match regexp '{regexp}'" opts_dict = vars(opts) result_dict = { # replace teacher with empty string in "teacher.model.*" to get model.* key.replace(match_prefix, replacement_prefix): value for key, value in opts_dict.items() # filter keys related to teacher if key.startswith(match_prefix) } return argparse.Namespace(**result_dict) ================================================ FILE: corenet/third_party/__init__.py ================================================ ================================================ FILE: corenet/third_party/data/__init__.py ================================================ ================================================ FILE: corenet/third_party/data/text_tokenizer/__init__.py ================================================ ================================================ FILE: corenet/third_party/data/text_tokenizer/openai_clip_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import gzip from functools import lru_cache from typing import Dict, List, Set, Tuple, Union import regex as re import torch from torch import Tensor from corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer from corenet.utils import logger from corenet.utils.download_utils import get_local_path @lru_cache() def bytes_to_unicode() -> Dict[int, str]: """ Returns list of utf-8 byte and a corresponding list of unicode strings. The reversible bpe codes work on unicode strings. This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. This is a significant percentage of your normal, say, 32K bpe vocab. To avoid that, we want lookup tables between utf-8 bytes and unicode strings. This also avoids mapping to whitespace/control characters the bpe code barfs on. """ bs = ( list(range(ord("!"), ord("~") + 1)) + list(range(ord("¡"), ord("¬") + 1)) + list(range(ord("®"), ord("ÿ") + 1)) ) cs = bs[:] n = 0 for b in range(2**8): if b not in bs: bs.append(b) cs.append(2**8 + n) n += 1 cs = [chr(n) for n in cs] return dict(zip(bs, cs)) def get_pairs(word: Tuple[str, ...]) -> Set[Tuple[str, str]]: """Return set of symbol pairs in a word. Word is represented as tuple of symbols (symbols being variable-length strings). """ pairs = set() prev_char = word[0] for char in word[1:]: pairs.add((prev_char, char)) prev_char = char return pairs @TOKENIZER_REGISTRY.register(name="openai_clip") class OpenAIClipTokenizer(BaseTextTokenizer): """OpenAI's CLIP tokenizer. The code is taken from https://github.com/openai/CLIP. Args: opts: Command-line arguments. Example: >>> tokenizer = OpenAIClipTokenizer(opts) >>> input_sentence = "the quick brown fox jumped over the lazy dog" >>> tokenized_sentence = tokenizer(input_sentence) >>> print(tokenized_sentence) tensor([49406, 518, 3712, 2866, 3240, 16901, 962, 518, 10753, 1929, 49407]) >>> tokenizer.tok_decode(tokenized_sentence) '<|startoftext|>the quick brown fox jumped over the lazy dog <|endoftext|>' ...note: 1. BPE file can be downloaded from OpenAI's CLIP github as: ``` wget https://raw.githubusercontent.com/openai/CLIP/main/clip/bpe_simple_vocab_16e6.txt.gz ``` """ def __init__(self, opts: argparse.Namespace) -> None: super().__init__(opts) bpe_path = getattr(opts, "text_tokenizer.openai_clip.bpe_path") if bpe_path is None: logger.error( f"BPE path cannot be None in {self.__class__.__name__}. Please check." ) bpe_path = get_local_path( opts, path=bpe_path, force_delete=False, ) # merges contain pair of tokens that are frequently appearing in the corpora. # Example: ['i n', 't h', 'a n', 'r e', 'a r', 'e r', 'th e', 'in g', 'o u'] merges = gzip.open(bpe_path).read().decode("utf-8").split("\n") # Note 1: index 0 in merges file contain version information (e.g., 'bpe_simple_vocab_16e6.txt#version: 0.2'). # Note 2: The OpenAI CLIP model operates on a lower-cased byte pair encoding (BPE) representation of the text with a 49,152 vocab size. # Note 3a: For each byte, we have ['a', 'a']. so, 256 is subtracted. # Note 3b: We also add SOT and EOT tokens to the vocab, so we further subtract 2. merges = merges[1 : 49152 - 256 - 2 + 1] merges = [tuple(merge.split()) for merge in merges] vocab = list(bytes_to_unicode().values()) vocab = vocab + [v + "" for v in vocab] for merge in merges: vocab.append("".join(merge)) vocab.extend([self.sot_token, self.eot_token]) self.encoder = dict(zip(vocab, range(len(vocab)))) self.decoder = {v: k for k, v in self.encoder.items()} self.byte_encoder = bytes_to_unicode() self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} self.bpe_ranks = dict(zip(merges, range(len(merges)))) self.cache = { self.sot_token: self.sot_token, self.eot_token: self.eot_token, } self.pat = re.compile( r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|'ll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", re.IGNORECASE, ) @classmethod def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """OpenAIClipTokenizer arguments.""" if cls == OpenAIClipTokenizer: group = parser.add_argument_group(cls.__name__) openai_tokenizer_file_permanent_path = "https://github.com/openai/CLIP/raw/a1d071733d7111c9c014f024669f959182114e33/clip/bpe_simple_vocab_16e6.txt.gz" group.add_argument( "--text-tokenizer.openai-clip.bpe-path", type=str, default=openai_tokenizer_file_permanent_path, help=f"Path to BPE file. Defaults to '{openai_tokenizer_file_permanent_path}'.", ) return parser @property def vocab_size(self) -> int: """Text vocabulary size.""" return len(self.encoder) @property def eot_token(self) -> str: """End of text token.""" return "<|endoftext|>" @property def eot_token_id(self) -> int: """Token index for EOT token.""" return self.encoder[self.eot_token] @property def sot_token(self) -> str: """Start of text token.""" return "<|startoftext|>" @property def sot_token_id(self) -> int: """Start of token index.""" return self.encoder[self.sot_token] @property def pad_token_id(self) -> int: """Padding token index.""" return self.encoder[self.pad_token] def _bpe(self, token: str) -> str: """Convert token to byte pair encoding (BPE). Args: token: Text token (e.g., the word 'the') Returns: Byte-pair encoding of the @token (e.g., 'the'). """ if token in self.cache: return self.cache[token] word = tuple(token[:-1]) + (token[-1] + "",) pairs = get_pairs(word) if not pairs: return token + "" while True: bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(pair, float("inf"))) if bigram not in self.bpe_ranks: break first, second = bigram new_word = [] i = 0 while i < len(word): try: j = word.index(first, i) new_word.extend(word[i:j]) i = j except: new_word.extend(word[i:]) break if word[i] == first and i < len(word) - 1 and word[i + 1] == second: new_word.append(first + second) i += 2 else: new_word.append(word[i]) i += 1 new_word = tuple(new_word) word = new_word if len(word) == 1: break else: pairs = get_pairs(word) word = " ".join(word) self.cache[token] = word return word def tok_encode(self, input_sentence: str) -> Tensor: """Encodes a sentence into a tensor of token IDs. The byte-pair encodings are obtained for text tokens, which are subsequently converted into token ids and returned as a tensor. Args: input_sentence: The input sentence to be tokenized and encoded. Returns: A 1D tensor containing token IDs representing the encoded input sentence. The length of tokenized sentence is dependent on 'input_sentence'. ...note: Special tokens SOT (Start of Text) and EOT (End of Text) are added to the input sentence before tokenization. """ input_sentence = f"{self.sot_token} {input_sentence} {self.eot_token}" bpe_tokens = [] for token in re.findall(self.pat, input_sentence): token = "".join(self.byte_encoder[b] for b in token.encode("utf-8")) bpe_tokens.extend( self.encoder[bpe_token] for bpe_token in self._bpe(token).split(" ") ) bpe_tokens_tensor = torch.tensor(bpe_tokens, dtype=torch.long) return bpe_tokens_tensor def tok_decode(self, token_ids: Union[List[int], Tensor]) -> str: """Decodes list of token ids into a sentence. Args: token_ids: A list of token ids or a 1D tensor containing token ids. Returns: The decoded sentence. """ if isinstance(token_ids, Tensor): token_ids = token_ids.numpy().tolist() text = "".join([self.decoder[token] for token in token_ids]) text = ( bytearray([self.byte_decoder[c] for c in text]) .decode("utf-8", errors="replace") .replace("", " ") ) return text ================================================ FILE: corenet/third_party/modeling/__init__.py ================================================ ================================================ FILE: corenet/third_party/modeling/lora.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ LoRA and DoRA models for parameter-efficient finetuning. Adapted from: https://github.com/huggingface/peft/blob/main/src/peft/tuners/lora/layer.py """ from __future__ import annotations import math import re import warnings from abc import ABC from dataclasses import asdict, dataclass from typing import Any, Dict, List, Optional, Union import torch import torch.nn as nn import torch.nn.functional as F from corenet.modeling.layers import embedding, linear_layer def check_adapters_to_merge( module: BaseTunerLayer, adapter_names: Optional[List[str]] = None ) -> List[str]: """ Helper function to check which adapters should be merged. Only return those adapters that are not already merged. Give a warning if some or all of the adapters are already merged. Args: module: The module in which to check the adapters. adapter_names: The names of the adapters to check. Returns: A list of adapters that are not merged. """ if adapter_names is None: adapter_names = module.active_adapters if module.merged: merged_adapters = set(module.merged_adapters) adapter_names = [name for name in adapter_names if name not in merged_adapters] if adapter_names: warnings.warn( f"Already following adapters were merged {','.join(module.merged_adapters)}. " f"You are now additionally merging {','.join(adapter_names)}." ) else: warnings.warn("All adapters are already merged, nothing to do.") return adapter_names class BaseTunerLayer(ABC): """ A tuner layer mixin that provides the common methods and attributes for all tuners. Args: is_pluggable: Whether the adapter layer can be plugged to any pytorch module active_adapters: The name of the active adapter. """ active_adapter = None # All names of layers that may contain adapter (trainable) weights. adapter_layer_names: Tuple[str, ...] = () # All names of other parameters that may contain adapter-related parameters. other_param_names: Tuple[str, ...] = () # Indicates whether all adapters should be disabled. _disable_adapters: bool = False # The currently active adapter(s). _active_adapter: Union[List[str], str] = "default" # All merged adapter(s). merged_adapters: List[str] = [] def get_base_layer(self) -> nn.Module: """ (Recursively) get the base_layer that the adapter wraps. This is necessary for the case that the tuner layer wraps another tuner layer. Returns: The base layer. """ base_layer = self while hasattr(base_layer, "base_layer"): base_layer = base_layer.base_layer return base_layer @property def weight(self) -> torch.Tensor: """ Get the weight of the base layer that this adapter. Returns: The base layer's weight. """ return self.get_base_layer().weight @property def bias(self) -> torch.Tensor: """ Get the bias of the base layer that this adapter. Returns: The base layer's bias. """ return self.get_base_layer().bias def merge( self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None ) -> None: """ Merge the active adapter weights into the base weights. Args: safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs before merging the weights. This is useful if you want to check if the merge operation will produce NaNs. Defaults to `False`. adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults to `None`. """ raise NotImplementedError def unmerge(self) -> None: """ Unmerge the adapters. """ raise NotImplementedError @property def merged(self) -> bool: """ Check whether the adapters are merged. Returns: True if the adapters are merged. """ return bool(self.merged_adapters) @property def disable_adapters(self) -> bool: """ Check if all adapters are disabled. Returns: True if the adapters are all disabled. """ # Use a property to ensure that disable_adapters is not set directly. # See also @enable_adapters. return self._disable_adapters @property def active_adapter(self) -> Union[List[str], str]: """ Get the active adapter. Returns: The name of the active adapter. """ # Use a property to ensure that active_adapter is not set directly. # See also @set_adapter. return self._active_adapter @property def active_adapters(self) -> List[str]: """ Get all active adapters. Returns: A list of active adapters. """ if isinstance(self.active_adapter, str): return [self.active_adapter] # is already a list of str return self.active_adapter def enable_adapters(self, enabled: bool) -> None: """Toggle the enabling and disabling of adapters Takes care of setting the requires_grad flag for the adapter weights. Args: enabled: If True, adapters will be enabled. If False, they will be disabled. """ if enabled: self.set_adapter(self.active_adapters) self._disable_adapters = False else: # disable grads on all adapter layers for layer_name in self.adapter_layer_names: layer = getattr(self, layer_name) layer.requires_grad_(False) self._disable_adapters = True def set_adapter(self, adapter_names: Union[str, List[str]]) -> None: """Set the active adapter(s). Additionally, this function will set the specified adapters to trainable (i.e., requires_grad=True). If this is not desired, use the following code. ```py >>> for name, param in model_peft.named_parameters(): ... if ...: # some check on name (ex. if 'lora' in name) ... param.requires_grad = False ``` Args: adapter_names: Name of the adapter(s) to be activated. """ if isinstance(adapter_names, str): adapter_names = [adapter_names] # Deactivate grads on the inactive adapter and activate grads on the active adapter. for layer_name in self.adapter_layer_names: module_dict = getattr(self, layer_name) for key, layer in module_dict.items(): if key in adapter_names: # Note: It is possible that not a single layer is called with requires_grad_(True) here. This may # happen if a completely different adapter layer is being activated. layer.requires_grad_(True) else: layer.requires_grad_(False) self._active_adapter = adapter_names def _all_available_adapter_names(self) -> List[str]: """ Return a sorted list of all available adapter names. Returns: A sorted list of adapter names. """ adapter_names = set() for name in self.adapter_layer_names + self.other_param_names: # We check each possible attribute and if it's a dict or ModuleDict, we assume that the keys are the adapter # names attr = getattr(self, name) if hasattr(attr, "keys"): adapter_names.update(attr.keys()) return sorted(adapter_names) def delete_adapter(self, adapter_name: str) -> None: """ Delete an adapter from the layer This should be called on all adapter layers, or else we will get an inconsistent state. This method will also set a new active adapter if the deleted adapter was an active adapter. It is important that the new adapter is chosen in a deterministic way, so that the same adapter is chosen on all layers. Args: adapter_name: The name of the adapter to delete. """ for attr in self.adapter_layer_names + self.other_param_names: if adapter_name in getattr(self, attr): del getattr(self, attr)[adapter_name] if adapter_name in self.active_adapters: # Choose a new active adapter. active_adapters = self.active_adapters[:] active_adapters.remove(adapter_name) if active_adapters: self.set_adapter(active_adapters) else: # No active adapters left, set a new default adapter. To do so, # get the list of all adapters existing adapter names and # choose the first one. remaining_adapters = self._all_available_adapter_names() if not remaining_adapters: self.set_adapter([]) else: new_active_adapter = remaining_adapters[0] warnings.warn( f"Adapter {adapter_name} was active which is now deleted. Setting active adapter to " f"{new_active_adapter}." ) self.set_adapter(remaining_adapters[0]) class LoraLayer(BaseTunerLayer): """A LoRA (https://arxiv.org/abs/2106.09685) layer. See also DoRA, an extension of LoRA: https://arxiv.org/abs/2402.09353. As per the HuggingFace API, this layer can contain multiple different adapters. Args: base_layer: The layer to wrap with LoRA. """ # All names of layers that may contain (trainable) adapter weights adapter_layer_names = ("lora_A", "lora_B", "lora_embedding_A", "lora_embedding_B") # All names of other parameters that may contain adapter-related parameters other_param_names = ("r", "lora_alpha", "scaling", "lora_dropout") def __init__(self, base_layer: nn.Module) -> None: super().__init__() self.base_layer = base_layer self.r = {} self.lora_alpha = {} self.scaling = {} self.lora_dropout = nn.ModuleDict({}) self.lora_A = nn.ModuleDict({}) self.lora_B = nn.ModuleDict({}) # For Embedding layers. self.lora_embedding_A = nn.ParameterDict({}) self.lora_embedding_B = nn.ParameterDict({}) # Mark the weight as unmerged. self._disable_adapters = False self.merged_adapters = [] self.use_dora: dict[str, bool] = {} self.lora_magnitude_vector: Optional[torch.nn.ParameterDict] = None # for DoRA self._caches: dict[str, Any] = {} base_layer = self.get_base_layer() if isinstance(base_layer, linear_layer.LinearLayer): in_features, out_features = base_layer.in_features, base_layer.out_features elif isinstance(base_layer, embedding.Embedding): in_features, out_features = ( base_layer.num_embeddings, base_layer.embedding_dim, ) else: raise ValueError(f"Unsupported layer type {type(base_layer)}") self.in_features = in_features self.out_features = out_features def update_layer( self, adapter_name: str, r: int, lora_alpha: float, lora_dropout: float, init_lora_weights: Union[str, bool], use_rslora: bool, use_dora: bool = False, ) -> None: """ Create an adapter with the given name. Args: adapter_name: The name of the new adapter. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The dropout to use with the LoRA module. init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies whether to initialize the weights with Kaiming uniform, or whether to skip initialization. """ raise NotImplementedError(f"Implement @update_layer in the base class.") def reset_lora_parameters( self, adapter_name: str, init_lora_weights: Union[str, bool] ) -> None: """ Reset the LoRA parameters. Args: adapter_name: The adapter on which to reset the parameters. init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies whether to initialize the weights with Kaiming uniform, or whether to skip initialization. """ if init_lora_weights is False: return if adapter_name in self.lora_A.keys(): if init_lora_weights is True: nn.init.kaiming_uniform_( self.lora_A[adapter_name].weight, a=math.sqrt(5) ) elif init_lora_weights.lower() == "gaussian": nn.init.normal_( self.lora_A[adapter_name].weight, std=1 / self.r[adapter_name] ) else: raise ValueError(f"Unknown initialization {init_lora_weights=}") nn.init.zeros_(self.lora_B[adapter_name].weight) if adapter_name in self.lora_embedding_A.keys(): nn.init.zeros_(self.lora_embedding_A[adapter_name]) nn.init.normal_(self.lora_embedding_B[adapter_name]) def _get_weight_norm( self, weight: torch.Tensor, lora_weight: torch.Tensor, scaling: float ) -> torch.Tensor: """ Calculate L2 norm of the combination of @weight and @lora_weight * @scaling. The norm is taken across the dimension with index 1. No specific shape is required, but normally, the dimension with index 1 will be the "input_dim" dimension of the weight tensor. Args: weight: The matrix whose norm to calculate. lora_weight: The LoRA weight to add to the weight matrix. scaling: The scaling to apply to the LoRA weight. Returns: The norm of the dimension with index 1 (typically the input feature dimension). """ weight = weight + scaling * lora_weight weight_norm = torch.linalg.norm(weight, dim=1).to(weight.dtype) return weight_norm def dora_init(self, adapter_name: str) -> None: """ Initialize the adapter with DoRA (https://arxiv.org/abs/2402.09353). Args: adapter_name: The name of the adapter to initialize. """ lora_A = self.lora_A[adapter_name] lora_B = self.lora_B[adapter_name] scaling = self.scaling[adapter_name] weight = self.weight if weight.data.ndim == 4: # For handling LoRAs applied to Conv2Ds. # Leave this check to make it clear that this codepath needs to # be edited if Conv2d support is added. raise NotImplementedError(f"Conv2d is not currently supported.") else: lora_weight = lora_B.weight @ lora_A.weight weight_norm = self._get_weight_norm(weight, lora_weight, scaling) self.lora_magnitude_vector = nn.ParameterDict() self.lora_magnitude_vector[adapter_name] = nn.Parameter( weight_norm, requires_grad=True ) self.adapter_layer_names = self.adapter_layer_names[:] + ( "lora_magnitude_vector", ) def _cache_store(self, key: str, value: Any) -> None: """ Store @value in the cache using @key. Args: key: The key to use. value: The value to store. """ self._caches[key] = value def _cache_pop(self, key: str) -> Any: """ Pop a value from the cache with index @key. Args: key: The key to use. Returns: The value corresponding to the key. """ value = self._caches.pop(key) return value def _apply_dora( self, x: torch.Tensor, lora_A: torch.Tensor, lora_B: torch.Tensor, scaling: float, active_adapter: str, ) -> torch.Tensor: """ For DoRA, calculate the extra output from LoRA with DoRA applied. This should be added on top of the base layer output. Args: x: The inputs. The shape depends on the type of the wrapped layer, but the inputs will be a suitable shape for the wrapped layer. lora_A: LoRA's A matrix. The shape depends on the type of the wrapped layer. lora_B: LoRA's B matrix. The shape depends on the type of the wrapped layer. scaling: The LoRA scale parameter. active_adapter: The adapter to use. Returns: The weight combined with DoRA. """ lora_weight = lora_B.weight @ lora_A.weight magnitude = self.lora_magnitude_vector[active_adapter] weight = self.get_base_layer().weight quant_state = getattr(self.get_base_layer(), "state", None) weight = weight.to(x.dtype) weight_norm = self._get_weight_norm(weight, lora_weight, scaling) # See section 4.3 of DoRA (https://arxiv.org/abs/2402.09353) # "[...] we suggest treating ||V + \delta V ||_c in # Eq. (5) as a constant, thereby detaching it from the gradient # graph. This means that while ||V + \delta V ||_c dynamically # reflects the updates of \delta V , it won’t receive any gradient # during backpropagation". weight_norm = weight_norm.detach() mag_norm_scale = (magnitude / weight_norm).view(1, -1) result_dora = (mag_norm_scale - 1) * ( F.linear(x, weight) ) + mag_norm_scale * lora_B(lora_A(x)) * scaling return result_dora def set_scale(self, adapter: str, scale: float) -> None: """ Set the LoRA scale. Args: adapter: The adapter to use. scale: The scale to set. """ if adapter not in self.scaling: # Ignore the case where the adapter is not in the layer return self.scaling[adapter] = scale * self.lora_alpha[adapter] / self.r[adapter] def scale_layer(self, scale: float) -> None: """ Apply @scale to the active adapter. Args: scale: The scale to apply. """ if scale == 1: return for active_adapter in self.active_adapters: if active_adapter in self.lora_A.keys(): self.scaling[active_adapter] *= scale def unscale_layer(self, scale: float = None) -> None: """ If @scale is not None, apply the inverse of @scale to the active adapter. If scale is None, set the active adapter's scale to (alpha / r). Args: scale: The scale to apply, or None. """ for active_adapter in self.active_adapters: if active_adapter in self.lora_A.keys(): if scale is None: self.scaling[active_adapter] = ( self.lora_alpha[active_adapter] / self.r[active_adapter] ) else: self.scaling[active_adapter] /= scale def _check_forward_args( self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any] ): """ Check if the arguments are compatible with the configs and state of the model. Args: x: The input. args: The forward pass args. kwargs: The forward pass kwargs. """ adapter_names = kwargs.get("adapter_names", None) if adapter_names is None: return if len(x) != len(adapter_names): msg = ( "Length of `adapter_names` should be the same as the number of inputs, but got " f"{len(adapter_names)} and {len(x)} respectively." ) raise ValueError(msg) if self.merged: # It is unclear what would be the right thing to do if users pass adapter_names and there are merged # adapters. Therefore, it is better to raise an error in this case. msg = "Cannot pass `adapter_names` when there are merged adapters, please call `unmerge_adapter` first." raise ValueError(msg) unique_adapters = set(self.active_adapters) for adapter_name in unique_adapters: if self.use_dora.get(adapter_name, False): msg = "Cannot pass `adapter_names` when DoRA is enabled." raise ValueError(msg) def _mixed_batch_forward( self, x: torch.Tensor, *args: List[Any], adapter_names: List[str], **kwargs: Dict[str, Any], ) -> torch.Tensor: """ This is a special method that handles the case when users pass the argument `adapter_names`. This is an extra argument that allows mixing different adapters in the same batch at inference time. Args: x: The input. Its shape is suitable for input to the wrapped layer. args: The forward pass args. adapter_names: The adapters to use for each batch element. Its length should equal the batch size. kwargs: The forward pass kwargs. """ result = self.base_layer(x, *args, **kwargs) torch_result_dtype = result.dtype unique_adapters = set(adapter_names) sub_batch_indices_list = [] for adapter in unique_adapters: sub_batch_indices_list.append( [index for index, item in enumerate(adapter_names) if item == adapter] ) for i, active_adapter in enumerate(unique_adapters): if active_adapter == "__base__": continue if active_adapter not in self.lora_A.keys(): continue lora_A = self.lora_A[active_adapter] lora_B = self.lora_B[active_adapter] dropout = self.lora_dropout[active_adapter] scaling = self.scaling[active_adapter] # Getting the sub-batch, passing it to LoRA layers and updating the # corresponding indices of the linear layer output. sub_batch = x[sub_batch_indices_list[i]].to(lora_A.weight.dtype) lora_output = lora_B(lora_A(dropout(sub_batch))) * scaling result[sub_batch_indices_list[i]] += lora_output.to(torch_result_dtype) return result class Linear(nn.Module, LoraLayer): """ Create a LoRA linear layer. Args: base_layer: The layer to wrap. adapter_name: The name of the adapter. Needed since BaseFineTune supports using multiple adapters at once. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The LoRA dropout parameter. init_lora_weights: Whether to initialize LoRA weights. use_rslora: Whether to use RS Lora. use_dora: Whether to use DoRA. """ def __init__( self, base_layer: nn.Module, adapter_name: str, r: int = 0, lora_alpha: int = 1, lora_dropout: float = 0.0, init_lora_weights: Union[bool, str] = True, use_rslora: bool = False, use_dora: bool = False, ) -> None: nn.Module.__init__(self) LoraLayer.__init__(self, base_layer) self._active_adapter = adapter_name self.update_layer( adapter_name, r, lora_alpha=lora_alpha, lora_dropout=lora_dropout, init_lora_weights=init_lora_weights, use_rslora=use_rslora, use_dora=use_dora, ) def update_layer( self, adapter_name: str, r: int, lora_alpha: float, lora_dropout: float, init_lora_weights: str, use_rslora: bool, use_dora: bool = False, ) -> None: """ Create an adapter with the given name. Args: adapter_name: The name of the new adapter. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The dropout to use with the LoRA module. init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies whether to initialize the weights with Kaiming uniform, or whether to skip initialization. """ if r <= 0: raise ValueError(f"Unexpected lora rank {r=}") self.r[adapter_name] = r self.lora_alpha[adapter_name] = lora_alpha if lora_dropout > 0.0: lora_dropout_layer = nn.Dropout(p=lora_dropout) else: lora_dropout_layer = nn.Identity() self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer})) # Create the LoRA parameters. self.lora_A[adapter_name] = nn.Linear(self.in_features, r, bias=False) self.lora_B[adapter_name] = nn.Linear(r, self.out_features, bias=False) if use_rslora: self.scaling[adapter_name] = lora_alpha / math.sqrt(r) else: self.scaling[adapter_name] = lora_alpha / r if init_lora_weights: self.reset_lora_parameters(adapter_name, init_lora_weights) if self.weight.dtype.is_floating_point or self.weight.dtype.is_complex: self.to(self.weight.device, dtype=self.weight.dtype) else: self.to(self.weight.device) if use_dora: self.dora_init(adapter_name) self.use_dora[adapter_name] = True else: self.use_dora[adapter_name] = False self.set_adapter(self.active_adapters) def merge( self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None ) -> None: """ Merge the active adapter weights into the base weights. Args: safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs before merging the weights. This is useful if you want to check if the merge operation will produce NaNs. Defaults to `False`. adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults to `None`. """ adapter_names = check_adapters_to_merge(self, adapter_names) if not adapter_names: return for active_adapter in adapter_names: if active_adapter in self.lora_A.keys(): base_layer = self.get_base_layer() if safe_merge: # Note that safe_merge will be slower than the normal merge # because of the copy operation. orig_weights = base_layer.weight.data.clone() delta_weight = self.get_delta_weight(active_adapter) if not self.use_dora[active_adapter]: orig_weights = orig_weights + delta_weight else: # Handle dora. # Since delta_weight already includes scaling, set it to 1 here weight_norm = self._get_weight_norm( orig_weights, delta_weight, scaling=1 ).detach() # We need to cache weight_norm because it has to be based on the original weights. We # cannot calculate it on the fly based on the merged weights when unmerging because its a # different value. self._cache_store(f"{active_adapter}-weight_norm", weight_norm) dora_factor = ( self.lora_magnitude_vector[active_adapter] / weight_norm ) orig_weights = dora_factor.view(-1, 1) * ( orig_weights + delta_weight ) if not torch.isfinite(orig_weights).all(): raise ValueError( f"NaNs detected in the merged weights. The adapter {active_adapter} seems to be broken" ) base_layer.weight.data = orig_weights else: delta_weight = self.get_delta_weight(active_adapter) if not self.use_dora[active_adapter]: base_layer.weight.data = base_layer.weight.data + delta_weight else: # Handle dora. # Since delta_weight already includes scaling, set it to 1 here weight_norm = self._get_weight_norm( base_layer.weight, delta_weight, scaling=1 ).detach() # We need to cache weight_norm because it has to be based on the original weights. We # cannot calculate it on the fly based on the merged weights when unmerging because its a # different value self._cache_store(f"{active_adapter}-weight_norm", weight_norm) dora_factor = ( self.lora_magnitude_vector[active_adapter] / weight_norm ) new_weight = dora_factor.view(-1, 1) * ( base_layer.weight.data + delta_weight ) base_layer.weight.data = new_weight self.merged_adapters.append(active_adapter) def unmerge(self) -> None: """ Unmerge the adapters. """ if not self.merged: warnings.warn("Already unmerged. Nothing to do.") return while len(self.merged_adapters) > 0: active_adapter = self.merged_adapters.pop() if active_adapter in self.lora_A.keys(): weight = self.get_base_layer().weight delta_weight = self.get_delta_weight(active_adapter) if not self.use_dora[active_adapter]: weight.data -= delta_weight else: weight_norm = self._cache_pop(f"{active_adapter}-weight_norm") dora_factor = ( self.lora_magnitude_vector[active_adapter] / weight_norm ) weight_orig = weight.data / dora_factor.view(-1, 1) - delta_weight weight.data = weight_orig def get_delta_weight(self, adapter: str) -> torch.Tensor: """ Compute the delta weight for the given adapter. Args: adapter: The name of the adapter for which the delta weight should be computed. Returns: The delta weight. It will be a 2-dimensional tensor of the same shape as the wrapped layer's weight. """ device = self.lora_B[adapter].weight.device dtype = self.lora_B[adapter].weight.dtype # In case users wants to merge the adapter weights that are in # float16 while being on CPU, we need to cast the weights to float32, perform the merge and then cast back to # float16 because the `@` and matmul operation in general is not supported in torch + cpu + fp16. cast_to_fp32 = device.type == "cpu" and dtype == torch.float16 weight_A = self.lora_A[adapter].weight weight_B = self.lora_B[adapter].weight if cast_to_fp32: weight_A = weight_A.float() weight_B = weight_B.float() output_tensor = (weight_B @ weight_A) * self.scaling[adapter] if cast_to_fp32: output_tensor = output_tensor.to(dtype=dtype) # cast back the weights self.lora_A[adapter].weight.data = weight_A.to(dtype) self.lora_B[adapter].weight.data = weight_B.to(dtype) return output_tensor def forward( self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any] ) -> torch.Tensor: """ Run a forward pass with the active adapters. Args: x: The input of shape [batch_size, ..., feature_dim]. args: Forward pass args. kwargs: Forward pass kwargs. """ self._check_forward_args(x, *args, **kwargs) adapter_names = kwargs.pop("adapter_names", None) if self.disable_adapters: if self.merged: self.unmerge() result = self.base_layer(x, *args, **kwargs) elif adapter_names is not None: result = self._mixed_batch_forward( x, *args, adapter_names=adapter_names, **kwargs ) elif self.merged: result = self.base_layer(x, *args, **kwargs) else: result = self.base_layer(x, *args, **kwargs) torch_result_dtype = result.dtype for active_adapter in self.active_adapters: if active_adapter not in self.lora_A.keys(): continue lora_A = self.lora_A[active_adapter] lora_B = self.lora_B[active_adapter] dropout = self.lora_dropout[active_adapter] scaling = self.scaling[active_adapter] x = x.to(lora_A.weight.dtype) if not self.use_dora[active_adapter]: result = result + lora_B(lora_A(dropout(x))) * scaling else: x = dropout(x) result = result + self._apply_dora( x, lora_A, lora_B, scaling, active_adapter ) result = result.to(torch_result_dtype) return result def __repr__(self) -> str: """ Get a string representation of the layer. Returns: A string representation of the layer. """ rep = super().__repr__() return "lora." + rep class Embedding(nn.Module, LoraLayer): """ Create a LoRA embedding layer. Args: base_layer: The layer to wrap. adapter_name: The name of the adapter. Needed since BaseFineTune supports using multiple adapters at once. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The LoRA dropout parameter. init_lora_weights: Whether to initialize LoRA weights. use_rslora: Whether to use RS Lora. use_dora: Whether to use DoRA. """ def __init__( self, base_layer: nn.Module, adapter_name: str, r: int = 0, lora_alpha: int = 1, lora_dropout: float = 0.0, init_lora_weights: Union[bool, str] = True, use_rslora: bool = False, use_dora: bool = False, ) -> None: nn.Module.__init__(self) LoraLayer.__init__(self, base_layer) # DoRA is not supported yet. if use_dora: raise ValueError("DoRA is not yet supported for Embedding layers.") self._active_adapter = adapter_name self.update_layer( adapter_name, r, lora_alpha=lora_alpha, lora_dropout=lora_dropout, init_lora_weights=init_lora_weights, use_rslora=use_rslora, use_dora=use_dora, ) def update_layer( self, adapter_name: str, r: int, lora_alpha: float, lora_dropout: float, init_lora_weights: Union[str, bool], use_rslora: bool, use_dora: bool = False, ) -> None: """ Create an adapter with the given name. Args: adapter_name: The name of the new adapter. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The dropout to use with the LoRA module. init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies whether to initialize the weights with Kaiming uniform, or whether to skip initialization. """ if use_dora: raise ValueError(f"DoRA is not yet supported.") if r <= 0: raise ValueError(f"Invalid LoRA rank {r=}") self.r[adapter_name] = r self.lora_alpha[adapter_name] = lora_alpha if lora_dropout > 0.0: lora_dropout_layer = nn.Dropout(p=lora_dropout) else: lora_dropout_layer = nn.Identity() self.lora_dropout[adapter_name] = lora_dropout_layer # Actual trainable parameters weight_A = torch.randn((r, self.in_features)) weight_B = torch.randn((self.out_features, r)) self.lora_embedding_A[adapter_name] = nn.Parameter(weight_A) self.lora_embedding_B[adapter_name] = nn.Parameter(weight_B) if use_rslora: self.scaling[adapter_name] = lora_alpha / math.sqrt(r) else: self.scaling[adapter_name] = lora_alpha / r if init_lora_weights: self.reset_lora_parameters(adapter_name, init_lora_weights) base_layer = self.get_base_layer() weight = getattr(base_layer, "weight", None) if weight is not None: # The layer is already completely initialized, this is an update. self.to(base_layer.weight.device, dtype=weight.dtype) self.set_adapter(self.active_adapters) def merge( self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None ) -> None: """ Merge the active adapter weights into the base weights. Args: safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs before merging the weights. This is useful if you want to check if the merge operation will produce NaNs. Defaults to `False`. adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults to `None`. """ adapter_names = check_adapters_to_merge(self, adapter_names) if not adapter_names: # no adapter to merge return for active_adapter in adapter_names: if active_adapter in self.lora_embedding_A.keys(): base_layer = self.get_base_layer() if safe_merge: # Note that safe_merge will be slower than the normal merge # because of the copy operation. orig_weights = base_layer.weight.data.clone() orig_weights = orig_weights + self.get_delta_weight(active_adapter) if not torch.isfinite(orig_weights).all(): raise ValueError( f"NaNs detected in the merged weights. The adapter {active_adapter} seems to be broken" ) base_layer.weight.data = orig_weights else: base_layer.weight.data = ( base_layer.weight.data + self.get_delta_weight(active_adapter) ) self.merged_adapters.append(active_adapter) def unmerge(self) -> None: """ Unmerge the adapters. """ if not self.merged: warnings.warn("Already unmerged. Nothing to do.") return while len(self.merged_adapters) > 0: active_adapter = self.merged_adapters.pop() if active_adapter in self.lora_embedding_A.keys(): self.get_base_layer().weight.data -= self.get_delta_weight( active_adapter ) def get_delta_weight(self, adapter: str) -> torch.Tensor: """ Compute the delta weight for the given adapter. Args: adapter: The name of the adapter for which the delta weight should be computed. Returns: The delta weight. It will have the same shape as the wrapped layer's weight. """ device = self.lora_embedding_B[adapter].device dtype = self.lora_embedding_A[adapter].dtype # In case users wants to merge the adapter weights that are in # float16 while being on CPU, we need to cast the weights to float32, perform the merge and then cast back to # float16 because the `@` and matmul operation in general is not supported in torch + cpu + fp16. cast_to_fp32 = device.type == "cpu" and dtype == torch.float16 weight_A = self.lora_embedding_A[adapter] weight_B = self.lora_embedding_B[adapter] if cast_to_fp32: weight_A = weight_A.float() weight_B = weight_B.float() output_tensor = (weight_B @ weight_A) * self.scaling[adapter] if cast_to_fp32: output_tensor = output_tensor.to(dtype=dtype) # cast back the weights self.lora_embedding_A[adapter] = weight_A.to(dtype) self.lora_embedding_B[adapter] = weight_B.to(dtype) return output_tensor def _mixed_batch_forward( self, x: torch.Tensor, *args: List[Any], adapter_names: List[str], **kwargs: Dict[str, Any], ) -> torch.Tensor: """ This is a special method that handles the case when users pass the argument `adapter_names`. This is an extra argument that allows mixing different adapters in the same batch at inference time. Args: x: The input. args: The forward pass args. adapter_names: The adapters to use for each batch element. Its length should equal the batch size. kwargs: The forward pass kwargs. Returns: The result of the forward pass. """ result = self.base_layer(x, *args, **kwargs) unique_adapters = set(adapter_names) sub_batch_indices_list = [] for adapter in unique_adapters: sub_batch_indices_list.append( [index for index, item in enumerate(adapter_names) if item == adapter] ) for i, active_adapter in enumerate(unique_adapters): if active_adapter == "__base__": continue if active_adapter not in self.lora_embedding_A.keys(): continue embedding_A = self.lora_embedding_A[active_adapter].T embedding_B = self.lora_embedding_B[active_adapter].T scaling = self.scaling[active_adapter] # getting the sub-batch, passing it to LoRA layers and updating the corresponding indices of the linear # layer output sub_batch = x[sub_batch_indices_list[i]] after_A = self._embed(sub_batch, embedding_A) result[sub_batch_indices_list[i]] += (after_A @ embedding_B) * scaling return result def _embed(self, input: torch.Tensor, weight: torch.Tensor) -> torch.Tensor: """ Embed the inputs using self.base_layer and the given LoRA weight. Args: input: The inputs to embed, of shape [batch_size, seq_len]. weight: The LoRA weight to use. Returns: The output embedding, of shape [batch_size, seq_len, feature_dim]. """ base_layer = self.get_base_layer() return F.embedding( input, weight, padding_idx=base_layer.padding_idx, max_norm=base_layer.max_norm, norm_type=base_layer.norm_type, scale_grad_by_freq=base_layer.scale_grad_by_freq, sparse=base_layer.sparse, ) def forward( self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any] ) -> torch.Tensor: """ Run a forward pass with the active adapters. Args: x: The input of shape [batch_size, seq_len]. args: Forward pass args. kwargs: Forward pass kwargs. Returns: The output of shape [batch_size, seq_len, feature_dim]. """ self._check_forward_args(x, *args, **kwargs) adapter_names = kwargs.pop("adapter_names", None) if self.disable_adapters: if self.merged: self.unmerge() result = self.base_layer(x, *args, **kwargs) elif adapter_names is not None: result = self._mixed_batch_forward( x, *args, adapter_names=adapter_names, **kwargs ) elif self.merged: result = self.base_layer(x, *args, **kwargs) else: result = self.base_layer(x, *args, **kwargs) torch_result_dtype = result.dtype for active_adapter in self.active_adapters: if active_adapter not in self.lora_embedding_A: continue embedding_A = self.lora_embedding_A[active_adapter].T embedding_B = self.lora_embedding_B[active_adapter].T scaling = self.scaling[active_adapter] after_A = self._embed(x, embedding_A) result = result + (after_A @ embedding_B) * scaling result = result.to(torch_result_dtype) return result def __repr__(self) -> str: """ Get a string representation of the layer. Returns: A string representation of the layer. """ rep = super().__repr__() return "lora." + rep @dataclass class LoRAParams: """ The LoRA parameters used to construct a layer. Args: adapter_name: The name of the adapter. Needed since BaseFineTune supports using multiple adapters at once. r: The LoRA rank. lora_alpha: The LoRA alpha parameter. lora_dropout: The LoRA dropout parameter. init_lora_weights: Whether to initialize LoRA weights. use_rslora: Whether to use RS Lora. use_dora: Whether to use DoRA. """ adapter_name: str r: int lora_alpha: int lora_dropout: float init_lora_weights: Union[bool, str] use_rslora: bool use_dora: bool @classmethod def from_json(cls, config: Dict[str, Any]) -> LayerConfig: """ Build a LoRAParams from a dictionary. Args: config: The dictionary. Returns: The LayerConfig. """ return LoRAParams(**config) def to_json(self) -> Dict[str, Any]: """ Convert the LoRAParams to a dictionary. Returns: The dictionary. """ return asdict(self) @dataclass class LayerConfig: """ A configuration that gives which layers to apply a LoRAParams config to. Args: regex: A regex specifying which modules the LoRAParams apply to. Every matching layer will be wrapped with LoRA. module_type: The type of LoRA module. params: The LoRAParams specifying the LoRA configuration. """ regex: str module_type: str params: LoRAParams @classmethod def from_json(cls, config: Dict[str, Any]) -> LayerConfig: """ Build a LayerConfig from a dictionary. Args: config: The dictionary. Returns: The LayerConfig. """ return LayerConfig( config["regex"], config["module_type"], LoRAParams.from_json(config["params"]), ) @dataclass class LoRAConfig: """ A configuration of LoRA parameters for a model. Args: layer_configs: A list of LayerConfigs that specify where to apply LoRA parameters for a model. """ layer_configs: List[LayerConfig] @classmethod def from_json(cls, config: Dict[str, Any]) -> LoRAConfig: """ Build a LayerConfig from a dictionary. Args: config: The dictionary. Returns: The LayerConfig. """ layer_configs = [] for elem in config: layer_configs.append(LayerConfig.from_json(elem)) return LoRAConfig(layer_configs) def make_lora_layer(module: nn.Module, layer_config: LoRAConfig) -> LoraLayer: """ Create a LoRA layer that wraps @module using the given @layer_config. Args: module: The module to wrap. layer_config: The LoRA layer config. Returns: The LoRA layer. """ return {"embedding": Embedding, "linear": Linear}[layer_config.module_type]( module, **layer_config.params.to_json() ) def get_module_to_parents( model: nn.Module, ) -> Dict[nn.Module, List[Tuple[str, nn.Module]]]: """ Get a dictionary mapping a module to all of its parents. Note that a module can have multiple parents, e.g. if a layer is shared. Args: model: The model for which to build the mapping. Returns: A dictionary containing: { child_module: [("name_of_parent_1", parent1), ...] } """ ret = {module: [] for module in model.modules()} for parent in model.modules(): for child_name, child in parent.named_children(): ret[child].append([parent, child_name]) return ret def add_lora_layers(model: nn.Module, lora_config: Dict[str, Any]) -> None: """ Add LoRA layers to the given @model using the given @lora_config. Args: model: The model to add LoRA parameters to. lora_config: The configuration specifying where to add LoRA parameters. """ lora_config = LoRAConfig.from_json(lora_config) # Create a graph pointing from each module to its parents. # Each module can have multiple parents (e.g. in the case of # a shared layer). module_to_parents = get_module_to_parents(model) replaced_layers = set() module_remapping = {} for name, module in model.named_modules(remove_duplicate=False): for layer_config in lora_config.layer_configs: if re.match(layer_config.regex, name): if name in replaced_layers: # We do not allow @name to match multiple different regexes. It leads to ambiguity # in which LoRAConfig should be used. raise ValueError( f"Layer {name} matched multiple regexes. Invalid lora_config:\n{lora_config}." ) replaced_layers.add(name) if module in module_remapping: # This can happen even if the check above (making sure @name wasn't already in @replaced_layers) # succeeds. This is because a module can have multiple names (e.g. if it is shared between two layers), # which means it can match multiple different regexes without the @name having already been encountered. raise ValueError( f"Module with name {name} has already been converted to LoRA, and would be again." ) module_remapping[module] = make_lora_layer(module, layer_config) for module, new_module in module_remapping.items(): for parent, child_name in module_to_parents[module]: setattr(parent, child_name, new_module) ================================================ FILE: corenet/third_party/modeling/ssd_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Optional, Tuple import torch from torch import Tensor """ This source code in this file is adapted from following repos, both of which are released under MIT license. Repository Link: https://github.com/sacmehta/EdgeNets https://github.com/qfgaohao/pytorch-ssd File Link: https://github.com/sacmehta/EdgeNets/blob/master/model/detection/match_priors.py """ def assign_priors( gt_boxes: Tensor, gt_labels: Tensor, corner_form_priors: Tensor, iou_threshold: float, background_id: Optional[int] = 0, *args, **kwargs ) -> Tuple[Tensor, Tensor]: """ Assign ground truth boxes and targets to priors (or anchors) Args: gt_boxes (Tensor): Ground-truth boxes tensor of shape (num_targets, 4) gt_labels (Tensor): Ground-truth labels of shape (num_targets) corner_form_priors (Tensor): Priors in corner form and has shape (num_priors, 4) iou_threshold (float): Overlap between priors and gt_boxes. background_id (int): Background class index. Default: 0 Returns: boxes (Tensor): Boxes mapped to priors and has shape (num_priors, 4) labels (Tensor): Labels for mapped boxes and has shape (num_priors) """ if gt_labels.nelement() == 0: # Images may not have any labels dev = corner_form_priors.device gt_boxes = torch.zeros((1, 4), dtype=torch.float32, device=dev) gt_labels = torch.zeros(1, dtype=torch.int64, device=dev) ious = box_iou(gt_boxes.unsqueeze(0), corner_form_priors.unsqueeze(1)) # size: num_priors best_target_per_prior, best_target_per_prior_index = ious.max(1) # size: num_targets best_prior_per_target, best_prior_per_target_index = ious.max(0) for target_index, prior_index in enumerate(best_prior_per_target_index): best_target_per_prior_index[prior_index] = target_index # 2.0 is used to make sure every target has a prior assigned best_target_per_prior.index_fill_(0, best_prior_per_target_index, 2) # size: num_priors labels = gt_labels[best_target_per_prior_index] labels[best_target_per_prior < iou_threshold] = background_id boxes = gt_boxes[best_target_per_prior_index] return boxes, labels def box_iou( boxes0: Tensor, boxes1: Tensor, eps: Optional[float] = 1e-5, *args, **kwargs ) -> Tensor: """ Computes intersection-over-union between two boxes Args: boxes0 (Tensor): Boxes 0 of shape (N, 4) boxes1 (Tensor): Boxes 1 of shape (N or 1, 4) eps (Optional[float]): A small value is added to denominator for numerical stability Returns: iou (Tensor): IoU values between boxes0 and boxes1 and has shape (N) """ def area_of(left_top, right_bottom) -> torch.Tensor: """ Given two corners of the rectangle, compute the area Args: left_top (N, 2): left top corner. right_bottom (N, 2): right bottom corner. Returns: area (N): return the area. """ hw = torch.clamp(right_bottom - left_top, min=0.0) return hw[..., 0] * hw[..., 1] overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2]) overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:]) overlap_area = area_of(overlap_left_top, overlap_right_bottom) area0 = area_of(boxes0[..., :2], boxes0[..., 2:]) area1 = area_of(boxes1[..., :2], boxes1[..., 2:]) return overlap_area / (area0 + area1 - overlap_area + eps) def hard_negative_mining( loss: Tensor, labels: Tensor, neg_pos_ratio: int, *args, **kwargs ) -> Tensor: """ This function is used to suppress the presence of a large number of negative predictions. For any example/image, it keeps all the positive predictions and cut the number of negative predictions to make sure the ratio between the negative examples and positive examples is no more than the given ratio for an image. Args: loss (Tensor): the loss for each example and has shape (N, num_priors). labels (Tensor): the labels and has shape (N, num_priors). neg_pos_ratio (int): the ratio between the negative examples and positive examples. Usually, it is set as 3. """ pos_mask = labels > 0 num_pos = pos_mask.long().sum(dim=1, keepdim=True) num_neg = num_pos * neg_pos_ratio loss[pos_mask] = -math.inf _, indexes = loss.sort(dim=1, descending=True) _, orders = indexes.sort(dim=1) neg_mask = orders < num_neg return pos_mask | neg_mask ================================================ FILE: corenet/train_eval_pipelines/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.train_eval_pipelines.base import ( TRAIN_EVAL_PIPELINE_REGISTRY, BaseTrainEvalPipeline, ) from corenet.train_eval_pipelines.default_train_eval import DefaultTrainEvalPipeline ================================================ FILE: corenet/train_eval_pipelines/base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Callable from corenet.engine.default_trainer import DefaultTrainer from corenet.engine.evaluation_engine import Evaluator from corenet.utils.registry import Registry def Callback(Protocol): def __call__(self, train_eval_pipeline: BaseTrainEvalPipeline) -> Any: ... class BaseTrainEvalPipeline: def __init__( self, opts: argparse.Namespace, ) -> None: """TrainEvalPipeline class is responsible for instantiating the components of training, evaluation, and/or pipelines that use those common components. The consumers of this class should be able to get an instance of any component by accessing the corresponding property. Example usage: >>> cfg = get_training_arguments() >>> pipeline = TrainEvalPipeline(cfg) >>> dataset, model = pipeline.dataset, pipeline.model Args: opts: Commandline options. """ self.opts = opts def __init_subclass__(cls) -> None: for attr in dir(cls): if attr.startswith("_"): continue if isinstance(getattr(cls, attr), Callable): raise TypeError( f"TrainEvalPipelines should only have [cached] properties." f"'{cls}.{attr}' should not be a Callable. However, you can have a" f"property/cached_property that returns a Callable. Also, you can" f"have private methods that are named with '_' prefix." ) def __getstate__(self) -> argparse.Namespace: return self.opts def __setstate__(self, opts: argparse.Namespace) -> None: self.opts = opts @property def evaluation_engine(self) -> Evaluator: """Creates the Evaluator instance that is used by main_eval.py""" raise NotImplementedError() @property def training_engine(self) -> DefaultTrainer: """Creates the Trainer instance that is used by corenet/cli/main_train.py""" raise NotImplementedError() @property def launcher(self) -> Callable[[Callback], None]: """Creates the entrypoints that spawn training and evaluation subprocesses.""" raise NotImplementedError() TRAIN_EVAL_PIPELINE_REGISTRY = Registry( registry_name="train_eval_pipeline", base_class=BaseTrainEvalPipeline, lazy_load_dirs=["corenet/train_eval_pipelines"], internal_dirs=["corenet/internal", "corenet/internal/projects/*"], ) ================================================ FILE: corenet/train_eval_pipelines/default_train_eval.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from __future__ import annotations import math from functools import cached_property from typing import Callable, Optional, Tuple import torch from torch.cuda.amp import GradScaler from corenet.constants import ( DEFAULT_EPOCHS, DEFAULT_ITERATIONS, DEFAULT_MAX_EPOCHS, DEFAULT_MAX_ITERATIONS, ) from corenet.data.data_loaders import create_test_loader, create_train_val_loader from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.sampler.base_sampler import BaseSampler from corenet.engine.default_trainer import DefaultTrainer from corenet.engine.evaluation_engine import Evaluator from corenet.loss_fn import build_loss_fn from corenet.loss_fn.base_criteria import BaseCriteria from corenet.modeling import get_model from corenet.modeling.misc.averaging_utils import EMA from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.optims import build_optimizer from corenet.optims.base_optim import BaseOptim from corenet.optims.scheduler import build_scheduler from corenet.optims.scheduler.base_scheduler import BaseLRScheduler from corenet.train_eval_pipelines.base import ( TRAIN_EVAL_PIPELINE_REGISTRY, BaseTrainEvalPipeline, Callback, ) from corenet.utils import logger, resources from corenet.utils.activation_checkpointing_wrapper import activation_checkpointing from corenet.utils.checkpoint_utils import load_checkpoint, load_model_state from corenet.utils.common_utils import create_directories, device_setup from corenet.utils.ddp_utils import distributed_init, is_master @TRAIN_EVAL_PIPELINE_REGISTRY.register("default") class DefaultTrainEvalPipeline(BaseTrainEvalPipeline): """TrainEvalPipeline class is responsible for instantiating the components of training, evaluation, and/or pipelines that use those common components. The consumers of this class should be able to get an instance of any component by accessing the corresponding property. Example usage: >>> cfg = get_training_arguments() >>> pipeline = TrainEvalPipeline(cfg) >>> dataset, model = pipeline.dataset, pipeline.model Args: opts: Commandline options. """ @cached_property def is_master_node(self) -> bool: """ Returns True iff ddp rank is 0. """ opts = self.opts node_rank = getattr(opts, "ddp.rank") if node_rank < 0: logger.error("--ddp.rank should be >=0. Got {}".format(node_rank)) return is_master(opts) @cached_property def device(self) -> torch.device: return getattr(self.opts, "dev.device", torch.device("cpu")) @cached_property def _train_val_loader_sampler( self, ) -> Tuple[CoreNetDataLoader, CoreNetDataLoader, BaseSampler]: """ Returns (train_loader, val_loader, train_sampler) tuple. """ opts = self.opts return create_train_val_loader(opts) @cached_property def train_val_loader(self) -> Tuple[CoreNetDataLoader, CoreNetDataLoader]: """ Returns (train_loader, val_loader) tuple. """ train_loader, val_loader, _ = self._train_val_loader_sampler return train_loader, val_loader @cached_property def train_sampler(self) -> BaseSampler: """ Returns training sampler. """ _, _, train_sampler = self._train_val_loader_sampler return train_sampler @cached_property def test_loader(self) -> CoreNetDataLoader: opts = self.opts return create_test_loader(opts) @cached_property def scheduler(self) -> BaseLRScheduler: opts = self.opts is_master_node = self.is_master_node is_iteration_based = getattr(opts, "scheduler.is_iteration_based") if is_iteration_based: max_iter = getattr(opts, "scheduler.max_iterations") if max_iter is None or max_iter <= 0: logger.log("Setting max. iterations to {}".format(DEFAULT_ITERATIONS)) setattr(opts, "scheduler.max_iterations", DEFAULT_ITERATIONS) max_iter = DEFAULT_ITERATIONS setattr(opts, "scheduler.max_epochs", DEFAULT_MAX_EPOCHS) if is_master_node: logger.log("Max. iteration for training: {}".format(max_iter)) else: max_epochs = getattr(opts, "scheduler.max_epochs") if max_epochs is None or max_epochs <= 0: logger.log("Setting max. epochs to {}".format(DEFAULT_EPOCHS)) setattr(opts, "scheduler.max_epochs", DEFAULT_EPOCHS) setattr(opts, "scheduler.max_iterations", DEFAULT_MAX_ITERATIONS) max_epochs = getattr(opts, "scheduler.max_epochs") if is_master_node: logger.log("Max. epochs for training: {}".format(max_epochs)) scheduler = build_scheduler(opts=opts) if is_master_node: logger.log(logger.color_text("Learning rate scheduler")) print(scheduler) return scheduler def _prepare_model(self) -> Tuple[BaseAnyNNModel, Optional[torch.nn.Module]]: """ Returns a model optionally with a module whose activation needs to be checkpointed. """ # set-up the model model = get_model(self.opts) # print model information on master node if self.is_master_node: model.info() submodule_class_to_checkpoint = None if getattr(self.opts, "model.activation_checkpointing"): try: submodule_class_to_checkpoint = ( model.get_activation_checkpoint_submodule_class() ) except NotImplementedError: logger.error( f"Activation checkpoint module is not implemented for {model.__class__.__name__}. \ Please implement 'get_activation_checkpoint_submodule_class' method." ) # memory format memory_format = ( torch.channels_last if getattr(self.opts, "common.channels_last") else torch.contiguous_format ) model = model.to(device=self.device, memory_format=memory_format) return model, submodule_class_to_checkpoint @cached_property def model(self) -> torch.nn.Module: """ Returns a model to be used by train and eval pipelines, given the selected yaml configs. """ opts = self.opts is_master_node = self.is_master_node device = self.device dev_id = getattr(opts, "dev.device_id", None) use_distributed = getattr(opts, "ddp.use_distributed") model, wrapper_cls_for_act_ckpt = self._prepare_model() if getattr(opts, "ddp.use_deprecated_data_parallel"): logger.warning( "DataParallel is not recommended for training, and is not tested exhaustively. \ Please use it only for debugging purposes. We will deprecated the support for DataParallel in future and \ encourage you to use DistributedDataParallel." ) model = model.to(device=torch.device("cpu")) model = torch.nn.DataParallel(model) model = model.to(device=device) elif use_distributed: model = torch.nn.parallel.DistributedDataParallel( model, device_ids=[dev_id], output_device=dev_id, find_unused_parameters=getattr(opts, "ddp.find_unused_params"), ) if is_master_node: logger.log("Using DistributedDataParallel.") if wrapper_cls_for_act_ckpt is not None: activation_checkpointing( model=model, submodule_class=wrapper_cls_for_act_ckpt ) return model @cached_property def criteria(self) -> BaseCriteria: opts = self.opts device = self.device is_master_node = self.is_master_node criteria = build_loss_fn(opts) if is_master_node: logger.log(logger.color_text("Loss function")) print(criteria) criteria = criteria.to(device=device) return criteria @cached_property def optimizer(self) -> BaseOptim: opts = self.opts model = self.model is_master_node = self.is_master_node optimizer = build_optimizer(model, opts=opts) if is_master_node: logger.log(logger.color_text("Optimizer")) print(optimizer) return optimizer @cached_property def gradient_scaler(self) -> GradScaler: opts = self.opts enable_grad_scaler = ( getattr(opts, "common.mixed_precision") and getattr(opts, "common.mixed_precision_dtype") == "float16" ) return GradScaler(enabled=enable_grad_scaler) @cached_property def launcher(self) -> Callable[[Callback], None]: """ Creates the entrypoints that spawn training and evaluation subprocesses. The number of subprocesses depend on the number of gpus and distributed nodes. Returns a function that once called, spawns as many subprocesses as needed for training or evaluation. The returned function accepts a Callback as an argument. The Callback will be invoked on each subprocess. """ opts = self.opts opts = device_setup(opts) is_master_node = self.is_master_node # create the directory for saving results save_dir = getattr(opts, "common.results_loc") run_label = getattr(opts, "common.run_label") exp_dir = "{}/{}".format(save_dir, run_label) setattr(opts, "common.exp_loc", exp_dir) create_directories(dir_path=exp_dir, is_master_node=is_master_node) num_gpus = getattr(opts, "dev.num_gpus") use_deprecated_data_parallel = getattr(opts, "ddp.use_deprecated_data_parallel") use_distributed = num_gpus >= 1 and not use_deprecated_data_parallel setattr(opts, "ddp.use_distributed", use_distributed) if num_gpus > 0: assert torch.cuda.is_available(), "We need CUDA for training on GPUs." # No of data workers = no of CPUs (if not specified or -1) n_cpus = resources.cpu_count() dataset_workers = getattr(opts, "dataset.workers") num_gpus_ge_1 = max(1, num_gpus) if not use_distributed: if dataset_workers == -1: logger.log(f"Setting dataset.workers to {n_cpus}.") setattr(opts, "dataset.workers", n_cpus) # adjust the batch size train_bsize = getattr(opts, "dataset.train_batch_size0") * num_gpus_ge_1 val_bsize = getattr(opts, "dataset.val_batch_size0") * num_gpus_ge_1 setattr(opts, "dataset.train_batch_size0", train_bsize) setattr(opts, "dataset.val_batch_size0", val_bsize) setattr(opts, "dev.device_id", None) return lambda callback: callback(self) else: # DDP is the default for training # get device id dev_id = getattr(opts, "ddp.device_id") # set the dev.device_id to the same as ddp.device_id. # note that dev arguments are not accessible through CLI. setattr(opts, "dev.device_id", dev_id) if dataset_workers == -1 or dataset_workers is None: logger.log(f"Setting dataset.workers to {n_cpus // num_gpus_ge_1}.") setattr(opts, "dataset.workers", n_cpus // num_gpus_ge_1) start_rank = getattr(opts, "ddp.rank") # we need to set rank to None as it is reset inside the _launcher_distributed_spawn_fn function setattr(opts, "ddp.rank", None) setattr(opts, "ddp.start_rank", start_rank) return lambda callback: torch.multiprocessing.spawn( fn=self._launcher_distributed_spawn_fn, args=(callback, self), nprocs=num_gpus_ge_1, ) @cached_property def model_ema(self) -> Optional[EMA]: opts = self.opts device = self.device model = self.model is_master_node = self.is_master_node model_ema = None use_ema = getattr(opts, "ema.enable") if use_ema: ema_momentum = getattr(opts, "ema.momentum") model_ema = EMA(model=model, ema_momentum=ema_momentum, device=device) if is_master_node: logger.log("Using EMA") return model_ema @cached_property def training_engine(self) -> DefaultTrainer: opts = self.opts is_master_node = self.is_master_node train_loader, val_loader = self.train_val_loader model = self.model criteria = self.criteria optimizer = self.optimizer gradient_scaler = self.gradient_scaler scheduler = self.scheduler model_ema = self.model_ema best_metric = ( -math.inf if getattr(opts, "stats.checkpoint_metric_max") else math.inf ) start_epoch = 0 start_iteration = 0 resume_loc = getattr(opts, "common.resume") finetune_loc = getattr(opts, "common.finetune") auto_resume = getattr(opts, "common.auto_resume") if resume_loc is not None or auto_resume: ( model, optimizer, gradient_scaler, start_epoch, start_iteration, best_metric, model_ema, ) = load_checkpoint( opts=opts, model=model, optimizer=optimizer, model_ema=model_ema, gradient_scaler=gradient_scaler, ) elif finetune_loc is not None: model, model_ema = load_model_state( opts=opts, model=model, model_ema=model_ema ) if is_master_node: logger.log("Finetuning model from checkpoint {}".format(finetune_loc)) training_engine = DefaultTrainer( opts=opts, model=model, validation_loader=val_loader, training_loader=train_loader, optimizer=optimizer, criteria=criteria, scheduler=scheduler, start_epoch=start_epoch, start_iteration=start_iteration, best_metric=best_metric, model_ema=model_ema, gradient_scaler=gradient_scaler, ) return training_engine @cached_property def evaluation_engine(self) -> Evaluator: opts = self.opts test_loader = self.test_loader model = self.model criteria = self.criteria return Evaluator( opts=opts, model=model, test_loader=test_loader, criteria=criteria ) @staticmethod def _launcher_distributed_spawn_fn( device_id: int, callback: Callback, train_eval_pipeline: DefaultTrainEvalPipeline, ) -> None: """ Wraps a callback function for `torch.multiprocessing.spawn` to spawn DDP workers. The rank information will be set in `opts` before the wrapped callback is invoked. Args: device_id: GPU device number. callback: The wrapped callback function to be invoked after the rank information are set in `opts`. train_eval_pipeline: The instance of TrainEvalPipeline that will be passed as the only input argument to `callback`. """ opts = train_eval_pipeline.opts setattr(opts, "dev.device_id", device_id) torch.cuda.set_device(device_id) setattr(opts, "dev.device", torch.device(f"cuda:{device_id}")) ddp_rank = getattr(opts, "ddp.rank", None) if ddp_rank is None: ddp_rank = getattr(opts, "ddp.start_rank", 0) + device_id setattr(opts, "ddp.rank", ddp_rank) node_rank = distributed_init(opts) setattr(opts, "ddp.rank", node_rank) callback(train_eval_pipeline) ================================================ FILE: corenet/train_eval_pipelines/fsdp_train_eval.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from __future__ import annotations import math from functools import cached_property import torch from torch.cuda.amp import GradScaler from corenet.engine.fsdp_trainer import FSDPTrainer from corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper from corenet.train_eval_pipelines.default_train_eval import ( TRAIN_EVAL_PIPELINE_REGISTRY, DefaultTrainEvalPipeline, ) from corenet.utils import logger from corenet.utils.activation_checkpointing_wrapper import activation_checkpointing from corenet.utils.checkpoint_utils import load_checkpoint, load_model_state @TRAIN_EVAL_PIPELINE_REGISTRY.register("fsdp_train_eval_pipeline") class FSDPTrainEvalPipeline(DefaultTrainEvalPipeline): """FSDPTrainEvalPipeline class is responsible for instantiating the components of training, evaluation, and/or pipelines that use FSDP. Args: opts: Commandline options. """ @cached_property def gradient_scaler(self) -> GradScaler: raise NotImplementedError( "FSDP does not use autocast for mixed-precision training and handles it internally." ) @cached_property def model(self) -> torch.nn.Module: opts = self.opts use_distributed = getattr(opts, "ddp.use_distributed") assert use_distributed, "DDP needs to be enabled when using FSDP" model, wrapper_cls_for_act_ckpt = self._prepare_model() fsdp_model = FullyShardedDataParallelWrapper(opts=self.opts, model=model) if wrapper_cls_for_act_ckpt is not None: activation_checkpointing( model=fsdp_model, submodule_class=wrapper_cls_for_act_ckpt ) return fsdp_model @cached_property def training_engine(self) -> FSDPTrainer: opts = self.opts is_master_node = self.is_master_node train_loader, val_loader = self.train_val_loader model = self.model criteria = self.criteria optimizer = self.optimizer scheduler = self.scheduler model_ema = self.model_ema best_metric = ( -math.inf if getattr(opts, "stats.checkpoint_metric_max") else math.inf ) start_epoch = 0 start_iteration = 0 resume_loc = getattr(opts, "common.resume") finetune_loc = getattr(opts, "common.finetune") auto_resume = getattr(opts, "common.auto_resume") if resume_loc is not None or auto_resume: ( model, optimizer, gradient_scaler, start_epoch, start_iteration, best_metric, model_ema, ) = load_checkpoint( opts=opts, model=model, optimizer=optimizer, model_ema=model_ema, ) elif finetune_loc is not None: model, model_ema = load_model_state( opts=opts, model=model, model_ema=model_ema ) if is_master_node: logger.log("Finetuning model from checkpoint {}".format(finetune_loc)) training_engine = FSDPTrainer( opts=opts, model=model, validation_loader=val_loader, training_loader=train_loader, optimizer=optimizer, criteria=criteria, scheduler=scheduler, start_epoch=start_epoch, start_iteration=start_iteration, best_metric=best_metric, model_ema=model_ema, ) return training_engine ================================================ FILE: corenet/utils/__init__.py ================================================ ================================================ FILE: corenet/utils/activation_checkpointing_wrapper.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from functools import partial from typing import Callable, List, Union import torch def activation_checkpointing( model: torch.nn.Module, submodule_class: Union[List[Callable], Callable], ) -> None: """ Applies activation checkpointing to `module_to_checkpoint`, a sub-module(s) inside 'model'. Args: model: The model whose submodules should be wrapped with activation checkpointing. submodule_class: Submodule class to be wrapped with activation checkpointing. Usage:: model = nn.Sequential( nn.Linear(10, 10), nn.Linear(10, 10), nn.Linear(10, 10) ) module_to_checkpoint = nn.Linear # checkpoint activations activation_checkpointing(model, module_to_checkpoint) """ from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import ( CheckpointImpl, apply_activation_checkpointing, checkpoint_wrapper, ) non_reentrant_wrapper = partial( checkpoint_wrapper, checkpoint_impl=CheckpointImpl.NO_REENTRANT, ) if isinstance(submodule_class, list): for m in submodule_class: check_fn = lambda submodule: isinstance(submodule, m) apply_activation_checkpointing( model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn ) else: check_fn = lambda submodule: isinstance(submodule, submodule_class) apply_activation_checkpointing( model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn ) ================================================ FILE: corenet/utils/check.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import inspect import sys import types from typing import Any, Union def check( value: Any, on_failure: Union[str, Exception, types.FunctionType] = "Check failed" ) -> Any: """ Checks if value is truthy and raises an exception if not. This is a replacement for assert, with the following advantages: - Cannot be disabled by the -O flag - Can raise any exception type - Returns the checked value for concise code on_failure can be: - A string, in which case a AssertionError is raised with that message. - A constructed exception to be raised. - A lambda returning any of the above, so that the message/exception doesn't need to be constructed if the check succeeds. If the lambda takes an argument it will be the value. """ if value: return value if isinstance(on_failure, types.FunctionType): nparams = len(inspect.signature(on_failure).parameters) if nparams == 0: on_failure = on_failure() elif nparams == 1: on_failure = on_failure(value) else: raise ValueError("Expect at most 1 element lambda") if not isinstance(on_failure, Exception): on_failure = AssertionError(str(on_failure)) # This used to pop the call stack from the exception traceback, # so that it would appear to come from the check() call itself, # but that seems to no longer work in python3.10 check_failed = on_failure raise check_failed ================================================ FILE: corenet/utils/checkpoint_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import glob import math import os from typing import Any, Dict, List, Optional, Tuple, Union import torch from corenet.modeling import EMA from corenet.modeling.models.fsdp_wrapper import ( FullyShardedDataParallelWrapper, get_fsdp_model_optimizer_state_dict_on_rank0, ) from corenet.optims import BaseOptim from corenet.utils import logger from corenet.utils.common_utils import unwrap_model_fn from corenet.utils.ddp_utils import is_master from corenet.utils.download_utils import get_local_path CHECKPOINT_EXTN = "pt" def get_model_optimizer_state_dict( model: torch.nn.Module, optimizer: BaseOptim ) -> Tuple[Dict[str, Any], Dict[str, Any]]: """Returns `state_dict` of a given model and optimizer. Args: model: A torch model (it can be also a wrapped model, e.g., with DDP). optimizer: An instance of BaseOptim. Returns: `state_dict` of the model and optimizer. If model is an EMA instance, the `state_dict` corresponding to EMA parameters is returned. """ if isinstance(model, FullyShardedDataParallelWrapper): return get_fsdp_model_optimizer_state_dict_on_rank0( model=model, optimizer=optimizer ) if isinstance(model, EMA): return get_model_optimizer_state_dict(model.ema_model, optimizer) else: unwrapped_model = unwrap_model_fn(model) return unwrapped_model.state_dict(), optimizer.state_dict() def load_state_dict( model: torch.nn.Module, state_dict: Dict, strict: bool = True ) -> torch.nn.Module: """Load the given `state_dict` into the model. Args: model: A torch model (it can be also a wrapped model, e.g., with DDP). state_dict: A state dict dictionary to load model parameters from. strict: whether to strictly enforce that the keys in `state_dict` match the keys returned by this module's `state_dict` function. Default: ``True``. Returns: model loaded with parameters from the given state_dict """ if hasattr(model, "module"): model.module.load_state_dict(state_dict, strict=strict) else: model.load_state_dict(state_dict, strict=strict) return model def average_ckpts(ckpt_loc_list: List[str]) -> Dict[str, Any]: """Compute averaged parameters from a list of checkpoints. Args: ckpt_loc_list: List of paths to model checkpoints to be averaged. Returns: `state_dict` corresponding to the averaged parameters. """ avg_state_dict = dict() key_count = dict() key_dtype = dict() for c in ckpt_loc_list: if not os.path.isfile(c): pass ckpt_state_dict = torch.load(c, map_location="cpu") for k, v in ckpt_state_dict.items(): if k not in avg_state_dict: key_dtype[k] = v.dtype avg_state_dict[k] = v.clone().to(dtype=torch.float64) key_count[k] = 1.0 else: avg_state_dict[k] += v.to(dtype=torch.float64) key_count[k] += 1.0 for k, v in avg_state_dict.items(): avg_state_dict[k] = v.div(key_count[k]).to(dtype=key_dtype[k]) return avg_state_dict def avg_and_save_k_checkpoints( model_state: Dict, best_metric: float, k_best_checkpoints: int, max_ckpt_metric: bool, ckpt_str: str, ) -> None: """Save top-k checkpoints and their average. Args: model_state: `state_dict` containing model parameters. best_metric: Best observed value of the tracking validation metric. For example, best top-1 validation accuracy that is observed until the current iteration. k_best_checkpoints: An integer k determining number of top (based on validation metric) checkpoints to keep. If `k_best_checkpoints` is smaller than 1, only best checkpoint is stored. max_ckpt_metric: A boolean demonstrating whether the tracking validation metric is higher the better, or lower the better. ckpt_str: String determining path prefix for checkpoints to be saved. """ try: ckpt_fname = "{}_score_{:.4f}.{}".format(ckpt_str, best_metric, CHECKPOINT_EXTN) torch.save(model_state, ckpt_fname) best_fnames = glob.glob("{}_score_*".format(ckpt_str)) best_scores = [ float(f.split("_score_")[-1].replace(".{}".format(CHECKPOINT_EXTN), "")) for f in best_fnames ] best_scores_keep = [] if len(best_scores) > k_best_checkpoints: best_scores = sorted(best_scores) if not max_ckpt_metric: best_scores = best_scores[::-1] best_scores_keep = best_scores[-k_best_checkpoints:] for k in best_scores: if k in best_scores_keep: continue rm_ckpt = "{}_score_{:.4f}.{}".format(ckpt_str, k, CHECKPOINT_EXTN) os.remove(rm_ckpt) logger.log("Deleting checkpoint: {}".format(rm_ckpt)) if len(best_scores_keep) > 1: avg_fnames = [ "{}_score_{:.4f}.{}".format(ckpt_str, k, CHECKPOINT_EXTN) for k in best_scores_keep ] logger.log( "Averaging checkpoints: {}".format( [f.split("/")[-1] for f in avg_fnames] ) ) # save the average model avg_model_state = average_ckpts(ckpt_loc_list=avg_fnames) if avg_model_state: ckpt_fname = "{}_avg.{}".format(ckpt_str, CHECKPOINT_EXTN) torch.save(avg_model_state, ckpt_fname) logger.log("Averaged checkpoint saved at: {}".format(ckpt_fname)) except Exception as e: logger.log(f"Error while averaging {k_best_checkpoints}-best checkpoints.") print(e) def get_training_state( iterations: int, epoch: int, model: torch.nn.Module, optimizer: Union[BaseOptim, torch.optim.Optimizer], best_metric: float, gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None, model_ema: Optional[torch.nn.Module] = None, is_interval_ckpt: bool = False, ) -> Dict: """Create a checkpoint dictionary that includes all required states to resume the training from its current state. Args: iterations: An integer denoting training iteration number. Each iteration corresponds to forward-backward passes on a batch with all GPUs. epoch: An integer denoting epoch number. model: The model being trained. optimizer: Optimizer object, which possibly store training optimization state variables. best_metric: Best observed value of the tracking validation metric. For example, best top-1 validation accuracy that is observed until the current iteration. gradient_scaler: Optional `GradScaler` object storing required automatic mixed precision state. model_ema: EMA model to be stored in the checkpoint. is_interval_ckpt: If True, the the checkpoint is saved in the middle; otherwise it as at the end of an epoch. Default to False. Returns: A dictionary that includes all required states to resume the training from its current state. """ model_state, optim_state = get_model_optimizer_state_dict( model, optimizer=optimizer ) training_state = { "iterations": iterations, "epoch": epoch, "model_state_dict": model_state, "optim_state_dict": optim_state, "best_metric": best_metric, "is_interval_ckpt": is_interval_ckpt, } if gradient_scaler is not None: training_state["gradient_scaler_state_dict"] = gradient_scaler.state_dict() if model_ema is not None: model_state, _ = get_model_optimizer_state_dict(model_ema, optimizer=optimizer) training_state["ema_state_dict"] = model_state return training_state def save_checkpoint( iterations: int, epoch: int, model: torch.nn.Module, optimizer: Union[BaseOptim, torch.optim.Optimizer], best_metric: float, is_best: bool, save_dir: str, is_master_node: bool, gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None, model_ema: Optional[torch.nn.Module] = None, is_ema_best: bool = False, ema_best_metric: Optional[float] = None, max_ckpt_metric: bool = False, k_best_checkpoints: int = -1, save_all_checkpoints: bool = False, is_interval_ckpt: bool = False, *args, **kwargs, ) -> None: """Save checkpoints corresponding to the current state of the training. Args: iterations: An integer denoting training iteration number. Each iteration corresponds to forward-backward passes on a batch with all GPUs. epoch: An integer denoting epoch number. model: The model being trained. optimizer: Optimizer object, which possibly store training optimization state variables. best_metric: Best observed value of the tracking validation metric. For example, best top-1 validation accuracy that is observed until the current iteration. is_best: A boolean demonstrating whether the current model obtains the best validation metric compared to the previously saved checkpoints. save_dir: Path to a directory to save checkpoints. is_master_node: Master node (a.k.a. rank0) or node. gradient_scaler: Optional `GradScaler` object storing required automatic mixed precision state. model_ema: EMA model to be stored in the checkpoint. is_ema_best: A boolean demonstrating whether the current EMA model obtains the best validation metric compared to the previously saved checkpoints. ema_best_metric: Best observed value of the tracking validation metric by the EMA model. max_ckpt_metric: A boolean demonstrating whether the tracking validation metric is higher the better, or lowerer the better. k_best_checkpoints: An integer k determining number of top (based on validation metric) checkpoints to keep. If `k_best_checkpoints` is smaller than 1, only best checkpoint is stored. save_all_checkpoints: If True, will save model_state checkpoints (main model and its EMA) for all epochs. is_interval_ckpt: If True, the the checkpoint is saved in the middle; otherwise it as at the end of an epoch. Default to False. """ checkpoint = get_training_state( iterations, epoch, model, optimizer, best_metric, gradient_scaler, model_ema, is_interval_ckpt, ) if is_master_node: model_state = checkpoint.get("model_state_dict") ckpt_str = "{}/checkpoint".format(save_dir) epoch_iter_str = f"epoch_{epoch}_iter_{iterations}" if is_best: best_model_fname = "{}_best.{}".format(ckpt_str, CHECKPOINT_EXTN) if os.path.isfile(best_model_fname): os.remove(best_model_fname) torch.save(model_state, best_model_fname) logger.log( "Best checkpoint with score {:.2f} saved at {}".format( best_metric, best_model_fname ) ) if k_best_checkpoints > 1: avg_and_save_k_checkpoints( model_state, best_metric, k_best_checkpoints, max_ckpt_metric, ckpt_str, ) ckpt_fname = "{}/training_checkpoint_last.{}".format(save_dir, CHECKPOINT_EXTN) torch.save(checkpoint, ckpt_fname) logger.log(f"Last training checkpoint is saved at: {ckpt_fname}") ckpt_fname = "{}_last.{}".format(ckpt_str, CHECKPOINT_EXTN) torch.save(model_state, ckpt_fname) logger.log(f"Last checkpoint's model state is saved at: {ckpt_fname}") if save_all_checkpoints: ckpt_fname = ( f"{save_dir}/training_checkpoint_{epoch_iter_str}.{CHECKPOINT_EXTN}" ) torch.save(checkpoint, ckpt_fname) logger.log( f"Training checkpoint for epoch {epoch}/iteration {iterations} is saved at: {ckpt_fname}" ) ckpt_fname = f"{ckpt_str}_{epoch_iter_str}.{CHECKPOINT_EXTN}" torch.save(model_state, ckpt_fname) logger.log( f"Model state for epoch {epoch}/iteration {iterations} is saved at: {ckpt_fname}" ) # Save EMA model state and checkpoints. if model_ema is not None: ema_fname = "{}_ema_last.{}".format(ckpt_str, CHECKPOINT_EXTN) ema_model_state = checkpoint.get("ema_state_dict") torch.save(ema_model_state, ema_fname) logger.log(f"Last EMA model state is saved at: {ema_fname}") if is_ema_best: ema_best_fname = "{}_ema_best.{}".format(ckpt_str, CHECKPOINT_EXTN) if os.path.isfile(ema_best_fname): os.remove(ema_best_fname) torch.save(ema_model_state, ema_best_fname) logger.log( "Best EMA checkpoint with score {:.2f} is saved at {}".format( ema_best_metric, ema_best_fname ) ) if k_best_checkpoints > 1 and ema_best_metric is not None: avg_and_save_k_checkpoints( model_state=ema_model_state, best_metric=ema_best_metric, k_best_checkpoints=k_best_checkpoints, max_ckpt_metric=max_ckpt_metric, ckpt_str="{}_ema".format(ckpt_str), ) if save_all_checkpoints: ema_fname = f"{ckpt_str}_ema_{epoch_iter_str}.{CHECKPOINT_EXTN}" torch.save(ema_model_state, ema_fname) logger.log( f"EMA model state for epoch {epoch}/iteration {iterations} is saved at: {ema_fname}" ) def load_checkpoint( opts: argparse.Namespace, model: torch.nn.Module, optimizer: Union[BaseOptim, torch.optim.Optimizer], gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None, model_ema: Optional[torch.nn.Module] = None, ) -> Tuple[ torch.nn.Module, Union[BaseOptim, torch.optim.Optimizer], Optional[torch.cuda.amp.GradScaler], int, int, float, Optional[torch.nn.Module], ]: """Load a training checkpoint to resume training. Args: opts: Input arguments. model: The model to be loaded with `model_state_dict` from the checkpoint. optimizer: Optimizer object to be loaded with `optim_state_dict` from the checkpoint. gradient_scaler: An optional `GradScaler` object to be loaded with `gradient_scaler_state_dict` from the checkpoint. model_ema: (Optional) EMA model to be loaded with `ema_state_dict` from the checkpoint. Returns: Tuple of loaded objects and value: (model, optimizer, gradient_scaler, start_epoch, start_iteration, best_metric, model_ema) """ resume_loc = getattr(opts, "common.resume", None) dev_id = getattr(opts, "dev.device_id", None) device = getattr(opts, "dev.device", torch.device("cpu")) start_epoch = start_iteration = 0 best_metric = ( 0.0 if getattr(opts, "stats.checkpoint_metric_max", False) else math.inf ) auto_resume = getattr(opts, "common.auto_resume", False) exp_dir = getattr(opts, "common.exp_loc", None) is_master_node = is_master(opts) if resume_loc is None and auto_resume and exp_dir is not None: resume_loc = "{}/training_checkpoint_last.{}".format(exp_dir, CHECKPOINT_EXTN) resume_loc = get_local_path(opts, path=resume_loc) if resume_loc is not None and os.path.isfile(resume_loc): if dev_id is None: checkpoint = torch.load(resume_loc, map_location=device) else: checkpoint = torch.load(resume_loc, map_location="cuda:{}".format(dev_id)) is_interval_ckpt = ( checkpoint["is_interval_ckpt"] if "is_interval_ckpt" in checkpoint else False ) # There are two use cases of when we reload the checkpoint: # 1. Reload a checkpoint at the end of an epoch: this is usually the case when # we reload a checkpoint for finetuning or resume a training job from the # previous epoch. # 2. Reload a checkpoint in the middle of an epoch, this is the case when we # train a large language model, where the model is only trained for 1 epoch, # and an interval checkpoint is reloaded. start_epoch = ( checkpoint["epoch"] if is_interval_ckpt else checkpoint["epoch"] + 1 ) start_iteration = checkpoint["iterations"] + 1 best_metric = checkpoint["best_metric"] model = load_state_dict(model, checkpoint["model_state_dict"]) optimizer.load_state_dict(checkpoint["optim_state_dict"]) if gradient_scaler is not None: gradient_scaler.load_state_dict(checkpoint["gradient_scaler_state_dict"]) if model_ema is not None and "ema_state_dict" in checkpoint: model_ema.ema_model = load_state_dict( model_ema.ema_model, checkpoint["ema_state_dict"] ) if is_master_node: logger.log("Loaded checkpoint from {}".format(resume_loc)) logger.log("Resuming training for epoch {}".format(start_epoch)) else: if is_master_node: logger.log("No checkpoint found at '{}'".format(resume_loc)) return ( model, optimizer, gradient_scaler, start_epoch, start_iteration, best_metric, model_ema, ) def load_model_state( opts: argparse.Namespace, model: torch.nn.Module, model_ema: Optional[torch.nn.Module] = None, ) -> Tuple[torch.nn.Module, Optional[torch.nn.Module]]: """Load the model (and optionally the EMA model) for finetuning. Args: opts: Input arguments. model: The model to be loaded with checkpoint at `common.finetune`. model_ema: The EMA model to be loaded with checkpoint at `common.finetune_ema`. Returns: Tuple of loaded model and EMA model. The second returned value is None when model_ema is not passed. """ dev_id = getattr(opts, "dev.device_id", None) device = getattr(opts, "dev.device", torch.device("cpu")) finetune_loc = getattr(opts, "common.finetune", None) finetune_ema_loc = getattr(opts, "common.finetune_ema", None) def load_state(path): path = get_local_path(opts, path=path) if dev_id is None: model_state = torch.load(path, map_location=device) else: model_state = torch.load(path, map_location="cuda:{}".format(dev_id)) return model_state if finetune_loc is not None and os.path.isfile(finetune_loc): # load model dict model = load_state_dict(model, load_state(finetune_loc)) # load ema dict if model_ema is not None and os.path.isfile(finetune_ema_loc): model_ema = load_state_dict(model, load_state(finetune_ema_loc)) return model, model_ema ================================================ FILE: corenet/utils/color_map.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Optional import numpy as np class Colormap(object): """ Generate colormap for visualizing segmentation masks or bounding boxes. This is based on the MATLab code in the PASCAL VOC repository: http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#devkit """ def __init__(self, n: Optional[int] = 256, normalized: Optional[bool] = False): super(Colormap, self).__init__() self.n = n self.normalized = normalized @staticmethod def get_bit_at_idx(val, idx): return (val & (1 << idx)) != 0 def get_color_map(self) -> np.ndarray: dtype = "float32" if self.normalized else "uint8" color_map = np.zeros((self.n, 3), dtype=dtype) for i in range(self.n): r = g = b = 0 c = i for j in range(8): r = r | (self.get_bit_at_idx(c, 0) << 7 - j) g = g | (self.get_bit_at_idx(c, 1) << 7 - j) b = b | (self.get_bit_at_idx(c, 2) << 7 - j) c = c >> 3 color_map[i] = np.array([r, g, b]) color_map = color_map / 255 if self.normalized else color_map return color_map def get_box_color_codes(self) -> List: box_codes = [] for i in range(self.n): r = g = b = 0 c = i for j in range(8): r = r | (self.get_bit_at_idx(c, 0) << 7 - j) g = g | (self.get_bit_at_idx(c, 1) << 7 - j) b = b | (self.get_bit_at_idx(c, 2) << 7 - j) c = c >> 3 box_codes.append((int(r), int(g), int(b))) return box_codes def get_color_map_list(self) -> List: cmap = self.get_color_map() cmap = np.asarray(cmap).flatten() return list(cmap) ================================================ FILE: corenet/utils/common_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os import random from pathlib import Path from typing import Any, Dict, List, Optional, Tuple from urllib.parse import urlparse import numpy as np import torch from packaging import version from torch import Tensor from corenet.constants import MIN_TORCH_VERSION from corenet.utils import logger from corenet.utils.ddp_utils import is_master def construct_local_path_from_remote(remote_path: str, local_dir: str) -> str: """ Obtain the local file path given a remote file path WITHOUT downloading the file. The directories in the returned path are created if they don't exist. Args: remote_path: The remote file path. local_dir: Local directory. Returns: The corresponding local file path. Example: Assume 'remote_path=s3://bucket_name/file.pkl' and 'local_dir=/tmp', then the file path on a local machine will be `/tmp/bucket_name/file.pkl'. >>> remote_path="s3://bucket_name/file.pkl" >>> local_dir="/tmp" >>> local_path = construct_local_path_from_remote(remote_path, local_dir) >>> print(local_path) /tmp/bucket_name/file.pkl """ parsed_path = urlparse(remote_path) local_path = os.path.join(local_dir, parsed_path.netloc + parsed_path.path) Path(local_path).parent.mkdir(parents=True, exist_ok=True) return local_path def unwrap_model_fn(model: torch.nn.Module) -> torch.nn.Module: """Helper function to unwrap the model. Args: model: An instance of torch.nn.Module. Returns: Unwrapped instance of torch.nn.Module. """ unwrapped_model = model while True: if hasattr(unwrapped_model, "module"): # added by DataParallel and DistributedDataParallel unwrapped_model = unwrapped_model.module elif hasattr(unwrapped_model, "_fsdp_wrapped_module"): # FSDP wraps the model with _fsdp_wrapped_module unwrapped_model = unwrapped_model._fsdp_wrapped_module elif hasattr(unwrapped_model, "_orig_mod"): # torch.compile wraps the model with _orig_mod return unwrapped_model._orig_mod else: break return unwrapped_model def check_compatibility() -> None: curr_torch_version = torch.__version__ if version.parse(curr_torch_version) < version.parse(MIN_TORCH_VERSION): logger.error( "Min. pytorch version required is {}. Got: {}".format( MIN_TORCH_VERSION, curr_torch_version ) ) def check_frozen_norm_layer(model: torch.nn.Module) -> Tuple[bool, int]: from corenet.modeling.layers import norm_layers_tuple unwrapped_model = unwrap_model_fn(model) count_norm = 0 frozen_state = False for m in unwrapped_model.modules(): if isinstance(m, norm_layers_tuple): frozen_state = m.weight.requires_grad return frozen_state, count_norm def device_setup(opts: argparse.Namespace) -> argparse.Namespace: """Helper function for setting up the device. Args: opts: An instance of argparse.Namespace. Returns: An instance of argparse.Namespace with updated `dev.*` entries. """ random_seed = getattr(opts, "common.seed", 0) random.seed(random_seed) torch.manual_seed(random_seed) np.random.seed(random_seed) is_master_node = is_master(opts) if is_master_node: logger.log("Random seeds are set to {}".format(random_seed)) logger.log("Using PyTorch version {}".format(torch.__version__)) n_gpus = torch.cuda.device_count() if n_gpus == 0: if is_master_node: logger.warning("No GPUs available. Using CPU") device = torch.device("cpu") n_gpus = 0 else: if is_master_node: logger.log("Available GPUs: {}".format(n_gpus)) device = torch.device("cuda") if torch.backends.cudnn.is_available(): import torch.backends.cudnn as cudnn torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True if is_master_node: logger.log("CUDNN is enabled") allow_tf32 = not getattr(opts, "common.disable_tf32", False) if torch.cuda.is_available(): # TF32 is enabled by default in PyTorch < 1.12, but disabled in new versions. # See for details: https://github.com/pytorch/pytorch/issues/67384 # Disable it using common.disable_tf32 flag torch.backends.cuda.matmul.allow_tf32 = allow_tf32 setattr(opts, "dev.device", device) setattr(opts, "dev.num_gpus", n_gpus) world_size = getattr(opts, "ddp.world_size") if world_size == -1: setattr(opts, "ddp.world_size", n_gpus) logger.log("Setting --ddp.world-size the same as the number of available gpus.") return opts def create_directories(dir_path: str, is_master_node: bool) -> None: """Helper function to create directories""" if not os.path.isdir(dir_path): os.makedirs(dir_path, exist_ok=True) if is_master_node: logger.log("Directory created at: {}".format(dir_path)) else: if is_master_node: logger.log("Directory exists at: {}".format(dir_path)) def move_to_device( opts, x: Any, device: Optional[str] = "cpu", non_blocking: Optional[bool] = True, *args, **kwargs ) -> Any: """Helper function to move data to a device""" if isinstance(x, Dict): for k, v in x.items(): x[k] = move_to_device( opts=opts, x=v, device=device, non_blocking=non_blocking ) elif isinstance(x, Tensor): # only tensors can be moved to a device x = x.to(device=device, non_blocking=non_blocking) elif isinstance(x, List): x = [move_to_device(opts, a, device, non_blocking) for a in x] return x def is_coreml_conversion(opts) -> bool: if getattr(opts, "common.enable_coreml_compatible_module", False): return True return False ================================================ FILE: corenet/utils/context_managers.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from contextlib import contextmanager from typing import ContextManager @contextmanager def context_env_vars(**env: str) -> ContextManager[None]: """ Temporarily sets the environment variables within its context. Example usage: ``` os.environ["X"] = 2 with context_env_vars(X=3): print(os.environ["X"]) # prints 3 print(os.environ["X"]) # prints 2 ``` """ original_values = {} try: for key, value in env.items(): original_values[key] = env.get(key, None) if value is None: env.pop(key, None) else: env[key] = value yield finally: for key, value in original_values.items(): if value is None: env.pop(key, None) else: env[key] = value @contextmanager def context_tensor_threads(num_cpu_threads: int) -> ContextManager[None]: """ Temporarily, instructs numpy and torch to use @n cpu threads for processing tensors and arrays within the context. """ num_cpu_threads = str(num_cpu_threads) with context_env_vars( MKL_NUM_THREADS=num_cpu_threads, OMP_NUM_THREADS=num_cpu_threads, NUMEXPR_NUM_THREADS=num_cpu_threads, ): yield ================================================ FILE: corenet/utils/ddp_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import datetime import socket from typing import Optional import torch import torch.distributed as dist from corenet.utils import logger def is_master(opts) -> bool: node_rank = getattr(opts, "ddp.rank", 0) return node_rank == 0 def dist_barrier(): dist.barrier() def dist_monitored_barrier( timeout: Optional[float] = None, wait_all_ranks: Optional[bool] = False, group: Optional = None, ): dist.monitored_barrier(group=group, timeout=timeout, wait_all_ranks=wait_all_ranks) def is_start_rank_node(opts) -> bool: node_rank = getattr(opts, "ddp.rank", 0) def_rank = getattr(opts, "ddp.start_rank", 0) return node_rank == def_rank def get_world_size(): return dist.get_world_size() def get_node_rank(): return dist.get_rank() def distributed_init(opts) -> int: ddp_url = getattr(opts, "ddp.dist_url", None) is_master_node = is_master(opts) if ddp_url is None: ddp_port = getattr(opts, "ddp.dist_port", 6006) hostname = socket.gethostname() ddp_url = "tcp://{}:{}".format(hostname, ddp_port) setattr(opts, "ddp.dist_url", ddp_url) node_rank = getattr(opts, "ddp.rank") world_size = getattr(opts, "ddp.world_size") if world_size < 1: logger.error("World size should be > 0 for DDP.") if node_rank < 0: logger.error("Node rank should be >=0 for DDP.") if torch.distributed.is_initialized(): logger.warning("DDP is already initialized and cannot be initialize twice!") else: logger.info("distributed init (rank {}): {}".format(node_rank, ddp_url)) dist_backend = getattr(opts, "ddp.backend", "nccl") # "gloo" if dist_backend is None and dist.is_nccl_available(): dist_backend = "nccl" if is_master_node: logger.log( "Using NCCL as distributed backend with version={}".format( torch.cuda.nccl.version() ) ) elif dist_backend is None: dist_backend = "gloo" dist.init_process_group( backend=dist_backend, init_method=ddp_url, timeout=datetime.timedelta(seconds=3600), world_size=world_size, rank=node_rank, ) # perform a dummy all-reduce to initialize the NCCL communicator if torch.cuda.is_available(): dist.all_reduce(torch.zeros(1).cuda()) node_rank = torch.distributed.get_rank() setattr(opts, "ddp.rank", node_rank) return node_rank def is_rank_0_worker_0(opts: argparse.Namespace) -> bool: """Check if the current process is worker 0 of rank 0. Args: opts: Command-line arguments. Returns: A boolean indicating whether the current process is worker 0 of rank 0 """ worker_info = torch.utils.data.get_worker_info() if worker_info is not None and worker_info.id == 0 and is_master(opts): return True return False ================================================ FILE: corenet/utils/dict_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Collection, Dict, Optional def filter_keys( d: Dict, whitelist: Optional[Collection[str]] = None, ) -> Dict: """Returns a copy of the input dict @d, with a subset of keys that are in @whitelist. Args: d: Input dictionary that will be copied with a subset of keys. whitelist: List of keys to keep in the output (if exist in input dict). """ return {key: d[key] for key in whitelist if key in d} ================================================ FILE: corenet/utils/download_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import math import time from multiprocessing import Pool from pathlib import Path from typing import Any, Dict, List, Optional, Protocol from urllib.parse import urlsplit import torch from corenet.constants import TMP_CACHE_LOC from corenet.utils import logger, resources from corenet.utils.ddp_utils import dist_barrier, is_start_rank_node def get_local_path( opts: argparse.Namespace, path: str, cache_loc: str = TMP_CACHE_LOC, force_delete: Optional[bool] = None, use_start_rank: bool = True, sync_ranks: bool = True, max_retries: int = 5, parallel_download: bool = False, max_download_workers: int = 1, *args, **kwargs, ) -> str: """ Helper function to download data from remote servers (e.g., S3/HTTP/HTTPS). Args: opts: Command-line arguments. path: Path of the remote file that needs to be downloaded. cache_loc: Location where file needs to be stored after downloading. force_delete: Force the file to be deleted if it is present in the `cache_loc`. use_start_rank: Download the files on the start rank of each node. sync_ranks: Synchronize DDP ranks after downloading. max_retries: Maximum download retries. Defaults to 5. parallel_download: If enabled, files are downloaded in parallel. max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus. Returns: If file(s) is(are) remote, this function downloads it to `cache_loc` and returns the local path(s). Otherwise, its a noop. """ # To avoid circular imports, get_transfer_client is imported inside get_local_path. from corenet.data.io.transfer_clients import get_transfer_client client_name = urlsplit(path).scheme.lower() client = get_transfer_client( opts, transfer_client_name=client_name, max_retries=max_retries, force_delete=force_delete, only_download_on_start_rank=use_start_rank, synchronize_distributed_ranks=sync_ranks, parallel_download=parallel_download, max_download_workers=max_download_workers, raise_error_if_transfer_client_not_present=False, ) if client is None: # For 'get_local_path', it is a no-op if file is locally present or client is not present # However, 'get_transfer_client()' can raise an error (if required) by enabling 'raise_error_if_transfer_client_not_present'. return path else: return client.download(path, cache_loc) class DownloadFunc(Protocol): def __call__( file_idx: int, local_dst_dir: str, args: List[Any], kwargs: Dict[Any, Any] ) -> Any: """Protocol for a callable that downloads an index of a dataset to `dst_location`. Args: file_idx: Index of the asset to be downloaded. local_dst_dir: Local directory path where asset should be stored after downloading locally. args: 'download_func' specific args. kwargs: 'download_func' specific kwargs. """ ... def download_assets_in_parallel( opts: argparse.Namespace, download_func: DownloadFunc, local_dst_dir: str, num_assets: int, shard_asset: bool = False, max_threads: Optional[int] = None, index_padding: bool = False, *args, **kwargs, ) -> List[Any]: """ Helper function to download assets in parallel. Args: opts: Command-line arguments. download_func: Custom function to be used for downloading/processing assets. dst_dir: Local directory path where assets should be stored after downloading. If 'dst_dir' does not exist, it will be created. num_assets: Total number of assets to be downloaded. shard_asset: Shard assets among nodes. max_threads: Maximum number of threads. If not specified, then max_threads=num_cpus. index_padding: Pad indices to download the same number of assets on each node. args and kwargs: 'download_func' specific args and kwargs. Returns: A list of indices. ...note: Users need to specify the 'num_assets'. This can be pre-computed (e.g., number of files in the S3 bucket) and passed to 'download_assets_in_parallel' function. """ Path(local_dst_dir).mkdir(exist_ok=True, parents=True) cuda_available = torch.cuda.is_available() # For CPU, world_size and n_gpus_per_node should be 1 to avoid division-by-zero errors world_size = max(getattr(opts, "ddp.world_size"), 1) n_gpus_per_node = torch.cuda.device_count() if cuda_available else 1 current_device = torch.cuda.current_device() if cuda_available else 0 curr_node_rank = getattr(opts, "ddp.rank") node_id = curr_node_rank // n_gpus_per_node total_assets = int(math.ceil(num_assets / world_size)) * world_size asset_indices = [idx for idx in range(num_assets)] if index_padding: asset_indices += asset_indices[: (total_assets - num_assets)] if shard_asset: # Each node downloads portion of the assets. # Note that total number of GPUs (a.k.a world size) = Total number of nodes * number of GPUs per Node n_nodes = max(1, world_size // n_gpus_per_node) assets_per_node = int(math.ceil(len(asset_indices) / n_nodes)) else: # Each node downloads all assets. assets_per_node = len(asset_indices) asset_indices_node_i = asset_indices[ node_id * assets_per_node : (node_id + 1) * assets_per_node ] # now divide the assets among each GPU in the node to download in parallel asset_indices_node_i_rank_j = asset_indices_node_i[ current_device : len(asset_indices_node_i) : n_gpus_per_node ] start_time = time.time() # download assets in parallel on each rank n_cpus = resources.cpu_count() if max_threads is None: # use all CPUs max_threads = n_cpus n_process_per_gpu = min(max(1, n_cpus // n_gpus_per_node), max_threads) with Pool(processes=n_process_per_gpu) as pool: pool.starmap( download_func, [ (file_idx, local_dst_dir, args, kwargs) for file_idx in asset_indices_node_i_rank_j ], ) # We set the default value of ddp.use_distributed here as it is not an exposed # parameter using command-line arguments if getattr(opts, "ddp.use_distributed", False): # synchronize between all DDP jobs dist_barrier() download_time = round((time.time() - start_time) / 60.0, 3) if is_start_rank_node(opts): # display information on start ranks logger.log( f"Function {download_func.__name__} took {download_time:.2f} minutes to process/download {len(asset_indices_node_i_rank_j)} assets." ) return asset_indices_node_i ================================================ FILE: corenet/utils/file_logger.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import shutil import tempfile from typing import Any, Dict, Optional, Union import torch class FileLogger: """ A logger that writes scalar values to a file. """ def __init__(self, fname: str) -> None: """ Initialize a FileLogger. Since logged values may include tensors, the file is saved with torch.save. Args: fname: The name of the pytorch file to which the logger will save logs. """ self.fname = fname if os.path.exists(self.fname): self.stats = torch.load(self.fname) else: # We hold stats in a dictionary keyed by epoch number. We use a # dictionary rather than a list to avoid the assumption that # len(self.stats) gives the current epoch. Such an assumption is # inconvenient if, for instance, we resume training mid-way through, # and suddenly enabling this FileLogger when it wasn't enabled # before. self.stats: Dict[int, Dict[str, Any]] = {"epochs": {}} def add_scalar( self, metric_name: str, metric_value: Union[float, int], epoch: int, ) -> None: """ Add a scalar to the FileLogger. Args: metric_name: The name of the metric. metric_value: The value of the metric. epoch: The epoch number. """ if epoch not in self.stats["epochs"]: self.stats["epochs"][epoch] = {"metrics": {}} self.stats["epochs"][epoch]["metrics"][metric_name] = metric_value def close(self) -> None: # Write to a temporary file, then use shutil.move (to make the write # atomic). This avoids creating a malformed file if the job crashes # during writing. temporary_file = tempfile.NamedTemporaryFile(delete=False) torch.save(self.stats, temporary_file.name) temporary_file.close() # NOTE: Do not use os.rename to avoid 'OSError: Invalid cross-device link'. # See: https://stackoverflow.com/questions/42392600/oserror-errno-18-invalid-cross-device-link shutil.move(temporary_file.name, self.fname) ================================================ FILE: corenet/utils/fpdb.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import fcntl import pdb import sys class _ForkedPdb(pdb.Pdb): """A Pdb subclass for forked subprocesses. The first subprocess (or main process) that invokes this class launches the pdb, and the rest of the processes will wait. Uses a simple file-based lock mechanism for synchronization that works on Unix, but has not been tested on other operation systems. Usage: ``` from corenet.utils import fpdb; fpdb.set_trace() ``` Inspired by https://github.com/Lightning-AI/forked-pdb/blob/master/fpdb.py """ def __init__(self, lockfile: str) -> None: self.lockfile = lockfile super().__init__() def interaction(self, *args, **kwargs) -> None: """Acquires the lockfile, then attaches the input stream of the subprocess to /dev/stdin, so that subprocess debugger can receive keyboard inputs. """ with open(self.lockfile, "a") as lock: try: fcntl.lockf(lock, fcntl.LOCK_EX) _stdin = sys.stdin try: sys.stdin = open("/dev/stdin") pdb.Pdb.interaction(self, *args, **kwargs) finally: sys.stdin = _stdin finally: fcntl.lockf(lock, fcntl.LOCK_UN) def set_trace(lockfile: str = "/tmp/_corenet_fpdb.lockfile") -> None: """ Launches a pdb debugger in a single-node multi-process job. The first subprocess that invokes this function launches the pdb and makes the rest of subprocesses, that invoke this function, wait for the first subprocess's debugger. Args: lockfile: The path to the lockfile for synchronization between subprocesses. Defaults to a constant path in ``/tmp``. As long as there is a single concurrent training job running, the user won't need to override this argument. """ _ForkedPdb(lockfile).set_trace(frame=sys._getframe().f_back) ================================================ FILE: corenet/utils/hf_adapter_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List, Optional, Tuple import torch from corenet.modeling.models import get_model try: from transformers import PretrainedConfig, PreTrainedModel from transformers.modeling_outputs import CausalLMOutputWithPast except ModuleNotFoundError: PretrainedConfig = object PreTrainedModel = object CausalLMOutputWithPast = None class CorenetToHFPretrainedConfig(PretrainedConfig): """ An adapter to build a CoreNet config that inherits from PreTrainedConfig. Mainly used for adaptation to 3rd party code. Args: kwargs: Arguments to pass to PretrainedConfig. """ model_type = "causal_lm" def __init__(self, **kwargs: Dict[str, Any]) -> None: super().__init__(**kwargs) class CorenetToHFPretrainedModel(PreTrainedModel): """ An adapter to build a CoreNet model that inherits from PreTrainedModel. Mainly used for adaptation to 3rd party code. Args: config: The _CorenetToHFPretrainedConfig that defines the model. This essentially contains the standard CoreNet model arguments. vocab_size: The vocabulary size. """ config_class = CorenetToHFPretrainedConfig def __init__(self, config: CorenetToHFPretrainedConfig, vocab_size: int) -> None: super().__init__(config) opts = argparse.Namespace(**vars(config)) model = get_model(opts) model.eval() self.lm_head = None self.model = model self.vocab_size = vocab_size self.post_init() def forward( self, input_ids: Optional[torch.LongTensor] = None, past_key_values: Optional[List[torch.Tensor]] = None, attention_mask: Optional[ torch.FloatTensor ] = None, # No need, internally apply causal masking token_type_ids: Optional[ torch.LongTensor ] = None, # No need, we do not differentiate between tokens position_ids: Optional[ torch.LongTensor ] = None, # Needed for llama mdoels, not needed for openelm head_mask: Optional[ torch.FloatTensor ] = None, # No need, we are not masking heads inputs_embeds: Optional[ torch.FloatTensor ] = None, # No need, they will be computed internally encoder_hidden_states: Optional[ torch.Tensor ] = None, # No need, we don't have encoder encoder_attention_mask: Optional[ torch.FloatTensor ] = None, # No need, we don't have encoder use_cache: Optional[ bool ] = None, # We can use it, map to `use_kv_cache` args internally output_attentions: Optional[bool] = None, # No need, we are not using them output_hidden_states: Optional[bool] = None, # No need, we are not using them return_dict: Optional[ bool ] = None, # We can return as a dict, we internally deal with it cache_position: Optional[torch.LongTensor] = None, # No need, not used. ) -> CausalLMOutputWithPast: """ The forward function to compute model outputs. Note, many arguments are not supported, and are only present due to inheritance. Additionally, the model is assumed to use causal attention. Args: input_ids: The input token ids. past_key_values: The key-value cache. attention_mask: Unused. token_type_ids: Unused. position_ids: Unused. head_mask: Unused. inputs_embeds: Unused. encoder_hidden_states: Unused. encoder_attention_mask: Unused. use_cache: Whether we are going to use the cache or not. output_attentions: Unused. output_hidden_states: Unused. return_dict: Unused. cache_position: Unused """ assert token_type_ids is None # assert position_ids is None assert head_mask is None assert inputs_embeds is None assert encoder_hidden_states is None assert encoder_attention_mask is None assert not output_attentions assert not output_hidden_states assert return_dict is None or return_dict is_causal = True if use_cache: # For generative tasks, we have two scenarios: (1) processing prefix and (2) generation # For the first case, @n_input_tokens > 1 and we do not have past_key_values. Therefore, # we need to run model with causal mask # For the second case, @n_input_tokens should be 1. In this case, we have already processed # prefix and will use it's cached keys and values for the current token. # input_ids are of the shape [Batch, Seq_length] n_input_tokens = input_ids.shape[1] if n_input_tokens == 1 and past_key_values is not None: is_causal = False elif n_input_tokens > 1 and past_key_values is None: is_causal = True else: raise NotImplementedError("Not yet supported") if past_key_values is None: past_keys = None past_values = None else: past_keys, past_values = past_key_values model_inputs = { "input_ids": input_ids, "past_keys": past_keys, "past_values": past_values, "use_kv_cache": use_cache, "is_causal": is_causal, } else: model_inputs = input_ids model_outputs = self.model(model_inputs) if isinstance(model_outputs, dict): logits = model_outputs["logits"] past_key_values = model_outputs["past_keys"], model_outputs["past_values"] elif isinstance(model_outputs, torch.Tensor): logits = model_outputs past_key_values = None # We may have added extra tokens in the LM classifier to make training faster. Remove such tokens logits = logits[..., : self.vocab_size] return CausalLMOutputWithPast( logits=logits, past_key_values=past_key_values, ) def prepare_inputs_for_generation( self, input_ids: torch.Tensor, past_key_values: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, use_cache: bool = False, attention_mask: Optional[torch.Tensor] = None, **kwargs, ): """ Prepare inputs to be passed to the model by building a dictionary of arguments from the inputs. Args: input_ids: The input ids. past_key_values: The key-value cache. use_cache: If set, use the key-value cache. attention_mask: The attention mask to use in attention layers. Other keyword arguments are ignored. """ if past_key_values is not None: # All tokens except the last token were processed in the previous time step. # so, we do not need to process them again. input_ids = input_ids[:, -1:] position_ids = kwargs.get("position_ids", None) if attention_mask is not None and position_ids is None: # create position_ids on the fly for batch generation position_ids = attention_mask.long().cumsum(-1) - 1 position_ids.masked_fill_(attention_mask == 0, 1) if past_key_values is not None: position_ids = position_ids[:, -input_ids.shape[1] :] model_inputs = { "input_ids": input_ids, "position_ids": position_ids, "past_key_values": past_key_values, "use_cache": use_cache, "attention_mask": attention_mask, } return model_inputs ================================================ FILE: corenet/utils/import_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import importlib import os import re import sys from typing import Optional, Sequence from corenet.constants import LIBRARY_ROOT from corenet.utils import logger def import_modules_from_folder( folder_name: str, extra_roots: Optional[Sequence[str]] = None ) -> None: """Automatically import all modules from public library root folder, in addition to the @extra_roots directories. The @folder_name directory must exist in LIBRARY_ROOT, but existence in @extra_roots is optional. Args: folder_name: Name of the folder to search for its internal and public modules. extra_roots: By default, this function only imports from `LIBRARY_ROOT/{folder_name}/**/*.py`. For any extra_root provided, it will also import `LIBRARY_ROOT/{extra_root}/{folder_name}/**/*.py` modules. """ if not LIBRARY_ROOT.joinpath(folder_name).exists(): logger.error( f"{folder_name} doesn't exist in the public library root directory." ) base_dirs = ["."] if extra_roots is not None: base_dirs += sorted(extra_roots) for base_dir in base_dirs: if base_dir.startswith("corenet/") and folder_name.startswith("corenet/"): base_dir = os.path.join(base_dir, re.sub("^corenet/", "", folder_name)) else: base_dir = os.path.join(base_dir, folder_name) for path in sorted(LIBRARY_ROOT.glob(os.path.join(base_dir, "**/*.py"))): filename = path.name if ( filename[0] not in (".", "_") and not filename.endswith("_test.py") and not filename.startswith("test_") ): module_name = str( path.relative_to(LIBRARY_ROOT).with_suffix("") ).replace(os.sep, ".") importlib.import_module(module_name) # For some libraries, the name of the module to be imported is different with the name # of the library (i.e. to install using pip). MODULE_NAME_2_LIBRARY_NAME_MAPPING = { "ffmpeg": "ffmpeg-python", } def ensure_library_is_available(module_name: str) -> None: """Ensures @module_name is imported, when the corresponding library is an optional dependency. Args: module_name: Name of the module that should be imported before calling this function using the following snippet: ``` try: import # OR: import .. # OR: from . import except ModuleNotFoundError: pass ``` Returns: None if optional dependency is installed. Otherwise, raises an error. """ if module_name in sys.modules: # The above condition has confirmed that module_name is already imported. return try: importlib.import_module(module_name) except ModuleNotFoundError: library_name = MODULE_NAME_2_LIBRARY_NAME_MAPPING.get(module_name, module_name) logger.error( f"{library_name} (an optional dependency) is not installed. Please" f" run 'pip install {library_name}'." ) # Module is available, but not imported yet. Otherwise, the `if` condition at the # top of this function would have returned before reaching this line. raise RuntimeError( f"Please import {module_name} before calling" f' ensure_library_is_available("{module_name}")' ) def import_core_modules(): """ This function imports the core functionality of CoreNet, consisting of all modules that contain registered classes (e.g. datasets, models, etc.) and entrypoints. For further details, please see the docstring of ``corenet.utils.import_utils.test_ensure_pythonpath_is_not_required``. """ from corenet.options.opts import get_training_arguments get_training_arguments(args=[]) # Imports registered classes. from corenet.cli.entrypoints import entrypoints for module_name, _ in entrypoints.values(): importlib.import_module(module_name) ================================================ FILE: corenet/utils/io_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import tempfile from typing import Optional def make_temp_file( suffix: str = None, prefix: Optional[str] = "corenet-tmp-", dir: Optional[str] = None, ) -> str: """Create a temporary file and return its path.""" tmp_file = tempfile.NamedTemporaryFile( delete=False, suffix=suffix, prefix=prefix, dir=dir, ) tmp_file.close() return tmp_file.name ================================================ FILE: corenet/utils/logger.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import re import sys import time import traceback from typing import Optional, Union text_colors = { "logs": "\033[34m", # 033 is the escape code and 34 is the color code "info": "\033[32m", "warning": "\033[33m", "debug": "\033[93m", "error": "\033[31m", "bold": "\033[1m", "end_color": "\033[0m", "light_red": "\033[36m", } def get_curr_time_stamp() -> str: return time.strftime("%Y-%m-%d %H:%M:%S") def error(message: str) -> None: time_stamp = get_curr_time_stamp() error_str = ( text_colors["error"] + text_colors["bold"] + "ERROR " + text_colors["end_color"] ) # exiting with code -1 does not tell any information about the error (e.g., NaN encountered in the loss). # For more descriptive error messages, we replace exit(-1) with sys.exit(ERROR_MESSAGE). # This allows us to handle specific exceptions in the tests. # print("{} - {} - {}".format(time_stamp, error_str, message), flush=True) # print("{} - {} - {}".format(time_stamp, error_str, "Exiting!!!"), flush=True) # exit(-1) if sys.exc_info()[0] is None: traceback.print_stack() else: traceback.print_exc() sys.exit("{} - {} - {}. Exiting!!!".format(time_stamp, error_str, message)) def color_text(in_text: str) -> str: return text_colors["light_red"] + in_text + text_colors["end_color"] def log(message: str, end="\n") -> None: time_stamp = get_curr_time_stamp() log_str = ( text_colors["logs"] + text_colors["bold"] + "LOGS " + text_colors["end_color"] ) print("{} - {} - {}".format(time_stamp, log_str, message), end=end) def warning(message: Union[str, Warning]) -> None: if isinstance(message, Warning): message = f"{type(message).__name__}({','.join(map(repr, message.args))}" time_stamp = get_curr_time_stamp() warn_str = ( text_colors["warning"] + text_colors["bold"] + "WARNING" + text_colors["end_color"] ) print("{} - {} - {}".format(time_stamp, warn_str, message)) def ignore_exception_with_warning(message: str) -> None: """ After catching a tolerable exception E1 (e.g. when Model.forward() fails during profiling with try-catch, it'll be helpful to log the exception for future investigation. But printing the error stack trace, as is, could be confusing when an uncaught (non-tolerable) exception "E2" raises down the road. Then, the log will contain two stack traces for E1, E2. When looking for errors in logs, users should look for E2, but they may find E1. This function appends "(WARNING)" at the end of all lines of the E1 traceback, so that the user can distinguish E1 from uncaught exception E2. Args: message: Extra explanation and context for debugging. (Note: the exception obj will be automatically fetched from python. No need to pass it as an argument or as message) """ warning(f"{message}:\n{traceback.format_exc()}".replace("\n", "\n(WARNING)")) def info(message: str, print_line: Optional[bool] = False) -> None: time_stamp = get_curr_time_stamp() info_str = ( text_colors["info"] + text_colors["bold"] + "INFO " + text_colors["end_color"] ) print("{} - {} - {}".format(time_stamp, info_str, message)) if print_line: double_dash_line(dashes=150) def debug(message: str) -> None: time_stamp = get_curr_time_stamp() log_str = ( text_colors["debug"] + text_colors["bold"] + "DEBUG " + text_colors["end_color"] ) print("{} - {} - {}".format(time_stamp, log_str, message)) def double_dash_line(dashes: Optional[int] = 75) -> None: print(text_colors["error"] + "=" * dashes + text_colors["end_color"]) def singe_dash_line(dashes: Optional[int] = 67) -> None: print("-" * dashes) def print_header(header: str) -> None: double_dash_line() print( text_colors["info"] + text_colors["bold"] + "=" * 50 + str(header) + text_colors["end_color"] ) double_dash_line() def print_header_minor(header: str) -> None: print( text_colors["warning"] + text_colors["bold"] + "=" * 25 + str(header) + text_colors["end_color"] ) def disable_printing(): sys.stdout = open(os.devnull, "w") def enable_printing(): sys.stdout = sys.__stdout__ def match_warning_message(*message_segments: str) -> str: """Creates a regex that matches warnings given a partial warning message. It escapes the dots and special characters and also replaces whitespaces with \\s+, so that the users copy-paste the warning message to the input of this function. Args: message_segments: The warning message, copy-pasted from console logs. When multiple segments are passed as inputs, the regex will match warnings that contain all of segments in order they were provided. Returns: A regex that matches the message robustly, handling whitespaces and escaping. """ regex_segments = [""] for segment in message_segments: segment = re.sub(r"\s+", " ", segment) # Replace all whitespaces with " " segment = re.escape(segment) # The input pattern is not a regular expression segment = re.sub(r"\\ ", r"\\s+", segment) regex_segments.append(segment) return ".*".join(regex_segments) def indent(multiline_str: str, prefix: str = "\t") -> str: """Indents each line in of the input string. Args: multiline_str: The input string to indent. prefix: The prefix insert at the beginning of each line for indentation. Defaults to the tab character. Returns: The input @multiline_str, modified by prefixing each line with @prefix. """ lines = multiline_str.split("\n") lines = (prefix + line for line in lines) lines = "\n".join(lines) return lines def truncate(text: str, max_len: int = 79) -> str: """Truncates a string by a maximum length limit, to keep the logs readable. Args: text: The input string to truncate. Returns: The input @text string, truncated by a maximum length of @max_len. """ assert max_len > 5 if len(text) <= max_len: return text return text[: max_len - 5] + "[...]" ================================================ FILE: corenet/utils/math_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional, Union def make_divisible( v: Union[float, int], divisor: Optional[int] = 8, min_value: Optional[Union[float, int]] = None, ) -> Union[float, int]: """ This function is taken from the original tf repo. It ensures that all layers have a channel number that is divisible by 8 It can be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py :param v: :param divisor: :param min_value: :return: """ if min_value is None: min_value = divisor new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) # Make sure that round down does not go down by more than 10%. if new_v < 0.9 * v: new_v += divisor return new_v def bound_fn( min_val: Union[float, int], max_val: Union[float, int], value: Union[float, int] ) -> Union[float, int]: return max(min_val, min(max_val, value)) ================================================ FILE: corenet/utils/object_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys from numbers import Number from typing import Dict from corenet.constants import is_test_env from corenet.utils import logger def is_iterable(x): return hasattr(x, "__iter__") and not isinstance(x, (str, bytes)) def apply_recursively(x, cb, *args, **kwargs): if isinstance(x, dict): return {k: apply_recursively(v, cb, *args, **kwargs) for k, v in x.items()} elif is_iterable(x): x_type = type(x) return x_type([apply_recursively(y, cb, *args, **kwargs) for y in x]) else: return cb(x, *args, **kwargs) def flatten_to_dict( x, name: str, dict_sep: str = "/", list_sep: str = "_" ) -> Dict[str, Number]: if x is None: return {} elif isinstance(x, Number): return {name: x} elif isinstance(x, list): return { k: v for i, inner in enumerate(x) for k, v in flatten_to_dict( inner, name=name + list_sep + str(i), dict_sep=dict_sep, list_sep=list_sep, ).items() } elif isinstance(x, dict): return { k: v for iname, inner in x.items() for k, v in flatten_to_dict( inner, name=name + dict_sep + iname, dict_sep=dict_sep, list_sep=list_sep, ).items() } logger.error("This should never be reached!") return {} def is_pytest_environment() -> bool: """Helper function to check if pytest environment or not""" logger.warning( DeprecationWarning( "utils.object_utils.is_pytest_environment is deprecated. Please use" " common.is_test_env instead." ) ) return is_test_env() ================================================ FILE: corenet/utils/object_utils_test.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.utils.object_utils import apply_recursively, flatten_to_dict def test_apply_on_values(): d = { "top1": 1.112311, "prob_hist": {"max": [0.10003, 0.3, 0.5, 0.09997]}, "accuracy_per_class": [0.8286, 0.9124], } new_d = apply_recursively(d, lambda x: round(x, 2)) assert str(new_d["top1"]) == "1.11" assert str(new_d["prob_hist"]["max"][0]) == "0.1" def test_flatten_to_dict(): original = { "top1": 1.112311, "prob_hist": {"max": [0.10003, 0.3, 0.5, 0.09997]}, "accuracy_per_class": [0.8286, 0.9124], } flattened = { "metric/top1": 1.112311, "metric/prob_hist/max_0": 0.10003, "metric/prob_hist/max_1": 0.3, "metric/prob_hist/max_2": 0.5, "metric/prob_hist/max_3": 0.09997, "metric/accuracy_per_class_0": 0.8286, "metric/accuracy_per_class_1": 0.9124, } assert flatten_to_dict(original, "metric") == flattened ================================================ FILE: corenet/utils/pytorch_to_coreml.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, Optional, Tuple, Union import coremltools as ct import numpy as np import torch from PIL import Image from torch import Tensor from torch.utils.mobile_optimizer import optimize_for_mobile from torchvision.transforms import functional as F from corenet.utils import logger from corenet.utils.tensor_utils import create_rand_tensor def convert_pytorch_to_coreml( opts, pytorch_model: torch.nn.Module, jit_model_only: Optional[bool] = False, convert_to: str = "neuralnetwork", minimum_deployment_target: Optional[ct.target] = None, compute_precision: Optional[ct.precision] = None, ) -> Dict: """ Convert Pytorch model to CoreML Args: pytorch_model: Pytorch model that needs to be converted to JIT or CoreML jit_model_only: If set, do not create the optimized or CoreML model. convert_to: If 'neuralnetwork', convert to espresso format. If 'mlpackage', convert to the MIL format. minimum_deployment_target: The minimal version of the system to converted model supports on device. The converter produces a neural network (neuralnetwork) if: minimum_deployment_target <= coremltools.target.iOS14/ coremltools.target.macOS11/ coremltools.target.watchOS7/ coremltools.target.tvOS14: The converter produces an ML program (mlprogram) if: minimum_deployment_target >= coremltools.target.iOS15/ coremltools.target.macOS12/ coremltools.target.watchOS8/ coremltools.target.tvOS15: If neither the minimum_deployment_target nor the convert_to parameter is specified, the converter produces an ML program model type with as minimum of a deployment target as possible. If this parameter is specified and convert_to is also specified, they must be compatible. compute_precision: Precision of converted model. Returns: A dict containing the JIT model, the optimized model, and the CoreML model. """ input_image_path = getattr(opts, "conversion.input_image_path", None) if input_image_path is not None: input_pil_img = Image.open(input_image_path).convert("RGB") input_pil_img = F.resize( img=input_pil_img, size=256, interpolation=F.InterpolationMode.BILINEAR ) input_pil_img = F.center_crop(img=input_pil_img, output_size=224) input_tensor = F.pil_to_tensor(input_pil_img).float() input_tensor.div_(255.0) input_tensor = input_tensor.unsqueeze(0) # add dummy batch dimension input_tuple = (input_tensor,) elif hasattr(pytorch_model, "conversion_inputs"): input_pil_img = None input_tuple = pytorch_model.conversion_inputs() else: input_pil_img = None input_tensor = create_rand_tensor(opts=opts, device="cpu") input_tuple = (input_tensor,) if pytorch_model.training: pytorch_model.eval() # Prepare model to be exported (only if implemented) if hasattr(pytorch_model, "get_exportable_model"): logger.log("Preparing model for export.") pytorch_model = pytorch_model.get_exportable_model() with torch.no_grad(): pytorch_out = pytorch_model(*input_tuple) jit_model = torch.jit.trace(pytorch_model, input_tuple) jit_out = jit_model(*input_tuple) assertion_check(py_out=pytorch_out, jit_out=jit_out) jit_model_optimized = optimize_for_mobile(jit_model) jit_optimized_out = jit_model_optimized(*input_tuple) assertion_check(py_out=pytorch_out, jit_out=jit_optimized_out) if jit_model_only and torch.cuda.device_count() > 0: # For inference on GPU return {"coreml": None, "jit": jit_model, "jit_optimized": None} elif jit_model_only and torch.cuda.device_count() == 0: # For inference on CPU return {"coreml": None, "jit": jit_model_optimized, "jit_optimized": None} if hasattr(pytorch_model, "ct_convert_inputs_outputs_types"): inputs, outputs = pytorch_model.ct_convert_inputs_outputs_types(input_tuple) else: inputs = [ ct.ImageType( name="input", shape=input_tuple[0].shape, scale=1.0 / 255.0 ) ] outputs = None coreml_model = ct.convert( model=jit_model, inputs=inputs, outputs=outputs, convert_to=convert_to, minimum_deployment_target=minimum_deployment_target, compute_precision=compute_precision, ) if input_pil_img is not None: out = coreml_model.predict({"input": input_pil_img}) return { "coreml": coreml_model, "jit": jit_model, "jit_optimized": jit_model_optimized, } def assertion_check( py_out: Union[Tensor, Dict, Tuple], jit_out: Union[Tensor, Dict, Tuple] ) -> None: if isinstance(py_out, Dict): assert isinstance(jit_out, Dict) keys = py_out.keys() for k in keys: np.testing.assert_almost_equal( py_out[k].cpu().numpy(), jit_out[k].cpu().numpy(), decimal=3, verbose=True, ) elif isinstance(py_out, Tensor): assert isinstance(jit_out, Tensor) np.testing.assert_almost_equal( py_out.cpu().numpy(), jit_out.cpu().numpy(), decimal=3, verbose=True ) elif isinstance(py_out, Tuple): assert isinstance(jit_out, Tuple) for x, y in zip(py_out, jit_out): np.testing.assert_almost_equal( x.cpu().numpy(), y.cpu().numpy(), decimal=3, verbose=True ) else: raise NotImplementedError( "Only Dictionary[Tensors] or Tuple[Tensors] or Tensors are supported as outputs" ) ================================================ FILE: corenet/utils/registry.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from functools import partial from typing import ( Callable, Dict, Iterable, List, Optional, Sequence, Tuple, TypeVar, Union, ) from corenet.utils import logger from corenet.utils.import_utils import import_modules_from_folder RegistryItem = TypeVar("RegistryItem", bound=Callable) class Registry: """ A key/object registry class. This class is used to do Dependency Injection in configs, so when you write "resnet" in a config, it knows which module to load. You can potentially provide a `base_class` to ensures that all items in the registry are of type `base_class`. Registry also allows for passing arguments to a registered item: For example: "top1" -> "top1(pred=logits)" Usage: >>> my_registry = Registry("registry_name") >>> @my_registry.register("awesome_class_or_func") ... def my_awesome_class_or_func(): ... pass >>> assert "awesome_class_or_func" in my_registry It allows for vanilla key/object definition as well as functional argument injection: >>> reg = Registry("registry_name") >>> reg.register("awesome_dict")(dict) >>> reg["awesome_dict(name=hello, type=fifo)]() {'name': 'hello', 'type': 'fifo'} """ def __init__( self, registry_name: str, base_class: Optional[type] = None, separator: Optional[str] = ":", lazy_load_dirs: Optional[List[str]] = None, internal_dirs: Optional[Sequence[str]] = None, ) -> None: """ Args: registry_name: registry name, used for debugging and error messages base_class: If provided, will ensure that all items inside the registry are of type `base_class`. separator: Separator between name and type in `register` function. lazy_load_dirs: If provided, will load all directories under these directories when inspecting for the modules of the registry. """ self.registry_name = registry_name self.base_class = base_class self.registry = {} # For debugging purposes we want to throw a warning if someone accesses # arguments before registering all items. self.arguments_accessed = False self.separator = separator # Lazy loading to get rid of possible circular dependencies self._modules_loaded = False self._lazy_load_dirs = lazy_load_dirs self.internal_dirs = internal_dirs if self._lazy_load_dirs is None: self._lazy_load_dirs = [] def _load_all(self) -> None: """ This function allows for lazily loading modules from pre-specified directories. The main reason for its existence is to prevent circular imports. This function should be called before any "pull/get" kind of action from Registry to make sure it has loaded all registered models, which is pretty much any operation except for "register". If self._modules_loaded is not True, it will load all modules under self._lazy_load_dirs. """ if not self._modules_loaded: self._modules_loaded = True for dir_name in sorted(self._lazy_load_dirs): import_modules_from_folder(dir_name, extra_roots=self.internal_dirs) def items(self) -> List[Tuple[str, RegistryItem]]: self._load_all() return self.registry.items() def keys(self) -> List[str]: self._load_all() return self.registry.keys() def __iter__(self) -> Iterable[str]: self._load_all() return iter(self.registry) def __getitem__(self, key: Union[Tuple[str, str], str]) -> RegistryItem: self._load_all() type_ = None if isinstance(key, Tuple) and len(key) == 2: key, type_ = key assert isinstance( key, str ), f"Key should be an instance of string. Got {type(key)}" name, params = self.parse_key(key) if type_: name = f"{type_}{self.separator}{name}" if name not in self.registry: registry_keys = list(self.registry.keys()) temp_str = ( f"\n{name} not yet supported in {self.registry_name} registry." f"\nSupported values are:" ) for i, supp_val in enumerate(registry_keys): temp_str += f"\n\t {i}: {supp_val}" logger.error(temp_str + "\n") reg_item = self.registry[name] if params: reg_item = partial(reg_item, **params) return reg_item def __contains__(self, key: str) -> bool: self._load_all() name, _ = self.parse_key(key) return name in self.registry def register(self, name: str, type: str = "") -> Callable: if type: name = "{}{}{}".format(type, self.separator, name) if self.arguments_accessed: logger.warning( f"Found item `{name}` being registered after all_item_arguments" f" was called for `{self.registry_name}` registry." ) def register_with_name(item: RegistryItem) -> RegistryItem: if item is not self.registry.get(name, item): raise ValueError( "Cannot register duplicate {} ({})".format(self.registry_name, name) ) if self.base_class and not issubclass(item, self.base_class): raise ValueError( "{} class ({}: {}) must extend {}".format( self.registry_name, name, item.__name__, self.base_class ) ) self.registry[name] = item return item return register_with_name def all_arguments(self, parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Iterates through all items and fetches their arguments. Note: make sure that all items are already registered before calling this method. """ self._load_all() self.arguments_accessed = True for _, item in self.items(): parser = item.add_arguments(parser) return parser def parse_key(self, key: str) -> Tuple[str, Dict[str, str]]: """ Parses `key` which can contain arguments in the form of: (arg1=value1, arg2=value2, ...) Returns: Tuple: (base_name: str, parameters: dict) """ name = key.split("(")[0] params = {} if "(" in key: params_str = key.split("(")[1].split(")")[0] try: params = dict( [ [x.strip() for x in arg.split("=")] for arg in params_str.split(",") ] ) except Exception as e: logger.error( "Could not correctly parse key parameters `{}` for registry {}." " Please make sure to key parameters have the format:" " (arg1=value1, arg2=value2, ...)".format( key, self.registry_name ) ) raise e return name, params ================================================ FILE: corenet/utils/registry_test.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.utils.registry import Registry def test_functional_registry() -> None: reg = Registry("registry_name") reg.register("awesome_dict")(dict) assert "awesome_dict" in reg assert "awesome_dict(name=hello)" in reg obj = reg["awesome_dict(name=hello, type=fifo)"]() assert obj == {"name": "hello", "type": "fifo"} def test_basic_registration() -> None: my_registry = Registry("registry_name") @my_registry.register("awesome_class_or_func") def my_awesome_class_or_func(param): pass assert "awesome_class_or_func" in my_registry assert "awesome_class_or_func(param=value)" in my_registry ================================================ FILE: corenet/utils/resources.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # try: from corenet.internal.utils.resources import cpu_count except ImportError: from multiprocessing import cpu_count __all__ = ["cpu_count"] ================================================ FILE: corenet/utils/retry_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import random import time from typing import Any, Callable, Dict, List, Optional from corenet.utils import logger def run_with_retries( fn: Callable, max_retries: int, args: Optional[List] = None, kwargs: Optional[Dict] = None, function_name: Optional[str] = None, ) -> Any: """Runs a function with retries (using exponential backoff method) on failure. Args: fn: Function to run. max_retries: Maximum number of attempts before giving up. args: Args to be passed to the @fn as *args. Defaults to None that translates to empty args. kwargs: Kwargs to be passed to the @fn as **kwargs. Defaults to None that translates to empty kwargs. function_name: A label for the task that @fn performs, to be used in warning and error messages. Defaults to None that translates to "run {fn.__name__}". Returns: The value the @fn returns. """ if args is None: args = [] if kwargs is None: kwargs = {} if function_name is None: function_name = f"run {fn.__name__}" for attempt in range(max_retries - 1): try: return fn(*args, **kwargs) except Exception as e: wait_duration = 2**attempt * random.uniform(0.5, 1.0) logger.warning( f"Failed to {function_name} at attempt {attempt+1}/" f"{max_retries} with error {e}; retrying in {wait_duration} seconds." ) time.sleep(wait_duration) try: return fn(*args, **kwargs) except Exception as e: raise RuntimeError( f"Unable to {function_name} after {max_retries} attempts with error {e}." ) from e ================================================ FILE: corenet/utils/tensor_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict, List, Optional, Tuple, Union import numpy as np import torch from torch import Tensor from torch import distributed as dist from torch.distributed.nn import all_gather as all_gather_with_backward from corenet.constants import ( DEFAULT_IMAGE_CHANNELS, DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH, DEFAULT_VIDEO_FRAMES, ) def image_size_from_opts(opts) -> Tuple[int, int]: try: sampler_name = getattr(opts, "sampler.name", "variable_batch_sampler").lower() if sampler_name.find("var") > -1: im_w = getattr(opts, "sampler.vbs.crop_size_width", DEFAULT_IMAGE_WIDTH) im_h = getattr(opts, "sampler.vbs.crop_size_height", DEFAULT_IMAGE_HEIGHT) elif sampler_name.find("multi") > -1: im_w = getattr(opts, "sampler.msc.crop_size_width", DEFAULT_IMAGE_WIDTH) im_h = getattr(opts, "sampler.msc.crop_size_height", DEFAULT_IMAGE_HEIGHT) else: im_w = getattr(opts, "sampler.bs.crop_size_width", DEFAULT_IMAGE_WIDTH) im_h = getattr(opts, "sampler.bs.crop_size_height", DEFAULT_IMAGE_HEIGHT) except Exception as e: im_h = DEFAULT_IMAGE_HEIGHT im_w = DEFAULT_IMAGE_WIDTH return im_h, im_w def video_size_from_opts(opts) -> Tuple[int, int, int]: try: sampler_name = getattr(opts, "sampler.name", "video_batch_sampler").lower() if sampler_name.find("var") > -1: im_w = getattr(opts, "sampler.vbs.crop_size_width", DEFAULT_IMAGE_WIDTH) im_h = getattr(opts, "sampler.vbs.crop_size_height", DEFAULT_IMAGE_HEIGHT) n_frames = getattr( opts, "sampler.vbs.num_frames_per_clip", DEFAULT_IMAGE_HEIGHT ) else: im_w = getattr(opts, "sampler.bs.crop_size_width", DEFAULT_IMAGE_WIDTH) im_h = getattr(opts, "sampler.bs.crop_size_height", DEFAULT_IMAGE_HEIGHT) n_frames = getattr( opts, "sampler.bs.num_frames_per_clip", DEFAULT_IMAGE_HEIGHT ) except Exception as e: im_h = DEFAULT_IMAGE_HEIGHT im_w = DEFAULT_IMAGE_WIDTH n_frames = DEFAULT_VIDEO_FRAMES return im_h, im_w, n_frames def create_rand_tensor( opts, device: Optional[str] = "cpu", batch_size: Optional[int] = 1 ) -> Tensor: sampler = getattr(opts, "sampler.name", "batch_sampler") if sampler.lower().find("video") > -1: video_stack = getattr(opts, "video_reader.frame_stack_format", "channel_first") im_h, im_w, n_frames = video_size_from_opts(opts=opts) if video_stack == "channel_first": inp_tensor = torch.randint( low=0, high=255, size=(batch_size, DEFAULT_IMAGE_CHANNELS, n_frames, im_h, im_w), device=device, ) else: inp_tensor = torch.randint( low=0, high=255, size=(batch_size, n_frames, DEFAULT_IMAGE_CHANNELS, im_h, im_w), device=device, ) else: im_h, im_w = image_size_from_opts(opts=opts) inp_tensor = torch.randint( low=0, high=255, size=(batch_size, DEFAULT_IMAGE_CHANNELS, im_h, im_w), device=device, ) inp_tensor = inp_tensor.float().div(255.0) return inp_tensor def reduce_tensor(inp_tensor: torch.Tensor) -> torch.Tensor: size = dist.get_world_size() if dist.is_initialized() else 1 inp_tensor_clone = inp_tensor.clone().detach() # dist_barrier() dist.all_reduce(inp_tensor_clone, op=dist.ReduceOp.SUM) inp_tensor_clone /= size return inp_tensor_clone def reduce_tensor_sum(inp_tensor: torch.Tensor) -> torch.Tensor: inp_tensor_clone = inp_tensor.clone().detach() # dist_barrier() dist.all_reduce(inp_tensor_clone, op=dist.ReduceOp.SUM) return inp_tensor_clone def all_gather_list(data: Union[List, Tensor, Dict[str, Tensor]]): world_size = dist.get_world_size() data_list = [None] * world_size # dist_barrier() dist.all_gather_object(data_list, data) return data_list def gather_all_features(features: Tensor, dim=0): return torch.cat(all_gather_with_backward(features), dim=dim) # world_size = dist.get_world_size() # gathered_data = [torch.zeros_like(features)] * world_size # dist.all_gather(gathered_data, features) # gathered_data = torch.cat(gathered_data, dim=dim) # return gathered_data def tensor_to_python_float( inp_tensor: Union[int, float, torch.Tensor], is_distributed: bool, reduce_op: str = "mean", ) -> Union[int, float, np.ndarray]: """ Given a number or a Tensor (potentially in distributed setting) returns the float value. If is_distributed is true, the Tensor must be aggregated first. Args: inp_tensor: the input tensor is_distributed: indicates whether we are in distributed mode reduce_op: reduce operation for aggregation If equals to mean, will reduce using mean, otherwise sum operation """ if is_distributed and isinstance(inp_tensor, torch.Tensor): if reduce_op == "mean": inp_tensor = reduce_tensor(inp_tensor=inp_tensor) else: inp_tensor = reduce_tensor_sum(inp_tensor=inp_tensor) if isinstance(inp_tensor, torch.Tensor) and inp_tensor.numel() > 1: # For IOU, we get a C-dimensional tensor (C - number of classes) # so, we convert here to a numpy array return inp_tensor.cpu().numpy() elif hasattr(inp_tensor, "item"): return inp_tensor.item() elif isinstance(inp_tensor, (int, float)): return inp_tensor * 1.0 else: raise NotImplementedError( "The data type is not supported yet in tensor_to_python_float function" ) def to_numpy(img_tensor: torch.Tensor) -> np.ndarray: # [0, 1] --> [0, 255] img_tensor = torch.mul(img_tensor, 255.0) # BCHW --> BHWC img_tensor = img_tensor.permute(0, 2, 3, 1) img_np = img_tensor.byte().cpu().numpy() return img_np ================================================ FILE: corenet/utils/visualization_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import copy import random import sys from typing import List, Optional from torch import Tensor try: import cv2 FONT_SIZE = cv2.FONT_HERSHEY_PLAIN except ImportError: FONT_SIZE = None import numpy as np from matplotlib.colors import hsv_to_rgb from torch import Tensor from corenet.utils import logger from corenet.utils.color_map import Colormap LABEL_COLOR = [255, 255, 255] TEXT_THICKNESS = 1 RECT_BORDER_THICKNESS = 2 def visualize_boxes_xyxy(image: np.ndarray, boxes: np.ndarray) -> np.ndarray: """Utility function to draw bounding boxes of objects on a given image""" if "cv2" not in sys.modules: logger.error( "OpenCV is an optional dependency. Please run pip install opencv-contrib-python==4.5.5.64." ) boxes = boxes.astype(np.int) new_image = copy.deepcopy(image) for box_idx in range(boxes.shape[0]): coords = boxes[box_idx] r, g, b = 255, 0, 0 # top -left corner start_coord = (coords[0], coords[1]) # bottom-right corner end_coord = (coords[2], coords[3]) cv2.rectangle(new_image, end_coord, start_coord, (r, g, b), thickness=1) return new_image def create_colored_mask( mask: np.ndarray, num_classes: int, *args, **kwargs ) -> np.ndarray: """Create a colored mask with random colors""" colored_mask = np.ones((mask.shape[0], mask.shape[1], 3), dtype=np.uint8) # 0 for background. random_hue = random.randint(1, num_classes) random_mask_color = hsv_to_rgb((random_hue / num_classes, 0.75, 0.75)) colored_mask[..., :] = [int(c * 255.0) for c in random_mask_color] colored_mask *= mask[..., None] return colored_mask def draw_bounding_boxes( image: np.ndarray, boxes: np.ndarray, labels: np.ndarray, scores: np.ndarray, masks: Optional[np.ndarray] = None, color_map: Optional = None, object_names: Optional[List] = None, is_bgr_format: Optional[bool] = False, save_path: Optional[str] = None, num_classes: Optional[int] = 81, ) -> None: """Utility function to draw bounding boxes of objects along with their labels and score on a given image""" if "cv2" not in sys.modules: logger.error( "OpenCV is an optional dependency. Please run pip install opencv-contrib-python==4.5.5.64." ) boxes = boxes.astype(int) if is_bgr_format: # convert from BGR to RGB colorspace image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) if color_map is None: color_map = Colormap().get_box_color_codes() if masks is None: masks = [None] * len(boxes) for label, score, coords, mask in zip(labels, scores, boxes, masks): r, g, b = color_map[label] c1 = (coords[0], coords[1]) c2 = (coords[2], coords[3]) if mask is not None: mask = create_colored_mask(mask=mask, num_classes=num_classes) image = cv2.addWeighted(image, 1.0, mask, 1.0, gamma=0.0) cv2.rectangle(image, c1, c2, (r, g, b), thickness=RECT_BORDER_THICKNESS) if object_names is not None: label_text = "{label}: {score:.2f}".format( label=object_names[label], score=score ) t_size = cv2.getTextSize(label_text, FONT_SIZE, 1, TEXT_THICKNESS)[0] new_c2 = c1[0] + t_size[0] + 3, c1[1] + t_size[1] + 4 cv2.rectangle(image, c1, new_c2, (r, g, b), -1) cv2.putText( image, label_text, (c1[0], c1[1] + t_size[1] + 4), FONT_SIZE, 1, LABEL_COLOR, TEXT_THICKNESS, ) if save_path is not None: cv2.imwrite(save_path, image) logger.log("Detection results stored at: {}".format(save_path)) return image def convert_to_cityscape_format(img: Tensor) -> Tensor: """Utility to map predicted segmentation labels to cityscapes format""" img[img == 19] = 255 img[img == 18] = 33 img[img == 17] = 32 img[img == 16] = 31 img[img == 15] = 28 img[img == 14] = 27 img[img == 13] = 26 img[img == 12] = 25 img[img == 11] = 24 img[img == 10] = 23 img[img == 9] = 22 img[img == 8] = 21 img[img == 7] = 20 img[img == 6] = 19 img[img == 5] = 17 img[img == 4] = 13 img[img == 3] = 12 img[img == 2] = 11 img[img == 1] = 8 img[img == 0] = 7 img[img == 255] = 0 return img ================================================ FILE: mlx_examples/clip/README.md ================================================ # MLX port of CLIP This is an example to convert CoreNet's CLIP model implementation to [MLX](https://github.com/ml-explore/mlx)'s CLIP example with some customized modification. MLX is a machine learning framework that provides native Apple Silicon hardware support. ## Conversion To convert an example CoreNet's CLIP model to the example MLX CLIP using the files in this directory: ```bash cd mlx_examples/clip/ # Install required dependencies # We assume that the main requirements.txt is already installed. pip install -r requirements.txt # Convert the model python main_clip_to_mlx.py \ --common.config-file "../../projects/range_augment/clip/clip_vit_base.yaml" \ --model.multi-modal-image-text.pretrained https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt \ --common.results-loc results/mlx_model/ # Try example inference python clip.py ``` ## Benchmarking results Comparing to PyTorch, given the input as `["a photo of cat", "a photo of dog"]` prompt and the `assets/{cat,dog}.jpeg` images. The results are the following on a M2 Ultra: | Model | PyTorch time 100iters (s) | MLX time 100iters (s) | Speedup (%) | | :-----| :----------------------------- | :------------------------- | :---------- | | FP16 Base variant | 2.7322 | 1.0743 | 60.68% | | FP16 Huge variant | 4.9098 | 4.3189 | 12.04% | ================================================ FILE: mlx_examples/clip/__init__.py ================================================ ================================================ FILE: mlx_examples/clip/clip.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/image_processor.py # with modifications about imports and default model loading location. import os from typing import Tuple import mlx.core as mx from image_processor import CLIPImageProcessor from model import CLIPModel from PIL import Image from tokenizer import CLIPTokenizer def load(model_dir: str) -> Tuple[CLIPModel, CLIPTokenizer, CLIPImageProcessor]: model = CLIPModel.from_pretrained(model_dir) tokenizer = CLIPTokenizer.from_pretrained(model_dir) img_processor = CLIPImageProcessor.from_pretrained(model_dir) return model, tokenizer, img_processor def main() -> None: example_class_names = ["cat", "dog"] model, tokenizer, img_processor = load("results/mlx_model") assert os.getcwd().endswith( "mlx_examples/clip" ), "Please run this script from 'mlx_examples/clip' folder." inputs = { "input_ids": tokenizer( [f"a photo of a {class_name}" for class_name in example_class_names] ), "pixel_values": img_processor( [ Image.open(f"../../assets/{class_name}.jpeg") for class_name in example_class_names ] ), } output = model(**inputs) # Get text and image embeddings: text_embeds = output.text_embeds image_embeds = output.image_embeds logits = image_embeds @ text_embeds.T logits = mx.softmax(logits, axis=-1) predicted_class_prob = mx.max(logits, axis=-1).tolist() predicted_class_id = mx.argmax(logits, axis=-1).tolist() for batch_id in range(len(predicted_class_prob)): print( f"Predicted class for sample {batch_id} is" f" {example_class_names[predicted_class_id[batch_id]]} " f"p=({predicted_class_prob[batch_id]:.3f})" ) if __name__ == "__main__": main() ================================================ FILE: mlx_examples/clip/image_processor.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/image_processor.py # with modifications about doc-string and typing. import json from pathlib import Path from typing import List, Tuple import mlx.core as mx import numpy as np from PIL.Image import Image class CLIPImageProcessor: """Constructs an image processor that converts a PIL image into MX array. A simple port of https://github.com/huggingface/transformers/blob/main/src/transformers/models/clip/image_processing_clip.py. """ def __init__( self, crop_size: int = 224, do_center_crop: bool = True, do_normalize: bool = True, do_resize: bool = True, image_mean: List[float] = [0.48145466, 0.4578275, 0.40821073], image_std: List[float] = [0.26862954, 0.26130258, 0.27577711], size: int = 224, **kwargs ) -> None: self.crop_size = crop_size self.do_center_crop = do_center_crop self.do_normalize = do_normalize self.do_resize = do_resize self.image_mean = mx.array(image_mean) self.image_std = mx.array(image_std) self.size = size def __call__(self, images: List[Image]) -> mx.array: return mx.concatenate( [self._preprocess(image)[None] for image in images], axis=0 ) def _preprocess(self, image: Image) -> mx.array: if self.do_resize: image = resize(image, self.size) if self.do_center_crop: image = center_crop(image, (self.crop_size, self.crop_size)) image = mx.array(np.array(image)) image = rescale(image) if self.do_normalize: image = normalize(image, self.image_mean, self.image_std) return image @staticmethod def from_pretrained(path: str) -> "CLIPImageProcessor": path = Path(path) with open(path / "preprocessor_config.json", encoding="utf-8") as f: config = json.load(f) return CLIPImageProcessor(**config) def resize(image: Image, short_size: int) -> Image: """ Resize image to short_size. """ width, height = image.size short = min(width, height) long = max(width, height) if short == short_size: return image new_short = short_size new_long = int(short_size * long / short) new_size = (new_short, new_long) if width <= height else (new_long, new_short) return image.resize(new_size) def center_crop(image: Image, size: Tuple[int, int]) -> Image: """ Perform a crop of a image in the center of given size. """ if size[0] % 2 != 0 or size[1] % 2 != 0: raise ValueError("Only even crop sizes supported.") original_width, original_height = image.size crop_height, crop_width = size top = (original_height - crop_height) // 2 bottom = top + crop_height left = (original_width - crop_width) // 2 right = left + crop_width return image.crop((left, top, right, bottom)) def rescale(image: mx.array) -> mx.array: """Rescale an image to 0.0-1.0 region""" return image.astype(mx.float32) * (1 / 255.0) def normalize(image: mx.array, mean: mx.array, std: mx.array) -> mx.array: """Normalize an image with given mean and standard deviation""" return (image - mean) / std ================================================ FILE: mlx_examples/clip/main_clip_to_mlx.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import json import platform import shutil from pathlib import Path from typing import Any, Dict, List, Union try: import mlx.core as mx from huggingface_hub import snapshot_download except ModuleNotFoundError: pass import numpy as np import torch from corenet.constants import TMP_RES_FOLDER from corenet.modeling import get_model from corenet.modeling.models.classification.config.vit import get_configuration from corenet.options.opts import get_training_arguments from corenet.utils import logger from corenet.utils.import_utils import ensure_library_is_available def is_apple_silicon_macos() -> bool: return platform.machine() == "arm64" and platform.system() == "Darwin" def mlx_naming_remap(corenet_k: str) -> str: """Translate CoreNet's CLIP weight mapping to MLX's naming scheme. Args: a single string represents the name of the parameter from CoreNet's state dict. Returns: a remapped string that will be honored by the MLX CLIP example. """ trivial_mapping = { "text_encoder": "text_model", "image_encoder": "vision_model", "transformer": "encoder.layers", "positional_embedding.pos_embed.pos_embed": "embeddings.position_embedding.weight", "embedding_layer.weight": "embeddings.token_embedding.weight", "pre_norm_ffn.0": "layer_norm2", # NOTE: pre_norm_ffn.{2, 3} are act layer that do not have weights, and dropout layer, # it will not be part of the state dict. "pre_norm_ffn.1": "mlp.fc1", "pre_norm_ffn.4": "mlp.fc2", "pre_norm_mha.0": "layer_norm1", "pre_norm_mha.1.out_proj": "self_attn.out_proj", "pre_norm_mha.1": "self_attn", "cls_token": "embeddings.class_embedding", "post_encoder.layers_norm": "post_layernorm", "pos_embed.pos_embed.pos_embed": "embeddings.position_embedding.weight", "patch_emb.0.block.conv.weight": "embeddings.patch_embedding.layers.0.weight", "patch_emb.0.block.norm.bias": "embeddings.patch_embedding.layers.1.bias", "patch_emb.0.block.norm.running_mean": "embeddings.patch_embedding.layers.1.running_mean", "patch_emb.0.block.norm.running_var": "embeddings.patch_embedding.layers.1.running_var", "patch_emb.0.block.norm.weight": "embeddings.patch_embedding.layers.1.weight", "patch_emb.1.block.conv.weight": "embeddings.patch_embedding.layers.3.weight", "patch_emb.1.block.norm.bias": "embeddings.patch_embedding.layers.4.bias", "patch_emb.1.block.norm.running_mean": "embeddings.patch_embedding.layers.4.running_mean", "patch_emb.1.block.norm.running_var": "embeddings.patch_embedding.layers.4.running_var", "patch_emb.1.block.norm.weight": "embeddings.patch_embedding.layers.4.weight", "patch_emb.2.block.conv.weight": "embeddings.patch_embedding.layers.6.weight", "patch_emb.2.block.conv.bias": "embeddings.patch_embedding.layers.6.bias", } for k, v in trivial_mapping.items(): if k in corenet_k: corenet_k = corenet_k.replace(k, v) # Depended on the trivial mapping to be done. non_trivial_mapping = { "text_model.projection_layer": "text_projection.weight", "vision_model.classifier.proj": "visual_projection.weight", } for k, v in non_trivial_mapping.items(): if k in corenet_k: corenet_k = corenet_k.replace(k, v) return corenet_k def make_shards( weights: Dict[str, Any], *, max_file_size_gb: int ) -> List[Dict[str, Any]]: """Split weights into separate shards given @max_file_size_gb limits for each shard. Each shard contains a mapping between the tensor name and its weights. """ max_file_size_bytes = max_file_size_gb << 30 shards = [] shard, shard_size = {}, 0 for k, v in weights.items(): if shard_size + v.nbytes > max_file_size_bytes: shards.append(shard) shard, shard_size = {}, 0 shard[k] = v shard_size += v.nbytes shards.append(shard) return shards def save_weights(save_path: Union[str, Path], weights: Dict[str, Any]) -> None: """Save model weights into specified directory with MLX's safetensors format. Provide the given @weights, it will save it in MLX's safetensors format to @save_path. Shards will be created in 5GB chunk. """ if isinstance(save_path, str): save_path = Path(save_path) save_path.mkdir(parents=True, exist_ok=True) shards = make_shards(weights, max_file_size_gb=5) shards_count = len(shards) shard_file_format = ( "model-{:05d}-of-{:05d}.safetensors" if shards_count > 1 else "model.safetensors" ) total_byte_size = sum(v.nbytes for v in weights.values()) # A json string that will encode the tensor info. index_data = { "metadata": {"total_size": total_byte_size}, # Provide the total size # Provide the mapping between weight tensor's name and the shard it # was put to. "weight_map": {}, } # Partition weights into shard for i, shard in enumerate(shards): shard_name = shard_file_format.format(i + 1, shards_count) shard_path = save_path / shard_name # Save the tensor mx.save_safetensors(str(shard_path), shard) for weight_name in shard.keys(): index_data["weight_map"][weight_name] = shard_name # Sort index_data["weight_map"] = { k: index_data["weight_map"][k] for k in sorted(index_data["weight_map"]) } # Save the index. with open(save_path / "model.safetensors.index.json", "w") as f: json.dump( index_data, f, indent=4, ) def get_hf_clip_model_path() -> Path: """Get the configuration files and vocab using OpenAI's clip model, since MLX digests the model configurations and vocab through those files. We will need to modify the preprocessing and config, so it matches the definition of CoreNet's CLIP base's/huge's implementation. """ HF_REPO = "openai/clip-vit-base-patch32" model_path = Path( snapshot_download( repo_id=HF_REPO, allow_patterns=[ "*.json", "*.txt", ], ) ) return model_path def ascontiguousarray(mx_array: mx.array) -> mx.array: """Convert a mx array to a contiguous mx array""" # save_safetensors requires row_contiguous array (mlx==0.8.1), while mlx does # not provide the API to do that, which we could only convert to numpy and and # copy back to mlx to achieve this. # This is expensive, but currently there are no way around it. # TODO(Frank): revisit to see if newer version of mlx will have # `ascontiguousarray` exposed. np_arr = np.ascontiguousarray(np.array(mx_array)) return mx.array(np_arr, dtype=mx_array.dtype) def sanitize(state_dict: Dict[str, mx.array]) -> Dict[str, mx.array]: """Perform some cleaning and transformations so MLX could load the sanitized weights faithfully under `strict=True` mode. """ new_state_dict = {} for k, v in state_dict.items(): if k in [ "text_model.embeddings.position_embedding.weight", "vision_model.embeddings.position_embedding.weight", "vision_model.embeddings.class_embedding", ]: new_state_dict[k] = ascontiguousarray(v.squeeze(0).squeeze(0)) elif k in ["visual_projection.weight", "text_projection.weight"]: # NOTE: There are more weights require transposition, but they will be # handled within MLX's `sanitize` function, similar to how OpenAI's # code was ported: # https://github.com/ml-explore/mlx-examples/blob/main/clip/model.py#L412 new_state_dict[k] = ascontiguousarray(v.T) elif "qkv_proj" in k: q_proj_name = k.replace("qkv_proj", "q_proj") k_proj_name = k.replace("qkv_proj", "k_proj") v_proj_name = k.replace("qkv_proj", "v_proj") dim_size = v.shape[0] // 3 if v.ndim == 1: # Bias new_state_dict[q_proj_name] = ascontiguousarray(v[0:dim_size]) new_state_dict[k_proj_name] = ascontiguousarray( v[dim_size : 2 * dim_size] ) new_state_dict[v_proj_name] = ascontiguousarray(v[2 * dim_size :]) else: # Weights new_state_dict[q_proj_name] = ascontiguousarray(v[0:dim_size, :]) new_state_dict[k_proj_name] = ascontiguousarray( v[dim_size : 2 * dim_size, :] ) new_state_dict[v_proj_name] = ascontiguousarray(v[2 * dim_size :, :]) elif "num_batches_tracked" in k or "neural_augmentor" in k: # parameters we don't need for the conversion continue else: new_state_dict[k] = v return new_state_dict def torch_to_mx(a: torch.Tensor, *, dtype: str) -> mx.array: """Convert torch tensor to MLX tensor""" # bfloat16 is not numpy convertible. Upcast to float32 to avoid precision loss a = a.to(torch.float32) if dtype == "bfloat16" else a.to(getattr(torch, dtype)) return mx.array(a.numpy(), getattr(mx, dtype)) def main() -> None: if not is_apple_silicon_macos(): raise ValueError( "Expected to install MLX dependencies while on non-Apple Silicon MacOS. " "MLX is only available on Apple Silicon MacOS" ) ensure_library_is_available("mlx") ensure_library_is_available("huggingface_hub") opts = get_training_arguments() pretrained_ckpt_loc = getattr(opts, "model.multi_modal_image_text.pretrained") config_file = getattr(opts, "common.config_file") logger.info(f"Loading config: {config_file} with ckpt: {pretrained_ckpt_loc}") model = get_model(opts) results_folder = getattr(opts, "common.results_loc") results_path = Path(results_folder) if results_path.is_file(): raise ValueError( f"Result location specified is a regular file: {results_folder}" ) results_path.mkdir(parents=True, exist_ok=True) logger.info(f"Save converted model to path: {results_folder}") logger.info("Converting") state_dict = model.state_dict() mlx_weights = { mlx_naming_remap(k): torch_to_mx(v, dtype="float32") for k, v in state_dict.items() } mlx_weights = sanitize(mlx_weights) logger.info("Saving weights") save_weights(results_path, mlx_weights) logger.info("Saving configs") hf_path = get_hf_clip_model_path() # Direct copy for fn in ["merges.txt", "vocab.json"]: shutil.copyfile( str(hf_path / f"{fn}"), str(results_path / f"{fn}"), ) # Save the configuration about the input preprocessing. with open(str(hf_path / "preprocessor_config.json"), "r") as f: preprocessor_config = json.load(f) # 1. Set `do_normalize` to `false`. preprocessor_config["do_normalize"] = False # 2. Add entry `"use_clip_corenet_variant": true` preprocessor_config["use_clip_corenet_variant"] = True with open(str(results_path / "preprocessor_config.json"), "w") as f: json.dump(preprocessor_config, f, indent=2) vit_config = get_configuration(opts) text_n_header_per_layer = getattr(opts, "model.text.transformer.n_heads_per_layer") text_model_dim = getattr(opts, "model.text.transformer.model_dim") # Convert our yaml file to HF style config for model architecture. with open(str(hf_path / "config.json"), "r") as f: config = json.load(f) # 1. `"model_type": "clip_corenet",` (originally configured as `"clip"`) config["model_type"] = "clip_corenet" # 2. `"hidden_act": "gelu",` (originally configured as `"quick_gelu"`) config["text_config"]["hidden_act"] = "gelu" config["vision_config"]["hidden_act"] = "gelu" # 3. `"layer_norm_eps": 1e-06,` (originally configured as `1e-05`) config["text_config"]["layer_norm_eps"] = 1e-06 config["vision_config"]["layer_norm_eps"] = 1e-06 # 4. `"patch_size": 16,` (originally configured as `32`) config["vision_config"]["patch_size"] = 16 # 5. `"num_attention_heads": 8/16` for `"text_config"` depending on base/huge model config["text_config"]["num_attention_heads"] = text_n_header_per_layer # 6. Configure the text's dimension since base/huge variant has different cfg config["text_config"]["hidden_size"] = text_model_dim config["text_config"]["intermediate_size"] = text_model_dim * 4 # 7. Configure the vision's parameters since base/huge variant has different cfg config["vision_config"]["hidden_size"] = vit_config["embed_dim"] config["vision_config"]["num_attention_heads"] = vit_config["n_attn_heads"] config["vision_config"]["intermediate_size"] = vit_config["ffn_dim"] config["vision_config"]["num_hidden_layers"] = vit_config[ "n_transformer_layers" ] with open(str(results_path / "config.json"), "w") as f: json.dump(config, f, indent=2) logger.info("Done") if __name__ == "__main__": main() ================================================ FILE: mlx_examples/clip/main_test_clip_mlx.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """ Test that MLX output match with CoreNet's output. The test requires a conversion using `main_clip_to_mlx.py` script to dump the converted model to `results/mlx_model/` directory Example invocation: python main_test_clip_mlx.py \ --common.config-file "../../projects/range_augment/clip/clip_vit_base.yaml" \ --model.multi-modal-image-text.pretrained https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt """ import argparse from os import path from typing import Dict, List, Tuple try: import mlx.core as mx except ModuleNotFoundError: pass import numpy as np import torch # Clip specific from model import CLIPModel, CLIPModelOutput from PIL import Image from torchvision.transforms import CenterCrop, Compose, Resize, ToTensor # CoreNet specific from corenet.data.text_tokenizer import build_tokenizer from corenet.modeling.models import get_model from corenet.modeling.models.base_model import BaseAnyNNModel from corenet.options.opts import get_training_arguments from corenet.utils import logger from corenet.utils.import_utils import ensure_library_is_available def load_mlx_model(model_dir: str) -> CLIPModel: """Load the MLX model from @model_dir""" if not path.exists(model_dir): raise ValueError(f"Model does not exist at: {model_dir}") model = CLIPModel.from_pretrained(model_dir) return model def get_mlx_output( tokenized_input_ids: mx.array, pixel_values: mx.array ) -> CLIPModelOutput: """Load the MLX model and get the forward output given the inputs""" model = load_mlx_model("results/mlx_model") model.eval() inputs = { "input_ids": tokenized_input_ids, "pixel_values": pixel_values, } return model(**inputs) def transform_image(img: Image.Image, size: int = 224) -> torch.Tensor: """Convert the PIL image to Tensor with pre-processing.""" input_image_transform = Compose( [Resize(size=size), CenterCrop(size=size), ToTensor()] ) input_img_tensor = input_image_transform(img) return input_img_tensor def text_transform(tokeized_text_tensor: torch.Tensor) -> torch.Tensor: """Transform the text. No need to transform the text given the example. """ return tokeized_text_tensor def get_tokenized_input( opts: argparse.Namespace, class_names: List[str] ) -> torch.Tensor: """Build the tokenizer and get the tokenized input.""" text_tokenizer = build_tokenizer(opts) input_text_templates = [ "a photo of a {}".format(class_name) for class_name in class_names ] input_tokenized_templates = [ text_transform(text_tokenizer(inp_template)) for inp_template in input_text_templates ] input_tokenized_templates = torch.stack(input_tokenized_templates, dim=0) return input_tokenized_templates def get_preprocessed_img(class_names: List[str]) -> torch.Tensor: """Build the image process pipeline and get preprocessed image.""" input_img_batch = [] for class_name in class_names: input_img = Image.open(f"assets/{class_name}.jpeg").convert("RGB") input_img_tensor = transform_image(input_img) input_img_batch.append(input_img_tensor) # stack input images to form a batch input_img_batch = torch.stack(input_img_batch, dim=0) return input_img_batch def get_input_images_and_tokenized_text( opts: argparse.Namespace, class_names: List[str] ) -> Tuple[torch.Tensor, torch.Tensor]: """Get the example pre-processed/tokenized text/images""" torch_images = get_preprocessed_img(class_names) torch_tokens = get_tokenized_input(opts, class_names) return torch_tokens, torch_images def get_torch_output( opts: argparse.Namespace, torch_tokens: torch.Tensor, torch_images: torch.Tensor, ) -> Dict[str, torch.Tensor]: """Perform the forward function and get the result given tokens and images""" mps_device = torch.device("mps") logger.disable_printing() clip_model = get_model(opts) clip_model.to(torch.float32).to(mps_device) clip_model.eval() logger.enable_printing() return clip_model.forward( input={ "text": torch_tokens.to(mps_device), "image": torch_images.to(mps_device), } ) def torch_to_mx(a: torch.Tensor, *, dtype: str) -> mx.array: """Convert torch tensor to MLX tensor""" # bfloat16 is not numpy convertible. Upcast to float32 to avoid precision loss a = a.to(torch.float32) if dtype == "bfloat16" else a.to(getattr(torch, dtype)) return mx.array(a.numpy(), getattr(mx, dtype)) def main_test() -> None: ensure_library_is_available("mlx") class_names = ["cat", "dog"] opts = get_training_arguments() torch_tokens, torch_images = get_input_images_and_tokenized_text(opts, class_names) torch_output = get_torch_output(opts, torch_tokens, torch_images) mlx_output = get_mlx_output( tokenized_input_ids=torch_to_mx(torch_tokens, dtype="int32"), pixel_values=torch_to_mx(torch_images, dtype="float32").transpose((0, 2, 3, 1)), ) assert np.all( np.argmax(mlx_output.text_embeds, axis=1) == torch.argmax(torch_output["text"], axis=1).cpu().numpy() ) assert np.all( np.argmax(mlx_output.image_embeds, axis=1) == torch.argmax(torch_output["image"], axis=1).cpu().numpy() ) logger.info("Results matched.") if __name__ == "__main__": main_test() ================================================ FILE: mlx_examples/clip/model.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/model.py # with modifications. import glob import json import logging import math import re from dataclasses import dataclass from pathlib import Path from typing import Callable, Dict, Optional, Union import mlx.core as mx import mlx.nn as nn from mlx.core import linalg as LA from mlx.nn.losses import cross_entropy @dataclass class CLIPVisionOutput: pooler_output: mx.array last_hidden_state: mx.array hidden_states: Optional[mx.array] @dataclass class CLIPTextOutput: pooler_output: mx.array last_hidden_state: mx.array @dataclass class CLIPModelOutput: loss: Optional[mx.array] text_embeds: Optional[mx.array] image_embeds: Optional[mx.array] text_model_output: CLIPTextOutput vision_model_output: CLIPVisionOutput @dataclass class CLIPTextConfig: num_hidden_layers: int hidden_size: int # equivalent to embedding dimension intermediate_size: int # equivalent to d_ffn num_attention_heads: int max_position_embeddings: int vocab_size: int layer_norm_eps: float hidden_act: str use_clip_corenet_variant: bool @dataclass class CLIPVisionConfig: num_hidden_layers: int hidden_size: int intermediate_size: int num_attention_heads: int num_channels: int image_size: int patch_size: int layer_norm_eps: float hidden_act: str use_clip_corenet_variant: bool @dataclass class CLIPConfig: text_config: CLIPTextConfig vision_config: CLIPVisionConfig projection_dim: int use_clip_corenet_variant: bool def quick_gelu(x: mx.array) -> mx.array: """ A fast GELU approximation https://github.com/hendrycks/GELUs """ return x * mx.sigmoid(1.702 * x) def get_hidden_act( config: Union[CLIPTextConfig, CLIPVisionConfig] ) -> Callable[[mx.array], mx.array]: """Get attention based on the configuration""" if config.hidden_act == "quick_gelu": return quick_gelu elif config.hidden_act == "gelu": return nn.gelu else: raise ValueError(f"Unknown hidden act: {config.hidden_act}.") def clip_loss(logits: mx.array) -> mx.array: """Get the clip loss""" N, M = logits.shape caption_loss = cross_entropy(logits, mx.arange(N), reduction="mean") image_loss = cross_entropy(logits.T, mx.arange(M), reduction="mean") return (caption_loss + image_loss) / 2.0 class Attention(nn.Module): """Implements the attention layer""" def __init__( self, dims: int, num_heads: int, query_input_dims: Optional[int] = None, key_input_dims: Optional[int] = None, value_input_dims: Optional[int] = None, value_dims: Optional[int] = None, value_output_dims: Optional[int] = None, bias: bool = False, ) -> None: super().__init__() if (dims % num_heads) != 0: raise ValueError( "The input feature dimensions should be divisible by the " f"number of heads ({dims} % {num_heads}) != 0" ) query_input_dims = query_input_dims or dims key_input_dims = key_input_dims or dims value_input_dims = value_input_dims or key_input_dims value_dims = value_dims or dims value_output_dims = value_output_dims or dims self.num_heads = num_heads self.q_proj = nn.Linear(query_input_dims, dims, bias=bias) self.k_proj = nn.Linear(key_input_dims, dims, bias=bias) self.v_proj = nn.Linear(value_input_dims, value_dims, bias=bias) self.out_proj = nn.Linear(value_dims, value_output_dims, bias=bias) def __call__( self, queries: mx.array, keys: mx.array, values: mx.array, mask: Optional[mx.array] = None, ) -> mx.array: queries = self.q_proj(queries) keys = self.k_proj(keys) values = self.v_proj(values) num_heads = self.num_heads B, L, D = queries.shape _, S, _ = keys.shape queries = queries.reshape(B, L, num_heads, -1).transpose(0, 2, 1, 3) keys = keys.reshape(B, S, num_heads, -1).transpose(0, 2, 3, 1) values = values.reshape(B, S, num_heads, -1).transpose(0, 2, 1, 3) scale = math.sqrt(1 / queries.shape[-1]) scores = (queries * scale) @ keys if mask is not None: scores = scores + mask.astype(scores.dtype) scores = mx.softmax(scores, axis=-1) values_hat = (scores @ values).transpose(0, 2, 1, 3).reshape(B, L, -1) return self.out_proj(values_hat) class MLP(nn.Module): """Implements the MLP layer""" def __init__(self, config: CLIPTextConfig) -> None: super().__init__() self.config = config self.activation_fn = get_hidden_act(config) self.fc1 = nn.Linear(config.hidden_size, config.intermediate_size) self.fc2 = nn.Linear(config.intermediate_size, config.hidden_size) def __call__(self, x: mx.array) -> mx.array: x = self.activation_fn(self.fc1(x)) x = self.fc2(x) return x class EncoderLayer(nn.Module): """The transformer encoder layer from CLIP.""" def __init__(self, config: CLIPTextConfig) -> None: super().__init__() self.embed_dim = config.hidden_size # Add biases to the attention projections self.self_attn = Attention( config.hidden_size, config.num_attention_heads, bias=True ) self.layer_norm1 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps) self.mlp = MLP(config) self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps) def __call__(self, x: mx.array, mask: Optional[mx.array] = None) -> mx.array: y = self.layer_norm1(x) y = self.self_attn(y, y, y, mask) x = x + y y = self.layer_norm2(x) y = self.mlp(y) return x + y class TextEmbeddings(nn.Module): """Implement the text embeddings layer""" def __init__(self, config: CLIPTextConfig) -> None: super().__init__() embed_dim = config.hidden_size self.token_embedding = nn.Embedding(config.vocab_size, embed_dim) self.position_embedding = nn.Embedding( config.max_position_embeddings, embed_dim ) def __call__(self, x: mx.array) -> mx.array: embeddings = self.token_embedding(x) embeddings += self.position_embedding.weight[: x.shape[1]] return embeddings class Encoder(nn.Module): """Implement the transformer encoder layer""" def __init__(self, config: Union[CLIPTextConfig, CLIPVisionConfig]) -> None: self.layers = [EncoderLayer(config) for _ in range(config.num_hidden_layers)] def __call__(self) -> None: raise NotImplemented("Please use `for l in self.layers: x = l(x)`") def create_additive_causual_mask( N: int, dtype: mx.Dtype, use_clip_corenet_variant: bool ) -> mx.array: if use_clip_corenet_variant: indices = mx.arange(N) mask = indices[:, None] < indices[None] mask = mask.astype(dtype) * -3.4028235e38 return mask else: return nn.MultiHeadAttention.create_additive_causal_mask(N, dtype) class ClipTextModel(nn.Module): """Implements the text encoder transformer from CLIP.""" def __init__(self, config: CLIPTextConfig) -> None: super().__init__() self.embeddings = TextEmbeddings(config) self.encoder = Encoder(config) self.final_layer_norm = nn.LayerNorm(config.hidden_size) self.use_clip_corenet_variant = config.use_clip_corenet_variant def __call__(self, x: mx.array) -> CLIPTextOutput: B, N = x.shape eot_tokens = mx.argmax(x, axis=-1) x = self.embeddings(x) mask = create_additive_causual_mask(N, x.dtype, self.use_clip_corenet_variant) for l in self.encoder.layers: x = l(x, mask) last_hidden_state = self.final_layer_norm(x) pooler_output = last_hidden_state[mx.arange(B), eot_tokens] return CLIPTextOutput( pooler_output=pooler_output, last_hidden_state=last_hidden_state ) class VisionEmbeddings(nn.Module): """Implement the vision embeddings layer""" def __init__(self, config: CLIPVisionConfig) -> None: super().__init__() self.config = config self.embed_dim = config.hidden_size self.image_size = config.image_size self.patch_size = config.patch_size self.class_embedding = mx.zeros((config.hidden_size,)) self.num_patches = (self.image_size // self.patch_size) ** 2 if self.config.use_clip_corenet_variant: self.num_positions = max(32, self.embed_dim // 4) self.patch_embedding = nn.Sequential( nn.Conv2d( in_channels=config.num_channels, out_channels=self.num_positions, kernel_size=4, stride=(4, 4), padding=(1, 1), bias=False, ), nn.BatchNorm(num_features=self.num_positions), get_hidden_act(config), nn.Conv2d( in_channels=self.num_positions, out_channels=self.num_positions, kernel_size=2, stride=(2, 2), bias=False, ), nn.BatchNorm(num_features=self.num_positions), get_hidden_act(config), nn.Conv2d( in_channels=self.num_positions, out_channels=self.embed_dim, kernel_size=2, stride=(2, 2), bias=True, ), ) self.position_embedding = nn.Embedding(self.num_patches, self.embed_dim) else: self.patch_embedding = nn.Conv2d( in_channels=config.num_channels, out_channels=self.embed_dim, kernel_size=self.patch_size, stride=self.patch_size, bias=False, ) self.num_positions = self.num_patches + 1 self.position_embedding = nn.Embedding(self.num_positions, self.embed_dim) def __call__(self, x: mx.array) -> mx.array: batch_size = x.shape[0] # Patchify using conv: # [batch_size, sqrt(num_patches), sqrt(num_patches), embed_dim] patch_embeddings = self.patch_embedding(x) # [batch_size, num_patches, embed_dim] patch_embeddings = mx.flatten(patch_embeddings, start_axis=1, end_axis=2) embed_dim = patch_embeddings.shape[-1] if self.config.use_clip_corenet_variant: # Add positional encoding patch_embeddings += self.position_embedding.weight # Prepend embeddings # [batch_size, 1, embed_dim] cls_embeddings = mx.broadcast_to( self.class_embedding, (batch_size, 1, embed_dim) ) # [batch_size, num_patches + 1, embed_dim] embeddings = mx.concatenate((cls_embeddings, patch_embeddings), axis=1) else: # Prepend embeddings # [batch_size, 1, embed_dim] cls_embeddings = mx.broadcast_to( self.class_embedding, (batch_size, 1, embed_dim) ) # [batch_size, num_patches + 1, embed_dim] embeddings = mx.concatenate((cls_embeddings, patch_embeddings), axis=1) # Add positional encoding embeddings += self.position_embedding.weight return embeddings class ClipVisionModel(nn.Module): """Implements the vision encoder transformer from CLIP.""" def __init__(self, config: CLIPVisionConfig) -> None: super().__init__() self.embeddings = VisionEmbeddings(config) if config.use_clip_corenet_variant: self.pre_layernorm = nn.Identity() else: self.pre_layernorm = nn.LayerNorm(config.hidden_size) self.encoder = Encoder(config) self.post_layernorm = nn.LayerNorm(config.hidden_size) def __call__( self, x: mx.array, output_hidden_states: Optional[bool] = None, ) -> CLIPVisionOutput: x = self.embeddings(x) x = self.pre_layernorm(x) encoder_states = (x,) if output_hidden_states else None for l in self.encoder.layers: x = l(x, mask=None) if output_hidden_states: encoder_states = encoder_states + (x,) # Extract token embedding pooler_output = self.post_layernorm(x[:, 0, :]) return CLIPVisionOutput( pooler_output=pooler_output, last_hidden_state=x, hidden_states=encoder_states, ) class CLIPModel(nn.Module): """Implements the MPS CLIP model""" def __init__(self, config: CLIPConfig) -> None: self.text_model = ClipTextModel(config.text_config) self.vision_model = ClipVisionModel(config.vision_config) text_embed_dim = config.text_config.hidden_size vision_embed_dim = config.vision_config.hidden_size projection_dim = config.projection_dim self.visual_projection = nn.Linear(vision_embed_dim, projection_dim, bias=False) self.text_projection = nn.Linear(text_embed_dim, projection_dim, bias=False) self.logit_scale = mx.array(0.0) self.use_clip_corenet_variant = config.use_clip_corenet_variant def get_text_features(self, x: mx.array) -> mx.array: return self.text_projection(self.text_model(x).pooler_output) def get_image_features(self, x: mx.array) -> mx.array: return self.visual_projection(self.vision_model(x).pooler_output) def __call__( self, input_ids: Optional[mx.array] = None, pixel_values: Optional[mx.array] = None, return_loss: bool = False, ) -> CLIPModelOutput: if input_ids is not None: text_model_output = self.text_model(input_ids) text_embeds = self.text_projection(text_model_output.pooler_output) text_embeds = text_embeds / LA.norm(text_embeds, axis=-1, keepdims=True) else: text_embeds = None text_model_output = None if pixel_values is not None: vision_model_output = self.vision_model(pixel_values) image_embeds = self.visual_projection(vision_model_output.pooler_output) image_embeds = image_embeds / LA.norm(image_embeds, axis=-1, keepdims=True) else: image_embeds = None vision_model_output = None if return_loss and (input_ids is None or pixel_values is None): raise ValueError("Must provide text and image inputs to compute loss.") if return_loss: logit_scale = mx.exp(self.logit_scale) logits = (text_embeds @ image_embeds.T) * logit_scale loss = clip_loss(logits) else: loss = None return CLIPModelOutput( loss=loss, text_embeds=text_embeds, image_embeds=image_embeds, vision_model_output=vision_model_output, text_model_output=text_model_output, ) @staticmethod def from_pretrained(path: str) -> "CLIPModel": path = Path(path) with open(path / "config.json", "r") as fid: config = json.load(fid) use_clip_corenet_variant = config["model_type"] == "clip_corenet" text_config = config["text_config"] text_config = CLIPTextConfig( num_hidden_layers=text_config["num_hidden_layers"], hidden_size=text_config["hidden_size"], intermediate_size=text_config["intermediate_size"], num_attention_heads=text_config["num_attention_heads"], max_position_embeddings=text_config["max_position_embeddings"], vocab_size=text_config["vocab_size"], layer_norm_eps=text_config["layer_norm_eps"], hidden_act=text_config["hidden_act"], use_clip_corenet_variant=use_clip_corenet_variant, ) vision_config = config["vision_config"] vision_config = CLIPVisionConfig( num_hidden_layers=vision_config["num_hidden_layers"], hidden_size=vision_config["hidden_size"], intermediate_size=vision_config["intermediate_size"], num_attention_heads=vision_config["num_attention_heads"], num_channels=3, image_size=vision_config["image_size"], patch_size=vision_config["patch_size"], layer_norm_eps=vision_config["layer_norm_eps"], hidden_act=vision_config["hidden_act"], use_clip_corenet_variant=use_clip_corenet_variant, ) config = CLIPConfig( text_config=text_config, vision_config=vision_config, projection_dim=config["projection_dim"], use_clip_corenet_variant=use_clip_corenet_variant, ) model = CLIPModel(config) weight_files = glob.glob(str(path / "*.safetensors")) if not weight_files: logging.error(f"No safetensors found in {path}") raise FileNotFoundError(f"No safetensors found in {path}") weights = {} for wf in weight_files: weights.update(mx.load(wf)) weights = model.sanitize(weights) model.load_weights(list(weights.items())) return model @staticmethod def sanitize(weights: Dict[str, mx.array]) -> Dict[str, mx.array]: sanitized_weights = {} for k, v in weights.items(): if "position_ids" in k: # Remove unused position_ids continue elif "patch_embedding.weight" in k or re.match( r".*patch_embedding\.layers\.[036]\.weight", k ): # pytorch conv2d expects the weight tensor to be of shape [out_channels, in_channels, kH, KW] # mlx conv2d expects the weight tensor to be of shape [out_channels, kH, KW, in_channels] sanitized_weights[k] = v.transpose(0, 2, 3, 1) else: sanitized_weights[k] = v return sanitized_weights ================================================ FILE: mlx_examples/clip/requirements.txt ================================================ transformers==4.40.0 huggingface_hub==0.21.4 -r ../requirements.txt ================================================ FILE: mlx_examples/clip/results/.gitkeep ================================================ ================================================ FILE: mlx_examples/clip/tokenizer.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # # Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/tokenizer.py # with modifications about doc-string and typing. import json from pathlib import Path from typing import Any, Dict, List, Tuple import mlx.core as mx import regex class CLIPTokenizer: """Convert a text to tokenized index. A simple port of CLIPTokenizer from https://github.com/huggingface/transformers/ """ def __init__(self, bpe_ranks: Dict[Tuple[str], int], vocab: Dict[str, int]): self.bpe_ranks = bpe_ranks self.vocab = vocab self.pat = regex.compile( r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|'ll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", regex.IGNORECASE, ) self._cache = {self.bos: self.bos, self.eos: self.eos} @property def bos(self) -> str: return "<|startoftext|>" @property def bos_token(self) -> int: return self.vocab[self.bos] @property def eos(self) -> str: return "<|endoftext|>" @property def eos_token(self) -> int: return self.vocab[self.eos] def bpe(self, text: str) -> List[str]: if text in self._cache: return self._cache[text] unigrams = list(text[:-1]) + [text[-1] + ""] unique_bigrams = set(zip(unigrams, unigrams[1:])) if not unique_bigrams: return unigrams # In every iteration try to merge the two most likely bigrams. If none # was merged we are done. # # Ported from https://github.com/huggingface/transformers/blob/e74d793a3c3c0bc9bf3fb94bb31dd16934b1b0db/src/transformers/models/clip/tokenization_clip.py while unique_bigrams: bigram = min( unique_bigrams, key=lambda pair: self.bpe_ranks.get(pair, float("inf")) ) if bigram not in self.bpe_ranks: break new_unigrams = [] skip = False for a, b in zip(unigrams, unigrams[1:]): if skip: skip = False continue if (a, b) == bigram: new_unigrams.append(a + b) skip = True else: new_unigrams.append(a) if not skip: new_unigrams.append(b) unigrams = new_unigrams unique_bigrams = set(zip(unigrams, unigrams[1:])) self._cache[text] = unigrams return unigrams def __call__(self, *args: Any, **kwargs: Any) -> Any: return self.tokenize(*args, **kwargs) def tokenize( self, text: str, prepend_bos: bool = True, append_eos: bool = True ) -> mx.array: if isinstance(text, list): return mx.array([self.tokenize(t, prepend_bos, append_eos) for t in text]) # Lower case, cleanup, and split. Hugging Face does a much, # more thorough job here but this should suffice for 95% of # cases. clean_text = regex.sub(r"\s+", " ", text.lower()) tokens = regex.findall(self.pat, clean_text) # Split the tokens according to the byte-pair merge file bpe_tokens = [ti for t in tokens for ti in self.bpe(t)] # Map to token ids and return tokens = [] if prepend_bos: tokens.append(self.bos_token) tokens.extend(self.vocab[t] for t in bpe_tokens) if append_eos: tokens.append(self.eos_token) return mx.array(tokens) @staticmethod def from_pretrained(path: str) -> "CLIPTokenizer": path = Path(path) with open(path / "vocab.json", encoding="utf-8") as f: vocab = json.load(f) with open(path / "merges.txt", encoding="utf-8") as f: bpe_merges = f.read().strip().split("\n")[1 : 49152 - 256 - 2 + 1] bpe_merges = [tuple(m.split()) for m in bpe_merges] bpe_ranks = dict(map(reversed, enumerate(bpe_merges))) return CLIPTokenizer(bpe_ranks, vocab) ================================================ FILE: mlx_examples/open_elm/README.md ================================================ # MLX port of OpenELM This directory contains an MLX port of OpenELM model trained with CoreNet. MLX is an Apple deep learning framework similar in spirit to PyTorch, which is optimized for Apple Silicon based hardware. This code requires the MLX-specific dependencies from `../requirements.txt` to be installed. We assume that the main requirements.txt is already installed. ## Downloading pre-converted checkpoints The pre-converted checkpoints are available at the following URLs. | Model | Weights | Config | | ---- | ---- | ---- | | 270M | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M/config.json) | | 270M - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M-4bit/config.json) | | 450M | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M/config.json) | | 450M - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M-4bit/config.json) | | 1.1B | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B/config.json) | | 1.1B - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B-4bit/config.json) | | 3B | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B/config.json) | | 3B - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B-4bit/config.json) | Note that these checkpoints do not contain a tokenizer model file, which is required for inference with `inference.py`. Simply place Meta LLaMA2's `tokenizer.model` into the directories to load model using our provided `inference.py`, or if you prefer to use the models directly, use the corresponding tokenizer from Huggingface Transformers. ## Running the model In order to run the model, the `inference.py` script is provided. It also provides documentation for how to load and use the model if you are not familiar with language modeling in MLX. Here's a usage example: ``` PYTHONPATH=. python3 mlx_examples/open_elm/inference.py \ --model-dir \ --prompt "Once upon a time in a land far away" \ --max-tokens=1024 ``` This should produce a completion for your prompt. ## Converting the weights This port includes a conversion script, which can also do quantization. We have tested this script with fp16/bf16 and 4-bit quantized models with group size 32 and 64. Because of the similarities between MLX and PyTorch the naming of all variables in checkpoints is identical. A note on the tokenizer model: OpenELM uses Meta LLaMA tokenizer, which you will need to obtain from Meta. To run a fp16 conversion, download the training YAML configuration with which the model was trained, and the `*.pt` checkpoint that corresponds to that configuration. Then, execute the following command from the root of this repository: ``` PYTHONPATH=. python3 mlx_examples/open_elm/convert.py \ --input-checkpoint \ --config-yaml \ --tokenizer-path \ --dtype="float16" \ --output-dir ``` This will produce two files: an `*.npz` checkpoint, and `config.json` configuration file necessary to load the checkpoint. In order to convert to a 4-bit quantized checkpoint, simply add the required flags like so: ``` PYTHONPATH=. python3 mlx_examples/open_elm/convert.py \ --input-checkpoint \ --config-yaml \ --tokenizer-path \ --dtype="float16" \ --quantize \ --output-dir ``` Both of these commands will produce self-contained model directories with weights, configuration and tokenizer files inside. Note that OpenELM 3B should use BFloat16 for both 16-bit and quantized inference. It requires a greater activation range than the other model sizes. ================================================ FILE: mlx_examples/open_elm/__init__.py ================================================ ================================================ FILE: mlx_examples/open_elm/convert.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import json import pathlib import shutil import sys from typing import Any, Dict, Tuple import numpy as np import safetensors import torch import yaml from mlx_examples.open_elm import open_elm try: import mlx from mlx import core as mx from mlx import nn except ImportError: sys.exit("You must install Apple MLX to use this program.") def torch_to_mlx(x: torch.Tensor) -> mx.array: """Converts a PyTorch tensor to an MLX tensor with the same dtype. Args: x: PyTorch tensor to convert Returns: An MLX version with the same dtype and contents. """ x = x.detach() torch_dtype = str(x.dtype).split(".")[-1] mlx_dtype = getattr(mx, torch_dtype) # MLX mentions that converting to bfloat16 under NumPy could result in # precision loss, so we first up-cast to fp32. if torch_dtype == "bfloat16": x = x.to(torch.float32) return mx.array(x.cpu().numpy(), dtype=mlx_dtype) def quantize_weights( weights: Dict[str, mx.array], model_config: Dict[str, Any], bits: int = 4, group_size: int = 64, ) -> Tuple[Dict[str, Any], Dict[str, Any]]: """Quantizes model weights to a given bit depth and group size. Args: weights: weights dictionary for the model model_config: model configuration from the JSON config file bits: quantization depth group_size: quantization group size Returns: Quantized weights dictionary and the updated model config. """ model_config = copy.deepcopy(model_config) model = open_elm.OpenELM(**model_config) weights = mlx.utils.tree_map(mx.array, weights) model.update(mlx.utils.tree_unflatten(list(weights.items()))) nn.QuantizedLinear.quantize_module(model, group_size=group_size, bits=bits) quantized_weights = dict(mlx.utils.tree_flatten(model.parameters())) model_config["quantization"] = { "group_size": group_size, "bits": bits, } return quantized_weights, model_config def convert_open_elm( torch_checkpoint_path: pathlib.Path, tokenizer_path: pathlib.Path, config_yaml_path: pathlib.Path, output_dir: pathlib.Path, quantize: bool = False, quantization_bits: int = 4, quantization_group_size: int = 64, dtype: mx.Dtype = mx.float16, ) -> None: """Converts Apple OpenELM LLM checkpoint and configuration from PyTorch/CoreNet format to MLX format. Args: torch_checkpoint_path: path to the input *.pt checkpoint file tokenizer_path: path to the tokenizer file to copy to the output config_yaml_path: path to the training config *.yaml file output_dir: output directory to write the checkpoint quantize: set to true to enable quantization (default 4 bit, group size 64) quantization_bits: number of bits to quantize to quantization_group_size: quantization group size Returns: None """ assert torch_checkpoint_path.is_file(), torch_checkpoint_path assert config_yaml_path.is_file(), config_yaml_path output_dir.mkdir(parents=True, exist_ok=True) # Extract the relevant part of YAML config. with config_yaml_path.open("r") as f: config = yaml.safe_load(f) model_config = config["model"]["language_modeling"]["general_gpt"] # Padding index is used in CoreNet for training, and is not required for inference. model_config.pop("padding_index") # Load PyTorch checkpoint. ckpt = torch.load(torch_checkpoint_path, map_location="cpu") weights = {k: torch_to_mlx(v).astype(dtype) for k, v in ckpt.items()} if quantize: weights, model_config = quantize_weights( weights, model_config, bits=quantization_bits, group_size=quantization_group_size, ) checkpoint_file = output_dir / "weights.safetensors" with checkpoint_file.open("wb") as f: mx.save_safetensors(f, weights) print(f"Wrote converted checkpoint to {checkpoint_file}.") config_file = output_dir / "config.json" with config_file.open("w") as f: json.dump(model_config, f, indent=2) print(f"Wrote config to {config_file}.") shutil.copy2(tokenizer_path, output_dir / "tokenizer.model") if __name__ == "__main__": parser = argparse.ArgumentParser( description="Converts OpenELM checkpoints from PyTorch to MLX.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument( "--input-checkpoint", type=pathlib.Path, required=True, help="Input PyTorch / CoreNet checkpoint for Apple OpenELM model.", ) parser.add_argument( "--tokenizer-path", type=pathlib.Path, required=True, help="SentencePiece tokenizer model file to copy into the output directory.", ) parser.add_argument( "--config-yaml", type=pathlib.Path, required=True, help="Path to the YAML file containing the CoreNet training configuration.", ) parser.add_argument( "--output-dir", type=pathlib.Path, required=True, help="Output directory for MLX checkpoint.", ) parser.add_argument( "--dtype", default="float16", type=str, choices=["float16", "bfloat16", "float32"], help="Data type to use for the converted model.", ) parser.add_argument( "--quantize", help="Generate a quantized model.", action="store_true", ) parser.add_argument( "--quantization-group-size", help="Group size for quantization.", type=int, default=64, ) parser.add_argument( "--quantization-bits", help="Bits per weight for quantization.", type=int, default=4, ) args = parser.parse_args() dtype = args.dtype.lower() if dtype == "float16": dtype = mx.float16 elif dtype == "bfloat16": dtype = mx.bfloat16 elif dtype == "float32": dtype = mx.float32 else: raise ValueError(f"Unsupported dtype {dtype}.") convert_open_elm( args.input_checkpoint, args.tokenizer_path, args.config_yaml, args.output_dir, quantize=args.quantize, quantization_bits=args.quantization_bits, quantization_group_size=args.quantization_group_size, dtype=dtype, ) ================================================ FILE: mlx_examples/open_elm/inference.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import pathlib import time from typing import Generator import sentencepiece from mlx import core as mx from mlx_examples.open_elm import open_elm # From "The Treasure Island" by R.L.Stevenson, public domain. PROMPT = ( "Squire Trelawney, Dr. Livesey, and the rest of these gentlemen having " "asked me to write down the whole particulars about Treasure Island, " "from the" ) def generate_token( prompt_tokens: mx.array, model: open_elm.OpenELM, sampling_temperature: float = 0.0 ) -> Generator[int, None, None]: """Generates a single output token at a time for a given set of prompt tokens. Args: prompt_tokens: Tokenized prompt from SentencePiece tokenizer. model: An OpenELM model instance used for generating text completions. sampling_temperature: A float specifying the sampling temperature for generation, which affects the randomness of the generated text. A value of 0 (default) means deterministic output, while higher values introduce more randomness. Returns: A generator object which produces one output token at a time. """ def sample(logits): if sampling_temperature == 0: return mx.argmax(logits, axis=-1) return mx.random.categorical(logits * (1.0 / sampling_temperature)) # Process the prompt. output = model( { "input_ids": prompt_tokens, "past_key_values": None, "use_kv_cache": True, "is_causal": True, } ) cache = output["past_key_values"] logits = output["logits"] y = sample(logits[:, -1]) yield y while True: output = model( { "input_ids": y[:, None], "past_key_values": cache, "use_kv_cache": True, "is_causal": True, } ) cache = output["past_key_values"] logits = output["logits"] y = sample(logits.squeeze(1)) yield y def generate( model: open_elm.OpenELM, tokenizer: sentencepiece.SentencePieceProcessor, prompt: str, max_tokens: int, sampling_temperature: float = 0.0, print_output: bool = False, ): """Generates and prints a response for a given prompt. Args: model: An OpenELM model instance used for generating text completions. tokenizer: A SentencePieceProcessor instance for tokenizing text for the model. prompt: The initial text prompt to generate completions for. max_tokens: The maximum number of tokens to generate for the completion. sampling_temperature: A float specifying the sampling temperature for generation, which affects the randomness of the generated text. A value of 0 (default) means deterministic output, while higher values introduce more randomness. Returns: None. The function directly prints the generated text completion to the standard output. """ tokenized_prompt = mx.array([[tokenizer.bos_id()] + tokenizer.Encode(prompt)]) num_prompt_tokens = len(tokenized_prompt.flatten()) print(f"{num_prompt_tokens} token(s) in the prompt.") # Evaluation is done lazily, graph is built for several tokens each time, # except for the first token after the prompt. The first token is evaluated # in order to measure the prompt processing throughput. tokens_per_eval = 8 start = time.perf_counter() tokens = [] # Warm up the model. _ = generate_token(tokenized_prompt, model, sampling_temperature) generated_tokens = 0 elapsed_prompt = 0.0 for token, ntoks in zip( generate_token(tokenized_prompt, model, sampling_temperature), range(max_tokens), ): tokens.append(token) if ntoks == 0: mx.eval(tokens) elapsed_prompt = time.perf_counter() - start if (len(tokens) % tokens_per_eval) == 0: mx.eval(tokens) if print_output: s = tokenizer.Decode([t.item() for t in tokens]) print(s, end="", flush=True) tokens = [] generated_tokens += 1 mx.eval(tokens) if print_output: s = tokenizer.Decode([t.item() for t in tokens]) print(s, flush=True) elapsed_total = time.perf_counter() - start elapsed_generation = elapsed_total - elapsed_prompt prompt_tps = tokenized_prompt.size / elapsed_prompt generation_tps = generated_tokens / elapsed_generation total_tps = (generated_tokens + num_prompt_tokens) / elapsed_total print( f"Throughput: prompt {prompt_tps:.2f} t/s, generation {generation_tps:.2f} t/s. " f"{generated_tokens} tokens generated in {elapsed_total - elapsed_prompt}s. " f"Total throughput: {total_tps} t/s." ) if __name__ == "__main__": parser = argparse.ArgumentParser( description="Test loading checkpoints and inference for MLX port of Apple OpenELM LLM." ) parser.add_argument( "--model-dir", type=pathlib.Path, required=True, help="Path to MLX model directory containing model weights, JSON config and the " "tokenizer file.", ) parser.add_argument("--prompt", default=PROMPT, help="Prompt for inference.") parser.add_argument( "--max-tokens", type=int, default=1024, help="Maximum number of tokens to generate.", ) parser.add_argument( "--sampling-temperature", type=float, default=0.0, help="Sampling temperature." ) parser.add_argument( "--print-output", action="store_true", help="When specified, output will be printed to console.", ) args = parser.parse_args() assert args.sampling_temperature >= 0.0, args.sampling_temperature assert args.max_tokens > 0, args.max_tokens model, tokenizer = open_elm.load_model(args.model_dir) print("Prompt:", args.prompt) generate( model, tokenizer, args.prompt, args.max_tokens, sampling_temperature=args.sampling_temperature, print_output=args.print_output, ) ================================================ FILE: mlx_examples/open_elm/open_elm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import dataclasses import json import pathlib from numbers import Number from typing import Any, Callable, Dict, List, Optional, Tuple, Union import mlx import sentencepiece from mlx import core as mx from mlx import nn def get_normalization_layer(num_features: int, norm_type: str) -> nn.Module: if norm_type == "rms_norm": return nn.RMSNorm(dims=num_features, eps=1e-6) raise ValueError(f"Unsupported normalization layer: {norm_type}.") def compute_heads(model_dim: int, head_dim: int) -> int: if model_dim % head_dim == 0: return model_dim // head_dim raise ValueError( "Model dimension should be divisible by head dimension. Got: " f"{model_dim} and {head_dim}." ) def make_divisible(val: Union[int, float], divisor: int) -> int: """Make val divisible by divisor, rounding down no more than 10%, otherwise rounding up. If val is less than divisor, returns divisor.""" assert val >= 0.0, val assert divisor > 0, divisor assert isinstance(divisor, int) if val < divisor: return divisor # First round down to a whole multiple of divisor and see if it's within 10% # of val. If it is, return it, if not, add another `divisor` to get the # upper rounding. round_down = int(val + divisor / 2) // divisor * divisor if round_down <= 0.9 * val: return round_down + divisor else: return round_down @dataclasses.dataclass class GPTConfig: vocab_size: int = 32000 max_context_length: int = 2048 num_transformer_layers: int = 12 model_dim: int = 2048 head_dim: int = 128 qkv_multipliers: Union[Number, List[Number]] = 1.0 num_query_heads: int = compute_heads(model_dim=model_dim, head_dim=head_dim) # This variable allows to switch between multi-head attention, group query # attention, and multi-query attention. # When num_gqa_groups == 1, then it is multi-head attention. # When 1 < num_gqa_groups < num_heads and num_heads is divisible by # num_gqa_groups, then it is group query attention # When num_gqa_groups == num_heads, then it is multi-query attention num_gqa_groups: int = 1 ffn_multipliers: Union[Number, List[Number]] = 4.0 # use FFN with Gated Linear Unit (GLU) ffn_with_glu: bool = True ffn_dim_divisor: int = 256 activation_fn_name: str = "swish" normalization_layer_name: str = "rms_norm" normalize_qk_projections: bool = False share_input_output_layers: bool = False rope_freq_constant: int = 10000 # Note that rope_max_length is set to twice of max_context_length. # This allows flexibility in token lengths during training or fine-tuning. rope_max_length: int = 4096 def __post_init__(self) -> None: if self.num_gqa_groups is not None: head_multiple_of = self.num_gqa_groups else: head_multiple_of = 2 if isinstance(self.qkv_multipliers, Number): qkv_dim = make_divisible( int(self.model_dim * self.qkv_multipliers), divisor=self.head_dim * head_multiple_of, ) query_dims = [int(qkv_dim)] * self.num_transformer_layers elif ( isinstance(self.qkv_multipliers, (tuple, list)) and len(self.qkv_multipliers) == 2 ): # Each attention layer have different latent dimensions assuming # qkv_multipliers[0] != qkv_multipliers[1]. # This results in variable allocation of parameters in attention layer. # This scaling is known as layer-wise or block-wise scaling: # https://arxiv.org/abs/2008.00623 qkv_multipliers = [ round(v.item(), 2) for v in mx.linspace( self.qkv_multipliers[0], self.qkv_multipliers[1], num=self.num_transformer_layers, dtype=mx.float32, ) ] query_dims = [ make_divisible( self.model_dim * mult, divisor=self.head_dim * head_multiple_of ) for mult in qkv_multipliers ] else: raise NotImplementedError( "QKV multipliers should be a single number or a list containing exactly " f"two numbers. Got: {qkv_multipliers}." ) # compute the number of query, key, and value heads # For multi-head and multi-query attention, the number of heads for # query, key, and value are the same. # For group query attention, the number of key and value heads are the same. self.num_query_heads = [ compute_heads(q_dim, self.head_dim) for q_dim in query_dims ] self.num_kv_heads = [ q_heads // self.num_gqa_groups for q_heads in self.num_query_heads ] # Feed-forward network (FFN) multipliers if isinstance(self.ffn_multipliers, Number): # All FFN layers have the same latent dimensions, resulting in # uniform allocation of parameters. self.ffn_multipliers = [self.ffn_multipliers] * self.num_transformer_layers elif ( isinstance(self.ffn_multipliers, (tuple, list)) and len(self.ffn_multipliers) == 2 ): # Each FFN layer have different latent dimensions assuming # ffn_multipliers[0] != ffn_multipliers[1]. # This results in variable allocation of parameters in FFN layer. # This scaling is known as layer-wise or block-wise scaling: # https://arxiv.org/abs/2008.00623 self.ffn_multipliers = [ round(v.item(), 2) for v in mx.linspace( self.ffn_multipliers[0], self.ffn_multipliers[1], num=self.num_transformer_layers, dtype=mx.float32, ) ] else: raise NotImplementedError( "FFN multipliers should be a single number or a list containing exactly " f"two numbers. Got: {qkv_multipliers}." ) @classmethod def from_name( cls, model_name: str, vocab_size: int, max_context_length: int ) -> "GPTConfig": if model_name in gpt_configs: config = gpt_configs[model_name] else: raise NotImplementedError(f"{model_name} is not yet implemented") config["vocab_size"] = vocab_size config["max_context_length"] = max_context_length return cls(**config) gpt_configs = { "OpenELM-270M": { "num_transformer_layers": 16, "model_dim": 1280, "head_dim": 64, "num_gqa_groups": 4, "normalize_qk_projections": True, "share_input_output_layers": True, # Vary the FFN and QKV multiplier to create variable FFN and attention # layers respectively. "ffn_multipliers": (0.5, 4.0), "qkv_multipliers": (0.5, 1.0), }, "OpenELM-450M": { "num_transformer_layers": 20, "model_dim": 1536, "head_dim": 64, "num_gqa_groups": 4, "normalize_qk_projections": True, "share_input_output_layers": True, "ffn_multipliers": (0.5, 4.0), "qkv_multipliers": (0.5, 1.0), }, "OpenELM-1_1B": { "num_transformer_layers": 28, "model_dim": 2048, "head_dim": 64, "num_gqa_groups": 4, "normalize_qk_projections": True, "share_input_output_layers": True, "ffn_multipliers": (0.5, 4.0), "qkv_multipliers": (0.5, 1.0), }, "OpenELM-3B": { "num_transformer_layers": 36, "model_dim": 3072, "head_dim": 128, "num_gqa_groups": 4, "normalize_qk_projections": True, "share_input_output_layers": True, "ffn_multipliers": (0.5, 4.0), "qkv_multipliers": (0.5, 1.0), }, } class MultiHeadCausalAttention(nn.Module): """Multi-head causal attention. Args: model_config: Model configuration. layer_idx: Layer index. """ def __init__(self, model_config: GPTConfig, layer_idx: int) -> None: super().__init__() assert ( model_config.num_query_heads[layer_idx] % model_config.num_kv_heads[layer_idx] == 0 ) head_dim = model_config.head_dim q_heads = model_config.num_query_heads[layer_idx] k_heads = model_config.num_kv_heads[layer_idx] v_heads = model_config.num_kv_heads[layer_idx] self.qkv_proj = nn.Linear( input_dims=model_config.model_dim, output_dims=(q_heads + k_heads + v_heads) * head_dim, bias=False, ) self.pos_embedding = nn.RoPE( model_config.head_dim, base=model_config.rope_freq_constant ) if model_config.normalize_qk_projections: self.q_norm = get_normalization_layer( num_features=model_config.head_dim, norm_type=model_config.normalization_layer_name, ) self.k_norm = get_normalization_layer( num_features=model_config.head_dim, norm_type=model_config.normalization_layer_name, ) else: self.q_norm = None self.k_norm = None self.out_proj = nn.Linear( input_dims=q_heads * head_dim, output_dims=model_config.model_dim, bias=False, ) self.head_dim = model_config.head_dim self.num_q_heads = q_heads self.num_k_heads = k_heads self.num_v_heads = v_heads self.model_dim = model_config.model_dim self.num_groups = self.num_q_heads // self.num_k_heads self.scale = head_dim**-0.5 def extra_repr(self) -> str: return ( super().__repr__() + f", query_heads={self.num_q_heads}, " + f"key_heads={self.num_k_heads}, " + f"value_heads={self.num_v_heads}" ) def __call__( self, x: mx.array, past_key_value: Optional[Tuple[mx.array, mx.array]] = None, use_kv_cache: bool = False, causal_mask: Optional[mx.array] = None, ) -> Tuple[mx.array, Optional[Tuple[mx.array, mx.array]]]: """ Forward pass of multi-head self-attention. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. past_keys: Tensor storing the cached keys. The shape of tensor is [batch size, number of key heads, sequence length, head dimension]. past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'. use_kv_cache: Cache the output of key and value projection layers for faster inference. is_causal: Specifies whether to apply causal masking in scaled dot-product attention. Returns: The output of the same shape as the input, optionally with a tensor containing cached keys and values. """ batch_size, seq_length, d_model = x.shape # [batch_size, seq_length, d_model] --> [batch_size, seq_length, # (num_q_heads + num_k_heads + num_v_heads) * head_dim] qkv = self.qkv_proj(x) # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] qkv = qkv.reshape( batch_size, seq_length, self.num_q_heads + self.num_k_heads + self.num_v_heads, self.head_dim, ) # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] --> [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] qkv = qkv.transpose(0, 2, 1, 3) # [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim], [batch_size, num_k_heads, seq_length, head_dim], [batch_size, num_v_heads, seq_length, head_dim] queries, keys, values = qkv.split( [self.num_q_heads, self.num_q_heads + self.num_k_heads], axis=1 ) if self.q_norm is not None: queries = self.q_norm(queries) if self.k_norm is not None: keys = self.k_norm(keys) if use_kv_cache: if past_key_value is not None: past_keys = past_key_value[0] past_values = past_key_value[1] queries = self.pos_embedding(queries, offset=past_keys.shape[2]) keys = self.pos_embedding(keys, offset=past_keys.shape[2]) # concatenate past and current keys along the sequence dimension. keys = mx.concatenate([past_keys, keys], axis=2) values = mx.concatenate([past_values, values], axis=2) else: queries = self.pos_embedding(queries) keys = self.pos_embedding(keys) past_key_value = (keys, values) if self.num_groups != 1: # Group-query attention. # [batch_size, num_k_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim] keys = mx.repeat(keys, self.num_groups, axis=1) # [batch_size, num_v_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim] values = mx.repeat(values, self.num_groups, axis=1) # scaled dot-product attention. # The output of this operation has size of [batch_size, num_q_heads, seq_length, head_dim] attn_output = mx.fast.scaled_dot_product_attention( queries, keys, values, scale=self.scale, mask=causal_mask, ) # [batch_size, num_q_heads, seq_length, head_dim] --> [batch_size, seq_length, num_q_heads, head_dim] attn_output = attn_output.transpose(0, 2, 1, 3) # [batch_size, seq_length, num_q_heads, head_dim] --> [batch_size, seq_length, num_q_heads * head_dim] attn_output = attn_output.reshape( batch_size, seq_length, self.num_q_heads * self.head_dim ) # [batch_size, seq_length, num_q_heads * head_dim] --> [batch_size, seq_length, d_model] out = self.out_proj(attn_output) return out, past_key_value class FeedForwardNetwork(nn.Module): """Feed-forward network. Args: opts: Command-line arguments. model_config: Model configuration. layer_idx: Layer index. """ def __init__(self, model_config: GPTConfig, layer_idx: int) -> None: super().__init__() ffn_multiplier = model_config.ffn_multipliers[layer_idx] intermediate_dim = int( make_divisible( ffn_multiplier * model_config.model_dim, divisor=model_config.ffn_dim_divisor, ) ) if model_config.ffn_with_glu: # FFN with Gated linear unit self.proj_1 = nn.Linear( input_dims=model_config.model_dim, output_dims=2 * intermediate_dim, bias=False, ) self.proj_2 = nn.Linear( input_dims=intermediate_dim, output_dims=model_config.model_dim, bias=False, ) self.ffn_with_glu = True else: # Standard FFN, as described in https://arxiv.org/abs/1706.03762 self.proj_1 = nn.Linear( input_dims=model_config.model_dim, output_dims=intermediate_dim, bias=False, ) self.proj_2 = nn.Linear( input_dims=intermediate_dim, output_dims=model_config.model_dim, bias=False, ) self.ffn_with_glu = False assert ( model_config.activation_fn_name == "swish" ), model_config.activation_fn_name self.act = nn.SiLU() # AKA Swish. def extra_repr(self) -> str: return super().__repr__() + f"(ffn_with_glu) : {self.ffn_with_glu}" def __call__(self, x): """Forward function of FFN layer. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. Returns: A tensor of the same shape as the input. """ if self.ffn_with_glu: y_12 = self.proj_1(x) y_1, y_2 = y_12.split(2, axis=-1) y = self.act(y_1) * y_2 return self.proj_2(y) else: return self.proj_2(self.act(self.proj_1(x))) class TransformerDecoderLayer(nn.Module): """Transformer decoder layer. Args: opts: Command-line arguments. model_config: Model configuration. layer_idx: Layer index. """ def __init__(self, model_config: GPTConfig, layer_idx: int) -> None: super().__init__() self.attn_norm = get_normalization_layer( num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) self.attn = MultiHeadCausalAttention( model_config=model_config, layer_idx=layer_idx ) self.ffn_norm = get_normalization_layer( num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) self.ffn = FeedForwardNetwork(model_config=model_config, layer_idx=layer_idx) def __call__( self, x: mx.array, past_key_value: Optional[mx.array] = None, use_kv_cache: bool = False, causal_mask: Optional[mx.array] = None, ) -> Tuple[mx.array, Optional[mx.array]]: """ Forward pass of decoder layer. Args: x: Input tensor of the shape [batch size, sequence length, model dimension]. past_keys: Tensor storing the cached keys. The shape of tensor is [batch size, number of key heads, sequence length, head dimension]. past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'. use_kv_cache: Cache the output of key and value projection layers for faster inference. is_causal: Specifies whether to apply causal masking in scaled dot-product attention. Returns: The output of the same shape as the input, optionally with a tensor containing cached keys and values. """ # Pre-norm attention. y_attn = self.attn_norm(x) y_attn, past_key_value = self.attn( y_attn, past_key_value, use_kv_cache, causal_mask ) y_attn = x + y_attn # Pre-norm FFN. y_ffn = y_attn + self.ffn(self.ffn_norm(y_attn)) return y_ffn, past_key_value class OpenELM(nn.Module): """General GPT model. Args: model_name: name key for the predefined configuration vocab_size: the size of the input token embedding table max_context_length: max context length this model will be able to process Returns: None """ def __init__( self, model_name: str, vocab_size: int, max_context_length: int, ) -> None: super().__init__() model_config = GPTConfig.from_name( model_name=model_name, vocab_size=vocab_size, max_context_length=max_context_length, ) self.token_embeddings = nn.Embedding( num_embeddings=model_config.vocab_size, dims=model_config.model_dim, ) self.layers = [ TransformerDecoderLayer(model_config=model_config, layer_idx=layer_idx) for layer_idx in range(model_config.num_transformer_layers) ] self.norm = get_normalization_layer( num_features=model_config.model_dim, norm_type=model_config.normalization_layer_name, ) if model_config.share_input_output_layers: self.classifier = None else: self.classifier = nn.Linear( input_dims=model_config.model_dim, output_dims=model_config.vocab_size, bias=False, ) self.reset_parameters(model_config=model_config) self.num_transformer_layers = model_config.num_transformer_layers def __call__( self, model_input: Union[mx.array, Dict[str, Any]] ) -> Union[mx.array, Dict[str, mx.array]]: if isinstance(model_input, dict): assert { "input_ids", "past_key_values", "use_kv_cache", "is_causal", }.issubset(model_input.keys()) input_ids = model_input["input_ids"] past_key_values = model_input["past_key_values"] use_kv_cache = model_input["use_kv_cache"] is_causal = model_input["is_causal"] if past_key_values is None: past_key_values = [None] * self.num_transformer_layers elif isinstance(model_input, mx.array): input_ids = model_input past_key_values = [None] * self.num_transformer_layers use_kv_cache = False is_causal = True else: raise NotImplementedError( "Supported input types are either mx.array or Dictionary. " f"Got: {type(model_input)}." ) x = self.token_embeddings(input_ids) causal_mask = None seq_length = x.shape[1] if is_causal and seq_length > 1: causal_mask = nn.MultiHeadAttention.create_additive_causal_mask(seq_length) causal_mask = causal_mask.astype(x.dtype) for layer_idx in range(self.num_transformer_layers): x, past_key_values[layer_idx] = self.layers[layer_idx]( x, past_key_values[layer_idx], use_kv_cache, causal_mask ) x = self.norm(x) if self.classifier is None: logits = mx.matmul(x, self.token_embeddings.weight.transpose()) else: logits = self.classifier(x) if use_kv_cache: return {"logits": logits, "past_key_values": past_key_values} else: return logits def reset_parameters(self, model_config: GPTConfig) -> None: """Initialize the layers in Language Model The initialization scheme is followed, following `OPT `_. Returns: None """ def name_filter(value_name: str) -> Callable[[Any, str, Any], bool]: def filter(layer: nn.Module, name: str, val: mx.array) -> bool: return name == value_name return filter model_dim = model_config.model_dim for module in self.modules(): if isinstance(module, (nn.Linear)): std = module.weight.shape[0] ** -0.5 module.apply(nn.init.normal(std=std), filter_fn=name_filter("weight")) module.apply(nn.init.constant(0.0), filter_fn=name_filter("bias")) elif isinstance(module, (nn.Embedding)): std = model_dim**-0.5 module.apply(nn.init.normal(std), filter_fn=name_filter("weight")) elif isinstance(module, (nn.RMSNorm, nn.LayerNorm)): module.apply(nn.init.constant(1.0), filter_fn=name_filter("weight")) module.apply(nn.init.constant(0.0), filter_fn=name_filter("bias")) n_layers = model_config.num_transformer_layers std = (model_dim**-0.5) * ((2 * n_layers) ** -0.5) proj_init_fn = nn.init.normal(std=std) updates = [] for param_name, param in mlx.utils.tree_flatten(self.parameters()): if param_name.endswith("out_proj.weight") or param_name.endswith( "ffn.proj_2.weight" ): updates.append((param_name, proj_init_fn(param))) self.update(mlx.utils.tree_unflatten(updates)) def load_model( model_dir: pathlib.Path, ) -> Tuple[OpenELM, sentencepiece.SentencePieceProcessor]: assert model_dir.is_dir(), f"{model_dir} must be a directory." weights_path = model_dir / "weights.safetensors" config_path = model_dir / "config.json" # Load tokenizer. tokenizer_path = model_dir / "tokenizer.model" if not tokenizer_path.is_file(): raise ValueError( f"Tokenizer model not found at {tokenizer_path}. Please copy " "the LLaMA tokenizer.model file into the model directory." ) tokenizer = sentencepiece.SentencePieceProcessor(model_file=str(tokenizer_path)) # Load the model. with config_path.open("r") as f: config = json.load(f) quantization = config.pop("quantization", None) model = OpenELM(**config) if quantization is not None: # Quanitzation is not backwards compatible in 0.11.0. assert ( mx.__version__ == "0.10.0" ), f"Quantization support requires version 0.10.0. You have {mx.__version__}." nn.QuantizedLinear.quantize_module(model, **quantization) with weights_path.open("rb") as f: model_state = mx.load(f) model_state = mlx.utils.tree_unflatten(list(model_state.items())) model.update(model_state) mx.eval(model.parameters()) return model, tokenizer ================================================ FILE: mlx_examples/requirements.txt ================================================ mlx==0.10.0 ; sys_platform == 'darwin' sentencepiece==0.2.0 safetensors==0.4.2 ================================================ FILE: projects/byteformer/README.md ================================================ # Bytes Are All You Need: Transformers Operating Directly On File Bytes [ByteFormer](https://arxiv.org/abs/2306.00238) is a Transformer architecture able to perform inference directly on file bytes. It achieves accuracy greater than traditional image transformers at similar parameter settings (77.33% on ImageNet, compared to 72.2% for the original [DeiT-Ti](https://arxiv.org/pdf/2012.12877.pdf)), without the need for any inference-time image decoding. As our network only consumes bytes, we experiment with different image encodings and different modalities. Without modifying architecture or training hyperparameters, it can achieve competitive performance on Speech Commands v2 (95.42%, compared to state-of-the-art accuracy of 98.7%). We also experiment with obfuscated inputs to our network, to enhance privacy at inference time. See our paper for details.

## Training and Evaluation Training occurred on single node machines with 8 A100 GPUs (for ImageNet) or 4 A100 GPUs (for Speech Commands V2). Training can be done with the configs in subdirectories of the folder in which this README is found. Training uses the following command: ```corenet-train --common.config-file $CONFIG_FILE``` Evaluation can be done using the below example command: ```bash export CFG_FILE=projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_tiff.pt export DATASET_PATH=/mnt/vision_datasets/imagenet/validation/ CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` Each subdirectory corresponds to the experiments in a different table in our paper. - `imagenet_file_encodings/` contains experiments using TIFF or other encodings. - `imagenet_jpeg_q100/` contains experiments using JPEG quality factor of 100. - `imagenet_jpeg_q60/` contains experiments using JPEG quality factor of 60. - `imagenet_jpeg_shuffle_bytes/` contains ablations that shuffle the byte order. - `imagenet_obfuscation/` contains experiments swapping byte values (see paper for details). - `imagenet_privacy_preserving_camera/` contains experiments that mask pixel values. - `speech_commands_mp3/` contains audio classification experiments on Speech Commands v2 using MP3 files. - `speech_commands_wav/` contains audio classification experiments on Speech Commands v2 using WAV files. ***Note on reproducing FLOPs/Model Size Estimates***: By default, the embedding sizes (set by `--model.classification.byteformer.max-num-tokens`) set in the configs are larger than necessary, to allow experimentation without having to change the value (e.g. if the kernel size of the Conv1D is lowered, which would result in longer token lengths input to the Transformer backbone). When estimating performance in our paper, we set this value to the average token length (after BF-Ti's Conv1D downsampling) for the given input type (TIFF images, JPEG images, etc.). However, if the values are set to the average input length during training, an error will occur in the case of variable-length inputs (such as JPEG), because an input longer than the `max-num-tokens` will inevitably occur. Similarly, `--model.classification.byteformer.dummy-input-token-length` should be set to your expected input length (before BF-Ti's Conv1D downsampling) for your particular input domain, for accurate performance estimates. ## Pre-Trained Models | Dataset | Task | Top-1 | Config | Weights | |--------------------------------------|----------------------|-------|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ImageNet | Image Classification | 77.05 | [IN TIFF](imagenet_file_encodings/encoding_type=TIFF.yaml) | [IN TIFF](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_tiff.pt) | | ImageNet | Image Classification | 67.64 | [IN JPEG Q100 k=8 w=128](imagenet_jpeg_q100/conv_kernel_size=8.yaml) | [IN JPEG Q100 k=8 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_jpeg_q100_k8_w128.pt) | | ImageNet | Image Classification | 62.43 | [IN JPEG Q60 k=4 w=128](imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[128].yaml) | [IN JPEG Q60 k=4 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_jpeg_q60_k4_w128.pt) | | ImageNet (Shuffle Bytes) | Image Classification | 61.14 | [IN Shuffle Bytes Reverse](imagenet_jpeg_shuffle_bytes/mode=reverse.yaml) | [IN Shuffle Bytes Reverse](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_shuffle_bytes_reverse.pt) | | ImageNet (Obfuscation) | Image Classification | 76.00 | [IN Random Uniform [-20, 20]](imagenet_obfuscation/width_range=[-20,20].yaml) | [IN Random Uniform [-20, 20]](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_obfuscation.pt) | | ImageNet (Privacy Preserving Camera) | Image Classification | 68.10 | [IN k=4 keep_pixels=0.05](imagenet_privacy_preserving_camera/keep_frac=0.05,conv_kernel_size=4.yaml) | [IN k=4 keep_pixels=0.05](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_privacy_preserving_camera_k4_f0.05.pt) | | Speech Commands v2 12-Way | Audio Classification | 94.95 | [SC WAV FP32 k=32 w=128](speech_commands_wav/encoding_dtype=float32,conv_kernel_size=32.yaml) | [SC WAV FP32 k=32 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/speech_commands_wav.pt) | | Speech Commands v2 12-Way | Audio Classification | 90.25 | [SC MP3 k=4 w=32](speech_commands_mp3/conv_kernel_size=4,window_size=[32].yaml) | [SC MP3 k=4 w=32](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/speech_commands_mp3_k4_w32.pt) | ***Note on model sizes***: As described in the above note on reproducing estimates of FLOPs and model sizes, the above checkpoints include larger embeddings than necessary to facilitate easier experimentation without repeated config changes. See the above note for more details. ## Citation If you find our work useful, please cite: ```BibTeX @article{Horton2023BytesAA, title={Bytes Are All You Need: Transformers Operating Directly On File Bytes}, author={Maxwell Horton and Sachin Mehta and Ali Farhadi and Mohammad Rastegari}, journal={ArXiv}, year={2023}, volume={abs/2306.00238} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/byteformer/imagenet_file_encodings/encoding_type=PNG.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: PNG sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: TIFF sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_file_encodings/encoding_type=fCHW.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fCHW sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_file_encodings/encoding_type=fHWC.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=32.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=8.yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=16,window_sizes=[128].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=16,window_sizes=[32].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 32 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=32,window_sizes=[128].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=32,window_sizes=[32].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 32 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[128].yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[32].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 32 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=8,window_sizes=[128].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=8,window_sizes=[32].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 60 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 32 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=cyclic_half_length.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 shuffle_bytes: enable: true stride: 1024 window_size: 1024 mode: cyclic_half_length sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=random_shuffle.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 shuffle_bytes: enable: true stride: 1024 window_size: 1024 mode: random_shuffle sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=reverse.yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 shuffle_bytes: enable: true stride: 1024 window_size: 1024 mode: reverse sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=stride.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 shuffle_bytes: enable: true stride: 1024 window_size: 1024 mode: stride sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=window_shuffle.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: JPEG quality: 100 shuffle_bytes: enable: true stride: 1024 window_size: 1024 mode: window_shuffle sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_obfuscation/width_range=[-10,10].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC byte_permutation: enable: true random_uniform: enable: true width_range: - -10 - 10 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_obfuscation/width_range=[-20,20].yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC byte_permutation: enable: true random_uniform: enable: true width_range: - -20 - 20 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_obfuscation/width_range=[-5,5].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC byte_permutation: enable: true random_uniform: enable: true width_range: - -5 - 5 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_obfuscation/width_range=[0,0].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC byte_permutation: enable: true random_uniform: enable: true width_range: - 0 - 0 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.03,conv_kernel_size=4.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.03 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.05,conv_kernel_size=4.yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.05 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.1,conv_kernel_size=4.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.1 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.25,conv_kernel_size=8.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.25 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.5,conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.5 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.75,conv_kernel_size=32.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/imagenet/training root_val: /mnt/imagenet/validation name: imagenet category: classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_image_collate_fn collate_fn_name_val: byteformer_image_collate_fn collate_fn_name_test: byteformer_image_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: bicubic resize: enable: true size: 256 interpolation: bicubic center_crop: enable: true size: 224 random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: false cutmix: enable: false pil_save: enable: true file_encoding: fHWC mask_positions: enable: true keep_frac: 0.75 sampler: name: batch_sampler bs: crop_size_width: 224 crop_size_height: 224 loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: classification: name: byteformer n_classes: 1000 byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_mp3/conv_kernel_size=4,window_size=[128].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true format: mp3 sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_mp3/conv_kernel_size=4,window_size=[32].yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true format: mp3 sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 32 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_mp3/conv_kernel_size=8,window_size=[128].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true format: mp3 sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_mp3/conv_kernel_size=8,window_size=[32].yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true format: mp3 sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 32 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=float32,conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: float32 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=float32,conv_kernel_size=32.yaml ================================================ common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: float32 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: int16 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=32.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: int16 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=8.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: int16 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=int32,conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: int32 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=int32,conv_kernel_size=32.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: int32 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=16.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: uint8 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 16 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=32.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: uint8 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 32 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=4.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: uint8 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 4 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=8.yaml ================================================ # pytest: disable common: run_label: train log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false accum_freq: 2 dataset: root_train: /mnt/audio_datasets/google_speech_recognition_v2 root_val: /mnt/audio_datasets/google_speech_recognition_v2 name: speech_commands_v2 category: audio_classification train_batch_size0: 48 val_batch_size0: 48 eval_batch_size0: 48 workers: 10 persistent_workers: false pin_memory: true collate_fn_name_train: byteformer_audio_collate_fn collate_fn_name_val: byteformer_audio_collate_fn collate_fn_name_test: byteformer_audio_collate_fn speech_commands_v2: mixup: true audio_augmentation: noise: enable: true levels: - -50 refresh_freq: 100 roll: enable: true window: 0.1 torchaudio_save: enable: true encoding_dtype: uint8 format: wav sampler: name: batch_sampler loss: category: classification classification: name: cross_entropy cross_entropy: label_smoothing: 0.1 optim: name: adamw weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: cosine is_iteration_based: false max_epochs: 300 warmup_iterations: 500 warmup_init_lr: 1.0e-06 cosine: max_lr: 0.001 min_lr: 2.0e-05 model: audio_classification: name: byteformer classification: name: byteformer byteformer: mode: tiny max_num_tokens: 50000 conv_kernel_size: 8 window_sizes: - 128 n_classes: 12 activation: name: gelu layer: global_pool: mean conv_init: kaiming_uniform linear_init: trunc_normal linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0001 stats: val: - loss - top1 - top5 train: - loss checkpoint_metric: top1 checkpoint_metric_max: true ================================================ FILE: projects/catlip/README-multi-label-object-classification.md ================================================ # Multi-label Object Classification using CatLIP Below are instructions for [training](#training-on-coco) a pre-trained CatLIP model on the COCO dataset and [evaluating](#evaluation) its accuracy. We also provide [pre-trained model weights](#pretrained-model-weights-on-coco) for different multi-label classification models. ## Training on COCO To finetune ViT-B, pretrained using CatLIP, on COCO using four A100 GPU, run the following command: ```bash export CFG_FILE=projects/catlip/multi_label_image_classification/vit_base.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located at `/mnt/vision_datasets/coco`. ## Evaluation To evaluate the finetuned `ViT-B` model on the validation set of the COCO, run the following command: ```bash export CFG_FILE=projects/catlip/multi_label_image_classification/vit_base.yaml export DATASET_PATH="/mnt/vision_datasets/coco" # change to the COCO validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_base.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS model.resume_exclude_scopes='' ``` This should give ``` 'micro': 0.9118, 'macro': 0.8806, 'weighted': 0.8907 ``` ## Pretrained Model Weights on COCO | Model | Macro mAP | Pretrained weights | | ---- | ---- | ---- | | ViT-B/16 | 88.06 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_base.pt) | | ViT-L/16 | 90.75 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_large.pt) | ================================================ FILE: projects/catlip/README-object-detection.md ================================================ # Training and Evaluating CatLIP Pre-trained Models on the MS-COCO dataset for Object Detection Below are instructions for [training](#training-mask-r-cnn) a pre-trained CatLIP model with Mask R-CNN on the COCO dataset and [evaluating](#evaluating-mask-r-cnn) its accuracy. We also provide [pre-trained model weights](#pre-trained-models) for different detection model variants. ## Training Mask R-CNN The following command trains Mask R-CNN with CatLIP's ViT-B/16 image backbone assuming 8 nodes each with 8 80GB GPUs (verified on A100s): ```bash export CFG_FILE=projects/catlip/object_detection/maskrcnn_vit_base.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` Please see [detection](./object_detection) folder for configuration files of different ViT variants. ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Evaluating Mask R-CNN Evaluation on the validation set can be done using the command below: ```bash export CFG_FILE=projects/catlip/object_detection/maskrcnn_vit_base.yaml export DATASET_PATH="/mnt/vision_datasets/coco" # Change the path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_base.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE \ --model.detection.pretrained $MODEL_WEIGHTS \ --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ```shell Evaluate annotation type *bbox* DONE (t=25.77s). Accumulating evaluation results... DONE (t=4.29s). Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.499 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.727 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.339 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.532 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.374 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.598 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.629 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.474 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.668 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.771 Running per image evaluation... Evaluate annotation type *segm* DONE (t=29.50s). Accumulating evaluation results... DONE (t=4.24s). Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.436 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.694 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.464 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.243 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.466 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.638 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.340 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.531 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.556 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.387 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.595 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.724 ``` ## Pretrained Model Weights | Model | mAP (bbox) | mAP (segm) | Pretrained weights | | ---- | ---- | ---- | ---- | | Mask R-CNN w/ ViT-B/16 | 49.9 | 43.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_base.pt) | | Mask R-CNN w/ ViT-L/16 | 52.8 | 46.0 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_large.pt) | | Mask R-CNN w/ ViT-H/16 | 53.3 | 46.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_huge.pt) | ================================================ FILE: projects/catlip/README-pretraining.md ================================================ # Training CatLIP Models on Noisy Image-text Datasets ## Setup instructions Besides set-up instructions in CoreNet, please install NLTK library for CatLIP pre-training using below commands: ```bash python3 -m pip install nltk==3.8.1 python3 -m nltk.downloader all ``` ## Dataset preparation To prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file. In our experiments, we produce multi-class labels from text captions `on-the-fly`. However, they can be cached for efficiency. See [wordnet_tagged_classification.py](../../corenet/data/datasets/classification/wordnet_tagged_classification.py) for details. ## Training CatLIP on image-text pair dataset CatLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CatLIP models are trained on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of GPUs and nodes used in our experiments. An example command for training on `i-th` node is ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export RANK= * # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on. export WORLD_SIZE= * # WORLD_SIZE=32 nodes * 8 GPUS per node = 256 corenet-train --common.config-file $CFG_FILE --common.results-loc results_catlip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT' ``` ***Note***: Do not forget to change the `metadata_file` and `vocab_file` paths in the configuration files. ## Pretraining checkpoints and vocabulary file The pre-training checkpoints and vocabulary files for DataComp-1.3B can be downloaded using below links: | Name | Link | | ---- | ---- | | Vocabulary file | [Vocabulary](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretraining_vocab/datacomp_1_2B_vocab.pkl) | | ViT-B/16 | [ViT-B/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt) | | ViT-L/16 | [ViT-L/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt) | | ViT-H/16 | [ViT-H/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt) | The pre-training checkpoints are the checkpoints obtained with EMA at the end of training. ================================================ FILE: projects/catlip/README-semantic-segmentation.md ================================================ # Training and Evaluating CatLIP Pre-trained Models on the ADE20k dataset for Semantic Segmentation Below are instructions for [training](#training-deeplabv3) a pre-trained CatLIP model with DeepLabv3 on the ADE20k dataset and [evaluating](#evaluating-deeplabv3) its accuracy. We also provide [pre-trained model weights](#pre-trained-models) for different segmentation models. ## Training DeepLabv3 Single node `8 A100 GPU` training of DeepLabv3 with CatLIP's ViT-B/16 image backbone can be done using below command: ```bash export CFG_FILE=projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` Please see [semantic segmentation](./semantic_segmentation) folder for configuration files of different ViT variants. ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Evaluating DeepLabv3 Evaluation on the validation set can be done using the below command: ```bash export DATASET_PATH="/mnt/vision_datasets/ADEChallengeData2016/" # Change the path export CFG_FILE=projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_base.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE \ --model.segmentation.pretrained $MODEL_WEIGHTS \ --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` mean IoU: 50.12 ``` ## Pretrained Model Weights | Model | mIoU | Pretrained weights | | ---- | ---- | ---- | | Mask R-CNN w/ ViT-B/16 | 50.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_base.pt) | | Mask R-CNN w/ ViT-L/16 | 54.8 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_large.pt) | | Mask R-CNN w/ ViT-H/16 | 55.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_huge.pt) | ================================================ FILE: projects/catlip/README-single-label-object-classification.md ================================================ # Training CatLIP Models on the Single-label Object Classification Datasets Below are instructions for [training](#training) a pre-trained CatLIP model on the ImageNet dataset and [evaluating](#evaluation) its accuracy. Similarly, this fine-tuning process can be applied to the Places365 dataset. We also provide [pre-trained model weights](#pretrained-model-weights) for different classification models. ## Training To train ViT-B, pretrained using CatLIP, on [ImageNet](https://image-net.org) using a single A100 GPU, run the following command: ```bash export CFG_FILE=projects/catlip/image_classification/imagenet/vit_base.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located at `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ## Evaluation To evaluate the finetuned `ViT-B` model on the validation set of the ImageNet, run the following command: ```bash export CFG_FILE=projects/catlip/image_classification/imagenet/vit_base.yaml export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS model.resume_exclude_scopes='' ``` This should give ``` top1={'logits': 84.158} || top5={'logits': 97.006} ``` ## Pretrained Model Weights ### ImageNet-1k | Model | Resolution | Top-1 | Pretrained weights | | ---- | ---- | ---- | ---- | | ViT-B/16 | 224x224 | 84.2 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base.pt) | | ViT-L/16 | 224x224 | 86.8 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_large.pt) | | ViT-H/16 | 224x224 | 87.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_huge.pt) | | ---- | ---- | ---- | ---- | | ViT-B/16 | 512x512 | 86.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base_512x512.pt) | | ViT-L/16 | 512x512 | 88.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_large_512x512.pt) | | ViT-H/16 | 512x512 | 88.7 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_huge_512x512.pt) | ### Places365 | Model | Resolution | Top-1 | Pretrained weights | | ---- | ---- | ---- | ---- | | ViT-B/16 | 224x224 | 59.3 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_base.pt) | | ViT-L/16 | 224x224 | 60.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_large.pt) | | ViT-H/16 | 224x224 | 60.3 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_huge.pt) | | ---- | ---- | ---- | ---- | | ViT-B/16 | 512x512 | 59.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_base_512x512.pt) | | ViT-L/16 | 224x224 | 60.7 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_large_512x512.pt) | | ViT-H/16 | 224x224 | 61.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_huge_512x512.pt) | ================================================ FILE: projects/catlip/README.md ================================================ # CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data [![arXiv](https://img.shields.io/badge/arXiv-2404.15653-a6dba0.svg)](https://arxiv.org/abs/2404.15653) `CatLIP` introduces a novel weakly supervised pre-training approach for vision models on web-scale noisy image-text data, *reframing pre-training as a classification task to circumvent computational challenges associated with pairwise similarity computations in contrastive learning*, resulting in a significant 2.7x acceleration in training speed while maintaining high representation quality across various vision tasks. We provide training and evaluation code along with pretrained models and configuration files for the following tasks: 1. [CatLIP Pre-training](./README-pretraining.md) 2. [Single-label Object Classification with CatLIP](./README-single-label-object-classification.md) 3. [Multi-label Object Classification with CatLIP](./README-multi-label-object-classification.md) 4. [Object Detection with CatLIP](./README-object-detection.md) 4. [Semantic Segmentation with CatLIP](./README-semantic-segmentation.md) ## Citation If you find our work useful, please cite: ```BibTex @article{mehta2024catlip, title={CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data}, author={Sachin Mehta and Maxwell Horton and Fartash Faghri and Mohammad Hossein Sekhavat and Mahyar Najibi and Mehrdad Farajtabar and Oncel Tuzel and Mohammad Rastegari}, year={2024}, eprint={2404.15653}, archivePrefix={arXiv}, primaryClass={cs.CV} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/catlip/image_classification/imagenet/vit_base.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 [FT-IN1k]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (512 * 1 A100 80 GB GPU) train_batch_size0: 512 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/imagenet/vit_base_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 [FT-IN1k-512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (64 * 8 A100 80 GB GPU) train_batch_size0: 64 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/imagenet/vit_huge.yaml ================================================ # pytest: disable taskname: '+ ViT-H/16 [FT-IN1k]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (128 * 4 A100 80 GB GPU) train_batch_size0: 128 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/imagenet/vit_huge_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-H/16 [FT-IN1k-512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (32 * 8 A100 80 GB GPU * 2 nodes) train_batch_size0: 32 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/imagenet/vit_large.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 [FT-IN1k]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (128 * 4 A100 80 GB GPU) train_batch_size0: 128 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/imagenet/vit_large_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 [FT-IN1k-512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/imagenet/training" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is 512 (64 * 8 A100 80 GB GPU) train_batch_size0: 64 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "imagenet" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 1000 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_base.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 [FT-Places365]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (128 * 4 A100 80 GB GPU) train_batch_size0: 128 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_base_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 [FT-Places365 512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (64 * 8 A100 80 GB GPU) train_batch_size0: 64 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_huge.yaml ================================================ # pytest: disable taskname: '+ ViT-H/16 [FT-Places365]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (128 * 4 A100 80 GB GPU) train_batch_size0: 128 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_huge_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-H/16 [FT-Places365 512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (32 * 8 A100 80 GB GPU * 2 nodes) train_batch_size0: 32 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_large.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 [FT-Places365]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (128 * 4 A100 80 GB GPU) train_batch_size0: 128 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/image_classification/places365/vit_large_512x512.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 [FT-Places365 512x512]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/places365/training" root_val: "/mnt/vision_datasets/places365/validation" # effective batch size is 512 (64 * 8 A100 80 GB GPU) train_batch_size0: 64 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "places365" category: "classification" image_augmentation: # training related augmentation random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related augmentation resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 512 min_crop_size_height: 256 max_crop_size_height: 512 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 0.000003 model: activation_checkpointing: true # during finetuning, we need to skip loading the classifier from a pre-trained model # because the number of classes in down-stream task and pre-training are different. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 365 # Initalize the model with a pre-trained model and finetune it. # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string # and replace the 'pretrained' with the fine-tuned model path. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss", "top1", "top5" ] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/catlip/multi_label_image_classification/vit_base.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 [COCO-CLS]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" # effective batch size is 128 (32 * 4 A100 80 GB GPU) train_batch_size0: 32 val_batch_size0: 50 eval_batch_size0: 50 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "coco" category: "classification" image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # evaluation related augmentations resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 768 min_crop_size_height: 256 max_crop_size_height: 768 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "binary_cross_entropy" binary_cross_entropy: reduction: "batch_mean" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00001 min_lr: 0.000001 model: activation_checkpointing: true # The number of classes in pre-trained model are 24320 while COCO has 80 classes. # so, we exclude the classifier while loading the pre-trained weights resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 80 pretrained: https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: [ "loss" ] val: [ "loss" , "multiclass_classification_pr(pred=logits)"] checkpoint_metric: "multiclass_classification_pr(pred=logits).macro" checkpoint_metric_max: true metrics: multiclass_classification_pr: suppress_warnings: true ================================================ FILE: projects/catlip/multi_label_image_classification/vit_large.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 [COCO-CLS]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" # effective batch size is 128 (32 * 4 A100 80 GB GPU) train_batch_size0: 32 val_batch_size0: 32 eval_batch_size0: 32 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "coco" category: "classification" image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # evaluation related augmentations resize: enable: true size: 512 interpolation: "bilinear" center_crop: enable: true size: 512 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 512 crop_size_height: 512 max_n_scales: 25 min_crop_size_width: 256 max_crop_size_width: 768 min_crop_size_height: 256 max_crop_size_height: 768 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "binary_cross_entropy" binary_cross_entropy: reduction: "batch_mean" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00001 min_lr: 0.000001 model: activation_checkpointing: true # The number of classes in pre-trained model are 24320 while COCO has 80 classes. # so, we exclude the classifier while loading the pre-trained weights. resume_exclude_scopes: [ "classifier" ] classification: name: "vit" n_classes: 80 pretrained: https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: [ "loss" ] val: [ "loss" , "multiclass_classification_pr(pred=logits)"] checkpoint_metric: "multiclass_classification_pr(pred=logits).macro" checkpoint_metric_max: true metrics: multiclass_classification_pr: suppress_warnings: true ================================================ FILE: projects/catlip/object_detection/maskrcnn_vit_base.yaml ================================================ # pytest: disable taskname: '+ ViT-B/16 Mask R-CNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true save_all_checkpoints: true # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are # using GPUs with less memory, please try enabling mixed_precision. # mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU) train_batch_size0: 2 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler num_repeats: 4 vbs: check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 25 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "multi_step" max_epochs: 25 warmup_iterations: 250 warmup_init_lr: 0.00001 multi_step: gamma: 0.1 lr: 0.0003 milestones: [22, 24] model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them # Also, "simple_fpn" is not part of the pre-trained image encoder, so we have to exclude that too. resume_exclude_scopes: [ "classifier", "cls_token", "simple_fpn" ] detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: norm_layer: "layer_norm_fp32" backbone_lr_multiplier: 1.0 classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" enable_layer_wise_lr_decay: true layer_wise_lr_decay_rate: 0.7 n_classes: 24320 vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true stochastic_dropout: 0.1 # disable cls token and enable simple FPN for detection tasks no_cls_token: true use_simple_fpn: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] # For evaluation on the validation set using 'corenet-eval-det', we follow the steps below: # 1. Determine and store the size of input image as metadata. # 2. Resize image to a fixed size. # 3. Make a prediction. # 4. Resize the predictions to the same size as original input image. # 5. Compute results. evaluation: detection: mode: "validation_set" resize_input_images: true ================================================ FILE: projects/catlip/object_detection/maskrcnn_vit_huge.yaml ================================================ # pytest: disable taskname: '+ ViT-H/16 Mask R-CNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true save_all_checkpoints: true # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are # using GPUs with less memory, please try enabling mixed_precision. # mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU) train_batch_size0: 2 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler num_repeats: 4 vbs: check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 25 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "multi_step" max_epochs: 20 warmup_iterations: 250 warmup_init_lr: 0.00001 multi_step: gamma: 0.1 lr: 0.0003 milestones: [17, 19] model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them # Also, "simple_fpn" is not part of the pre-trained image encoder, so we have to exclude that too. resume_exclude_scopes: [ "classifier", "cls_token", "simple_fpn" ] detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: norm_layer: "layer_norm_fp32" backbone_lr_multiplier: 1.0 classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" enable_layer_wise_lr_decay: true layer_wise_lr_decay_rate: 0.9 n_classes: 24320 vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true stochastic_dropout: 0.5 # disable cls token and enable simple FPN for detection tasks no_cls_token: true use_simple_fpn: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] # For evaluation on the validation set using 'corenet-eval-det', we follow the steps below: # 1. Determine and store the size of input image as metadata. # 2. Resize image to a fixed size. # 3. Make a prediction. # 4. Resize the predictions to the same size as original input image. # 5. Compute results. evaluation: detection: mode: "validation_set" resize_input_images: true ================================================ FILE: projects/catlip/object_detection/maskrcnn_vit_large.yaml ================================================ # pytest: disable taskname: '+ ViT-L/16 Mask R-CNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true save_all_checkpoints: true # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are # using GPUs with less memory, please try enabling mixed_precision. # mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU) train_batch_size0: 2 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler num_repeats: 4 vbs: check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 25 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "multi_step" max_epochs: 25 warmup_iterations: 250 warmup_init_lr: 0.00001 multi_step: gamma: 0.1 lr: 0.0003 milestones: [22, 24] model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them # Also, "simple_fpn" is not part of the pre-trained image encoder, so we have to exclude that too. resume_exclude_scopes: [ "classifier", "cls_token", "simple_fpn" ] detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: norm_layer: "layer_norm_fp32" backbone_lr_multiplier: 1.0 classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" enable_layer_wise_lr_decay: true layer_wise_lr_decay_rate: 0.8 n_classes: 24320 vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true stochastic_dropout: 0.4 # disable cls token and enable simple FPN for detection tasks no_cls_token: true use_simple_fpn: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] # For evaluation on the validation set using 'corenet-eval-det', we follow the steps below: # 1. Determine and store the size of input image as metadata. # 2. Resize image to a fixed size. # 3. Make a prediction. # 4. Resize the predictions to the same size as original input image. # 5. Compute results. evaluation: detection: mode: "validation_set" resize_input_images: true ================================================ FILE: projects/catlip/pretraining/vit_base.yaml ================================================ # pytest: disable taskname: '+ CatLIP ViT-B/16 [DataComp]' _anchor_vocab_size: &_anchor_vocab_size 24320 common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset information is expected # to be contained in metadata file. root_train: "" disable_val: true # effective batch size is 65k (1024 images per GPU * 8 A100 40 GB GPUs * 8 Nodes) train_batch_size0: 1024 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "wordnet_tagged_classification" category: "classification" wordnet_tagged_classification: vocab_size: *_anchor_vocab_size # Uncomment these lines and replace with the path to metadata file containing dataset information # and vocabulary file containing synset information. # metadata_file: "PATH_TO_METADADATA_FILE" # vocab_file: "PATH_TO_VOCAB_FILE" image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true sampler: name: "variable_batch_sampler" use_shards: true # In the 0-th epoch, data is downloaded to local machine from remote location. # Therefore, we process the data sequentially in the 0-th epoch and start shuffling # from first epoch onwards. start_shuffling_from_epoch: 1 vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "binary_cross_entropy" binary_cross_entropy: reduction: "batch_mean" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: no_decay_bn_filter_bias: true weight_decay: 0.2 name: "adamw" adamw: beta1: 0.9 beta2: 0.999 scheduler: is_iteration_based: true max_iterations: 200000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 10000 cosine: max_lr: 0.001 min_lr: 0.00001 model: activation_checkpointing: true classification: name: "vit" n_classes: *_anchor_vocab_size vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss" ] checkpoint_metric: "loss" checkpoint_metric_max: false ================================================ FILE: projects/catlip/pretraining/vit_huge.yaml ================================================ # pytest: disable taskname: '+ CatLIP ViT-H/16 [DataComp]' _anchor_vocab_size: &_anchor_vocab_size 24320 common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset information is expected # to be contained in metadata file. root_train: "" disable_val: true # effective batch size is 65k (256 images per GPU * 8 A100 40 GB GPUs * 32 Nodes) train_batch_size0: 256 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "wordnet_tagged_classification" category: "classification" wordnet_tagged_classification: vocab_size: *_anchor_vocab_size # Uncomment these lines and replace with the path to metadata file containing dataset information # and vocabulary file containing synset information. # metadata_file: "PATH_TO_METADADATA_FILE" # vocab_file: "PATH_TO_VOCAB_FILE" image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true sampler: name: "variable_batch_sampler" use_shards: true # In the 0-th epoch, data is downloaded to local machine from remote location. # Therefore, we process the data sequentially in the 0-th epoch and start shuffling # from first epoch onwards. start_shuffling_from_epoch: 1 vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "binary_cross_entropy" binary_cross_entropy: reduction: "batch_mean" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: no_decay_bn_filter_bias: true weight_decay: 0.2 name: "adamw" adamw: beta1: 0.9 beta2: 0.999 scheduler: is_iteration_based: true max_iterations: 200000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 10000 cosine: max_lr: 0.0004 min_lr: 0.000004 model: activation_checkpointing: true classification: name: "vit" n_classes: *_anchor_vocab_size vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss" ] checkpoint_metric: "loss" checkpoint_metric_max: false ================================================ FILE: projects/catlip/pretraining/vit_large.yaml ================================================ # pytest: disable taskname: '+ CatLIP ViT-L/16 [DataComp]' _anchor_vocab_size: &_anchor_vocab_size 24320 common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset information is expected # to be contained in metadata file. root_train: "" disable_val: true # effective batch size is 65k (512 images per GPU * 8 A100 40 GB GPUs * 16 Nodes) train_batch_size0: 512 workers: -1 # use all CPUs persistent_workers: true pin_memory: true name: "wordnet_tagged_classification" category: "classification" wordnet_tagged_classification: vocab_size: *_anchor_vocab_size # Uncomment these lines and replace with the path to metadata file containing dataset information # and vocabulary file containing synset information. # metadata_file: "PATH_TO_METADADATA_FILE" # vocab_file: "PATH_TO_VOCAB_FILE" image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true sampler: name: "variable_batch_sampler" use_shards: true # In the 0-th epoch, data is downloaded to local machine from remote location. # Therefore, we process the data sequentially in the 0-th epoch and start shuffling # from first epoch onwards. start_shuffling_from_epoch: 1 vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "binary_cross_entropy" binary_cross_entropy: reduction: "batch_mean" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: no_decay_bn_filter_bias: true weight_decay: 0.2 name: "adamw" adamw: beta1: 0.9 beta2: 0.999 scheduler: is_iteration_based: true max_iterations: 200000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 10000 cosine: max_lr: 0.0006 min_lr: 0.000006 model: activation_checkpointing: true classification: name: "vit" n_classes: *_anchor_vocab_size vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true # use rangeaugment learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: train: ["loss"] val: [ "loss" ] checkpoint_metric: "loss" checkpoint_metric_max: false ================================================ FILE: projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml ================================================ # pytest: disable taskname: '+ DeepLabv3 ViT-B' common: run_label: "train" accum_freq: 1 log_freq: 100 auto_resume: true save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs) train_batch_size0: 4 val_batch_size0: 4 workers: -1 # use all CPUs persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 50 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 3.e-5 min_lr: 3.e-6 model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them resume_exclude_scopes: [ "classifier" , "cls_token" ] segmentation: name: "encoder_decoder" n_classes: 150 norm_layer: "layer_norm_fp32" seg_head: "deeplabv3" output_stride: 8 deeplabv3: aspp_dropout: 0.1 aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt" n_classes: 24320 vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true no_cls_token: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou"] train: ["loss"] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata. # 2. Resize image to a fixed size. # 3. Make a prediction. # 4. Resize the predicted mask to the same size as original input image. # 5. Compute results. evaluation: segmentation: resize_input_images_fixed_size: true mode: "validation_set" ================================================ FILE: projects/catlip/semantic_segmentation/deeplabv3_vit_huge.yaml ================================================ # pytest: disable taskname: '+ DeepLabv3 ViT-H' common: run_label: "train" accum_freq: 1 log_freq: 100 auto_resume: true save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs) train_batch_size0: 4 val_batch_size0: 4 workers: -1 # use all CPUs persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 50 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 3.e-5 min_lr: 3.e-6 model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them resume_exclude_scopes: [ "classifier" , "cls_token" ] segmentation: name: "encoder_decoder" n_classes: 150 norm_layer: "layer_norm_fp32" seg_head: "deeplabv3" output_stride: 8 deeplabv3: aspp_dropout: 0.1 aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt" n_classes: 24320 vit: mode: "huge" norm_layer: "layer_norm_fp32" use_flash_attention: true no_cls_token: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou"] train: ["loss"] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata. # 2. Resize image to fixed size. # 3. Make a prediction. # 4. Resize the predicted mask to the same size as original input image. # 5. Compute results. evaluation: segmentation: resize_input_images_fixed_size: true mode: "validation_set" ================================================ FILE: projects/catlip/semantic_segmentation/deeplabv3_vit_large.yaml ================================================ # pytest: disable taskname: '+ DeepLabv3 ViT-L' common: run_label: "train" accum_freq: 1 log_freq: 100 auto_resume: true save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs) train_batch_size0: 4 val_batch_size0: 4 workers: -1 # use all CPUs persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: true weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" max_epochs: 50 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 3.e-5 min_lr: 3.e-6 model: activation_checkpointing: true # During object detection training, we do not use classifier and cls_token, so we exclude them resume_exclude_scopes: [ "classifier" , "cls_token" ] segmentation: name: "encoder_decoder" n_classes: 150 norm_layer: "layer_norm_fp32" seg_head: "deeplabv3" output_stride: 8 deeplabv3: aspp_dropout: 0.1 aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "vit" # Initalize the model with a pre-trained model and finetune it. pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt" n_classes: 24320 vit: mode: "large" norm_layer: "layer_norm_fp32" use_flash_attention: true no_cls_token: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou"] train: ["loss"] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata. # 2. Resize image to fixed size. # 3. Make a prediction. # 4. Resize the predicted mask to the same size as original input image. # 5. Compute results. evaluation: segmentation: resize_input_images_fixed_size: true mode: "validation_set" ================================================ FILE: projects/clip/README.md ================================================ # Training CLIP Models on Image-Text Dataset Below is an example for [training](#training-clip) a CLIP model on image-text dataset, and evaluating it's [zero-shot image classification](#zero-shot-image-classification) accuracy on the ImageNet dataset. In our experiments, we used [DataComp-1.3B](https://arxiv.org/abs/2304.14108). ## Image-text dataset preparation To prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file. ## Training CLIP CLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CLIP models are trained with [RangeAugment](https://arxiv.org/abs/2212.10553) on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of GPUs and nodes used in our experiments. An example command for training on `i-th` node is ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export RANK= * # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on. export WORLD_SIZE= * # WORLD_SIZE=32 nodes * 8 GPUS per node = 256 corenet-train --common.config-file $CFG_FILE --common.results-loc results_clip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT' ``` ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Zero-shot image classification CLIP model, pretrained on DataComp-1.3B, with ViT-B image backbone can be evaluated at an input resolution of 224x224 using below shell script: ```bash export CONFIG_FILE="projects/clip/clip_vit_base.yaml" export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/clip/clip_vit_base.pt export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CONFIG_FILE --model.multi-modal-image-text.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name=imagenet dataset.root_val=$DATASET_PATH ``` This should give ``` top1={'zero_shot_image_logits': 75.042} ``` ## Citation If you find our work useful, please cite: ```BibTex @inproceedings{radford2021learning, title={Learning transferable visual models from natural language supervision}, author={Radford, Alec and Kim, Jong Wook and Hallacy, Chris and Ramesh, Aditya and Goh, Gabriel and Agarwal, Sandhini and Sastry, Girish and Askell, Amanda and Mishkin, Pamela and Clark, Jack and others}, booktitle={International conference on machine learning}, pages={8748--8763}, year={2021}, organization={PMLR} } @article{mehta2022rangeaugment, title={RangeAugment: Efficient Online Augmentation with Range Learning}, author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad}, journal={arXiv preprint arXiv:2212.10553}, year={2022}, url={https://arxiv.org/abs/2212.10553}, } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/clip/clip_vit_base.yaml ================================================ # pytest: disable taskname: '+ CLIP-ViT-B/16' _anchor_context_length: &_anchor_context_length 77 common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset is information is expected # to be contained in metadata file. root_train: "" root_val: "/mnt/vision_datasets/imagenet/validation" name: "img_text_tar" # effective batch size is > 65536 as we use multi-scale variable-batch sampler # 65k = (32 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 40 GB memory) train_batch_size0: 256 val_batch_size0: 4 eval_batch_size0: 4 persistent_workers: true pin_memory: true # use all CPUs as workers workers: -1 collate_fn_name_train: "multi_modal_img_text_collate_fn" collate_fn_name_val: "multi_modal_img_text_collate_fn" collate_fn_name_test: "multi_modal_img_text_collate_fn" name: "img_text_tar" category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet" context_length: *_anchor_context_length img_text_tar: # Uncomment below line to add metadata file's path. # metadata_file: "PATH_OF_METADATA_FILE" text_tokenizer: name: "openai_clip" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" scale: [0.9, 1.0] resize: enable: true size: 224 # shorter size is 224 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" use_shards: true start_shuffling_from_epoch: 1 vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 160 max_crop_size_width: 320 min_crop_size_height: 160 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "multi_modal_image_text" loss_weight: 1.0 multi_modal_image_text: name: "contrastive_loss_clip" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.2 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.98 eps: 1.e-6 scheduler: is_iteration_based: true max_iterations: 200000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 10000 cosine: max_lr: 0.001 min_lr: 1.e-06 model: activation_checkpointing: true multi_modal_image_text: name: "clip" lr_multiplier_img_encoder: 1.0 lr_multiplier_text_encoder: 1.0 clip: projection_dim: 512 classification: name: "vit" vit: mode: "base" norm_layer: "layer_norm_fp32" image_projection_head: name: "simple_projection_nc2nc" text: name: "transformer" vocab_size: 49408 context_length: *_anchor_context_length transformer: causal_masking: true model_dim: 512 n_transformer_layers: 12 ffn_multiplier_per_layer: 4.0 n_heads_per_layer: 8 norm_layer: "layer_norm_fp32" # Use RangeAugment: https://arxiv.org/abs/2212.10553 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "top1" ] train: ["loss", "grad_norm" ] checkpoint_metric: "top1.zero_shot_image_logits" checkpoint_metric_max: true ================================================ FILE: projects/fastvit/README.md ================================================ # FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization [FastViT](https://arxiv.org/abs/2303.14189) is an efficient hybrid ViT architecture that attains state-of-the-art accuracy to latency tradeoff. We provide training and evaluation code of FastVit, along with pretrained models and configuration files for image classification on the imagenet dataset. ## ImageNet classification ### Training Single node 8 A100 GPU training of `FastVit-T8` model can be done using below command: ```bash export CFG_FILE=projects/fastvit/classification/fastvit_t8_in1k.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ### Evaluation and Results We evaluate the model on a single GPU using following command: ```bash export CFG_FILE=projects/fastvit/classification/fastvit_t8_in1k.yaml export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/fastvit/imagenet-1k/fastvit-t8.pt" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=76.284 || top5=93.244 ``` ### Citation If you find the work useful, please cite following papers: ```BibTeX @inproceedings{vasufastvit2023, author = {Pavan Kumar Anasosalu Vasu and James Gabriel and Jeff Zhu and Oncel Tuzel and Anurag Ranjan}, title = {FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization}, booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, year = {2023} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/fastvit/classification/fastvit_t8_in1k.yaml ================================================ taskname: '+ FastViT T8' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: true alpha: 0.2 cutmix: enable: true alpha: 1.0 resize: enable: true size: 284 # shorter size is 284 interpolation: "bilinear" center_crop: enable: true size: 256 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 256 crop_size_height: 256 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.002 min_lr: 0.00002 model: classification: name: "fastvit" activation: name: "gelu" fastvit: variant: "T8" inference_mode: false dropout: 0.0 drop_path: 0.0 use_layer_scale: true layer_scale_init_value: 1.e-5 n_classes: 1000 normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/kv-prediction/README.md ================================================ # KV Prediction For Improved Time To First Token [KV Prediction](https://arxiv.org/abs/2410.08391) is a method for improving the time to first token (TTFT) of transformer models. It uses a small "auxiliary" transformer network to process the prompt efficiently. It then uses the KV cache of the auxiliary network to predict the KV cache of a larger "base" network. The base network is then used for inference without the need to query the auxiliary model again during autoregressive generation. Our method creates a pareto-optimal efficiency-accuracy trade-off for TTFT compared to baselines on benchmark datasets. See our paper for details.

## Training We experiment with OpenELM models. Configs are located in the `openelm/` subdirectory. We used multinode training jobs with 8 nodes and 8 H100 GPUs per node. An example command for training on the `i-th` node is ```bash export CFG_FILE="PATH_TO_KV_PREDICTION_MODEL_CONFIGURATION_FILE" export RANK= * export WORLD_SIZE= * corenet-train --common.config-file $CFG_FILE --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT' ``` ## Evaluation We evaluate in the [LM Eval Harness](https://github.com/EleutherAI/lm-evaluation-harness) on commit `3196e907fa195b684470a913c7235ed7f08a4383`. We use the prompt template in `triviaqa-template.yaml`, since we noticed that the default template added an extra question mark to the question. ## Citation If you find our work useful, please cite: ```BibTeX @misc{horton2024kvpredictionimprovedtime, title={KV Prediction for Improved Time to First Token}, author={Maxwell Horton and Qingqing Cao and Chenfan Sun and Yanzi Jin and Sachin Mehta and Mohammad Rastegari and Moin Nabi}, year={2024}, eprint={2410.08391}, archivePrefix={arXiv}, primaryClass={cs.CL}, url={https://arxiv.org/abs/2410.08391}, } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_0_25.yaml ================================================ taskname: '+ [OpenELM-1.1B-0.25l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0024 # papers use min_lr= 0.1 x max_lr min_lr: 0.00024 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-1_1B-0.25l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.4\\.", "layers.1."] - ["layers\\.8\\.", "layers.2."] - ["layers\\.12\\.", "layers.3."] - ["layers\\.16\\.", "layers.4."] - ["layers\\.20\\.", "layers.5."] - ["layers\\.24\\.", "layers.6."] - ["layers\\.28\\.", "layers.7."] - ["layers\\.32\\.", "layers.8."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.2\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.6\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.10\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.14\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.18\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.22\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.26\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.30\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.34\\.", "layers\\.35\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_0_50.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-1.1B-50l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0024 # papers use min_lr= 0.1 x max_lr min_lr: 0.00024 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-1_1B-0.50l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.2\\.", "layers.1."] - ["layers\\.4\\.", "layers.2."] - ["layers\\.6\\.", "layers.3."] - ["layers\\.8\\.", "layers.4."] - ["layers\\.10\\.", "layers.5."] - ["layers\\.12\\.", "layers.6."] - ["layers\\.14\\.", "layers.7."] - ["layers\\.16\\.", "layers.8."] - ["layers\\.18\\.", "layers.9."] - ["layers\\.20\\.", "layers.10."] - ["layers\\.22\\.", "layers.11."] - ["layers\\.24\\.", "layers.12."] - ["layers\\.26\\.", "layers.13."] - ["layers\\.28\\.", "layers.14."] - ["layers\\.30\\.", "layers.15."] - ["layers\\.32\\.", "layers.16."] - ["layers\\.34\\.", "layers.17."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.35\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_0_75.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-1.1B-75l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0024 # papers use min_lr= 0.1 x max_lr min_lr: 0.00024 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-1_1B-0.75l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.0\\.", "layers.0."] - ["layers\\.1\\.", "layers.1."] - ["layers\\.2\\.", "layers.2."] - ["layers\\.4\\.", "layers.3."] - ["layers\\.5\\.", "layers.4."] - ["layers\\.6\\.", "layers.5."] - ["layers\\.8\\.", "layers.6."] - ["layers\\.9\\.", "layers.7."] - ["layers\\.10\\.", "layers.8."] - ["layers\\.12\\.", "layers.9."] - ["layers\\.13\\.", "layers.10."] - ["layers\\.14\\.", "layers.11."] - ["layers\\.16\\.", "layers.12."] - ["layers\\.17\\.", "layers.13."] - ["layers\\.18\\.", "layers.14."] - ["layers\\.20\\.", "layers.15."] - ["layers\\.21\\.", "layers.16."] - ["layers\\.22\\.", "layers.17."] - ["layers\\.24\\.", "layers.18."] - ["layers\\.25\\.", "layers.19."] - ["layers\\.26\\.", "layers.20."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.3\\.", "layers\\.7\\.", "layers\\.11\\.", "layers\\.15\\.", "layers\\.19\\.", "layers\\.23\\.", "layers\\.27\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_kvp_c_270M.yaml ================================================ taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-270M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. #train_batch_size0: 16 train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: # This value should be the actual lr divided by the number of nodes. max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" auxiliary_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt" general_gpt: model_name: "OpenELM-270M" general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_kvp_c_450M.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-450M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. #train_batch_size0: 16 train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: # This value should be the actual lr divided by the number of nodes. max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" auxiliary_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt" general_gpt: model_name: "OpenELM-450M" general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_25.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.25l]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. #train_batch_size0: 16 train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: # This value should be the actual lr divided by the number of nodes. max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B-0.25l" rename_scopes_map: - ["layers\\.4\\.", "layers.1."] - ["layers\\.8\\.", "layers.2."] - ["layers\\.12\\.", "layers.3."] - ["layers\\.16\\.", "layers.4."] - ["layers\\.20\\.", "layers.5."] - ["layers\\.24\\.", "layers.6."] - ["layers\\.28\\.", "layers.7."] - ["layers\\.32\\.", "layers.8."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.2\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.6\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.10\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.14\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.18\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.22\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.26\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.30\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.34\\.", "layers\\.35\\."] general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_50.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.50l]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. #train_batch_size0: 16 train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: # This value should be the actual lr divided by the number of nodes. max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B-0.50l" rename_scopes_map: - ["layers\\.2\\.", "layers.1."] - ["layers\\.4\\.", "layers.2."] - ["layers\\.6\\.", "layers.3."] - ["layers\\.8\\.", "layers.4."] - ["layers\\.10\\.", "layers.5."] - ["layers\\.12\\.", "layers.6."] - ["layers\\.14\\.", "layers.7."] - ["layers\\.16\\.", "layers.8."] - ["layers\\.18\\.", "layers.9."] - ["layers\\.20\\.", "layers.10."] - ["layers\\.22\\.", "layers.11."] - ["layers\\.24\\.", "layers.12."] - ["layers\\.26\\.", "layers.13."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.27\\."] general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_75.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.75l]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. #train_batch_size0: 16 train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: # This value should be the actual lr divided by the number of nodes. max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B-0.75l" rename_scopes_map: - ["layers\\.0\\.", "layers.0."] - ["layers\\.1\\.", "layers.1."] - ["layers\\.2\\.", "layers.2."] - ["layers\\.4\\.", "layers.3."] - ["layers\\.5\\.", "layers.4."] - ["layers\\.6\\.", "layers.5."] - ["layers\\.8\\.", "layers.6."] - ["layers\\.9\\.", "layers.7."] - ["layers\\.10\\.", "layers.8."] - ["layers\\.12\\.", "layers.9."] - ["layers\\.13\\.", "layers.10."] - ["layers\\.14\\.", "layers.11."] - ["layers\\.16\\.", "layers.12."] - ["layers\\.17\\.", "layers.13."] - ["layers\\.18\\.", "layers.14."] - ["layers\\.20\\.", "layers.15."] - ["layers\\.21\\.", "layers.16."] - ["layers\\.22\\.", "layers.17."] - ["layers\\.24\\.", "layers.18."] - ["layers\\.25\\.", "layers.19."] - ["layers\\.26\\.", "layers.20."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.3\\.", "layers\\.7\\.", "layers\\.11\\.", "layers\\.15\\.", "layers\\.19\\.", "layers\\.23\\.", "layers\\.27\\."] general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_c_1_1B.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-Aux-1.1B Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-1_1B" general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_c_270M.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-270M Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt" general_gpt: model_name: "OpenELM-270M" general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_c_450M.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-450M Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 19] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt" general_gpt: model_name: "OpenELM-450M" general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_25.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-3B-0.25l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-3B-0.25l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.4\\.", "layers.1."] - ["layers\\.8\\.", "layers.2."] - ["layers\\.12\\.", "layers.3."] - ["layers\\.16\\.", "layers.4."] - ["layers\\.20\\.", "layers.5."] - ["layers\\.24\\.", "layers.6."] - ["layers\\.28\\.", "layers.7."] - ["layers\\.32\\.", "layers.8."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.2\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.6\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.10\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.14\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.18\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.22\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.26\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.30\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.34\\.", "layers\\.35\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_50.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-3B-0.50l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-3B-0.50l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.2\\.", "layers.1."] - ["layers\\.4\\.", "layers.2."] - ["layers\\.6\\.", "layers.3."] - ["layers\\.8\\.", "layers.4."] - ["layers\\.10\\.", "layers.5."] - ["layers\\.12\\.", "layers.6."] - ["layers\\.14\\.", "layers.7."] - ["layers\\.16\\.", "layers.8."] - ["layers\\.18\\.", "layers.9."] - ["layers\\.20\\.", "layers.10."] - ["layers\\.22\\.", "layers.11."] - ["layers\\.24\\.", "layers.12."] - ["layers\\.26\\.", "layers.13."] - ["layers\\.28\\.", "layers.14."] - ["layers\\.30\\.", "layers.15."] - ["layers\\.32\\.", "layers.16."] - ["layers\\.34\\.", "layers.17."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.35\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_75.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-3B-0.75l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "OpenELM-3B-0.75l" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" rename_scopes_map: - ["layers\\.0\\.", "layers.0."] - ["layers\\.1\\.", "layers.1."] - ["layers\\.2\\.", "layers.2."] - ["layers\\.4\\.", "layers.3."] - ["layers\\.5\\.", "layers.4."] - ["layers\\.6\\.", "layers.5."] - ["layers\\.8\\.", "layers.6."] - ["layers\\.9\\.", "layers.7."] - ["layers\\.10\\.", "layers.8."] - ["layers\\.12\\.", "layers.9."] - ["layers\\.13\\.", "layers.10."] - ["layers\\.14\\.", "layers.11."] - ["layers\\.16\\.", "layers.12."] - ["layers\\.17\\.", "layers.13."] - ["layers\\.18\\.", "layers.14."] - ["layers\\.20\\.", "layers.15."] - ["layers\\.21\\.", "layers.16."] - ["layers\\.22\\.", "layers.17."] - ["layers\\.24\\.", "layers.18."] - ["layers\\.25\\.", "layers.19."] - ["layers\\.26\\.", "layers.20."] - ["layers\\.28\\.", "layers.21."] - ["layers\\.29\\.", "layers.22."] - ["layers\\.30\\.", "layers.23."] - ["layers\\.32\\.", "layers.24."] - ["layers\\.33\\.", "layers.25."] - ["layers\\.34\\.", "layers.26."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.3\\.", "layers\\.7\\.", "layers\\.11\\.", "layers\\.15\\.", "layers\\.19\\.", "layers\\.23\\.", "layers\\.27\\.", "layers\\.31\\.", "layers\\.35\\."] stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_base_3B_aux_0_25l.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.25l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B-0.25l" rename_scopes_map: - ["layers\\.4\\.", "layers.1."] - ["layers\\.8\\.", "layers.2."] - ["layers\\.12\\.", "layers.3."] - ["layers\\.16\\.", "layers.4."] - ["layers\\.20\\.", "layers.5."] - ["layers\\.24\\.", "layers.6."] - ["layers\\.28\\.", "layers.7."] - ["layers\\.32\\.", "layers.8."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.2\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.6\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.10\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.14\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.18\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.22\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.26\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.30\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.34\\.", "layers\\.35\\."] general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_base_3B_aux_0_50l.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.50l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B-0.50l" rename_scopes_map: - ["layers\\.2\\.", "layers.1."] - ["layers\\.4\\.", "layers.2."] - ["layers\\.6\\.", "layers.3."] - ["layers\\.8\\.", "layers.4."] - ["layers\\.10\\.", "layers.5."] - ["layers\\.12\\.", "layers.6."] - ["layers\\.14\\.", "layers.7."] - ["layers\\.16\\.", "layers.8."] - ["layers\\.18\\.", "layers.9."] - ["layers\\.20\\.", "layers.10."] - ["layers\\.22\\.", "layers.11."] - ["layers\\.24\\.", "layers.12."] - ["layers\\.26\\.", "layers.13."] - ["layers\\.28\\.", "layers.14."] - ["layers\\.30\\.", "layers.15."] - ["layers\\.32\\.", "layers.16."] - ["layers\\.34\\.", "layers.17."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.1\\.", "layers\\.3\\.", "layers\\.5\\.", "layers\\.7\\.", "layers\\.9\\.", "layers\\.11\\.", "layers\\.13\\.", "layers\\.15\\.", "layers\\.17\\.", "layers\\.19\\.", "layers\\.21\\.", "layers\\.23\\.", "layers\\.25\\.", "layers\\.27\\.", "layers\\.29\\.", "layers\\.31\\.", "layers\\.33\\.", "layers\\.35\\."] general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/openelm/openelm_base_3B_aux_0_75l.yaml ================================================ # pytest: disable taskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.75l Short PT]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy_for_kv_prediction" cross_entropy_for_kv_prediction: ignore_index: *_anchor_padding_index use_z_loss: true auxiliary_loss: 1 kv_loss: 1 optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 140-150B tokens max_iterations: 70000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true freeze_modules: ["base.*"] language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 26] base_model: - model: language_modeling: name: "general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt" general_gpt: model_name: "OpenELM-3B-0.75l" rename_scopes_map: - ["layers\\.0\\.", "layers.0."] - ["layers\\.1\\.", "layers.1."] - ["layers\\.2\\.", "layers.2."] - ["layers\\.4\\.", "layers.3."] - ["layers\\.5\\.", "layers.4."] - ["layers\\.6\\.", "layers.5."] - ["layers\\.8\\.", "layers.6."] - ["layers\\.9\\.", "layers.7."] - ["layers\\.10\\.", "layers.8."] - ["layers\\.12\\.", "layers.9."] - ["layers\\.13\\.", "layers.10."] - ["layers\\.14\\.", "layers.11."] - ["layers\\.16\\.", "layers.12."] - ["layers\\.17\\.", "layers.13."] - ["layers\\.18\\.", "layers.14."] - ["layers\\.20\\.", "layers.15."] - ["layers\\.21\\.", "layers.16."] - ["layers\\.22\\.", "layers.17."] - ["layers\\.24\\.", "layers.18."] - ["layers\\.25\\.", "layers.19."] - ["layers\\.26\\.", "layers.20."] - ["layers\\.28\\.", "layers.21."] - ["layers\\.29\\.", "layers.22."] - ["layers\\.30\\.", "layers.23."] - ["layers\\.32\\.", "layers.24."] - ["layers\\.33\\.", "layers.25."] - ["layers\\.34\\.", "layers.26."] # Note: exclude_scopes happens first, before renaming. resume_exclude_scopes: ["layers\\.3\\.", "layers\\.7\\.", "layers\\.11\\.", "layers\\.15\\.", "layers\\.19\\.", "layers\\.23\\.", "layers\\.27\\.", "layers\\.31\\.", "layers\\.35\\."] general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/kv-prediction/triviaqa-template.yaml ================================================ # pytest: disable task: triviaqa-fixed dataset_path: trivia_qa dataset_name: rc.nocontext output_type: generate_until training_split: train validation_split: validation doc_to_text: "Question: {{question}}\nAnswer:" doc_to_target: "{{answer.aliases}}" should_decontaminate: true doc_to_decontamination_query: question fewshot_delimiter: "\n" generation_kwargs: until: - "\n" - "." - "," do_sample: false temperature: 0.0 filter_list: - name: remove_whitespace filter: - function: remove_whitespace - function: take_first target_delimiter: " " metric_list: - metric: exact_match aggregation: mean higher_is_better: true ignore_case: true ignore_punctuation: true metadata: version: 3.0 ================================================ FILE: projects/mobilenet_v1/README.md ================================================ # MobileNetv1 [MobileNetv1](https://arxiv.org/abs/1704.04861) introduces an efficient backbone that leverages depthwise separable convolutions. We provide training and evaluation code of MobileNetv1, along with pretrained models and configuration files for image classification on the ImageNet dataset. ## Image classification on the ImageNet dataset ### Training To train MobileNetv1-1.0 on [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command: ```bash export CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located at `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained `MobileNetv1-1.0` model on the validation set of the ImageNet, run the following command: ```bash export CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=74.044 || top5=91.578 ``` ## Pretrained Models on ImageNet-1k | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileNetv1-0.25 | 0.5 M | 54.45 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.logs) | | MobileNetv1-0.5 | 1.3 M | 65.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.logs) | | MobileNetv1-0.75 | 2.6 M | 71.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.logs) | | MobileNetv1-1.00 | 4.2 M | 74.04 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.logs) | ## Citation If you find our work useful, please cite following papers: ```BibTeX @article{Howard2017MobileNetsEC, title={MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications}, author={Andrew G. Howard and Menglong Zhu and Bo Chen and Dmitry Kalenichenko and Weijun Wang and Tobias Weyand and Marco Andreetto and Hartwig Adam}, journal={ArXiv}, year={2017}, volume={abs/1704.04861}, url={https://api.semanticscholar.org/CorpusID:12670695} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml ================================================ taskname: '+ MobileNetv1-1.0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: classification: name: "mobilenetv1" n_classes: 1000 activation: name: "relu" mobilenetv1: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobilenet_v2/README.md ================================================ # MobileNetv2 [MobileNetv2](https://arxiv.org/abs/1801.04381) leverages an inverted residual structure to build an efficient backbone. We provide training and evaluation code of MobileNetv2, along with pretrained models and configuration files for the following tasks: ## Image classification on the ImageNet dataset ### Training To train MobileNetv2 model on [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained MobileNetv2 model on the validation set of the ImageNet, run the following command: ```bash export CFG_FILE="projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=72.926 || top5=91.174 ``` ## Semantic Segmentation using DeepLabv3 on the ADE20K dataset ### Training To train DeepLabv3-MobileNetv2 model on ADE20K using a single node with 4 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results ``` We assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. ### Evaluation To evaluate the pre-trained DeepLabv3-MobileNetv2 model on the validation set of ADE20k, run the following command: ```bash export CFG_FILE="projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml" export DATASET_PATH="/mnt/vision_datasets/ADEChallengeData2016/" # change to the ADE20k's path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` mean IoU: 35.20 ``` ## Pretrained Models ### Classification (ImageNet-1k) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileNetv2-0.25 | 1.5 M | 53.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.logs) | | MobileNetv2-0.5 | 2.0 M | 65.28 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.logs) | | MobileNetv2-0.75 | 2.6 M | 70.42 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.logs) | | MobileNetv2-1.00 | 3.5 M | 72.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.logs) | ### Segmentation (ADE20k) Note: The number of parameters reported does not include the auxiliary branches. | Model | Parameters | mIoU | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | DeepLabv3 MobileNetv2 | 8.0 M | 35.20 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.logs) | ## Citation If you find our work useful, please cite following papers: ```BibTeX @article{Sandler2018MobileNetV2IR, title={MobileNetV2: Inverted Residuals and Linear Bottlenecks}, author={Mark Sandler and Andrew G. Howard and Menglong Zhu and Andrey Zhmoginov and Liang-Chieh Chen}, journal={2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition}, year={2018}, pages={4510-4520}, url={https://api.semanticscholar.org/CorpusID:4555207} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml ================================================ taskname: '+ MobileNetv2-1.0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: classification: name: "mobilenetv2" n_classes: 1000 activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml ================================================ taskname: '+ MobileNetv2-1.0 DeepLabv3' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 4 # effective batch size is 16 ( 4 * 4 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 4 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 photo_metric_distort: enable: true random_rotate: enable: true angle: 10 mask_fill: 0 # background idx is 0 random_gaussian_noise: enable: true sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "segmentation" segmentation: name: "cross_entropy" cross_entropy: aux_weight: 0.4 ignore_index: -1 optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt" activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu6" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/mobilenet_v3/README.md ================================================ # MobileNetv3 [MobileNetv3](https://arxiv.org/abs/1905.02244) uses an architecture search to design an efficient vision backbone. We provide training and evaluation code of MobileNetv3, along with pretrained models and configuration files for the following tasks: ## Image classification on the ImageNet dataset ### Training To train `MobileNetv3-Large` on the [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained `MobileNetv3-Large` model on the validation set of the ImageNet dataset, run the following command: ```bash export CFG_FILE="projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.pt" CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give: ``` top1=75.138 || top5=92.424 ``` ## Pretrained Models ### Classification (ImageNet) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileNetv3-small | 2.5 M | 66.65 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.logs) | | MobileNetv3-large | 5.4 M | 75.13 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.logs) | ## Citation If you find our work useful, please cite following papers: ```BibTeX @article{Howard2019SearchingFM, title={Searching for MobileNetV3}, author={Andrew G. Howard and Mark Sandler and Grace Chu and Liang-Chieh Chen and Bo Chen and Mingxing Tan and Weijun Wang and Yukun Zhu and Ruoming Pang and Vijay Vasudevan and Quoc V. Le and Hartwig Adam}, journal={2019 IEEE/CVF International Conference on Computer Vision (ICCV)}, year={2019}, pages={1314-1324}, url={https://api.semanticscholar.org/CorpusID:146808333} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml ================================================ taskname: '+ MobileNetv3-Large' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "mobilenetv3" n_classes: 1000 mobilenetv3: mode: "large" width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobileone/README.md ================================================ # MobileOne: An Improved One millisecond Mobile Backbone [MobileOne](https://arxiv.org/abs/2206.04040) is an efficient CNN architecture that attains SOTA accuracy to latency tradeoff. We provide training and evaluation code of MobileOne, along with pretrained models and configuration files for the following tasks: ## ImageNet classification ### Training Single node training with 4 A100 GPUs of `MobileOne-S1` model can be done using below command: ```bash export CFG_FILE="projects/mobileone/classification/mobileone_s1_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ### Evaluation We evaluate the model on a single GPU using following command: ```bash export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/mobileone/imagenet-1k/mobileone-s1.pt" export CFG_FILE="projects/mobileone/classification/mobileone_s1_in1k.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give: ``` top1=75.316 || top5=92.544 ``` ## Citation If you find our work useful, please cite following papers: ```BibTeX @article{mobileone2022, title={An Improved One millisecond Mobile Backbone}, author={Vasu, Pavan Kumar Anasosalu and Gabriel, James and Zhu, Jeff and Tuzel, Oncel and Ranjan, Anurag}, journal={arXiv preprint arXiv:2206.04040}, year={2022} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/mobileone/classification/mobileone_s1_in1k.yaml ================================================ taskname: '+ MobileOne S1' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: classification: name: "mobileone" activation: name: "relu" mobileone: variant: "s1" inference_mode: false n_classes: 1000 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobilevit/README.md ================================================ # MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer [MobileViT](https://arxiv.org/abs/2110.02178) is a light-weight vision transformer that combines the strengths of CNNs and transformers. See [paper](https://arxiv.org/abs/2110.02178) for details. We provide training and evaluation code of MobileViT, trained with [RangeAugment](https://arxiv.org/abs/2212.10553), along with pretrained models and configuration files for the following tasks: ## Image classification on the ImageNet dataset ### Training To train `MobileViT-Small` model on the [ImageNet](https://image-net.org) using a single node with 8 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/range_augment/classification/mobilevit_v1.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained `MobileViT-Small` model on the validation set of the ImageNet on a single GPU, run the following command: ```bash export CFG_FILE="projects/range_augment/classification/mobilevit_v1.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1={'logits': 78.194} || top5={'logits': 94.064} ``` ## Object detection and instance segmentation using Mask R-CNN on COCO ### Training To train the MobileViT-Small with [Mask R-CNN](https://arxiv.org/abs/1703.06870) as a detection backbone on the [COCO](https://cocodataset.org/#home) dataset using a single node with 8 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/range_augment/detection/maskrcnn_mobilevit.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` We assume that the training and validation datasets are located in `/mnt/vision_datasets/coco` directory. ### Evaluation To evaluate the pre-trained detection model on the validation set of the COCO on a single GPU, run the following command: ```bash export CFG_FILE="projects/range_augment/detection/maskrcnn_mobilevit.yaml" export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt" CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set ``` This should give for annotation type *bbox* ``` Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.420 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.640 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.456 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.277 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.452 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.537 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.336 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.549 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.581 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.411 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.612 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.712 ``` and for annotation type *segm* ``` Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.377 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.606 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.403 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.206 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.404 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.543 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.313 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.498 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.524 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.348 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.669 ``` ## Semantic segmentation on the ADE20k dataset ### Training To train the MobileViT-Small with [DeepLabv3](https://arxiv.org/abs/1706.05587) as a segmentation head on the [ADE20k](https://groups.csail.mit.edu/vision/datasets/ADE20K/) dataset using a single A100 GPUs, run the following command: ```bash export CFG_FILE="projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results ``` We assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. ### Evaluation To evaluate the pre-trained segmentation model on the validation set of the ADE20k dataset on a single GPU, run the following command: ```bash export CFG_FILE="projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml" export DATASET_PATH="/mnt/vision_datasets/ADEChallengeData2016/" # change to the ADE20k's path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` mean IoU: 38.49 ``` ## Citation If you find our work useful, please cite: ```BibTex @inproceedings{mehta2022mobilevit, title={MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer}, author={Sachin Mehta and Mohammad Rastegari}, booktitle={International Conference on Learning Representations}, year={2022}, url={https://openreview.net/forum?id=vh-0sUt8HlG} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ## Code and pre-trained models released with the paper For code and pre-trained models released with the paper, please check [CVNets v0.1](https://github.com/apple/ml-cvnets/tree/cvnets-v0.1). ================================================ FILE: projects/mobilevit_v2/README.md ================================================ # MobileViTv2: Separable Self-attention for Mobile Vision Transformers [MobileViTv2](https://arxiv.org/abs/2206.02680) is an enhancement of MobileViT that adds separable self-attention. See [paper](https://arxiv.org/abs/2206.02680) for details. We provide training and evaluation code of MobileViTv2, along with pretrained models and configuration files for the following tasks: ## Image classification on the ImageNet dataset ### Training To train `MobileViTv2-2.0` model on [ImageNet](https://image-net.org) using a single node with 8 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained MobileViTv2 2.0 model on the validation set of the ImageNet, run the following command: ```bash export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt export CFG_FILE="projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=81.17 || top5=95.378 ``` To evaluate the fine-tuned model at higher resolution, run the following command: ```bash export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt export CFG_FILE="projects/mobilevit_v2/classification/mobilevitv2_2.0_ft_384x384.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS ``` This should give ``` top1=82.18 || top5=95.928 ``` ## Object detection using SSD on COCO ### Training To train the MobileViTv2 2.0 with [SSD](https://arxiv.org/abs/1512.02325) as a detection backbone on the [COCO](https://cocodataset.org/#home) dataset using a single node with 4 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` We assume that the training and validation datasets are located in `/mnt/vision_datasets/coco` directory. ### Evaluation To evaluate the pre-trained detection model on the validation set of the COCO, run the following command: ```bash export CFG_FILE="projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml" export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --common.results-loc seg_results --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set ``` This should give ``` Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.302 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.501 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.308 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.092 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.319 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.514 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.266 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.402 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.425 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.153 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.477 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.663 ``` ## Semantic segmentation on the ADE20k dataset ### Training To train the MobileViTv2 1.0 with [DeepLabv3](https://arxiv.org/abs/1706.05587) as a segmentation head on the [ADE20k](https://groups.csail.mit.edu/vision/datasets/ADE20K/) dataset using a single A100 GPUs, run the following command: ```bash export CFG_FILE="projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results ``` We assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. ### Evaluation To evaluate the pre-trained segmentation model on the validation set of the ADE20k dataset, run the following command: ```bash export CFG_FILE="projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml" export DATASET_PATH="/mnt/vision_datasets/ADEChallengeData2016/" # change to the ADE20k's path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` mean IoU: 37.06 ``` ## Pretrained Models
Exapnd the section to see available pre-trained models across different tasks. ### Classification #### MobileViTv2 (256x256) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileViTv2-0.5 | 1.4 M | 70.18 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.logs) | | MobileViTv2-0.75 | 2.9 M | 75.56 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.logs) | | MobileViTv2-1.0 | 4.9 M | 78.09 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.logs) | | MobileViTv2-1.25 | 7.5 M | 79.65 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.logs) | | MobileViTv2-1.5 | 10.6 M | 80.38 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.logs) | | MobileViTv2-1.75 | 14.3 M | 80.84 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.logs) | | MobileViTv2-2.0 | 18.4 M | 81.17 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.logs) | #### MobileViTv2 (Trained on 256x256 and Finetuned on 384x384) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileViTv2-0.5 | 1.4 M | 72.14 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.logs) | | MobileViTv2-0.75 | 2.9 M | 76.98 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.logs) | | MobileViTv2-1.0 | 4.9 M | 79.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.logs) | | MobileViTv2-1.25 | 7.5 M | 80.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.logs) | | MobileViTv2-1.5 | 10.6 M | 81.50 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.logs) | | MobileViTv2-1.75 | 14.3 M | 82.04 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.logs) | | MobileViTv2-2.0 | 18.4 M | 82.17 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.logs) | #### MobileViTv2 (Trained on ImageNet-21k and Finetuned on ImageNet-1k 256x256) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileViTv2-1.5 | 10.6 M | 81.46 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.logs) | | MobileViTv2-1.75 | 14.3 M | 81.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.logs) | | MobileViTv2-2.0 | 18.4 M | 82.36 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.logs) | #### MobileViTv2 (Trained on ImageNet-21k, Finetuned on ImageNet-1k 256x256, and Finetuned on ImageNet-1k 384x384) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | MobileViTv2-1.5 | 10.6 M | 82.60 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.logs) | | MobileViTv2-1.75 | 14.3 M | 82.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.logs) | | MobileViTv2-2.0 | 18.4 M | 83.41 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.logs) | ### Object Detection (MS-COCO) | Model | Parameters | MAP | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | SSD MobileViTv2-0.5 | 2.0 M | 21.24 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.logs) | | SSD MobileViTv2-0.75 | 3.6 M | 24.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.logs) | | SSD MobileViTv2-1.0 | 5.6 M | 26.47 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.logs) | | SSD MobileViTv2-1.25 | 8.2 M | 27.85 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.logs) | | SSD MobileViTv2-1.5 | 11.3 M | 28.83 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.logs) | | SSD MobileViTv2-1.75 | 14.9 M | 29.52 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.logs) | | SSD MobileViTv2-2.0 | 19.1 M | 30.21 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.logs) | ### Segmentation (ADE 20K) Note: The number of parameters reported does not include the auxiliary branches. | Model | Parameters | mIoU | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | PSPNet MobileViTv2-0.5 | 3.6 M | 31.77 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.logs) | | PSPNet MobileViTv2-0.75 | 6.2 M | 35.22 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.logs) | | PSPNet MobileViTv2-1.0 | 9.4 M | 36.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.logs) | | PSPNet MobileViTv2-1.25 | 13.2 M | 38.76 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.logs) | | PSPNet MobileViTv2-1.5 | 17.6 M | 38.74 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.logs) | | PSPNet MobileViTv2-1.75 | 22.5 M | 39.82 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.logs) | | DeepLabv3 MobileViTv2-0.5 | 6.3 M | 31.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.logs) | | DeepLabv3 MobileViTv2-0.75 | 9.6 M | 34.70 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.logs) | | DeepLabv3 MobileViTv2-1.0 | 13.4 M | 37.06 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.logs) | | DeepLabv3 MobileViTv2-1.25 | 17.7 M | 38.42 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.logs) | | DeepLabv3 MobileViTv2-1.5 | 22.6 M | 38.91 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.logs) | | DeepLabv3 MobileViTv2-1.75 | 28.1 M | 39.53 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.logs) | | DeepLabv3 MobileViTv2-2.0 | 34.0 M | 40.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.logs) | ### Segmentation (Pascal VOC 2012) | Model | Parameters | mIoU | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | PSPNet MobileViTv2-0.5 | 3.6 M | 74.62 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.logs) | | PSPNet MobileViTv2-0.75 | 6.2 M | 77.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.logs) | | PSPNet MobileViTv2-1.0 | 9.4 M | 78.92 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.logs) | | PSPNet MobileViTv2-1.25 | 13.2 M | 79.40 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.logs) | | PSPNet MobileViTv2-1.5 | 17.5 M | 79.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.logs) | | DeepLabv3 MobileViTv2-0.5 | 6.2 M | 75.07 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.logs) | | DeepLabv3 MobileViTv2-1.0 | 13.3 M | 78.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.logs) | | DeepLabv3 MobileViTv2-1.25 | 17.7 M | 79.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.logs) | | DeepLabv3 MobileViTv2-1.5 | 22.6 M | 80.30 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.logs) |
## Citation If you find our work useful, please cite: ```BibTex @article{mehta2023separable, title={Separable Self-attention for Mobile Vision Transformers}, author={Sachin Mehta and Mohammad Rastegari}, journal={Transactions on Machine Learning Research}, issn={2835-8856}, year={2023}, url={https://openreview.net/forum?id=tBl4yBEjKi}, note={} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/mobilevit_v2/classification/mobilevitv2_2.0_ft_384x384.yaml ================================================ taskname: '+ MobileViTv2-2.0 384x384' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true tensorboard_logging: false grad_clip: 10.0 dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 64 # effective batch size of 128 (64 x 2 GPUs) val_batch_size0: 50 eval_batch_size0: 50 workers: 8 persistent_workers: false pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bicubic" random_horizontal_flip: enable: true resize: enable: true size: 384 # shorter size is 384 interpolation: "bicubic" center_crop: enable: true size: 384 sampler: name: "batch_sampler" bs: crop_size_width: 384 crop_size_height: 384 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "fixed" max_epochs: 10 fixed: lr: 1.e-3 model: classification: name: "mobilevit_v2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt" mitv2: width_multiplier: 2.0 attn_norm_layer: "layer_norm_2d" activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" ema: enable: true momentum: 0.00005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml ================================================ taskname: '+ MobileViTv2-2.0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true tensorboard_logging: false grad_clip: 10.0 dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 128 images per GPU * 8 GPUs = 1024 val_batch_size0: 100 eval_batch_size0: 100 workers: 8 prefetch_factor: 2 persistent_workers: false pin_memory: true image_augmentation: random_resized_crop: enable: true interpolation: "bicubic" random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: true alpha: 0.2 cutmix: enable: true alpha: 1.0 resize: enable: true size: 288 # shorter size is 288 interpolation: "bicubic" center_crop: enable: true size: 256 sampler: name: "batch_sampler" bs: crop_size_width: 256 crop_size_height: 256 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 20000 warmup_init_lr: 1.e-6 cosine: max_lr: 0.002 min_lr: 0.0002 model: classification: name: "mobilevit_v2" n_classes: 1000 mitv2: width_multiplier: 2.0 attn_norm_layer: "layer_norm_2d" activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" layer: global_pool: "mean" conv_init: "kaiming_normal" conv_init_std_dev: 0.02 linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml ================================================ taskname: '+ MobileViTv2-2.0 SSD' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" name: "coco_ssd" category: "detection" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 32 workers: 8 persistent_workers: false pin_memory: true collate_fn_name_train: "coco_ssd_collate_fn" collate_fn_name_val: "coco_ssd_collate_fn" image_augmentation: resize: enable: true size: [320, 320] interpolation: "bicubic" sampler: name: "batch_sampler" bs: crop_size_width: 320 crop_size_height: 320 loss: category: "detection" detection: name: "ssd_multibox_loss" ssd_multibox_loss: neg_pos_ratio: 3 optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: false adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 200 warmup_iterations: 500 warmup_init_lr: 0.00009 cosine: max_lr: 0.0009 min_lr: 1.e-6 anchor_generator: name: "ssd" ssd: output_strides: [ 16, 32, 64, 128, 256, -1 ] aspect_ratios: [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [2] ] min_scale_ratio: 0.1 max_scale_ratio: 1.05 matcher: name: "ssd" ssd: center_variance: 0.1 size_variance: 0.2 iou_threshold: 0.5 model: detection: name: "ssd" n_classes: 81 ssd: proj_channels: [512, 256, 256, 128, 128, 64] nms_iou_threshold: 0.5 classification: name: "mobilevit_v2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt" mitv2: width_multiplier: 2.0 attn_norm_layer: "layer_norm_2d" activation: name: "swish" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true ================================================ FILE: projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml ================================================ taskname: '+ MobileViTv2-1.0 DeepLabv3' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 200 auto_resume: false mixed_precision: true grad_clip: 10.0 dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 4 # effective batch size is 16 ( 4 * 4 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 4 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 photo_metric_distort: enable: true random_rotate: enable: true angle: 10 mask_fill: 0 # background idx is 0 random_gaussian_noise: enable: true sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "segmentation" segmentation: name: "cross_entropy" cross_entropy: aux_weight: 0.4 ignore_index: -1 optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 120 cosine: max_lr: 0.02 min_lr: 0.0002 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilevit_v2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.pt" mitv2: width_multiplier: 1.0 attn_norm_layer: "layer_norm_2d" activation: name: "swish" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "swish" inplace: false layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "iou" ] train: [ "loss", "grad_norm" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/openelm/README-instruct.md ================================================ # OpenELM Instruction Tuning We use [The Alignment Handbook](https://github.com/huggingface/alignment-handbook.git) library to finetune OpenELM models on the [UltraFeedback dataset](https://huggingface.co/datasets/csarron/argilla-ultrafeedback-binarized-preferences-cleaned). Below is the instrution to produce the instruction-tuned OpenELM models. ```bash # Change this to the path that you've cloned the repository cd /path/to/corenet # Install dependencies. git clone https://github.com/huggingface/alignment-handbook.git hf-align # 70769f9 is the main branch on 2024-04-11. cd hf-align && git checkout 70769f9 && cd .. pip install -e ./hf-align # Copy openelm-instruct recipe to hf-align/recipes. cp projects/openelm/instruction_tuning/openelm-instruct.yaml hf-align/recipes/ # Prepare the converted OpenELM Huggingface model to ckpt_dir. ckpt_dir= # Prepare tokenizer. local_tokenizer_dir= # Set output checkpoint dir. dpo_ckpt_dir= # Set lr, epochs, and loss_type based on the paper, also see the table below. # e.g. for OpenELM-270M model: ep=5 lr=2e-5 loss_type=hinge accelerate launch --config_file hf-align/recipes/accelerate_configs/deepspeed_zero3.yaml \ hf-align/scripts/run_dpo.py hf-align/recipes/openelm-instruct.yaml \ --trust_remote_code=true \ --model_name_or_path=${ckpt_dir} \ --tokenizer_name_or_path=${local_tokenizer_dir} \ --output_dir=${dpo_ckpt_dir} \ --num_train_epochs=$ep \ --learning_rate=$lr \ --loss_type=$loss_type # Results will be in ${dpo_ckpt_dir}/all_results.json. ``` OpenELM instruction tuning hyperparameters: | Hyperparameters | **270M** | **450M** | **1.1B** | **3B** | |------------------------------------|:-------------:|:-------------:|:-------------:|:-----------:| | Training epochs | 5 | 8 | 5 | 10 | | Learning rate | 2e-5 | 3e-5 | 5e-5 | 1e-4 | | Loss function | hinge | hinge | sigmoid | hinge | ================================================ FILE: projects/openelm/README-peft.md ================================================ # OpenELM Parameter-Efficient Finetuning (PEFT) We fine-tune models using the evaluation setup described in [LLM Adapters](https://arxiv.org/abs/2304.01933). This involves jointly fine-tuning on 8 commonsense reasoning datasets with a training set of size 170k. We follow the evaluation setup of [the official code release of LLM Adapters](https://github.com/AGI-Edgerunners/LLM-Adapters), with the exception that we use log-likelihood rather than regex parsing to determine the model's output. ## Setup To ensure consistency of evaluations with LLM Adapters, we use helper functions defined in their code. To set up for evaluations, run the following command: ```bash # Change this to the path to CoreNet cd /path/to/corenet # Install LM Harness. git clone https://github.com/EleutherAI/lm-evaluation-harness.git cd lm-evaluation-harness git checkout 3196e907fa195b684470a913c7235ed7f08a4383 python3 -m pip install -e . -c ../requirements.txt cd .. # Install LLM Adapters. git clone https://github.com/AGI-Edgerunners/LLM-Adapters.git cd LLM-Adapters git checkout 816657208af4db747803f87ba40a4c71383fed7a touch __init__.py python3 -m pip install -r requirements.txt -c ../requirements.txt cd .. # Install Huggingface and its dependencies. python3 -m pip install --upgrade \ transformers==4.36.2 \ datasets==2.19.0 \ accelerate==0.29.3 \ sentencepiece==0.2.0 \ -c requirements.txt ``` In our experiments, we used LLamav1/v2 tokenizer. Please download the tokenizer from the [official repository](https://github.com/meta-llama/llama). ## Training To fine-tune a 270M-parameter model with [LoRA](https://arxiv.org/abs/2106.09685), use the following command: ```bash CFG_FILE="projects/openelm/peft_configs/openelm_lora_270M.yaml" WTS_FILE="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt" TOKENIZER_FILE="" # NOTE: The dataset can currently be obtained from https://github.com/AGI-Edgerunners/LLM-Adapters/blob/main/ft-training_set/commonsense_170k.json. DATASET_FILE="" corenet-train --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE \ --dataset.language-modeling.commonsense-170k.path $DATASET_FILE ``` To train with [DoRA](https://arxiv.org/abs/2402.09353) instead, edit the config file to set `use_dora` to True. ## Evaluation To evaluate a pre-trained LoRA 270M model, use the following command: ```bash CFG_FILE="projects/openelm/peft_configs/openelm_lora_270M_eval.yaml" WTS_FILE="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_270M.pt" TOKENIZER_FILE="" corenet-eval-llmadapters --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE ``` The expected results are: | boolq | piqa | siqa | hellaswag | winogrande | arc-easy | arc-challenge | obqa | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 62.14 | 50.05 | 42.02 | 24.84 | 49.88 | 26.60 | 24.57 | 28.00 | To evaluate other pretrained models, edit the config file to use different backbones. To evaluate [DoRA](https://arxiv.org/abs/2402.09353) models, edit the config file to set `use_dora` to True. ### Pretraining checkpoints | Model | LoRA/DoRA | Weights | | ---- | ---- | ---- | | OpenELM-270M | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_270M.pt) | OpenELM-450M | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_450M.pt) | OpenELM-1.1B | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_1.1B.pt) | OpenELM-3B | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_3B.pt) | OpenELM-270M | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_270M.pt) | OpenELM-450M | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_450M.pt) | OpenELM-1.1B | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_1.1B.pt) | OpenELM-3B | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_3B.pt) ================================================ FILE: projects/openelm/README-pretraining.md ================================================ # Pretraining OpenELM ## Dataset preparation OpenELM was pretrained on public datasets. Specifically, our pre-training dataset contains RefinedWeb, PILE, a subset of RedPajama, and a subset of Dolma v1.6. > **NOTE:** Please accept the license of each individual dataset before using it. Please process the dataset according to the instructions provided in the following YAML snippet. We used the same structure during our experiments. ```yaml dataset: language_modeling: shuffle_data: true general_lm: # path to HF dataset train_data_info: [ ####### RefinedWeb ######## # The dataset can be downloaded from HuggingFace and contains 5535 parquet files. # https://huggingface.co/datasets/tiiuae/falcon-refinedweb/tree/main/data # We renamed the files to 'refinedweb-{file_id:05d}-of-05534.parquet' format. { # "file_name": "REPLACE_WITH_LOCATION_OF_DOWNLOADED_REFINED_WEB_DATA/refinedweb-{file_id:05d}-of-05534.parquet", "text_key": "content", "file_id_range": [0, 5534] }, ####### RedPAJAMA ######## # The urls for Redpajama data are available at https://data.together.xyz/redpajama-data-1T/v1.0.0/urls.txt. # The data can be downloaded from the above URL. # The name of the files is different from the format that is expected in CoreNet, so we recommend to rename the files # to the expected format. In general, we expect the redpajama data in following format: # LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/REDPAJAMA_SUBSET_NAME/REDPAJAMA_SUBSET_NAME-FILE_ID-TOTAL_FILES.jsonl # where # LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA corresponds to the root location (local or s3) of downloaded RedPajama dataset # REDPAJAMA_SUBSET_NAME corresponds to the subset name (e.g., arxiv) # FILE_ID: Uniqiue identifier for the file (e.g., 00001) for the first file in the subset # TOTAL_FILES: Total files in the subset (e.g., 00099) # Assume that the subset name is 'arxiv' and it has 100 files (e.g., arxiv-00000-00099.jsonl, arxiv-00001-00099.jsonl, and so on). We can pass it as a below dictionary. ### Arxiv { # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/arxiv/arxiv-{file_id:05d}-00099.jsonl", "text_key": "text", "file_id_range": [0, 100] }, ### Books { # Note that there is only one book file in the RedPajama dataset. # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/book/book-{file_id:05d}-00001.jsonl", "text_key": "text", "file_id_range": [0, 1] }, ### Github { # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/github/github-{file_id:05d}-00098.jsonl", "text_key": "text", "file_id_range": [0, 98] }, ### Stackexchange { # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/stackexchange/stackexchange-{file_id:05d}-00001.jsonl", "text_key": "text", "file_id_range": [0, 1] }, ### wikipedia { # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/wikipedia/wiki-{file_id:05d}-00001.jsonl", "text_key": "text", "file_id_range": [0, 1] }, ### C4 { # "file_name": "LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/c4/c4-{file_id:05d}-01024.jsonl", "text_key": "text", "file_id_range": [0, 1024] }, ####### PILE ######## # The PILE dataset can be downloaded from HuggingFace. THe dataset contains 1650 parquet files. # https://huggingface.co/datasets/EleutherAI/the_pile_deduplicated # Similar to RefinedWeb, please rename the files to the expected format. { # "file_name": "LOCATION_OF_DOWNLOADED_PILE_DATA/pile-{file_id:05d}-of-01650.parquet", "text_key": "text", "file_id_range": [0, 1650] }, ####### Dolma v1.6 ######## # The urls for Dolma v1.6 are available at: https://huggingface.co/datasets/allenai/dolma/blob/main/urls/v1_6.txt # The dataset files are available as 'json.gz' format. We follow similar steps as RedPajama to rename the files. # We recommend users to follow the similar steps and rename the files. Expected format for each subset is # mentioned below. ### Gutenberg books { # "file_name": "LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/books/books-{file_id:04d}.json.gz", "text_key": "text", "file_id_range": [0, 3] }, ### peS2o { # "file_name": "LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/pes2o/pes2o_v2-{file_id:04d}.json.gz", "text_key": "text", "file_id_range": [0, 26] }, ### reddit { #"file_name": "LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/reddit/reddit-v5-dedupe-pii-nsfw-toxic-{file_id:04d}.json.gz", "text_key": "text", "file_id_range": [0, 78] }, # stack { #"file_name": "LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/stack/stack-v4-train-{file_id:04d}.json.gz", "text_key": "text", "file_id_range": [0, 149] }, # wiki { #"file_name": "LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/wiki/en_simple_wiki_v0-{file_id:04d}.json.gz", "text_key": "text", "file_id_range": [0, 2] }, ] ``` ## Training OpenELM models OpenELM models are trained on multiple nodes, each node with multiple GPUs. Please see comments in [configuration files](../../projects/openelm/pretraining_configs/) for exact number of GPUs and nodes used in our experiments. An example command for training on `i-th` node is ```bash export CFG_FILE="PATH_TO_OPENELM_MODEL_CONFIGURATION_FILE" export RANK= * export WORLD_SIZE= * corenet-train --common.config-file $CFG_FILE --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT' ``` ## Pretraining checkpoints, model weights, and logs ### Model weight checkpoints The following checkpoints include only the model weights. These maybe useful for evaluation or fine-tuning purporses. | Iteration | OpenELM-270M | OpenELM-450M | OpenELM-1.1B | OpenELM-3B | | ---- | ---- | ---- | ---- | ---- | | 50k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_49999.pt) | | 100k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_99999.pt) | | 150k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_149999.pt) | | 200k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_199999.pt) | | 250k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_249999.pt) | | 300k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_299999.pt) | | 330k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_329999.pt) | | 335k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_334999.pt) | | 340k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_339999.pt) | | 345k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_344999.pt) | | 350k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_349999.pt) | | Avg. last 5 ckpts | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt) | | Training logs | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_logs.txt) | ### Full checkpoints The following checkpoints contain training state information, such as model and optimizer states, which maybe useful in resuming the training. | Iteration | OpenELM-270M | OpenELM-450M | OpenELM-1.1B | OpenELM-3B | | ---- | ---- | ---- | ---- | ---- | | 50k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_49999.pt) | | 100k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_99999.pt) | | 150k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_149999.pt) | | 200k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_199999.pt) | | 250k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_249999.pt) | | 300k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_299999.pt) | | 330k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_329999.pt) | | 335k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_334999.pt) | | 340k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_339999.pt) | | 345k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_344999.pt) | | 350k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_349999.pt) | | End of training| [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_last.pt) | ================================================ FILE: projects/openelm/README.md ================================================ # OpenELM: An Efficient Language Model Family with Open Training and Inference Framework [![arXiv](https://img.shields.io/badge/arXiv-2404.14619-a6dba0.svg)](https://arxiv.org/abs/2404.14619) We provide pretraining, evaluation, instruction tuning, and parameter-efficient finetuning instructions along with pretrained models and checkpoints: 1. [Pre-training](./README-pretraining.md) 2. [Evaluation](https://huggingface.co/apple/OpenELM#evaluation) 3. [Instruction Tuning](./README-instruct.md) 4. [Parameter-Efficient Finetuning](./README-peft.md) 5. [MLX Conversion](../../mlx_examples/open_elm/README.md) 6. [HuggingFace](https://huggingface.co/apple/OpenELM) ## Tokenizer In our experiments, we used LLama v1/v2 tokenizer. Please download the tokenizer from the [official repository](https://github.com/meta-llama/llama). ## Bias, Risks, and Limitations The release of OpenELM models aims to empower and enrich the open research community by providing access to state-of-the-art language models. Trained on publicly available datasets, these models are made available without any safety guarantees. Consequently, there exists the possibility of these models producing outputs that are inaccurate, harmful, biased, or objectionable in response to user prompts. Thus, it is imperative for users and developers to undertake thorough safety testing and implement appropriate filtering mechanisms tailored to their specific requirements. ## Citation If you find our work useful, please cite: ```BibTex @article{mehta2024openelm, title={OpenELM: An Efficient Language Model Family with Open Training and Inference Framework}, author = {Sachin Mehta and Mohammad Hossein Sekhavat and Qingqing Cao and Maxwell Horton and Yanzi Jin and Chenfan Sun and Iman Mirzadeh and Mahyar Najibi and Dmitry Belenko and Peter Zatloukal and Mohammad Rastegari}, year={2024}, eprint={2404.14619}, archivePrefix={arXiv}, primaryClass={cs.CL} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/openelm/instruction_tuning/openelm-instruct.yaml ================================================ # pytest: disable # Model arguments model_name_or_path: OpenELM-500M torch_dtype: null use_flash_attention_2: false chat_template: "{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '<|user|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'system' %}\n{{ '<|system|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'assistant' %}\n{{ '<|assistant|>\n' + message['content'] + eos_token }}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '<|assistant|>' }}\n{% endif %}\n{% endfor %}" # Data training arguments # For definitions, see: src/h4/training/config.py dataset_mixer: csarron/argilla-ultrafeedback-binarized-preferences-cleaned: 1.0 dataset_splits: - train - test preprocessing_num_workers: 16 # DPOTrainer arguments bf16: true beta: 0.01 do_eval: true evaluation_strategy: steps eval_steps: 100 gradient_accumulation_steps: 2 gradient_checkpointing: true gradient_checkpointing_kwargs: use_reentrant: False hub_model_id: OpenELM-500M-dpo learning_rate: 5.0e-5 log_level: info logging_steps: 10 lr_scheduler_type: cosine max_length: 1024 max_prompt_length: 512 num_train_epochs: 3 optim: adamw_torch output_dir: data/OpenELM-500M-dpo per_device_train_batch_size: 8 per_device_eval_batch_size: 8 push_to_hub: false save_strategy: "steps" save_steps: 100 save_total_limit: 1 seed: 42 warmup_ratio: 0.1 ================================================ FILE: projects/openelm/peft_configs/openelm_lora_1_1B.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-LoRA-1.1B]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "commonsense_170k" language_modeling: commonsense_170k: # Uncomment the below line and update the path to CommonSense170k. # path: sequence_length: *_anchor_context_length min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for 3 epochs. max_iterations: 4375 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0003 # papers use min_lr= 0.1 x max_lr min_lr: 0.00003 model: # Allow reloading the pretrained model. rename_scopes_map: - ['token_embeddings.weight', 'token_embeddings.base_layer.weight'] - ['layers.(.*).qkv_proj.weight', 'layers.\1.qkv_proj.base_layer.weight'] - ['layers.(.*).out_proj.weight', 'layers.\1.out_proj.base_layer.weight'] - ['layers.(.*).proj_(\d).weight', 'layers.\1.proj_\2.base_layer.weight'] ignore_missing_scopes: - ".*lora.*" freeze_modules: [".*base_layer.*", ".*norm.*"] activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: '.*token_embedding.*' module_type: 'embedding' params: adapter_name: lora r: &r 32 lora_alpha: &alpha 32 lora_dropout: &dropout 0.1 init_lora_weights: &ilw true use_rslora: &ur false use_dora: &ud false - regex: '.*out_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*qkv_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*proj_\d.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false lm_eval_wrapper: add_sot_token: true ================================================ FILE: projects/openelm/peft_configs/openelm_lora_270M.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-LoRA-270M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "commonsense_170k" language_modeling: commonsense_170k: # Uncomment the below line and update the path to CommonSense170k. # path: sequence_length: *_anchor_context_length min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for 3 epochs. max_iterations: 4375 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0003 # papers use min_lr= 0.1 x max_lr min_lr: 0.00003 model: # Allow reloading the pretrained model. rename_scopes_map: - ['token_embeddings.weight', 'token_embeddings.base_layer.weight'] - ['layers.(.*).qkv_proj.weight', 'layers.\1.qkv_proj.base_layer.weight'] - ['layers.(.*).out_proj.weight', 'layers.\1.out_proj.base_layer.weight'] - ['layers.(.*).proj_(\d).weight', 'layers.\1.proj_\2.base_layer.weight'] ignore_missing_scopes: - ".*lora.*" freeze_modules: [".*base_layer.*", ".*norm.*"] activation_checkpointing: false language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-270M" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: '.*token_embedding.*' module_type: 'embedding' params: adapter_name: lora r: &r 32 lora_alpha: &alpha 32 lora_dropout: &dropout 0.1 init_lora_weights: &ilw true use_rslora: &ur false use_dora: &ud false - regex: '.*out_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*qkv_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*proj_\d.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false lm_eval_wrapper: add_sot_token: true ================================================ FILE: projects/openelm/peft_configs/openelm_lora_270M_eval.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-LoRA-270M Eval]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 common: run_label: "eval" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: category: "language_modeling" # NOTE: dataset paths are set by llmadapters-evaluation.dataset-dir. # The default value is usually suitable. model: activation_checkpointing: false language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-270M" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: '.*token_embedding.*' module_type: 'embedding' params: adapter_name: lora r: &r 32 lora_alpha: &alpha 32 lora_dropout: &dropout 0.1 init_lora_weights: &ilw true use_rslora: &ur false use_dora: &ud false - regex: '.*out_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*qkv_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*proj_\d.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud lm_eval_wrapper: add_sot_token: true llmadapters_evaluation: multiple_choice: true ================================================ FILE: projects/openelm/peft_configs/openelm_lora_3B.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-LoRA-3B]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 accum_freq: 2 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "commonsense_170k" language_modeling: commonsense_170k: # Uncomment the below line and update the path to CommonSense170k. # path: sequence_length: *_anchor_context_length min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for 3 epochs. max_iterations: 4375 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0003 # papers use min_lr= 0.1 x max_lr min_lr: 0.00003 model: # Allow reloading the pretrained model. rename_scopes_map: - ['token_embeddings.weight', 'token_embeddings.base_layer.weight'] - ['layers.(.*).qkv_proj.weight', 'layers.\1.qkv_proj.base_layer.weight'] - ['layers.(.*).out_proj.weight', 'layers.\1.out_proj.base_layer.weight'] - ['layers.(.*).proj_(\d).weight', 'layers.\1.proj_\2.base_layer.weight'] ignore_missing_scopes: - ".*lora.*" freeze_modules: [".*base_layer.*", ".*norm.*"] activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: '.*token_embedding.*' module_type: 'embedding' params: adapter_name: lora r: &r 32 lora_alpha: &alpha 32 lora_dropout: &dropout 0.1 init_lora_weights: &ilw true use_rslora: &ur false use_dora: &ud false - regex: '.*out_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*qkv_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*proj_\d.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false lm_eval_wrapper: add_sot_token: true ================================================ FILE: projects/openelm/peft_configs/openelm_lora_450M.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-LoRA-450M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" accum_freq: 2 dataset: root_train: "" disable_val: true train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "commonsense_170k" language_modeling: commonsense_170k: # Uncomment the below line and update the path to CommonSense170k. # path: sequence_length: *_anchor_context_length min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for 3 epochs. max_iterations: 4375 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0003 # papers use min_lr= 0.1 x max_lr min_lr: 0.00003 model: # Allow reloading the pretrained model. rename_scopes_map: - ['token_embeddings.weight', 'token_embeddings.base_layer.weight'] - ['layers.(.*).qkv_proj.weight', 'layers.\1.qkv_proj.base_layer.weight'] - ['layers.(.*).out_proj.weight', 'layers.\1.out_proj.base_layer.weight'] - ['layers.(.*).proj_(\d).weight', 'layers.\1.proj_\2.base_layer.weight'] ignore_missing_scopes: - ".*lora.*" freeze_modules: [".*base_layer.*", ".*norm.*"] activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-450M" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: '.*token_embedding.*' module_type: 'embedding' params: adapter_name: lora r: &r 32 lora_alpha: &alpha 32 lora_dropout: &dropout 0.1 init_lora_weights: &ilw true use_rslora: &ur false use_dora: &ud false - regex: '.*out_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*qkv_proj.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: '.*proj_\d.*' module_type: 'linear' params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false lm_eval_wrapper: add_sot_token: true ================================================ FILE: projects/openelm/pretraining_configs/openelm_1_1B.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-1.1B]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~4M tokens (16 sequences x 8 A100 80 GB GPUs x 16 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 350000 name: cosine warmup_init_lr: 1.e-06 # warm-up for about 20B tokens (5000 * 4M tokens per iteration) warmup_iterations: 5000 cosine: max_lr: 0.0024 # papers use min_lr= 0.1 x max_lr min_lr: 0.00024 model: activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-1_1B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/openelm/pretraining_configs/openelm_270M.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-270M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~4M tokens (16 sequences x 8 A100 80 GB GPUs x 16 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP + Activation checkpointing are not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 512 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 350000 name: cosine warmup_init_lr: 1.e-06 # warm-up for about 20B tokens (5000 * 4M tokens per iteration) warmup_iterations: 5000 cosine: max_lr: 0.0053 # papers use min_lr= 0.1 x max_lr min_lr: 0.00053 model: activation_checkpointing: false language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-270M" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/openelm/pretraining_configs/openelm_3B.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-3B]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 _anchor_forward_dtype: &_anchor_forward_dtype "bfloat16" _anchor_backward_dtype: &_anchor_backward_dtype "float32" common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 train_eval_pipeline: name: "fsdp_train_eval_pipeline" fsdp: sharding_strategy: "full_shard" parameter_datatype: *_anchor_forward_dtype gradient_reduction_datatype: *_anchor_backward_dtype buffer_datatype: *_anchor_forward_dtype cpu_offload: false limit_all_gathers: true dataset: root_train: "" disable_val: true # effective batch size is ~4M tokens (16 sequences x 8 H100 80 GB GPUs x 16 nodes x 2048 tokens per seq ) train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 350000 name: cosine warmup_init_lr: 1.e-06 # warm-up for about 20B tokens (5000 * 4M tokens per iteration) warmup_iterations: 5000 cosine: max_lr: 0.0012 # papers use min_lr= 0.1 x max_lr min_lr: 0.00012 model: activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-3B" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/openelm/pretraining_configs/openelm_450M.yaml ================================================ # pytest: disable taskname: '+ [OpenELM-450M]' _anchor_context_length: &_anchor_context_length 2048 # actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly # for classification layer in LM model _anchor_vocab_size: &_anchor_vocab_size 32128 _anchor_padding_index: &_anchor_padding_index 32000 common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: "bfloat16" dataset: root_train: "" disable_val: true # effective batch size is ~4M tokens (16 sequences x 8 H100 80 GB GPUs x 16 nodes x 2048 tokens per seq ) # we use more nodes here because FSDP is not used. train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "general_lm" language_modeling: sequence_length: *_anchor_context_length # filter text that have less than 256 tokens after tokenization to avoid excessive padding min_tokens_per_text: 256 # filter text that have less than 200 characters before tokenization min_characters_per_text: 200 shuffle_data: true general_lm: train_data_info: [ { # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora. # We expect the path to be of the form "/path/to/train-{file_id:05d}-05534.parquet # "file_name": PATH_TO_PARQUET_FILES. "text_key": "content", "file_id_range": [0, 5535], }, ] text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # Uncomment the below line and update the path of LLAMA SentencePiece model file # model_path: loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # Train for about 1.4-1.5T tokens max_iterations: 350000 name: cosine warmup_init_lr: 1.e-06 # warm-up for about 20B tokens (5000 * 4M tokens per iteration) warmup_iterations: 5000 cosine: max_lr: 0.0039 # papers use min_lr= 0.1 x max_lr min_lr: 0.00039 model: activation_checkpointing: true language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-450M" vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: projects/range_augment/README-classification.md ================================================ # Training Classification Models with RangeAugment ## Training on the ImageNet dataset Single node 8 A100 GPU training of different mobile and non-mobile classification backbones studied in RangeAugment paper can be done using below command: ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` Please see [classification](./classification) folder for configuration files of different models. ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Evaluating the classification model Evaluation can be done using the below command: ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export MODEL_WEIGHTS="PATH_TO_MODEL_WEIGHTS_FILE" export DATASET_PATH="PATH_TO_DATASET" CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.results-loc classification_results --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` ## Results on the ImageNet dataset | Model | Top-1 | Config | Weights | Logs | |-------------------|-------|-------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------| | MobileNetv1-1.0 | 73.8 | [MV1-1.0-config](classification/mobilenet_v1.yaml) | [MV1-1.0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt) | [MV1-1.0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0_logs.txt) | | MobileNetv2-1.0 | 73.0 | [MV2-1.0-config](classification/mobilenet_v2.yaml) | [MV2-1.0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt) | [MV2-1.0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0_logs.txt) | | MobileNetv3-Large | 75.1 | [MV3-Large-config](classification/mobilenet_v3.yaml) | [MV3-Large-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt) | [MV3-Large-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large_logs.txt) | | MobileViTv1-Small | 78.2 | [MViT-Small-config](classification/mobilevit_v1.yaml) | [MViT-Small-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt) | [MViT-Small-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small_logs.txt) | | EfficientNet-B0 | 77.3 | [EB0-config](classification/efficientnet_b0.yaml) | [EB0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b0.pt) | [EB0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b0_logs.txt) | | EfficientNet-B1 | 79.5 | [EB1-config](classification/efficientnet_b1.yaml) | [EB1-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b1.pt) | [EB1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b1_logs.txt) | | EfficientNet-B2 | 81.3 | [EB2-config](classification/efficientnet_b2.yaml) | [EB2-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b2.pt) | [EB2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b2_logs.txt) | | EfficientNet-B3 | 81.9 | [EB3-config](classification/efficientnet_b3.yaml) | [EB3-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt) | [EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3_logs.txt) | | ResNet-50 | 80.2 | [R50-config](classification/resnet_50.yaml) | [R50-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt) | [R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50_logs.txt) | | ResNet-101 | 81.9 | [R101-config](classification/resnet_101.yaml) | [R101-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt) | [R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101_logs.txt) | | SwinTransformer-Tiny | 81.1 | [Swin-Tiny-config](classification/swin_transformer_tiny.yaml) | [Swin-Tiny-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_tiny.pt) | [Swin-Tiny-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_tiny_logs.txt) | | SwinTransformer-Small | 82.8 | [Swin-Small-config](classification/swin_transformer_small.yaml) | [Swin-Small-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_small.pt) | [Swin-Small-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_small_logs.txt) | ***Note:*** For MobileViT, we report results with EMA (as suggested in the paper) while for other models, we use the best checkpoint. ================================================ FILE: projects/range_augment/README-clip.md ================================================ # Training CLIP Models with RangeAugment ## Image-text dataset preparation To prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file. ## Training CLIP on image-text pair dataset CLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CLIP models are trained on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of GPUs and nodes used in our experiments. An example command for training on `i-th` node is ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export RANK= * # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on. export WORLD_SIZE= * # WORLD_SIZE=32 nodes * 8 GPUS per node = 256 corenet-train --common.config-file $CFG_FILE --common.results-loc results_clip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT' ``` ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Zero-shot evaluation of CLIP models on the ImageNet dataset CLIP model with ViT-B image backbone can be evaluated at an input resolution of 224x224 using below shell script: ```bash export CONFIG_FILE="projects/range_augment/clip/clip_vit_base.yaml" export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CONFIG_FILE --model.multi-modal-image-text.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name="imagenet" dataset.root_val=$DATASET_PATH ``` ## Results We should get the following zero-shot top-1 accuracy when CLIP models are evaluated on the ImageNet at different input resolutions. | Model | 160 | 192 | 224 | 256 | 288 | Config | Weights | Logs | |------------------|-------|-------|-------|-------|-------|-------------------------------------------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------| | CLIP w/ ViT-B/16 | 69.26 | 71.07 | 71.84 | 72.34 | 72.82 | [CLIP-ViT-B/16_Config](clip/clip_vit_base.yaml) | [CLIP-ViT-B/16_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt) | [CLIP-ViT-B/16_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16_logs.txt) | | CLIP w/ ViT-H/16 | 76.13 | 77.35 | 77.92 | 78.41 | 78.56 | [CLIP-ViT-H/16_Config](clip/clip_vit_huge.yaml) | [CLIP-ViT-H/16_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16.pt) | [CLIP-ViT-H/16_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16_logs.txt) | ***Note:*** For CLIP models, we found EMA and best checkpoints deliver similar performance. Here, we report the results for best checkpoint. ## Fine-tuning CLIP on the ImageNet dataset Configuration files for fine-tuning clip model are [here](./clip_finetune_imagenet/). Please follow instructions for training and evaluation in the [classification readme file](README-classification.md). We finetune the ViT backbone from CLIP model on the ImageNet dataset for 10 epochs. Below are the results: | Model | Top-1 @ 224x224 | Config | Weights | Logs | |----------|-----------------|----------------------------------------------------------------------|-----------------|------------------------------------------------------------------------------------------------------------------| | ViT-B/16 | 84.31 | [CLIP-ViT-B/16_FT_Config](clip_finetune_imagenet/clip_vit_base.yaml) | [CLIP-ViT-B/16_FT_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_base_16_ft_in1k.pt) | [CLIP-ViT-B/16_FT_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_huge_16_ft_in1k_logs.txt) | | ViT-H/16 | 86.90 | [CLIP-ViT-H/16_FT_Config](clip_finetune_imagenet/clip_vit_huge.yaml) | [CLIP-ViT-H/16_FT_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_huge_16_ft_in1k.pt) | [CLIP-ViT-H/16_FT_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_base_16_ft_in1k_logs.txt) | ================================================ FILE: projects/range_augment/README-distillation.md ================================================ # Distillation with RangeAugment We use ResNet-101 trained with RangeAugment as a teacher and trained four mobile models using knowledge distillation. The config files used in our distillation experiments are [here](distillation). Please follow instructions [here](README-classification.md) for training and evaluation on the ImageNet dataset. ## Results on the ImageNet dataset | Student Model | Top-1 (ERM) | Top-1 (Distillation) | Config | Weights | Logs | | --- |----------------------|---------------------|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------| | MobileNetv1 | 73.8 | 75.2 | [Distil-MV1-config](distillation/teacher_resnet101_student_mobilenet_v1.yaml) | [Distil-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v1.pt) | [Distil-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v1_logs.txt) | | MobileNetv2 | 73.0 | 73.4 | [Distil-MV2-config](distillation/teacher_resnet101_student_mobilenet_v2.yaml) | [Distil-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v2.pt) | [Distil-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v2_logs.txt) | | MobileNetv3 | 75.1 | 76.0 | [Distil-MV3-config](distillation/teacher_resnet101_student_mobilenet_v3.yaml) | [Distil-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v3.pt) | [Distil-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v3_logs.txt) | | MobileViT | 78.2 | 79.4 | [Distil-MViT-config](distillation/teacher_resnet101_student_mobilevit.yaml) | [Distil-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilevit.pt) | [Distil-MViT-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilevit_logs.txt) | ***Note***: * ERM results are from [here](README-classification.md) * For MobileViT, we use EMA checkpoint (as suggested in the paper). ================================================ FILE: projects/range_augment/README-object-detection.md ================================================ # Training Mask R-CNN for object detection and instance segmentation with RangeAugment ## Training Mask R-CNN on the MS-COCO dataset Single node `8 A100 GPU` training of different mobile and non-mobile backbones with Mask R-CNN can be done using below command: ``` export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` Please see [detection](./detection) folder for configuration files of different models. ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Evaluating the detection model Evaluation on the validation set can be done using the below command: ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export MODEL_WEIGHTS="PATH_TO_MODEL_WEIGHTS_FILE" export DATASET_PATH="PATH_TO_DATASET" CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE \ --common.results-loc seg_results \ --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images \ --evaluation.detection.mode validation_set \ --common.override-kwargs dataset.root_val=$DATASET_PATH ``` ## Results on the MS-COCO dataset | Backbone | BBox mAP | Seg mAP | Config | Weights | Logs | |----------------------|----------|---------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------| | MobileNetv1-1.0 | 39.4 | 35.6 | [MaskRCNN-MV1-config](detection/maskrcnn_mobilenet_v1.yaml) | [MaskRCNN-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v1.pt) | [MaskRCNN-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v1_logs.txt) | | MobileNetv2-1.0 | 38.4 | 34.7 | [MaskRCNN-MV2-config](detection/maskrcnn_mobilenet_v2.yaml) | [MaskRCNN-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v2.pt) | [MaskRCNN-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v2_logs.txt) | | MobileNetv3-Large | 35.6 | 32.5 | [MaskRCNN-MV3-config](detection/maskrcnn_mobilenet_v3.yaml) | [MaskRCNN-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v3.pt) | [MaskRCNN-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v3_logs.txt) | | MobileViT-Small | 42.0 | 37.7 | [MaskRCNN-MViT-config](detection/maskrcnn_mobilevit.yaml) | [MaskRCNN-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt) | [MaskRCNN-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit_logs.txt) | | EfficientNet-B3 | 44.5 | 39.5 | [MaskRCNN-EB3-config](detection/maskrcnn_efficientnet_b3.yaml) | [MaskRCNN-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_efficientnet_b3.pt) | [MaskRCNN-EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_efficientnet_b3_logs.txt) | | ResNet-50 | 44.0 | 39.5 | [MaskRCNN-R50-config](detection/maskrcnn_resnet_50.yaml) | [MaskRCNN-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50.pt) | [MaskRCNN-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50_logs.txt) | | ResNet-101 | 46.1 | 41.1 | [MaskRCNN-R101-config](detection/maskrcnn_resnet_101.yaml) | [MaskRCNN-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_101.pt) | [MaskRCNN-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_101_logs.txt) | ## Demo ```bash export IMG_PATH="http://farm2.staticflickr.com/1173/678795137_bb1a91f659_z.jpg" export CFG_FILE="projects/range_augment/detection/maskrcnn_resnet_50.yaml" export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50.pt" corenet-eval-det --common.config-file $CFG_FILE \ --common.results-loc results \ --model.detection.pretrained $MODEL_WEIGHTS \ --model.detection.n-classes 81 \ --evaluation.detection.resize-input-images \ --evaluation.detection.mode single_image \ --evaluation.detection.path "${IMG_PATH}" \ --model.detection.mask-rcnn.box-score-thresh 0.7 ``` ***Notes*** * Adjust the value of bounding box threshold using `--model.detection.mask-rcnn.box-score-thresh` to control the number of boxes and mask instances to be displayed. * If running on CPU, please disable mixed precision by adding following arguments to above command `--common.override-kwargs common.mixed_precision=false` ================================================ FILE: projects/range_augment/README-segmentation.md ================================================ # Training Segmentations Models with RangeAugment ## Training DeepLabv3 on the ADE20k and PASCAL VOC datasets Single node `1 A100 GPU` training of different mobile and non-mobile backbones with Deeplabv3 segmentation head can be done using below command: ``` export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" corenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results ``` Please see [ade20k](./segmentation/ade20k) and [pascal_voc](./segmentation/pascal_voc) folder for configuration files of different models. ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ## Evaluating the segmentation model Evaluation on the validation set can be done using the below command: ```bash export CFG_FILE="PATH_TO_MODEL_CONFIGURATION_FILE" export MODEL_WEIGHTS="PATH_TO_MODEL_WEIGHTS_FILE" CUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --common.results-loc seg_results --model.segmentation.pretrained $MODEL_WEIGHTS ``` ## Results on the ADE20k dataset | Backbone | Top-1 | Config | Weights | Logs | |----------------------|-------|----------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| | MobileNetv1-1.0 | 39.4 | [DeepLabv3-MV1-config](segmentation/ade20k/deeplabv3_mobilenet_v1.yaml) | [DeepLabv3-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1.pt) | [DeepLabv3-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1_logs.txt) | | MobileNetv2-1.0 | 38.6 | [DeepLabv3-MV2-config](segmentation/ade20k/deeplabv3_mobilenet_v2.yaml) | [DeepLabv3-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2.pt) | [DeepLabv3-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2_logs.txt) | | MobileNetv3-Large | 38.9 | [DeepLabv3-MV3-config](segmentation/ade20k/deeplabv3_mobilenet_v3.yaml) | [DeepLabv3-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3.pt) | [DeepLabv3-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3_logs.txt) | | MobileViTv1-Small | 38.5 | [DeepLabv3-MViT-config](segmentation/ade20k/deeplabv3_mobilevit.yaml) | [DeepLabv3-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit.pt) | [DeepLabv3-MViT-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit_logs.txt) | | EfficientNet-B3 | 43.9 | [DeepLabv3-EB3-config](segmentation/ade20k/deeplabv3_efficientnet_b3.yaml) | [DeepLabv3-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3.pt) | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3_logs.txt) | | ResNet-50 | 44.0 | [DeepLabv3-R50-config](segmentation/ade20k/deeplabv3_resnet_50.yaml) | [DeepLabv3-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_50.pt) | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_50_logs.txt) | | ResNet-101 | 46.5 | [DeepLabv3-R101-config](segmentation/ade20k/deeplabv3_resnet_101.yaml) | [DeepLabv3-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_101.pt) | [DeepLabv3-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_101_logs.txt) | ## Results on the PASCAL VOC 2012 dataset | Backbone | Top-1 | Config | Weights | Logs | |----------------------|-------|--------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| | MobileNetv1-1.0 | 77.2 | [DeepLabv3-MV1-config](segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml) | [DeepLabv3-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt) | [DeepLabv3-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1_log.txt) | | MobileNetv2-1.0 | 76.7 | [DeepLabv3-MV2-config](segmentation/pascal_voc/deeplabv3_mobilenet_v2.yaml) | [DeepLabv3-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2.pt) | [DeepLabv3-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2_log.txt) | | MobileNetv3-Large | 77.0 | [DeepLabv3-MV3-config](segmentation/pascal_voc/deeplabv3_mobilenet_v3.yaml) | [DeepLabv3-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3.pt) | [DeepLabv3-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3_log.txt) | | EfficientNet-B3 | 82.0 | [DeepLabv3-EB3-config](segmentation/pascal_voc/deeplabv3_efficientnet_b3.yaml) | [DeepLabv3-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3.pt) | [DeepLabv3-EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3_log.txt) | | ResNet-50 | 81.2 | [DeepLabv3-R50-config](segmentation/pascal_voc/deeplabv3_resnet_50.yaml) | [DeepLabv3-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.pt) | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50_logs.txt) | | ResNet-101 | 84.0 | [DeepLabv3-R101-config](segmentation/pascal_voc/deeplabv3_resnet_101.yaml) | [DeepLabv3-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101.pt) | [DeepLabv3-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101_logs.txt) | ## Demo ```bash export IMG_PATH="http://farm2.staticflickr.com/1173/678795137_bb1a91f659_z.jpg" export CFG_FILE="projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.yaml" export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.pt" corenet-eval-seg --common.config-file $CFG_FILE \ --common.results-loc results \ --model.segmentation.pretrained $MODEL_WEIGHTS \ --evaluation.segmentation.mode single_image \ --evaluation.segmentation.path "${IMG_PATH}" \ --evaluation.segmentation.apply-color-map \ --evaluation.segmentation.save-overlay-rgb-pred ``` ***Notes*** * If running on CPU, please disable mixed precision by adding following arguments to above command `--common.override-kwargs common.mixed_precision=false` ================================================ FILE: projects/range_augment/README.md ================================================ # RangeAugment: Efficient Online Augmentation with Range Learning [RangeAugment](https://arxiv.org/abs/2212.10553) is an automatic augmentation method that allows us to learn `model- and task-specific` magnitude range of each augmentation operation. We provide training and evaluation code along with pretrained models and configuration files for the following tasks: 1. [Image Classification on the ImageNet dataset](./README-classification.md) 2. [Semantic segmentation on the ADE20k and the PASCAL VOC datasets](./README-segmentation.md) 3. [Object detection on the MS-COCO dataset](./README-object-detection.md) 4. [Contrastive Learning using Image-Text pairs](./README-clip.md) 5. [Distillation on the ImageNet dataset](./README-distillation.md) ***Note***: In the [codebase](../../corenet/modeling/neural_augmentor), we refer RangeAugment as Neural Augmentor (or NA). ## Citation If you find our work useful, please cite: ```BibTex @article{mehta2022rangeaugment, title={RangeAugment: Efficient Online Augmentation with Range Learning}, author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad}, journal={arXiv preprint arXiv:2212.10553}, year={2022}, url={https://arxiv.org/abs/2212.10553}, } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/range_augment/classification/efficientnet_b0.yaml ================================================ taskname: '+ EfficientNet-B0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 400 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b0" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/efficientnet_b1.yaml ================================================ taskname: '+ EfficientNet-B1' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related parameters resize: enable: true size: 256 interpolation: "bilinear" center_crop: enable: true size: 256 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 240 crop_size_height: 240 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 352 min_crop_size_height: 128 max_crop_size_height: 352 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 400 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b1" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/efficientnet_b2.yaml ================================================ taskname: '+ EfficientNet-B2' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related parameters resize: enable: true size: 288 interpolation: "bilinear" center_crop: enable: true size: 288 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 260 crop_size_height: 260 max_n_scales: 10 min_crop_size_width: 160 max_crop_size_width: 384 min_crop_size_height: 160 max_crop_size_height: 384 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 400 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b3" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/efficientnet_b3.yaml ================================================ taskname: '+ EfficientNet-B3' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true accum_freq: 2 dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 2048 (128 * 2 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related parameters resize: enable: true size: 320 interpolation: "bilinear" center_crop: enable: true size: 320 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 300 crop_size_height: 300 max_n_scales: 10 min_crop_size_width: 160 max_crop_size_width: 448 min_crop_size_height: 160 max_crop_size_height: 448 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 400 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b3" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/mobilenet_v1.yaml ================================================ taskname: '+ MobileNetv1-1.0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training transforms random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation transforms resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv1" n_classes: 1000 activation: name: "relu" mobilenetv1: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/mobilenet_v2.yaml ================================================ taskname: '+ MobileNetv2-1.0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPU cores persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv2" n_classes: 1000 activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/mobilenet_v3.yaml ================================================ taskname: '+ MobileNetv3-Large' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv3" n_classes: 1000 mobilenetv3: mode: "large" width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/mobilevit_v1.yaml ================================================ taskname: '+ MobileViT-Small' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/imagenet/training" # Please update the location of training set root_val: "/mnt/imagenet/validation" # Please update the location of validation set name: "imagenet" category: "classification" train_batch_size0: 128 # In our experiments, we used an effective batch size of 1024 (128 images/GPU * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related parameters resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 256 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 256 crop_size_height: 256 max_n_scales: 5 min_crop_size_width: 160 max_crop_size_width: 320 min_crop_size_height: 160 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: false weight_decay: 0.01 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 20000 # longer warm-up warmup_init_lr: 0.0002 cosine: max_lr: 0.002 min_lr: 0.0002 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilevit" classifier_dropout: 0.1 n_classes: 1000 mit: mode: "small" ffn_dropout: 0.0 attn_dropout: 0.0 dropout: 0.1 number_heads: 4 no_fuse_local_global_features: false conv_kernel_size: 3 activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/regnety_16gf.yaml ================================================ taskname: '+ RegNetY-16GF' common: run_label: "train" log_freq: 100 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related transform parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transform parameters resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 150 warmup_iterations: 5000 # roughly 5 epochs warmup_init_lr: 0.05 cosine: max_lr: 0.5 min_lr: 2.e-4 model: classification: name: "regnet" n_classes: 1000 activation: name: "relu" regnet: mode: "y_16gf" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/resnet_101.yaml ================================================ taskname: '+ ResNet-101' common: run_label: "train" log_freq: 100 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related transform parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transform parameters resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 600 warmup_iterations: 5000 # roughly 5 epochs warmup_init_lr: 0.05 cosine: max_lr: 0.5 min_lr: 2.e-4 model: classification: name: "resnet" n_classes: 1000 activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/resnet_50.yaml ================================================ taskname: '+ ResNet-50' common: run_label: "train" log_freq: 100 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related transform parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transform parameters resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 600 warmup_iterations: 5000 # roughly 5 epochs warmup_init_lr: 0.05 cosine: max_lr: 0.5 min_lr: 2.e-4 model: classification: name: "resnet" n_classes: 1000 activation: name: "relu" resnet: depth: 50 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/se_resnet_50.yaml ================================================ taskname: '+ SE-ResNet-50' common: run_label: "train" log_freq: 100 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related transform parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transform parameters resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 600 warmup_iterations: 5000 # roughly 5 epochs warmup_init_lr: 0.05 cosine: max_lr: 0.5 min_lr: 2.e-4 model: classification: name: "resnet" n_classes: 1000 activation: name: "relu" resnet: depth: 50 se_resnet: true learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/swin_transformer_small.yaml ================================================ taskname: '+ SwinTransformer-Small' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false grad_clip: 5.0 save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transforms resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true bs: crop_size_width: 224 crop_size_height: 224 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: true max_iterations: 375000 # 300 epochs * 1250 iterations per epoch warmup_iterations: 25000 # roughly 20 epochs warmup_init_lr: 1.e-6 cosine: max_lr: 0.001 min_lr: 0.00001 model: classification: name: "swin" n_classes: 1000 swin: mode: "small" activation: name: "gelu" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/classification/swin_transformer_tiny.yaml ================================================ taskname: '+ SwinTransformer-tiny' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false grad_clip: 5.0 save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true mixup: enable: true alpha: 0.2 p: 1.0 cutmix: enable: true alpha: 1.0 p: 1.0 # validation related transforms resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true bs: crop_size_width: 224 crop_size_height: 224 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 5 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: true max_iterations: 375000 # 300 epochs * 1250 iterations per epoch warmup_iterations: 25000 # roughly 20 epochs warmup_init_lr: 1.e-6 cosine: max_lr: 0.001 min_lr: 0.00001 model: classification: name: "swin" n_classes: 1000 swin: mode: "tiny" activation: name: "gelu" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/clip/clip_vit_base.yaml ================================================ taskname: '+ CLIP-ViT-B/16' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true accum_freq: 1 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset is information is expected # to be contained in metadata file. root_train: "" root_val: "/mnt/vision_datasets/imagenet/validation" name: "img_text_tar" # effective batch size is > 65536 as we use multi-scale variable-batch sampler # 65k = (32 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 80 GB memory) train_batch_size0: 256 val_batch_size0: 4 eval_batch_size0: 4 persistent_workers: false pin_memory: true workers: 16 collate_fn_name_train: "multi_modal_img_text_collate_fn" collate_fn_name_val: "multi_modal_img_text_collate_fn" collate_fn_name_test: "multi_modal_img_text_collate_fn" name: "img_text_tar" category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet" context_length: 77 img_text_tar: # ADD PATH OF METADATA FILE metadata_file: "PATH_OF_METADATA_FILE" text_tokenizer: name: "clip" clip: merges_path: "http://download.pytorch.org/models/text/clip_merges.bpe" encoder_json_path: "http://download.pytorch.org/models/text/clip_encoder.json" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" scale: [0.9, 1.0] resize: enable: true size: 224 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" use_shards: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 160 max_crop_size_width: 320 min_crop_size_height: 160 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "multi_modal_image_text" loss_weight: 1.0 multi_modal_image_text: name: "contrastive_loss_clip" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.2 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.98 eps: 1.e-6 scheduler: is_iteration_based: true max_epochs: 12 max_iterations: 150000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0005 min_lr: 1.e-06 model: activation_checkpointing: true multi_modal_image_text: name: "clip" lr_multiplier_img_encoder: 1.0 lr_multiplier_text_encoder: 1.0 clip: projection_dim: 512 classification: name: "vit" vit: mode: "base" norm_layer: "layer_norm_fp32" activation: name: "gelu" image_projection_head: name: "simple_projection_nc2nc" text: # text encoder name: "transformer" vocab_size: 49408 context_length: 77 transformer: causal_masking: true model_dim: 512 no_scale_embedding: false no_pos_embedding: false embed_dropout: 0.0 dropout: 0.0 attn_dropout: 0.0 ffn_dropout: 0.0 n_transformer_layers: 12 ffn_multiplier_per_layer: 4.0 n_heads_per_layer: 8 norm_layer: "layer_norm_fp32" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "top1" ] train: ["loss", "grad_norm" ] checkpoint_metric: "top1.zero_shot_image_logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/clip/clip_vit_huge.yaml ================================================ # pytest: disable taskname: '+ CLIP-ViT-H/16' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true # for larger models, we found bfloat16 leads to more stable training mixed_precision_dtype: "bfloat16" accum_freq: 1 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset is information is expected # to be contained in metadata file. root_train: "" root_val: "/mnt/vision_datasets/imagenet/validation" # effective batch size is > 131k as we use multi-scale variable-batch sampler # 131k = (64 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 80 GB memory) train_batch_size0: 256 val_batch_size0: 4 eval_batch_size0: 4 persistent_workers: false pin_memory: true workers: 16 collate_fn_name_train: "multi_modal_img_text_collate_fn" collate_fn_name_val: "multi_modal_img_text_collate_fn" collate_fn_name_test: "multi_modal_img_text_collate_fn" name: "img_text_tar" category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet" context_length: 77 img_text_tar: # ADD PATH OF METADATA FILE metadata_file: "PATH_OF_METADATA_FILE" text_tokenizer: name: "clip" clip: merges_path: "http://download.pytorch.org/models/text/clip_merges.bpe" encoder_json_path: "http://download.pytorch.org/models/text/clip_encoder.json" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" scale: [0.9, 1.0] resize: enable: true size: 224 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" use_shards: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 160 max_crop_size_width: 320 min_crop_size_height: 160 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "multi_modal_image_text" loss_weight: 1.0 multi_modal_image_text: name: "contrastive_loss_clip" - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.2 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.98 eps: 1.e-6 scheduler: name: "cosine" is_iteration_based: true max_iterations: 120000 warmup_iterations: 1000 warmup_init_lr: 1.e-6 cosine: max_lr: 5.e-4 min_lr: 1.e-6 model: activation_checkpointing: true multi_modal_image_text: # multi-modal image-text model name: "clip" lr_multiplier_img_encoder: 1.0 lr_multiplier_text_encoder: 1.0 clip: projection_dim: 512 classification: name: "vit" vit: mode: "huge" norm_layer: "layer_norm_fp32" activation: name: "gelu" image_projection_head: name: "simple_projection_nc2nc" text: # text encoder name: "transformer" vocab_size: 49408 context_length: 77 transformer: causal_masking: true model_dim: 768 no_scale_embedding: false no_pos_embedding: false embed_dropout: 0.0 dropout: 0.0 attn_dropout: 0.0 ffn_dropout: 0.0 n_transformer_layers: 12 ffn_multiplier_per_layer: 4.0 n_heads_per_layer: 12 norm_layer: "layer_norm_fp32" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "top1" ] train: ["loss", "grad_norm" ] checkpoint_metric: "top1.zero_shot_image_logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/clip_finetune_imagenet/clip_vit_base.yaml ================================================ taskname: '+ CLIP-ViT-B/16 + FT-IN1k' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 64 # effective batch size is 512 (64 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 eps: 1.e-6 scheduler: name: "cosine" is_iteration_based: false max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 1.e-6 model: resume_exclude_scopes: ["text_encoder", "logit_scale", "image_encoder.classifier.proj", "simple_fpn"] ignore_missing_scopes: ["classifier"] rename_scopes_map: [["image_encoder.", ""]] activation_checkpointing: true classification: name: "vit" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt" vit: mode: "base" norm_layer: "layer_norm_fp32" activation: name: "gelu" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/clip_finetune_imagenet/clip_vit_huge.yaml ================================================ # pytest: disable taskname: '+ CLIP-ViT-H/16 + FT-IN1k' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 64 # effective batch size is 512 (64 * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 10 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 eps: 1.e-6 scheduler: name: "cosine" is_iteration_based: false max_epochs: 10 warmup_iterations: 500 warmup_init_lr: 1.e-6 cosine: max_lr: 0.00003 min_lr: 1.e-6 model: activation_checkpointing: true resume_exclude_scopes: ["text_encoder", "logit_scale", "image_encoder.classifier.proj", "simple_fpn"] ignore_missing_scopes: ["classifier"] rename_scopes_map: [["image_encoder.", ""]] classification: name: "vit" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16.pt" vit: mode: "huge" norm_layer: "layer_norm_fp32" activation: name: "gelu" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/detection/maskrcnn_efficientnet_b3.yaml ================================================ taskname: '+ EfficientNet-B3 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.05 milestones: [60, 84] model: activation_checkpointing: true detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "efficientnet" activation: name: "swish" efficientnet: mode: "b3" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_mobilenet_v1.yaml ================================================ taskname: '+ MobileNetv1 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "mobilenetv1" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt" activation: name: "relu" mobilenetv1: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_mobilenet_v2.yaml ================================================ taskname: '+ MobileNetv2 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "mobilenetv2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt" activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_mobilenet_v3.yaml ================================================ taskname: '+ MobileNetv3 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "mobilenetv3" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt" mobilenetv3: mode: "large" width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_mobilevit.yaml ================================================ taskname: '+ MobileViT Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "mobilevit" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt" classifier_dropout: 0.1 mit: mode: "small" ffn_dropout: 0.0 attn_dropout: 0.0 dropout: 0.1 number_heads: 4 no_fuse_local_global_features: false conv_kernel_size: 3 activation: name: "swish" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_resnet_101.yaml ================================================ taskname: '+ ResNet-101 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/detection/maskrcnn_resnet_50.yaml ================================================ taskname: '+ ResNet-50 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4 # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs) # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation # takes fewer optimization updates for training. train_batch_size0: 4 val_batch_size0: 4 workers: 8 persistent_workers: false pin_memory: true name: "coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [1024, 1024] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 1024 crop_size_width: 1024 max_crop_size_height: 1280 max_crop_size_width: 1280 max_n_scales: 10 min_crop_size_height: 512 min_crop_size_width: 512 loss: category: "composite_loss" composite_loss: - loss_category: "detection" loss_weight: 1.0 detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 100 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "sync_batch_norm" classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt" activation: name: "relu" resnet: depth: 50 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v1.yaml ================================================ taskname: '+ Student: MobileNetv1-1.0; Teacher: ResNet-101' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true image_augmentation: # training transforms random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation transforms resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "distillation" loss_weight: 1.0 distillation: name: "soft_kl_loss" soft_kl_loss: temperature: 1.0 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 teacher: model: classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv1" n_classes: 1000 activation: name: "relu" mobilenetv1: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v2.yaml ================================================ taskname: '+ Student: MobileNetv2-1.0; Teacher: ResNet-101' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: -1 # use all CPU cores persistent_workers: true pin_memory: true image_augmentation: # training transforms random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation transforms resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "distillation" loss_weight: 1.0 distillation: name: "soft_kl_loss" soft_kl_loss: temperature: 1.0 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 teacher: model: classification: name: "resnet" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" n_classes: 1000 activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv2" n_classes: 1000 activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v3.yaml ================================================ taskname: '+ Student: MobileNetv3-Large; Teacher: ResNet-101' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 232 # shorter size is 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "distillation" loss_weight: 1.0 distillation: name: "soft_kl_loss" soft_kl_loss: temperature: 1.0 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilenetv3" n_classes: 1000 mobilenetv3: mode: "large" width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" teacher: model: classification: n_classes: 1000 name: "resnet" pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/distillation/teacher_resnet101_student_mobilevit.yaml ================================================ taskname: '+ Student: MobileViT-S; Teacher: ResNet-101' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" # Please update the location of training set root_val: "/mnt/imagenet/validation" # Please update the location of validation set name: "imagenet" category: "classification" train_batch_size0: 128 # In our experiments, we used an effective batch size of 1024 (128 images/GPU * 8 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related parameters resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 256 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 256 crop_size_height: 256 max_n_scales: 5 min_crop_size_width: 160 max_crop_size_width: 320 min_crop_size_height: 160 max_crop_size_height: 320 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "distillation" loss_weight: 1.0 distillation: name: "soft_kl_loss" soft_kl_loss: temperature: 1.0 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "adamw" no_decay_bn_filter_bias: false weight_decay: 0.01 adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 20000 # longer warm-up warmup_init_lr: 0.0002 cosine: max_lr: 0.002 min_lr: 0.0002 model: learn_augmentation: brightness: true contrast: true mode: distribution noise: true classification: name: "mobilevit" classifier_dropout: 0.1 n_classes: 1000 mit: mode: "small" ffn_dropout: 0.0 attn_dropout: 0.0 dropout: 0.1 number_heads: 4 no_fuse_local_global_features: false conv_kernel_size: 3 activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 teacher: model: classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3.yaml ================================================ taskname: '+ DeepLabv3+EfficientNet-B3' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: activation_checkpointing: true segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b3" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv1-1.0' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv1" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt" activation: name: "relu" mobilenetv1: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv2-1.0' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt" activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv3-Large' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPU) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv3" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt" mobilenetv3: mode: "large" width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml ================================================ taskname: '+ DeepLabv3+MobileViTv1-Small' common: run_label: "train" accum_freq: 2 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( single A100 GPU) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: activation_checkpointing: true segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilevit" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt" classifier_dropout: 0.1 mit: mode: "small" ffn_dropout: 0.0 attn_dropout: 0.0 dropout: 0.1 number_heads: 4 no_fuse_local_global_features: false conv_kernel_size: 3 activation: name: "swish" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_resnet_101.yaml ================================================ taskname: '+ DeepLabv3+ResNet-101' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/ade20k/deeplabv3_resnet_50.yaml ================================================ taskname: '+ DeepLabv3+ResNet-50' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs) val_batch_size0: 4 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: -1 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt" activation: name: "relu" resnet: depth: 50 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3.yaml ================================================ taskname: '+ DeepLabv3+EfficientNet-B3' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: activation_checkpointing: true segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "efficientnet" n_classes: 1000 activation: name: "swish" efficientnet: mode: "b3" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt" learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv1-1.0' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv1" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt" activation: name: "relu" mobilenetv1: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv2-1.0' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv2" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt" activation: name: "relu6" mobilenetv2: width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3.yaml ================================================ taskname: '+ DeepLabv3+MobileNetv3-Large' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true save_all_checkpoints: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 30 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv3" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt" mobilenetv3: mode: "large" width_multiplier: 1.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101.yaml ================================================ taskname: '+ DeepLabv3+ResNet-101' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt" activation: name: "relu" resnet: depth: 101 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.yaml ================================================ taskname: '+ DeepLabv3+ResNet-50' common: run_label: "train" accum_freq: 1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" root_val: "/mnt/vision_datasets/pascal_voc/VOCdevkit/" name: "pascal" category: "segmentation" train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs) val_batch_size0: 16 eval_batch_size0: 1 workers: 8 persistent_workers: true pin_memory: true pascal: use_coco_data: true coco_root_dir: "/mnt/vision_datasets/coco_preprocess" image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # background idx random_horizontal_flip: enable: true resize: enable: true size: [512, 512] interpolation: "bicubic" random_short_size_resize: enable: true interpolation: "bicubic" short_side_min: 256 short_side_max: 768 max_img_dim: 1024 sampler: name: "batch_sampler" bs: crop_size_width: 512 crop_size_height: 512 loss: category: "composite_loss" composite_loss: - loss_category: "segmentation" loss_weight: 1.0 segmentation: name: "cross_entropy" cross_entropy: ignore_index: 255 aux_weight: 0.4 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 20 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 50 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 21 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 512 aspp_rates: [ 12, 24, 36 ] classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt" activation: name: "relu" resnet: depth: 50 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true # During evaluation (with corenet-eval-seg), we follow following steps: # 1. Determine and store the size of input image as metadata # 2. Resize image while maintaining the aspect ratio # 3. Make a prediction # 4. Resize the predicted mask to the same size as original input image # 5. compute results evaluation: segmentation: resize_input_images: true mode: "validation_set" ================================================ FILE: projects/resnet/README.md ================================================ # ResNet [ResNet](https://arxiv.org/abs/1512.03385) introduces skip connections to develop a more accurate visual recognition backbone. We provide training and evaluation code of ResNet, along with pretrained models and configuration files for the following tasks: ## Image classification on the ImageNet dataset ### Training To train ResNet50 on [ImageNet 1k](https://image-net.org) with the advanced recipe, using a single node with 8 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/resnet/classification/resnet50_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` We assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. ### Evaluation To evaluate the pre-trained ResNet50 model on the validation set of the ImageNet, run the following command: ```bash export CFG_FILE="projects/resnet/classification/resnet50_in1k.yaml" export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=80.37 || top5=95.056 ``` ## Object detection on the MS-COCO dataset ### Training To train ResNet50 on MS-COCO using a single node with 8 A100 GPUs, run the following command: ```bash export CFG_FILE="projects/resnet/detection/ssd_resnet50_coco.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc detection_results ``` ### Evaluation To evaluate the pre-trained detection model on the validation set of the COCO, run the following command: ```bash export CFG_FILE="projects/resnet/detection/ssd_resnet50_coco.yaml" export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.pt CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --common.results-loc detection_results --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set ``` This should give ``` Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.300 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.482 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.309 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.073 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.315 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.531 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.271 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.402 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.426 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.141 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.475 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.680 ``` ## Pretrained Models ### Classification (ImageNet-1k) | Model | Parameters | Top-1 | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | ResNet-34 | 21.8 M | 74.85 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.logs) | | ResNet-50 | 25.6 M | 78.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.logs) | | ResNet-101 | 44.5 M | 79.81 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.logs) | | ResNet-34 (advanced recipe) | 21.8 M | 76.91 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.logs) | | ResNet-50 (advanced recipe) | 25.6 M | 80.36 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.logs) | | ResNet-101 (advanced recipe) | 44.5 M | 81.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.logs) | ### Object Detection (MS-COCO) | Model | Parameters | MAP | Pretrained weights | Config file | Logs | | --- | --- | --- | --- | --- | --- | | SSD ResNet-50 | 28.5 M | 30.0 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.logs) | ## Citation If you find our work useful, please cite following papers: ```BibTex @article{He2015DeepRL, title={Deep Residual Learning for Image Recognition}, author={Kaiming He and X. Zhang and Shaoqing Ren and Jian Sun}, journal={2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, year={2015}, pages={770-778}, url={https://api.semanticscholar.org/CorpusID:206594692} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/resnet/classification/resnet50_in1k.yaml ================================================ taskname: '+ ResNet-50 [adv]' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true tensorboard_logging: false channels_last: true save_all_checkpoints: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" image_augmentation: random_resized_crop: enable: true interpolation: "bicubic" random_horizontal_flip: enable: true rand_augment: enable: true mixup: enable: true alpha: 0.2 random_erase: enable: true p: 0.25 cutmix: enable: true alpha: 1.0 resize: enable: true size: 256 # shorter size is 256 interpolation: "bicubic" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 600 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4 model: classification: name: "resnet" n_classes: 1000 activation: name: "relu" resnet: depth: 50 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: projects/resnet/detection/ssd_resnet50_coco.yaml ================================================ taskname: '+ ResNet-50 SSD' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 100 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/vision_datasets/coco" root_val: "/mnt/vision_datasets/coco" category: "detection" train_batch_size0: 16 # effective batch size is 64 (16 * 4 GPUs) val_batch_size0: 16 workers: 8 persistent_workers: false pin_memory: true name: "coco_ssd" collate_fn_name_train: "coco_ssd_collate_fn" collate_fn_name_val: "coco_ssd_collate_fn" image_augmentation: resize: enable: true size: [384, 384] interpolation: "bicubic" sampler: name: "batch_sampler" bs: crop_size_width: 384 crop_size_height: 384 loss: category: "detection" detection: name: "ssd_multibox_loss" ssd_multibox_loss: neg_pos_ratio: 3 optim: name: "sgd" weight_decay: 5.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" is_iteration_based: false max_epochs: 200 warmup_iterations: 1800 # 5 epochs warmup_init_lr: 1.e-6 cosine: max_lr: 0.0052 min_lr: 0.00005 anchor_generator: name: "ssd" ssd: output_strides: [16, 32, 64, 128] aspect_ratios: [ [2, 3], [2, 3], [2, 3], [2, 3]] min_scale_ratio: 0.1 max_scale_ratio: 1.05 matcher: name: "ssd" ssd: center_variance: 0.1 size_variance: 0.2 iou_threshold: 0.5 model: detection: name: "ssd" n_classes: 81 ssd: proj_channels: [512, 1024, 512, 256] nms_iou_threshold: 0.5 classification: name: "resnet" n_classes: 1000 pretrained: "https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt" activation: name: "relu" resnet: depth: 50 normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true ================================================ FILE: projects/vit/README.md ================================================ # Vision Transformer (ViT) [ViT](https://arxiv.org/abs/2010.11929) is a transformer-based models for visual recognition tasks. Note that our vision transformer model is different from the original ViT models in several aspects, including agnostic to input image scales. Please see [our RangeAugment paper](https://arxiv.org/abs/2212.10553) where we trained CLIP model with ViT-B/16 and ViT-H/16 with different input image resolutions. We provide training and evaluation code along with pretrained models and configuration files for the task of object classification on the ImageNet dataset. ## ImageNet classification ### Training Single node 4 A100 GPU training of [ViT-Base/16](./classification/vit_base.yaml) can be done using below command: ```bash export CFG_FILE="projects/vit/classification/vit_base_in1k.yaml" corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results ``` ***Note***: Do not forget to change the training and validation dataset locations in configuration files. ### Evaluation To evaluate the pre-trained ViT-Base model on the validation set of the ImageNet, run the following command: ```bash export MODEL_WEIGHTS="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/vit/imagenet-1k/vit_base.pt" export CFG_FILE="projects/vit/classification/vit_base_in1k.yaml" export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH ``` This should give ``` top1=80.736 || top5=95.182 ``` ## Citation If you find our work useful, please cite following papers: ```BibTex @inproceedings{dosovitskiy2021an, title={An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, author={Alexey Dosovitskiy and Lucas Beyer and Alexander Kolesnikov and Dirk Weissenborn and Xiaohua Zhai and Thomas Unterthiner and Mostafa Dehghani and Matthias Minderer and Georg Heigold and Sylvain Gelly and Jakob Uszkoreit and Neil Houlsby}, booktitle={International Conference on Learning Representations}, year={2021}, url={https://openreview.net/forum?id=YicbFdNTTy} } @article{mehta2022rangeaugment, title={RangeAugment: Efficient Online Augmentation with Range Learning}, author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad}, journal={arXiv preprint arXiv:2212.10553}, year={2022}, url={https://arxiv.org/abs/2212.10553}, } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} } ``` ================================================ FILE: projects/vit/classification/vit_base_in1k.yaml ================================================ taskname: '+ ViT-Base/16' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true grad_clip: 1.0 dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" # Effective batch size used in our experiments is 2048 (512 images per GPU * 4 A100 40 GB GPUs) train_batch_size0: 512 val_batch_size0: 100 eval_batch_size0: 100 workers: -1 persistent_workers: true pin_memory: true image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 256 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" num_repeats: 4 truncated_repeat_aug_sampler: true vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: no_decay_bn_filter_bias: true weight_decay: 0.2 name: "adamw" adamw: beta1: 0.9 beta2: 0.999 scheduler: max_epochs: 300 warmup_init_lr: 1.0e-06 warmup_iterations: 7500 name: "cosine" cosine: max_lr: 0.002 min_lr: 2.0e-05 model: activation_checkpointing: true classification: name: "vit" n_classes: 1000 vit: mode: "base" norm_layer: "layer_norm_fp32" use_flash_attention: true activation: name: "gelu" normalization: momentum: 0.1 name: "batch_norm" layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: pyproject.toml ================================================ [tool.isort] profile = "black" skip_gitignore = true [tool.black] extend-exclude = '.history' [tool.pytest.ini_options] junit_family = 'xunit2' # Add-opts documentation: # "-p no:warnings" instructs pytest to avoid modifying warnings.filters, as we have a # custom implementation for filtering warnings in corenet/__init__.py. In the CI, the # unexpected warnings are automatically converted to errors by corenet/__init__.py. # "--junit-xml" generates execution metadata that is used for visualizing test results. addopts = '-p no:warnings --junit-xml=./build/test-results/junit_reports/junit.xml' markers = 'skip_ci: Mark a test to be skipped in CI to avoid known issues like download failure.' ================================================ FILE: requirements-optional.txt ================================================ ffmpeg-python==0.2.0 # Installing decord on Mac is tricky. Syntax: https://pip.pypa.io/en/stable/reference/requirement-specifiers/ decord==0.6.0 ; sys_platform == 'linux' ================================================ FILE: requirements.txt ================================================ psutil==5.9.8 ujson==5.9.0 scikit-learn==1.4.1.post1 scikit-image==0.22.0 pyyaml==6.0.1 # requirement for Pytorch, Torchvision, TorchText. # This section must be synchronized with the Dockerfile for # the image used in CI torch==2.3.0 torchvision==0.18.0 torchtext==0.18.0 torchaudio==2.3.0 torchdata==0.7.1 # dependency for coremltools coremltools==7.2 # dependency for MSCOCO dataset pycocotools==2.0.7 # dependency for cityscape evaluation cityscapesscripts==2.2.2 # added as a dependency to reproduce 3rd party models pytorchvideo==0.1.5 # PyAV for video decoding av==12.0.0 # FVCore for FLOP calculation fvcore==0.1.5.post20221221 # black for reformatting black==24.4.0 isort==5.13.2 # testing pytest==8.1.1 pytest-mock==3.14.0 pytest-xdist==3.5.0 pytest-timeout==2.3.1 ftfy==6.2.0 # for hdf5 reading h5py==3.10.0 # for reading byte data pybase64==1.3.2 # For OpenAI's clip tokenizer regex==2023.12.25 pyarrow==15.0.2 numpy==1.26.4 scipy==1.13.0 pandas==2.2.1 tqdm==4.66.2 setuptools==69.2.0 boto3==1.28.30 ================================================ FILE: setup.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import platform import re import sys from pathlib import Path from typing import Dict, List from setuptools import find_packages, setup def is_apple_silicon_macos() -> bool: return platform.machine() == "arm64" and platform.system() == "Darwin" def parse_requirements(path: str) -> List[str]: """Parse a requirements file.""" requirements = [] with open(path, "r", encoding="utf-8") as file: for line in file: line = line.split("#", 1)[0].strip() if not line or line.startswith("-"): continue elif line: requirements.append(line) return requirements def main() -> None: if sys.version_info < (3, 6): sys.exit("Sorry, Python >= 3.6 is required for CoreNet.") if sys.platform == "darwin": extra_compile_args = ["-stdlib=libc++", "-std=c++17", "-O3"] else: extra_compile_args = ["-std=c++17", "-O3"] (version,) = re.findall( r"\d+\.\d+\.\d+", Path("corenet/__version__.py").read_text() ) requirements = parse_requirements("requirements.txt") optional_requirements = parse_requirements("requirements-optional.txt") is_internal = os.path.exists("internal") if is_internal: requirements += parse_requirements("internal/requirements.txt") optional_requirements += parse_requirements( "internal/requirements-optional.txt" ) # When installed as a library in other projects, we don't need dev requirements. dev_requirement_regex = r"^(black|isort|pytest)" dev_requirements = [] for req in requirements[:]: if re.match(dev_requirement_regex, req): dev_requirements.append(req) requirements.remove(req) # Dependencies w.r.t MLX if is_apple_silicon_macos(): # MLX is only available on Apple Silicon macOS. # https://ml-explore.github.io/mlx/build/html/install.html#troubleshooting mlx_requirements = [ "mlx>=0.9.0", "huggingface_hub", ] else: mlx_requirements = [] # Do not install anything sentence_piece_requirements = "sentencepiece>=0.2.0" sys.path.insert(0, "corenet/cli") from entrypoints import console_scripts if is_internal: sys.path.insert(0, "corenet/internal/cli") del sys.modules["entrypoints"] import entrypoints as internal_entrypoints console_scripts += internal_entrypoints.console_scripts setup( name="corenet", version=version, description="CoreNet: A library for training computer vision networks", url="https://github.com/apple/corenet.git", python_requires=">=3.9", setup_requires=[ "setuptools>=18.0", ], install_requires=requirements, extras_require={ "dev": dev_requirements, "optional": optional_requirements, "mlx": mlx_requirements, "sentencepiece": sentence_piece_requirements, "nltk": "nltk>=3.8.1", }, packages=find_packages(include=["corenet*"]), data_files=[ ("corenet-requirements", ["requirements.txt"]), ("corenet-requirements", ["requirements-optional.txt"]), ("corenet-config", get_files("config")), ("corenet-projects", get_files("projects")), ] + ([("corenet-internal", get_files("internal"))] if is_internal else []), test_suite="tests", entry_points={ "console_scripts": console_scripts, }, include_package_data=True, ) def get_files(path, relative_to=".") -> List[str]: all_files = [] for root, _dirs, files in os.walk(path, followlinks=True): root = os.path.relpath(root, relative_to) for file in files: if file.endswith(".pyc"): continue all_files.append(os.path.join(root, file)) return all_files if __name__ == "__main__": main() ================================================ FILE: tests/__init__.py ================================================ ================================================ FILE: tests/configs.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from pathlib import Path from typing import Any, Callable, Optional from corenet.options.opts import get_training_arguments from corenet.options.utils import load_config_file def get_config( config_file: Optional[str] = None, disable_ddp_distributed: bool = True, tmpdir: Optional[Path] = None, add_arguments: Optional[ Callable[[argparse.ArgumentParser], argparse.ArgumentParser] ] = None, ) -> argparse.Namespace: """Produces a resolved config (i.e. opts) object to be used in tests. Args: config_file: If provided, the contents of the @config_file path will override the default configs. disable_ddp_distributed: ``ddp.distributed`` config entry is not defined in the parser, but rather set by the entrypoints on the fly based on the availability of multiple gpus. In the tests, we usually don't want to use ``ddp.distributed``, even if multiple gpus are available. tmpdir: If provided, overrides `opts.artifacts_root` and `opts.logs_root` to "{tmpdir}/artifacts" and "{tmpdir}/logs". Defaults to None (no-op). add_arguments: If provided, wraps the argument parser to modify the parser or to add additional arguments dynamically. Defaults to None. """ if config_file is not None: args = ["--common.config-file", config_file] else: args = [] opts = get_training_arguments(args=args, add_arguments=add_arguments) if disable_ddp_distributed: setattr(opts, "ddp.use_distributed", False) if tmpdir is not None: setattr(opts, "common.results_loc", str(tmpdir / "results")) setattr(opts, "common.logs_loc", str(tmpdir / "logs")) Path(getattr(opts, "common.results_loc")).mkdir(exist_ok=True, parents=True) Path(getattr(opts, "common.logs_loc")).mkdir(exist_ok=True, parents=True) return opts # If slow, this can be turned into a "session"-scoped fixture # @pytest.fixture(scope='session') def default_training_opts() -> argparse.Namespace: opts = get_training_arguments(args=[]) return opts def modify_attr(opts: argparse.Namespace, key: str, value: Any) -> None: """Similar to the builtin setattr() function, but ensures the key already exists to avoid typos or missed renames during refactoring. """ assert hasattr(opts, key), f"Invalid attribute {key}." setattr(opts, key, value) ================================================ FILE: tests/data/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/coco/annotations/instances_train2017.json ================================================ {"info": {"description": "COCO 2017 Dataset", "url": "http://cocodataset.org", "version": "1.0", "year": 2017, "contributor": "COCO Consortium", "date_created": "2017/09/01"}, "licenses": [{"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/", "id": 1, "name": "Attribution-NonCommercial-ShareAlike License"}, {"url": "http://creativecommons.org/licenses/by-nc/2.0/", "id": 2, "name": "Attribution-NonCommercial License"}, {"url": "http://creativecommons.org/licenses/by-nc-nd/2.0/", "id": 3, "name": "Attribution-NonCommercial-NoDerivs License"}, {"url": "http://creativecommons.org/licenses/by/2.0/", "id": 4, "name": "Attribution License"}, {"url": "http://creativecommons.org/licenses/by-sa/2.0/", "id": 5, "name": "Attribution-ShareAlike License"}, {"url": "http://creativecommons.org/licenses/by-nd/2.0/", "id": 6, "name": "Attribution-NoDerivs License"}, {"url": "http://flickr.com/commons/usage/", "id": 7, "name": "No known copyright restrictions"}, {"url": "http://www.usa.gov/copyright.shtml", "id": 8, "name": "United States Government Work"}], "images": [{"license": 4, "file_name": "000000397133.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg", "height": 427, "width": 640, "date_captured": "2013-11-14 17:02:52", "flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg", "id": 397133}, {"license": 1, "file_name": "000000037777.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000037777.jpg", "height": 230, "width": 352, "date_captured": "2013-11-14 20:55:31", "flickr_url": "http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg", "id": 37777}], "annotations": [{"segmentation": [[110.39, 135.78, 110.39, 127.62, 110.01, 119.6, 106.87, 118.47, 104.37, 120.1, 102.49, 122.73, 103.74, 125.49, 105.24, 128.88, 106.87, 132.39, 107.38, 135.78, 110.39, 135.65]], "area": 88.52115000000006, "iscrowd": 0, "image_id": 37777, "bbox": [102.49, 118.47, 7.9, 17.31], "category_id": 64, "id": 22328}, {"segmentation": [[224.24, 297.18, 228.29, 297.18, 234.91, 298.29, 243.0, 297.55, 249.25, 296.45, 252.19, 294.98, 256.61, 292.4, 254.4, 264.08, 251.83, 262.61, 241.53, 260.04, 235.27, 259.67, 230.49, 259.67, 233.44, 255.25, 237.48, 250.47, 237.85, 243.85, 237.11, 240.54, 234.17, 242.01, 228.65, 249.37, 224.24, 255.62, 220.93, 262.61, 218.36, 267.39, 217.62, 268.5, 218.72, 295.71, 225.34, 297.55]], "area": 1481.3806499999994, "iscrowd": 0, "image_id": 397133, "bbox": [217.62, 240.54, 38.99, 57.75], "category_id": 44, "id": 82445}], "categories": [{"supercategory": "person", "id": 1, "name": "person"}, {"supercategory": "vehicle", "id": 2, "name": "bicycle"}, {"supercategory": "vehicle", "id": 3, "name": "car"}, {"supercategory": "vehicle", "id": 4, "name": "motorcycle"}, {"supercategory": "vehicle", "id": 5, "name": "airplane"}, {"supercategory": "vehicle", "id": 6, "name": "bus"}, {"supercategory": "vehicle", "id": 7, "name": "train"}, {"supercategory": "vehicle", "id": 8, "name": "truck"}, {"supercategory": "vehicle", "id": 9, "name": "boat"}, {"supercategory": "outdoor", "id": 10, "name": "traffic light"}, {"supercategory": "outdoor", "id": 11, "name": "fire hydrant"}, {"supercategory": "outdoor", "id": 13, "name": "stop sign"}, {"supercategory": "outdoor", "id": 14, "name": "parking meter"}, {"supercategory": "outdoor", "id": 15, "name": "bench"}, {"supercategory": "animal", "id": 16, "name": "bird"}, {"supercategory": "animal", "id": 17, "name": "cat"}, {"supercategory": "animal", "id": 18, "name": "dog"}, {"supercategory": "animal", "id": 19, "name": "horse"}, {"supercategory": "animal", "id": 20, "name": "sheep"}, {"supercategory": "animal", "id": 21, "name": "cow"}, {"supercategory": "animal", "id": 22, "name": "elephant"}, {"supercategory": "animal", "id": 23, "name": "bear"}, {"supercategory": "animal", "id": 24, "name": "zebra"}, {"supercategory": "animal", "id": 25, "name": "giraffe"}, {"supercategory": "accessory", "id": 27, "name": "backpack"}, {"supercategory": "accessory", "id": 28, "name": "umbrella"}, {"supercategory": "accessory", "id": 31, "name": "handbag"}, {"supercategory": "accessory", "id": 32, "name": "tie"}, {"supercategory": "accessory", "id": 33, "name": "suitcase"}, {"supercategory": "sports", "id": 34, "name": "frisbee"}, {"supercategory": "sports", "id": 35, "name": "skis"}, {"supercategory": "sports", "id": 36, "name": "snowboard"}, {"supercategory": "sports", "id": 37, "name": "sports ball"}, {"supercategory": "sports", "id": 38, "name": "kite"}, {"supercategory": "sports", "id": 39, "name": "baseball bat"}, {"supercategory": "sports", "id": 40, "name": "baseball glove"}, {"supercategory": "sports", "id": 41, "name": "skateboard"}, {"supercategory": "sports", "id": 42, "name": "surfboard"}, {"supercategory": "sports", "id": 43, "name": "tennis racket"}, {"supercategory": "kitchen", "id": 44, "name": "bottle"}, {"supercategory": "kitchen", "id": 46, "name": "wine glass"}, {"supercategory": "kitchen", "id": 47, "name": "cup"}, {"supercategory": "kitchen", "id": 48, "name": "fork"}, {"supercategory": "kitchen", "id": 49, "name": "knife"}, {"supercategory": "kitchen", "id": 50, "name": "spoon"}, {"supercategory": "kitchen", "id": 51, "name": "bowl"}, {"supercategory": "food", "id": 52, "name": "banana"}, {"supercategory": "food", "id": 53, "name": "apple"}, {"supercategory": "food", "id": 54, "name": "sandwich"}, {"supercategory": "food", "id": 55, "name": "orange"}, {"supercategory": "food", "id": 56, "name": "broccoli"}, {"supercategory": "food", "id": 57, "name": "carrot"}, {"supercategory": "food", "id": 58, "name": "hot dog"}, {"supercategory": "food", "id": 59, "name": "pizza"}, {"supercategory": "food", "id": 60, "name": "donut"}, {"supercategory": "food", "id": 61, "name": "cake"}, {"supercategory": "furniture", "id": 62, "name": "chair"}, {"supercategory": "furniture", "id": 63, "name": "couch"}, {"supercategory": "furniture", "id": 64, "name": "potted plant"}, {"supercategory": "furniture", "id": 65, "name": "bed"}, {"supercategory": "furniture", "id": 67, "name": "dining table"}, {"supercategory": "furniture", "id": 70, "name": "toilet"}, {"supercategory": "electronic", "id": 72, "name": "tv"}, {"supercategory": "electronic", "id": 73, "name": "laptop"}, {"supercategory": "electronic", "id": 74, "name": "mouse"}, {"supercategory": "electronic", "id": 75, "name": "remote"}, {"supercategory": "electronic", "id": 76, "name": "keyboard"}, {"supercategory": "electronic", "id": 77, "name": "cell phone"}, {"supercategory": "appliance", "id": 78, "name": "microwave"}, {"supercategory": "appliance", "id": 79, "name": "oven"}, {"supercategory": "appliance", "id": 80, "name": "toaster"}, {"supercategory": "appliance", "id": 81, "name": "sink"}, {"supercategory": "appliance", "id": 82, "name": "refrigerator"}, {"supercategory": "indoor", "id": 84, "name": "book"}, {"supercategory": "indoor", "id": 85, "name": "clock"}, {"supercategory": "indoor", "id": 86, "name": "vase"}, {"supercategory": "indoor", "id": 87, "name": "scissors"}, {"supercategory": "indoor", "id": 88, "name": "teddy bear"}, {"supercategory": "indoor", "id": 89, "name": "hair drier"}, {"supercategory": "indoor", "id": 90, "name": "toothbrush"}]} ================================================ FILE: tests/data/coco/annotations/instances_val2017.json ================================================ {"info": {"description": "COCO 2017 Dataset", "url": "http://cocodataset.org", "version": "1.0", "year": 2017, "contributor": "COCO Consortium", "date_created": "2017/09/01"}, "licenses": [{"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/", "id": 1, "name": "Attribution-NonCommercial-ShareAlike License"}, {"url": "http://creativecommons.org/licenses/by-nc/2.0/", "id": 2, "name": "Attribution-NonCommercial License"}, {"url": "http://creativecommons.org/licenses/by-nc-nd/2.0/", "id": 3, "name": "Attribution-NonCommercial-NoDerivs License"}, {"url": "http://creativecommons.org/licenses/by/2.0/", "id": 4, "name": "Attribution License"}, {"url": "http://creativecommons.org/licenses/by-sa/2.0/", "id": 5, "name": "Attribution-ShareAlike License"}, {"url": "http://creativecommons.org/licenses/by-nd/2.0/", "id": 6, "name": "Attribution-NoDerivs License"}, {"url": "http://flickr.com/commons/usage/", "id": 7, "name": "No known copyright restrictions"}, {"url": "http://www.usa.gov/copyright.shtml", "id": 8, "name": "United States Government Work"}], "images": [{"license": 4, "file_name": "000000397133.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg", "height": 427, "width": 640, "date_captured": "2013-11-14 17:02:52", "flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg", "id": 397133}, {"license": 1, "file_name": "000000037777.jpg", "coco_url": "http://images.cocodataset.org/val2017/000000037777.jpg", "height": 230, "width": 352, "date_captured": "2013-11-14 20:55:31", "flickr_url": "http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg", "id": 37777}], "annotations": [{"segmentation": [[110.39, 135.78, 110.39, 127.62, 110.01, 119.6, 106.87, 118.47, 104.37, 120.1, 102.49, 122.73, 103.74, 125.49, 105.24, 128.88, 106.87, 132.39, 107.38, 135.78, 110.39, 135.65]], "area": 88.52115000000006, "iscrowd": 0, "image_id": 37777, "bbox": [102.49, 118.47, 7.9, 17.31], "category_id": 64, "id": 22328}, {"segmentation": [[224.24, 297.18, 228.29, 297.18, 234.91, 298.29, 243.0, 297.55, 249.25, 296.45, 252.19, 294.98, 256.61, 292.4, 254.4, 264.08, 251.83, 262.61, 241.53, 260.04, 235.27, 259.67, 230.49, 259.67, 233.44, 255.25, 237.48, 250.47, 237.85, 243.85, 237.11, 240.54, 234.17, 242.01, 228.65, 249.37, 224.24, 255.62, 220.93, 262.61, 218.36, 267.39, 217.62, 268.5, 218.72, 295.71, 225.34, 297.55]], "area": 1481.3806499999994, "iscrowd": 0, "image_id": 397133, "bbox": [217.62, 240.54, 38.99, 57.75], "category_id": 44, "id": 82445}], "categories": [{"supercategory": "person", "id": 1, "name": "person"}, {"supercategory": "vehicle", "id": 2, "name": "bicycle"}, {"supercategory": "vehicle", "id": 3, "name": "car"}, {"supercategory": "vehicle", "id": 4, "name": "motorcycle"}, {"supercategory": "vehicle", "id": 5, "name": "airplane"}, {"supercategory": "vehicle", "id": 6, "name": "bus"}, {"supercategory": "vehicle", "id": 7, "name": "train"}, {"supercategory": "vehicle", "id": 8, "name": "truck"}, {"supercategory": "vehicle", "id": 9, "name": "boat"}, {"supercategory": "outdoor", "id": 10, "name": "traffic light"}, {"supercategory": "outdoor", "id": 11, "name": "fire hydrant"}, {"supercategory": "outdoor", "id": 13, "name": "stop sign"}, {"supercategory": "outdoor", "id": 14, "name": "parking meter"}, {"supercategory": "outdoor", "id": 15, "name": "bench"}, {"supercategory": "animal", "id": 16, "name": "bird"}, {"supercategory": "animal", "id": 17, "name": "cat"}, {"supercategory": "animal", "id": 18, "name": "dog"}, {"supercategory": "animal", "id": 19, "name": "horse"}, {"supercategory": "animal", "id": 20, "name": "sheep"}, {"supercategory": "animal", "id": 21, "name": "cow"}, {"supercategory": "animal", "id": 22, "name": "elephant"}, {"supercategory": "animal", "id": 23, "name": "bear"}, {"supercategory": "animal", "id": 24, "name": "zebra"}, {"supercategory": "animal", "id": 25, "name": "giraffe"}, {"supercategory": "accessory", "id": 27, "name": "backpack"}, {"supercategory": "accessory", "id": 28, "name": "umbrella"}, {"supercategory": "accessory", "id": 31, "name": "handbag"}, {"supercategory": "accessory", "id": 32, "name": "tie"}, {"supercategory": "accessory", "id": 33, "name": "suitcase"}, {"supercategory": "sports", "id": 34, "name": "frisbee"}, {"supercategory": "sports", "id": 35, "name": "skis"}, {"supercategory": "sports", "id": 36, "name": "snowboard"}, {"supercategory": "sports", "id": 37, "name": "sports ball"}, {"supercategory": "sports", "id": 38, "name": "kite"}, {"supercategory": "sports", "id": 39, "name": "baseball bat"}, {"supercategory": "sports", "id": 40, "name": "baseball glove"}, {"supercategory": "sports", "id": 41, "name": "skateboard"}, {"supercategory": "sports", "id": 42, "name": "surfboard"}, {"supercategory": "sports", "id": 43, "name": "tennis racket"}, {"supercategory": "kitchen", "id": 44, "name": "bottle"}, {"supercategory": "kitchen", "id": 46, "name": "wine glass"}, {"supercategory": "kitchen", "id": 47, "name": "cup"}, {"supercategory": "kitchen", "id": 48, "name": "fork"}, {"supercategory": "kitchen", "id": 49, "name": "knife"}, {"supercategory": "kitchen", "id": 50, "name": "spoon"}, {"supercategory": "kitchen", "id": 51, "name": "bowl"}, {"supercategory": "food", "id": 52, "name": "banana"}, {"supercategory": "food", "id": 53, "name": "apple"}, {"supercategory": "food", "id": 54, "name": "sandwich"}, {"supercategory": "food", "id": 55, "name": "orange"}, {"supercategory": "food", "id": 56, "name": "broccoli"}, {"supercategory": "food", "id": 57, "name": "carrot"}, {"supercategory": "food", "id": 58, "name": "hot dog"}, {"supercategory": "food", "id": 59, "name": "pizza"}, {"supercategory": "food", "id": 60, "name": "donut"}, {"supercategory": "food", "id": 61, "name": "cake"}, {"supercategory": "furniture", "id": 62, "name": "chair"}, {"supercategory": "furniture", "id": 63, "name": "couch"}, {"supercategory": "furniture", "id": 64, "name": "potted plant"}, {"supercategory": "furniture", "id": 65, "name": "bed"}, {"supercategory": "furniture", "id": 67, "name": "dining table"}, {"supercategory": "furniture", "id": 70, "name": "toilet"}, {"supercategory": "electronic", "id": 72, "name": "tv"}, {"supercategory": "electronic", "id": 73, "name": "laptop"}, {"supercategory": "electronic", "id": 74, "name": "mouse"}, {"supercategory": "electronic", "id": 75, "name": "remote"}, {"supercategory": "electronic", "id": 76, "name": "keyboard"}, {"supercategory": "electronic", "id": 77, "name": "cell phone"}, {"supercategory": "appliance", "id": 78, "name": "microwave"}, {"supercategory": "appliance", "id": 79, "name": "oven"}, {"supercategory": "appliance", "id": 80, "name": "toaster"}, {"supercategory": "appliance", "id": 81, "name": "sink"}, {"supercategory": "appliance", "id": 82, "name": "refrigerator"}, {"supercategory": "indoor", "id": 84, "name": "book"}, {"supercategory": "indoor", "id": 85, "name": "clock"}, {"supercategory": "indoor", "id": 86, "name": "vase"}, {"supercategory": "indoor", "id": 87, "name": "scissors"}, {"supercategory": "indoor", "id": 88, "name": "teddy bear"}, {"supercategory": "indoor", "id": 89, "name": "hair drier"}, {"supercategory": "indoor", "id": 90, "name": "toothbrush"}]} ================================================ FILE: tests/data/collate_fns/__init__.py ================================================ ================================================ FILE: tests/data/collate_fns/test_byteformer_collate_fn.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from corenet.data.collate_fns import byteformer_collate_functions def test_byteformer_image_collate_fn() -> None: torch.manual_seed(1) C, H, W = 3, 8, 8 batch = [ { "samples": torch.rand(C, H, W), }, { "samples": torch.rand(C, H, W), }, ] padding_index = -1 opts = argparse.Namespace() setattr(opts, "image_augmentation.pil_save.enable", True) setattr(opts, "image_augmentation.pil_save.file_encoding", "JPEG") setattr(opts, "image_augmentation.pil_save.quality", 100) setattr(opts, "image_augmentation.shuffle_bytes.enable", False) setattr(opts, "image_augmentation.mask_positions.enable", False) setattr(opts, "image_augmentation.random_uniform.enable", False) setattr(opts, "image_augmentation.byte_permutation.enable", False) setattr(opts, "image_augmentation.torchaudio_save.enable", False) setattr(opts, "model.classification.byteformer.padding_index", padding_index) collated_batch = byteformer_collate_functions.byteformer_image_collate_fn( batch, opts ) assert list(collated_batch.keys()) == ["samples"] # Padding token should be used assert padding_index in collated_batch["samples"] def test_wav_collate() -> None: C, N = 1, 16000 batch = [ {"samples": {"audio": torch.rand([C, N])}, "metadata": {"audio_fps": 16000}}, {"samples": {"audio": torch.rand([C, N])}, "metadata": {"audio_fps": 16000}}, ] padding_index = -1 opts = argparse.Namespace() setattr(opts, "audio_augmentation.torchaudio_save.enable", True) setattr(opts, "audio_augmentation.torchaudio_save.encoding_dtype", "float32") setattr(opts, "audio_augmentation.torchaudio_save.format", "mp3") setattr(opts, "audio_augmentation.torchaudio_save.backend", "sox") setattr(opts, "model.classification.byteformer.padding_index", padding_index) collated_batch = byteformer_collate_functions.byteformer_audio_collate_fn( batch, opts ) assert list(collated_batch.keys()) == ["samples"] ================================================ FILE: tests/data/collate_fns/test_collate_functions.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Callable, List, Mapping import pytest import torch from corenet.data.collate_fns.collate_functions import ( default_collate_fn, image_classification_data_collate_fn, unlabeled_image_data_collate_fn, ) @pytest.mark.parametrize( "collate_fn, channels_last", [ (image_classification_data_collate_fn, True), (image_classification_data_collate_fn, False), (unlabeled_image_data_collate_fn, True), (unlabeled_image_data_collate_fn, False), (default_collate_fn, True), ], ) def test_image_data_collate_functions( collate_fn: Callable[ [List[Mapping[str, Any]], argparse.Namespace], Mapping[str, Any] ], channels_last: bool, ) -> None: num_samples = 3 samples = [] for ind in range(num_samples): samples.append( {"samples": torch.ones((3, 5, 5)), "sample_id": ind, "targets": ind} ) parser = argparse.ArgumentParser() parser.add_argument( "--common.channels-last", dest="common.channels_last", action="store_true" ) parser.add_argument( "--no-common.channels-last", dest="common.channels_last", action="store_false" ) if channels_last: opts = parser.parse_args(["--common.channels-last"]) else: opts = parser.parse_args(["--no-common.channels-last"]) output = collate_fn(samples, opts) assert output["samples"].shape == (num_samples, 3, 5, 5) assert output["sample_id"].shape == (num_samples,) assert output["targets"].shape == (num_samples,) assert output["sample_id"].tolist() == list(range(num_samples)) if ( collate_fn == image_classification_data_collate_fn or collate_fn == default_collate_fn ): assert output["targets"].tolist() == list(range(num_samples)) elif collate_fn == unlabeled_image_data_collate_fn: assert output["targets"].tolist() == [0] * num_samples else: raise ValueError("Trying to test unknown collate function.") ================================================ FILE: tests/data/datasets/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/datasets/audio_classification/__init__.py ================================================ ================================================ FILE: tests/data/datasets/audio_classification/test_speech_commands_v2.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Tuple from unittest import mock import pytest import torch from torch import Tensor from corenet.data.collate_fns import collate_functions from corenet.data.datasets.audio_classification.speech_commands_v2 import ( SpeechCommandsv2Dataset, ) def mock_load(filepath: str) -> Tuple[Tensor, int]: audio_rate = 1024 outputs = torch.ones([1, audio_rate], dtype=torch.float) / 255 for i, elem in enumerate(filepath): outputs[:, i] = int(elem) / 256 return outputs, audio_rate def mock_process_dataset_config(self) -> None: self.dataset_entries = [ {"audio_filepath": "0", "command": "up"}, {"audio_filepath": "1", "command": "down"}, {"audio_filepath": "2", "command": "up"}, ] self.noise_files = [ "0", "1", ] self.label_to_index = {"up": 0, "down": 1} @pytest.mark.parametrize( "is_training,is_evaluation,length,mixup", [(True, False, 16, False), (False, True, 8, True), (False, False, 4, True)], ) @mock.patch("torchaudio.load", mock_load) @mock.patch( "corenet.data.datasets.audio_classification.speech_commands_v2.SpeechCommandsv2Dataset._process_dataset_config", mock_process_dataset_config, ) def test_getitem( is_training: bool, is_evaluation: bool, length: int, mixup: bool ) -> None: opts = argparse.Namespace() setattr(opts, "dataset.speech_commands_v2.mixup", mixup) setattr(opts, "dataset.root_train", "/tmp/train") setattr(opts, "dataset.root_val", "/tmp/val") setattr(opts, "dataset.root_test", "/tmp/test") setattr(opts, "audio_augmentation.set_fixed_length.enable", True) setattr(opts, "audio_augmentation.set_fixed_length.length", length) setattr(opts, "audio_augmentation.noise.enable", False) setattr(opts, "audio_augmentation.roll.enable", False) dataset = SpeechCommandsv2Dataset( opts, is_training=is_training, is_evaluation=is_evaluation ) value1 = dataset[(None, None, 0)] value2 = dataset[(None, None, 1)] assert torch.any(value1["samples"]["audio"] != value2["samples"]["audio"]) assert value1["samples"]["audio"].shape == (1, length) # Make sure the elements can be collated. collate_functions.pytorch_default_collate_fn([value1, value2], opts) ================================================ FILE: tests/data/datasets/classification/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/datasets/classification/dummy_configs/coco.yaml ================================================ # pytest: disable taskname: '+ ResNet-50 SSD' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 100 auto_resume: true mixed_precision: true dataset: root_train: "tests/data/coco" root_val: "tests/data/coco" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 1 workers: 0 persistent_workers: false pin_memory: true name: "mock_coco" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related parameters resize: enable: true size: 64 interpolation: "bilinear" center_crop: enable: true size: 64 sampler: name: "batch_sampler" bs: crop_size_width: 64 crop_size_height: 64 ================================================ FILE: tests/data/datasets/classification/dummy_configs/image_classification_dataset.yaml ================================================ # pytest: disable dataset: root_train: "tests/data/datasets/classification/dummy_images/training" root_val: "tests/data/datasets/classification/dummy_images/validation" collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn" name: "dummy" category: "classification" train_batch_size0: 2 val_batch_size0: 4 eval_batch_size0: 4 workers: 8 persistent_workers: true pin_memory: true image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "batch_sampler" bs: crop_size_width: 256 crop_size_height: 256 ================================================ FILE: tests/data/datasets/classification/dummy_configs/imagenet.yaml ================================================ # pytest: disable dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 8 persistent_workers: true pin_memory: true image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/classification/dummy_configs/imagenet_a.yaml ================================================ # pytest: disable dataset: root_val: "/mnt/vision_datasets/imagenet-a-1.0.0/data/raw/" name: "imagenet_a" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 8 persistent_workers: true pin_memory: true model: classification: n_classes: 1000 image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/classification/dummy_configs/imagenet_r.yaml ================================================ # pytest: disable dataset: root_val: "/mnt/vision_datasets/imagenet-r-1.0.0/data/raw/" name: "imagenet_r" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 8 persistent_workers: true pin_memory: true model: classification: n_classes: 1000 image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml ================================================ # pytest: disable dataset: root_val: "/mnt/vision_datasets/imagenet-sketch-1.0.0/data/raw/" name: "imagenet_sketch" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 8 persistent_workers: true pin_memory: true model: classification: n_classes: 1000 image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/classification/dummy_configs/wordnet_tagged_classification.yaml ================================================ # pytest: disable taskname: '+ CatLIP ViT-B/16 [DataComp]' _anchor_vocab_size: &_anchor_vocab_size 10 common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true mixed_precision_dtype: "bfloat16" grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset is information is expected # to be contained in metadata file. root_train: "" disable_val: true train_batch_size0: 2 workers: 0 persistent_workers: true pin_memory: true name: "wordnet_tagged_classification" category: "classification" wordnet_tagged_classification: metadata_file: ".corenet_data_cache/metadata.pkl" vocab_file: ".corenet_data_cache/vocab.pkl" vocab_size: *_anchor_vocab_size image_augmentation: # training related augmentations random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true ================================================ FILE: tests/data/datasets/classification/mock_coco.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.coco import COCOClassification @DATASET_REGISTRY.register(name="mock_coco", type="classification") class MockCOCOClassification(COCOClassification): @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Mock the init logic for read_image_pil function. Instead of reading a PIL image at location specified by `path`, a random PIL image is returned. """ im_arr = np.random.randint(low=0, high=255, size=(32, 32, 3), dtype=np.uint8) return Image.fromarray(im_arr).convert("RGB") ================================================ FILE: tests/data/datasets/classification/mock_imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.imagenet import ImageNetDataset from corenet.data.datasets.classification.imagenet_a import ( IMAGENET_A_CLASS_SUBLIST, ImageNetADataset, ) from corenet.data.datasets.classification.imagenet_r import ( IMAGENET_R_CLASS_SUBLIST, ImageNetRDataset, ) from corenet.data.datasets.classification.imagenet_sketch import ImageNetSketchDataset TOTAL_SAMPLES = 10 @DATASET_REGISTRY.register(name="mock_imagenet", type="classification") class MockImageNetDataset(ImageNetDataset): def __init__( self, opts: argparse.Namespace, is_training: bool = False, is_evaluation: bool = False, *args, **kwargs ) -> None: """Mock the init logic for ImageNet dataset. Specifically, we replace the samples and targets with random data so that actual dataset is not required for testing purposes. """ # super() is not called here intentionally. self.opts = opts self.root = None self.targets = [random.randint(0, self.n_classes) for _ in range(TOTAL_SAMPLES)] self.imgs = ["img_path" for _ in range(TOTAL_SAMPLES)] self.samples = [ [img_path, target_label] for img_path, target_label in zip(self.imgs, self.targets) ] self.is_training = is_training self.is_evaluation = is_evaluation @property def n_classes(self): return 1000 @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Mock the init logic for read_image_pil function. Instead of reading a PIL image at location specified by `path`, a random PIL image is returned. The randomness in height and width dimensions may allow us to catch errors in transform functions. """ width = random.randint(32, 64) height = random.randint(32, 64) im_arr = np.random.randint( low=0, high=255, size=(width, height, 3), dtype=np.uint8 ) return Image.fromarray(im_arr).convert("RGB") @DATASET_REGISTRY.register(name="mock_imagenet_a", type="mock_classification") class MockImageNetADataset(MockImageNetDataset, ImageNetADataset): def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: """Mock the init logit for ImageNetA dataset.""" MockImageNetDataset.__init__(self, opts, *args, **kwargs) self.post_init_checks() @property def n_classes(self): return len(IMAGENET_A_CLASS_SUBLIST) @DATASET_REGISTRY.register(name="mock_imagenet_r", type="mock_classification") class MockImageNetRDataset(MockImageNetDataset, ImageNetRDataset): def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: """Mock the init logit for ImageNetR dataset.""" MockImageNetDataset.__init__(self, opts, *args, **kwargs) self.post_init_checks() @property def n_classes(self): return len(IMAGENET_R_CLASS_SUBLIST) @DATASET_REGISTRY.register(name="mock_imagenet_sketch", type="mock_classification") class MockImageNetSketchDataset(MockImageNetDataset, ImageNetSketchDataset): def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: """Mock the init logit for ImageNetSketch dataset.""" MockImageNetDataset.__init__(self, opts, *args, **kwargs) self.post_init_checks() ================================================ FILE: tests/data/datasets/classification/mock_wordnet_tagged_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import base64 import io import os import pickle import subprocess from PIL import Image from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.classification.wordnet_tagged_classification import ( WordnetTaggedClassificationDataset, ) def _generate_dummy_data() -> None: """Generate dummy data for CI/CD.""" total_samples = 4 num_samples_per_tar = 2 for sample_idx in range(total_samples): folder_idx = sample_idx // num_samples_per_tar folder_path = f"{DATA_CACHE_DIR}/{folder_idx}" os.makedirs(folder_path, exist_ok=True) with open(f"{folder_path}/{sample_idx}.pkl", "wb") as f: image = Image.new("RGB", (32, 32), color="black") image_bytes = io.BytesIO() image.save(image_bytes, format="JPEG") image_bytes.seek(0) encoded_image = base64.b64encode(image_bytes.read()) data = {"image": encoded_image, "text": "An image of black dog."} pickle.dump(data, f) metadata = { "total_tar_files": 2, "max_files_per_tar": num_samples_per_tar, "tar_file_names": ["0.tar.gz", "1.tar.gz"], } with open(f"{DATA_CACHE_DIR}/metadata.pkl", "wb") as f: pickle.dump(metadata, f) vocab = { "n5928118": 52418327, # image "n13333833": 46393897, # stock "n4960277": 38781582, # black "n7947958": 36532096, "n9638875": 34564013, "n928077": 30290822, "n7996689": 28076676, "n10787470": 24182531, "n5938976": 23817664, "n8559508": 23476398, } with open(f"{DATA_CACHE_DIR}/vocab.pkl", "wb") as f: pickle.dump(vocab, f) @DATASET_REGISTRY.register( name="mock_wordnet_tagged_classification", type="classification" ) class MockWordnetTaggedClassificationDataset(WordnetTaggedClassificationDataset): """A wrapper around WordnetTaggedClassificationDataset that generates dummy data for CI/CD. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: import nltk # download nltk datasets nltk.download("all") _generate_dummy_data() super().__init__(opts, *args, **kwargs) ================================================ FILE: tests/data/datasets/classification/test_base_image_classification_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import functools import pytest from corenet.data.collate_fns import build_collate_fn from corenet.data.data_loaders import CoreNetDataLoader from corenet.data.datasets.classification.base_image_classification_dataset import ( BaseImageClassificationDataset, ) from corenet.data.sampler import build_sampler from tests.configs import get_config @pytest.mark.parametrize( "num_samples_per_category, percentage_of_samples, is_training", [ (-1, None, True), (0, None, True), (1, None, True), (1, None, False), (2, None, True), (2, None, False), (None, 50, True), (None, 50, False), (None, -10, True), (None, 0, True), (None, 120, True), ], ) def test_base_image_classification_dataset( num_samples_per_category: int, percentage_of_samples: float, is_training: bool ) -> None: """ Test for corenet.data.datasets.classification.base_image_classification_dataset.BaseImageClassificationDataset """ config_file_path = "tests/data/datasets/classification/dummy_configs/image_classification_dataset.yaml" opts = get_config(config_file=config_file_path) num_classes = 2 num_samples = 4 # we can't control this parameter from config as it is not defined in parser. setattr(opts, "ddp.use_distributed", False) if num_samples_per_category is not None: setattr(opts, "dataset.num_samples_per_category", num_samples_per_category) else: setattr(opts, "dataset.percentage_of_samples", percentage_of_samples) dataset = BaseImageClassificationDataset( opts, is_training=is_training, is_evaluation=False ) sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training) collate_fn_train, collate_fn_val = build_collate_fn(opts=opts) if is_training: crop_size_width = getattr(opts, "sampler.bs.crop_size_width") crop_size_height = getattr(opts, "sampler.bs.crop_size_height") batch_size = getattr(opts, "dataset.train_batch_size0") collate_fn = collate_fn_train if num_samples_per_category and num_samples_per_category > 0: expected_num_samples = num_classes * num_samples_per_category elif percentage_of_samples and 0 < percentage_of_samples < 100: expected_num_samples = num_samples * percentage_of_samples / 100 else: expected_num_samples = num_samples else: crop_size_width = getattr(opts, "image_augmentation.center_crop.size") crop_size_height = getattr(opts, "image_augmentation.center_crop.size") batch_size = getattr(opts, "dataset.val_batch_size0") collate_fn = collate_fn_val expected_num_samples = num_samples loader = CoreNetDataLoader( dataset=dataset, batch_sampler=sampler, batch_size=1, num_workers=0, collate_fn=functools.partial(collate_fn, opts=opts), ) assert len(dataset) == expected_num_samples for batch in loader: assert batch.keys() == {"samples", "sample_id", "targets"} assert [*batch["samples"].shape] == [ batch_size, 3, crop_size_height, crop_size_width, ] assert [*batch["sample_id"].shape] == [batch_size] assert [*batch["targets"].shape] == [batch_size] ================================================ FILE: tests/data/datasets/classification/test_mock_coco.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.sampler import build_sampler from tests.configs import get_config from tests.data.datasets.classification.mock_coco import MockCOCOClassification def test_coco_dataset() -> None: """Test for COCO classification dataset.""" config_file_path = "tests/data/datasets/classification/dummy_configs/coco.yaml" opts = get_config(config_file=config_file_path) dataset = MockCOCOClassification(opts) train_sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=True) train_loader = CoreNetDataLoader( dataset=dataset, batch_sampler=train_sampler, batch_size=1, num_workers=0, ) for batch in train_loader: assert batch.keys() == {"samples", "targets", "sample_id"} # bounds from the config file assert list(batch["samples"].shape) == [ 2, 3, 64, 64, ], "The output shape should be [2, 3, 64, 64]." assert list(batch["targets"].shape) == [ 2, 80, ], "Batch size should be 2 and number of classes should be 80." assert ( batch["sample_id"].dim() == 1 ), "Expecting sample_id's in [batch, ] format" ================================================ FILE: tests/data/datasets/classification/test_mock_imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Type import pytest from corenet.data.loader.dataloader import CoreNetDataLoader from corenet.data.sampler import build_sampler from tests.configs import get_config from tests.data.datasets.classification.mock_imagenet import ( MockImageNetADataset, MockImageNetDataset, MockImageNetRDataset, MockImageNetSketchDataset, ) @pytest.mark.parametrize( "config_file_path,mock_dataset_class,eval_only", [ ( "tests/data/datasets/classification/dummy_configs/imagenet.yaml", MockImageNetDataset, False, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_a.yaml", MockImageNetADataset, True, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_r.yaml", MockImageNetRDataset, True, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml", MockImageNetSketchDataset, True, ), ], ) def test_imagenet_dataset_train( config_file_path: str, mock_dataset_class: Type[MockImageNetDataset], eval_only: bool, ) -> None: """Test for ImageNet dataset and its variants. This test mocks `__init__` and `read_image_pil` functions to test the `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped inside the respective data loaders to test the collate function used by dataset. Args: config_file_path: Path to a dummy config for initializing the dataset. mock_dataset_class: The class type for ImageNet or one of its shifts. eval_only: If set, the dataset is tested to be for evaluation-only. """ opts = get_config(config_file=config_file_path) if eval_only: with pytest.raises(Exception): training_imagenet_dataset = mock_dataset_class( opts, is_training=True, is_evaluation=False ) return else: training_imagenet_dataset = mock_dataset_class( opts, is_training=True, is_evaluation=False ) train_sampler = build_sampler( opts, n_data_samples=len(training_imagenet_dataset), is_training=True ) train_loader = CoreNetDataLoader( dataset=training_imagenet_dataset, batch_sampler=train_sampler, batch_size=1, num_workers=0, ) for batch in train_loader: assert batch.keys() == {"samples", "targets", "sample_id"} # bounds from the config file assert 128 <= batch["samples"].shape[-2] <= 320 assert 128 <= batch["samples"].shape[-1] <= 320 assert batch["samples"].dim() == 4, ( "Expecting input images in " "[batch, image_channels, height, width] format" ) assert batch["targets"].dim() == 1, "Expecting labels in [batch, ] format" assert ( batch["sample_id"].dim() == 1 ), "Expecting sample_id's in [batch, ] format" @pytest.mark.parametrize( "config_file_path,mock_dataset_class", [ ( "tests/data/datasets/classification/dummy_configs/imagenet.yaml", MockImageNetDataset, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_a.yaml", MockImageNetADataset, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_r.yaml", MockImageNetRDataset, ), ( "tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml", MockImageNetSketchDataset, ), ], ) def test_imagenet_dataset_val( config_file_path: str, mock_dataset_class: Type[MockImageNetDataset], ) -> None: """Test for ImageNet dataset and its variants. This test mocks `__init__` and `read_image_pil` functions to test the `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped inside the respective data loaders to test the collate function used by dataset. Args: config_file_path: Path to a dummy config for initializing the dataset. mock_dataset_class: The class type for ImageNet or one of its shifts. """ opts = get_config(config_file=config_file_path) valid_imagenet_dataset = mock_dataset_class( opts, is_training=False, is_evaluation=False ) val_sampler = build_sampler( opts, n_data_samples=len(valid_imagenet_dataset), is_training=False ) val_loader = CoreNetDataLoader( dataset=valid_imagenet_dataset, batch_sampler=val_sampler, batch_size=1, num_workers=0, ) for batch in val_loader: assert batch.keys() == {"samples", "targets", "sample_id"} # values from config file assert [*batch["samples"].shape[2:]] == [224, 224] assert batch["samples"].dim() == 4, ( "Expecting input images in " "[batch, image_channels, height, width] format" ) assert batch["targets"].dim() == 1, "Expecting labels in [batch, ] format" assert ( batch["sample_id"].dim() == 1 ), "Expecting sample_id's in [batch, ] format" ================================================ FILE: tests/data/datasets/classification/test_wordnet_tagged_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys import pytest import torch from tests.configs import get_config from tests.data.datasets.classification.mock_wordnet_tagged_classification import ( MockWordnetTaggedClassificationDataset, ) @pytest.mark.parametrize("image_size", [16, 32]) def test_wordnet_tagged_classification_dataset(image_size: int) -> None: """Test for WordnetTaggedClassificationDataset dataset.""" if "nltk" in sys.modules: config_file = "tests/data/datasets/classification/dummy_configs/wordnet_tagged_classification.yaml" opts = get_config(config_file=config_file) dataset = MockWordnetTaggedClassificationDataset( opts, is_training=True, is_evaluation=False ) sample_index = 0 data_item = dataset.__getitem__((image_size, image_size, sample_index)) assert "samples" in data_item assert "targets" in data_item assert list(data_item["samples"].shape) == [3, image_size, image_size] assert list(data_item["targets"].shape) == [10] exptected_target_label = torch.tensor([1, 0, 1, 0, 0, 0, 0, 0, 0, 0]) assert torch.all( data_item["targets"] == exptected_target_label.to( dtype=data_item["targets"].dtype, device=data_item["targets"].device ) ) ================================================ FILE: tests/data/datasets/detection/__init__.py ================================================ ================================================ FILE: tests/data/datasets/detection/mock_coco_mask_rcnn.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.detection.coco_mask_rcnn import COCODetectionMaskRCNN @DATASET_REGISTRY.register(name="mock_coco_mask_rcnn", type="detection") class MockCOCODetectionMaskRCNN(COCODetectionMaskRCNN): @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Mock the init logic for read_image_pil function. Instead of reading a PIL image at location specified by `path`, a random PIL image is returned. """ im_arr = np.random.randint(low=0, high=255, size=(64, 64, 3), dtype=np.uint8) return Image.fromarray(im_arr).convert("RGB") ================================================ FILE: tests/data/datasets/detection/mock_coco_ssd.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.detection.coco_ssd import COCODetectionSSD @DATASET_REGISTRY.register(name="mock_coco_ssd", type="detection") class MockCOCODetectionSSD(COCODetectionSSD): @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Mock the init logic for read_image_pil function. Instead of reading a PIL image at location specified by `path`, a random PIL image is returned. """ im_arr = np.random.randint(low=0, high=255, size=(64, 64, 3), dtype=np.uint8) return Image.fromarray(im_arr).convert("RGB") ================================================ FILE: tests/data/datasets/language_modeling/__init__.py ================================================ ================================================ FILE: tests/data/datasets/language_modeling/dummy_commonsense_170k.yaml ================================================ # pytest: disable dataset: root_train: "" category: language_modeling name: commonsense_170k language_modeling: shuffle_data: false sequence_length: 5 min_tokens_per_text: 0 min_characters_per_text: 0 commonsense_170k: path: "" text_tokenizer: name: "openai_clip" pad_token: "pad" ================================================ FILE: tests/data/datasets/language_modeling/dummy_lm_dataset.yaml ================================================ # pytest: disable dataset: root_train: "" disable_val: true workers: 4 # dataset details category: "language_modeling" name: "mock_general_lm" language_modeling: sequence_length: 10 min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true general_lm: data_state_save_interval: 0 reader_chunk_size: 1 train_data_info: [ { "file_name": ".corenet_data_cache/sample.jsonl", "text_key": "text", "file_id_range": [0, 1], }, { "file_name": ".corenet_data_cache/sample.json.gz", "text_key": "text", "file_id_range": [0, 1], }, ] text_tokenizer: name: "openai_clip" pad_token: "pad" ================================================ FILE: tests/data/datasets/language_modeling/mock_general_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import gzip import json from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.language_modeling.general_lm import GeneralLMDataset def _generate_dummy_json_data() -> None: data = [ { "text": "Hello world, CoreNet serves as a versatile research library catering to a wide array of purposes. It has been used for small- and large-scale training, with numerous research papers leveraging its functionalities and contributing to various domains of study.", } ] * 12 with open(f"{DATA_CACHE_DIR}/sample.jsonl", "w") as outfile: for entry in data: print(json.dumps(entry), file=outfile) def _generate_dummy_json_gz_data() -> None: data = [{"text": " !"}] * 2 with gzip.open(f"{DATA_CACHE_DIR}/sample.json.gz", "w") as outfile: for text in data: json_str = json.dumps(text) + "\n" json_bytes = json_str.encode("utf-8") outfile.write(json_bytes) @DATASET_REGISTRY.register(name="mock_general_lm", type="language_modeling") class MockImgGeneralLMDataset(GeneralLMDataset): """A wrapper around GeneralLMDataset that generates dummy data for CI/CD. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: _generate_dummy_json_data() _generate_dummy_json_gz_data() super().__init__(opts, *args, **kwargs) ================================================ FILE: tests/data/datasets/language_modeling/test_commonsense_170k.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import json import tempfile import yaml from corenet.data.datasets.language_modeling import commonsense_170k from corenet.options.utils import flatten_yaml_as_dict from tests.configs import get_config from tests.data.datasets.language_modeling import test_general_lm def write_data(filename: str) -> None: data = [ { "instruction": "Please answer the following question with true or false. Question: is the sky blue?", "input": "", "output": "the correct answer is true", "answer": "true", } ] * 5 # Make input non-empty for one data point. data[0]["input"] = "This is an example input." with open(filename, "w+") as f: json.dump(data, f) def test_general_lm_dataset() -> None: """Test for GeneralLMDataset dataset.""" sequence_length = 5 with tempfile.NamedTemporaryFile() as tmp: write_data(tmp.name) config_file = ( "tests/data/datasets/language_modeling/dummy_commonsense_170k.yaml" ) opts = get_config(config_file=config_file) setattr(opts, "dataset.language_modeling.sequence_length", 5) setattr(opts, "dataset.language_modeling.commonsense_170k.path", tmp.name) dataset = commonsense_170k.CommonSense170k(opts) max_iterations = 12 test_general_lm._iterate_and_test_dataset( dataset, max_iterations=max_iterations, expected_sequence_length=sequence_length, ) ================================================ FILE: tests/data/datasets/language_modeling/test_general_lm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest import torch from tests.configs import get_config from tests.data.datasets.language_modeling.mock_general_lm import ( MockImgGeneralLMDataset, ) def _iterate_and_test_dataset( dataset: MockImgGeneralLMDataset, max_iterations: int, expected_sequence_length: int ): for sample_id, sample in enumerate(dataset): assert any(set(sample.keys()) & {"samples", "targets"}) assert sample["samples"].numel() == expected_sequence_length assert sample["targets"].numel() == expected_sequence_length # inputs are shifted by 1 to obtain targets assert torch.all(sample["samples"][1:] == sample["targets"][:-1]) if sample_id == max_iterations: break @pytest.mark.parametrize("max_iterations", [10, 13, 16]) def test_general_lm_dataset(max_iterations: int) -> None: """Test for GeneralLMDataset dataset.""" config_file = "tests/data/datasets/language_modeling/dummy_lm_dataset.yaml" opts = get_config(config_file=config_file) sequence_length = 12 setattr(opts, "dataset.language_modeling.sequence_length", sequence_length) dataset = MockImgGeneralLMDataset(opts) _iterate_and_test_dataset( dataset, max_iterations=max_iterations, expected_sequence_length=sequence_length ) # resume the state and iterate for 5 more iterations. setattr( opts, "dataset.language_modeling.general_lm.data_state", ["results/run_1/data_states/data_state_0_0.pkl"], ) dataset = MockImgGeneralLMDataset(opts) dataset._load_data_state() # Our first file has 12 samples and second has 2 files, so total of 14 files (i.e., 1 epoch is 14 files) if max_iterations == 10: # In this case, only 10 samples from first file are finished, so we expect chunk state to resume from 10 assert dataset._target_state["chunk"] == 10 assert dataset._target_state["file"] == None assert dataset._target_state["epoch"] == 0 elif max_iterations == 13: # in this case, first file has finished and we are iterating second file, so we expect the file has the name # of first file and chunks state to be 1 because one sample of the second file was processed print("Resuming from second file") assert dataset._target_state["chunk"] == 1 assert dataset._target_state["file"].endswith("sample.jsonl") assert dataset._target_state["epoch"] == 0 elif max_iterations == 16: # in this case, we have iterated over the data once and processed 2 samples from first file. # So, we expect epoch to be 1, chunk to be 2, and file to be None assert dataset._target_state["chunk"] == 2 assert dataset._target_state["file"] == None assert dataset._target_state["epoch"] == 1 else: raise NotImplementedError("Max iteration is not supported") max_iterations = 5 _iterate_and_test_dataset( dataset, max_iterations=max_iterations, expected_sequence_length=sequence_length ) ================================================ FILE: tests/data/datasets/multi_modal_img_text/__init__.py ================================================ ================================================ FILE: tests/data/datasets/multi_modal_img_text/dummy_img_text_tar_dataset.yaml ================================================ # pytest: disable dataset: # The training path in 'img_text_tar' dataset is infered from metadata file path. root_train: "" disable_val: true name: "img_text_tar" category: "multi_modal_image_text" multi_modal_img_text: img_text_tar: metadata_file: ".corenet_data_cache/metadata.pkl" text_tokenizer: name: "openai_clip" ================================================ FILE: tests/data/datasets/multi_modal_img_text/mock_img_text_tar_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import base64 import io import os import pickle from PIL import Image from corenet.constants import DATA_CACHE_DIR from corenet.data.datasets import DATASET_REGISTRY from corenet.data.datasets.multi_modal_img_text.img_text_tar_dataset import ( ImgTextTarDataset, ) def _generate_dummy_data() -> None: """Generate dummy data for CI/CD.""" total_samples = 4 num_samples_per_tar = 2 for sample_idx in range(total_samples): folder_idx = sample_idx // num_samples_per_tar folder_path = f"{DATA_CACHE_DIR}/{folder_idx}" os.makedirs(folder_path, exist_ok=True) with open(f"{folder_path}/{sample_idx}.pkl", "wb") as f: image = Image.new("RGB", (32, 32), color="black") image_bytes = io.BytesIO() image.save(image_bytes, format="JPEG") image_bytes.seek(0) encoded_image = base64.b64encode(image_bytes.read()) data = {"image": encoded_image, "text": "Testing img-text dataset."} pickle.dump(data, f) metadata = { "total_tar_files": 2, "max_files_per_tar": num_samples_per_tar, "tar_file_names": ["0.tar.gz", "1.tar.gz"], } with open(f"{DATA_CACHE_DIR}/metadata.pkl", "wb") as f: pickle.dump(metadata, f) @DATASET_REGISTRY.register(name="mock_img_text_tar", type="multi_modal_image_text") class MockImgTextTarDataset(ImgTextTarDataset): """A wrapper around ImgTextTarDataset that generates dummy data for CI/CD. Args: opts: Command-line arguments. """ def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None: _generate_dummy_data() super().__init__(opts, *args, **kwargs) ================================================ FILE: tests/data/datasets/multi_modal_img_text/test_img_text_tar_dataset.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest from tests.configs import get_config from tests.data.datasets.multi_modal_img_text.mock_img_text_tar_dataset import ( MockImgTextTarDataset, ) @pytest.mark.parametrize("image_size", [16, 32]) @pytest.mark.parametrize("context_length", [12, 77]) def test_img_text_dataset(image_size: int, context_length: int) -> None: """Test for ImgTextTarDataset dataset.""" config_file = ( "tests/data/datasets/multi_modal_img_text/dummy_img_text_tar_dataset.yaml" ) opts = get_config(config_file=config_file) setattr(opts, "dataset.multi_modal_img_text.context_length", context_length) dataset = MockImgTextTarDataset(opts, is_training=True, is_evaluation=False) sample_index = 0 data_item = dataset.__getitem__((image_size, image_size, sample_index)) assert "samples" in data_item assert "targets" in data_item assert data_item["targets"] == -1 assert "image" in data_item["samples"] assert list(data_item["samples"]["image"].shape) == [3, image_size, image_size] assert list(data_item["samples"]["text"].shape) == [context_length] ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/__init__.py ================================================ ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet.yaml ================================================ # pytest: disable dataset: category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet" context_length: 77 img_text_tar: metadata_file: "PATH_OF_METADATA_FILE" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_a.yaml ================================================ # pytest: disable dataset: category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet_a" context_length: 77 img_text_tar: metadata_file: "PATH_OF_METADATA_FILE" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_r.yaml ================================================ # pytest: disable dataset: category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet_r" context_length: 77 img_text_tar: metadata_file: "PATH_OF_METADATA_FILE" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_sketch.yaml ================================================ # pytest: disable dataset: category: "multi_modal_image_text" multi_modal_img_text: zero_shot_img_cls_dataset_name: "imagenet_sketch" context_length: 77 img_text_tar: metadata_file: "PATH_OF_METADATA_FILE" image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true auto_augment: enable: true cutmix: alpha: 1.0 enable: true p: 1.0 mixup: alpha: 0.2 enable: true p: 1.0 # validation related parameters resize: enable: true size: 232 interpolation: "bilinear" center_crop: enable: true size: 224 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/mock_imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import List from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import ( ImageNetDatasetZeroShot, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_a import ( ImageNetADatasetZeroShot, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_r import ( ImageNetRDatasetZeroShot, ) from corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_sketch import ( ImageNetSketchDatasetZeroShot, ) TOTAL_SAMPLES = 100 class MockImageNetDatasetZeroShot(ImageNetDatasetZeroShot): """Mock the ImageNetDatasetZeroShot without initializing from image folders.""" def __init__( self, opts: argparse.Namespace, is_training: bool = False, is_evaluation: bool = False, *args, **kwargs ) -> None: """Mock the init logic for ImageNet dataset. Specifically, we replace the samples and targets with random data so that actual dataset is not required for testing purposes. """ # super() is not called here intentionally. self.opts = opts self.root = None self.samples = [ ["img_path", random.randint(1, 4)] for _ in range(TOTAL_SAMPLES) ] self.targets = [class_id for img_path, class_id in self.samples] self.imgs = [img_path for img_path, class_id in self.samples] self.is_training = is_training self.is_evaluation = is_evaluation @property def class_names(self) -> List[str]: return ["cat", "dog"] class MockImageNetADatasetZeroShot( MockImageNetDatasetZeroShot, ImageNetADatasetZeroShot ): def __init__(self, *args, **kwargs) -> None: """Mock the init logit for ImageNetA dataset.""" MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs) class MockImageNetRDatasetZeroShot( MockImageNetDatasetZeroShot, ImageNetRDatasetZeroShot ): def __init__(self, *args, **kwargs) -> None: """Mock the init logit for ImageNetR dataset.""" MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs) class MockImageNetSketchDatasetZeroShot( MockImageNetDatasetZeroShot, ImageNetSketchDatasetZeroShot ): def __init__(self, *args, **kwargs) -> None: """Mock the init logit for ImageNetSketch dataset.""" MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs) ================================================ FILE: tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/test_mock_imagenet.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Type import pytest from tests.configs import get_config from tests.data.datasets.multi_modal_img_text.zero_shot_image_classification.mock_imagenet import ( MockImageNetADatasetZeroShot, MockImageNetDatasetZeroShot, MockImageNetRDatasetZeroShot, MockImageNetSketchDatasetZeroShot, ) def test_imagenet_dataset_zero_shot( config_file_path: str = "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet.yaml", mock_dataset_class: Type[MockImageNetDatasetZeroShot] = MockImageNetDatasetZeroShot, ) -> None: """Test for ImageNet zero-shot. Similar test to ImageNet test but only for validation because zero-shot datasets are not supposed to be used for training. We also test the text prompts. """ opts = get_config(config_file=config_file_path) imagenet_zero_shot_dataset = mock_dataset_class( opts, is_training=False, is_evaluation=False ) for image_id in range(2): data = imagenet_zero_shot_dataset[image_id] # values from config file assert len(data) == 3, "ImageNet zero shot should return a tuple of 3." img_path, text_prompts, target = data assert isinstance(img_path, str), "ImageNet zero shot should return (str, ...)." assert ( isinstance(text_prompts, list) and isinstance(text_prompts[0], list) and isinstance(text_prompts[0][0], str) ), "ImageNet zero shot should return (..., list[list[str]], ...)." assert isinstance(target, int), "ImageNet zero shot should return (..., int)." @pytest.mark.parametrize( "config_file_path,mock_dataset_class", [ ( "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_a.yaml", # NOQA MockImageNetADatasetZeroShot, ), ( "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_r.yaml", # NOQA MockImageNetRDatasetZeroShot, ), ( "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_sketch.yaml", # NOQA MockImageNetSketchDatasetZeroShot, ), ], ) def test_imagenet_shift_dataset_zero_shot( config_file_path: str, mock_dataset_class: Type[MockImageNetDatasetZeroShot] ) -> None: test_imagenet_dataset_zero_shot(config_file_path, mock_dataset_class) ================================================ FILE: tests/data/datasets/segmentation/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/datasets/segmentation/dummy_ade20k_config.yaml ================================================ # pytest: disable dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "ade20k" category: "segmentation" train_batch_size0: 4 val_batch_size0: 4 eval_batch_size0: 2 workers: 4 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [64, 64] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 32 short_side_max: 64 max_img_dim: 64 photo_metric_distort: enable: true random_rotate: enable: true angle: 10 mask_fill: 0 # background idx is 0 random_gaussian_noise: enable: true sampler: name: "batch_sampler" bs: crop_size_width: 64 crop_size_height: 64 evaluation: segmentation: resize_input_images: false ================================================ FILE: tests/data/datasets/segmentation/dummy_cocostuff_config.yaml ================================================ # pytest: disable dataset: root_train: "/mnt/vision_datasets/cocostuff/" root_val: "/mnt/vision_datasets/cocostuff/" name: "coco_stuff" category: "segmentation" train_batch_size0: 4 val_batch_size0: 4 eval_batch_size0: 2 workers: 4 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 255 # Same as the ignore index value in the loss function random_horizontal_flip: enable: true resize: enable: true size: [64, 64] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 32 short_side_max: 64 max_img_dim: 64 photo_metric_distort: enable: true random_rotate: enable: true angle: 10 mask_fill: 255 # Same as the ignore index value in the loss function random_gaussian_noise: enable: true sampler: name: "batch_sampler" bs: crop_size_width: 64 crop_size_height: 64 evaluation: segmentation: resize_input_images: false ================================================ FILE: tests/data/datasets/segmentation/mock_ade20k.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets.segmentation.ade20k import ADE20KDataset TOTAL_SAMPLES = 8 from corenet.data.datasets import DATASET_REGISTRY @DATASET_REGISTRY.register(name="mock_ade20k", type="segmentation") class MockADE20KDataset(ADE20KDataset): def __init__( self, opts: argparse.Namespace, is_training: bool = False, is_evaluation: bool = False, *args, **kwargs ) -> None: """Mock the init logic for ImageNet dataset Specifically, we replace the samples and targets with random data so that actual dataset is not required for testing purposes. """ # super() is not called here intentionally. self.opts = opts self.root = None self.images = ["dummy_img_path.jpg" for _ in range(TOTAL_SAMPLES)] self.masks = ["dummy_mask_path.png" for _ in range(TOTAL_SAMPLES)] self.ignore_label = 255 self.background_idx = 0 self.is_training = is_training self.is_evaluation = is_evaluation self.check_dataset() self.n_classes = 150 @staticmethod def read_image_pil(path: str) -> Image.Image: """Mock the init logic for read_image_pil function Instead of reading a PIL RGB image at location specified by `path`, a PIL RGB image of size (20, 40) returned. """ im_arr = np.random.randint(low=0, high=255, size=(40, 20), dtype=np.uint8) return Image.fromarray(im_arr).convert("RGB") def read_mask_pil(self, path: str) -> Image.Image: """Mock the init logic for read_mask_pil function Instead of reading a mask at location specified by `path`, a random PIL mask is returned. """ im_arr = np.random.randint( low=0, high=self.n_classes, size=(40, 20), dtype=np.uint8 ) return Image.fromarray(im_arr).convert("L") ================================================ FILE: tests/data/datasets/segmentation/mock_coco_stuff.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional import numpy as np from PIL import Image from corenet.data.datasets.segmentation.coco_stuff import COCOStuffDataset TOTAL_SAMPLES = 8 from corenet.data.datasets import DATASET_REGISTRY @DATASET_REGISTRY.register(name="mock_coco_stuff", type="segmentation") class MockCOCOStuffDataset(COCOStuffDataset): def __init__( self, opts: argparse.Namespace, is_training: bool = False, is_evaluation: bool = False, *args, **kwargs ) -> None: """Mock the init logic for ImageNet dataset Specifically, we replace the samples and targets with random data so that actual dataset is not required for testing purposes. """ # super() is not called here intentionally. self.opts = opts self.root = None self.images = ["dummy_img_path.jpg" for _ in range(TOTAL_SAMPLES)] self.masks = ["dummy_mask_path.png" for _ in range(TOTAL_SAMPLES)] self.ignore_label = 255 self.background_idx = 0 self.n_classes = 171 self.is_training = is_training self.is_evaluation = is_evaluation self.check_dataset() @staticmethod def read_image_pil(path: str) -> Optional[Image.Image]: """Mock the init logic for read_image_pil function Instead of reading a PIL RGB image at location specified by `path`, a random PIL is returned. """ im_arr = np.random.randint(low=0, high=255, size=(40, 20), dtype=np.uint8) return Image.fromarray(im_arr).convert("RGB") def read_mask_pil(self, path: str) -> Optional[Image.Image]: """Mock the init logic for read_mask_pil function Instead of reading a mask at location specified by `path`, a random PIL mask is returned. """ im_arr = np.random.randint( low=0, high=self.n_classes, size=(40, 20), dtype=np.uint8 ) return Image.fromarray(im_arr).convert("L") ================================================ FILE: tests/data/datasets/segmentation/test_mock_ade20k.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest from corenet.data.data_loaders import CoreNetDataLoader from corenet.data.sampler import build_sampler from tests.configs import get_config from tests.data.datasets.segmentation.mock_ade20k import MockADE20KDataset @pytest.mark.parametrize("mode", ["train", "val", "eval"]) def test_ade20k_dataset(mode: str) -> None: """Test for ADE20k This test mocks `__init__`, `read_image_pil`, and `read_mask_pil` functions to test the `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped inside the respective data loaders to test the collate function used by dataset. """ config_file_path = "tests/data/datasets/segmentation/dummy_ade20k_config.yaml" opts = get_config(config_file=config_file_path) # TEST TRAINING DATASET, SAMPLER, COLLATE_FN expected_input_shape = [4, 3, 64, 64] is_training = mode == "train" is_evaluation = mode == "eval" if is_evaluation: expected_input_shape = [2, 3, 128, 64] # enable resizing based on aspect ratio for evaluation setattr(opts, "evaluation.segmentation.resize_input_images", True) # overwrite the validation argument setattr( opts, "dataset.val_batch_size0", getattr(opts, "dataset.eval_batch_size0") ) dataset = MockADE20KDataset( opts, is_training=is_training, is_evaluation=is_evaluation ) sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training) data_loader = CoreNetDataLoader( dataset=dataset, batch_sampler=sampler, # our samplers take care of batch size, so we set to 1 here batch_size=1, num_workers=0, ) for batch in data_loader: assert batch.keys() == {"samples", "targets"} assert [*batch["samples"].shape] == expected_input_shape assert ( batch["samples"].dim() == 4 ), "Expecting input images in [batch, image_channels, height, width] format" if mode in ["train", "val"]: assert ( batch["targets"].dim() == 3 ), "Expecting labels in [batch, height, width ] format" else: assert batch["targets"].keys() == { "mask", "file_name", "im_width", "im_height", } assert ( batch["targets"]["mask"].dim() == 3 ), "Expecting labels in [batch, height, width] format" # file names are expected as [file_1, file_2, ...] assert ( len(batch["targets"]["file_name"]) == 2 ), "Expecting file names as a list." # check the widths of input images. 20 is specified as dummy dimension for labels in read_mask_pil function. assert [*batch["targets"]["im_width"]] == [20, 20] # check the widths of input images. 40 is specified as dummy dimension for labels in read_mask_pil function. assert [*batch["targets"]["im_height"]] == [40, 40] ================================================ FILE: tests/data/datasets/segmentation/test_mock_coco_stuff.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest from corenet.data.data_loaders import CoreNetDataLoader from corenet.data.sampler import build_sampler from tests.configs import get_config from tests.data.datasets.segmentation.mock_coco_stuff import MockCOCOStuffDataset @pytest.mark.parametrize("mode", ["train", "val", "eval"]) def test_cocostuff_dataset(mode: str) -> None: """Test for COCOStuff This test mocks `__init__`, `read_image_pil`, and `read_mask_pil` functions to test the `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped inside the respective data loaders to test the collate function used by dataset. """ config_file_path = "tests/data/datasets/segmentation/dummy_cocostuff_config.yaml" opts = get_config(config_file=config_file_path) # TEST TRAINING DATASET, SAMPLER, COLLATE_FN expected_input_shape = [4, 3, 64, 64] is_training = mode == "train" is_evaluation = mode == "eval" if is_evaluation: expected_input_shape = [2, 3, 128, 64] # enable resizing based on aspect ratio for evaluation setattr(opts, "evaluation.segmentation.resize_input_images", True) # overwrite the validation argument setattr( opts, "dataset.val_batch_size0", getattr(opts, "dataset.eval_batch_size0") ) dataset = MockCOCOStuffDataset( opts, is_training=is_training, is_evaluation=is_evaluation ) sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training) data_loader = CoreNetDataLoader( dataset=dataset, batch_sampler=sampler, # our samplers take care of batch size, so we set to 1 here batch_size=1, num_workers=0, ) for batch in data_loader: assert batch.keys() == {"samples", "targets"} assert [*batch["samples"].shape] == expected_input_shape assert ( batch["samples"].dim() == 4 ), "Expecting input images in [batch, image_channels, height, width] format" if mode in ["train", "val"]: assert ( batch["targets"].dim() == 3 ), "Expecting labels in [batch, height, width ] format" else: assert batch["targets"].keys() == { "mask", "file_name", "im_width", "im_height", } assert ( batch["targets"]["mask"].dim() == 3 ), "Expecting labels in [batch, height, width] format" # file names are expected as [file_1, file_2, ...] assert ( len(batch["targets"]["file_name"]) == 2 ), "Expecting file names as a list." # check the widths of input images. 20 is specified as dummy dimension for labels in read_mask_pil function. assert [*batch["targets"]["im_width"]] == [20, 20] # check the widths of input images. 40 is specified as dummy dimension for labels in read_mask_pil function. assert [*batch["targets"]["im_height"]] == [40, 40] ================================================ FILE: tests/data/datasets/test_dataset_base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, Union import pytest from corenet.data.datasets.dataset_base import BaseDataset from tests.configs import get_config from tests.data.datasets.classification.mock_imagenet import MockImageNetDataset def test_repr_with_imagenet(): opts = get_config() setattr(opts, "image_augmentation.random_horizontal_flip.enable", True) setattr(opts, "image_augmentation.random_resized_crop.enable", True) mock_imagenet_dataset = MockImageNetDataset( opts, is_training=True, is_evaluation=False ) actual_repr = repr(mock_imagenet_dataset) # ignore some extra spaces actual_repr = actual_repr.replace("\t ", "\t").replace(" \n", "\n") expected_repr = """\ MockImageNetDataset( root=None is_training=True num_samples=10 transforms=Compose( RandomResizedCrop(scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), size=(256, 256), interpolation=bilinear), RandomHorizontalFlip(p=0.5), ToTensor(dtype=torch.float32, norm_factor=255) ) num_classes=1000 )""".replace( " " * 4, "\t" ) assert actual_repr == expected_repr @pytest.mark.parametrize("mean", [0.0, [0.0, 0.0, 0.0]]) @pytest.mark.parametrize("std", [1.0, [1.0, 1.0, 1.0]]) def test_repr_with_imagenet_with_mean_std_norm( mean: Union[float, list], std: Union[float, list] ) -> None: opts = get_config() setattr(opts, "image_augmentation.random_horizontal_flip.enable", True) setattr(opts, "image_augmentation.random_resized_crop.enable", True) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.enable", True) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.mean", mean) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.std", std) mock_imagenet_dataset = MockImageNetDataset( opts, is_training=True, is_evaluation=False ) actual_repr = repr(mock_imagenet_dataset) # ignore some extra spaces actual_repr = actual_repr.replace("\t ", "\t").replace(" \n", "\n") expected_repr = f"""\ MockImageNetDataset( root=None is_training=True num_samples=10 transforms=Compose( RandomResizedCrop(scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), size=(256, 256), interpolation=bilinear), RandomHorizontalFlip(p=0.5), ToTensor(dtype=torch.float32, norm_factor=255, mean_std_normalization_enable=True, normalization_mean={mean}, normalization_std={std}) ) num_classes=1000 )""".replace( " " * 4, "\t" ) assert actual_repr == expected_repr def test_item_metadata_exceptions(): class MyDataset(BaseDataset): def __getitem__(self, sample_size_and_index: Any) -> Any: return 2 opts = get_config() dataset = MyDataset(opts) # Make sure datasets that don't need item_metadata work without exception: assert dataset[0] == 2 # The proper error to be raised is NotImplementedError, so that the users know they # should implement which method with pytest.raises(NotImplementedError): dataset.get_item_metadata(0) ================================================ FILE: tests/data/datasets/test_image_pil.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import pytest import torch from corenet.data.transforms import image_pil def test_to_tensor() -> None: parser = argparse.ArgumentParser() parser = image_pil.ToTensor.add_arguments(parser) opts = parser.parse_args([]) to_tensor = image_pil.ToTensor(opts=opts) H, W, C = 2, 2, 3 num_masks = 2 data = { "image": torch.rand([H, W, C]), "mask": torch.randint(0, 1, [num_masks, H, W]), } output = to_tensor(data) assert output["image"].shape == (H, W, C) assert output["mask"].shape == (num_masks, H, W) def test_to_tensor_bad_mask() -> None: parser = argparse.ArgumentParser() parser = image_pil.ToTensor.add_arguments(parser) opts = parser.parse_args([]) to_tensor = image_pil.ToTensor(opts=opts) H, W, C = 2, 2, 3 num_categories = 2 data = { "image": torch.rand([H, W, C]), "mask": torch.randint(0, 1, [num_categories, 1, H, W]), } with pytest.raises(SystemExit): to_tensor(data) ================================================ FILE: tests/data/datasets/utils/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/datasets/utils/test_common.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import numpy as np import pytest from corenet.data.datasets.utils import common def _test_data(): num_samples_per_class = {"a": 5, "b": 10, "c": 15, "d": 20} num_classes = len(num_samples_per_class) num_total_samples = int(np.sum(list(num_samples_per_class.values()))) min_num_samples_per_class = np.min(list(num_samples_per_class.values())) labels = [] for class_label, num_samples in num_samples_per_class.items(): labels += [class_label] * num_samples return ( labels, num_samples_per_class, min_num_samples_per_class, num_classes, num_total_samples, ) def test_select_specified_number_of_samples_per_category(): ( labels, num_samples_per_class, min_num_samples_per_class, num_classes, _, ) = _test_data() random_seed = 0 for num_samples_to_select_per_class in range(min_num_samples_per_class + 1): if num_samples_to_select_per_class > 0: selected_sample_indices = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, num_samples_per_category=num_samples_to_select_per_class, ) assert ( len(selected_sample_indices) == num_samples_to_select_per_class * num_classes ) for c in num_samples_per_class: num_selected_samples_in_class_c = len( [ind for ind in selected_sample_indices if labels[ind] == c] ) assert ( num_selected_samples_in_class_c == num_samples_to_select_per_class ) else: with pytest.raises(ValueError): common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, num_samples_per_category=num_samples_to_select_per_class, ) def test_select_specified_percentage_of_samples_per_category(): labels, num_samples_per_class, _, _, _ = _test_data() random_seed = 0 percentages = [0, 20, 40, 60, 80, 100, 120] for percentage in percentages: if 0 < percentage <= 100: selected_sample_indices = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, percentage_of_samples_per_category=percentage, ) num_expected_samples = np.sum( [int(val * percentage / 100) for val in num_samples_per_class.values()] ) assert len(selected_sample_indices) == num_expected_samples for label, num_samples in num_samples_per_class.items(): num_selected_samples_in_class = len( [ind for ind in selected_sample_indices if labels[ind] == label] ) assert num_selected_samples_in_class == int( num_samples * percentage / 100 ) else: with pytest.raises(ValueError): common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, percentage_of_samples_per_category=percentage, ) def test_select_samples_by_category_with_default_arguments(): labels, num_samples_per_class, _, _, num_total_samples = _test_data() random_seed = 0 selected_sample_indices = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed ) assert len(selected_sample_indices) == num_total_samples for label, num_samples in num_samples_per_class.items(): num_selected_samples_in_class = len( [ind for ind in selected_sample_indices if labels[ind] == label] ) assert num_selected_samples_in_class == num_samples def test_reproducibility_of_sample_selection_by_category(): labels, _, min_num_samples_per_class, _, _ = _test_data() n_seeds = 5 percentages = [20, 40, 60, 80, 100] for random_seed in range(n_seeds): for num_samples_to_select_per_class in range(1, min_num_samples_per_class + 1): selected_sample_indices1 = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, num_samples_per_category=num_samples_to_select_per_class, ) selected_sample_indices2 = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, num_samples_per_category=num_samples_to_select_per_class, ) assert selected_sample_indices1 == selected_sample_indices2 for percentage in percentages: selected_sample_indices1 = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, percentage_of_samples_per_category=percentage, ) selected_sample_indices2 = common.select_samples_by_category( sample_category_labels=labels, random_seed=random_seed, percentage_of_samples_per_category=percentage, ) assert selected_sample_indices1 == selected_sample_indices2 def test_file_has_valid_image_extension(): for ext in common.IMG_EXTENSIONS: assert common.file_has_valid_image_extension("dummy" + ext) def test_select_random_subset(): num_total_samples = 10 for num_samples_to_select in range(num_total_samples): if num_samples_to_select > 0: indices1 = common.select_random_subset( random_seed=0, num_total_samples=num_total_samples, num_samples_to_select=num_samples_to_select, ) assert len(indices1) == num_samples_to_select indices2 = common.select_random_subset( random_seed=1, num_total_samples=num_total_samples, num_samples_to_select=num_samples_to_select, ) assert len(indices2) == num_samples_to_select assert indices1 != indices2 else: with pytest.raises(ValueError): common.select_random_subset( random_seed=0, num_total_samples=num_total_samples, num_samples_to_select=num_samples_to_select, ) for percentage_of_samples in [0, 20, 40, 60, 80, 100, 120]: if 0 < percentage_of_samples <= 100: indices1 = common.select_random_subset( random_seed=0, num_total_samples=num_total_samples, percentage_of_samples_to_select=percentage_of_samples, ) assert len(indices1) == percentage_of_samples * num_total_samples / 100 indices2 = common.select_random_subset( random_seed=1, num_total_samples=num_total_samples, percentage_of_samples_to_select=percentage_of_samples, ) assert len(indices2) == percentage_of_samples * num_total_samples / 100 assert indices1 != indices2 else: with pytest.raises(ValueError): common.select_random_subset( random_seed=0, num_total_samples=num_total_samples, percentage_of_samples_to_select=percentage_of_samples, ) def test_get_image_paths(): expected_img_paths = { "tests/data/datasets/classification/dummy_images/training/class1/dummy_image1.jpg", "tests/data/datasets/classification/dummy_images/training/class1/dummy_image2.jpg", "tests/data/datasets/classification/dummy_images/training/class2/dummy_image1.jpg", "tests/data/datasets/classification/dummy_images/training/class2/dummy_image2.jpg", "tests/data/datasets/classification/dummy_images/validation/class1/dummy_image1.jpg", "tests/data/datasets/classification/dummy_images/validation/class1/dummy_image2.jpg", "tests/data/datasets/classification/dummy_images/validation/class2/dummy_image1.jpg", "tests/data/datasets/classification/dummy_images/validation/class2/dummy_image2.jpg", } img_paths = common.get_image_paths( "tests/data/datasets/classification/dummy_images" ) assert set(img_paths) == expected_img_paths ================================================ FILE: tests/data/datasets/utils/test_video.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict import pytest import torch from corenet.data.datasets.utils import video def _get_invalid_label(timestamp: float) -> Dict: return { "x0": None, "x1": None, "y0": None, "y1": None, "speaking_label": None, "looking_label": None, "is_visible": False, "timestamp": timestamp, } def test_fetch_frame_label(): # x0 goes from 0 to 1 over different periods of time, and speaking_label # toggles. Other labels are unchanged. rectangles_dict = { "identity0": [ { "timestamp": 0.0, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "speaking_label": False, "is_visible": True, "looking_label": False, }, { "timestamp": 1.0, "x0": 1, "y0": 0, "x1": 1, "y1": 1, "speaking_label": True, "is_visible": True, "looking_label": False, }, ], "identity1": [ { "timestamp": 0.0, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "speaking_label": True, "is_visible": True, "looking_label": False, }, { "timestamp": 0.25, "x0": 1, "y0": 0, "x1": 1, "y1": 1, "speaking_label": False, "is_visible": True, "looking_label": False, }, ], } def _fetch_frame_label_fn(timestamp): return video._fetch_frame_label( "speaking_label", timestamp, rectangles_dict, carry_over_keys=["speaking_label", "looking_label", "is_visible"], required_keys=["speaking_label", "looking_label"], ) # Test the first label. ret = _fetch_frame_label_fn(0) assert ret["identity0"] == rectangles_dict["identity0"][0] assert ret["identity1"] == rectangles_dict["identity1"][0] # Test an interpolated label. ret = _fetch_frame_label_fn(0.25) expected_id0 = rectangles_dict["identity0"][0].copy() expected_id0["x0"] = 0.25 expected_id0["timestamp"] = 0.25 assert ret["identity0"] == expected_id0 assert ret["identity1"] == rectangles_dict["identity1"][1] # We should get an interpolated label for identity0, and an "empty" label # for identity1 since there are no more labels. ret = _fetch_frame_label_fn(0.5) expected_id0 = rectangles_dict["identity0"][0].copy() expected_id0["x0"] = 0.50 expected_id0["timestamp"] = 0.50 expected_id0["speaking_label"] = False assert ret["identity0"] == expected_id0 assert ret["identity1"] == _get_invalid_label(0.50) # We should get empty labels. ret = _fetch_frame_label_fn(-1) expected_id0 = _get_invalid_label(-1) assert ret["identity0"] == expected_id0 expected_id1 = _get_invalid_label(-1) assert ret["identity1"] == expected_id1 RECTANGLES_DICT = { "identity0": [ { "timestamp": 0.0, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 0, "is_visible": True, }, { "timestamp": 0.1, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 1, "is_visible": True, }, { "timestamp": 0.2, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 1, "is_visible": True, }, { "timestamp": 0.3, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 0, "is_visible": True, }, { "timestamp": 1.0, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 1, "is_visible": True, }, { "timestamp": 1.1, "x0": 0, "y0": 0, "x1": 1, "y1": 1, "action_label": 1, "is_visible": True, }, ], } # Below is a schematic of @rectangles_dict, where the asterisks denote labels # (with the corresponding class int above). The letters below denote the # regions. # # 0 1 1 0 1 1 # * * * * * * # +++++++++++++++++++++++++++++++++ // ++++++++++++++++++ # A [ B ) C C [ D ) E RECTANGLES_TEST_CASES = [ (0.04, (0, None), "A"), (0.06, (0, None), "A"), (0.11, (1, 0.01 / 0.2), "B"), (0.15, (1, 0.05 / 0.2), "B"), (0.19, (1, 0.09 / 0.2), "B"), (0.23, (1, 0.13 / 0.2), "B"), (0.31, (None, None), "C"), (0.90, (None, None), "C"), (1.05, (1, 0.05 / 0.1), "D"), (1.11, (None, None), "E"), ] @pytest.mark.parametrize("test_case", RECTANGLES_TEST_CASES) def test_fetch_frame_with_progress(test_case): timestamp, (expected_action_label, expected_progress), _ = test_case ret0 = video._fetch_frame_label( "action_label", timestamp, RECTANGLES_DICT, 0.2, set([1]), ["action_label"], )["identity0"] assert ret0["action_label"] == expected_action_label assert ret0["progress"] == ( expected_progress if expected_progress is None else pytest.approx(expected_progress) ) ================================================ FILE: tests/data/io/__init__.py ================================================ ================================================ FILE: tests/data/io/test_transfer_clients.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import os import pytest from corenet.options.opts import get_training_arguments from corenet.utils.download_utils import get_local_path @pytest.mark.skip_ci @pytest.mark.parametrize( "file_path", [ # Downloading of below file has been tested on Oct 30, 2023. # To avoid CI/CD breaking, we skip these tests during CI/CD. "https://github.com/apple/ml-cvnets/blob/main/examples/range_augment/classification/mobilenet_v1.yaml", "http://farm4.staticflickr.com/3217/2975157083_4567dde5d5_z.jpg", ], ) def test_client(file_path: str): opts = get_training_arguments(args=[]) local_path = get_local_path( opts=opts, path=file_path, max_retries=1, ) assert os.path.isfile(local_path) ================================================ FILE: tests/data/samplers/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/data/samplers/test_batch_sampler_config.yaml ================================================ # pytest: disable sampler: name: "batch_sampler" num_repeats: 1 truncated_repeat_aug_sampler: false bs: crop_size_width: 224 crop_size_height: 224 ================================================ FILE: tests/data/samplers/test_chain_sampler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import copy import random from typing import List import numpy as np import pytest from corenet.data.sampler import build_sampler from tests.configs import get_config @pytest.mark.parametrize( "tasks, batch_size, num_repeats, trunc_ra_sampler", [ (["task_1"], 1, 4, True), (["task_1", "task_2"], 2, 8, True), (["task_1"], 1, 4, False), (["task_1", "task_2"], 2, 8, False), ], ) def test_chain_sampler( tasks: List[str], config_file: str, batch_size: int, num_repeats: int, trunc_ra_sampler: bool, ) -> None: opts = get_config(config_file=config_file) sampler_list = [] n_data_samples = {} samples = 1000 total_expected_samples = 0 for task_name in tasks: # we randomly decide number of repeats so that number of repeats for each task is different # Expected result is deterministic, despite this randomness. reps = random.choice([1, num_repeats]) sampler_dict = { "task_name": task_name, "train_batch_size0": batch_size, "sampler_config": { "name": "variable_batch_sampler", "truncated_repeat_aug_sampler": trunc_ra_sampler, "num_repeats": reps, "vbs": { "crop_size_width": 512, "crop_size_height": 512, "max_n_scales": 10, "min_crop_size_width": 256, "max_crop_size_width": 768, "min_crop_size_height": 256, "max_crop_size_height": 768, "check_scale": 16, }, }, } total_expected_samples += samples * (1 if trunc_ra_sampler else reps) n_data_samples[task_name] = samples sampler_list.append(sampler_dict) setattr(opts, "sampler.chain_sampler", sampler_list) sampler = build_sampler(opts, n_data_samples=n_data_samples, is_training=True) np.testing.assert_equal(len(sampler), total_expected_samples) @pytest.mark.parametrize( "tasks, batch_size, num_repeats, truncated_rep", [ (["task_1"], 1, 4, True), (["task_1", "task_2"], 2, 2, True), (["task_1"], 1, 2, False), (["task_1", "task_2"], 2, 4, False), ], ) def test_sampling_mode( tasks: List[str], config_file: str, batch_size: int, num_repeats: int, truncated_rep: bool, ) -> None: n_samples = 8 sampler_list = [] n_data_samples = {} total_expected_samples = 0 for task_name in tasks: sampler_dict = { "task_name": task_name, "train_batch_size0": batch_size, "sampler_config": { "name": "batch_sampler", "bs": {"crop_size_width": 512, "crop_size_height": 512}, }, } total_expected_samples += n_samples n_data_samples[task_name] = n_samples sampler_list.append(sampler_dict) n_repeats_ = num_repeats if truncated_rep: # when truncated repetition is enabled, then total samples in the dataset # are the same as before repetition n_repeats_ = 1 expected_seq_out = [ t for t in tasks for i in range(n_samples) for j in range(n_repeats_) ] expected_interleave_order = [ t for _ in range(n_samples // batch_size) for _ in range(n_repeats_) for t in tasks for _ in range(batch_size) ] for mode in ["sequential", "interleave"]: opts = get_config(config_file=config_file) setattr(opts, "sampler.chain_sampler", copy.deepcopy(sampler_list)) setattr(opts, "sampler.chain_sampler_mode", mode) setattr(opts, "sampler.truncated_repeat_aug_sampler", truncated_rep) setattr(opts, "sampler.num_repeats", num_repeats) sampler = build_sampler(opts, n_data_samples=n_data_samples, is_training=True) sampler_order = [b[len(b) - 1] for batch in sampler for b in batch] if mode == "sequential": np.testing.assert_equal(expected_seq_out, sampler_order) else: np.testing.assert_equal(expected_interleave_order, sampler_order) def pytest_generate_tests(metafunc): configs = ["tests/data/samplers/test_chain_sampler_config.yaml"] metafunc.parametrize("config_file", configs) ================================================ FILE: tests/data/samplers/test_chain_sampler_config.yaml ================================================ # pytest: disable # dummy configuration for testing chain sampler # We over-ride different options inside the test to study different cases of chain sampler sampler: name: "chain_sampler" chain_sampler_mode: "sequential" chain_sampler: - task_name: "task_1" train_batch_size0: 128 val_batch_size0: 100 sampler_config: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 25 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 16 ================================================ FILE: tests/data/samplers/test_data_samplers.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Optional import numpy as np import pytest from corenet.data.sampler import build_sampler from tests.configs import get_config N_DATA_SAMPLES = 1000 DEFAULT_BATCH_SIZE = 128 def set_common_defaults( opts: argparse.Namespace, batch_size: Optional[int] = DEFAULT_BATCH_SIZE ) -> None: """Set common default values for all samplers.""" setattr(opts, "dataset.train_batch_size0", batch_size) @pytest.mark.parametrize( "num_repeats, trunc_ra_sampler, crop_size_h, crop_size_w", [ (1, True, 128, 320), (1, False, 128, 320), (4, True, 160, 384), (4, False, 160, 384), ], ) def test_ssc_fbs_sampler( num_repeats: int, trunc_ra_sampler: bool, crop_size_h: int, crop_size_w: int ) -> None: """Test for single-scale fixed batch size sampler with and without repeated augmentation.""" opts = get_config(config_file="tests/data/samplers/test_batch_sampler_config.yaml") set_common_defaults(opts) # set repeated augmentation related hyper-parameters setattr(opts, "sampler.num_repeats", num_repeats) setattr(opts, "sampler.truncated_repeat_aug_sampler", trunc_ra_sampler) # we over-ride the spatial sizes for testing different cases setattr(opts, "sampler.bs.crop_size_height", crop_size_h) setattr(opts, "sampler.bs.crop_size_width", crop_size_w) sampler = build_sampler(opts, n_data_samples=N_DATA_SAMPLES, is_training=True) assert hasattr(sampler, "crop_size_h") assert hasattr(sampler, "crop_size_w") assert sampler.crop_size_h == crop_size_h assert sampler.crop_size_w == crop_size_w # repeated sample test np.testing.assert_equal( len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats) ) @pytest.mark.parametrize( "num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales", [ (1, True, 128, 320, 128, 320, 1), (1, False, 128, 320, 128, 320, 5), (4, True, 160, 384, 160, 384, 10), (4, False, 160, 384, 160, 384, 50), ], ) def test_msc_fbs_batch_sampler( num_repeats: int, trunc_ra_sampler: bool, min_res_h: int, max_res_h: int, min_res_w: int, max_res_w: int, max_scales: int, ) -> None: """Test for multi-scale fixed batch size sampler with and without repeated augmentation.""" opts = get_config( config_file="tests/data/samplers/test_multi_scale_sampler_config.yaml" ) set_common_defaults(opts) setattr(opts, "sampler.msc.max_n_scales", max_scales) setattr(opts, "sampler.msc.min_crop_size_width", min_res_w) setattr(opts, "sampler.msc.max_crop_size_width", max_res_w) setattr(opts, "sampler.msc.min_crop_size_height", min_res_h) setattr(opts, "sampler.msc.max_crop_size_height", max_res_h) # set repeated augmentation related hyper-parameters setattr(opts, "sampler.num_repeats", num_repeats) setattr(opts, "sampler.truncated_repeat_aug_sampler", trunc_ra_sampler) sampler = build_sampler(opts, n_data_samples=1000, is_training=True) assert hasattr(sampler, "img_batch_tuples") scales_vbs = sampler.img_batch_tuples # check if number of sampled scales are <= max_scales + 1 # + 1 here because if the base image size is not present in the sampled scales, then we add it assert len(scales_vbs) <= (max_scales + 1) for h, w, b_sz in scales_vbs: # Resolution needs to be within the specified intervals assert min_res_h <= h <= max_res_h assert min_res_w <= w <= max_res_w assert ( b_sz == DEFAULT_BATCH_SIZE ), "We expect batch size to be the same for all scales in multi-scale sampler" # repeated sample test np.testing.assert_equal( len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats) ) @pytest.mark.parametrize( "num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales, batch_size", [ (1, True, 128, 320, 128, 320, 1, 1), (1, False, 128, 320, 128, 320, 5, 2), (4, True, 160, 384, 160, 384, 10, DEFAULT_BATCH_SIZE), (4, False, 160, 384, 160, 384, 50, DEFAULT_BATCH_SIZE), ], ) def test_msc_vbs_sampler( num_repeats: int, trunc_ra_sampler: bool, min_res_h: int, max_res_h: int, min_res_w: int, max_res_w: int, max_scales: int, batch_size: int, ) -> None: """Test for multi-scale variably-batch size sampler with and without repeated augmentation.""" opts = get_config( config_file="tests/data/samplers/test_variable_batch_sampler_config.yaml" ) set_common_defaults(opts, batch_size) setattr(opts, "sampler.vbs.max_n_scales", max_scales) setattr(opts, "sampler.vbs.min_crop_size_width", min_res_w) setattr(opts, "sampler.vbs.max_crop_size_width", max_res_w) setattr(opts, "sampler.vbs.min_crop_size_height", min_res_h) setattr(opts, "sampler.vbs.max_crop_size_height", max_res_h) setattr(opts, "sampler.num_repeats", num_repeats) setattr(opts, "sampler.truncated_repeat_aug_sampler", trunc_ra_sampler) sampler = build_sampler(opts, n_data_samples=N_DATA_SAMPLES, is_training=True) assert hasattr(sampler, "img_batch_tuples") scales_vbs = sampler.img_batch_tuples # check if number of sampled scales are <= max_scales + 1 # + 1 here because if the base image size is not present in the sampled scales, then we add it assert len(scales_vbs) <= (max_scales + 1) for h, w, b_sz in scales_vbs: # Resolution needs to be within the specified intervals assert min_res_h <= h <= max_res_h assert min_res_w <= w <= max_res_w area_ratio = (h * w * 1.0) / (224 * 224) # For variable sampler, we expect larger batch sizes for smaller resolution as # compared to base batch size and vice-versa if area_ratio < 1.0: # When batch size=1 (or small), then MSc-VBS sampler behaves like MSc-FBS, i.e., any resolution slightly # smaller than base resolution have the same batch size of 1. assert b_sz >= batch_size, ( "For spatial resolution smaller than the base resolution, " "we expect batch size >= base batch size" ) elif area_ratio > 1.0: # When batch size=1 (or small), then MSc-VBS sampler behaves like MSc-FBS, i.e., any resolution higher # than base resolution have the same batch size of 1. assert b_sz <= batch_size, ( "For spatial resolution larger than base resolution, " "we expect batch size to <= base batch size" ) else: assert b_sz == batch_size, ( "For spatial resolution equal to the base resolution, " "we expect batch size == base batch size" ) # repeated sample test np.testing.assert_equal( len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats) ) @pytest.mark.parametrize( "num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales, fps_scales, batch_size, is_training", [ (1, True, 128, 320, 128, 320, 1, 1, 1, True), (1, False, 128, 320, 128, 320, 5, 5, 2, False), (4, True, 160, 384, 160, 384, 10, 1, DEFAULT_BATCH_SIZE, True), (4, False, 160, 384, 160, 384, 50, 5, DEFAULT_BATCH_SIZE, False), ], ) def test_video_clip_sampler( num_repeats: int, trunc_ra_sampler: bool, min_res_h: int, max_res_h: int, min_res_w: int, max_res_w: int, max_scales: int, fps_scales: int, batch_size: int, is_training: bool, ) -> None: """Test for multi-scale variably-batch size sampler with and without repeated augmentation.""" opts = get_config( config_file="tests/data/samplers/test_video_clip_batch_sampler_config.yaml" ) set_common_defaults(opts, batch_size) setattr(opts, "sampler.vbs.max_n_scales", max_scales) setattr(opts, "sampler.vbs.min_crop_size_width", min_res_w) setattr(opts, "sampler.vbs.max_crop_size_width", max_res_w) setattr(opts, "sampler.vbs.min_crop_size_height", min_res_h) setattr(opts, "sampler.vbs.max_crop_size_height", max_res_h) setattr(opts, "sampler.num_repeats", num_repeats) setattr(opts, "sampler.vcbs.video_fps_num_scales", fps_scales) setattr(opts, "sampler.truncated_repeat_aug_sampler", trunc_ra_sampler) metadata = { 0: { "video_path": "tests/data/dummy_video.mov", "video_fps": 29, "total_video_frames": 114, "video_duration": 3.9, } } sampler = build_sampler( opts, n_data_samples=N_DATA_SAMPLES, is_training=is_training, get_item_metadata=metadata.__getitem__, ) assert hasattr(sampler, "img_batch_tuples") assert hasattr(sampler, "frame_rate_scales") if is_training: # Check if number of sampled scales are <= max_scales + 1, # + 1 here because if the base image size is not present in the sampled scales, # then we add it. assert len(sampler.img_batch_tuples) <= max_scales + 1 assert len(sampler.frame_rate_scales) <= fps_scales + 1 expected_len = N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats) else: assert len(sampler.img_batch_tuples) == 1 assert len(sampler.frame_rate_scales) == 1 expected_len = N_DATA_SAMPLES # Repeated sample test. np.testing.assert_equal(len(sampler), expected_len) ================================================ FILE: tests/data/samplers/test_multi_scale_sampler_config.yaml ================================================ # pytest: disable sampler: name: "multi_scale_sampler" num_repeats: 1 truncated_repeat_aug_sampler: false msc: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/samplers/test_variable_batch_sampler_config.yaml ================================================ # pytest: disable sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32 ================================================ FILE: tests/data/samplers/test_video_clip_batch_sampler_config.yaml ================================================ # pytest: disable sampler: name: "video_clip_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 check_scale: 32 vcbs: num_frames_per_clip: 8 video_fps: 8 audio_fps: 16000 max_num_clips_per_batch: 2 num_clips_per_second_train: 2 num_clips_per_second_val: 2 num_samples_per_clip: 2 video_fps_num_scales: 2 ================================================ FILE: tests/data/text_tokenizer/__init__.py ================================================ ================================================ FILE: tests/data/text_tokenizer/test_clip_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from argparse import Namespace import torch from corenet.data.text_tokenizer.clip_tokenizer import ClipTokenizer def test_clip_tokenizer(): """Test for 'ClipTokenizer'.""" opts = Namespace() setattr( opts, "text_tokenizer.clip.merges_path", "http://download.pytorch.org/models/text/clip_merges.bpe", ) setattr( opts, "text_tokenizer.clip.encoder_json_path", "http://download.pytorch.org/models/text/clip_encoder.json", ) tokenizer = ClipTokenizer(opts=opts) out = tokenizer("the quick brown fox jumped over the lazy dog") expected_data = [ 49406, # Start token id 518, 3712, 2866, 3240, 16901, 962, 518, 10753, 1929, 49407, # end token id ] expected_out = torch.tensor(expected_data, dtype=out.dtype) torch.testing.assert_close(actual=out, expected=expected_out) assert tokenizer.sot_token == "<|startoftext|>" assert tokenizer.eot_token == "<|endoftext|>" assert tokenizer.sot_token_id == 49406 assert tokenizer.eot_token_id == 49407 ================================================ FILE: tests/data/text_tokenizer/test_openai_clip_tokenizer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from argparse import Namespace import torch from corenet.third_party.data.text_tokenizer.openai_clip_tokenizer import ( OpenAIClipTokenizer, ) def test_openai_clip_tokenizer(): """Test for OpenAIClipTokenizer.""" opts = Namespace() setattr( opts, "text_tokenizer.openai_clip.bpe_path", "https://github.com/openai/CLIP/raw/a1d071733d7111c9c014f024669f959182114e33/clip/bpe_simple_vocab_16e6.txt.gz", ) tokenizer = OpenAIClipTokenizer(opts) out = tokenizer("the quick brown fox jumped over the lazy dog") expected_data = [ 49406, # Start token id 518, 3712, 2866, 3240, 16901, 962, 518, 10753, 1929, 49407, # end token id ] expected_out = torch.tensor(expected_data, dtype=out.dtype) torch.testing.assert_close(actual=out, expected=expected_out) assert tokenizer.sot_token == "<|startoftext|>" assert tokenizer.eot_token == "<|endoftext|>" assert tokenizer.sot_token_id == 49406 assert tokenizer.eot_token_id == 49407 ================================================ FILE: tests/data/video_reader/__init__.py ================================================ ================================================ FILE: tests/data/video_reader/test_av_reader.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys import pytest import torch from corenet.data.transforms.common import Compose from corenet.data.video_reader.decord_reader import DecordAVReader from corenet.data.video_reader.ffmpeg_reader import FFMPEGReader from corenet.data.video_reader.ffmpeg_utils import IS_FFMPEG_INSTALLED from corenet.data.video_reader.pyav_reader import PyAVReader from tests.configs import get_config @pytest.mark.parametrize("reader_class", [PyAVReader, DecordAVReader, FFMPEGReader]) @pytest.mark.parametrize( "num_frames_per_clip,clips_per_video,is_training,output_video_fps,output_audio_fps,num_samples_per_clip,frame_stack_format", [ # Training cases. # num_frames_per_clip > num_frames_in_video. (15, 3, True, -1, -1, 2, "sequence_first"), # Perfect training case. (16, 3, True, 8, 16000, 2, "sequence_first"), # clips_per_video = 1, (60, 1, True, 16, -1, 1, "sequence_first"), (120, 3, True, 8, 16000, 2, "channel_first"), # Evaluation cases. # Perfect validation case. (16, 3, False, -1, -1, 2, "sequence_first"), # clips_per_video = 1, (30, 1, False, 8, 16000, 1, "sequence_first"), (120, 3, False, 16, -1, 2, "channel_first"), ], ) def test_video_reader_clips( reader_class, num_frames_per_clip, clips_per_video, is_training, output_video_fps, output_audio_fps, num_samples_per_clip, frame_stack_format, ): if reader_class is DecordAVReader and "decord" not in sys.modules: pytest.skip("Decord (optional dependncy) is not installed.") if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") # This test makes sure that the dimension of the outputs match the expectations if frame_stack_format == "channel_first": channel_idx = 1 time_idx = 2 else: channel_idx = 2 time_idx = 1 opts = get_config() setattr(opts, "dataset.collate_fn_name_train", "default_collate_fn") setattr(opts, "dataset.collate_fn_name_val", "default_collate_fn") setattr(opts, "video_reader.frame_stack_format", frame_stack_format) testfile = "tests/data/dummy_video.mov" silent_testfile = "tests/data/dummy_silent_video.mov" reader = reader_class(opts, is_training=is_training) silent_reader = reader_class(opts, is_training=is_training) video_channels = 3 video, audio, metadata = reader.read_video_file_into_clips( testfile, num_frames_per_clip=num_frames_per_clip, clips_per_video=clips_per_video, is_training=is_training, output_video_fps=output_video_fps, output_audio_fps=output_audio_fps, num_samples_per_clip=num_samples_per_clip, ).values() ( silent_video, silent_audio, silent_metadata, ) = reader.read_video_file_into_clips( silent_testfile, num_frames_per_clip=num_frames_per_clip, clips_per_video=clips_per_video, is_training=is_training, output_video_fps=output_video_fps, output_audio_fps=output_audio_fps, num_samples_per_clip=num_samples_per_clip, video_only=True, ).values() assert video.shape == silent_video.shape assert ( metadata["video_frame_timestamps"].shape == silent_metadata["video_frame_timestamps"].shape ) assert metadata["video_fps"] == silent_metadata["video_fps"] assert silent_audio is None assert silent_metadata["audio_fps"] is None assert video.shape[0] == audio.shape[0] assert metadata["video_frame_timestamps"].shape == ( video.shape[0], video.shape[time_idx], ) assert video.ndim == 5 and audio.ndim == 3 if is_training: assert video.shape[0] == clips_per_video * num_samples_per_clip else: assert video.shape[0] == clips_per_video assert video.shape[time_idx] == num_frames_per_clip assert video.shape[channel_idx] == video_channels assert ( video.shape[time_idx] - audio.shape[1] * metadata["video_fps"] / metadata["audio_fps"] < 1 ), "Audio and video are of different lengths in seconds." if output_video_fps > 0: assert metadata["video_fps"] == output_video_fps if output_audio_fps > 0: assert metadata["audio_fps"] == output_audio_fps @pytest.mark.parametrize("reader_class", [PyAVReader, DecordAVReader, FFMPEGReader]) @pytest.mark.parametrize( "num_frames_per_clip,clips_per_video,is_training,output_video_fps,output_audio_fps,num_samples_per_clip,frame_stack_format", [ # Training cases. # Perfect training case. (8, 3, True, -1, -1, 1, "sequence_first"), (16, 3, True, 8, 16000, 2, "channel_first"), (120, 3, True, 8, 16000, 2, "channel_first"), # Evaluation cases. # Perfect case. (8, 3, False, -1, -1, 1, "sequence_first"), (16, 3, False, 8, 16000, 2, "channel_first"), (120, 3, False, 8, 16000, 2, "channel_first"), ], ) def test_video_reader_values( reader_class, num_frames_per_clip, clips_per_video, is_training, output_video_fps, output_audio_fps, num_samples_per_clip, frame_stack_format, ): if reader_class is DecordAVReader and "decord" not in sys.modules: pytest.skip("Decord (optional dependncy) is not installed.") if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") reader_name = "pyav" if reader_class is PyAVReader else "decord" # This test makes sure that the values in the clips for perfect videos are different opts = get_config() setattr(opts, "dataset.collate_fn_name_train", "default_collate_fn") setattr(opts, "dataset.collate_fn_name_val", "default_collate_fn") setattr(opts, "video_reader.name", reader_name) setattr(opts, "video_reader.frame_stack_format", frame_stack_format) testfile = "tests/data/dummy_video.mov" reader = reader_class(opts, is_training=is_training) video, audio, metadata = reader.read_video_file_into_clips( testfile, num_frames_per_clip=num_frames_per_clip, clips_per_video=clips_per_video, is_training=is_training, output_video_fps=output_video_fps, output_audio_fps=output_audio_fps, num_samples_per_clip=num_samples_per_clip, ).values() # Dummy video has 114 frames. total_frames = 114 if num_frames_per_clip > total_frames: assert torch.allclose( video[:-1], video[1:] ), "Not all video clips are the same." assert torch.allclose( audio[:-1], audio[1:] ), "Not all audio clips are the same." else: assert not torch.allclose( video[:-1], video[1:] ), "All video clips are the same." assert not torch.allclose( audio[:-1], audio[1:] ), "All audio clips are the same." @pytest.mark.parametrize("reader_class", [PyAVReader, DecordAVReader, FFMPEGReader]) def test_build_video_metadata(reader_class): if reader_class is DecordAVReader and "decord" not in sys.modules: pytest.skip("Decord (optional dependncy) is not installed.") if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") # This test makes sure that the values in the clips for perfect videos are different opts = get_config() reader = reader_class(opts) testfile = "tests/data/dummy_video.mov" expected_metadata = { "filename": testfile, "video_fps": 30, "total_video_frames": 114, "video_duration": 3.8, } metadata = reader.build_video_metadata(testfile) assert metadata["filename"] == expected_metadata["filename"] assert round(metadata["video_fps"], 0) == expected_metadata["video_fps"] assert metadata["total_video_frames"] == expected_metadata["total_video_frames"] assert round(metadata["video_duration"], 1) == expected_metadata["video_duration"] ================================================ FILE: tests/data/video_reader/test_ffmpeg_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import copy from pathlib import Path from typing import Dict import numpy as np import pytest import torch from corenet.data.transforms.common import BaseTransformation, Identity from corenet.data.video_reader.ffmpeg_reader import FFMPEGReader from corenet.data.video_reader.ffmpeg_utils import ( IS_FFMPEG_INSTALLED, FFMPEGError, ffmpeg, ffprobe, get_flags_to_replicate_audio_codec, get_video_metadata, transform_video_file, write_audio, write_video, ) from tests.configs import get_config def assert_video_data_is_close(actual: Dict, expected: Dict) -> None: if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") """Given two ffmpeg reader outputs, asserts audio and video signals are close.""" def matching_ratio(x: torch.Tensor, y: torch.Tensor, atol=0.05, rtol=0.0): """Returns the percentage of elements of x,y that are close with atol, rtol.""" return torch.isclose(x, y, atol=atol, rtol=rtol).float().mean() assert matching_ratio(actual["video"], expected["video"]) >= 0.99 assert np.isclose( actual["audio"].shape[0], expected["audio"].shape[0], atol=0.05 * actual["metadata"]["audio_fps"], # 0.05 seconds ) min_length = min(actual["audio"].shape[0], expected["audio"].shape[0]) assert ( matching_ratio(actual["audio"][:min_length], expected["audio"][:min_length]) >= 0.99 ) def test_transform_video_with_trimming(tmp_path: Path): if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") opts = get_config() input_path = "./tests/data/dummy_video.mov" output_path = str(tmp_path / "output.mov") from_timestamp = 1 to_timestamp = 2.5 transform_video_file( input_filename=input_path, output_filename=output_path, transform=Identity(opts), from_timestamp=from_timestamp, to_timestamp=to_timestamp, encoder_flags={ # Audio codec should be specified when trimming. **get_flags_to_replicate_audio_codec(input_path), # Use highest possible quality so that we can compare the results. "q:a": 0, "q:v": 0, }, ) reader = FFMPEGReader(opts) input_data = reader.read_video( input_path, ) output_data = reader.read_video( output_path, ) expected_data = copy.deepcopy(input_data) for key in ("video", "audio"): fps = expected_data["metadata"][f"{key}_fps"] from_frame = int(from_timestamp * fps) to_frame = int(to_timestamp * fps) expected_data[key] = expected_data[key][from_frame:to_frame] assert_video_data_is_close(actual=output_data, expected=expected_data) def test_transform_video_with_fps(tmp_path: Path): if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") opts = get_config() input_path = "./tests/data/dummy_video.mov" output_path = str(tmp_path / "output.mov") transform_video_file( input_filename=input_path, output_filename=output_path, transform=Identity(opts), video_fps=8, encoder_flags={ # Audio codec should be specified when trimming. **get_flags_to_replicate_audio_codec(input_path), # Use highest possible quality so that we can compare the results. "q:a": 0, "q:v": 0, }, ) import os print("test ", output_path, os.path.exists(output_path)) metadata = get_video_metadata(output_path) assert metadata["video_fps"] == 8 class SmallCrop(BaseTransformation): CROP_SIZE = 7, 9 def __call__(self, data: Dict) -> Dict: frames = data["samples"]["video"] frames = frames[:, :, :, : self.CROP_SIZE[0], : self.CROP_SIZE[1]] data["samples"]["video"] = frames return data @pytest.mark.parametrize( "transform_cls,transform_kwargs", [(Identity, {}), (SmallCrop, {"output_dimensions": SmallCrop.CROP_SIZE})], ) def test_transform_video_file( tmp_path: Path, transform_cls: BaseTransformation, transform_kwargs: Dict, ): if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") opts = get_config() input_path = "./tests/data/dummy_video.mov" output_path = str(tmp_path / "output.mov") transform_video_file( input_filename=input_path, output_filename=output_path, transform=transform_cls(opts), encoder_flags={ # Use highest possible quality so that we can compare the results. "q:a": 0, "q:v": 0, }, **transform_kwargs, ) reader = FFMPEGReader(opts) input_data = reader.read_video(input_path) output_data = reader.read_video(output_path) for data in input_data, output_data: # The BaseTransformation instances expect 5D tensors for multi-clip videos. # FIXME: A better solution is to refactor FFMPEGReader.read_video() to follow # the convention of returning a 5D tensor, rather than a 4D tensor. data["video"] = torch.unsqueeze(data["video"], 0) # Apply the transformation on all frames of the input data. `output_data` is # transformed chunk-by-chunk using an ffmpeg decode->transform->concat->encode # pipeline, while `input_data` is read into RAM as a whole and processed using the # same transformation. expected_data = transform_cls(opts)( { "samples": input_data, "targets": {}, } )["samples"] assert_video_data_is_close(actual=output_data, expected=expected_data) def test_error_message() -> None: with pytest.raises(FFMPEGError, match="Could not extract ffmpeg metadata for"): ffprobe("/invalid/path") with pytest.raises(FFMPEGError, match="use a standard extension for the filename"): transform_video_file( "./tests/data/dummy_video.mov", "/invalid/path", transform=lambda x: x, ) def test_ffprobe() -> None: """ Checks that our implementation of ffprobe is consistent with ffmpeg-python library. """ if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependency) is not installed.") our_output = ffprobe("./tests/data/dummy_video.mov") library_output = ffmpeg.probe("./tests/data/dummy_video.mov") assert our_output == library_output def test_write_video_and_audio( tmp_path: Path, ): if not IS_FFMPEG_INSTALLED: pytest.skip("FFmpeg (optional dependncy) is not installed.") opts = get_config() video_data = { "audio": torch.linspace(0.0, 2000.0, 32000).sin()[:, None], "video": torch.rand(30, 3, 1, 1).repeat(1, 1, 128, 128), "metadata": {"audio_fps": 16000, "video_fps": 15}, } output_path = str(tmp_path / "output.mkv") write_video(video_data, output_path) saved_data = FFMPEGReader(opts).read_video(output_path) assert_video_data_is_close(actual=saved_data, expected=video_data) # Make sure we can write audio too write_audio(video_data, str(tmp_path / "output.wav")) ================================================ FILE: tests/engine/__init__.py ================================================ ================================================ FILE: tests/engine/dummy_configs/ade20k_segmentation/deeplabv3_mobilenetv2.yaml ================================================ # pytest: disable # This is a dummy configuration for testing classification task end-to-end taskname: '+ MobileNetv2-1.0 DeepLabv3' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 200 auto_resume: false mixed_precision: true dataset: root_train: "/mnt/vision_datasets/ADEChallengeData2016/" root_val: "/mnt/vision_datasets/ADEChallengeData2016/" name: "mock_ade20k" category: "segmentation" train_batch_size0: 2 # effective batch size is 16 ( 4 * 4 GPUs) val_batch_size0: 2 eval_batch_size0: 1 workers: 4 persistent_workers: false pin_memory: false image_augmentation: random_crop: enable: true seg_class_max_ratio: 0.75 pad_if_needed: true mask_fill: 0 # background idx is 0 random_horizontal_flip: enable: true resize: enable: true size: [64, 64] interpolation: "bilinear" random_short_size_resize: enable: true interpolation: "bilinear" short_side_min: 32 short_side_max: 96 max_img_dim: 96 photo_metric_distort: enable: true random_rotate: enable: true angle: 10 mask_fill: 0 # background idx is 0 random_gaussian_noise: enable: true sampler: name: "batch_sampler" bs: crop_size_width: 32 crop_size_height: 32 loss: category: "segmentation" segmentation: name: "cross_entropy" cross_entropy: aux_weight: 0.4 ignore_index: -1 optim: name: "sgd" weight_decay: 1.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "cosine" is_iteration_based: false max_epochs: 2 cosine: max_lr: 0.02 min_lr: 0.0001 model: segmentation: name: "encoder_decoder" n_classes: 150 lr_multiplier: 1 seg_head: "deeplabv3" output_stride: 8 classifier_dropout: 0.1 use_aux_head: true activation: name: "relu" deeplabv3: aspp_dropout: 0.1 aspp_sep_conv: false aspp_out_channels: 32 aspp_rates: [ 12, 24, 36 ] classification: name: "mobilenetv2" n_classes: 1000 activation: name: "relu6" mobilenetv2: width_multiplier: 0.25 normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu6" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "iou" ] train: [ "loss" ] checkpoint_metric: "iou" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/coco_detection/resnet_mask_rcnn.yaml ================================================ taskname: '+ ResNet-50 Mask RCNN' common: run_label: "train" accum_freq: 1 log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "tests/data/coco" root_val: "tests/data/coco" category: "detection" train_batch_size0: 1 # effective base batch size is 64 (2 * 8 GPUs * 4 nodes) val_batch_size0: 1 eval_batch_size0: 1 workers: 0 persistent_workers: false pin_memory: true name: "mock_coco_mask_rcnn" collate_fn_name_train: "coco_mask_rcnn_collate_fn" collate_fn_name_val: "coco_mask_rcnn_collate_fn" collate_fn_name_test: "coco_mask_rcnn_collate_fn" image_augmentation: # for evaluation resize: enable: true size: [256, 256] interpolation: "bilinear" sampler: name: variable_batch_sampler vbs: check_scale: 32 crop_size_height: 256 crop_size_width: 256 max_crop_size_height: 384 max_crop_size_width: 384 max_n_scales: 10 min_crop_size_height: 128 min_crop_size_width: 128 loss: category: "detection" detection: name: "mask_rcnn_loss" mask_rcnn_loss: classifier_weight: 1 box_reg_weight: 1 mask_weight: 1 objectness_weight: 1 rpn_box_reg: 1 optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 scheduler: name: "multi_step" max_epochs: 2 warmup_iterations: 500 warmup_init_lr: 0.001 multi_step: gamma: 0.1 lr: 0.1 milestones: [60, 84] model: detection: name: "mask_rcnn" n_classes: 81 mask_rcnn: backbone_lr_multiplier: 0.1 norm_layer: "batch_norm" disable_fpn: false classification: name: "resnet" activation: name: "relu" resnet: depth: 50 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true coco_map: iou_types: [ "bbox", "segm" ] ================================================ FILE: tests/engine/dummy_configs/coco_detection/resnet_ssd.yaml ================================================ taskname: '+ ResNet-50 SSD' common: run_label: "train" accum_freq: 1 accum_after_epoch: -1 log_freq: 100 auto_resume: true mixed_precision: true dataset: root_train: "tests/data/coco" root_val: "tests/data/coco" category: "detection" train_batch_size0: 2 # effective batch size is 64 (16 * 4 GPUs) val_batch_size0: 2 eval_batch_size0: 1 workers: 0 persistent_workers: false pin_memory: true name: "mock_coco_ssd" collate_fn_name_train: "coco_ssd_collate_fn" collate_fn_name_val: "coco_ssd_collate_fn" collate_fn_name_test: "coco_ssd_collate_fn" image_augmentation: resize: enable: true size: [64, 64] interpolation: "bicubic" sampler: name: "batch_sampler" bs: crop_size_width: 64 crop_size_height: 64 loss: category: "detection" detection: name: "ssd_multibox_loss" ssd_multibox_loss: neg_pos_ratio: 3 optim: name: "sgd" weight_decay: 5.e-4 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" max_epochs: 2 warmup_iterations: 1800 # 5 epochs warmup_init_lr: 1.e-6 cosine: max_lr: 0.0052 min_lr: 0.00005 anchor_generator: name: "ssd" ssd: output_strides: [16, 32, 64] aspect_ratios: [ [2, 3], [2, 3], [2]] min_scale_ratio: 0.1 max_scale_ratio: 1.05 matcher: name: "ssd" ssd: center_variance: 0.1 size_variance: 0.2 iou_threshold: 0.5 model: detection: name: "ssd" n_classes: 81 ssd: proj_channels: [128, 128, 128] nms_iou_threshold: 0.5 classification: name: "resnet" activation: name: "relu" resnet: depth: 50 normalization: name: "sync_batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0001 stats: val: [ "loss", "coco_map"] train: ["loss"] checkpoint_metric: "coco_map.bbox" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/image_text_clip/clip_vit.yaml ================================================ # pytest: disable taskname: '+ CLIP-ViT-Tiny/16' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true accum_freq: 1 save_all_checkpoints: true save_interval_freq: 5000 dataset: # root_train does not matter for img_text_tar dataset because dataset is information is expected # to be contained in metadata file. root_train: "" disable_val: true train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 padding_index: 0 persistent_workers: false pin_memory: true workers: 0 collate_fn_name_train: "multi_modal_img_text_collate_fn" collate_fn_name_val: "multi_modal_img_text_collate_fn" collate_fn_name_test: "multi_modal_img_text_collate_fn" name: "mock_img_text_tar" category: "multi_modal_image_text" multi_modal_img_text: context_length: 12 img_text_tar: metadata_file: ".corenet_data_cache/metadata.pkl" text_tokenizer: name: "clip" clip: merges_path: "http://download.pytorch.org/models/text/clip_merges.bpe" encoder_json_path: "http://download.pytorch.org/models/text/clip_encoder.json" image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" scale: [0.9, 1.0] resize: enable: true size: 64 interpolation: "bilinear" center_crop: enable: true size: 64 sampler: name: "variable_batch_sampler" use_shards: true vbs: crop_size_width: 64 crop_size_height: 64 max_n_scales: 5 min_crop_size_width: 32 max_crop_size_width: 64 min_crop_size_height: 32 max_crop_size_height: 64 check_scale: 32 loss: category: "multi_modal_image_text" multi_modal_image_text: name: "contrastive_loss_clip" optim: name: "adamw" weight_decay: 0.2 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.98 eps: 1.e-6 scheduler: is_iteration_based: true max_iterations: 4 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0005 min_lr: 1.e-06 model: activation_checkpointing: true multi_modal_image_text: # multi-modal image-text model name: "clip" lr_multiplier_img_encoder: 1.0 lr_multiplier_text_encoder: 1.0 clip: projection_dim: 128 classification: name: "vit" vit: mode: "tiny" norm_layer: "layer_norm_fp32" activation: name: "gelu" image_projection_head: name: "simple_projection_nc2nc" text: # text encoder name: "transformer" vocab_size: 49408 context_length: 12 transformer: causal_masking: true model_dim: 128 n_transformer_layers: 2 ffn_multiplier_per_layer: 4.0 n_heads_per_layer: 8 norm_layer: "layer_norm_fp32" normalization: name: "batch_norm" momentum: 0.1 activation: name: "gelu" inplace: true layer: global_pool: "mean" conv_init: "kaiming_uniform" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "top1" ] train: ["loss", "grad_norm" ] checkpoint_metric: "top1.zero_shot_image_logits" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/imagenet_classification/efficientnet_b0.yaml ================================================ # pytest: disable # This is a dummy configuration for testing classification task end-to-end taskname: '+ EfficientNet-B0' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "mock_imagenet" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 0 persistent_workers: true pin_memory: true image_augmentation: # training related parameters random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true # validation related parameters resize: enable: true size: 64 interpolation: "bilinear" center_crop: enable: true size: 64 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 64 crop_size_height: 64 max_n_scales: 5 min_crop_size_width: 32 max_crop_size_width: 96 min_crop_size_height: 32 max_crop_size_height: 96 check_scale: 32 loss: category: "composite_loss" composite_loss: - loss_category: "classification" loss_weight: 1.0 classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 - loss_category: "neural_augmentation" loss_weight: 1.0 neural_augmentation: perceptual_metric: "psnr" target_value: [ 40, 10 ] curriculum_method: "cosine" optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true scheduler: name: "cosine" max_epochs: 2 warmup_iterations: 3000 warmup_init_lr: 0.1 cosine: max_lr: 0.8 min_lr: 4.e-4 model: classification: name: "efficientnet" activation: name: "swish" efficientnet: mode: "b0" stochastic_depth_prob: 0.0 classifier_dropout: 0.0 learn_augmentation: brightness: true contrast: true noise: true mode: "distribution" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" inplace: true layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal" ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1.logits" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/imagenet_classification/mobilevit.yaml ================================================ # pytest: disable # This is a dummy configuration for testing classification task end-to-end taskname: '+ MobileViTv1-XXSmall' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true dataset: root_train: "/mnt/imagenet/training" # Please update the location of training set root_val: "/mnt/imagenet/validation" # Please update the location of validation set name: "mock_imagenet" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 0 persistent_workers: true pin_memory: true collate_fn_name_train: image_classification_data_collate_fn collate_fn_name_val: image_classification_data_collate_fn collate_fn_name_test: image_classification_data_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 64 interpolation: "bilinear" center_crop: enable: true size: 64 sampler: name: "variable_batch_sampler" vbs: crop_size_width: 64 crop_size_height: 64 max_n_scales: 5 min_crop_size_width: 32 max_crop_size_width: 96 min_crop_size_height: 32 max_crop_size_height: 96 check_scale: 32 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "adamw" weight_decay: 0.0001 no_decay_bn_filter_bias: false adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: false max_epochs: 2 warmup_iterations: 2 # longer warm-up warmup_init_lr: 0.000001 cosine: max_lr: 0.0001 min_lr: 0.000001 model: classification: name: "mobilevit" classifier_dropout: 0.1 n_classes: 1000 mit: mode: "xx_small" dropout: 0.1 number_heads: 4 conv_kernel_size: 3 activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/imagenet_classification/mobilevit_v2.yaml ================================================ # pytest: disable # This is a dummy configuration for testing classification task end-to-end taskname: '+ MobileViTv2' common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true tensorboard_logging: false grad_clip: 10.0 dataset: root_train: "/mnt/imagenet/training" # Please update the location of training set root_val: "/mnt/imagenet/validation" # Please update the location of validation set name: "mock_imagenet" category: "classification" train_batch_size0: 2 val_batch_size0: 2 eval_batch_size0: 2 workers: 0 persistent_workers: true pin_memory: true collate_fn_name_train: image_classification_data_collate_fn collate_fn_name_val: image_classification_data_collate_fn collate_fn_name_test: image_classification_data_collate_fn image_augmentation: random_resized_crop: enable: true interpolation: "bicubic" random_horizontal_flip: enable: true rand_augment: enable: true random_erase: enable: true p: 0.25 mixup: enable: true alpha: 0.2 cutmix: enable: true alpha: 1.0 resize: enable: true size: 64 interpolation: "bicubic" center_crop: enable: true size: 64 sampler: name: "batch_sampler" bs: crop_size_width: 64 crop_size_height: 64 loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1 optim: name: "adamw" weight_decay: 0.05 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.999 scheduler: name: "cosine" is_iteration_based: true max_iterations: 5 warmup_iterations: 20000 warmup_init_lr: 1.e-6 cosine: max_lr: 0.002 min_lr: 1.e-6 model: classification: name: "mobilevit_v2" mitv2: width_multiplier: 0.5 attn_norm_layer: "layer_norm_2d" activation: name: "swish" normalization: name: "batch_norm" momentum: 0.1 activation: name: "swish" layer: global_pool: "mean" conv_init: "kaiming_normal" conv_init_std_dev: 0.02 linear_init: "trunc_normal" linear_init_std_dev: 0.02 ema: enable: true momentum: 0.0005 stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true ================================================ FILE: tests/engine/dummy_configs/language_modeling_gpt/gpt.yaml ================================================ # pytest: disable common: run_label: "train" log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 dataset: root_train: "" disable_val: true train_batch_size0: 2 workers: 0 persistent_workers: true pin_memory: true # dataset details category: "language_modeling" name: "mock_general_lm" language_modeling: sequence_length: 10 min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true general_lm: data_state_save_interval: 0 reader_chunk_size: 1 # dummy dataset for CI/CD. These files are generated on-the-fly # see tests/data/datasets/language_modeling/mock_general_lm.py train_data_info: [ { "file_name": ".corenet_data_cache/sample.jsonl", "text_key": "text", "file_id_range": [0, 1], }, { "file_name": ".corenet_data_cache/sample.json.gz", "text_key": "text", "file_id_range": [0, 1], }, ] text_tokenizer: name: "openai_clip" pad_token: "pad" loss: category: "language_modeling" language_modeling: name: "cross_entropy" cross_entropy: use_z_loss: true optim: name: "adamw" weight_decay: 0.1 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true max_iterations: 5 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 cosine: max_lr: 0.0024 min_lr: 0.00024 model: language_modeling: name: "general_gpt" general_gpt: model_name: "gpt-test" vocab_size: 49408 max_context_length: 10 stats: val: [ "loss"] train: ["loss"] checkpoint_metric: "loss.total_loss" checkpoint_metric_max: false ================================================ FILE: tests/engine/test_training_engine.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from pathlib import Path import pytest import torch from corenet.cli import main_train from corenet.train_eval_pipelines.default_train_eval import DefaultTrainEvalPipeline from tests.configs import get_config from tests.test_utils import unset_pretrained_models_from_opts @pytest.mark.parametrize( "config_file", [ "tests/engine/dummy_configs/imagenet_classification/mobilevit.yaml", "tests/engine/dummy_configs/imagenet_classification/mobilevit_v2.yaml", "tests/engine/dummy_configs/ade20k_segmentation/deeplabv3_mobilenetv2.yaml", "tests/engine/dummy_configs/coco_detection/resnet_ssd.yaml", "tests/engine/dummy_configs/coco_detection/resnet_mask_rcnn.yaml", "tests/engine/dummy_configs/image_text_clip/clip_vit.yaml", # add a configuration to test range augment "tests/engine/dummy_configs/imagenet_classification/efficientnet_b0.yaml", "tests/engine/dummy_configs/language_modeling_gpt/gpt.yaml", ], ) def test_training_engine(config_file: str, tmp_path: Path) -> None: opts = get_config(config_file=config_file) # Parallel tests causes issues when save_dir is accessed by multiple workers. # Therefore, we use a unique random path here and use that as a save location. save_dir = str(tmp_path) setattr(opts, "common.results_loc", save_dir) # Set device-related args that are not exposed to users n_gpus = torch.cuda.device_count() device = "cuda" if n_gpus > 0 else "cpu" setattr(opts, "dev.num_gpus", n_gpus) setattr(opts, "dev.device_id", None) setattr(opts, "dev.device", torch.device(device)) if n_gpus == 0: # Need to disable mixed_precision for testing on CPU only. setattr(opts, "common.mixed_precision", False) norm_name = getattr(opts, "model.normalization.name") if norm_name is not None and norm_name in ["sync_batch_norm", "sbn"]: # on CPUs, Sync BN won't work. setattr(opts, "model.normalization.name", "batch_norm") assert ( getattr(opts, "train_eval_pipeline.name") == "default" ), "This unit-test has does not support configs with custom TrainEvalPipelines yet." # removing pretrained models (if any) for now to reduce test time as well as access issues unset_pretrained_models_from_opts(opts) train_eval_pipeline = DefaultTrainEvalPipeline(opts) train_eval_pipeline.launcher(main_train.callback) assert Path(save_dir, "train/checkpoint_last.pt").exists() ================================================ FILE: tests/loss_fns/__init__.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. ================================================ FILE: tests/loss_fns/language_modeling/__init__.py ================================================ ================================================ FILE: tests/loss_fns/language_modeling/test_cross_entropy.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import pytest import torch from corenet.loss_fn.language_modeling.cross_entropy import CrossEntropyLM @pytest.mark.parametrize( "label_smoothing, ignore_index,vocab_size,z_loss", [ (0.0, -1, 5, False), (0.0, 3, 5, False), (0.0, -1, 5, True), (0.0, 2, 5, True), (0.1, 2, 5, True), ], ) def test_cross_entropy_lm_in_out( label_smoothing: float, ignore_index: int, vocab_size: int, z_loss: bool ) -> None: """Test for CrossEntropyLM loss function. ...note: This test checks if the input and output formats are correct or not. """ batch_size = 2 seq_length = 5 # build configuration parser = argparse.ArgumentParser() parser = CrossEntropyLM.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.language_modeling.cross_entropy.ignore_index", ignore_index) setattr( opts, "loss.language_modeling.cross_entropy.label_smoothing", label_smoothing ) setattr(opts, "loss.language_modeling.cross_entropy.use_z_loss", z_loss) criteria = CrossEntropyLM(opts) # Two prediction cases: # Case 1: Prediction is a tensor # Case 2: Prediction is a dictionary, with logits as a mandatory key pred_case_1 = torch.randn(size=(batch_size, seq_length, vocab_size)) pred_case_2 = {"logits": pred_case_1} target = torch.randint( low=0, high=vocab_size, size=( batch_size, seq_length, ), ) # randomly set indices in target tensor to ignore_index random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0 random_indices = random_indices.to(dtype=torch.int) target[random_indices == 0] = ignore_index # CE loss function for LM does not care about input samples, so setting input_samples to None input_samples = None for pred in [pred_case_1, pred_case_2]: loss = criteria(input_samples, pred, target) if isinstance(loss, torch.Tensor): assert loss.dim() == 0, "Loss value should be a scalar" elif isinstance(loss, dict): # when z-loss is enabled, we return output as a dict (pred can be dict or tensor). assert z_loss expected_loss_keys = {"total_loss", "ce_loss", "z_loss"} assert any(set(loss.keys()) & expected_loss_keys) for loss_key, loss_val in loss.items(): assert isinstance( loss_val, torch.Tensor ), f"Loss should be an instance of torch.Tensor. Got {type(loss_val)} for key {loss_key}." assert loss_val.dim() == 0, "Loss value should be a scalar." else: raise NotImplementedError("Loss should be either a dictionary or a tensor.") ================================================ FILE: tests/loss_fns/language_modeling/test_cross_entropy_for_kv_prediction.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import pytest import torch from corenet.loss_fn.language_modeling.cross_entropy_for_kv_prediction import ( CrossEntropyForKVPrediction, ) @pytest.mark.parametrize( "label_smoothing,ignore_index,vocab_size,z_loss,auxiliary_loss,kv_loss", [ (0.0, 3, 5, False, 1, 2), (0.1, 2, 5, True, 1, 1), ], ) def test_cross_entropy_lm_in_out( label_smoothing: float, ignore_index: int, vocab_size: int, z_loss: bool, auxiliary_loss: float, kv_loss: float, ) -> None: """Test for CrossEntropyLM loss function. ...note: This test checks if the input and output formats are correct or not. """ batch_size = 2 seq_length = 5 key_heads = 2 head_dim = 3 num_layers = 2 # build configuration parser = argparse.ArgumentParser() parser = CrossEntropyForKVPrediction.add_arguments(parser) opts = parser.parse_args([]) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.ignore_index", ignore_index, ) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.label_smoothing", label_smoothing, ) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.use_z_loss", z_loss, ) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.z_loss_eps", 0.01 ) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.auxiliary_loss", auxiliary_loss, ) setattr(opts, "loss.language_modeling.cross_entropy_for_kv_prediction.base_loss", 1) setattr( opts, "loss.language_modeling.cross_entropy_for_kv_prediction.kv_loss", kv_loss ) criteria = CrossEntropyForKVPrediction(opts) # Two prediction cases: # Case 1: Prediction is a tensor # Case 2: Prediction is a dictionary, with logits as a mandatory key x = torch.randn(size=(batch_size, seq_length, vocab_size)) model_outputs = { "logits": x, "auxiliary_logits": x, "past_keys": torch.randn( [num_layers, batch_size, key_heads, seq_length, head_dim] ), "past_values": torch.randn( [num_layers, batch_size, key_heads, seq_length, head_dim] ), "base_past_keys": torch.randn( [num_layers, batch_size, key_heads, seq_length, head_dim] ), "base_past_values": torch.randn( [num_layers, batch_size, key_heads, seq_length, head_dim] ), } target = torch.randint( low=0, high=vocab_size, size=( batch_size, seq_length, ), ) # randomly set indices in target tensor to ignore_index random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0 random_indices = random_indices.to(dtype=torch.int) target[random_indices == 0] = ignore_index # CE loss function for LM does not care about input samples, so setting input_samples to None input_samples = None for pred in [model_outputs]: loss = criteria(input_samples, pred, target) # when z-loss is enabled, we return output as a dict (pred can be dict or tensor). required_keys = { "auxiliary_loss", "base_loss", "k_loss/0", "k_loss/1", "k_loss/average", "k_loss/total", "total_loss", "v_loss/0", "v_loss/1", "v_loss/average", "v_loss/total", } if z_loss: required_keys.update({"z_loss_auxiliary", "z_loss_base"}) assert set(loss.keys()) == (required_keys) for loss_key, loss_val in loss.items(): assert isinstance( loss_val, torch.Tensor ), f"Loss should be an instance of torch.Tensor. Got {type(loss_val)} for key {loss_key}." assert loss_val.dim() == 0, "Loss value should be a scalar." ================================================ FILE: tests/loss_fns/test_class_weighting.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import torch from corenet.loss_fn.utils.class_weighting import compute_class_weights def test_class_weighting(): # test for checking the class weighting method targets = torch.tensor([1, 1, 1, 2, 2, 3], dtype=torch.long) n_classes = 4 norm_val = 1.0 weights = compute_class_weights( target=targets, n_classes=n_classes, norm_val=norm_val ) weights = torch.round(weights, decimals=2) expected_weights = torch.tensor([0.0, 2.47, 3.48, 6.49]) torch.testing.assert_allclose(actual=weights, expected=expected_weights) ================================================ FILE: tests/loss_fns/test_classification_loss.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse from typing import Mapping import pytest import torch from corenet.loss_fn.classification.binary_cross_entropy import BinaryCrossEntropy from corenet.loss_fn.classification.cross_entropy import CrossEntropy @pytest.mark.parametrize( "batch_size, label_smoothing, ignore_index, class_weights, num_classes", [ (1, 0, -1, True, 2), (2, 0.1, 255, False, 5), ], ) def test_cross_entropy_in_out( batch_size: int, label_smoothing: float, ignore_index: int, class_weights: bool, num_classes: int, ) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = CrossEntropy.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.classification.cross_entropy.label_smoothing", label_smoothing) setattr(opts, "loss.classification.cross_entropy.ignore_index", ignore_index) setattr(opts, "loss.classification.cross_entropy.class_weights", class_weights) criteria = CrossEntropy(opts) # Two prediction cases: # Case 1: Prediction is a tensor # Case 2: Prediction is a dictionary, with logits as a mandatory key pred_case_1 = torch.randn(size=(batch_size, num_classes)) pred_case_2 = {"logits": torch.randn(size=(batch_size, num_classes))} target = torch.randint(low=0, high=num_classes, size=(batch_size,)) # this loss function does not care about it, so we can have any input input_sample = torch.randint(low=0, high=1, size=(1,)) for pred in [pred_case_1, pred_case_2]: loss = criteria(input_sample, pred, target) assert isinstance( loss, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss.dim() == 0, "Loss value should be a scalar" @pytest.mark.parametrize( "batch_size, reduction", [ (1, "sum"), (2, "mean"), (1, "none"), (2, "batch_mean"), ], ) def test_binary_cross_entropy_in_out(batch_size: int, reduction: str) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = BinaryCrossEntropy.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.classification.binary_cross_entropy.reduction", reduction) criteria = BinaryCrossEntropy(opts) n_classes = 10 # Two prediction cases: # Case 1: Prediction is a tensor # Case 2: Prediction is a dictionary, with logits as a mandatory key pred_case_1 = torch.randn(size=(batch_size, n_classes)) pred_case_2 = {"logits": torch.randn(size=(batch_size, n_classes))} # two target cases: # Case 1: Target is a tensor containing soft-labels or probabilities # Case 2: Target is a tensor containing hard labels. target_case_1 = torch.randn(size=(batch_size, n_classes)) target_case_2 = torch.randint(low=0, high=n_classes, size=(batch_size,)) # this loss function does not care about it, so we can have any input input_sample = torch.randint(low=0, high=1, size=(1,)) for pred in [pred_case_1, pred_case_2]: for target in [target_case_1, target_case_2]: loss = criteria(input_sample, pred, target) if isinstance(pred, Mapping): pred = pred["logits"] assert isinstance( loss, torch.Tensor ), "Loss should be an instance of torch.Tensor" if reduction in ["mean", "batch_mean", "sum"]: assert loss.dim() == 0, "Loss value should be a scalar" elif reduction == "none": assert ( loss.dim() == pred.dim() ), "Loss value should have the same shape as prediction" ================================================ FILE: tests/loss_fns/test_composite_loss.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import sys sys.path.append("../..") from corenet.loss_fn.composite_loss import CompositeLoss def test_composite_loss() -> None: # This function tests the composite loss function # We create a list of three loss functions and then check the composition # of one, two, and all loss functions composite_losses = [ { "loss_category": "classification", "loss_weight": 1.0, "classification": { "name": "cross_entropy", "cross_entropy": { "label_smoothing": 0.1, "ignore_index": -1, "class_weights": False, }, }, }, { "loss_category": "neural_augmentation", "loss_weight": 1.0, "neural_augmentation": { "perceptual_metric": "psnr", "target_value": [40, 20], "curriculum_method": "cosine", "alpha": 1.0, }, }, { "loss_category": "segmentation", "loss_weight": 1.0, "segmentation": { "name": "cross_entropy", "cross_entropy": { "label_smoothing": 0.1, "ignore_index": -1, "class_weights": False, "aux_weight": 0.0, }, }, }, ] for i in range(1, 4): # test for 1, 2, and 3 loss functions parser = argparse.ArgumentParser() opts = parser.parse_args([]) setattr(opts, "loss.category", "composite_loss") setattr(opts, "scheduler.max_epochs", 100) setattr(opts, "loss.composite_loss", copy.deepcopy(composite_losses[:i])) compsite_loss_fn = CompositeLoss(opts) assert len(compsite_loss_fn.loss_fns) == i assert len(compsite_loss_fn.loss_weights) == i ================================================ FILE: tests/loss_fns/test_contrastive_loss.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import pytest import torch from corenet.loss_fn.multi_modal_img_text.contrastive_loss_clip import ( ContrastiveLossClip, ) @pytest.mark.parametrize("batch_size", [1, 2]) @pytest.mark.parametrize("projection_dim", [256, 512]) def test_contrastive_loss_in_out(batch_size: int, projection_dim: int) -> None: # These tests check the input and output formats are correct or not. parser = argparse.ArgumentParser() parser = ContrastiveLossClip.add_arguments(parser) opts = parser.parse_args([]) criteria = ContrastiveLossClip(opts) image_features = torch.randn(size=(batch_size, projection_dim)) text_features = torch.randn(size=(batch_size, projection_dim)) input_sample = None targets = None prediction = {"image": image_features, "text": text_features} loss_output = criteria(input_sample, prediction, targets) expected_output_keys = {"total_loss", "image_loss", "text_loss", "logit_scale"} assert expected_output_keys.issubset(loss_output.keys()) for loss_name, loss_val in loss_output.items(): if loss_name == "logit_scale" and isinstance(loss_val, (float, int)): loss_val = torch.tensor(loss_val) assert isinstance( loss_val, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss_val.dim() == 0, "Loss value should be a scalar" ================================================ FILE: tests/loss_fns/test_detection_loss.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import random import pytest import torch from corenet.loss_fn.detection.mask_rcnn_loss import MaskRCNNLoss from corenet.loss_fn.detection.ssd_multibox_loss import SSDLoss @pytest.mark.parametrize( "batch_size, neg_pos_ratio, label_smooth", [ (1, 1, 0), (2, 3, 0.1), ], ) def test_ssd_loss_in_out( batch_size: int, neg_pos_ratio: int, label_smooth: int ) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = SSDLoss.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.detection.ssd_multibox_loss.neg_pos_ratio", neg_pos_ratio) setattr(opts, "loss.detection.ssd_multibox_loss.label_smoothing", label_smooth) criteria = SSDLoss(opts) num_anchors = 20 num_classes = 2 # prediction is a dictionary with scores and boxes as a key predictions = { "scores": torch.rand(size=(batch_size, num_anchors, num_classes)), "boxes": torch.rand(size=(batch_size, num_anchors, 4)), } # target is a dictionary with box_labels and box_coordinates as a key targets = { "box_labels": torch.randint( low=0, high=num_classes, size=(batch_size, num_anchors) ), "box_coordinates": torch.rand(size=(batch_size, num_anchors, 4)), } # this loss function does not care about it, so we can have any input input_sample = torch.randint(low=0, high=1, size=(1,)) loss = criteria(input_sample, predictions, targets) assert {"total_loss", "reg_loss", "cls_loss"}.issubset(loss.keys()) for loss_name, loss_val in loss.items(): assert isinstance( loss_val, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss_val.dim() == 0, "Loss value should be a scalar" @pytest.mark.parametrize( "batch_size, classifier_weight, box_reg_weight, mask_weight, objectness_weight, rpn_box_reg", [ (1, 0, 0, 0, 0, 0), (2, 0, 0.5, 1, 0, 0.5), (2, 1, 0.5, 0, 1, 0.5), ], ) def test_maskrcnn_loss_in_out( batch_size: int, classifier_weight: float, box_reg_weight: float, mask_weight: float, objectness_weight: float, rpn_box_reg: float, ) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = MaskRCNNLoss.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.detection.mask_rcnn_loss.classifier_weight", classifier_weight) setattr(opts, "loss.detection.mask_rcnn_loss.box_reg_weight", box_reg_weight) setattr(opts, "loss.detection.mask_rcnn_loss.mask_weight", mask_weight) setattr(opts, "loss.detection.mask_rcnn_loss.objectness_weight", objectness_weight) setattr(opts, "loss.detection.mask_rcnn_loss.rpn_box_reg", rpn_box_reg) criteria = MaskRCNNLoss(opts) prediction_losses = {} for loss_key in [ "loss_classifier", "loss_box_reg", "loss_mask", "loss_objectness", "loss_rpn_box_reg", ]: prediction_losses.update({loss_key: torch.tensor(random.random())}) # this loss function does not care about it, so we can have any input input_sample = torch.randint(low=0, high=1, size=(1,)) loss = criteria(input_sample, prediction_losses) assert { "loss_classifier", "loss_box_reg", "loss_mask", "loss_objectness", "loss_rpn_box_reg", "total_loss", }.issubset(loss.keys()) for loss_name, loss_val in loss.items(): assert isinstance( loss_val, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss_val.dim() == 0, "Loss value should be a scalar" ================================================ FILE: tests/loss_fns/test_focal_loss.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import List, Optional import torch from torch.nn import functional as F from corenet.loss_fn.classification.focal_loss import FocalLoss from tests.configs import get_config def get_opts(gamma: float, weights: Optional[List[float]] = None) -> argparse.Namespace: opts = get_config() setattr( opts, "loss.classification.focal_loss.gamma", gamma, ) setattr( opts, "loss.classification.focal_loss.weights", weights, ) return opts def test_focal_loss_onehot_vs_probabilities() -> None: opts = get_opts(gamma=2) loss = FocalLoss(opts) N, num_classes = 128, 4 logits = torch.randn([N, num_classes]) targets = torch.randint(num_classes, (N,)) observed_loss = loss(None, logits, targets) # Now, pass one-hot labels, and make sure they're the same. observed_loss_2 = loss(None, logits, F.one_hot(targets, num_classes)) assert abs(observed_loss - observed_loss_2) / observed_loss < 1e-3 def test_focal_loss_tiny_gamma() -> None: for gamma in [0, 1e-3]: opts = get_opts(gamma=gamma) loss = FocalLoss(opts) N, num_classes = 128, 4 logits = torch.randn([N, num_classes]) targets = torch.randint(num_classes, (N,)) observed_loss = loss(None, logits, targets) ce_loss = F.cross_entropy(logits, targets) assert abs(observed_loss - ce_loss) / ce_loss < 1e-3 def test_focal_loss_gamma() -> None: opts = get_opts(gamma=5) loss = FocalLoss(opts) N, num_classes = 128, 4 logits = torch.randn([N, num_classes]) targets = torch.randint(num_classes, (N,)) observed_loss = loss(None, logits, targets) ce_loss = F.cross_entropy(logits, targets) assert abs(observed_loss - ce_loss) / ce_loss > 1e-3 def test_focal_loss_weights() -> None: opts = get_opts(gamma=1, weights=[1, 0, 0, 0]) loss = FocalLoss(opts) N, num_classes = 128, 4 logits = torch.randn([N, num_classes]) targets = torch.randint(num_classes, (N,)) observed_loss = loss(None, logits, targets) ce_loss = F.cross_entropy(logits, targets) assert observed_loss < ce_loss ================================================ FILE: tests/loss_fns/test_neural_aug.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import pytest import torch from corenet.loss_fn.neural_augmentation import NeuralAugmentation @pytest.mark.parametrize("batch_size", [1, 2]) def test_neural_aug_loss_in_out(batch_size: int) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = NeuralAugmentation.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "scheduler.max_epochs", 20) # build loss function neural_aug_loss_fn = NeuralAugmentation(opts) pred_tensor = { "augmented_tensor": torch.zeros( size=(batch_size, 3, 224, 224), dtype=torch.float ) } # Three input cases: # Case 1: Input image is a tensor # Case 2: Input is a dictionary, with image as a mandatory key and value as a batch of input image tensor # Case 3: Input is a dictionary, with image as a mandatory key and value as a list of input image tensor input_case_1 = torch.randint(low=0, high=1, size=(batch_size, 3, 224, 224)) input_case_2 = { "image": torch.randint(low=0, high=1, size=(batch_size, 3, 224, 224)) } input_case_3 = { "image": [torch.randint(low=0, high=1, size=(1, 3, 224, 224))] * batch_size } for inp in [input_case_1, input_case_2, input_case_3]: loss = neural_aug_loss_fn(inp, pred_tensor) assert isinstance( loss, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss.dim() == 0, "Loss value should be a scalar" ================================================ FILE: tests/loss_fns/test_neural_aug_compatibility.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import re import sys from pathlib import Path sys.path.append("..") from tests.configs import get_config from tests.modeling.test_model import exclude_yaml_from_test def test_neural_aug_backward_compatibility(config_file: str): opts = get_config(config_file=config_file) opts_dict = vars(opts) for k, v in opts_dict.items(): if isinstance(v, str) and re.search(".*_with_na$", v): raise DeprecationWarning( "We deprecated the usage of _with_na loss functions. " "Please see projects/range_augment for examples." ) def pytest_generate_tests(metafunc): configs = [ str(x) for x in Path("config").rglob("**/*.yaml") if not exclude_yaml_from_test(x) ] configs += [ str(x) for x in Path("projects").rglob("**/*.yaml") if not exclude_yaml_from_test(x) ] metafunc.parametrize("config_file", configs) ================================================ FILE: tests/loss_fns/test_segmentation_loss.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. import argparse import pytest import torch from corenet.loss_fn.segmentation.cross_entropy import SegCrossEntropy @pytest.mark.parametrize( "batch_size, label_smoothing, ignore_index, class_weights, num_classes, aux_weight", [ (1, 0, -1, True, 2, 0), (2, 0.1, 255, False, 5, 0.4), ], ) def test_seg_cross_entropy_in_out( batch_size: int, label_smoothing: float, ignore_index: int, class_weights: bool, num_classes: int, aux_weight: float, ) -> None: # These tests check the input and output formats are correct or not. # build configuration parser = argparse.ArgumentParser() parser = SegCrossEntropy.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "loss.segmentation.cross_entropy.label_smoothing", label_smoothing) setattr(opts, "loss.segmentation.cross_entropy.ignore_index", ignore_index) setattr(opts, "loss.segmentation.cross_entropy.class_weights", class_weights) setattr(opts, "loss.segmentation.cross_entropy.aux_weight", aux_weight) criteria = SegCrossEntropy(opts) height = 10 width = 10 # Four prediction cases: # Case 1: Prediction is a tensor # Case 2: Prediction is a dictionary, with segmentation_output as a mandatory key # Case 3: Prediction is a Tuple[tensor, tensor] # Case 4: Prediction is a dictionary, with segmentation_output as a mandatory key and is a Tuple[Tensor, Tensor] pred_case_1 = torch.randn(size=(batch_size, num_classes, height, width)) pred_case_2 = {"segmentation_output": pred_case_1} pred_case_3 = ( torch.randn(size=(batch_size, num_classes, height, width)), torch.randn(size=(batch_size, num_classes, height, width)), ) pred_case_4 = {"segmentation_output": pred_case_3} target = torch.randint(low=0, high=num_classes, size=(batch_size, height, width)) # randomly set indices in target tensor to ignore_index random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0 random_indices = random_indices.to(dtype=torch.int) target[random_indices == 0] = ignore_index # this loss function does not care about it, so we can have any input input_sample = torch.randint(low=0, high=1, size=(1,)) for pred in [pred_case_1, pred_case_2, pred_case_3, pred_case_4]: loss = criteria(input_sample, pred, target) assert isinstance(loss, dict), "loss should be an instance of dict" assert "total_loss" in loss, "total_loss is a mandatory key in loss" if len(loss) == 3: # when we compute aux loss, in that case, seg_loss and aux_loss are also returned assert {"total_loss", "seg_loss", "aux_loss"}.issubset(loss.keys()) for loss_key, loss_val in loss.items(): assert isinstance( loss_val, torch.Tensor ), "Loss should be an instance of torch.Tensor" assert loss_val.dim() == 0, "Loss value should be a scalar" ================================================ FILE: tests/metrics/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/metrics/base.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Tuple import pytest import torch def sample_classification_outputs() -> Tuple[torch.Tensor, torch.Tensor]: predictions = torch.tensor( [ [0.02, 0.01, 0.91, 0.04, 0.01, 0.01, 0], [0.81, 0.03, 0.16, 0, 0, 0, 0], [0.4, 0.51, 0.05, 0.04, 0, 0, 0], ], dtype=torch.float, ) predictions = (predictions + 1e-6).log() targets = torch.tensor([3, 2, 1], dtype=torch.long) return predictions, targets @pytest.fixture( params=[ {}, {"pred": "pred_key"}, {"target": "target_key"}, {"pred": "pred_key", "target": "target_key"}, {"target": "target_key", "pred": "pred_key"}, ] ) def transform_args(request): """ Allows for testing all metrics with (pred=key1,target=key2) registry format. Tests the following combinations: (pred=pred_key) (target=target_key) (pred=pred_key, target=target_key) (target=target_key, pred=pred_key) """ param_keys = request.param def encapsulate_with_keys(metric_names, predictions, targets, extras=None): if isinstance(metric_names, str): metric_names = [metric_names] pred_key = param_keys.get("pred", None) if pred_key: predictions = {pred_key: predictions} target_key = param_keys.get("target", None) if target_key: targets = {target_key: targets} # e.g. assuming param_keys = {"pred": "pred_key", "target": "target_key"} we will get: # {"pred": "pred_key", "target": "target_key"} -> ["pred=pred_key", "target=target_key"] # ["pred=pred_key", "target=target_key"] -> "(pred=pred_key,target=target_key)" params_str = ", ".join([f"{key}={value}" for key, value in param_keys.items()]) if params_str: params_str = f"({params_str})" metric_names = [m + params_str for m in metric_names] return metric_names, (predictions, targets, extras) return encapsulate_with_keys ================================================ FILE: tests/metrics/test_coco_map.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import json import os from typing import Dict, List, Tuple import numpy as np import torch from pycocotools import mask as maskUtils from corenet.metrics import coco_map from corenet.metrics.stats import Statistics from corenet.modeling.models.detection import DetectionPredTuple def test_coco_map(): predictions = { "detections": [ DetectionPredTuple( labels=torch.empty(0, dtype=torch.long), scores=torch.empty(0, dtype=torch.float32), boxes=torch.empty(0, 4, dtype=torch.float32), ) ] * 3 } targets = [ {"image_id": 0, "image_width": 128, "image_height": 128}, {"image_id": 1, "image_width": 256, "image_height": 256}, {"image_id": 2, "image_width": 160, "image_height": 192}, ] coco_annotations_path = os.path.join(os.path.dirname(__file__), "../data", "coco") opts = argparse.Namespace(**{"dataset.root_val": coco_annotations_path}) stats = Statistics(opts=opts, metric_names=["coco_map"]) stats.update(predictions, targets) bbox_map = stats.avg_statistics("coco_map", "bbox") np.testing.assert_equal(0.0, bbox_map) def get_prediction_from_annotation( annotations: Dict, annotation_idx: int, category_mapping: Dict[int, int] ) -> Tuple[int, torch.Tensor, torch.Tensor]: annotation = annotations["annotations"][annotation_idx] image_id = annotation["image_id"] image = [im for im in annotations["images"] if im["id"] == image_id] assert len(image) == 1, f"Too many images with a single id." image = image[0] h, w = image["height"], image["width"] boxes = annotation["bbox"] # Boxes are in (x1, y1, w, h) format. Convert to (x1, y1, x2, y2) format. boxes[0] /= w boxes[1] /= h boxes[2] /= w boxes[3] /= h boxes[2] += boxes[0] boxes[3] += boxes[1] masks = annotation["segmentation"] rles = maskUtils.frPyObjects(masks, h, w) rle = maskUtils.merge(rles) binary_mask = maskUtils.decode(rle) label = category_mapping[annotation["category_id"]] return label, boxes, binary_mask def get_detection_pred_tuple_from_annotations( annotations: Dict, annotation_ids: List[int], category_mapping: Dict[int, int] ) -> DetectionPredTuple: labels = [] scores = [] boxes = [] masks = [] for annotation_id in annotation_ids: label, box, binary_mask = get_prediction_from_annotation( annotations, annotation_id, category_mapping ) labels.append(label) scores.append(1.0) boxes.append(box) masks.append(binary_mask) labels = torch.tensor(labels, dtype=torch.int64) scores = torch.tensor(scores) boxes = torch.tensor(boxes) masks = torch.tensor(masks).float() return DetectionPredTuple(labels, scores, boxes, masks) def test_map() -> None: opts = argparse.Namespace() setattr(opts, "stats.coco_map.iou_types", ["bbox", "segm"]) setattr(opts, "dataset.root_val", "tests/data/coco") evaluator = coco_map.COCOEvaluator(opts) # Read annotations from the annotations file. annotations_file = "tests/data/coco/annotations/instances_val2017.json" with open(annotations_file) as f: annotations = json.load(f) predictions = { "detections": [ get_detection_pred_tuple_from_annotations( annotations, [0], evaluator.coco_id_to_contiguous_id ), get_detection_pred_tuple_from_annotations( annotations, [1], evaluator.coco_id_to_contiguous_id ), ] } # These targets correspond to the first two annotations in our .json file. targets = [ { "image_id": torch.tensor(37777), "image_width": torch.tensor(352), "image_height": torch.tensor(230), }, { "image_id": torch.tensor(397133), "image_width": torch.tensor(640), "image_height": torch.tensor(427), }, ] evaluator.update(predictions, targets) results = evaluator.summarize_coco_results() assert results == {"bbox": 99.99999999999997, "segm": 99.99999999999997} ================================================ FILE: tests/metrics/test_image_text_retrieval_metrics.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest import torch from corenet.metrics.stats import Statistics from tests.configs import default_training_opts @pytest.mark.parametrize( "batch_size, num_captions, hidden_dim, text_dim", [ (1, 1, 8, 2), (2, 5, 4, 3), ], ) def test_image_text_retrieval( batch_size: int, num_captions: int, hidden_dim: int, text_dim: int ) -> None: stats = Statistics( opts=default_training_opts(), metric_names=["image_text_retrieval"] ) for _ in range(3): image_emb = torch.randn(batch_size, hidden_dim) text_emb = torch.randn(batch_size, num_captions, hidden_dim) if text_dim == 2: text_emb = text_emb.reshape(-1, hidden_dim) stats.update({"image": image_emb, "text": text_emb}, {}, {}) metrics = stats._compute_avg_statistics_all() img_text_metrics = metrics["image_text_retrieval"] parent_keys = ["text2image", "image2text"] child_keys = ["recall@1", "recall@5", "recall@10", "mean_rank", "median_rank"] for parent_key in parent_keys: assert parent_key in img_text_metrics for child_key in child_keys: assert child_key in img_text_metrics[parent_key] ================================================ FILE: tests/metrics/test_iou.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Callable import numpy as np import torch from corenet.metrics.stats import Statistics from tests.metrics.base import transform_args def test_gather_iou_metrics(transform_args: Callable): # [Batch, num_classes, height, width] # in this example, [1, 2, 2, 3] prediction = torch.tensor( [ [ [[0.2, 0.8, 0.2], [0.9, 0.2, 0.1]], [[0.8, 0.2, 0.8], [0.1, 0.8, 0.9]], # spatial dms ] # classes ] # batch ) target = torch.tensor([[[0, 0, 0], [0, 1, 1]]]) metric_names, stats_args = transform_args(["iou"], prediction, target) expected_inter = np.array([2.0, 2.0]) expected_union = np.array([4.0, 4.0]) expected_iou = np.mean(expected_inter / expected_union) * 100 stats = Statistics(opts=None, metric_names=metric_names) stats.update(*stats_args) np.testing.assert_equal( actual=stats.avg_statistics(metric_names[0]), desired=expected_iou ) ================================================ FILE: tests/metrics/test_misc.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import numpy as np import torch from corenet.metrics.stats import Statistics def test_gather_loss(): # loss could be a Tensor or Dictionary loss = torch.tensor([3.2], dtype=torch.float) stats = Statistics(opts=None, metric_names=["loss"]) stats.update({}, {}, {"loss": loss}) np.testing.assert_almost_equal(stats.avg_statistics("loss"), 3.2) loss_dict = { "aux_loss": torch.tensor([4.2]), "total_loss": torch.tensor( [5.2] ), # total loss key is mandatory for a loss in dict format } stats = Statistics(opts=None, metric_names=["loss"]) stats.update({}, {}, {"loss": loss_dict}) np.testing.assert_almost_equal( stats.avg_statistics("loss", "aux_loss"), 4.2, decimal=2 ) np.testing.assert_almost_equal( stats.avg_statistics("loss", "total_loss"), 5.2, decimal=2 ) # Empty extras stats = Statistics(opts=None, metric_names=["loss"]) stats.update({}, {}, {}) stats.update({}, {}, {"loss": None}) metric = stats.avg_statistics("loss") np.testing.assert_almost_equal(metric, 0) def test_gather_grad_norm(): # Grad norm could be a Tensor or Dictionary grad_norm = torch.tensor([3.2], dtype=torch.float) stats = Statistics(opts=None, metric_names=["grad_norm"]) stats.update({}, {}, {"grad_norm": grad_norm}) np.testing.assert_almost_equal(stats.avg_statistics("grad_norm"), 3.2) grad_norm_dict = { "dummy_norm_a": torch.tensor([4.2]), "dummy_norm_b": torch.tensor([5.2]), } stats = Statistics(opts=None, metric_names=["grad_norm"]) stats.update({}, {}, {"grad_norm": grad_norm_dict}) _ = stats.avg_statistics("grad_norm") np.testing.assert_almost_equal( stats.avg_statistics("grad_norm", "dummy_norm_a"), 4.2, decimal=2 ) np.testing.assert_almost_equal( stats.avg_statistics("grad_norm", "dummy_norm_b"), 5.2, decimal=2 ) # Empty extras stats = Statistics(opts=None, metric_names=["grad_norm"]) stats.update({}, {}, {}) stats.update({}, {}, {"grad_norm": None}) metric = stats.avg_statistics("grad_norm") np.testing.assert_almost_equal(metric, 0) ================================================ FILE: tests/metrics/test_multiclass_classification_pr.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import warnings from typing import Optional, Set import pytest import torch from torch import Tensor from corenet.metrics import multiclass_classification_pr def get_expected_keys(include_curve: bool) -> Set[str]: expected_keys = { "micro", "macro", "weighted", "AP", "ODS-F1", "Recall@P=50", } if include_curve: expected_keys |= { "precisions", "recalls", "thresholds", } return expected_keys @pytest.mark.parametrize( "pred,target,include_curve,suppress_warnings", [ ("pred", "target", False, False), ("pred", "target", False, True), ("pred", None, True, False), (None, "target", False, False), (None, None, True, False), ], ) def test_metric( pred: Optional[str], target: Optional[str], include_curve: bool, suppress_warnings: bool, ) -> None: opts = argparse.Namespace() setattr( opts, "stats.metrics.multiclass_classification_pr.include_curve", include_curve ) setattr( opts, "stats.metrics.multiclass_classification_pr.include_classwise_ap", False ) setattr( opts, "stats.metrics.multiclass_classification_pr.suppress_warnings", suppress_warnings, ) metric = multiclass_classification_pr.MulticlassClassificationPR( opts, pred=pred, target=target ) num_batches = 2 batch_size = 6 num_classes = 3 for i in range(num_batches): predictions = torch.randn([batch_size, num_classes]).softmax(dim=-1) # @targets can be [batch_size, ...] or [batch_size, num_classes, ...]. # Test both. if i % 2 == 0: # Class label targets. targets = torch.randint(0, num_classes, [batch_size]) else: # Binary targets. targets = torch.randint(0, 1, [batch_size, num_classes]) if pred is not None: predictions = {pred: predictions} if target is not None: targets = {target: targets} metric.update(predictions, targets) results = metric.compute() expected_keys = get_expected_keys(include_curve) assert set(results.keys()) == expected_keys for key in ["micro", "macro", "weighted"]: assert 0 <= results[key] <= 1 if include_curve: for class_idx in range(num_classes): # Recalls and thresholds should be sorted. assert results["recalls"][class_idx] == list( reversed(sorted(results["recalls"][class_idx])) ), f"Recalls aren't sorted for class {class_idx} of {num_classes}." assert results["thresholds"][class_idx] == sorted( results["thresholds"][class_idx] ), f"Thresholds aren't sorted for class {class_idx} of {num_classes}." # All values should be in [0, 1]. for key in ["precisions", "recalls", "thresholds"]: assert all( 0 <= elem <= 1 for elem in results[key][class_idx] ), f"Not all precisions/recalls/thresholds are in [0, 1] for class {class_idx} of {num_classes}." @pytest.mark.parametrize( "include_curve,suppress_warnings", [(False, False), (True, False), (True, True)] ) def test_flatten_metric(include_curve: bool, suppress_warnings: bool) -> None: opts = argparse.Namespace() setattr( opts, "stats.metrics.multiclass_classification_pr.include_curve", include_curve ) setattr( opts, "stats.metrics.multiclass_classification_pr.include_classwise_ap", False ) setattr( opts, "stats.metrics.multiclass_classification_pr.suppress_warnings", suppress_warnings, ) metric = multiclass_classification_pr.MulticlassClassificationPR(opts) num_batches = 2 batch_size = 6 num_classes = 3 for i in range(num_batches): predictions = torch.randn([batch_size, num_classes]).softmax(dim=-1) targets = torch.randint(0, num_classes, [batch_size]) metric.update(predictions, targets) results = metric.compute() my_name = "my_name" flattened_results = metric.flatten_metric(results, my_name) expected_keys = get_expected_keys(include_curve) assert set(flattened_results.keys()) == set(f"{my_name}/{k}" for k in expected_keys) ================================================ FILE: tests/metrics/test_probability_histogram.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Callable import numpy as np from corenet.metrics.stats import Statistics from tests.configs import default_training_opts from tests.metrics.base import sample_classification_outputs, transform_args def test_probability_histogram(transform_args: Callable): metric_names, stats_args = transform_args( ["prob_hist"], *sample_classification_outputs() ) stats = Statistics(opts=default_training_opts(), metric_names=metric_names) stats.update(*stats_args) # max values -> 0.91, 0.81, 0.51 max_conf_hist = stats.avg_statistics(metric_names[0], "max") np.testing.assert_almost_equal( max_conf_hist, [0, 0, 0, 0, 0, 0.33, 0, 0, 0.33, 0.33], decimal=2, ) # target values -> 0.05, 0.16, 0.51 target_conf_hist = stats.avg_statistics(metric_names[0], "target") np.testing.assert_almost_equal( target_conf_hist, [0.33, 0.33, 0, 0, 0, 0.33, 0, 0, 0, 0], decimal=2, ) ================================================ FILE: tests/metrics/test_psnr.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math from typing import Callable import numpy as np import torch from corenet.metrics.stats import Statistics from tests.metrics.base import transform_args def test_gather_psnr_metrics(transform_args: Callable): # Test for case 1 inp_tensor = torch.randn((3, 2), dtype=torch.float) target_tensor = inp_tensor # Ideally, the PSNR should be infinite when input and target are the same, because error between # signal and noise is 0. However, we add a small eps value (error of 1e-10) in the computation # for numerical stability. Therefore, PSNR will not be infinite. expected_psnr = 10.0 * math.log10(255.0**2 / 1e-10) metric_names, stats_args = transform_args(["psnr"], inp_tensor, target_tensor) stats = Statistics(opts=None, metric_names=metric_names) stats.update(*stats_args) np.testing.assert_almost_equal( stats.avg_statistics(metric_names[0]), expected_psnr, decimal=2 ) ================================================ FILE: tests/metrics/test_retrieval_cmc_metrics.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import numpy as np import pytest import torch from corenet.metrics.retrieval_cmc import ( RetrievalCMC, cmc_calculation, cosine_distance_matrix, l2_distance_matrix, mean_ap, ) def test_cosine_distance_matrix() -> None: # Sanity checks using random matrices n = 10 m = 15 d = 8 x = torch.randn(n, d) y = torch.randn(m, d) dist_matrix = cosine_distance_matrix(x, y).numpy() assert dist_matrix.shape[0] == n assert dist_matrix.shape[1] == m assert np.all(0 <= dist_matrix) assert np.all(dist_matrix <= 2) # Numerical value check x = torch.tensor([[1.0, 2.0, 3.0], [-1.0, -2.0, -3.0]]) y = torch.tensor([[0.1, 0.2, 0.3], [0.0, 0.0, 0.0]]) dist_matrix = cosine_distance_matrix(x, y).numpy() assert dist_matrix.shape[0] == 2 assert dist_matrix.shape[1] == 2 expected_similarity_dist = np.array([[0.0, 1.0], [2.0, 1.0]]) np.testing.assert_almost_equal(dist_matrix, expected_similarity_dist) def test_l2_distance_matrix() -> None: # Sanity checks using random matrices n = 3 m = 7 d = 4 x = torch.randn(n, d) y = torch.randn(m, d) dist_matrix = l2_distance_matrix(x, y).numpy() assert dist_matrix.shape[0] == n assert dist_matrix.shape[1] == m assert np.all(0 <= dist_matrix) # Numerical value check x = torch.tensor( [ [ 3.0, 4.0, 0.0, ] ] ) y = torch.tensor([[3.0, 0.0, 0.0], [0.0, 0.0, 0.0]]) dist_matrix = l2_distance_matrix(x, y).numpy() assert dist_matrix.shape[0] == 1 assert dist_matrix.shape[1] == 2 expected_similarity_dist = np.array([[4.0, 5.0]]) np.testing.assert_almost_equal(dist_matrix, expected_similarity_dist) def test_cmc_calculation() -> None: # Make sure input arrays are not modified distance_matrix = torch.zeros(10, 10) query_ids = torch.randint(0, 5, (10,)) _, _ = cmc_calculation(distance_matrix, query_ids, 5) np.testing.assert_equal(distance_matrix.numpy(), 0) # Perfect match case distance_matrix = torch.tensor( [ [0.0, 1.0, 0.5, 2.0], # id = 100 [1.0, 0.0, 2.0, 0.3], # id = 101 [0.5, 2.0, 0.0, 3.0], # id = 100 [2.0, 0.3, 3.0, 0.0], # id = 101 ] ) query_ids = torch.tensor([100, 101, 100, 101]) top1, top3 = cmc_calculation(distance_matrix, query_ids, 3) assert top1 == top3 == pytest.approx(1.0, 0.001) # Another case distance_matrix = torch.tensor( [ [0.0, 1.0, 0.5, 1.75], # id = 100 [1.0, 0.0, 1.5, 0.75], # id = 100 [0.5, 1.5, 0.0, 2.75], # id = 100 [1.75, 0.75, 2.75, 0.0], # id = 101 ] ) query_ids = torch.tensor([100, 100, 100, 101]) top1, top2 = cmc_calculation(distance_matrix, query_ids, 2) assert top1 == pytest.approx(0.5, 0.001) assert top2 == pytest.approx(0.75, 0.001) def test_mean_ap() -> None: # Numerical test distance_matrix = torch.tensor( [ [0.0, 1.0, 0.5, 1.75], # id = 100, PRs = [(1/1,1/2), (2/2, 2/2)], ap = 1.0 [ 1.0, 0.0, 1.5, 0.75, ], # id = 100, PRs = [(0/1,0/2), (1/2, 1/2), (2/3, 2/2)], ap = 1/3+1/4 = 7/12 [0.5, 1.5, 0.0, 2.75], # id = 100, PRs = [(1/1,1/2), (2/2, 2/2)], ap = 1.0 [ 1.75, 0.75, 2.75, 0.0, ], # id = 101, This query does not have any match -> excluded from mAP calculation. ] ) query_ids = torch.tensor([100, 100, 100, 101]) meanap = mean_ap(distance_matrix, query_ids) np.testing.assert_almost_equal(meanap, (1.0 + 7.0 / 12.0 + 1.0) / 3.0) def test_retrieval_cmc() -> None: opts = argparse.Namespace() setattr(opts, "stats.metrics.retrieval_cmc.distance_metric", "l2") setattr(opts, "stats.metrics.retrieval_cmc.subset_fraction", 1.0) setattr(opts, "stats.metrics.retrieval_cmc.k", 2) cmc_eval = RetrievalCMC( # device=torch.device("cpu"), opts=opts, is_distributed=False, compute_map=True, ) embeddings = torch.tensor( [ [[0.0, 0.0], [0.0, 1.0]], [[0.0, -0.5], [0.0, 1.75]], ] ) labels = torch.tensor([[100, 100], [100, 101]]) cmc_eval.reset() for embedding, label in zip(embeddings, labels): cmc_eval.update(embedding, label) # outputs are reported in percentages cmc_metrics = cmc_eval.compute() np.testing.assert_almost_equal(cmc_metrics["top1"], 50) np.testing.assert_almost_equal(cmc_metrics["top2"], 75) np.testing.assert_almost_equal( cmc_metrics["mAP"], 100 * (1.0 + 7.0 / 12.0 + 1.0) / 3.0 ) ================================================ FILE: tests/metrics/test_topk_accuracy.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Callable import numpy as np from corenet.metrics.stats import Statistics from tests.metrics.base import sample_classification_outputs, transform_args def test_gather_top_k_metrics(transform_args: Callable): metric_names, stats_args = transform_args( ["top1", "top5"], *sample_classification_outputs() ) stats = Statistics(opts=None, metric_names=metric_names) stats.update(*stats_args) top1_acc = round(stats.avg_statistics(metric_names[0]), 2) top5_acc = round(stats.avg_statistics(metric_names[1]), 2) np.testing.assert_almost_equal(top1_acc, 33.33, decimal=2) np.testing.assert_almost_equal(top5_acc, 100.00, decimal=2) ================================================ FILE: tests/metrics/test_vqa_preset_score_metrics.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # """Test for metrics/vqa_score.py.""" import numpy as np import torch from corenet.metrics.stats import Statistics def test_vqa_preset_score() -> None: predictions = { "logits": torch.tensor( [ [0, 0, 1], [0, 0, 1], [0, 0, 1], ], dtype=torch.float, ) } targets = torch.tensor( [ [0, 0, 1], [0, 1, 0], [0, 0.5, 0.5], ], dtype=torch.float, ) stats = Statistics(opts=None, metric_names=["vqa_preset_score"]) stats.update(predictions, targets) score = round(stats.avg_statistics("vqa_preset_score", "bbox"), 2) np.testing.assert_almost_equal(score, 50.0) ================================================ FILE: tests/misc/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/misc/dummy_clip_config.yaml ================================================ # pytest: disable common: debug_mode: true dataset: name: "img_text_tar" category: "multi_modal_image_text" model: activation_checkpointing: true freeze_modules: [ "image_encoder.transformer", "image_encoder.cls_token", "image_encoder.patch_emb", "image_encoder.post_transformer_norm", "image_encoder.pos_embed", ] multi_modal_image_text: name: "clip" clip: projection_dim: 128 classification: name: "vit" vit: mode: "tiny" norm_layer: "layer_norm_fp32" image_projection_head: name: "simple_projection_nc2nc" text: name: "transformer" vocab_size: 200 context_length: 77 transformer: causal_masking: true model_dim: 128 n_transformer_layers: 1 ffn_multiplier_per_layer: 4.0 n_heads_per_layer: 8 norm_layer: "layer_norm_fp32" activation: name: "gelu" ================================================ FILE: tests/misc/dummy_linear_probe_config.yaml ================================================ # pytest: disable common: debug_mode: true dataset: name: "imagenet" category: "classification" model: resume_exclude_scopes: - "image_encoder.neural_augmentor." - "neural_augmentor." - "text_encoder." - "logit_scale" - "image_encoder.classifier.proj" ignore_missing_scopes: ["classifier."] learn_augmentation: mode: None rename_scopes_map: [["image_encoder.", ""]] freeze_modules: "^((?!classifier).)*$" classification: name: "vit" vit: mode: "base" dropout: 0.2 activation: name: "gelu" activation: name: "gelu" normalization: name: "batch_norm" momentum: 0.1 layer: conv_init: "kaiming_normal" linear_init: "trunc_normal" linear_init_std_dev: 0.02 ================================================ FILE: tests/misc/test_common.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from collections import OrderedDict from typing import List import pytest import torch import torch.nn as nn from corenet.modeling import get_model from corenet.modeling.misc.common import freeze_modules_based_on_opts, get_tensor_sizes from tests.configs import get_config from tests.test_utils import unset_pretrained_models_from_opts def test_freeze_modules_based_on_opts() -> None: model = nn.Sequential( OrderedDict( [ ("conv1", nn.Conv2d(1, 20, 5)), ("relu1", nn.ReLU()), ("conv2", nn.Conv2d(20, 64, 5)), ("relu2", nn.ReLU()), ] ) ) opts = argparse.Namespace(**{"model.freeze_modules": "conv1"}) freeze_modules_based_on_opts(opts, model) model.train() assert model.conv1.training == False assert model.conv2.training == True assert model.relu1.training == True @pytest.mark.parametrize( ("config_file", "expected_trainable_params"), [ ( "tests/misc/dummy_clip_config.yaml", [ "logit_scale", "image_encoder.classifier.proj", "text_encoder.projection_layer", "text_encoder.embedding_layer.weight", "text_encoder.positional_embedding.pos_embed.pos_embed", "text_encoder.transformer.0.pre_norm_mha.0.weight", "text_encoder.transformer.0.pre_norm_mha.0.bias", "text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight", "text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias", "text_encoder.transformer.0.pre_norm_mha.1.out_proj.weight", "text_encoder.transformer.0.pre_norm_mha.1.out_proj.bias", "text_encoder.transformer.0.pre_norm_ffn.0.weight", "text_encoder.transformer.0.pre_norm_ffn.0.bias", "text_encoder.transformer.0.pre_norm_ffn.1.weight", "text_encoder.transformer.0.pre_norm_ffn.1.bias", "text_encoder.transformer.0.pre_norm_ffn.4.weight", "text_encoder.transformer.0.pre_norm_ffn.4.bias", "text_encoder.final_layer_norm.weight", "text_encoder.final_layer_norm.bias", ], ), ( "tests/misc/dummy_linear_probe_config.yaml", ["classifier.weight", "classifier.bias"], ), ], ) def test_freeze_modules_based_on_opts_with_match_named_params( config_file: str, expected_trainable_params: List[str] ) -> None: """ Test to check whether parameters are frozen correctly or not for models with complex structures (e.g., CLIP). """ print(config_file) opts = get_config(config_file=config_file) # removing pretrained models (if any) to reduce test time as well as access issues. unset_pretrained_models_from_opts(opts) model = get_model(opts) model.train() total_model_parmams = sum([p.numel() for p in model.parameters()]) model_trainable_params = sum( p.numel() for p in model.parameters() if p.requires_grad ) assert model_trainable_params < total_model_parmams trainable_param_names = [ p_name for p_name, p in model.named_parameters() if p.requires_grad ] assert trainable_param_names == expected_trainable_params def test_get_tensor_sizes() -> None: in_width = 224 in_height = 224 in_channels = 3 in_batch_size = 1 img = torch.randn(size=(in_batch_size, in_channels, in_height, in_width)) # test for Tensor size_info = get_tensor_sizes(img) assert size_info == [in_batch_size, in_channels, in_height, in_width] # test for empty dict data_dict = {} size_info = get_tensor_sizes(data_dict) assert size_info == [] # test for dict with single key data_dict = {"image": img} size_info = get_tensor_sizes(data_dict) assert size_info == [ str(f"image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]") ] # test for dict with two keys data_dict = {"image_1": img, "image_2": img} size_info = get_tensor_sizes(data_dict) assert size_info == [ str(f"image_1: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]"), str(f"image_2: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]"), ] # test for nested dict data_dict = {"image_1": img, "image_2": {"image": img}} size_info = get_tensor_sizes(data_dict) assert size_info == [ str(f"image_1: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]"), str( f"image_2: ['image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]']" ), ] # test for nested dict with non-tensor data_dict = {"image": img, "random_key": "data"} size_info = get_tensor_sizes(data_dict) assert size_info == [ str(f"image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]") ] ================================================ FILE: tests/modeling/__init__.py ================================================ ================================================ FILE: tests/modeling/layers/__init__.py ================================================ ================================================ FILE: tests/modeling/layers/normalization_layers/__init__.py ================================================ ================================================ FILE: tests/modeling/layers/normalization_layers/test_rms_norm.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from corenet.modeling.layers.normalization.rms_norm import RMSNorm def test_rms_norm() -> None: in_features = 16 norm_layer = RMSNorm(num_features=in_features) inputs = [ # 3D inputs (e.g., Transformers) torch.randn(size=(2, 4, in_features)), # 4D inputs (e.g., CNNs) torch.randn(size=(2, 4, 5, in_features)), # 2D inputs (e.g., Linear) torch.randn(size=(2, in_features)), ] for inp in inputs: out = norm_layer(inp) assert out.shape == inp.shape # check if there are any NaNs in the output. assert not torch.any(torch.isnan(out)) ================================================ FILE: tests/modeling/layers/test_conv_layer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from pprint import pformat import pytest import torch from corenet.modeling.layers.activation import build_activation_layer from corenet.modeling.layers.conv_layer import ConvLayer2d from corenet.modeling.layers.normalization import build_normalization_layer from tests.configs import get_config @pytest.mark.parametrize( "use_norm,customize_norm", [(True, True), (True, False), (False, False)] ) @pytest.mark.parametrize( "use_act,customize_act", [(True, True), (True, False), (False, False)] ) def test_use_act_and_use_norm( use_act: bool, customize_act: bool, use_norm: bool, customize_norm: bool ) -> None: opts = get_config() default_act, custom_act = "relu", "gelu" # Choose different values setattr(opts, "model.activation.name", default_act) default_norm, custom_norm = "layer_norm", "batch_norm" # Choose different values setattr(opts, "model.normalization.name", default_norm) conv = ConvLayer2d( opts=opts, in_channels=3, out_channels=5, kernel_size=3, stride=3, use_act=use_act, act_layer=( build_activation_layer(opts, act_type=custom_act) if customize_act else None ), use_norm=use_norm, norm_layer=( build_normalization_layer(opts, norm_type=custom_norm, num_features=3) if customize_norm else None ), ) def has_submodule(name: str) -> bool: name = name.lower().replace("_", "") for module in conv.block.children(): if name in type(module).__name__.lower().replace("_", ""): return True return False has_conv2d = has_submodule("conv2d") has_default_norm = has_submodule(default_norm) has_custom_norm = has_submodule(custom_norm) has_default_act = has_submodule(default_act) has_custom_act = has_submodule(custom_act) assert len(list(conv.block.children())) == sum( map( int, [ has_conv2d, has_default_act, has_default_norm, has_custom_norm, has_custom_act, ], ) ), ( "Got duplicate or unexpected submodules in" f" {pformat(list(conv.block.children()))}." ) assert has_conv2d assert has_default_norm == (use_norm and not customize_norm) assert has_custom_norm == (use_norm and customize_norm) assert has_default_act == (use_act and not customize_act) assert has_custom_act == (use_act and customize_act) ================================================ FILE: tests/modeling/layers/test_multi_head_attn.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys import numpy as np import pytest import torch sys.path.append("..") from corenet.modeling.layers.multi_head_attention import MultiHeadAttention def build_attention_mask(context_length: int, batch_size: int, use_pytorch_mha): # lazily create causal attention mask, with full attention between the vision tokens # pytorch uses additive attention mask; fill with -inf mask = torch.empty(context_length, context_length) mask.fill_(float("-inf")) mask.triu_(1) # zero out the lower diagonal if not use_pytorch_mha: mask = mask.unsqueeze(0) # add dummy batch dimension mask = mask.expand(batch_size, -1, -1) return mask @pytest.mark.parametrize( "output_dim, batch_size, bias, use_attn_mask", [ (32, 1, True, True), (16, 2, False, False), ], ) def test_multihead_self_attn( output_dim: int, batch_size: int, bias: bool, use_attn_mask: bool ): seq_len = 5 embed_dim = 8 mha = MultiHeadAttention( embed_dim=embed_dim, num_heads=2, attn_dropout=0.0, bias=bias, output_dim=output_dim, coreml_compatible=False, ) mha.eval() qkv = torch.randn(size=(seq_len, batch_size, embed_dim)) attn_mask = None if use_attn_mask: attn_mask = build_attention_mask( context_length=seq_len, batch_size=batch_size, use_pytorch_mha=True ) # Pytorch MHA accepts sequence first out_pytorch = mha(x_q=qkv, use_pytorch_mha=True, attn_mask=attn_mask) # default works with batch-first qkv = qkv.transpose(0, 1) attn_mask = None if use_attn_mask: attn_mask = build_attention_mask( context_length=seq_len, batch_size=batch_size, use_pytorch_mha=False ) out_default = mha(x_q=qkv, use_pytorch_mha=False, attn_mask=attn_mask) out_default = out_default.transpose(0, 1) torch.testing.assert_close( actual=out_default, expected=out_pytorch, atol=1e-3, rtol=1e-3 ) if hasattr(mha, "forward_tracing") and attn_mask is None: # check coreml compatible version out_tracing = mha.forward_tracing(x_q=qkv).transpose(0, 1) torch.testing.assert_close( actual=out_default, expected=out_tracing, atol=1e-3, rtol=1e-3 ) @pytest.mark.parametrize( "output_dim, key_len, batch_size, bias", [ (32, 15, 1, True), (16, 20, 2, False), ], ) def test_multihead_cross_attn( output_dim: int, key_len: int, batch_size: int, bias: bool ): seq_len = 20 embed_dim = 32 mha = MultiHeadAttention( embed_dim=embed_dim, num_heads=8, attn_dropout=0.0, bias=bias, output_dim=output_dim, coreml_compatible=False, ) mha.eval() query = torch.randn(size=(seq_len, batch_size, embed_dim)) key = torch.randn(size=(key_len, batch_size, embed_dim)) # Pytorch MHA accepts sequence first out_pytorch = mha(x_q=query, x_kv=key, use_pytorch_mha=True) # default works with batch-first query = query.transpose(0, 1) key = key.transpose(0, 1) out_default = mha(x_q=query, x_kv=key) out_default = out_default.transpose(0, 1) torch.testing.assert_close( actual=out_default, expected=out_pytorch, atol=1e-3, rtol=1e-3 ) if hasattr(mha, "forward_tracing"): # check coreml compatible version out_tracing = mha.forward_tracing(x_q=query, x_kv=key).transpose(0, 1) torch.testing.assert_close( actual=out_default, expected=out_tracing, atol=1e-3, rtol=1e-3 ) ================================================ FILE: tests/modeling/layers/test_pos_embeddings.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys import numpy as np import pytest sys.path.append("..") from corenet.modeling.layers.positional_embedding import PositionalEmbedding @pytest.mark.parametrize( "is_learnable, input_seq_len, sequence_first, padding_idx", [ (True, 34, True, None), (False, 128, False, 0), (False, 192, True, 0), ], ) def test_pos_embedding( is_learnable: bool, input_seq_len: int, sequence_first: bool, padding_idx: int ): num_embeddings = 128 pos_embedding = PositionalEmbedding( opts=None, num_embeddings=num_embeddings, embedding_dim=512, padding_idx=padding_idx, is_learnable=is_learnable, sequence_first=sequence_first, ) seq_dim = 0 if sequence_first else 1 out = pos_embedding(input_seq_len) np.testing.assert_equal(out.shape[seq_dim], input_seq_len) ================================================ FILE: tests/modeling/layers/test_rotary_embeddings.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest import torch from corenet.modeling.layers import RotaryEmbedding @pytest.mark.parametrize( "model_dim,n_queries,n_keys,n_groups", [ (18, 5, 5, 1), (18, 5, 6, 4), ], ) def test_rotary_embedding( model_dim: int, n_queries: int, n_keys: int, n_groups: int ) -> None: """Test for RoPE embeddings.""" rope_embedding = RotaryEmbedding( model_dim=model_dim, # setting max_seq_length to the same as number of queries. # When n_keys > n_queries, then cos and sine embeddings are re-computed. max_seq_length=n_queries, ) batch_size = 2 n_query_heads = 16 # When n_groups != 1, RoPE with GQA is tested n_key_heads = n_query_heads // n_groups query_tensor = torch.randn( size=(batch_size, n_query_heads, n_queries, model_dim), dtype=torch.bfloat16, device=torch.device("cpu"), ) key_tensor = torch.randn( size=(batch_size, n_key_heads, n_keys, model_dim), dtype=torch.bfloat16, device=torch.device("cpu"), ) query_tensor_with_rope, key_tensor_with_rope = rope_embedding( query_tensor, key_tensor ) assert rope_embedding._cached_seq_length == n_keys assert query_tensor.shape == query_tensor_with_rope.shape assert key_tensor.shape == key_tensor_with_rope.shape assert torch.isnan(query_tensor_with_rope).to(torch.bool).sum() == 0 assert torch.isnan(key_tensor_with_rope).to(torch.bool).sum() == 0 ================================================ FILE: tests/modeling/layers/test_token_merging.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import math import pytest import torch from corenet.modeling.layers import token_merging def ensure_equal_in_range(t: torch.Tensor, start: int, end: int) -> None: """ Make sure that elements in the tensor @t are equal between @start and @end, but not beyond. Args: t: The tensor to check. start: The start of the equality check. end: The end of the equality check. """ prototype = t[start] assert torch.all( (prototype - t[start:end]).abs() < 1e-3 ), f"Expected equal values from index {start} to {end}, got tensor {t}." assert torch.all( prototype != t[end:] ), f"Expected values from index {end} onwards not to equal values at {start}, got tensor {t}." def test_token_merging() -> None: # Set the batch_size B, sequence length N, and number of channels C. B, N, C = 2, 65, 8 x = torch.ones(B, N, C) key_padding_mask = torch.zeros([B, N]) # Mask values at and beyond 33. key_padding_mask[0, 33:] = float("-inf") x[0, 33:] = 10e6 t = token_merging.TokenMerging(C) y, key_padding_mask = t(x, key_padding_mask) # Because the large @x values were masked (and then zerod by the # TokenMerging operation), the largest value should be far lower than 10e6. assert y.max() < 5 assert y.shape[1] == 33 assert key_padding_mask.shape == (2, 33) # Before downsampling, there were 33 unmasked tokens. Now, there are 17. # The first 16 should be identical, but the 17th will be different since # it wasn't merged with another token (since the sequence length wasn't # divisible by the window size). ensure_equal_in_range(y[0], 0, 16) ensure_equal_in_range(y[0], 16, 17) ensure_equal_in_range(y[0], 17, 33) # For the second sample, all samples are identical except the last one. ensure_equal_in_range(y[1], 0, 32) # The first 17 mask positions should be unaltered. assert torch.all(key_padding_mask[0, :17] == 0) assert torch.all(key_padding_mask[0, 18:] == float("-inf")) # All the mask positions should still be 0. assert torch.all(key_padding_mask[1] == 0) @pytest.mark.parametrize("dim,window", [(8, 2), (8, 3), (16, 4)]) def test_token_merging_shapes(dim: int, window: int) -> None: # Set the batch_size B and sequence length N. B, N = 2, 65 x = torch.ones(B, N, dim) key_padding_mask = torch.zeros([B, N]) # Mask values at and beyond 33. key_padding_mask[0, 33:] = float("-inf") x[0, 33:] = 10e6 t = token_merging.TokenMerging(dim, window) y, key_padding_mask = t(x, key_padding_mask) assert y.shape == (B, math.ceil(N / window), dim) ================================================ FILE: tests/modeling/models/__init__.py ================================================ # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. ================================================ FILE: tests/modeling/models/audio_classification/__init__.py ================================================ ================================================ FILE: tests/modeling/models/audio_classification/test_base_audio_classification.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from corenet.modeling.models.audio_classification import base_audio_classification def test_base_audio_classification_adds_arguments() -> None: opts = argparse.Namespace() model = base_audio_classification.BaseAudioClassification(opts) parser = argparse.ArgumentParser() model.add_arguments(parser) assert hasattr(parser.parse_args([]), "model.audio_classification.name") ================================================ FILE: tests/modeling/models/audio_classification/test_byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from corenet.modeling.models.audio_classification import audio_byteformer from corenet.modeling.models.classification import byteformer as image_byteformer from tests.modeling.models.classification import test_byteformer def test_audio_byteformer() -> None: # Make sure it matches the image classification network. opts = test_byteformer.get_opts() byteformer1 = image_byteformer.ByteFormer(opts) byteformer2 = audio_byteformer.AudioByteFormer(opts) # Make their state_dicts match. byteformer2.load_state_dict(byteformer1.state_dict()) batch_size, sequence_length = 2, 32 x = torch.randint(0, 128, [batch_size, sequence_length]) assert torch.all(byteformer1(x) == byteformer2({"audio": x})) ================================================ FILE: tests/modeling/models/classification/__init__.py ================================================ ================================================ FILE: tests/modeling/models/classification/config/__init__.py ================================================ ================================================ FILE: tests/modeling/models/classification/config/test_byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import pytest from corenet.modeling.models.classification.config import byteformer @pytest.mark.parametrize("mode", ["tiny", "small", "base", "huge"]) def test_get_configuration(mode) -> None: opts = argparse.Namespace() setattr(opts, "model.classification.byteformer.mode", mode) setattr(opts, "model.classification.byteformer.dropout", 0.0) setattr(opts, "model.classification.byteformer.norm_layer", "layer_norm") byteformer.get_configuration(opts) ================================================ FILE: tests/modeling/models/classification/config/vit_config.yaml ================================================ # pytest: disable dataset: name: "imagenet" category: "classification" model: classification: name: "vit" vit: mode: "test" norm_layer: "layer_norm_fp32" activation: name: "gelu" ================================================ FILE: tests/modeling/models/classification/test_byteformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from corenet.modeling.models.classification import byteformer def get_opts() -> argparse.Namespace: opts = argparse.Namespace() setattr(opts, "model.classification.byteformer.conv_kernel_size", 16) setattr(opts, "model.classification.byteformer.dropout", 0.0) setattr(opts, "model.classification.byteformer.norm_layer", "layer_norm") setattr(opts, "model.classification.byteformer.dummy_input_token_length", 1) setattr(opts, "model.classification.byteformer.max_num_tokens", 1000) setattr(opts, "model.classification.byteformer.sinusoidal_pos_emb", False) setattr(opts, "model.classification.byteformer.vocab_size", 257) setattr(opts, "model.classification.byteformer.mode", "tiny") setattr(opts, "model.classification.byteformer.input_dims", 2) setattr(opts, "model.classification.byteformer.pos_embed_type", "learnable") setattr(opts, "model.classification.byteformer.window_sizes", [128] * 12) setattr(opts, "model.classification.byteformer.window_shifts", [0, 64] * 6) setattr( opts, "model.classification.byteformer.downsample", [True, True] + ([False, True] * 4) + [False, False], ) setattr(opts, "model.classification.byteformer.stochastic_dropout", 0) setattr(opts, "model.classification.n_classes", 1000) setattr(opts, "model.normalization.groups", None) setattr(opts, "model.normalization.momentum", 0.9) setattr(opts, "model.activation.name", "relu") setattr(opts, "model.activation.inplace", False) setattr(opts, "model.activation.neg_slope", False) return opts def test_token_reduction_net() -> None: opts = get_opts() model = byteformer.ByteFormer(opts) B, N, C = 1, 256, 192 x_values = torch.ones([B, N, C]) mask = torch.ones([B, N]) mask[0, 129:] = 0 x_values[:, 129:] = 0 y, y_mask = model.apply_token_reduction_net(x_values, mask) assert y.shape == (1, 31, 192) assert y_mask.shape == (1, 31) assert (y_mask > 0).float().sum() == 17 def test_model_forward_pass() -> None: opts = get_opts() model = byteformer.ByteFormer(opts) B, N = 1, 256 x_values = torch.empty([B, N], dtype=torch.int) x_values[:, :129] = torch.randint(0, 256, size=(1, 129)) x_values[:, 129:] = -1 y = model(x_values) assert y.shape == (1, 1000) ================================================ FILE: tests/modeling/models/classification/test_vit.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest import torch from corenet.modeling.models import get_model from tests.configs import get_config @pytest.mark.parametrize( "cls_token,return_image_embeddings,use_range_augment,use_flash_attn", [ (False, False, False, False), (True, False, False, False), (True, True, False, False), (True, True, True, False), (True, True, True, True), ], ) def test_vit(cls_token, return_image_embeddings, use_range_augment, use_flash_attn): batch_size = 2 image_channels = 3 image_height = 32 image_width = 32 model_dim = 128 n_classes = 3 # input image is 32x32, so the number of patches along width and height with a stride of 16 will be 2 and 2 respectively. n_patches_h = n_patches_w = 2 opts = get_config( config_file="tests/modeling/models/classification/config/vit_config.yaml" ) setattr(opts, "model.classification.vit.no_cls_token", cls_token) setattr(opts, "model.classification.n_classes", n_classes) setattr(opts, "model.classification.vit.use_flash_attention", use_flash_attn) if use_range_augment: setattr(opts, "model.learn_augmentation.mode", "distribution") setattr(opts, "model.learn_augmentation.brightness", True) model = get_model(opts) input = torch.randn( (batch_size, image_channels, image_height, image_width), dtype=torch.float ) out = model(input, return_image_embeddings) # Four cases # 1. Return image embeddings along with range augment # 2. Return image embeddings but do not use range augment # 3. Use range augment but do not return image embeddings # 4. Neither use range augment nor return image embeddings if return_image_embeddings and use_range_augment: expected_keys_and_size = { "logits": [batch_size, n_classes], "augmented_tensor": [batch_size, image_channels, image_height, image_width], "image_embeddings": [batch_size, model_dim, n_patches_h, n_patches_w], } elif return_image_embeddings and not use_range_augment: expected_keys_and_size = { "logits": [batch_size, n_classes], "augmented_tensor": None, "image_embeddings": [batch_size, model_dim, n_patches_h, n_patches_w], } elif not return_image_embeddings and use_range_augment: expected_keys_and_size = { "logits": [batch_size, n_classes], "augmented_tensor": [batch_size, image_channels, image_height, image_width], } else: expected_keys_and_size = {} if expected_keys_and_size: # check all output keys are present assert len(out.keys() & expected_keys_and_size.keys()) == len( expected_keys_and_size ) # check the size of output is as expected for key_, size_ in expected_keys_and_size.items(): if size_ is None: continue assert list(out[key_].size()) == size_ assert torch.all(torch.isfinite(out[key_])) else: assert out.ndim == 2 assert list(out.size()) == [batch_size, n_classes] assert torch.all(torch.isfinite(out)) ================================================ FILE: tests/modeling/models/language_modeling/__init__.py ================================================ ================================================ FILE: tests/modeling/models/language_modeling/config/gpt_config.yaml ================================================ # pytest: disable dataset: name: "general_lm" category: "language_modeling" model: language_modeling: name: "general_gpt" general_gpt: model_name: "gpt-test" vocab_size: 100 max_context_length: 100 ================================================ FILE: tests/modeling/models/language_modeling/config/kv_prediction_config.yaml ================================================ # pytest: disable dataset: name: "general_lm" category: "language_modeling" model: language_modeling: name: "kv_prediction" kv_prediction: auxkv_num_layers_to_basekv_num_layers: [0, 0, 1] base_model: - model: language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "gpt-test-base" auxiliary_model: - model: language_modeling: name: "layer_pruned_general_gpt" general_gpt: model_name: "gpt-test-aux" general_gpt: vocab_size: 100 max_context_length: 100 ================================================ FILE: tests/modeling/models/language_modeling/test_general_gpt.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import torch from corenet.modeling.models import get_model from tests.configs import get_config @torch.no_grad() def test_general_gpt(): batch_size = 2 seq_length = 5 vocab_size = 16 max_context_length = seq_length opts = get_config( config_file="tests/modeling/models/language_modeling/config/gpt_config.yaml" ) setattr(opts, "model.language_modeling.general_gpt.vocab_size", vocab_size) setattr( opts, "model.language_modeling.general_gpt.max_context_length", max_context_length, ) model = get_model(opts) model.eval() model_inputs_outputs = [ # pre-training { "input": torch.randint(0, vocab_size, size=(batch_size, seq_length)), "expected_output_size": [batch_size, seq_length, vocab_size], "expected_output_type": "tensor", }, # prefix (same as pre-training, but use dictionary format for inputs) { "input": { "input_ids": torch.randint( 0, vocab_size, size=(batch_size, seq_length) ), "past_keys": None, "past_values": None, "use_kv_cache": False, "is_causal": True, }, "expected_output_size": [batch_size, seq_length, vocab_size], "expected_output_type": "tensor", }, # prefix with KV caching { "input": { "input_ids": torch.randint( 0, vocab_size, size=(batch_size, seq_length) ), "past_keys": None, "past_values": None, "use_kv_cache": True, "is_causal": True, }, "expected_output_size": { "logits": [batch_size, seq_length, vocab_size], "past_keys": [ [ batch_size, model.layers[0].attn.num_k_heads, seq_length, model.layers[0].attn.head_dim, ] ], "past_values": [ [ batch_size, model.layers[0].attn.num_k_heads, seq_length, model.layers[0].attn.head_dim, ] ], }, "expected_output_type": "dictionary", }, # Generation with KV caching (input sequence length is 1) { "input": { "input_ids": torch.randint(0, vocab_size, size=(batch_size, 1)), "past_keys": [ torch.randint( 0, vocab_size, size=( batch_size, model.layers[0].attn.num_k_heads, seq_length, model.layers[0].attn.head_dim, ), ) ], "past_values": [ torch.randint( 0, vocab_size, size=( batch_size, model.layers[0].attn.num_k_heads, seq_length, model.layers[0].attn.head_dim, ), ) ], "use_kv_cache": True, "is_causal": True, }, "expected_output_size": { "logits": [batch_size, 1, vocab_size], # expected 1 more token in kv cache "past_keys": [ [ batch_size, model.layers[0].attn.num_k_heads, seq_length + 1, model.layers[0].attn.head_dim, ] ], "past_values": [ [ batch_size, model.layers[0].attn.num_k_heads, seq_length + 1, model.layers[0].attn.head_dim, ] ], }, "expected_output_type": "dictionary", }, ] for model_io in model_inputs_outputs: out = model(model_io["input"]) if model_io["expected_output_type"] == "tensor": assert isinstance(out, torch.Tensor) assert list(out.size()) == model_io["expected_output_size"] assert torch.all(torch.isfinite(out)) elif model_io["expected_output_type"] == "dictionary": assert isinstance(out, dict) assert set(out.keys()) == set(model_io["expected_output_size"].keys()) for k_name, expected_out_size in model_io["expected_output_size"].items(): if k_name in ["past_keys", "past_values"]: assert ( len(out[k_name]) == 1 ), "Only single transformer layer in test model" actual_out_size = [list(out[k_name][0].size())] assert torch.all(torch.isfinite(out[k_name][0])) else: actual_out_size = list(out[k_name].size()) assert torch.all(torch.isfinite(out[k_name])) assert actual_out_size == expected_out_size ================================================ FILE: tests/modeling/models/language_modeling/test_kv_prediction.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import copy import pytest import torch from corenet.modeling.models import get_model from tests.configs import get_config def set_cache_transforms_to_identity(model) -> None: model.predicter.auxkv_to_basekv.set_as_identity() def get_openelm_kv_prediction_model( arch, config, ): opts = get_config( config_file="tests/modeling/models/language_modeling/config/kv_prediction_config.yaml" ) for k, v in config.items(): setattr(opts, k, v) for elem in ["general_gpt"]: getattr(opts, "model.language_modeling.kv_prediction.base_model")[0]["model"][ "language_modeling" ][elem]["model_name"] = arch[0] getattr(opts, "model.language_modeling.kv_prediction.auxiliary_model")[0][ "model" ]["language_modeling"][elem]["model_name"] = arch[1] model = get_model(opts) model.eval() return model @torch.no_grad() @pytest.mark.parametrize( "arch,config", ( [ ["gpt-test-base", "gpt-test-aux"], { "model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers": [ 0, 0, 1, ], }, ], ), ) def test_kv_prediction(arch, config) -> None: batch_size = 3 seq_length = 5 vocab_size = 16 max_context_length = seq_length config["model.language_modeling.general_gpt.vocab_size"] = vocab_size config["model.language_modeling.general_gpt.max_context_length"] = ( max_context_length ) model = get_openelm_kv_prediction_model( arch, config, ) model_inputs_outputs = [ # pre-training { "name": "pre-training", "input": torch.randint(2, vocab_size, size=(batch_size, seq_length)), "expected_output_size": { "logits": [batch_size, seq_length, vocab_size], "auxiliary_logits": [batch_size, seq_length, vocab_size], "past_keys": [ [ batch_size, model.base.k_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], "past_values": [ [ batch_size, model.base.v_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], }, "expected_output_type": "dictionary", }, # prefix (same as pre-training, but use dictionary format for inputs) { "name": "prefix (same as pre-training, but use dictionary format for inputs)", "input": { "input_ids": torch.randint( 2, vocab_size, size=(batch_size, seq_length) ), "past_keys": None, "past_values": None, "use_kv_cache": False, "is_causal": True, }, "expected_output_size": { "logits": [batch_size, seq_length, vocab_size], "auxiliary_logits": [batch_size, seq_length, vocab_size], "past_keys": [ [ batch_size, model.base.k_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], "past_values": [ [ batch_size, model.base.v_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], }, "expected_output_type": "dictionary", }, # prefix with KV caching { "name": "prefix with KV caching", "input": { "input_ids": torch.randint( 2, vocab_size, size=(batch_size, seq_length) ), "past_keys": None, "past_values": None, "use_kv_cache": True, "is_causal": True, }, "expected_output_size": { "logits": [batch_size, seq_length, vocab_size], "past_keys": [ [ batch_size, model.base.k_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], "past_values": [ [ batch_size, model.base.v_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], }, "expected_output_type": "dictionary", }, # Generation with KV caching (input sequence length is 1) { "name": "Generation with KV caching (input sequence length is 1)", "input": { "input_ids": torch.randint(2, vocab_size, size=(batch_size, 1)), "past_keys": [ torch.randint( 2, vocab_size, size=( batch_size, model.base.k_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ), ) for i in range(len(model.base.layers)) ], "past_values": [ torch.randint( 2, vocab_size, size=( batch_size, model.base.k_num_heads_at_layer(i), seq_length, model.base.head_dim_at_layer(i), ), ) for i in range(len(model.base.layers)) ], "use_kv_cache": True, "is_causal": True, }, "expected_output_size": { "logits": [batch_size, 1, vocab_size], # expected 1 more token in kv cache "past_keys": [ [ batch_size, model.base.k_num_heads_at_layer(i), seq_length + 1, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], "past_values": [ [ batch_size, model.base.v_num_heads_at_layer(i), seq_length + 1, model.base.head_dim_at_layer(i), ] for i in range(len(model.base.layers)) ], }, "expected_output_type": "dictionary", }, ] for model_io in model_inputs_outputs: out = model(model_io["input"]) if model_io["expected_output_type"] == "tensor": assert isinstance(out, torch.Tensor) assert list(out.size()) == model_io["expected_output_size"] assert torch.all(torch.isfinite(out)) elif model_io["expected_output_type"] == "dictionary": assert isinstance(out, dict) assert set(out.keys()) in ( set(model_io["expected_output_size"].keys()), set(model_io["expected_output_size"].keys()) | {"base_past_keys", "base_past_values"}, ) for k_name, expected_out_size in model_io["expected_output_size"].items(): if k_name in ["past_keys", "past_values"]: actual_out_size = [ list(out[k_name][i].size()) for i in range(len(out[k_name])) ] assert all( [ torch.all(torch.isfinite(out[k_name][i])) for i in range(len(out[k_name])) ] ) else: actual_out_size = list(out[k_name].size()) assert torch.all(torch.isfinite(out[k_name])) assert actual_out_size == expected_out_size, f"{k_name=},{model_io=}" @torch.no_grad() @pytest.mark.parametrize( "arch,config,test_outputs_identical", ( [ ["gpt-test-base", "gpt-test-aux"], { "model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers": [ 0, 0, 1, ], }, False, ], [ ["gpt-test-base", "gpt-test-base"], { "model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers": [ 0, 1, 2, ], }, True, ], ), ) def test_cache_behavior( arch, config, test_outputs_identical, ) -> None: batch_size = 3 seq_length = 5 vocab_size = 16 max_context_length = seq_length batch_size = 3 seq_length = 5 vocab_size = 16 max_context_length = seq_length config["model.language_modeling.general_gpt.vocab_size"] = vocab_size config["model.language_modeling.general_gpt.max_context_length"] = ( max_context_length ) model = get_openelm_kv_prediction_model(arch, config) if test_outputs_identical: model.base.load_state_dict(model.auxiliary.state_dict()) set_cache_transforms_to_identity(model) storage = {} def make_record_forward(model): old_forward = model.forward def forward(*args2, **kwargs2): storage.clear() storage["args"] = copy.deepcopy(args2) storage["kwargs"] = copy.deepcopy(kwargs2) return old_forward(*args2, **kwargs2) return forward model.base.forward = make_record_forward(model.base) position_ids = torch.arange( 0, seq_length, ).unsqueeze(0) # Case 1: use_kv_cache is False. In this case, we # pass the KV cache to the Base model after computing # it. inputs = { "input_ids": torch.randint(2, vocab_size, size=(batch_size, seq_length)), "position_ids": position_ids, "past_keys": None, "past_values": None, "use_kv_cache": False, "is_causal": True, } base_only_outputs = model(inputs, base_only=True) outputs1 = model(inputs) assert storage["args"][0]["input_ids"].shape == (batch_size, seq_length) assert len(storage["args"][0]["past_keys"]) == len(model.base.layers) assert (storage["args"][0]["past_keys"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_keys"][0]).shape[2] == (seq_length) assert (storage["args"][0]["past_keys"][0]).dim() == (4) assert len(storage["args"][0]["past_values"]) == len(model.base.layers) assert (storage["args"][0]["past_values"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_values"][0]).shape[2] == (seq_length) assert (storage["args"][0]["past_values"][0]).dim() == (4) assert (storage["args"][0]["use_kv_cache"]) is True assert (storage["args"][0]["is_causal"]) is True assert storage["kwargs"]["concat_kvs"] is False assert storage["kwargs"]["apply_k_norm_to_past_keys_before_cache_write"] is True assert storage["kwargs"]["apply_k_norm_before_cache_write"] is True # Case 2: We are using the cache, and we are in prompt-processing mode. # We will first generate the KV cache (which is not yet present in @inputs), # then we will call the base model to generate 1 token. # Since storage["args"] stores only the inputs to the base model, # the sequence length checked below is 1. inputs.update({"use_kv_cache": True}) outputs2 = model(inputs) assert storage["args"][0]["input_ids"].shape == (batch_size, 1) # Seq length is 1. assert len(storage["args"][0]["past_keys"]) == len(model.base.layers) assert (storage["args"][0]["past_keys"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_keys"][0]).shape[2] == (seq_length - 1) assert (storage["args"][0]["past_keys"][0]).dim() == (4) assert len(storage["args"][0]["past_values"]) == len(model.base.layers) assert (storage["args"][0]["past_values"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_values"][0]).shape[2] == (seq_length - 1) assert (storage["args"][0]["past_values"][0]).dim() == (4) assert (storage["args"][0]["use_kv_cache"]) is True assert (storage["args"][0]["is_causal"]) is False assert storage["kwargs"]["concat_kvs"] is True assert storage["kwargs"]["apply_k_norm_to_past_keys_before_cache_write"] is True assert storage["kwargs"]["apply_k_norm_before_cache_write"] is True # Case 3: We are using the cache, and we are in generation mode. # To get an appropriate KV cache, we must first call the model. inputs3a = copy.deepcopy(inputs) inputs3a.update( { "input_ids": inputs["input_ids"][:, :-2], "position_ids": inputs["position_ids"][:, :-2], } ) outputs3a = model(inputs3a) inputs3b = copy.deepcopy(inputs) inputs3b.update( { "input_ids": inputs["input_ids"][:, -2:-1], "position_ids": inputs["position_ids"][:, -2:-1], "past_keys": outputs3a["past_keys"], "past_values": outputs3a["past_values"], } ) outputs3b = model(inputs3b) inputs3c = copy.deepcopy(inputs) inputs3c.update( { "input_ids": inputs["input_ids"][:, -1:], "position_ids": inputs["position_ids"][:, -1:], "past_keys": outputs3b["past_keys"], "past_values": outputs3b["past_values"], } ) outputs3c = model(inputs3c) assert storage["args"][0]["input_ids"].shape == (batch_size, 1) # Seq length is 1. assert len(storage["args"][0]["past_keys"]) == len(model.base.layers) assert (storage["args"][0]["past_keys"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_keys"][0]).shape[2] == (seq_length - 1) assert (storage["args"][0]["past_keys"][0]).dim() == (4) assert len(storage["args"][0]["past_values"]) == len(model.base.layers) assert (storage["args"][0]["past_values"][0]).shape[0] == (batch_size) assert (storage["args"][0]["past_values"][0]).shape[2] == (seq_length - 1) assert (storage["args"][0]["past_values"][0]).dim() == (4) assert (storage["args"][0]["use_kv_cache"]) is True assert (storage["args"][0]["is_causal"]) is False assert storage["kwargs"]["concat_kvs"] is True assert storage["kwargs"]["apply_k_norm_to_past_keys_before_cache_write"] is False assert storage["kwargs"]["apply_k_norm_before_cache_write"] is True if test_outputs_identical: assert torch.allclose(base_only_outputs, outputs1["logits"], atol=1e-5) assert torch.allclose(outputs1["logits"], outputs2["logits"], atol=1e-5) assert torch.allclose( outputs2["logits"][:, -2:-1], outputs3b["logits"], atol=1e-5 ) assert torch.allclose( outputs2["logits"][:, -1:], outputs3c["logits"], atol=1e-5 ) ================================================ FILE: tests/modeling/models/test_activation_checkpointing_wrapper.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import List, Tuple, Union import pytest import torch from torch import nn from corenet.utils.activation_checkpointing_wrapper import activation_checkpointing @pytest.mark.parametrize( "activation_checkpointing_module_and_count", [ # _checkpoint_wrapped_module is added for each trainable parameter (e.g., weight and bias) in a layer. (nn.Linear, 3), (nn.Conv1d, 2), ([nn.Linear, nn.Conv1d], 5), ], ) def test_activation_checkpointing( activation_checkpointing_module_and_count: Tuple[ Union[torch.nn.Module, List[torch.nn.Module]], int ] ): ( activation_checkpoint_module, expected_activation_checkpoinitng_layers, ) = activation_checkpointing_module_and_count # dummy model model = torch.nn.Sequential( nn.Linear(10, 10, bias=False), nn.Conv1d(10, 10, kernel_size=1), nn.Linear(10, 10), nn.AvgPool1d(kernel_size=1), ) activation_checkpointing(model, submodule_class=activation_checkpoint_module) num_ckpt_modules = 0 for p_name, _ in model.named_parameters(): if p_name.find("_checkpoint_wrapped_module") > -1: num_ckpt_modules += 1 assert num_ckpt_modules == expected_activation_checkpoinitng_layers ================================================ FILE: tests/modeling/models/test_lora.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Dict import torch from corenet.modeling.models import get_model from corenet.third_party.modeling import lora from tests.configs import get_config def get_opts(config_file_name: str) -> Dict: opts = get_config(config_file_name) # Override with LoRA settings. setattr(opts, "model.freeze_modules", [".*base_layer.*", ".*norm.*"]) setattr(opts, "model.lora.use_lora", True) config = [ { "regex": r".*token_embedding.*", "module_type": "embedding", "params": { "adapter_name": "lora", "r": 5, "lora_alpha": 2, "lora_dropout": 0.1, "init_lora_weights": True, "use_rslora": False, "use_dora": False, }, }, { "regex": r".*out_proj.*", "module_type": "linear", "params": { "adapter_name": "lora", "r": 5, "lora_alpha": 2, "lora_dropout": 0.1, "init_lora_weights": True, "use_rslora": False, "use_dora": True, }, }, { "regex": r".*qkv_proj.*", "module_type": "linear", "params": { "adapter_name": "lora", "r": 5, "lora_alpha": 2, "lora_dropout": 0.1, "init_lora_weights": True, "use_rslora": False, "use_dora": True, }, }, { "regex": r".*proj_\d.*", "module_type": "linear", "params": { "adapter_name": "lora", "r": 5, "lora_alpha": 2, "lora_dropout": 0.1, "init_lora_weights": True, "use_rslora": False, "use_dora": True, }, }, ] setattr(opts, "model.lora.config", config) return opts def test_build_model() -> None: config = "tests/modeling/models/language_modeling/config/gpt_config.yaml" opts = get_opts(config) model = get_model(opts) # Number of parameters. assert sum([param.numel() for name, param in model.named_parameters()]) == 154164 # Number of trainable parameters. assert ( sum( [ param.numel() for name, param in model.named_parameters() if param.requires_grad ] ) == 9780 ) vocab_size = getattr(opts, "model.language_modeling.general_gpt.vocab_size") batch_size, seq_len = 1, 4 x = torch.randint(low=0, high=2, size=[batch_size, seq_len]) y = model(x) assert y.shape == (batch_size, seq_len, vocab_size) ================================================ FILE: tests/modeling/models/test_neural_aug_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import sys import pytest from corenet.modeling.neural_augmentor.utils.neural_aug_utils import * @pytest.mark.parametrize("noise_var", [0.0001, 0.01, 0.1]) def test_random_noise(noise_var): in_channels = 3 in_height = 224 in_width = 224 x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float) aug_out = random_noise(x, variance=torch.tensor(noise_var, dtype=torch.float)) torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape) @pytest.mark.parametrize("magnitude", [0.1, 1.0, 2.0]) def test_random_brightness(magnitude): in_channels = 3 in_height = 224 in_width = 224 x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float) aug_out = random_brightness(x, magnitude=torch.tensor(magnitude, dtype=torch.float)) torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape) @pytest.mark.parametrize("magnitude", [0.1, 1.0, 2.0]) def test_random_contrast(magnitude): in_channels = 3 in_height = 224 in_width = 224 x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float) aug_out = random_contrast(x, magnitude=torch.tensor(magnitude, dtype=torch.float)) torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape) ================================================ FILE: tests/modeling/modules/__init__.py ================================================ ================================================ FILE: tests/modeling/modules/test_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import torch from corenet.modeling.modules import TransformerEncoder def get_opts() -> argparse.Namespace: opts = argparse.Namespace() setattr(opts, "model.normalization.groups", None) setattr(opts, "model.normalization.momentum", 0.9) setattr(opts, "model.activation.name", "relu") setattr(opts, "model.activation.inplace", False) setattr(opts, "model.activation.neg_slope", False) return opts def ensure_equal_in_range(t: torch.Tensor, start: int, end: int) -> None: """ Ensure values of @t are equal from @start to @end, but not after @end. The tensor can have any number of dimensions greater than 0. The first dimension is the dimension indexed by @start and @end. Args: t: The tensor to check. start: The start index. end: The end index. """ prototype = t[start] assert torch.all((prototype - t[start:end]).abs() < 1e-3) assert torch.all(prototype != t[end:]) def test_masked_attention() -> None: opts = get_opts() B, N, C = 2, 64 + 2, 8 t = TransformerEncoder(opts, embed_dim=C, ffn_latent_dim=4 * C) prototype = torch.randn([C]) x = torch.ones([B, N, C]) x[:, :] = prototype key_padding_mask = torch.zeros([B, N]) key_padding_mask[0, 63:] = float("-inf") # Mask the @x values at the masked positions. x[0, 63:] = 0 y = t(x, key_padding_mask=key_padding_mask) prototype = y[0, 0] assert torch.all(prototype == y[0, :63]) assert torch.all(prototype != y[0, 63:]) prototype = y[1, 0] assert torch.all(prototype == y[1, :]) ================================================ FILE: tests/modeling/modules/test_windowed_transformer.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import pytest import torch import corenet.modeling.modules from corenet.modeling.modules import WindowedTransformerEncoder from tests.modeling.modules.test_transformer import ensure_equal_in_range, get_opts @pytest.mark.parametrize( "N,window_size,window_shift", [(32, 16, 4), (32, 7, 2), (15, 9, 4)] ) def test_get_windowed_attention_mask(N, window_size, window_shift) -> None: mask = corenet.modeling.modules.windowed_transformer.get_windows_shift_mask( N, window_size, window_shift, device=torch.device("cpu") ) expected = torch.zeros(N // window_size, window_size, window_size) expected[-1].fill_(float("-inf")) expected[-1, : window_size - window_shift, : window_size - window_shift] = 0 expected[-1, -window_shift:, -window_shift:] = 0 assert torch.all(mask == expected) def test_windowed_attention() -> None: opts = get_opts() B, N, C = 2, 66, 8 window_size = 16 window_shift = 0 t = WindowedTransformerEncoder( opts, embed_dim=C, ffn_latent_dim=4 * C, window_size=window_size, window_shift=window_shift, ) # These are the boundaries at which the tensor values change. chunk_bounds = [0, 16, 32, 48, 64, 66] x = torch.empty([B, N, C]) for start, end in zip(chunk_bounds[0:-1], chunk_bounds[1:]): prototype = torch.randn([C]) x[:, start:end] = prototype key_padding_mask = torch.zeros([B, N]) key_padding_mask[0, 63:] = float("-inf") # Mask the @x values at the masked positions. x[0, 63:] = 0 y = t(x, key_padding_mask=key_padding_mask) # We expect @y[0] values to change at the boundaries defined by chunk_bounds. ensure_equal_in_range(y[0], 0, 16) ensure_equal_in_range(y[0], 16, 32) ensure_equal_in_range(y[0], 32, 48) ensure_equal_in_range(y[0], 48, 63) # Masking will cause a change at index 63. ensure_equal_in_range(y[0], 63, 64) ensure_equal_in_range(y[0], 64, 66) # We expect @y[1] values to change at the boundaries defined by chunk_bounds. ensure_equal_in_range(y[1], 0, 16) ensure_equal_in_range(y[1], 16, 32) ensure_equal_in_range(y[1], 32, 48) ensure_equal_in_range(y[1], 48, 64) ensure_equal_in_range(y[1], 64, 66) def test_windowed_attention_shift() -> None: opts = get_opts() B, N, C = 2, 66, 8 window_size = 16 window_shift = 8 t = WindowedTransformerEncoder( opts, embed_dim=C, ffn_latent_dim=4 * C, window_size=window_size, window_shift=window_shift, ) # These are the boundaries at which the tensor values change. chunk_bounds = [0, 8, 24, 40, 56, 66] x = torch.empty([B, N, C]).fill_(float("-inf")) for start, end in zip(chunk_bounds[0:-1], chunk_bounds[1:]): prototype = torch.randn([C]) x[:, start:end] = prototype key_padding_mask = torch.zeros([B, N]) key_padding_mask[0, 63:] = float("-inf") # Mask the @x values at the masked positions. x[0, 63:] = 0 y = t(x, key_padding_mask=key_padding_mask) # We expect @y[0] values to change at the boundaries defined by chunk_bounds. # The values are offset by the shift of 8 as well, since windowing will # occur at indices congruent to 8 mod 16. ensure_equal_in_range(y[0], 0, 8) ensure_equal_in_range(y[0], 8, 24) ensure_equal_in_range(y[0], 24, 40) ensure_equal_in_range(y[0], 40, 56) ensure_equal_in_range(y[0], 56, 63) # Masking at index 63 changes the values. ensure_equal_in_range(y[0], 63, 66) # We expect @y[0] values to change at the boundaries defined by chunk_bounds. ensure_equal_in_range(y[1], 0, 8) ensure_equal_in_range(y[1], 8, 24) ensure_equal_in_range(y[1], 24, 40) ensure_equal_in_range(y[1], 40, 56) ensure_equal_in_range(y[1], 56, 66) ================================================ FILE: tests/modeling/test_model.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from pathlib import Path from typing import Dict import pytest from torch import Tensor from corenet.loss_fn import build_loss_fn from corenet.modeling import get_model from tests.configs import get_config from tests.test_utils import unset_pretrained_models_from_opts # We use a batch size of 1 to catch error that may arise due to reshaping operations inside the model @pytest.mark.parametrize("batch_size", [1, 2]) def test_model(config_file: str, batch_size: int): opts = get_config(config_file=config_file) setattr(opts, "common.debug_mode", True) # removing pretrained models (if any) for now to reduce test time as well as access issues unset_pretrained_models_from_opts(opts) model = get_model(opts) criteria = build_loss_fn(opts) inputs = None targets = None if hasattr(model, "dummy_input_and_label"): inputs_and_targets = model.dummy_input_and_label(batch_size) inputs = inputs_and_targets["samples"] targets = inputs_and_targets["targets"] assert inputs is not None, ( "Input tensor can't be None. This is likely because " "{} does not implement dummy_input_and_label function".format( model.__class__.__name__ ) ) assert targets is not None, ( "Label tensor can't be None. This is likely because " "{} does not implement dummy_input_and_label function".format( model.__class__.__name__ ) ) try: outputs = model(inputs) loss = criteria( input_sample=inputs, prediction=outputs, target=targets, epoch=0, iterations=0, ) print(f"Loss: {loss}") if isinstance(loss, Tensor): loss.backward() elif isinstance(loss, Dict): loss["total_loss"].backward() else: raise RuntimeError("The output of criteria should be either Dict or Tensor") # If there are unused parameters in gradient computation, print them # This may be useful for debugging purposes unused_params = [] for name, param in model.named_parameters(): if param.grad is None: unused_params.append(name) if len(unused_params) > 0: print("Unused parameters: {}".format(unused_params)) except Exception as e: if ( isinstance(e, ValueError) and str(e).find("Expected more than 1 value per channel when training") > -1 and batch_size == 1 ): # For segmentation models (e.g., PSPNet), we pool the tensor so that they have a spatial size of 1. # In such a case, batch norm needs a batch size > 1. Otherwise, we can't compute the statistics, raising # ValueError("Expected more than 1 value per channel when training"). If we encounter this error # for a batch size of 1, we skip it. pytest.skip(str(e)) else: raise e def exclude_yaml_from_test(yaml_file_path: Path) -> bool: """Check if a yaml file should be excluded from test based on first line marker. Args: yaml_file_path: path to the yaml file to check Returns: True if yaml should be excluded, and False otherwise. """ part0 = yaml_file_path.parts[0] if part0 == ".": part0 = yaml_file_path.parts[1] if part0 in ("pipeline.yaml", "results", "venv", ".tox"): return True with open(yaml_file_path, "r") as f: first_line = f.readline().rstrip() return first_line.startswith("#") and first_line.lower().replace( " ", "" ).startswith("#pytest:disable") def pytest_generate_tests(metafunc): configs = [ str(x) for x in Path(".").rglob("**/*.yaml") if not exclude_yaml_from_test(x) ] metafunc.parametrize("config_file", configs) ================================================ FILE: tests/optims/__init__.py ================================================ ================================================ FILE: tests/optims/scheduler/__init__.py ================================================ ================================================ FILE: tests/optims/scheduler/test_scheduler.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import random import sys from typing import List, Optional, Union import numpy as np import pytest sys.path.append("..") from corenet.optims.scheduler import build_scheduler from tests.configs import get_config LR_TOLERANCE = 1e-3 MAX_LRS = np.linspace(0.001, 0.1, 3) WARMUP_ITERATIONS = [None, 100, 1000, 10000] BATCH_SIZE = 100 DATASET_SIZE = 20000 def run_test( scheduler, num_epochs: int, num_batches: int, return_all_lrs: Optional[bool] = False ) -> Union[List, float]: end_lr = [] if return_all_lrs else 0.0 curr_iter = 0 for ep in range(num_epochs): for _ in range(num_batches): lr = scheduler.get_lr(ep, curr_iter=curr_iter) curr_iter += 1 # keep only epoch-wise LRs if return_all_lrs: end_lr.append(lr) else: end_lr = lr return end_lr @pytest.mark.parametrize("start_lr", MAX_LRS) @pytest.mark.parametrize("warmup_iteration", WARMUP_ITERATIONS) def test_polynomial_scheduler(start_lr, warmup_iteration, *args, **kwargs): opts = get_config() setattr(opts, "scheduler.max_iterations", 100000) setattr(opts, "scheduler.name", "polynomial") num_iterations = getattr(opts, "scheduler.max_iterations", 100000) num_batches = DATASET_SIZE // BATCH_SIZE num_epochs = num_iterations // num_batches # Test for iteration-based samplers setattr(opts, "scheduler.is_iteration_based", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) end_lr = round(start_lr / random.randint(2, 10), 5) setattr(opts, "scheduler.polynomial.start_lr", start_lr) setattr(opts, "scheduler.polynomial.end_lr", end_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE) # Test for epoch-based samplers setattr(opts, "scheduler.is_iteration_based", False) setattr(opts, "scheduler.max_epochs", num_epochs) setattr(opts, "scheduler.adjust_period_for_epochs", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) end_lr = round(start_lr / random.randint(2, 10), 5) setattr(opts, "scheduler.polynomial.start_lr", start_lr) setattr(opts, "scheduler.polynomial.end_lr", end_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE) @pytest.mark.parametrize("start_lr", MAX_LRS) @pytest.mark.parametrize("warmup_iteration", WARMUP_ITERATIONS) def test_cosine_scheduler(start_lr, warmup_iteration, *args, **kwargs): opts = get_config() setattr(opts, "scheduler.max_iterations", 100000) setattr(opts, "scheduler.name", "cosine") num_iterations = getattr(opts, "scheduler.max_iterations", 100000) num_batches = DATASET_SIZE // BATCH_SIZE num_epochs = num_iterations // num_batches # first test for iteration-based samplers setattr(opts, "scheduler.is_iteration_based", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) end_lr = round(start_lr / random.randint(2, 10), 5) setattr(opts, "scheduler.cosine.max_lr", start_lr) setattr(opts, "scheduler.cosine.min_lr", end_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE) # Test for epoch-based samplers setattr(opts, "scheduler.is_iteration_based", False) setattr(opts, "scheduler.max_epochs", num_epochs) setattr(opts, "scheduler.adjust_period_for_epochs", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) end_lr = round(start_lr / random.randint(2, 10), 5) setattr(opts, "scheduler.cosine.max_lr", start_lr) setattr(opts, "scheduler.cosine.min_lr", end_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE) @pytest.mark.parametrize("start_lr", MAX_LRS) @pytest.mark.parametrize("warmup_iteration", WARMUP_ITERATIONS) def test_fixed_scheduler(start_lr, warmup_iteration, *args, **kwargs): opts = get_config() setattr(opts, "scheduler.max_iterations", 100000) setattr(opts, "scheduler.name", "fixed") num_iterations = getattr(opts, "scheduler.max_iterations", 100000) num_batches = DATASET_SIZE // BATCH_SIZE num_epochs = num_iterations // num_batches # Test for iteration-based samplers setattr(opts, "scheduler.is_iteration_based", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) setattr(opts, "scheduler.fixed.lr", start_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(start_lr, lr, atol=LR_TOLERANCE) # Test for epoch-based samplers setattr(opts, "scheduler.is_iteration_based", False) setattr(opts, "scheduler.max_epochs", num_epochs) setattr(opts, "scheduler.adjust_period_for_epochs", True) setattr(opts, "scheduler.warmup_iterations", warmup_iteration) setattr(opts, "scheduler.fixed.lr", start_lr) scheduler = build_scheduler(opts) lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches) np.testing.assert_allclose(start_lr, lr, atol=LR_TOLERANCE) ================================================ FILE: tests/options/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/options/test_parse_args.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Any, Dict, List, Tuple, Union import pytest from corenet.options.parse_args import JsonValidator @pytest.mark.parametrize( "expected_type,valid,valid_parsed,invalid", [ (None, "null", None, "1"), (int, "1", 1, "1.0"), (float, "1.0", 1.0, '"1"'), (float, "1", 1.0, "s"), (bool, "true", True, "null"), (List[int], "[1, 2,3]", [1, 2, 3], "{1: 2}"), (List[int], "[]", [], '["s"]'), (Tuple[int, int], "[1, 2]", (1, 2), "[1, 2, 3]"), (Dict[str, Tuple[int, float]], '{"x": [1, 2]}', {"x": (1, 2.0)}, '{"x": "y"}'), (Union[Tuple[int, Any], int], "[1,null]", (1, None), "[null,1]"), (Union[Tuple[int, int], int], "1", 1, '"1"'), ], ) def test_json_validator( expected_type: type, valid: str, valid_parsed: Any, invalid: str ): parser = argparse.ArgumentParser() parser.add_argument("--x", type=JsonValidator(expected_type)) class ArgparseFailure(Exception): pass def _exit(status, message): raise ArgparseFailure(f"Unexpected argparse failure: {message}") parser.exit = ( _exit # override exit to raise exception, rather than invoking sys.exit() ) opts = parser.parse_args([f"--x={valid}"]) assert opts.x == valid_parsed assert repr(opts.x) == repr(valid_parsed) # check types with pytest.raises(ArgparseFailure): parser.parse_args([f"--x={invalid}"]) ================================================ FILE: tests/options/test_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from pathlib import Path import pytest from tests.configs import get_config def test_load_config_file_produces_no_false_warnings() -> None: get_config() def test_load_config_file_produces_true_warning( tmp_path: Path, ) -> None: config_path = tmp_path.joinpath("config.yaml") config_path.write_text("an_invalid_key: 2") with pytest.raises(ValueError, match="an_invalid_key"): get_config(str(config_path)) ================================================ FILE: tests/test_conventions.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import dataclasses import os import re import shutil import subprocess from ast import Attribute, Call, Constant, Import, ImportFrom, Name, NodeVisitor, parse from pathlib import Path from typing import Any, Callable, List import pytest class CodeConventionError(Exception): pass class CheckConventionsVisitor(NodeVisitor): def __init__(self, filename: str, *args, **kwargs) -> None: self.filename = filename super().__init__(*args, **kwargs) def visit_Import(self, node: Import) -> Any: if not self.filename.startswith("experimental"): for alias in node.names: if alias.name.startswith("experimental"): raise CodeConventionError( f"Non-experimental module {self.filename} should not import" f" experimental module {alias.name}." ) return self.generic_visit(node) # visit children def visit_ImportFrom(self, node: ImportFrom) -> Any: if not self.filename.startswith("experimental"): if node.module.startswith("experimental"): raise CodeConventionError( f"Non-experimental module {self.filename} should not import" f" experimental module {node.module}." ) return self.generic_visit(node) # visit children def visit_Call(self, node: Call) -> Any: if ( isinstance(node.func, Name) and node.func.id in ("getattr", "setattr") and len(node.args) >= 2 and isinstance(node.args[0], Name) and "opts" in node.args[0].id and isinstance(node.args[1], Constant) and isinstance(node.args[1].value, str) and "-" in node.args[1].value ): raise CodeConventionError( f"{self.filename}:{node.lineno} Please replace '-' with '_' in {node.func.id}() invocations." ) if ( isinstance(node.func, Attribute) and node.func.attr == "add_argument" and len(node.args) >= 1 and isinstance(node.args[0], Constant) and isinstance(node.args[0].value, str) and node.args[0].value.startswith("--") and "_" in node.args[0].value ): raise CodeConventionError( f"{self.filename}:{node.lineno} Please replace '_' with '-' in add_argument() invocations." ) return self.generic_visit(node) # visit children @pytest.mark.parametrize( "line,error", [ ("getattr(opts, 'x_y')", None), ("setattr(opts, 'x_y', None)", None), ("parser.add_argument('--x-y')", None), ("group.add_argument('--x-y')", None), ( "getattr(opts, 'x-y')", "Please replace '-' with '_' in getattr() invocations.", ), ( "setattr(opts, 'x-y')", "Please replace '-' with '_' in setattr() invocations.", ), ( "parser.add_argument('--x_y')", "Please replace '_' with '-' in add_argument() invocations.", ), ( "group.add_argument('--x_y')", "Please replace '_' with '-' in add_argument() invocations.", ), ], ) def test_validator(line: str, error: str) -> None: ast = parse( f""" import argparse parser = argparse.ArgumentParser() group = parser.add_argument_group() opts = parser.parse_args([]) {line} """ ) validator = CheckConventionsVisitor(filename="dummy-file") if error is None: validator.visit(ast) return with pytest.raises(CodeConventionError) as excinfo: validator.visit(ast) assert error in str( excinfo.value ), f"Expected {line} to raise CodeConventionError({error}) but it didn't." def get_python_filenames() -> List[str]: result = ( subprocess.check_output( # `git ls-files` returns list of file names tracked by git # `git ls-files --others --exclude-standard` returns list of files neither tracked nor ignored by git "(git ls-files; git ls-files --others --exclude-standard) | grep '.py$'", shell=True, universal_newlines=True, ) .strip() .splitlines(keepends=False) ) return [file for file in result if os.path.exists(file)] def test_python_filenames(): filenames = get_python_filenames() assert len(filenames) > 10 for filename in filenames: assert filename.endswith(".py"), f"filename={filename} should end with .py" @dataclasses.dataclass class ForbiddenRegex: regex: str handler: Callable[[str], str] exclude_dirs: List[str] = dataclasses.field(default_factory=list) @pytest.mark.parametrize("filename", get_python_filenames()) def test_validate_python_files(filename: str) -> None: if __file__.endswith(filename): return # errors in the current file are intentional source = Path(filename).read_text() forbidden_regexes = [ ForbiddenRegex( regex=r"collate[-_\w]+eval|eval[-_\w]+collate|dataset[-_\w]+eval|eval[-_\w]+dataset", handler=lambda match: f"To follow the standard train/val/test dataset splitting terminology, please rename " f"'{match}' to either '{match.replace('eval', 'test')}' " f"or '{match.replace('eval', 'val')}'.", ), ForbiddenRegex( regex=r"from \.|import \.", handler=lambda match: f"Please use absolute imports instead of relative ones." f" For example: 'import .models' --> 'import corenet.modeling.models'. Problematic code: '{match}'.", ), ForbiddenRegex( regex=r"class (ConvLayer|SeparableConv|TransposeConvLayer|ASPPConv|ASPPSeparableConv)\b", handler=lambda match: f"{match} is deprecated. Please remove it and use {match}2d.", ), ForbiddenRegex( regex=r"setattr\(opts.*model\.segmentation\.n_classes", handler=lambda match: f"'{match},...)' is deprecated. Please set it in config.", exclude_dirs=["tests/"], ), ] forbidden_regexes = {f"regex_{i}": item for i, item in enumerate(forbidden_regexes)} unified_regex = re.compile( "|".join( f"(?P<{name}>{item.regex})" for name, item in forbidden_regexes.items() ) ) if not filename.endswith("test_conventions.py"): match = unified_regex.search(source) if match: for name, match in match.groupdict().items(): if not match: continue for exclude_dir in forbidden_regexes[name].exclude_dirs: if filename.startswith(exclude_dir): break else: message = forbidden_regexes[name].handler(match) raise CodeConventionError(f"{message} File: {filename}.") ast = parse(source) CheckConventionsVisitor(filename=filename).visit(ast) def get_regular_filenames() -> List[str]: # All regular text files result = ( subprocess.check_output( # lists all non-empty regular (no symlinks) text files: "git grep --cached -Il '' -- '*.yaml' '*.yml' '*.py' '*.txt' '*.md' '*.json'", shell=True, universal_newlines=True, ) .strip() .splitlines(keepends=False) ) return [file for file in result if os.path.exists(file)] def test_regular_filenames(): filenames = get_regular_filenames() assert len(filenames) > 10 @pytest.mark.parametrize("filename", get_regular_filenames()) def test_no_newline_before_EOF(filename: str) -> None: source = Path(filename).read_text() if source and source[-1] != "\n": raise CodeConventionError( f"Please add a new line at the end of regular files. File: {filename}" ) def test_packages_have_init() -> None: expected_init_files = { str(Path(f).parent / "__init__.py") for f in get_python_filenames() } expected_init_files = { f for f in expected_init_files if not f.startswith("experimental/") } missing_init_files = {f for f in expected_init_files if not Path(f).exists()} missing_init_files -= {"__init__.py"} if missing_init_files: raise CodeConventionError( "Missing __init__.py files for the following python packages: " + str(missing_init_files) ) def test_formatter_versions() -> None: import black import isort constraints = Path("requirements.txt").read_text() (black_expected_version,) = re.findall(r"black==\d+.\d+.\d+", constraints) (isort_expected_version,) = re.findall(r"isort==\d+.\d+.\d+", constraints) assert black.__version__ == black_expected_version.split("==")[1], ( f"Expected {black_expected_version}, but got version" f" {black.__version__} installed." ) assert isort.__version__ == isort_expected_version.split("==")[1], ( f"Expected {isort_expected_version}, but got version" f" {isort.__version__} installed." ) requirements = Path("requirements.txt").read_text() assert black_expected_version in requirements, ( "Please make sure the version of black in requirements.txt " "matches the one installed on your system" ) assert isort_expected_version in requirements, ( "Please make sure the version of isort in requirements.txt matches " "the one installed on your system" ) ================================================ FILE: tests/test_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import re from typing import Tuple import pytest def unset_pretrained_models_from_opts(opts: argparse.Namespace) -> None: """Unset the argument corresponding to pretrained model path in opts during tests""" opts_as_dict = vars(opts) for k, v in opts_as_dict.items(): if is_pretrained_model_key(k): setattr(opts, k, None) def is_pretrained_model_key(key_name: str) -> bool: """Check if arguments corresponding to model have a pretrained key or not.""" return True if re.search(r".*model\..*\.pretrained$", key_name) else False @pytest.mark.parametrize( "key_name_expected_output", [ ("model.classification.pretrained", True), ("model.segmentation.pretrained", True), ("model.video_classification.pretrained", True), ("teacher.model.classification.pretrained", True), ("loss.classification.pretrained", False), ("model.classification.pretrained_dummy", False), ("model.classification.mypretrained", False), ("model.classification.my.pretrained", True), ], ) def test_is_pretrained_model_key(key_name_expected_output: Tuple[str, bool]): key_name = key_name_expected_output[0] expected_output = key_name_expected_output[1] assert is_pretrained_model_key(key_name) == expected_output ================================================ FILE: tests/transforms/__init__.py ================================================ ================================================ FILE: tests/transforms/test_audio.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import copy import os import shutil import tempfile import pytest import scipy.io.wavfile as wav import torch from corenet.data.transforms.audio import ( AudioResample, Gain, GaussianAudioNoise, LambdaAudio, MFCCs, Noise, Roll, SetFixedLength, StandardizeChannels, ) from tests.configs import get_config def test_mfccs(): opts = get_config() transform = MFCCs(opts) num_frames = transform.num_frames assert num_frames == 8 num_mfccs = transform.num_mfccs assert num_mfccs == 20 N, C, fps = 10, 2, 41000 audio_length = 1 # seconds audio = torch.rand(N, audio_length * fps, C) data = { "samples": { "audio": audio, "metadata": { "audio_fps": fps, }, } } result = transform(data) expected_frame_length = 11 # depends on num_frames, fps, audio_length assert result["samples"]["audio"].shape == ( N, C, num_mfccs, num_frames, expected_frame_length, ) def test_lambda_audio() -> None: opts = get_config() input = { "samples": { "audio": torch.rand( 2, 5, 1, 7 ), # arbitrary number of dimensions of arbitrary lengths "xyz": torch.rand(3, 9), # arbitrary key, value }, "targets": { "xyz2": torch.rand(4, 8), # arbitrary key, value }, } func = lambda x: (x + 1) * 2 output = LambdaAudio(opts, func)(copy.deepcopy(input)) nested_key_names = lambda dict_: {key: value.keys() for key, value in dict_.items()} assert nested_key_names(input) == nested_key_names(output) assert torch.allclose(output["samples"]["audio"], func(input["samples"]["audio"])) assert torch.allclose(output["samples"]["xyz"], input["samples"]["xyz"]) assert torch.allclose(output["targets"]["xyz2"], input["targets"]["xyz2"]) @pytest.mark.parametrize("length", [2, 3, 4]) def test_set_fixed_length(length: int) -> None: opts = get_config() setattr(opts, "audio_augmentation.set_fixed_length.length", length) transform = SetFixedLength(opts) C, N = 2, 8 x = {"samples": {"audio": torch.rand(C, N)}} output = transform(x) assert output["samples"]["audio"].shape == (C, length) @pytest.mark.parametrize("window", [0.5, 0.7]) def test_roll(window: float) -> None: torch.manual_seed(0) opts = get_config() setattr(opts, "audio_augmentation.roll.window", window) transform = Roll(opts) C, N = 2, 20 audio = torch.arange(C * N).view(C, N) x = {"samples": {"audio": audio.clone()}} output = transform(x)["samples"]["audio"] # The first parameter won't change (unless we are unlucky and the "roll" # parameter is 0). That's why we fix the seed above. assert output[0, 0] != audio[0, 0] # Make sure the first channel is just a shifted version of the original audio. assert torch.all((output[0] - output[0, 0]) % output.shape[1] == audio[0]) # Make sure the second channel has the same shift as the first. assert torch.all((output[0] - output[0, 0]) == (output[1] - (output[1, 0]))) def test_audio_resample() -> None: opts = get_config() num_clips = 2 num_samples = 32 original_fps = 32 new_fps = 8 num_channels = 2 setattr(opts, "audio_augmentation.audio_resample.audio_fps", new_fps) resample = AudioResample(opts) samples = { "audio": torch.arange(num_clips * num_samples * num_channels) .float() .view(num_clips, num_samples, num_channels), "metadata": {"audio_fps": original_fps}, } new_data = resample({"samples": samples}) assert new_data["samples"]["audio"].shape == ( num_clips, new_fps, num_channels, ) assert new_data["samples"]["metadata"]["audio_fps"] == new_fps @pytest.mark.parametrize( "in_channels, out_channels", [ (1, 1), (1, 2), (2, 1), (2, 2), ], ) def test_standardize_channels(in_channels: int, out_channels: int): opts = get_config() setattr(opts, "audio_augmentation.standardize_channels.enable", True) setattr( opts, "audio_augmentation.standardize_channels.num_channels", out_channels, ) N, T = 2, 5 data = {"samples": {"audio": torch.rand(N, T, in_channels)}} data = StandardizeChannels(opts)(data) assert data["samples"]["audio"].shape == (N, T, out_channels) @pytest.mark.parametrize("share_clip_params", [True, False]) def test_gain(share_clip_params): opts = get_config() gain_db = -20 setattr(opts, "audio_augmentation.gain.levels", [gain_db]) setattr(opts, "audio_augmentation.gain.share_clip_params", share_clip_params) augmenter = Gain(opts) # Dummy audio are between [-1, 1]. dummy_audio = 2 * (torch.rand((1, 16000)) - 0.5) dummy_audio = dummy_audio.float() data = { "samples": {"audio": dummy_audio}, "metadata": {"audio_fps": 16000}, } augmented = augmenter(data) assert data["samples"]["audio"].shape == augmented["samples"]["audio"].shape assert ( augmented["samples"]["audio"] != dummy_audio ).float().sum() > 0.99 * dummy_audio.numel() assert ( torch.abs( (augmented["samples"]["audio"] / dummy_audio).float().sum() - 10 ** (gain_db / 20) * dummy_audio.numel() ) < 0.001 ) @pytest.mark.parametrize( "audio_channels, audio_length, noise_length", [ (1, 16000, 16000), # perfect training case (2, 16000, 16000), # multichannel input audio (2, 10000, 16000), # input audio length < noise length (2, 16000, 10000), # input audio length > noise length ], ) def test_noise_augmentation(audio_channels, audio_length, noise_length): try: opts = get_config() setattr(opts, "audio_augmentation.noise.levels", [-32]) setattr(opts, "audio_augmentation.noise.cache_size", 1) setattr(opts, "audio_augmentation.noise.refresh_freq", 1) noise_file_dir = tempfile.mkdtemp() setattr( opts, "audio_augmentation.noise.files_dir", noise_file_dir, ) dummy_noise = ((torch.rand((noise_length, 1)) - 0.5) * 2).numpy() wav.write( os.path.join(noise_file_dir, "noise_sample1.wav"), data=dummy_noise, rate=16000, ) augmenter = Noise(opts) dummy_audio = (torch.rand((audio_channels, audio_length)) - 0.5) * 2 data = { "samples": {"audio": dummy_audio}, "metadata": {"audio_fps": 16000}, } augmented = augmenter(data) assert data["samples"]["audio"].shape == augmented["samples"]["audio"].shape assert ( augmented["samples"]["audio"] != dummy_audio ).float().sum() > 0.99 * dummy_audio.numel() finally: shutil.rmtree(noise_file_dir) def test_no_noise_augmentation(): # When noise.files_dir is None with pytest.raises(ValueError): opts = get_config() setattr(opts, "audio_augmentation.noise.levels", [-32]) setattr(opts, "audio_augmentation.noise.cache_size", 1) setattr(opts, "audio_augmentation.noise.refresh_freq", 1) setattr( opts, "audio_augmentation.noise.files_dir", None, ) augmenter = Noise(opts) dummy_audio = (torch.rand(-16000, 16000, (2, 32000)) - 0.5) * 2 data = { "samples": {"audio": dummy_audio.clone()}, "metadata": {"audio_fps": 16000}, } output = augmenter(data) assert torch.all(output == dummy_audio) def test_gaussian_noise_augmentation(): opts = get_config() torch.random.manual_seed(1234) scale_range = (0.001, 0.005) setattr( opts, "audio_augmentation.gaussian_noise.audio_noise_scale_range", scale_range, ) augmenter = GaussianAudioNoise(opts) dummy_audio = ( 2 * torch.rand((1, 16000, 1), dtype=torch.float32) - 1 ) # Values between -1 and 1 original_audio = copy.deepcopy(dummy_audio) data = {"samples": {"audio": dummy_audio}} augmented = augmenter(data)["samples"]["audio"] delta = augmented - original_audio assert scale_range[0] < delta.std() <= scale_range[1] ================================================ FILE: tests/transforms/test_audio_bytes.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import pytest import torch from corenet.data.transforms import audio_bytes @pytest.mark.parametrize( "format,encoding_dtype,num_samples,expected_length", [ ("wav", "float32", 4, 74), ("wav", "float32", 8, 90), ("wav", "int32", 8, 112), ("wav", "int16", 8, 60), ("wav", "uint8", 8, 52), ("mp3", None, 8, 216), ], ) def test_audio_save(format, encoding_dtype, num_samples, expected_length) -> None: opts = argparse.Namespace() setattr(opts, "audio_augmentation.torchaudio_save.encoding_dtype", encoding_dtype) setattr(opts, "audio_augmentation.torchaudio_save.format", format) setattr(opts, "audio_augmentation.torchaudio_save.backend", "sox") t = audio_bytes.TorchaudioSave(opts) x = { "samples": {"audio": torch.randn([2, num_samples])}, "metadata": {"audio_fps": 16}, } outputs = t(x)["samples"]["audio"] assert torch.all(0 <= outputs) assert torch.all(outputs <= 255) assert outputs.shape == (expected_length,) ================================================ FILE: tests/transforms/test_image.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import random from typing import Tuple, Union import pytest import torch from PIL import Image from corenet.data.transforms import image_pil as pil_transforms from corenet.data.transforms import image_torch as torch_transforms @pytest.mark.parametrize( "height, width, size", [ (24, 24, 20), (24, 24, 40), (32, 32, [20, 50]), ], ) def test_rrc_params(height: int, width: int, size: Union[int, Tuple[int, int]]) -> None: # this function tests the RandomResizedCrop Params parser = argparse.ArgumentParser() parser = pil_transforms.RandomResizedCrop.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "image_augmentation.random_resized_crop.interpolation", "bilinear") # create dummy image image = Image.new("RGB", (height, width)) # This is adapted from torchvision # https://github.com/pytorch/vision/blob/78ffda7eb952571df728e2ae49c2aca788596138/test/test_transforms.py#L308 epsilon = 0.05 min_scale = 0.25 scale_min = max(round(random.random(), 2), min_scale) scale = (scale_min, scale_min + round(random.random(), 2)) aspect_min = max(round(random.random(), 2), epsilon) aspect_ratio = (aspect_min, aspect_min + round(random.random(), 2)) setattr(opts, "image_augmentation.random_resized_crop.scale", scale) setattr(opts, "image_augmentation.random_resized_crop.aspect_ratio", aspect_ratio) random_resized_crop = pil_transforms.RandomResizedCrop(opts=opts, size=size) i, j, h, w = random_resized_crop.get_rrc_params(image) assert isinstance(i, int) assert isinstance(j, int) assert isinstance(h, int) assert isinstance(w, int) obtained_aspect_ratio = w / h # expected aspect ratio should satisfy either of following conditions (within certain margin): # 1. min(aspect_ratio) - e <= obtained_aspect_ratio <= max(aspect_ratio) + e # 2. obtained_aspect_ratio = 1. assert ( min(aspect_ratio) - epsilon <= obtained_aspect_ratio <= max(aspect_ratio) + epsilon ) or (obtained_aspect_ratio == 1.0) @pytest.mark.parametrize( "alpha, p, sample_key, target_key, batch_size", [ (-1, -0.2, None, None, 0), (-1, 0, None, None, 1), # test for inputs in tensor as well as dict format (-1, 0, "dummy_key", "dummy_key", 2), (0.0, -0.2, None, None, 0), (0.0, 0, "dummy_key", "dummy_key", 1), (0.5, 0, None, None, 2), ], ) def test_mixup_transform( alpha: float, p: float, sample_key: str, target_key: str, batch_size: int ) -> None: # this function tests the Mixup transforms parser = argparse.ArgumentParser() parser = torch_transforms.RandomMixup.add_arguments(parser) opts = parser.parse_args([]) num_classes = 10 setattr(opts, "image_augmentation.mixup.alpha", alpha) setattr(opts, "image_augmentation.mixup.p", p) setattr(opts, "image_augmentation.mixup.sample_key", sample_key) setattr(opts, "image_augmentation.mixup.target_key", target_key) # torch.roll works with batch size of 0. So, we expect to see the same shape as # input when applying mixup transforms img_tensor = torch.randn(size=(batch_size, 3, 8, 8)) label_tensor = torch.randint(low=0, high=num_classes, size=(batch_size,)) data = { "samples": img_tensor if sample_key is None else {sample_key: img_tensor}, "targets": label_tensor if target_key is None else {target_key: label_tensor}, } try: transform = torch_transforms.RandomMixup(opts, num_classes=num_classes) out = transform(data) assert {"samples", "targets"}.issubset(list(out.keys())) if sample_key is None: assert out["samples"].shape == img_tensor.shape else: assert out["samples"][sample_key].shape == img_tensor.shape if target_key is None: assert out["targets"].shape == label_tensor.shape else: assert out["targets"][target_key].shape == label_tensor.shape except AssertionError as e: if str(e) == "Alpha param can't be zero": pytest.skip(str(e)) elif ( str(e) == "Mixup probability should be between 0 and 1, where 1 is inclusive" ): pytest.skip(str(e)) @pytest.mark.parametrize( "alpha, p, sample_key, target_key, batch_size", [ (-1, -0.2, None, None, 0), (-1, 0, None, None, 1), # test for inputs in tensor as well as dict format (-1, 0, "dummy_key", "dummy_key", 2), (0.0, -0.2, None, None, 0), (0.0, 0, "dummy_key", "dummy_key", 1), (0.5, 0, None, None, 2), ], ) def test_cutmix_transform( alpha: float, p: float, sample_key: str, target_key: str, batch_size: int ) -> None: # this function tests the Cutmix transforms parser = argparse.ArgumentParser() parser = torch_transforms.RandomCutmix.add_arguments(parser) opts = parser.parse_args([]) num_classes = 10 setattr(opts, "image_augmentation.cutmix.alpha", alpha) setattr(opts, "image_augmentation.cutmix.p", p) setattr(opts, "image_augmentation.cutmix.sample_key", sample_key) setattr(opts, "image_augmentation.cutmix.target_key", target_key) # torch.roll works with batch size of 0. So, we expect to see the same shape as # input when applying mixup transforms img_tensor = torch.randn(size=(batch_size, 3, 8, 8)) label_tensor = torch.randint(low=0, high=num_classes, size=(batch_size,)) data = { "samples": img_tensor if sample_key is None else {sample_key: img_tensor}, "targets": label_tensor if target_key is None else {target_key: label_tensor}, } try: transform = torch_transforms.RandomCutmix(opts, num_classes=num_classes) out = transform(data) assert {"samples", "targets"}.issubset(list(out.keys())) if sample_key is None: assert out["samples"].shape == img_tensor.shape else: assert out["samples"][sample_key].shape == img_tensor.shape if target_key is None: assert out["targets"].shape == label_tensor.shape else: assert out["targets"][target_key].shape == label_tensor.shape except AssertionError as e: if str(e) == "Alpha param can't be zero": pytest.skip(str(e)) elif ( str(e) == "Cutmix probability should be between 0 and 1, where 1 is inclusive" ): pytest.skip(str(e)) @pytest.mark.parametrize("enable", [True, False]) @pytest.mark.parametrize("mean", [1, [1, 1, 1]]) @pytest.mark.parametrize("std", [1, [1, 1, 1]]) def test_to_tensor_normalization( enable: bool, mean: Union[int, list], std: Union[int, list] ) -> None: """ This function tests the ToTensor transform with and without mean/std normalization when the mean and std are either floats or lists. """ C, H, W = 3, 2, 2 parser = argparse.ArgumentParser() parser = pil_transforms.ToTensor.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.enable", enable) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.mean", mean) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.std", std) setattr(opts, "image_augmentation.to_tensor.dtype", "uint8") to_tensor = pil_transforms.ToTensor(opts=opts) x = torch.ones(1, C, H, W) x = x.float() data = { "image": x, } y = to_tensor(data)["image"] z = torch.zeros(1, C, H, W) if enable else x assert torch.equal(z, y) def test_to_tensor_normalization_no_mean_std() -> None: """ This function tests the ToTensor transform when men/std normalization is enabled, but the mean/std are not provided """ parser = argparse.ArgumentParser() parser = pil_transforms.ToTensor.add_arguments(parser) opts = parser.parse_args([]) setattr(opts, "image_augmentation.to_tensor.mean_std_normalization.enable", True) with pytest.raises(AssertionError): pil_transforms.ToTensor(opts=opts) ================================================ FILE: tests/transforms/test_image_bytes.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse from typing import Tuple import pytest import torch from corenet.data.transforms import image_bytes @pytest.mark.parametrize( "file_encoding,quality,expected_shape", [ ("fCHW", None, 432), ("fHWC", None, 432), ("TIFF", None, 572), ("PNG", None, 512), ("JPEG", 100, 693), ("JPEG", 50, 644), ], ) def test_pil_save(file_encoding, quality, expected_shape) -> None: opts = argparse.Namespace() setattr(opts, "image_augmentation.pil_save.file_encoding", file_encoding) setattr(opts, "image_augmentation.pil_save.quality", quality) t = image_bytes.PILSave(opts) C, H, W = 3, 12, 12 x = {"samples": torch.arange(C * H * W).view(C, H, W) / (C * H * W)} out = t(x)["samples"] assert out.shape == (expected_shape,) @pytest.mark.parametrize( "mode,stride,window_size", [ ("reverse", 8, 4), ("random_shuffle", 8, 4), ("cyclic_half_length", 8, 4), ("stride", 16, 8), ("window_shuffle", 16, 8), ], ) def test_shuffle_bytes(mode, stride, window_size) -> None: opts = argparse.Namespace() setattr(opts, "image_augmentation.shuffle_bytes.mode", mode) setattr(opts, "image_augmentation.shuffle_bytes.stride", stride) setattr(opts, "image_augmentation.shuffle_bytes.window_size", window_size) t = image_bytes.ShuffleBytes(opts) size = 32 samples = torch.randint(255, [size]) x = {"samples": samples.clone()} out = t(x)["samples"] assert torch.any(samples != out) assert samples.sum() == out.sum() # checksum @pytest.mark.parametrize("keep_frac", [1.0, 0.75, 0.50, 0.25]) def test_mask_positions(keep_frac) -> None: opts = argparse.Namespace() setattr(opts, "image_augmentation.mask_positions.keep_frac", keep_frac) setattr(opts, "dev.device", "cpu") t = image_bytes.MaskPositions(opts) size = 32 samples = torch.randint(255, [size]) x = {"samples": samples.clone()} out = t(x)["samples"] assert out.shape == (keep_frac * size,) def test_byte_permutation() -> None: opts = argparse.Namespace() t = image_bytes.BytePermutation(opts) size = 32 samples = torch.randint(255, [size]) x = {"samples": samples.clone()} out = t(x)["samples"] assert out.shape == samples.shape assert samples.unique().shape == out.unique().shape @pytest.mark.parametrize( "width_range", [ (0, 0), (-1, 1), (-5, 5), ], ) def test_byte_permutation(width_range: Tuple[int, int]) -> None: opts = argparse.Namespace() setattr(opts, "image_augmentation.random_uniform.width_range", width_range) t = image_bytes.RandomUniformNoise(opts) size = 32 samples = torch.randint(255, [size]) x = {"samples": samples.clone()} out = t(x)["samples"] assert samples.shape == out.shape if width_range == (0, 0): assert torch.all(samples == out) else: assert torch.any(samples != out) ================================================ FILE: tests/transforms/test_video.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import operator import os import random from pathlib import Path from typing import Dict, Optional, Tuple import pytest import torch from corenet.data.transforms.base_transforms import BaseTransformation from corenet.data.transforms.video import ( CropByBoundingBox, SaveInputs, ShuffleAudios, _resize_fn, ) from corenet.data.video_reader.pyav_reader import PyAVReader from tests.configs import get_config def test_resize_fn() -> None: bs = 2 sz = (10, 8) c = 3 t = 4 new_sz = (6, 4) data = { "samples": { "video": torch.randn(bs, t, c, *sz), "mask": torch.rand(bs, t, *sz), } } new_data = _resize_fn(data, size=new_sz) video = data["samples"]["video"] mask = data["samples"]["mask"] assert video.shape == (bs, t, c, *new_sz) assert mask.shape == (bs, t, *new_sz) def _non_zero_values_bounds(x: torch.Tensor) -> Tuple[float, float]: """ Returns the min and max of the non-zero values in a tensor. """ x = x.ravel() x = x[x != 0] return x.min().item(), x.max().item() @pytest.mark.parametrize("is_training", [True, False]) @pytest.mark.parametrize("multiplier_range", [(1.3, 1.5), None]) def test_crop_by_bounding_box( is_training: bool, multiplier_range: Optional[Tuple[float, float]] ) -> None: opts = get_config() image_size = (10, 10) setattr(opts, "video_augmentation.crop_by_bounding_box.image_size", image_size) setattr(opts, "video_augmentation.crop_by_bounding_box.multiplier", 1.4) # Set interpolation to "nearest", so that we can compare some of the pixel values. setattr(opts, "video_augmentation.crop_by_bounding_box.interpolation", "nearest") setattr( opts, "video_augmentation.crop_by_bounding_box.multiplier_range", multiplier_range, ) transform = CropByBoundingBox(opts, is_training=is_training) N, T, C, H, W = 2, 5, 3, 32, 32 video = torch.rand(N, T, C, H, W) box_coordinates = torch.concat( [ torch.rand(N, T, 2) * 0.5, torch.rand(N, T, 2) * 0.5 + 0.5, ], dim=2, ) MAX_VAL = 255 y, x = torch.meshgrid( torch.linspace(1, MAX_VAL, H), torch.linspace(1, MAX_VAL, W), indexing="ij" ) video[0, 0, 0, :, :] = y video[0, 0, 1, :, :] = x # The bounding box is a small horizontal strip at the bottom of the image. # Later, we have some assertions for the original x and y values of the cropped # pixels. We assert that the expanded box exceeds horizontal boundaries of the # image, but not the vertical ones. Hence, the bounding box shouldn't be too close # to the bottom edge, so that the expanded box remains within the bottom boundary. box_coordinates[0, 0, :] = torch.tensor([0, 0.7, 1, 0.8]) visible_frame_mask = torch.ones(N, T, dtype=torch.bool) # There are two kinds of invisible/invalid bounding boxes: # 1) When the bounding box has x0 == y0 == x1 == y1 == -1 coordinates. # 2) When the bounding box has valid coordinates but the area is too small (< 5 pixels). invisible_frame_1_index = (0, 3) # An arbitrary [0 0) assert torch.all(result_video[0, 0, 0, -1, 2:-2] > 0) # Check the cropped pixels' original coordinates. In video[0,0,0] and video[0,0,1], # the x and y values were stored with uniform distributions of [1, W] and [1, H]. min_y, max_y = _non_zero_values_bounds(result_video[0, 0, 0]) min_x, max_x = _non_zero_values_bounds(result_video[0, 0, 1]) # The values of 0.65, 0.75, and 0.85 are derived from y0=0.7 and y1=0.8 that are set # in box_coordinates. Maximum multiplier_range is 1.5, hence the expanded pixel # values will have y-coordinates between 0.65*MAX_VAL and 0.85*MAX_VAL. assert ( 0.65 * MAX_VAL <= min_y <= 0.75 * MAX_VAL <= max_y - 1 <= 0.85 * MAX_VAL ), "Y values are not within the expanded [0.7, 0.8] bbox." assert ( 0 * MAX_VAL <= min_x <= 0.1 * MAX_VAL <= 0.9 * MAX_VAL <= max_x <= MAX_VAL ), "X values are not within the expanded [0, 1] bbox." @pytest.mark.parametrize("numel", [5, 6]) @pytest.mark.parametrize("is_training", [True, False]) def test_shuffle_audios_single_cycle_permutation(numel: int, is_training: bool) -> None: device = torch.device("cpu") prev_perm = ShuffleAudios._single_cycle_permutation( numel, device=device, is_training=is_training ) identity = torch.arange(numel, device=device) is_random = False for _ in range(20): perm = ShuffleAudios._single_cycle_permutation( numel, device=device, is_training=is_training ) if torch.any(perm != prev_perm): is_random = True prev_perm = perm assert torch.all( perm != identity ), f"Single cycle permutation should not have identity mapping: {perm}." sorted_perm, _ = perm.sort() assert torch.all( sorted_perm == identity ), f"Result is not a permutation: {perm}." assert is_random == is_training, "Outcomes should be random iff is_training." @pytest.mark.parametrize( "N, mode, shuffle_ratio, generate_frame_level_targets, debug_mode", [ (1000, "train", 0.2, True, False), (1000, "val", 0.3, False, False), (1000, "test", 0.7, True, True), (1, "train", 0.2, False, False), (1, "val", 0.2, False, False), ], ) def test_shuffle_audios( N: int, mode: str, shuffle_ratio: float, generate_frame_level_targets: bool, debug_mode: bool, ) -> None: opts = get_config() setattr( opts, f"video_augmentation.shuffle_audios.shuffle_ratio_{mode}", shuffle_ratio, ) setattr( opts, "video_augmentation.shuffle_audios.generate_frame_level_targets", generate_frame_level_targets, ) setattr( opts, "video_augmentation.shuffle_audios.debug_mode", debug_mode, ) C_v, C_a = 3, 2 H, W = 8, 8 num_video_frames = 3 num_audio_frames = 5 video = torch.rand(N, num_video_frames, C_v, H, W) # Generating unique audio elements (using torch.arange) so that we can compare them to check if they are shuffled. input_audio = torch.empty(N, num_audio_frames, C_a, dtype=torch.float) torch.arange(input_audio.numel(), dtype=torch.float, out=input_audio) data = { "samples": { "video": video, "audio": input_audio.clone(), "metadata": {}, }, "targets": {}, } result = ShuffleAudios( opts=opts, is_training=mode == "train", is_evaluation=mode == "test", item_index=0, )(data) labels = data["targets"]["is_shuffled"] assert ( labels.shape == (N, num_video_frames) if generate_frame_level_targets else (N,) ) if generate_frame_level_targets: assert torch.all( labels == labels[:, :1].repeat(1, num_video_frames) ), "Labels should be identical among frames of the same clip." result_is_shuffled = ( (~torch.isclose(input_audio, result["samples"]["audio"])) .float() # shape: N x num_audio_frames x C_a .mean(axis=1) # shape: N x C_a .mean(axis=1) # shape: N ) actual_participation_ratio = result_is_shuffled.float().mean() if N > 1: assert actual_participation_ratio == pytest.approx(shuffle_ratio, abs=0.05) else: assert actual_participation_ratio == pytest.approx(0.0, abs=0.05) assert torch.allclose( result_is_shuffled, (labels[:, 0] if generate_frame_level_targets else labels).float(), ), "Generated labels should match shuffled audios." if debug_mode: assert data["samples"]["metadata"]["shuffled_audio_permutation"].shape == (N,) else: assert "shuffled_audio_permutation" not in data["samples"]["metadata"] @pytest.mark.parametrize( "t,expected", [ (0, "00:00:0,000"), (0.5, "00:00:0,500"), (10.5, "00:00:10,500"), (70.5, "00:01:10,500"), (7270.5, "02:01:10,500"), ], ) def test_save_inputs_srt_format_timestamp(t: float, expected: str) -> None: assert SaveInputs._srt_format_timestamp(t) == expected @pytest.mark.parametrize( "params", [ { "opts": {}, "init_kwargs": {}, "expected_output_count": 1, "video_only": False, }, { "opts": {}, "init_kwargs": { "get_frame_captions": ( lambda data: ["_"] * operator.mul(*data["samples"]["video"].shape[:2]) ) }, "expected_output_count": 1, "video_only": False, }, { "opts": {"video_augmentation.save_inputs.symlink_to_original": True}, "init_kwargs": {}, "expected_output_count": 2, "video_only": True, }, ], ) def test_save_inputs( params: Tuple[Dict, Dict], tmp_path: Path, ) -> None: opts = get_config() setattr(opts, "video_augmentation.save_inputs.enable", True) setattr(opts, "video_augmentation.save_inputs.save_dir", str(tmp_path)) for key, value in params["opts"].items(): setattr(opts, key, value) data = { "samples": PyAVReader(opts).dummy_audio_video_clips( clips_per_video=2, num_frames_to_sample=3, height=24, width=24, ) } if params["video_only"]: del data["samples"]["audio"] SaveInputs(opts, **params["init_kwargs"])(data) output_video_paths = list(tmp_path.glob("*/*.mp4")) assert len(output_video_paths) == params["expected_output_count"], ( f"Expected {params['expected_output_count']} videos, but got:" f" {output_video_paths}." ) for output_video_path in output_video_paths: if output_video_path.is_symlink(): continue assert os.stat(output_video_path).st_size > 1000, ( f"The generated file ({output_video_path}) is too small" f" ({os.stat(output_video_path).st_size})." ) ================================================ FILE: tests/utils/__init__.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # ================================================ FILE: tests/utils/test_check.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import unittest from corenet.utils.check import check class TestCheck(unittest.TestCase): def test_ok(self): check(True) check(1) check([1]) def test_fail(self): with self.assertRaises(AssertionError): check(False) with self.assertRaises(AssertionError): check(0) with self.assertRaises(AssertionError): check([]) def test_custom_raise(self): with self.assertRaisesRegex(AssertionError, "phooey"): check(False, "phooey") with self.assertRaisesRegex(ValueError, "phooey"): check(False, ValueError("phooey")) with self.assertRaisesRegex(AssertionError, "phooey"): check(False, lambda: "phooey") with self.assertRaisesRegex(ValueError, "phooey"): check(False, lambda: ValueError("phooey")) with self.assertRaisesRegex(AssertionError, "phooey: 0"): check(0, lambda x: f"phooey: {x}") with self.assertRaisesRegex(ValueError, "phooey: 0"): check(0, lambda x: ValueError(f"phooey: {x}")) ================================================ FILE: tests/utils/test_common_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import torch import torch.distributed as dist from corenet.utils.common_utils import unwrap_model_fn def check_models( original_unwrapped_model: torch.nn.Module, model_after_unwrapping: torch.nn.Module ) -> None: """Helper function to test original and unwrapped models are the same.""" for layer_id in range(len(original_unwrapped_model)): # for unwrapped models, we should be able to index them assert repr(model_after_unwrapping[layer_id]) == repr( original_unwrapped_model[layer_id] ) def test_unwrap_model_fn(): """Test for unwrap_model_fn""" dummy_model = torch.nn.Sequential( torch.nn.Linear(10, 20), torch.nn.Linear(20, 40), ) # test DataParallel wrapping wrapped_model_dp = torch.nn.DataParallel(dummy_model) unwrapped_model_dp = unwrap_model_fn(wrapped_model_dp) check_models(dummy_model, unwrapped_model_dp) # Initialize the distributed environment os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "1234" dist.init_process_group(backend="gloo", rank=0, world_size=1) # test DDP wrapping wrapped_model_ddp = torch.nn.parallel.DistributedDataParallel(dummy_model) unwrapped_model_ddp = unwrap_model_fn(wrapped_model_ddp) check_models(dummy_model, unwrapped_model_ddp) # clean up DDP environment dist.destroy_process_group() ================================================ FILE: tests/utils/test_dict_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from corenet.utils.dict_utils import filter_keys def test_extract_keys(): d = {"x": 2, "y": 3, "z": 4} assert filter_keys(d, ["x", "y"]) == {"x": 2, "y": 3} assert filter_keys(d, ["w"]) == {} ================================================ FILE: tests/utils/test_download_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # from typing import Any, List import pytest from corenet.options.opts import get_training_arguments from corenet.utils.download_utils import download_assets_in_parallel def dummy_download_fn(index: int, local_dst_dir: str, args, kwargs) -> None: """Dummy download function. Tests if kwargs passed from 'download_assets_in_parallel' can be accessed inside 'dummy_download_fn'. """ dummy_kwarg_data = kwargs.get("dummy_kwarg") # Indexing should not raise an error. dummy_kwarg_data[index] @pytest.mark.parametrize("asset_names", [["a", "b", "c", "d", "e"], [1, 2, 3], [1]]) def test_download_assets_in_parallel(asset_names: List[Any]) -> None: """Test for download_assets_in_parallel function. Args: asset_names: A list of assets that are handled by 'download_func' in 'download_assets_in_parallel'. """ function_kwargs = {"dummy_kwarg": asset_names} opts = get_training_arguments(parse_args=True, args=[]) record_indices = download_assets_in_parallel( opts=opts, local_dst_dir="trash/dummy_test", num_assets=len(asset_names), download_func=dummy_download_fn, **function_kwargs, ) assert len(record_indices) == len(asset_names) ================================================ FILE: tests/utils/test_file_logger.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import tempfile import pytest import torch from corenet.utils.file_logger import FileLogger @pytest.mark.parametrize( "metric_name, epoch1, value1, epoch2, value2", [("metric", 0, 1.0, 1, 2.0), ("metric2", 5, 1.0, 6, 2.0)], ) def test_file_logger( metric_name: str, epoch1: int, value1: float, epoch2: int, value2: float ) -> None: with tempfile.TemporaryDirectory() as tempdir: # Case 1: The file doesn't exist. filename = os.path.join(tempdir, "stats.pt") logger = FileLogger(filename) logger.add_scalar(metric_name, value1, epoch1) logger.close() assert os.path.exists(filename) a = torch.load(filename) assert a == {"epochs": {epoch1: {"metrics": {metric_name: value1}}}} # Case 2: The file does exist. logger = FileLogger(filename) logger.add_scalar(metric_name, value2, epoch2) logger.close() a = torch.load(filename) assert a == { "epochs": { epoch1: {"metrics": {metric_name: value1}}, epoch2: {"metrics": {metric_name: value2}}, } } ================================================ FILE: tests/utils/test_import_utils.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import os import subprocess import sys from pathlib import Path from pytest_mock import MockerFixture from corenet.utils import import_utils from corenet.utils.import_utils import import_modules_from_folder def test_import_utils(tmp_path: Path, mocker: MockerFixture) -> None: tmp_path_str = str(tmp_path) sys.path.append(tmp_path_str) mocker.patch.object(import_utils, "LIBRARY_ROOT", tmp_path) try: files = [ "my_test_parent/child/module.py", "my_test_parent/child/nested/module.py", "my_test_parent/sibling.py", "my_internal/my_test_parent/child/module.py", "my_internal/my_test_parent/sibling.py", "my_internal/projects/A/my_test_parent/child/module.py", "my_internal/projects/B/my_test_parent/child/module.py", ] for path in files: path = tmp_path / path for package in path.parents: if package == tmp_path: break package.mkdir(exist_ok=True, parents=True) if not package.joinpath("__init__.py").exists(): package.joinpath("__init__.py").write_bytes(b"") path.write_bytes(b"") import_modules_from_folder( "my_test_parent/child", extra_roots=["my_internal", "my_internal/projects/*"], ) assert "my_test_parent.child.module" in sys.modules assert "my_test_parent.child.nested.module" in sys.modules assert "my_test_parent.sibling" not in sys.modules assert "my_internal.my_test_parent.child.module" in sys.modules assert "my_internal.my_test_parent.sibling" not in sys.modules assert "my_internal.projects.A.my_test_parent.child.module" in sys.modules assert "my_internal.projects.B.my_test_parent.child.module" in sys.modules finally: sys.path.remove(tmp_path_str) def test_ensure_pythonpath_is_not_required(): """ In addition to the "corenet" folder, "tests" and "experimental" folders also contain python modules that are occasionally imported by certain entrypoints. In contrast with ``corenet.*``, that can be imported without ``PYTHONPATH=.`` environment variable, ``tests.*`` and ``experimental.*`` require setting ``PYTHONPATH=.`` because ``pip install [-e] .`` only install ``corenet/**/*.py``. For project-specific code, users can set `PYTHONPATH=.` and import stuff from `tests.*` or `experimental.*`. However, we should ensure that the core functionality of CoreNet does not import from `tests.*` and `experimental.*`. Otherwise, CoreNet will fail in environments that `PYTHONPATH=.` is not set. In this test, invoke `import_core_modules()` in an isolated python process and assert that core functionality of CoreNet doesn't import anything from `tests.*` or `experimental.*`. """ subprocess.check_call( [ "python", "-c", """\ import sys from corenet.utils.import_utils import import_core_modules import_core_modules() for module_name in sys.modules: assert not module_name.startswith("tests"), "CoreNet modules shall not import from tests." assert not module_name.startswith("experimental"), "CoreNet modules shall not import from experimental." """, ], # It is fine to import stuff from tests/ only in test environment. # We simulate running corenet outside of the test environment, so that we can # allow modules to import stuff from tests/ only during tests. env={k: v for k, v in os.environ.items() if k != "CORENET_ENTRYPOINT"}, ) ================================================ FILE: tools/__init__.py ================================================ ================================================ FILE: tools/converter_coco_stuff.py ================================================ # # For licensing see accompanying LICENSE file. # Copyright (C) 2024 Apple Inc. All Rights Reserved. # import argparse import copy import glob import os from glob import glob from pathlib import Path import numpy as np from joblib import Parallel, delayed from PIL import Image from tqdm import tqdm from corenet.utils import logger # State-of-the-art models use 171 classes for COCO-Stuff. This is because some of the labels defined in # COCO-Stuff are not annotated. So, 182 cocostuff labels are remapped to 171 labels. _cocostuff_remap_info = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 26: 24, 27: 25, 30: 26, 31: 27, 32: 28, 33: 29, 34: 30, 35: 31, 36: 32, 37: 33, 38: 34, 39: 35, 40: 36, 41: 37, 42: 38, 43: 39, 45: 40, 46: 41, 47: 42, 48: 43, 49: 44, 50: 45, 51: 46, 52: 47, 53: 48, 54: 49, 55: 50, 56: 51, 57: 52, 58: 53, 59: 54, 60: 55, 61: 56, 62: 57, 63: 58, 64: 59, 66: 60, 69: 61, 71: 62, 72: 63, 73: 64, 74: 65, 75: 66, 76: 67, 77: 68, 78: 69, 79: 70, 80: 71, 81: 72, 83: 73, 84: 74, 85: 75, 86: 76, 87: 77, 88: 78, 89: 79, 91: 80, 92: 81, 93: 82, 94: 83, 95: 84, 96: 85, 97: 86, 98: 87, 99: 88, 100: 89, 101: 90, 102: 91, 103: 92, 104: 93, 105: 94, 106: 95, 107: 96, 108: 97, 109: 98, 110: 99, 111: 100, 112: 101, 113: 102, 114: 103, 115: 104, 116: 105, 117: 106, 118: 107, 119: 108, 120: 109, 121: 110, 122: 111, 123: 112, 124: 113, 125: 114, 126: 115, 127: 116, 128: 117, 129: 118, 130: 119, 131: 120, 132: 121, 133: 122, 134: 123, 135: 124, 136: 125, 137: 126, 138: 127, 139: 128, 140: 129, 141: 130, 142: 131, 143: 132, 144: 133, 145: 134, 146: 135, 147: 136, 148: 137, 149: 138, 150: 139, 151: 140, 152: 141, 153: 142, 154: 143, 155: 144, 156: 145, 157: 146, 158: 147, 159: 148, 160: 149, 161: 150, 162: 151, 163: 152, 164: 153, 165: 154, 166: 155, 167: 156, 168: 157, 169: 158, 170: 159, 171: 160, 172: 161, 173: 162, 174: 163, 175: 164, 176: 165, 177: 166, 178: 167, 179: 168, 180: 169, 181: 170, # 255 is not a label and is ignored during training. 255: 255, } def remove_unannotated_mask_labels(src_path: str, dst_path: str) -> None: """Remap cocostuff labels. Args: src_path: File path of the mask image. dst_path: File path of the remapped mask image. """ mask_np = np.array(Image.open(src_path)) mask_copy = copy.deepcopy(mask_np) for old_id, new_id in _cocostuff_remap_info.items(): mask_copy[mask_np == old_id] = new_id mask_pil = Image.fromarray(mask_copy) mask_pil.save(dst_path, "png") def main(opts: argparse.Namespace) -> None: """ Main function to remap COCOStuff labels. Args: opts: Command-line arguments. """ src_dir = getattr(opts, "src_dir") src_sub_directories = [x[0] for x in os.walk(src_dir)] if not set( [os.path.join(f"{src_dir}", "train2017"), os.path.join(f"{src_dir}", "val2017")] ).issubset(src_sub_directories): logger.error( f"Src directory must contain {src_dir}/train2017 and {src_dir}/val2017 subdirectories with annotations. Got: {src_sub_directories}" ) dst_dir = src_dir + "_remap" Path(dst_dir).mkdir(parents=True, exist_ok=True) n_jobs = getattr(opts, "num_jobs") for sub_dir in ["train2017", "val2017"]: Path(os.path.join(dst_dir, sub_dir)).mkdir(parents=True, exist_ok=True) src_png_files = glob.glob(f"{os.path.join(src_dir, sub_dir)}/*.png") dst_ping_files = [ os.path.join(dst_dir, sub_dir, os.path.basename(src_png_file)) for src_png_file in src_png_files ] Parallel(n_jobs=n_jobs)( delayed(remove_unannotated_mask_labels)(src_mask_path, dst_mask_path) for src_mask_path, dst_mask_path in tqdm(zip(src_png_files, dst_ping_files)) ) logger.info(f"Done processing {sub_dir}.") if __name__ == "__main__": parser = argparse.ArgumentParser("Remap COCO-Stuff labels") parser.add_argument( "--src-dir", type=str, required=True, help="Source directory that contains the train2017 and val2017 annotation folders.", ) parser.add_argument( "--num-jobs", type=int, default=-1, help="Number of jobs for processing data in parallel with joblib. Defaults to -1 (i.e., use all CPUs).", ) opts = parser.parse_args() main(opts) ================================================ FILE: tox.ini ================================================ [tox] envlist = darwin, linux [testenv] deps = -r requirements.txt -r requirements-optional.txt -r mlx_examples/requirements.txt commands = make test-all extra_args="--ignore=corenet/internal --ignore=tests/internal --ignore=experimental" allowlist_externals = make [testenv:darwin] platform = darwin # Use Python 3.9 on macOS (Mac OS 14.4 system Python version) basepython = python3.9 setenv = DYLD_LIBRARY_PATH=/opt/homebrew/lib deps = {[testenv]deps} commands = {[testenv]commands} [testenv:linux] platform = linux # Use Python 3.10 on Linux (Ubuntu 22.04 system Python version) basepython = python3.10 deps = {[testenv]deps} commands = {[testenv]commands} ================================================ FILE: tutorials/clip.ipynb ================================================ { "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# CLIP: Contrastive Language Image Pre-training Inference Demo\n", "\n", "This example shows the usage of a pre-trained CLIP with ViT-B/16 as an image encoder for the task of zero-shot image classification. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Create the model\n", "Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-15 11:41:15 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['cls_token', 'neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'patch_emb.0.block.conv.weight', 'patch_emb.0.block.norm.weight', 'patch_emb.0.block.norm.bias', 'patch_emb.1.block.conv.weight', 'patch_emb.1.block.norm.weight', 'patch_emb.1.block.norm.bias', 'patch_emb.2.block.conv.weight', 'patch_emb.2.block.conv.bias', 'post_transformer_norm.weight', 'post_transformer_norm.bias', 'transformer.0.pre_norm_mha.0.weight', 'transformer.0.pre_norm_mha.0.bias', 'transformer.0.pre_norm_mha.1.qkv_proj.weight', 'transformer.0.pre_norm_mha.1.qkv_proj.bias', 'transformer.0.pre_norm_mha.1.out_proj.weight', 'transformer.0.pre_norm_mha.1.out_proj.bias', 'transformer.0.pre_norm_ffn.0.weight', 'transformer.0.pre_norm_ffn.0.bias', 'transformer.0.pre_norm_ffn.1.weight', 'transformer.0.pre_norm_ffn.1.bias', 'transformer.0.pre_norm_ffn.4.weight', 'transformer.0.pre_norm_ffn.4.bias', 'transformer.1.pre_norm_mha.0.weight', 'transformer.1.pre_norm_mha.0.bias', 'transformer.1.pre_norm_mha.1.qkv_proj.weight', 'transformer.1.pre_norm_mha.1.qkv_proj.bias', 'transformer.1.pre_norm_mha.1.out_proj.weight', 'transformer.1.pre_norm_mha.1.out_proj.bias', 'transformer.1.pre_norm_ffn.0.weight', 'transformer.1.pre_norm_ffn.0.bias', 'transformer.1.pre_norm_ffn.1.weight', 'transformer.1.pre_norm_ffn.1.bias', 'transformer.1.pre_norm_ffn.4.weight', 'transformer.1.pre_norm_ffn.4.bias', 'transformer.2.pre_norm_mha.0.weight', 'transformer.2.pre_norm_mha.0.bias', 'transformer.2.pre_norm_mha.1.qkv_proj.weight', 'transformer.2.pre_norm_mha.1.qkv_proj.bias', 'transformer.2.pre_norm_mha.1.out_proj.weight', 'transformer.2.pre_norm_mha.1.out_proj.bias', 'transformer.2.pre_norm_ffn.0.weight', 'transformer.2.pre_norm_ffn.0.bias', 'transformer.2.pre_norm_ffn.1.weight', 'transformer.2.pre_norm_ffn.1.bias', 'transformer.2.pre_norm_ffn.4.weight', 'transformer.2.pre_norm_ffn.4.bias', 'transformer.3.pre_norm_mha.0.weight', 'transformer.3.pre_norm_mha.0.bias', 'transformer.3.pre_norm_mha.1.qkv_proj.weight', 'transformer.3.pre_norm_mha.1.qkv_proj.bias', 'transformer.3.pre_norm_mha.1.out_proj.weight', 'transformer.3.pre_norm_mha.1.out_proj.bias', 'transformer.3.pre_norm_ffn.0.weight', 'transformer.3.pre_norm_ffn.0.bias', 'transformer.3.pre_norm_ffn.1.weight', 'transformer.3.pre_norm_ffn.1.bias', 'transformer.3.pre_norm_ffn.4.weight', 'transformer.3.pre_norm_ffn.4.bias', 'transformer.4.pre_norm_mha.0.weight', 'transformer.4.pre_norm_mha.0.bias', 'transformer.4.pre_norm_mha.1.qkv_proj.weight', 'transformer.4.pre_norm_mha.1.qkv_proj.bias', 'transformer.4.pre_norm_mha.1.out_proj.weight', 'transformer.4.pre_norm_mha.1.out_proj.bias', 'transformer.4.pre_norm_ffn.0.weight', 'transformer.4.pre_norm_ffn.0.bias', 'transformer.4.pre_norm_ffn.1.weight', 'transformer.4.pre_norm_ffn.1.bias', 'transformer.4.pre_norm_ffn.4.weight', 'transformer.4.pre_norm_ffn.4.bias', 'transformer.5.pre_norm_mha.0.weight', 'transformer.5.pre_norm_mha.0.bias', 'transformer.5.pre_norm_mha.1.qkv_proj.weight', 'transformer.5.pre_norm_mha.1.qkv_proj.bias', 'transformer.5.pre_norm_mha.1.out_proj.weight', 'transformer.5.pre_norm_mha.1.out_proj.bias', 'transformer.5.pre_norm_ffn.0.weight', 'transformer.5.pre_norm_ffn.0.bias', 'transformer.5.pre_norm_ffn.1.weight', 'transformer.5.pre_norm_ffn.1.bias', 'transformer.5.pre_norm_ffn.4.weight', 'transformer.5.pre_norm_ffn.4.bias', 'transformer.6.pre_norm_mha.0.weight', 'transformer.6.pre_norm_mha.0.bias', 'transformer.6.pre_norm_mha.1.qkv_proj.weight', 'transformer.6.pre_norm_mha.1.qkv_proj.bias', 'transformer.6.pre_norm_mha.1.out_proj.weight', 'transformer.6.pre_norm_mha.1.out_proj.bias', 'transformer.6.pre_norm_ffn.0.weight', 'transformer.6.pre_norm_ffn.0.bias', 'transformer.6.pre_norm_ffn.1.weight', 'transformer.6.pre_norm_ffn.1.bias', 'transformer.6.pre_norm_ffn.4.weight', 'transformer.6.pre_norm_ffn.4.bias', 'transformer.7.pre_norm_mha.0.weight', 'transformer.7.pre_norm_mha.0.bias', 'transformer.7.pre_norm_mha.1.qkv_proj.weight', 'transformer.7.pre_norm_mha.1.qkv_proj.bias', 'transformer.7.pre_norm_mha.1.out_proj.weight', 'transformer.7.pre_norm_mha.1.out_proj.bias', 'transformer.7.pre_norm_ffn.0.weight', 'transformer.7.pre_norm_ffn.0.bias', 'transformer.7.pre_norm_ffn.1.weight', 'transformer.7.pre_norm_ffn.1.bias', 'transformer.7.pre_norm_ffn.4.weight', 'transformer.7.pre_norm_ffn.4.bias', 'transformer.8.pre_norm_mha.0.weight', 'transformer.8.pre_norm_mha.0.bias', 'transformer.8.pre_norm_mha.1.qkv_proj.weight', 'transformer.8.pre_norm_mha.1.qkv_proj.bias', 'transformer.8.pre_norm_mha.1.out_proj.weight', 'transformer.8.pre_norm_mha.1.out_proj.bias', 'transformer.8.pre_norm_ffn.0.weight', 'transformer.8.pre_norm_ffn.0.bias', 'transformer.8.pre_norm_ffn.1.weight', 'transformer.8.pre_norm_ffn.1.bias', 'transformer.8.pre_norm_ffn.4.weight', 'transformer.8.pre_norm_ffn.4.bias', 'transformer.9.pre_norm_mha.0.weight', 'transformer.9.pre_norm_mha.0.bias', 'transformer.9.pre_norm_mha.1.qkv_proj.weight', 'transformer.9.pre_norm_mha.1.qkv_proj.bias', 'transformer.9.pre_norm_mha.1.out_proj.weight', 'transformer.9.pre_norm_mha.1.out_proj.bias', 'transformer.9.pre_norm_ffn.0.weight', 'transformer.9.pre_norm_ffn.0.bias', 'transformer.9.pre_norm_ffn.1.weight', 'transformer.9.pre_norm_ffn.1.bias', 'transformer.9.pre_norm_ffn.4.weight', 'transformer.9.pre_norm_ffn.4.bias', 'transformer.10.pre_norm_mha.0.weight', 'transformer.10.pre_norm_mha.0.bias', 'transformer.10.pre_norm_mha.1.qkv_proj.weight', 'transformer.10.pre_norm_mha.1.qkv_proj.bias', 'transformer.10.pre_norm_mha.1.out_proj.weight', 'transformer.10.pre_norm_mha.1.out_proj.bias', 'transformer.10.pre_norm_ffn.0.weight', 'transformer.10.pre_norm_ffn.0.bias', 'transformer.10.pre_norm_ffn.1.weight', 'transformer.10.pre_norm_ffn.1.bias', 'transformer.10.pre_norm_ffn.4.weight', 'transformer.10.pre_norm_ffn.4.bias', 'transformer.11.pre_norm_mha.0.weight', 'transformer.11.pre_norm_mha.0.bias', 'transformer.11.pre_norm_mha.1.qkv_proj.weight', 'transformer.11.pre_norm_mha.1.qkv_proj.bias', 'transformer.11.pre_norm_mha.1.out_proj.weight', 'transformer.11.pre_norm_mha.1.out_proj.bias', 'transformer.11.pre_norm_ffn.0.weight', 'transformer.11.pre_norm_ffn.0.bias', 'transformer.11.pre_norm_ffn.1.weight', 'transformer.11.pre_norm_ffn.1.bias', 'transformer.11.pre_norm_ffn.4.weight', 'transformer.11.pre_norm_ffn.4.bias', 'classifier.weight', 'classifier.bias', 'pos_embed.pos_embed.pos_embed']\n", "2024-04-15 11:42:11 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\n", "2024-04-15 11:42:11 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['image_encoder.cls_token', 'image_encoder.neural_augmentor.brightness._low', 'image_encoder.neural_augmentor.brightness._high', 'image_encoder.neural_augmentor.contrast._low', 'image_encoder.neural_augmentor.contrast._high', 'image_encoder.neural_augmentor.noise._low', 'image_encoder.neural_augmentor.noise._high', 'image_encoder.patch_emb.0.block.conv.weight', 'image_encoder.patch_emb.0.block.norm.weight', 'image_encoder.patch_emb.0.block.norm.bias', 'image_encoder.patch_emb.1.block.conv.weight', 'image_encoder.patch_emb.1.block.norm.weight', 'image_encoder.patch_emb.1.block.norm.bias', 'image_encoder.patch_emb.2.block.conv.weight', 'image_encoder.patch_emb.2.block.conv.bias', 'image_encoder.post_transformer_norm.weight', 'image_encoder.post_transformer_norm.bias', 'image_encoder.transformer.0.pre_norm_mha.0.weight', 'image_encoder.transformer.0.pre_norm_mha.0.bias', 'image_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.0.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.0.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.0.pre_norm_ffn.0.weight', 'image_encoder.transformer.0.pre_norm_ffn.0.bias', 'image_encoder.transformer.0.pre_norm_ffn.1.weight', 'image_encoder.transformer.0.pre_norm_ffn.1.bias', 'image_encoder.transformer.0.pre_norm_ffn.4.weight', 'image_encoder.transformer.0.pre_norm_ffn.4.bias', 'image_encoder.transformer.1.pre_norm_mha.0.weight', 'image_encoder.transformer.1.pre_norm_mha.0.bias', 'image_encoder.transformer.1.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.1.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.1.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.1.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.1.pre_norm_ffn.0.weight', 'image_encoder.transformer.1.pre_norm_ffn.0.bias', 'image_encoder.transformer.1.pre_norm_ffn.1.weight', 'image_encoder.transformer.1.pre_norm_ffn.1.bias', 'image_encoder.transformer.1.pre_norm_ffn.4.weight', 'image_encoder.transformer.1.pre_norm_ffn.4.bias', 'image_encoder.transformer.2.pre_norm_mha.0.weight', 'image_encoder.transformer.2.pre_norm_mha.0.bias', 'image_encoder.transformer.2.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.2.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.2.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.2.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.2.pre_norm_ffn.0.weight', 'image_encoder.transformer.2.pre_norm_ffn.0.bias', 'image_encoder.transformer.2.pre_norm_ffn.1.weight', 'image_encoder.transformer.2.pre_norm_ffn.1.bias', 'image_encoder.transformer.2.pre_norm_ffn.4.weight', 'image_encoder.transformer.2.pre_norm_ffn.4.bias', 'image_encoder.transformer.3.pre_norm_mha.0.weight', 'image_encoder.transformer.3.pre_norm_mha.0.bias', 'image_encoder.transformer.3.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.3.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.3.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.3.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.3.pre_norm_ffn.0.weight', 'image_encoder.transformer.3.pre_norm_ffn.0.bias', 'image_encoder.transformer.3.pre_norm_ffn.1.weight', 'image_encoder.transformer.3.pre_norm_ffn.1.bias', 'image_encoder.transformer.3.pre_norm_ffn.4.weight', 'image_encoder.transformer.3.pre_norm_ffn.4.bias', 'image_encoder.transformer.4.pre_norm_mha.0.weight', 'image_encoder.transformer.4.pre_norm_mha.0.bias', 'image_encoder.transformer.4.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.4.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.4.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.4.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.4.pre_norm_ffn.0.weight', 'image_encoder.transformer.4.pre_norm_ffn.0.bias', 'image_encoder.transformer.4.pre_norm_ffn.1.weight', 'image_encoder.transformer.4.pre_norm_ffn.1.bias', 'image_encoder.transformer.4.pre_norm_ffn.4.weight', 'image_encoder.transformer.4.pre_norm_ffn.4.bias', 'image_encoder.transformer.5.pre_norm_mha.0.weight', 'image_encoder.transformer.5.pre_norm_mha.0.bias', 'image_encoder.transformer.5.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.5.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.5.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.5.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.5.pre_norm_ffn.0.weight', 'image_encoder.transformer.5.pre_norm_ffn.0.bias', 'image_encoder.transformer.5.pre_norm_ffn.1.weight', 'image_encoder.transformer.5.pre_norm_ffn.1.bias', 'image_encoder.transformer.5.pre_norm_ffn.4.weight', 'image_encoder.transformer.5.pre_norm_ffn.4.bias', 'image_encoder.transformer.6.pre_norm_mha.0.weight', 'image_encoder.transformer.6.pre_norm_mha.0.bias', 'image_encoder.transformer.6.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.6.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.6.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.6.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.6.pre_norm_ffn.0.weight', 'image_encoder.transformer.6.pre_norm_ffn.0.bias', 'image_encoder.transformer.6.pre_norm_ffn.1.weight', 'image_encoder.transformer.6.pre_norm_ffn.1.bias', 'image_encoder.transformer.6.pre_norm_ffn.4.weight', 'image_encoder.transformer.6.pre_norm_ffn.4.bias', 'image_encoder.transformer.7.pre_norm_mha.0.weight', 'image_encoder.transformer.7.pre_norm_mha.0.bias', 'image_encoder.transformer.7.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.7.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.7.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.7.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.7.pre_norm_ffn.0.weight', 'image_encoder.transformer.7.pre_norm_ffn.0.bias', 'image_encoder.transformer.7.pre_norm_ffn.1.weight', 'image_encoder.transformer.7.pre_norm_ffn.1.bias', 'image_encoder.transformer.7.pre_norm_ffn.4.weight', 'image_encoder.transformer.7.pre_norm_ffn.4.bias', 'image_encoder.transformer.8.pre_norm_mha.0.weight', 'image_encoder.transformer.8.pre_norm_mha.0.bias', 'image_encoder.transformer.8.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.8.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.8.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.8.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.8.pre_norm_ffn.0.weight', 'image_encoder.transformer.8.pre_norm_ffn.0.bias', 'image_encoder.transformer.8.pre_norm_ffn.1.weight', 'image_encoder.transformer.8.pre_norm_ffn.1.bias', 'image_encoder.transformer.8.pre_norm_ffn.4.weight', 'image_encoder.transformer.8.pre_norm_ffn.4.bias', 'image_encoder.transformer.9.pre_norm_mha.0.weight', 'image_encoder.transformer.9.pre_norm_mha.0.bias', 'image_encoder.transformer.9.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.9.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.9.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.9.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.9.pre_norm_ffn.0.weight', 'image_encoder.transformer.9.pre_norm_ffn.0.bias', 'image_encoder.transformer.9.pre_norm_ffn.1.weight', 'image_encoder.transformer.9.pre_norm_ffn.1.bias', 'image_encoder.transformer.9.pre_norm_ffn.4.weight', 'image_encoder.transformer.9.pre_norm_ffn.4.bias', 'image_encoder.transformer.10.pre_norm_mha.0.weight', 'image_encoder.transformer.10.pre_norm_mha.0.bias', 'image_encoder.transformer.10.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.10.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.10.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.10.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.10.pre_norm_ffn.0.weight', 'image_encoder.transformer.10.pre_norm_ffn.0.bias', 'image_encoder.transformer.10.pre_norm_ffn.1.weight', 'image_encoder.transformer.10.pre_norm_ffn.1.bias', 'image_encoder.transformer.10.pre_norm_ffn.4.weight', 'image_encoder.transformer.10.pre_norm_ffn.4.bias', 'image_encoder.transformer.11.pre_norm_mha.0.weight', 'image_encoder.transformer.11.pre_norm_mha.0.bias', 'image_encoder.transformer.11.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.11.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.11.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.11.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.11.pre_norm_ffn.0.weight', 'image_encoder.transformer.11.pre_norm_ffn.0.bias', 'image_encoder.transformer.11.pre_norm_ffn.1.weight', 'image_encoder.transformer.11.pre_norm_ffn.1.bias', 'image_encoder.transformer.11.pre_norm_ffn.4.weight', 'image_encoder.transformer.11.pre_norm_ffn.4.bias', 'image_encoder.classifier.proj', 'image_encoder.pos_embed.pos_embed.pos_embed', 'text_encoder.projection_layer', 'text_encoder.embedding_layer.weight', 'text_encoder.positional_embedding.pos_embed.pos_embed', 'text_encoder.transformer.0.pre_norm_mha.0.weight', 'text_encoder.transformer.0.pre_norm_mha.0.bias', 'text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.0.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.0.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.0.pre_norm_ffn.0.weight', 'text_encoder.transformer.0.pre_norm_ffn.0.bias', 'text_encoder.transformer.0.pre_norm_ffn.1.weight', 'text_encoder.transformer.0.pre_norm_ffn.1.bias', 'text_encoder.transformer.0.pre_norm_ffn.4.weight', 'text_encoder.transformer.0.pre_norm_ffn.4.bias', 'text_encoder.transformer.1.pre_norm_mha.0.weight', 'text_encoder.transformer.1.pre_norm_mha.0.bias', 'text_encoder.transformer.1.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.1.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.1.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.1.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.1.pre_norm_ffn.0.weight', 'text_encoder.transformer.1.pre_norm_ffn.0.bias', 'text_encoder.transformer.1.pre_norm_ffn.1.weight', 'text_encoder.transformer.1.pre_norm_ffn.1.bias', 'text_encoder.transformer.1.pre_norm_ffn.4.weight', 'text_encoder.transformer.1.pre_norm_ffn.4.bias', 'text_encoder.transformer.2.pre_norm_mha.0.weight', 'text_encoder.transformer.2.pre_norm_mha.0.bias', 'text_encoder.transformer.2.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.2.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.2.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.2.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.2.pre_norm_ffn.0.weight', 'text_encoder.transformer.2.pre_norm_ffn.0.bias', 'text_encoder.transformer.2.pre_norm_ffn.1.weight', 'text_encoder.transformer.2.pre_norm_ffn.1.bias', 'text_encoder.transformer.2.pre_norm_ffn.4.weight', 'text_encoder.transformer.2.pre_norm_ffn.4.bias', 'text_encoder.transformer.3.pre_norm_mha.0.weight', 'text_encoder.transformer.3.pre_norm_mha.0.bias', 'text_encoder.transformer.3.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.3.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.3.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.3.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.3.pre_norm_ffn.0.weight', 'text_encoder.transformer.3.pre_norm_ffn.0.bias', 'text_encoder.transformer.3.pre_norm_ffn.1.weight', 'text_encoder.transformer.3.pre_norm_ffn.1.bias', 'text_encoder.transformer.3.pre_norm_ffn.4.weight', 'text_encoder.transformer.3.pre_norm_ffn.4.bias', 'text_encoder.transformer.4.pre_norm_mha.0.weight', 'text_encoder.transformer.4.pre_norm_mha.0.bias', 'text_encoder.transformer.4.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.4.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.4.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.4.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.4.pre_norm_ffn.0.weight', 'text_encoder.transformer.4.pre_norm_ffn.0.bias', 'text_encoder.transformer.4.pre_norm_ffn.1.weight', 'text_encoder.transformer.4.pre_norm_ffn.1.bias', 'text_encoder.transformer.4.pre_norm_ffn.4.weight', 'text_encoder.transformer.4.pre_norm_ffn.4.bias', 'text_encoder.transformer.5.pre_norm_mha.0.weight', 'text_encoder.transformer.5.pre_norm_mha.0.bias', 'text_encoder.transformer.5.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.5.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.5.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.5.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.5.pre_norm_ffn.0.weight', 'text_encoder.transformer.5.pre_norm_ffn.0.bias', 'text_encoder.transformer.5.pre_norm_ffn.1.weight', 'text_encoder.transformer.5.pre_norm_ffn.1.bias', 'text_encoder.transformer.5.pre_norm_ffn.4.weight', 'text_encoder.transformer.5.pre_norm_ffn.4.bias', 'text_encoder.transformer.6.pre_norm_mha.0.weight', 'text_encoder.transformer.6.pre_norm_mha.0.bias', 'text_encoder.transformer.6.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.6.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.6.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.6.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.6.pre_norm_ffn.0.weight', 'text_encoder.transformer.6.pre_norm_ffn.0.bias', 'text_encoder.transformer.6.pre_norm_ffn.1.weight', 'text_encoder.transformer.6.pre_norm_ffn.1.bias', 'text_encoder.transformer.6.pre_norm_ffn.4.weight', 'text_encoder.transformer.6.pre_norm_ffn.4.bias', 'text_encoder.transformer.7.pre_norm_mha.0.weight', 'text_encoder.transformer.7.pre_norm_mha.0.bias', 'text_encoder.transformer.7.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.7.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.7.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.7.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.7.pre_norm_ffn.0.weight', 'text_encoder.transformer.7.pre_norm_ffn.0.bias', 'text_encoder.transformer.7.pre_norm_ffn.1.weight', 'text_encoder.transformer.7.pre_norm_ffn.1.bias', 'text_encoder.transformer.7.pre_norm_ffn.4.weight', 'text_encoder.transformer.7.pre_norm_ffn.4.bias', 'text_encoder.transformer.8.pre_norm_mha.0.weight', 'text_encoder.transformer.8.pre_norm_mha.0.bias', 'text_encoder.transformer.8.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.8.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.8.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.8.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.8.pre_norm_ffn.0.weight', 'text_encoder.transformer.8.pre_norm_ffn.0.bias', 'text_encoder.transformer.8.pre_norm_ffn.1.weight', 'text_encoder.transformer.8.pre_norm_ffn.1.bias', 'text_encoder.transformer.8.pre_norm_ffn.4.weight', 'text_encoder.transformer.8.pre_norm_ffn.4.bias', 'text_encoder.transformer.9.pre_norm_mha.0.weight', 'text_encoder.transformer.9.pre_norm_mha.0.bias', 'text_encoder.transformer.9.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.9.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.9.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.9.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.9.pre_norm_ffn.0.weight', 'text_encoder.transformer.9.pre_norm_ffn.0.bias', 'text_encoder.transformer.9.pre_norm_ffn.1.weight', 'text_encoder.transformer.9.pre_norm_ffn.1.bias', 'text_encoder.transformer.9.pre_norm_ffn.4.weight', 'text_encoder.transformer.9.pre_norm_ffn.4.bias', 'text_encoder.transformer.10.pre_norm_mha.0.weight', 'text_encoder.transformer.10.pre_norm_mha.0.bias', 'text_encoder.transformer.10.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.10.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.10.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.10.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.10.pre_norm_ffn.0.weight', 'text_encoder.transformer.10.pre_norm_ffn.0.bias', 'text_encoder.transformer.10.pre_norm_ffn.1.weight', 'text_encoder.transformer.10.pre_norm_ffn.1.bias', 'text_encoder.transformer.10.pre_norm_ffn.4.weight', 'text_encoder.transformer.10.pre_norm_ffn.4.bias', 'text_encoder.transformer.11.pre_norm_mha.0.weight', 'text_encoder.transformer.11.pre_norm_mha.0.bias', 'text_encoder.transformer.11.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.11.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.11.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.11.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.11.pre_norm_ffn.0.weight', 'text_encoder.transformer.11.pre_norm_ffn.0.bias', 'text_encoder.transformer.11.pre_norm_ffn.1.weight', 'text_encoder.transformer.11.pre_norm_ffn.1.bias', 'text_encoder.transformer.11.pre_norm_ffn.4.weight', 'text_encoder.transformer.11.pre_norm_ffn.4.bias', 'text_encoder.final_layer_norm.weight', 'text_encoder.final_layer_norm.bias', 'logit_scale']\n" ] }, { "data": { "text/plain": [ "CLIP(\n", " (image_encoder): VisionTransformer(\n", " (neural_augmentor): DistributionNeuralAugmentor(\n", " \tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\n", " (patch_emb): Sequential(\n", " (0): Conv2d(3, 192, kernel_size=(4, 4), stride=(4, 4), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=GELU)\n", " (1): Conv2d(192, 192, kernel_size=(2, 2), stride=(2, 2), bias=False, normalization=BatchNorm2d, activation=GELU)\n", " (2): Conv2d(192, 768, kernel_size=(2, 2), stride=(2, 2))\n", " )\n", " (post_transformer_norm): LayerNormFP32((768,), eps=1e-06, elementwise_affine=True)\n", " (transformer): Sequential(\n", " (0): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (1): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (2): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (3): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (4): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (5): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (6): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (7): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (8): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (9): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (10): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " (11): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " )\n", " (classifier): SimpleImageProjectionHead()\n", " (pos_embed): LearnablePositionalEmbedding(num_embeddings=196, embedding_dim=768, padding_idx=None, sequence_first=False)\n", " (emb_dropout): Dropout(p=0.0, inplace=False)\n", " )\n", " (text_encoder): TextTransformer(\n", " (embedding_layer): Embedding(49408, 512)\n", " (positional_embedding): LearnablePositionalEmbedding(num_embeddings=77, embedding_dim=512, padding_idx=None, sequence_first=False)\n", " (embedding_dropout): Dropout(p=0.0, inplace=False)\n", " (transformer): ModuleList(\n", " (0-11): 12 x TransformerEncoder(embed_dim=512, ffn_dim=2048, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\n", " )\n", " (final_layer_norm): LayerNormFP32((512,), eps=1e-05, elementwise_affine=True)\n", " )\n", ")" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from corenet.options.opts import get_training_arguments\n", "from corenet.modeling import get_model\n", "from PIL import Image\n", "import torch\n", "import os\n", "from torchvision.transforms import Compose, Resize, PILToTensor, CenterCrop\n", "from corenet.data.text_tokenizer import build_tokenizer\n", "\n", "\n", "# configuration file path\n", "config_file = os.path.join(\n", " os.getcwd(), \"..\", \"projects/range_augment/clip/clip_vit_base.yaml\"\n", ")\n", "# pre-trained weights\n", "pretrained_weights = \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\"\n", "\n", "opts = get_training_arguments(\n", " args=[\n", " \"--common.config-file\",\n", " config_file,\n", " \"--model.multi-modal-image-text.pretrained\",\n", " pretrained_weights,\n", " ]\n", ")\n", "\n", "# build the model\n", "model = get_model(opts)\n", "# set the model in evaluation mode.\n", "model.eval()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Zero-shot classification using CLIP\n", "\n", "Zero-shot classification involves following steps:\n", "\n", "1. ***Choose Textual Description:*** Select the textual description that represents the class we want to classify images into. This could be a simple phrase or a sentence describing the class. For example, if we want to classify images of dogs, the textual description could be \"a photo of a dog\".\n", "2. ***Encode Textual Description:*** Use CLIP's text encoder to convert the textual description into a vector representation. This is done by passing the textual description through the text encoder of the CLIP model.\n", "3. ***Encode Image:*** Similar to text encoder, encode the image we want to classify using CLIP's image encoder. This involves passing the image through the image encoder of the CLIP model.\n", "4. ***Compute Similarity Score:*** Calculate the similarity score between the encoded image and the encoded textual description. This is typically done by taking a dot-product between image embeddings and text embeddings.\n", "5. ***Classify Image:*** The similarity score obtained in the previous step represents how well the image matches the textual description. Higher similarity scores indicate a stronger association between the image and the textual description. We can take an argmax to identify the class corresponding to the input image." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([3, 7])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# build the text tokenizer. It is useful to convert the text description into tokens.\n", "text_tokenizer = build_tokenizer(opts)\n", "\n", "## STEP 1: Choose Textual description\n", "\n", "example_class_names = [\"cat\", \"horse\", \"dog\"]\n", "input_text_templates = [\n", " \"a photo of a {}\".format(class_name) for class_name in example_class_names\n", "]\n", "# Context length is 7 because we have 5 words in text template + beginning of text token + end of text token\n", "context_length = 7\n", "\n", "tokenized_input_templates = [\n", " text_tokenizer(inp_template) for inp_template in input_text_templates\n", "]\n", "# The size of tokenized_input_templates after stacking would be [num_classes, context_length]. In this case,\n", "# num_classes=3 (cat, horse, dog) and context_length=7\n", "tokenized_input_templates = torch.stack(tokenized_input_templates, dim=0)\n", "tokenized_input_templates.shape" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([512, 3])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 2: Encode Textual description\n", "\n", "# The expected input to text encoder is [batch_size, num_classes, num_captions, context_length]\n", "# For this example, we have batch_size=1 and num_captions=1.\n", "# So, we add dummy dimensions to tokenized_input_templates to convert its shape from [num_classes, context_length] to [batch_size, num_classes, num_captions, context_length]\n", "\n", "tokenized_input_templates = tokenized_input_templates[None, :, None, :]\n", "\n", "# produce text_embeddings\n", "with torch.no_grad():\n", " text_embeddings = model.text_encoder(tokenized_input_templates)\n", "# The shape of text embeddings is [hidden_dim, num_classes]\n", "text_embeddings.shape" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABAAAAAKrCAIAAADgdGjDAAAKMWlDQ1BJQ0MgUHJvZmlsZQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+6TMXDkAAQAASURBVHicrP3bsu26rgUAtab0ufbh9gfwQFFFFQ8Un0TxCg98PRRnzx6LB10sy07G2AeyZo2Vnji2JOtmW5b5v/+//q+v6yI5xlDV67ogVFUAAIiLJEn7qcTn88+tCkBElBhjqChJ+VyzGMr1gaqKQlUFJHkJSP79+5ekUgEMVQCKG8CHUFVVJSmKMYa19ecjqmo/rSHxZgYAQABQoaoYtE8AcFBVMQpE/Fj9WY/65Vhb0/ZWheMGhEkEg8HKZw2OtZHlVitsAOQrEVkoqV7shkOSjZLq+Bi88QlJYFgB8mrtRg1SH6qqBH5Z5iNi3W0goTRE8tal9+rbVjJ64SNRoV0CiojIVYvNe+EYo9LTOmul5Jj3nGTMkiT/3t+8n+xKQj/JP/bKoPrzzwXAOEELjhylpH5VlUTC7NzFEUyi/8h/JQ8439KaFgDD2Gmigksmn2i5kjuS3wBA+AXz8+WrQsnZv7g/SnCsvVOwK/wW9fQedDivq/WyfXUprNfsraoaNfwnKq1AMuk56cyiQ0wqF0SMGQShbazpMWbnGjvQ6tGxdB/JUr9JcV4AhH+yj+o1xn2gZ3SMQeE1wFocAFh0jlVJ/Dnqk89n6pnWFyJi9NxfDWXVPyQFk72lPK81SxFZCQpPvIJ5a7WzvOFSeCZxGWNQ1CpMxVuRmlIKDKjJBUmVVJX35/NRvSd541vVAwVI0WFKrNYNAIraXwVa1pJTVwzTw7WGQSufwJR2ed931Rj2UES+32/j5/pztwImL5UTjLSp1auyGsCXA0IqSF4ggq9U7ym8nPxpEhScaaiGOVZDThF0VgCXd002avemwYBVGZLfISJi2sA1VTWeZGpdGt3GpIlhqsZRxeYadn5/AUXcHMHCnLO/DE5Kcq8IsoM+H1FVeg3O4jdUITc0W09Fp7cryTHGRZrPA2B8/2YZE0rD11o361x5bIxNeRadMzCZyj2K4gak5pzYWU8t0ncDMPs+ULSofmYPmk1UgipQxV1hDji/mLyk2Xffv6NKtIgAMsZIu5DgRW3T4zIwryAjAPMWDGtTkrwHYGYhNflQVVyLZwIAKuD413WlfvBLCOC+/06ykQC+aswtK3h+3fc9tXRAqKoSDDOFFxfJWwcKH2aFd+ixVr9LnM6f/oRLh2Lln8n2IR0fGFd3LjIhNR2VDmfX8yh6202UqKoUFKyZhT+HqurQb4pYxXqxUiLSjNM+AKi9QiFJGwCwmPaFcgKEOii0UlMxAwPARQ5VUqgQmazJ4ebHlI4WV8lgKk9cdZpeQipEe1vBFinE6mpdNzPJS5Qp0gutsF7WxxRluRBAPg0AuLoC9rJ1YVGLlwlv7ctVdc5PgkGLEik+ytTjUdLvyxDrF9ckQlGjs+b07Gdbxb0ml8FArWreA2MdIBn8psGbkJCX+ZNV/Oo4oXERALJUHmzFVfAKMJfGiAUAU5CILE5SOJ14kSlvCZKBg83yKfCRKw22w0PXDq0kAGMidD7pkFdc0tFvZK+VVwK6Oiv1VGL2D081ozzRjbUWJi+6TgSmX4wWybF1ML/DzE4KaPckF6CwwYNCQ3+lVvljPcd7U2LHS1WhW7sbUsnqaFRaO7RdJlAVR0qvZ4HZnx/AoKvYheBNbeZl+tYRLNW0YgW26ciW5viEmBT7Uq+n8g3TKfsAHljl+O27pFR9C4f+DFFTSggTZvNo7Pw/YTYNkF99N77iOiprGCkO8mLShBMjMcZNE84GzArhE6a1cO1UPQnkURK5KPbJjU2Bm3qoXwkpnLDZJ1e4ECLT4k4rvA08FsDAHIM1jmqgrpwjumFbS1b/ZPMrXBwCHlFVaIhA8h7dBqDUWevhZvqb3rNWUkucrrN+q+gIOKAkqZeJtX1VaaUHddctV2Mn3ZBqMKRhLT04ZcFvVrfhCP/Tkwr/Duf+bb3SP8xKfPpGzb9aUABg9DcvOqfbOjClNZuwSDtSmutc6jpcZScdgE9TcwwHbhQ/NrF19ZlsZCCafyWFQJWgl8EHVfUZer0TYmMduKEQcpB6gSCFggs5o0z6moBXa9wPCCZiaa8BWCUgFcskRh0AYPHAJI1EJcgyp664KApVqMicI5k9RBB9AIDV4a5cwpgtk4WRBICh6r1bzYwoML1qdIU11boLJxduSHfqT4GHi8peKt9lvjw8qAMRAYUiyZqFwS5TVbYQJBRgGMBC0UWWAmBCB6/kySI2VO9ghP5XAlCvUBY6GA0VCs5xf8KcEIrzgC1o3AXTC1ASGo64Pb9IBWzG7c6hbCpvKwPAl9dmH03BzjkhBckBCOWrw/qIMRcgnA6l8f1UG1o6wmk+5/JtPslKE1RhHdITvYtjCASaTeKwGRQUJjeBv30WY45FrYCQonB1bxYLpE8CunZYtcSiZKyOuB+GS/lJxCB4XlbRiDGXhmoAANxeY9d9YpISjwsAvWQQ/AJAjAI5AIjThqUkFBj36HgpAFuehPNN4g8o5pDSqmvS1XXHw1XELb6wz+6p7k6DgeicsNRG4zEcTLVe0zk3T5ZRb0qZyR0maqqa2FQEnP0XnPL+PHbKwqHlzJTOtVBO4kFdMC4EVRU6bM2qVQsgBM1hLs1dZXEysXVShFyQZA51VEzUNvCFdP6Z5CKBMQBBdfKhqqLCWCG3VaA6+9Ymn2afVio5zG2+49j71SEQgmJ6FVO7pMb3vowPfO1Oq9iQPm8TmLJYfy7NVcA2ii1eMsl0p0lS50JHu65w+lDGr6b1TBXX5twPse7QOYBL7T1MssOVXNinrv8IEUQIb0y0QVjQGVahyWPpozHU9cHkt/T7yxjAAaGOuWTtQNmA5yoWsBA8p+TKiH2QShSrhDSqi5xWrqO7/hgxBjCQWFTX4gCI9M6ihtN1BTlvTFAlcQrAboQsOHyasOolUEWOjt1mrZ56KEVdx8XdQcrnOZfP1NZTe3vTSZMNuan2i+JyJ95qHhWIIWSYqc1LnC3Gk+v6x6RJ1dcyYuA4dWN1dIUfAHUNyq4P16ss8C1aAyHJIhdyElSYfomgxAks4APZmbbiZUszwRCiGCEABC/IKIMYMY9SxJaAzS/xboz5zwlhgGtVVU3XLm4kDq1SrPLeDYsmvbRcBeBpemvH16uy49eVGmsTJMGq7Ba1rlyAWeHsMNeBPWOuqAKDdTKjztnXqpZxzvq2Ec0cXERDTwSsVbFoxqUAoFIHeI8ukE4FPdeLFrE/0Wf/vU00Sl1VFFLvfaLCyvmsv6+QTqoSmw3G1L8LTS5gjCFTaMOoKCTtv/uRFMXgBQ6cyBLVLq/ERywxkA8jpPEqv1GX2SvcrKWDTOPr2pYxqmh3oYKOM17Iv4pWdbtXAkOVZg9BpT0BZxhMQoLCwPmzAdYoc/Qb2vVSJmsQlY2hvECT/ayQw1V1I6nRfOfw6gAxnjTNttC5rsQ+zJz95srgllrJGOOIb22ljjFEZB0uLfOy+4d2+wzSqZc7XgtNdCwOkADqIaIHyHGiUuu+id1ptlJV025WZ+JJ76Vzxa2qXGMcnOE6Ayqc8SgsVu9g7AwAmgYzV+2K+3sMkBr6TVTt76TwBPI0YJi4KJRn7qqcoKrWF91R+unSMuGClQcKhb0Jccd6itJudCbkD7O/rbysDLMzA8Kxe7Ji740eUUZg9ZPY2vzL4ua2StqVU2NPPInOS92/alwtqqg8+bDopxuEjaNI1m93z2HoMnnXGLXpmXpt9noJUuXq9enoYVp7DS+V50M9EfmJ+UkPMk5fqIK6F0b4D4sUmOPhDvkS4JRv96o+FkrhwT+1jYhl3BmFcWOdKr5sSPcaWku2JM0Jeo4FO0PEjfjY1pu4SCF9Lsqm99SGmSZv89uYR5/PfSwZNSt5rxMAhRUOAwZ25YxS4GwqROf9obbtoZSZ8sW5yefwJWBRqNCmJHzyOwm2XpXLtqV2+2ehFHTxTlZbQxaxydvhxi3smRrklbc4XBKawYevrQYAAgsVU1XYEkAlo7HQXUaMQ+kTajFIZ0xrk7TBfKVQxNcYGrZeolCIwaaFvPTINBkWiO4BewSUc9Zn6PxG9UYsccypLxN1mxDEnL90go+MCKBNnFtb3SwBVAiUcqgEyPCkRd0Pc7XNmTbaS8zaDA3HvzwBFBosGgpabfLfpv2uVBSVqMuKlrJo3AOypM9wGGzuFlnJoQ6NznlHbqMRbK5nvgrW2m2bzlZWoLyGWY8mdt6tw6XPQz6awTNf5KQ8h6n4wMX+ivjQkVg1vs8OVlwW21DxehKxfCiFXFWE9U6PKsGHLxzN+EGlj+hvCV5rls+XpCf50j9YuinYXy8uTKsR2fWfuIfWBYsuXRZs0/VXiUXCgbloU2oJ9Lk8m5UE5GaDipe81DBB0UHAJyEQwX4AbpCkDGNXh5jD145krVPN0CtM1ZjqoExpDwNR75c9MC4uKrYsbfPHtqXAVldDdRPqAs5CjmanKl2MFQchQp7coMqL3vU0H71bq9MX5SnnBETWxjK/k7be7q8MuYzgUu+sOyZKigwKjAjrgEEnzB7dXnSFd8+6g6XKpqoNq1DDf6ryW0uaYZtVraEjBvwM2a/0rL1j21vqvkHbW+XlMe2xsRPjeXL4sougcnLpG2p5lB2ew4DyczdYfBr5WFMmoLGqZnxbsDOoJC11IVGUqa5wvN0bLT115rcr5vezhJm8/B7htRgZqcCyDSmeI70jFL3CWOFB+6ujsFAhV86l1foB3PdcLYmujUVbw2N+NACM752EAQhf1tBP3TRW6dWee9tlhy5iFEJSRAZGmqvaMUeFfuwbw5ZyqCR/ao3N3cogHKwkDapKpblMrggmiVeHvklXCmQzvT7wePby2/3+055YTHZHAZASB2Y3Zo3vtVPoTu1BwJ4cgtTxe2GGY1QhcYMdu6bWamXawgISYhq+7QEQkRnKsvJ0I5TfxK5QxkwVqeRFj+b1v/AoRAm2mgyQGB1ZRXROijesTf8uMZwqAD64NEMNosoM+leLY6uWgMsaAta2dvrrXUJ9bDtBzIbnNZBeMqFsCsjLDOyhFDaGdK9BfXxLp5FO/9v/EgBud8kLvymH8nPthCWXlZ+wLut4oGJdPH739cP79xkOTjOY187nhX82nh/LDGUTk92cVJ6P54epILWQBgAx+3jUV+2r6qstVY0wcmtVDdTfOMe+DbfsO8LKV1WB11ZWqMQ2SXN1vGwH5G7wAAztO/urZqhN1/ZbmRcUq27J+mc3qYceN7XmBWYxJWXgbpUkplWP5c9j7x/7XVXrQAsrdxW9lINVEotsLwjqjAa22YghGLhxuvzDMSHMrsyb+OtYwnc0LWEYFZcVni5ZjG8WTn42zbv5e2howejIGM3K719Fog5z18hT0ous5wUqj1+I3a75ZC+pD3azbtqec0DPVyWmUvQkqi2sa5YvFbeOoG/YJO5JcBYXaKdku0y3NyBx8FBPdpyLykikaJPIeujHrvri2vc4NfGs7JTfNkIdhRobA+dQUFXN4fZis9rB6QycRzi7REwAnv3GWT5gwCpTqbiyUafMwwCp4lgLfK6YnJ9rQ7gsmodkTYBjszmeXcHmpG0mWixEx4BeuhYA8Uk0IqfKpTFSV+UYQ9LNSmaFz4IafzB8A918UPctjEw27+JIXmr7o4EYG8duqtVQBTXPQw4ms+aai7013yZgztra5o9qThhX7U6fEdmmIiMjhJawbHsyN7/G80RBM7gjrxHDlYadRXB/1hw7JNedaE5cEh7ruesdx6KMVXCZ8mqTr0aEDB0Rj20BbJ9CBaMsO1raiMvma2K2HapjqIVdmnahCGMlSu1tgESFDqUPtDTl94LNvNny9yidZXbRnvTIxei7C1Bb3fAF4mowPMgDkZ8nk9uYk3S1OqNdd9rSI6B6JG4u+IRJ868GLSSjV2ihfqHzly6rMSu5iYIefeNPyuLSgOfnKXxBkEPm8tHy12eeFo/XaILjZVgxkoNEH3liAHsgSY+KZhEiilhMcExsBPQpPNU0OuN1gA7K0iE3xXgDNhA1JUmOGziuvhh0B9ekdUd6gYBNCKfSdx0zAEjuC1h1e3RTdJYXs7nAq3CL1en7yHV5SHKGluWUlc9YkxSNsFrj2zCJkYiD5UO/MTd0fmO5skh75dJHiG/Z0elYuJd5Gs2WRmeLVl7K2waNkywdQYXNo9N70AsYAMm0zBrUt2pkl0VGphktPbchGQxlNhqT6dKawWfj4j1BWB4R7w7z+z1o3u+jaBi5iekmDYCmsx5Rt5GwKg2cDnMgbV9plmfYI7dyzD4zwTKnM3N8aUIFQGLJqJhUsRDZnrNr7ZyDw9dcUsoSzAmAQ6Ee/RzPAcQuoKFQ3yEWfQSoSm5ssPABBVQxbAUVoqXfKxaaM9Tea6rqyynxM6Z+mL3glN8R9i6a1HANAEXUz2gCwOCsQ5YYelu6uRjc506q1+seVMVFLcYLVnzkQtmEwbRZinRoqludDq40U80mBbgQasH0p4AoB8CUznTUSfLGPTtdp/aQGpDlo/ob3oPTZEDV9tvc0JDvNuE7s0dqXFZb6EHA964YR92105EQp8cbHzmVCl9Ft3i9U59Yz8mlCveH7YWtEshFcnz/Jszx3vaITozUE5eJ+i4n7906WIJcqkqd00B28wm0J+2xucKzt9SyiJgrHjCVzT2zkvUmOmwWqGXSzbootiNmH5eHO1hcw0Clliku+jJmnc3JMmldlEhVrHMYY0Ss6yH+iXYEU5bqk8S03U+opq1kvcHtu8XbVyxVtbawOawkx30zR//BK6skrNDuNN9okk8qVPNVWhpVbMNi2WY1knQFi/irObCcOs3I79M51mBkXsIlY4wbRZEED3CFhGHDfBXrFLnYbJJdX/WQmGQGrBcZi3GGLtl23hg71RmFQm36Iu0Yw2YTS18b3W6oT+QryAs6dB09uonCZaNxKQzfcCntdqaKDrL5Qp8xLSU/SH9l7TItdWaftu7efYLGElWKsYqqbJvJrH6npy7Vij7sJ62Wb2W8nT7tSjIeVWRWaytdjQKNDlFgmSPvoqElC2TB94mknk2iDACyWnLmUCoiNn9i2uPZLzMnmzfK9DRq600iJhl1b9HCEBbhmn9fB1Ttp6r65rbtOnZljgFQuubJTXnihL0r4/7N1wl6vlXoJu4EiQ69bQh6udvQCji+zfzB3ZHKYChs1khhIOjeZQ/UoAIjFz+Xr9Kpaku+u/xWAWwci2LTK5XGGMWRXq6atvVaU2I0DbPgiE6NjmnYEQsgOJG0g33khtpu9lrAAIR9j8THE8L2VYFsIMLqKkZVZyYBlfwEf9Viqbd3rHX8IB1covDQW0x++1xonGY9ostXFbaqlLDySWsuKXMAMmh4FPPjJ73O+FkL2/O8f6o5v2iGZi/Z+P+o3utD43Ms5sDdfo05jlphzaFXpewTmv2ytAOgBZr7JbgiaDzkHLzUtn4boDO42SYvzTcWEXLYTGyVvQTX8tQ6/w0fAhpoF+eMMC2rl0jkx53qwGa5pKX1TJ4bQIzCEVEZ0GU3egJGMietGqE/n2lg1g+X2Pqksm6hU2m2dR3/WWc5j4xYnQAzIdSWp19FBLroUwA2exqqe3fvhGQOewjwNDdhTDOGL0vtJAKUmMtEGk6zOcOW+sZSJEslI2fgkC/F4lZb9s7IcqeMz/AxWEuHAvfn86fJJIqTnc/V8/3f1/WHoNgUuLciIrzvAV9JYKTLjm3oInpfhiAikasxjvoi/RSby/gNMUUQZLyu4MPhL4nLdy2oRPYPm+c2bGtG0WFnCvDiPYaKee2g+StZ/xiWsFlJ+JS3AoqS98ZEmFK00oiARVP0zSXFMhDSEFeAYwzFLT6byMyep2pLKktnhRerOd8JRxVU1gWEqQviwRiDXMC7rivysvccX3jQ9aFACz/nBwVy1czLjtQ8BqlZI42Rg0b5SFNm5PL5J9KCu3DJnzHG0KEjdiZZgIeXp1WbFBi2KGS5YowByDJ/NpcijVBjjJkWOtwULWkcs9NcyvjR5RwN+DpV7n0KpWSKO0KPKj0JYKgnALKls3uYMr8/nPt6R+Elm6ltkcqq+uEHLp7T7pS2cibS/o6BPkeFAj8KpggHxWnYBk61H71Vhe9V8IHxwhXBflWlYK7o2rSFA1+4K3fsI6XeUpJf1+WuKuuotS+K2i87/oA1Pt6CWNy2+mqkdQRDbzb6kMQ1l1NGsG/tkUbPyWlprYrrk/s6AJ8DrmX8xpepaq6kGzNdKSGZ40VB/v37PVEA9z0qMBVm2s46hfHQtKcaZ1wUnqGK5YxDBAIldnnfqIFcKjTNMIpZoWkGT0VtmNrzKTaFnZW+x4qBiPeLr2P0UUtuFZkgLX6Im0ikpQsTQ1L168qlbO2tLFEbmrkBNFnaGEAtCiO+0mgLtn9MMNWO66vixtxJKbgNGsqIVk67eWPuYVBOlqbNfiR2K18BhTOnSHqZXLFHemIkZW4iiAqdY+dRAzPpkLqUhOWa08FXuKMIcfB5kIAIpFZHYCP+VXbj1L74XJd1IMLbST5J2Lz8UIVaebXzrMoZI7g84kNnsIOSHF9FRNoY51wluFTnIolP3y3ebdMpTS8sLuFhTOgvp5ixMK6zyIFS2bUEABEdddBWukpL95+bfoKnvtWH4Vplo6dqU0MBfqzMXow9jczh23ldlJJOpVL2iI5u6O/qrOl0xahVtW6sz22yN9PXPHVT/uUar1Lqf5xUKwAvVjzVXMUoH+5dcKQAGbulOVeQ1iYiUoVz0NiIZki8NFepUa80qPOtAupz0NV5PcE/KSYig9BId7NEaFlcnumqMEIXP8A808dvblzXZUOu2hDJv9/vQpC1QBUWkjqEIlhZyEEhn9I14sSoWXN7pdOmv31eH/YaSs0NThWOodyWNEnf3SGrCADJhrVkoQkWQQBQ19Oecqv/p9cUQBdhf5iuD8pMKtch929Ilyr9BdrdHKgqcY1x53ThEvdc+rGJVavkHXfLVNOq0hjw7BjtSRpagbX16eK8g5HX2JJG7JTByg/YMG2By8cPd6hMoXVtrE8YL71c9NvB2CWE7RMA10PlWexJsRemxU6BLLOfn7OXWTkzBnKqKQRaNvu2yyacdqNf98agKMC6WTYvJ048TjXnKSR+cbVee1FxxzIJZ2L9RPYdbId5LAOqSdLrYkwD22XhshkaegR1F+QfcT8i9VJD+6TyZz4hk/t/kJ2s897s8oi53hMkY++1X6isg39VhathV6VyLXXEZfevKnF601WrpD/DXCEPYBK8T8zYzXe0L+WTVbjklDAvi4IYEVJvzRiw9oSkZ0/HNwHycA4MVb1oMfrDR4GWlUTHTaXqJ9zog05MHNwR98T8s7wl6FxCzQuBZkjJHJ80J2wh5W7DrDaZjGgv4pPF71wIexoDLOcsxjQk4AM3x8FTwmHS+cF748yh7vGpVeE6x8QkVCWt2ryNA28yfATbeoSM2JI2kwRAeSHGyhVT3xuvEaMwPzFv0oTNh8X+SiNWOPcw9O4AMrd6ySVU8vM6GJHKZrgfYC60KHSDX/chnCZZEEaucGYdOibBmgqIOpPxbBWbNhcg5s0T4qnK4+8CgSrBnIIGoLg17KNhHmCMW32ueYqMi+dcoapoGv+sx9Co+BBiDcsgFBYoueYNqyXgFEDGCLiS2Hz0KYCIiKNiP3ADrHHPNxbi08nSWq61YzEa8KBrm0UzDRbuhffvEamY3xLLxZ0A/A3FyhnRO2eds9HSkdKgHMniANbtfapqK52pP8lkc0nlZBHP9uHQCY9TzLTZHrQQP9CvR4+kW6+p8TjuUZVhtmVxzHnYqZYK1wdJnfPUg82NNZOsqj4jW9gmGE0BDNygD1Qkdr23SqrOr5fTMyaX80k+bxJkxBHVK8aBI87dG3l+rOi0IIUUw1aTTP2qvVWnHzks26z6dHtun1gpN7FQnf9SFzU0n25EerHQ6qa98XL5V74DaokASYT5+PX5cm81XOFZ21AqxkOvMS04eRc/svozCEyZwRPVwsTcwCA8qzrdg0l1ozM2fc3p7petFdwNZwMj0joVuqEXi1Xxup53+4AoBxhlC2Gt5/a8TtP2aV50vWj/7NewuefFJbiRlrdojzkcWsEeJVtaUx1POKY8mm311chCrlA4g+SAQjhuzW1CtUbTe7Yabn3vDYbfW/jfLP6nghceiAFjq59qWiUsokb91eNdhuNVamzHGLcAKl/qM5rEKjTd/w3dxaW8lhCvKVOWCHCVU+/VAg/JAYHCtni4/onWAcwVgOoK1JtFzXGGfJmST0/lA0HmX98osrSih3tsTLMZwmJVqp9VlsyCQPXJpnBO6U0bcfdX7WH7uRqGqWVqFo46Iq/1SBnksLy9rit9Iw/TGnpD63JBrc1nBJWNjOKbsRa8yOVE1YZ7JX62slJ4rqvum57hw7xO5Ce6raQuXaDyAkb5BC9PKm1T0ZQ6TS2eJ/l2F+HYg09GzaC10Kr9w1r/BDW2TO5dUIhQm7h06HJkhJNIMsQOhb0bGDtLNwq3xdxCUll3j79dlfd2fqgP00K16bqlKnYO5wLeSlL2fBkTjKXR+VZLyUVqVkYjux+JqoVPqB1xP75d9A/nE49TKHsM8otpCXDWYDwJC54dsl0THqF9x+t/cN33XwdsFflq6trNEcL2167h3hpaH72j8MS6+jCfber6vm8hTY3nMhHCOKH0CxrnnGxivLKENP8Tmr8zKoKlm0vxXk+r8H8ARm39+FeXkNfaEXPZs7WcdrNU8rTsv3T90keou02nTzZelmDWmiuRdz2Wq2eti6Vsdat/fyTvkylsiuUeg2vlYafeqkJo2r3MvgGgKod5s3XEO0aVFaMGqCpFgW4CjjDvPkM+OVsWL5NckBfyq6WwvTvxVS3fZE3LILZCvESHPVjJHesn7m0wFFnQRqh5EFgSy64RrS6UIqCVsjaG86B/obQtVqoqlzmmmtVprq+NyTwCME4FRuxyD1gtuN/ajy+yL9HFrCK4GEmbRx8TzUbho/1+NDKlTP1rMyjzPLVC2/bXrlsVjPlpBlnhk4i19RHET1aNv1Y+8hKl+FkpwFYrqk4kCVlkIPtLy273Bmqj2Bgz8V9ZR4omkM8Rz0nKiL0cAGYOD5v+Nnc59yUKQY7xTUYb7OqjqokRmOaEcZqK8rPRf4wyCM1ZRku43SM2V02X87LWHxH+AV1GmFbDnLxEMWlwUKmqPjEwKOCIqcoMTE+YWeSCTBHK3Oz+kOR1/dkVMUmLhjwq3wR7kSavuF7pizycqTRniCOdPHjB5z5ZhEpVIycSa0IGlD5S1TmNg76DsGJnv5IxDFAjrTNfAbE6YVa7n5mnOvGyVRETuuJwe/4IErknJMDevYoOp0wdlgwxkWXkYQowRxXb0zI9i6txbPf9Wrhxfzsn0Jzn8TCAbMw2LZB/qL7xl/CO9u+21hfemEjt6YNNWm2FoWY9Uk+NBZ3TJQNlnVA5A5bs54tHJ5/1vILUNjr5eRLBtBgEdmadQpR33eSdiVgC1TgBGgWIEgE1kzrwhqIGu6/joh1CNJ4vBYygMi3I/ODOI4QIk6YrqsLq7aHIsp48kgaPEtQldHaBPYChR2rZzx+CDM8+Vghj9SK8wnZyuip8kdOfqxoqc2inxUB40mnVFpu5XXY6Vu+daq06cZbnEvRYRGCW4Ty7YI4ZOfNpJr7Wom1guPJJ6S/7STICgYxIpY+MSwvFuPZpu4mTsN+0SlzGaQRww0ZEh0O4DCAAOr7Vh6kM8HLlHlEU5cxnv87m/qsbXWyBR9BXD21Jy0sHHYBl7o31Tx80cnSJTNYd2mcJ88ZicH9U7+rcPkEJpxuqGhPKU5+Yj7+cBAx3YT3xX31eMAwrHn4Z8KI/1yG41xYzDfS8xRJg1ramKyA1RGQZ2ajqnlWmykwdrAeCh0Fh4lYrd2psuSxb+VIzEWu+9UmTyaN/wOJ+xVvNwguXGwUX+KeBrP0IgLzGPVXrU+ut7tPDHgtbBTV7Z216EdQTAQ+t1MyhO/vV1vMMigoMOAT/NAx84HeO7J8Mub/9Qd5OqwQNI9MCtfLddcPaawQ/ofsl/o5JZ4/3GObcyGViPLV5GLC6eb2121BYAV6wqBBmDfWs2Sz+ooh3LTIveXRqjw8Hx+HotIWGS0ttCFddAa4mpAkst9nQI2ojtp+6oY0hcT3v4v0qXPQWXe0TCsXNrVzKUhK/6JH69o3Ft8LoTNIJWLWBvyqcGfW8AVb3Uax/z/r2vbYdhdjWucj4i3E9arykQycyiTETQJEcw5N0MZ2GU1sL027qwp8Uf+AIz/7Efux0qLqrAbOzzUHNPuvGY+H5NrY27TCj9AVmoPaww6STcwrfVq9ut0dnXDqQTJ+tiHyl/+7g/vrSzZ/ZyxxY6GFo8aTA19/zoax7JIxYJHGJquZG58JgJfA1vlMuHtSsaiVyLdYMyuzo7e3CKnzEkSdnvZrdpn+OxKnKHE/Cu8rU/tY03yKSmzbGSTSy8MAQvXCW97rPZ+IlhXQLeGtz2ZfdSS3aeDN5QA4AkigkPdO8KuFx9rug7kZdI1twBctqq3nWd6IssHqI0Uy9RMswE2KxWvcyZ8JCCP85SZktIGIcK+GCGyZPLIjZxpODyi5LdaHcK+IH7DYHfV4+MzHn/zjMFkaXWyXrDuO4Yas/7utpcPNyy2SYrs8NlCf4i4wxx1HVHNZrqB8K3Zgn4yw5lx0XV9J5Bkb5qKZMtrmynrnmZwLvSamCgmc65zK7sNLwqkJyUA1V/XOqP79xW8QEIitXtSk/16rGKrHHQHXUgEL/UuKUWdN8ClAh9LPAZruAWCSh8EbuTLCqLgBfj1F2X8H5HFDPOhPxJIkWmLPTU4pBWedyGHHzEX27KRdOrqKfR6gkbwVJsTmeZCQF6UHqmlOqIhDZo3tjZmULGw/6eQqfMGFmmcZW8nItoR6+W3j9xcr6+oAHzhERW29Zenx8GfOLykePgZtnYJm2bZFOTnKXYOxG9EnP7E/qAdU/XJ59/OCF47RtusmLiUIxZqqEGwd/7utCh5b9IMg7yVctXWnChTSVXvTyADL+2yJrtaw8PJKo4vJeDAA0J2hX4Gn2RWpVw5N6XeaQ1UjxevaWPTXmsqBNx8XUTXHmRAEe4rBr2ll/xTipuiM6xa1+ojHMaN7VcAUMxdtpHkX/BKSBxS4LBx37PJIpf02mo8lnl3EulEQM7W1xnoaMJxt39G/oBdccJDWmwScYAf+tKsV5ircVl22r+oZ7nBtzJsiCUZHBJ25cejwIk+7rTkwj3KDnl8s+FT8KOMZFJlmAxgECQU539GRjHo1PEJrf1g9TVAuodSFLSdPt64SaKGaYV3E/Cqb+l2VTbyQYdg0fe0AP1OOwabRGSceRGGnSS1rziBeIeKQC9lTUCcjv5iaqx+V/NWx82GJqlWQBYAc1IuigcV0bB1qxr1bdyAT0Y9JiE4kfi8/xc5liMyKBzEW92svFOAVzIIxE9lkFB6SlNDKfbkAEY/iONq+TnnPMYxXEK7zIJeP5k/AvErT4ecagi2mp2ABdMQ1ItXj1lUhnqTS0yRApRYw9APNhd+ID93ibMUSA7hlm/GhITAqfjzkE9iUn+xvrPPN5WqwGm31iS0hZWOLKvMvt0mN0yIamPdA5ezqBUZcuz2e/986sEBd9c+Y8C3OiXP5fUTDaCq88GbTCX2dwK2HNzOlc2TO3c1KsCgUKvyX8gcsq8+49fG69fRAcus//qir5sT1tAGKB2xKDNlALoWz98CKH5Vd56IJ+FTivYGqb79bK+aGXWP4Wik0YQrcGDRKSu6hdg8r4apS0keWSdILb2+BbrV083Clx4deCmsb8CkIKUiFwtZqaEXqII6cz0xyhY1D7VvuX6f8nW67aDYk/LJsydetf+3sHaW7oZzu6DrWXV98OcDNzXBHn0SkBBr2tSrSFYks1h1Oinq9xm99e9wL5tx54ZcUQa9yFXDHvvgKfV6vwSZlM9MsJDC/wr9XK9ZHv31tLnlYAlhJUVfeDsfzzZ0CMq0MVyzH1ltve7j4SiJP8SlkThbQgdUigqrrZteO1M2p7yHJ6OTVHI7Nw/apgCtgqEAdUMgwpyheKxb5b9XwOXr9PF4oMqI2tTaV8v3+LFIBU4AKGbzdatXHC03pfdM76NSmOwsmlAxDzTQdx2aSkzpjJYsqXmxu3eePH/SpwFCsbTD3velUlNLbZlBmjaPokucWJU3S1J6s2XV9mbV0gY8zwLsZOGY6cmIrns5FiX6iqF3k3/olF1OxuOxXn3uxCqs1dPDUGpSRtLj286qkJUcQHQG6zwamXT5cdv2VziG5tbTyuagOM+TZnr4hlVDy2iRWN6Jhb+nPviF25qWaT+2Upfa/Vy1VV/p//7/9bCC+KEgIqpytJej5CKWc98HNVS0nyLkptVp1vxzyYA8CI1LEXjU3VcthJni8z7sbil4iIH3wgAgkHRPUGhLfxRrVA05HVdUsN17Nv67KyfxU/U6Hfa2xWIvIdN7kYfnv75/NP4x7Lh7MsYetsYmZdKVSqDbUVsIjzkwxAUBYZKEAGGB7H3Gq2PPTmrEj6PfbhM8/Xjk7sUBw4ieMLhn5ri1n+n+uTvp3Ih7HwuuTARuHAq28yruTwmH+10PbMl7Eiy7lXYTPnnpy4vpL5FnVTtTUfp4yZWyPBq+6ZOp5zzHHzOodDftd0nJj9BQAXrtG/0xhuoO4q/j4c2zfGCEEeBc5xlaVGlqtq5PrXIo9j8CA1TNOB59Bhs7aCMvUWUO0x3KYKXUOUQ2PP/N9AKqGqB2tdt9qPMVQJ4YBcWCoP/VOtAIInl60IzpwKAJbf/Z/PJ+/tuIY21N05bX1bxicDLAOe1CdxDBBFJNOot+u6+vPg/L5iY3/taIjEKO/tGAqOJheRhVb7V8qLl1DxHTfCvUiyp5r1LuD4jpqBu/fXZsu1olDfXp7kYAb+Jd8uNcdCXw6EVBePZYzerUXTTloZ7gMcWJJQFWk9a8k/lIpXKtUdo4Uam/se5JnY+W+Z/PPEY9jYL6VD9fYpleGSa1Ot2b0tdCQFM/3IqYedhlcrCUDLRJIL/iXiR5JdhQPnpJjZi0ITjTEvasiT/R0E9V70Gvw0eh2hdwCiTmZNpwWAhVdiO8qw9c6ByFrQLyeCLTuGwzqoKi6xcE2lDW+9zBh3rd8UKVRIUaXeo+z+nx4zwxsfo/pRy0RMDO2mI1fPQ0BMt7XzQKXYEfElYoDX8OlZUFfV8b1NcTUsSobtmY6MxH3fYR3WmbUyULyLnLa0lenA3LAjc7ooKe4xhqnl2tH3/Td5Js7lmXzo9dxDVfWeoCQK2UruMhrDnHufA9XbVhJkWkAVcFzyR3GPG/lc+Ekv3xO6hGRhSsokKUle4hpvohnLMmYvOHMMGF8Wmk+Tp7qcw/IpXvHHgli15POZi/j0P9a+0U4eZkRSEuJoVV+YuHxtPrpKRXGH7hY78Pay0bwrFM08d5yWIPGZOqhdaQwqCRBizEmSbqgwDWGbnBDgOf90JudZrdrf4cteFM5jIwCpVqQYHq72rFblPRdpZLxYzKcCEUxWZi90tWdTGDaU8/66rlwY0kq6wLfpfaxlyjkUTJj33jkSMC/VuRfRlFTFqIGd9TACt0iQH1WFQMbSSi3caiBprHcEOMoXcpmK5eXjKl/Bv1DKJRUYQ6mRu5pPFGgtalQ7AED6intogoxw4ylGc+upK5gZvtK2ejw7YGt1KN/a3/UgWDVbahryymXf/L7YnmyWZAY3Pg5gzhixH8y3s3TBZZCfqyqgKBYFNolL96GiyLkQfKteBZ173WjQtNB+VWpIzMZVBQXAZulcNNbPd+nOKw4sO3C+andXC6HuxFqKXgrrWCZ3FbAsItuAp+15mFoU/MiV8cZFpx2MSMHoQEB/xSHCKGCPysqnBy+5i1OwmAGoIWWmSycKlbAy1SZ9Fvd3F8k8PGvqw3jViRPr22eEH+rHNvnXqt1+2uxYjnWnHrBF2hwD1Fb22hrY+fPJPrYrW0iGb+XXauvD7u2ZH1J9yRGWQkNL++cEttSlqkoJj3kD9mgmml9R4c+3tSb1KeR7WM5ExlLS84KS6hwn6iauKYPJ+d4KWtGF2+u++QSb6wB1YrElOTA3P2dbcvrfY1kvGSdtE3w22mPL3mN9FQI4Eqca7rJfrpfUY5OEU22WBpZOqURTzwPhwau2Y0Hv3qcOtpp9ORx2jtJlJAE791Z9X5ErIreDYwwvpWEZVW9VTxpRDLcNO1T7KYoQyvDwgppOdBTch/W1UyBngUM1rsDvuKjqsgnYo4zt3mvuVzW65rUjuK3asATxUEXpJJTT13RAdVwsb8d0ymProT2py8Hnmj1fVInGoZ1K6w761T7R1fjRh9qgLKEvE55LKr6znqEkL7AejohVs/hZv2G+sFkgFKZUtTCYaKuwgptt74vpOye0JC0CXne3L/Cd3D+nIlgrCcVxGKU0Gi5GjvN5LeZ53BEubBQaMRmjBQZtdFtcW4FJm+a+Ans72wq8lgm8LgwEKAtVS1uqCjDnR4U0TYP5Nra1GQwR6O8h9iv2zZDUHiliZQ9nnof8tjDnlWXq1Wi1dxbZj0hrgNVXe7EoY0mNFke/wb9rnFWykpwkp3NWdcu+tuZVoV9+RuMpIWNRR4fRQqmv0E3PrWjMEYwxbsBmRMcYTwquYlSf1DTB2a4t16DQJwWzpvV8URGzla3RkIIzkGMJmVsY0hTz1H7FQalkeVII6sKzoF/f7lXhdSd0Q7xKX/ucxaFp2nuRu5UUSHWXjZYwy6KNDxC2HqlzQxKm5Yx+Mx+/mz15uWk/H8i5oLOLxhGSpyaeLq4hba3O2l8bM5y9ZLvMHawO2hPPoFCY68Nm4Fr3NVCX+smZQirj6cdg9UAXNOzhQ36bWtiDfrSIoSZL7jxb7XhWW6m9H4Q8xthXeHaybEweSxDqPj6ZMpjzdgGDstXsRy5aNsjtkNBFifUk3UkZ12CGYS2g6ql50p8p6EwLFQ6FORWPfKvPEyXTE5oz1B7os7soiJAbltMh85qIR2ebTa95TZhhaaOJRlRlsW4xPLb/2RgAOYmv+WbZs1GXUJZUITvmO24aKSkmyVZX48jfVdHsDXHy3LVsFy5Gv0Ywz2CD9VSdN7kFvDOcZbvKcENYnA+GY12l4sXgpeNC8sdUwe2rndr7qwOfFeMqpxrq5434e23Vka2vki8bDFj9lR+xa8YAJ1bZtcN+Y9/MNG1lOAtAKO2ohKx7f5hDRNvyVeeKsq9VLdUU4JNP/n0D1Vq/12lU8trnErDCv0JlNiC4mpVWBbBThTvzpN6vfNvYaSqIJbdPEecj9AXr1kc7TV4+OUpTMlszBkmiJ+9n5/AntUMSz4ri6cr9nXbPEvrSK19hwMbJUc+D2lxuz2K7E8FfPS52/eCuYfUA8kl6SCQHfdSGInEtP1j7/C5mr+qQfNJ6R1UBxWunNCVfzWqCik0cokCvrZK0gurUkCurTTZ7UtRUz9Oww9lQPvf7RoQX3I8f7oW55S1BODoFnUP92JgWhQ6plGraj6o3xj03gGLrzaLufkbhxzK/vwKYc19U2M6qKSDOzwehwxxrX+Ro8hisObsgCjyNrx7dpLwJ2FireTfNFd8qLyjci3OP77BMMKpyyPvzB/5Jx9ezLEZrR3Vdr9FmLMK1r8E/KKT20LWypuT7hJU7xQBQfGXMKLyLMEkbAGTw6kquRa3tvTYVVGuXS7EdkVr+0d4BFm/m3VFPZy8fTnKrxnFoxMtU1uCCCUnfI19SnicTIM+etJK/UFhBEVVVRmRtgfOKoOeY+FT1U6ImzBkWDI/bZj5fcX6IqdWtOx3lVcBmT2/pRO0S7azgxZYQl6hBDzXXq421AGQWl4TNJg5kTRCUr0XOlM9QqMmypNCPYqjAt7nJBMYFWGqsbfE7jw73Jk7lSRfIRQy2m1qDNpcl3Ka1hgf2U8n12ZV2md5H0UI8xcfZx5wYtow2CJFMwpGSzPr3DA+QIf61SMU6bq8n6/V0Mfp3Okg5ZyCFvGXthVuvYVXlzSPhAebFp2z3kMneE3jiXk5LMCISgPBqRuKoDSsAJOFW4CkLTlURaZ7XG6olRfNOpQ7ooErBLlV2VYZrx3Fdgp/GoMoC14EBF5frcUjT9NWC3hpg0EhXr1yGNhVs+bllKh8Amtv1IuXGogmTkGrBi6dBfoP8CMluQSuVKt1K+UKltf68WeIiSkPLgLxBuFUFYLELOv9yjYpu7S4a6cEgLqrs0FkS2kNXNdKoOjs9BYQlV96TmtBiklKdNzKUv282/fhQMw9AurD/P1+7Gqy66Pi2qJplPiVtq67FqtDd8GxONvwJi+M1l22+9v8x0/NrGIMKSblRzT0ePk2p8wLMPQWWUKKHCDXfBSyEH3phquaq/vPeR03PJHkcRQIITcIBjhu3B+b4XnNvp1YI5+Tl5yywBsiqeoh/Wp9a0ulZnuUfy449Nx7YbrFH9lyQrSCpKujdCu/3GwAF2vO4DCBOIl9lua7o5sPQz6lIFxLZioHTxwyA71dYJjoRakGKHQmPa0FKdebSRJn1b/rwcQXg6WrKK03dk8AT0s6a2Q2eP/TEhDP8ppSvXvuMeXkF8mcHtL69rj5zE8R9CEVYBwAIZ33c2sqLH5A8P5/axKzGsyg2O1c1fulIbz2fL4Q9EggmLZsllsMJwXa1xCa7YQaq1ljw7U0XBmhoPl3VcNq1w+PV3qN+8lTVrIdAgG1q/dq2EbuKNxxl7cEThBWjsWUlqjC8MGR7MhX+Kh0v3760gt5ZU5XseHWOWnGsBqpyRXOAdhh2/ZvMsAO/o6anFbmpQ89Do1nnnnDz/eKDQ7+7aAnVE90QzL8PluyrjB5UCxbdlNhO3nodu7utST6xxLypvZBWHBiq9xZP2GhSgcyjcGsTR7Yvr/poqgG5q/QF8rirH+2M3QCuuDA7Wo9j/OWrdtUJkcbhRxY6XqFvtPW1ydkTDZ+r6vp5L/Ok0NrVurvp7WbTj1eV3N/A3xCZP9dloikO6wrhUQfasydS1G+1ulOAqt5bMI+Wb/d8AMeEYMnkSz2arv8hkZcnNdl22tQ9jdkoig+KZROwzuXlhvKzdByEK+rEJvsPBKc5gSumdu/PNZLkvstIm3A8Wq7acb4XaA+Brl5oY63DqDs+LMzgsoCFSXarV5+8mKdG7Va4IbiDVwvv8HQdUsj7gczwKITLTvBeEtNbaVuskaGqI0fw7urdy2DAXdUxxkUyNt1EgK3M+8i5slDZXmvGdYGkxgm+sZP72skRGVIAgLlHNlq04yhrlhhyDj+zO5J8jCP0Ntjsx5seZ7min+ZPFP5ghoLttZEDkgMZ200dAfQlPv4khw2XSaHkAwIkYuLbmNsuWwFD2GEFuKU6ARBzXTGlnKcU09ZoFmrMdhOShCH/RWkjrhaRq0jF+QYDJW+AWWuSsQS/qycJbNolc0KFQM691FGKhfFsHVRpUtUKYtqkvy1X0zI/+gRYKPAra31sjkv2m3Q6ZyXNxoe16IFMsS9lwUJVmbPsE6ka5V9BfhsFdX39cO0qlevut+UmwnRV9TT38eaRMDKTmln1bHQn4B41RjZTVHzVAzhxQuuOIyO1b99NRatnmREsb6tSUklLeWgUQfOi/xefqXXQbibLQ7NeSxMN/s42D5hye9hoyFJ7qfyC75BdkD2R7qBjVXVYJOE2PWTnsI5SYcL/xCRLsfnwt67/XtVivkpfsIQJbeK/sGvzh/5TSLARc/5cNsgWn6n+Lp/EsRydK2yP2Z49IfKpe3UTzZN3m08as2nMT9tVW/e9bVbMfAOz1yvsx4ZQ+kjIlisWsA7qw4YIzT/MQLc6UbqbDsZWfkYVhJzCV/lyJbzSMFa0CmVIwHenrU1PAtabtAhPwOd9nawZuuh2VS32RbHmuEtQsAZ9aUyseA0uBYvWajCs8HtVngWoUvHVWpnJ0I6gJR2L0cWIKVE7saYELxUbSgh1xGoJLHR4C1iysztA5rk9qgBugvBTjT8V7qkZ2c/lPWDS1HfwzTpE+yEYfqF7ccLC3pwm+XAR0Mzdvm2LYensVNZa+vgFo4pUxiEdl0t3q1AbrZbYLsFMl/bUYqtwL5PUaE7Gk3Vk+uUnSgI9cEhjDqMZgCrPFUeS+r1rVTtxWotr10x0qnmuIRBHsiDOJSipyXwJ1dMF/mJxmRbBqX7/0qF4iMvc8ULpuNt/bmPOtXz+fNcdPxLkCPzedzj1zvvfHfeiKA64NMAqyju0O9mdrzYVDFN7MktWLfTUQfrgFu9fNZ12rCpry8HA09FdL/BkGdnCRVCcFbuX6xy2dBQrRLrMnZ/rwTFNutuTpdha1VDl52LJKDe2vbataYvN7To8BgwnzhzHgVXVewt7bPBHnedxFEO/pYpZyXUOdNzrSZ3QO+IeYM+jUD9vgnk9r59j7Z2TKPdqNyLMn51E688mTTsF8hyY1gUt1cyTfjvitcp4v3eDdfrwjNFv3K+NtbRYxmNfH2Gu/RhY6yzw2qd7Qzt2paH6ZUuM5v4iTtSuaVtTz4w1hdfCmSeNTc5jrSfzxQAg45PzlQj3yIJAGa1ylGGeqmqkhXu13KNtuyJpQZW7eg+QPPoz2dWSkn2kpKNddFd29DLnVTvUaHJdF+eBmH3A3yQXP7FortjkTApw3mOGVS+Vmzk4eb+cMYYC+Hw+HwCZhykhDtdwxt4kKDW8yRLAjTGuP5+sfS1fBMMj5wBEJpwafrC2Uumpmo1C1c9WN+nweCACwJjHPFD4KW1djPpH7A1nqOlM8GdGXSPNnz38fgevmU/Xvs0zepuxV82IciUJQjIEKPNSJz3tvJPvXVUn53UZYctbUfUVAJTAAHt325pMuLMil3EQtKVlzN48Z02RgGT2C2mKoOUVniiv/EBf+v+kgLHUaannwmxfFLHQ1DE08wqbTruuy6bzRUSVlhjYoiOMlxQqPus/Ab4dsOJ1R56ZMdy3cCAx4MCbBklmu1F6V9cRVyrWY5K1pORM075lWPdLSmSRsz4Yi7xVCmKRFKUehP9BOz8h6Rz8QBsG+00YV1XwWqLFEjCuo8SU2dBBLEQYOv1g3Ldpw0+Odis7Aa5bdAyAacMS1BaTaskNyoaNKRR2c0eSO8NyUtUnrTUaBAgKzUBmryHkV+8+kG4r5k1fVz5fWGLreqyCw2KZomfSkBSPoSClzNBiYIyKPl6v5KjKDPVnM0WMLf7SwV9m65PCQt7B9pl8qTXU6CZiShs5eRrtAmWckySqyqRi0VZ1klFHcYDOm3LiqyCjTiJEcVVd0on6JVm4daWq6Z1lmGp/L4Hq0FsRemawdEfOE9NS3EWk7woqAC22uPKPzThWUE3UP1wGk+nHWLxWORIkiFxd4cJd4+6OIF0w3eB63LUbWdc/s6r0n2CfQsQMQZ5VPK7rEhEbGSYHamHLNHw5vk731HyISc/qMVcZ8Vw3HGHNTU2BVMvKP0Zm8UseaFLW+CF7cBLZF+S1wp+cYC0+HfH2JMtRuQbvmbRoCf4ZVrmVtHMAam1pLwI5zZz69Lz+06glD9csMfWv5FbjCBawJd5LPuonLUanQMe4b4vUEHCqXMu0N3s5CDUQAbcjlMd6VLZrRdM5NmMNdtd8dg0966o3QZCIfp9DAsN6Nd9OuFLbiM1asbfYFbXSjh21d/ed57RUBgBwF89tOcxx7OeguxSMMcZtauNKsQpyzRqKOEPkY4iMYW4UB67vgLgXISKce4JVMYrltYGQEyKXHZLLfIamn197x8xNiqhUXV47r7DRfj0+twNKYqz5JCc5UEx10+A/f0OWLcX9Vaa7uUIYCFyX57FmOfZL02mb1fpNWvdKtwdIoD6C6QeKhQpoAwwdqtV7OyqslG0Ns4bCOk+Q2DU43ZeEJFhtGuZsWktKqKpT0FyHZGXxJL4NBitYrRdLsRSAA9iPFv9wndAXFEmrxdbCVb0ueNXKayVzM+WvQToankbA/ducJNh3gbdP8pUW9+53InMgXVVG0db5RAW7fGFww7Hq5RcwNIYljTew8fb2ahGT/cP2sx3ucaz2qS8aPL/RSE81NOnWMjZ7r6cIUd8qUJ80PuGG4GNzJ46q7VYUgDmSqehwjY2ulmKPmd7BOLKZEWz21z0HilUj7Zrk/dJ1PFza62DsOuRY229afHr1zlG/MLW1wEGIABwnhioAL40+adFUUFWl1/sxRsuimR/WMxxQ2Fiuq7G6nwag9dtHb34C/0rPXdW89w5+18WITZ97DTG5VjltpBJDnIGdRwfGeOxRra1PblCgyxgbYcefgP/9w2OBnSyBiw2oCoXn2TDzGmPkygDp/fwEyZNmZjmyLXePrA5GQlU/HzhxdfDVW1xAnRk5FqiNqmbGnmluNHzsI4LhhjzgW1rhHhZViPbRMZ9a6hJXpfcCjRHGBtc2HILFBVtWmuvTZi4BgBYNXpEmkEeTG+Y3AI/eJnwfpsaeAYeZvV/r7Wwxboy/vZX1VGMohMCl/gSAzbeBJ8MzVEU+gNZc46GwuoH333uwfCmwW19nlCokmRiLtHMWDRLGIc15Llxi0bRt9R4yxL8xyp3MF7AlBXV1c92ulrzCS+jCJfDBhi/MTKUEHyY5filhhUKai7ykJrvYPA0x7IQpHALSPEKOqlgOpzuoG8ys+Wsl82ju9VUtMwq32TyEeUuTQ/PIxuap2NHa+yat5pNhvZ4MVWW26q5lH3X6bF4LlyFTCkWWtywOC0cBHmu3XrZS+bVVjjJ2lTHuNRLM6qlzt3n+Yj45h6bs/Rj3Z7VbiV9RpuVG2wLwlmRgeth11+DZE0Qf++6X5v+9reOTFakfGtIyYHBDAe4sinJCUyN4ZZ5Fcc2O6y0en3BNG1qdtvfPa2+q6vWUVeOVAlFM28P1mqfj5Yp3egw8V/g8CFkLu34L21m/Ncov5vGZJkcZOX5VO2s3/O2rY1+8tLgTsHHaXs+xzjb8U3WbkxReCLjybVg/Jm/b8+CPjml3GPP52r9H7BqmHXGvXwFYKFfk7inFHtJAP+mxMZYTcEu7+6kvhvs5eckT5CTsBDGG/6Cqc73xcE1F+RILTfJWlZOLiRiMnTrnbBlr76su2SZreKRXPvMcHhzl6XSc5ALVA4kP7f+NA1uZUtXhedbTlBiAXLE3euZoxI6nQul0SzZ1xeFcjWi3biMQAzgGwwjOuHUkjnlaUV6fnMAjqbEqhi1PeaZfva4/WUbDM64qoFlNDgEX3ysDEhrRzT9gYXRD3bzeejT0y0USuYF1rR9G/XL+aOPGyX/liRVrC9Nbi1Eh91qjZvbCR+Ar14pIdU28j0o97W+DJHBkqzxIcfa65rCvPGxHVFQIn1BehKexxByqBXEe8uJrzIXsIB2RWhDZxlrvNN8vxY1pYJbzqmqn+OstdMeOgsYpC4TXf2j3MDY4qq0fa2szOq0Xnviwqa3fPKzg7RTWJbaqi4+q8jpUW39O1XnyPF4oUMu8+Jf2q36SEW6LQSrpSp9AfWrr6doNhiHbBDmBOTLwU83YevnIUW1FroKxI3LjEbUnvbe7TXjojqPt1M2zbPxW261u5bU4Ir9yT49XnbdGUfJ6EmvZ4J8YFXgWfbgC9USfVuGTk9cUo1GnfMj6wbmJByLtztmhzgLnPe6jTkiJrrI5xtizcyfzHDl/Pem5sMc6v3sEIAcblbt46qBa4Il/7IRar0R9KPNMHr+estmscCLq0zo3foSn1ZaVNDrsVG3KofsD49DKmQ6kxQMxhtyNksevghVsCHL2r/jMmRoeAgrPt0q0DDySyllARHKTs+p0fxjO/a46fiDCa+8c90jUdmcHlRiQquj88wdqpFZsmjwngBpIHy8nPW9J5dyxfYZLKJdEsGw3MAWkJzJh62aEw1qF8+ipsOTz9hH2PBEsiwnM49esGP4EPgjK8RDJzKtapcJ3PtHFtR6th0JlrN4/V7SbDsr7QYhC9QYIXLvZ0Dk2TdRoHzp4NtSx+xkcXz85G2aUAUAWM0lqJgSZ3jQivlD4TETwEJywt+sq8kEjrh3NSc+YnXAeQ8SD1nzShe8Rqe4R5QOXpZXK0OX5SAhVb/hBoItqtk5hqVzUpuRBUovUSck0EGXn34PpSvpwrHlvUUsWaATAdfmrFiS9WxSnAx2CSc9yk3/nJ2VaolW1t7JbUwDGxWEVTknxWCosDaPpbsxdLodKThyYQMZ5w1fCvM4k5amCUNxwUVhHoZM//avhk47XkfObcviNzXi5ms1+v1qFLIOond92cRwzqPdYubaJQM/LsdVjfff9++V6GUh1wJw8859SqRrOvXwpU50bDS3y+EmEBUJVRRV1DT3+LRp+q6oNG7BSfv151pNHZEnuefOqs6UR+Z1Y8yFPfL02ppLKuic4qzlbiu3Mv7fVtpCF6kZ+WEfgWUtj/mN6Tax6sirLJ7G5kRrG6tdgkkRnpsFBrtsEYLdHEZiTDgA2110BssyeldUBiCymxbrqThw5ppnYvaqSirTsqjIS+V//ZOJi9zNuqsqjwXn0UuA4KWCDgcU/GYeYnR+uRofMnmTqQmcqVSUpigTRdg/OHHMIL3kh9rJlefAQdabhQBd1VBzlYOTkN8Uggbs6yOkt9G7dEawPSWLYDP2Eyl7VXWrfEngf+Tb7JSXZg+Plm0+1t+gQn/XnJ7yHfdTbDy5ZTD5h0f9Nd3dYVU5LV5u9XLpwQeBJG261PdrFrsv8bykQ7WZb2ZgpEZbTuOwSkXoOQGUy2SDZlWnc6OAhRrzSOVzIeBKHJaA4we1bTVfYfeXrlBPz0RHX8Ox3b4MxAKgDodFPx1hwfDZj7ug3rI/2oyqsXa4WnyY+3wWyVvvgSaC0OQKSaYMoEJ0hZ62S2PA3OXaMITs3rC0eHkpn+Crk+9XEhA/gzYfP47S9x/cye4U1Ou69qtbjgO3Vu3Gqf4d/r7C1srLWoxfyxB7woc6yXRhpTrhAxXATcs8Zn4fBR2PQHja9Vx7+YFqesOMmC4ukHCZr/LkmgqdlqCd3cqeY3czd8GvKoCxZG2KECuSTh546X5UJ517AwPL982dWOYSGegvPVbWeIjlKPWsPHgR277Jy84hCZb/WEbta4ESwGdxfZZ0qjsX5WmzNSZnHr/x50Mla1g/RqFEt+FJolqx/WSohi3SsLTYpbvTXbcApOpNBe1qJhW8972sMyWZVx3N1xOOIOvAARDpHeW0lBAOna8GIA3o+CLX1b+GTMz+8aKHstR8Ftps5zKFgNfosnIwyuD1iUbUHMKhLFsfGOccaMDnBbdauqwO1se8htOsY0QDAgv25OczPljfsTyvApWcXw1QM3zSIp/OIAHyCrLOuiINUBJlZlBopNTtNtl23AqdwB8GkZv9Yj/B4VaO1nqqYKt9sDKq5yYAzYrUK/CAkRuuzlTg2ueB1q/K6RAuOT3zfvoWWhn0cOfGKkwqosYmW+3lyPh/pBtKXIEroHgAVIs+jtTyyx2On4L7t0ZpqeboX2MxDTPy3JpbNoPNqZYwONnZSLEwfM9NzIh+MQwjXVS2okDJ0GNU0VqjsqyZX5ZoBihWp0Co2B2wlkle9oEepRJcuhE26kQAuUIG/3dgf6HBUuCRt2z2WKL4JJ1wu5n7ffaCevVCbm1jrLPBUbMHxQYkbI2RChlLbPIfhhOPKTvbwea//QfFVXAqQO9h56WQhA/JAf/vI6aMuLwt/ltCCarpTLor+JF/t8fHhzrdRw3lg8EKxdB0aGE2i9w93kJJ6rcx7VbWwDQDMZBx1Qn1i+rC5Pq18rVz7akRvfefAJ7o9bdfvin0+PI9MWIRx4QoTvuIY7Qju9NmL7VSx2p4yBj7jWwpUvfGTU5JQHWmrJx+6dfFsK1IGicjQbyP1ExheLK1eJ9EZZrO5NU3U0cA9YTcRIRFcZ3bH6vSkz2oLuLpWhbApsj5sFp8Qqg6F1oQKYQaX820aNY73FcGKUQpd1RWybf7WfeBkN3i7qhqsrR9L9p+F5O5jqBuIVY9NKShslpmOFsVFSg0JZ/ifyz7GTcabfawysiGI+kmD/0mJaQ1KVMt8OEj6MaOFPsQcWAZ4LdYjz3Qq3qy69z65qJK6dOQ8DYfrFSeodTn5fGwVaVheyJnt5DQFqNvZeNlWUk50wqcRX8HojSMDZeiOEkLL/CTKgcHMmHj2G3g6vMm6xLLxlIQ84wahvERjRTI79daxCwxgG4umDdgHAHZv0waiUAUvoVY+9p5OQygiIlcQwY8wrSz4pqbL30EIeEOt9ezWqg7yb3Ni0jAnSN65YyigHILMZ60pC6vQBoJFFH84JOIJKc7dSLZQmg6ZkONZQRlDJUZBgSVNalHNftCEqtqheGKEEfVN6mQlmZaTF1N9iJxPgjzClupAMXzjMrta2fs91+6yUxLs+kmn4Wls9vtL49ofPs0RBx3W3rGQpAcbnDfVJ7BNctXxayTCpsryYXQQAdieotoiM+pIVUu1Yfhn5ZLxPxtZEs6jDwHAZ0NUCFQz0Cx0ocCCfmtou3zHo+rijSVXt0pgAT+qqZHG6pfsHU1AGboXHJZU0TZXLWcjDoCqatkeEyRbNyb573//u/O2AsQlMlRtXGvi2k5aaPDXStYVhrm3zWqyWq9rPwDuQEQAtnhN0jTnphLfath50m1HIW/Ib//26DTkK5+weBVYTsdFL3BwiMrgEOUdACwQakwoPLTMWOnd4bzK1NUC+XMwtOpNXrV9ufD99znbT0O08NL8GdUqAMGlxAXe0Iu8VS9ycFjWc7gJKDph6FhpstO2iYAGZ9YCZY/QHSMpS07hgtD8qFxbtspNn4zbNoba0Rl3pMVhSvEeT3HklkoWbwLpF812F+yu7rD6R6KqSlDtv72xcpFUZtpoZP/bzEvQvzdtOmSEa2Dvqr+RYTBcgzNXlB9gslwh2zqbxMGOYzhv2ERsjaRNWavywrkyYPdHU1ABm0wAgEKn5yYXI+I7qt358FL0067I5UxohLO56+0k1PWQ3Yv/l//n/z4rvd3YXNNY6lRbdkX6bM9iX2oqs4kyEVi7ambGjb1/ll7YvqjM3dXK52PphGcrZnI+cimBG4ODgwg5XJaD64it0ME9pyAZSWoXHhFBjKxSfY/IEWFR+Cy71DO9V3NBqtK3qgx+LQlVyUtVyUtE6LsCiBXoueBYKicpsUuVPm5SwJPQ53iP9e82QHeDxJukj0q33Ntrb1J1gAMYggt+hvmtSvOZKx8jDKp85ibyaXgAkZqnZe4tHmX63zjT6fC9a/msx+g/6Tw/74Oc2b+cybYS2qmzkpPrKRmA4ZnSz2mxoscHTZVXmk2xH53ypWnaeQzObDUefXOR696M2TFk8urRQizMUzOOI1nRTY5s8W9RYZ/Q9RqHzjS+Dsl0SWsN6nmLu0KvPRUSWuRXlQIduO8bMkFFPXcCrsFEhGVmyPnA8fos3RFlcg2tMgmKwZjkHTMFQuUfa/1eEyjnFHiExLC1kiLW/tonWX9uRqoKnZ0remRUo2d9bprXnPgqs20mPkEy+RIM43xL/TEAjG8dPFhxlJAGY5msatzlPBajsE1MDFXhBdqA5IYfWGN0a/wGLHMZTiJ+ROTv378VbIoKP3JBv72GIEeXIHO+xldtjqaGuuWpPanZ5lenPTPNFGq5IAvwjR+w8WGVrLWJu7FN1KOK2ybIrJftuetJJFUlU4DUJkheq1OCzp/noUiuBFeQEp7UjSvA3SUCAAxwNNI1CtQnlkRHqDlMxbjN2tb8H8azSnDND8Y1jd8uL+HD6NisifgZ4X91UC7o4NCviKjeo6w6GjFvaD1kaUAxTFJyEHuHzVzUdYNH6p6Kot9aSQ3suYV42QzsLl/GFSRVGANIuYNvn2a4OU2YGvwaduo4ernvW4WSCTdUTSPJRGhqbgDj/mK1ldlTY4wxvlqiCk353Ijjh6Knxhgil6raIR1OWxVVtZUo2+MvXvgeY3zkGmPcldMgohgDPj2oiyiEpY7ZZPjgyeDCwskSFYZDEucnCihytUl2+/CSP1s9pRfWwQCAj3kIQ1UDEnteqSzFz3PbFoOLpHXGoOvq2Txdo85slY4PEwEAHDM0OeCevchw7CpBGUPjofCdIOreP38D1ukKnorf7qQu7ouWs3JJ1lnDBAwniW1Q0WFGnvQpInGmnYjIuM+KPrRGj7xfx7jBEMK6g1vr382UNvhRNpokRrWwKmwCBcDADYB6u9CtSpkx0OJ6cl5tdGXieV8d0Gk14XSrvJ9Le9liBf6+v1VZTMAir/BG58WUOoFJy9zlvF/g5gPjvTDjLrdZUyPgZL9D/az0SUTa+QCtrd2WRATXHEqlDlXVHbUj8Krq27rWGh5JsPJbVnOkpBsSvc1EUyYnj2HbvQJ9tVqw6uSjOe9NPHVXj9lVaBGQhZnN4QwHvdoq5pD+RASsnt/vryfZ+Q9qCFWnZUB4vC5YIVfE+Xcs8dAKm2ewP9sI0K78mYEZYlRVKHwzlajbzPZJu5qKWE9sdAyH5VJexSprqOsMKWukhxDbquP7/OfOXbWJ5QyZCnD5XE/xM8Cjrq5lHq4hFFUqBmM/5ShHg0VSQgJQznTJv8HxN1dTuTO6UhRd1I5OzIwwbDePLeaNxl8Sasjlyzyk5dylrOP5YgUwtdB5VOYpSThi/AF1m7j0r6oqVPXrHnacDeeiNeN85pbWdhJzY4ldvdcnKd0AcoJjGvRTDUmowQuqFloxbGvytoBQPwh3xugzV//KwGYdnAjpQRwJPLDKY6hQ80gXHPcOqp/MqQdaSOqkYeNM75DVgiB0COnZkJp43tDLlZZ5pGfmtPzzEXiju1AbwjknOF+V03Lzk+oFPZnXnT18xTtcwKRAXw9lXFUA8i/CRbAMpiwcWcmXjmZaaMe9rPFE4Qqx9cTBHz3Q6yQJ+1f57YvmSsbEyhnx8azkSVnkNnYtB3UdITleDd+ThM8sJT9uqrZnC+i/a9obValEaP7ZCqr9cZOqqjVK3k7vKFLNZIYKZeG3X0GY13qszKxWuMxYN2t6ZK0nm3pkG120UKlkZ0UO6JmBp0Q8B2ofQW0QYnMsWoEcDiV/7ljHsRIprwtUJ65/chFGhZyReQfR7o7swyWqi2ZoYV0k1UNRvICqaglRoCgZ8Xhy7uWd5u/Xbn2raFSdaWsegqcTo5dqfyRIt+Wbmmrd9D+d/SiYEihuwVlMTBedwr2a9I30hVY8azGfUinrA3jooFY5Vn6L53edyKldlnK39/iRBxr63AqXTj8omdo1CUZ7WPeW1L9FuS03z5B3Rb1Txv2J2GZNsmpsG/CMjRtt8vR6YKwjAyd7Nphr4dYvO0aTkqcR4LM/YOlHz17Ey5N8aEPcTDp+1Kt774Cj8Xh10SyEXKv35is/t+rctYjT2t2s5NnTfQLP7591AunnILVDtI9YR21mKa6dCNXWtOf1xPdHjee5j84UMPvyuWb2m7XM2OGBu21BIjvEZ5Ck7dbL1Z4K6sZsZISeJo4A6iBBPbKqQO7/t/UiqTtDcg57lLICAhxjmCcBVT9BpZCqclSl8JMs1J/3GHOTbmgAzE3AC9DuOgCYOZmSKMa46B28UP9xyvCwcwir0/9kjGOJasLjyuXE3f+pdc9iL4XbhIWecDxiXWveZbW6R74B9MFxtxpyw2tXmutSMn5yBSpgKbSkh6E1dBgxoJ3VIuBv1+BpASpUStRwnWoe1r+PZX7szaY0E9P1gKrJvXJNUqz8PFo9+XFrqOJcW6w01M333e2Tlrnkyd4rytXhqJRp7TJn+B5a2WFoM9ypZV4EczcS3XqtaqHSx2o8kLHUd3waSC1Qich9IpfqYk6O0HYEH+DRiIZamGdLlnXUCUdd0Qo8vX26don7H1SCVb5+WU8TzHazlAwNt076HEwAop8Omu00JM5vKQv/l5sFtmSMFgCRdR5tGUIXeckTZSrDMYa7rR5drx21CsNuI+qTFmKaN3uMPklVQfFKKw3T+tgvhE1v11ELrRXuFHtT0apaE5gUmhzl0QcAWDsIK/vx4LSd1NGpu/V1vREPfbTfv7/KqvJ5zadXuGJc5YTjDuomPo096s8GdgOj1vBSEhsZX0pasXo+Qz4n93NWD9jVEdRYkW0R3U3ENKJRurzE0soC5Oq+lzq9ITvm1Xphl6kOf8ZW/URVklRIAKA684kjVESKwERkhXNHfKPoAkBeYao8CghB4R92RHkthbgAZpqq3FO3bh+ylkcZWS4qo0Y4KEmOyHoL4LNuVlBVi6+KEIVOggZqCk8mpUGh8uz+WXkQCEuoSYHWwPRiNUBQVYcQtqGPZM1MfzKQRwobGwA2aTFrXjexmWk5VoAotnODffj+FSuJnvjpCf54GK+MWersi1ALYjSDKmXh1Y/7nZzGmL+xMlTfgUHvPIf5+/1aherzKwe1WLvguvrBKygORP226JSD/3okp4H0Tr3KGIbLC3lr+WNV9eZ41ZWB3VDVmkNxH2YuScZ8//S5a5m2GqC+Rx13uBdNo3mxqVReGG8xwEWExbTAnn60KlAAcf7gJ3fCMCuO9XYTKxaT8ETQ5gPhRNidPpUxXspXtQa0G0nUkiuO2iBivX616fyX166+NIU3TKa7kHQ08tvUw3LqX908gpHZ1leDrROMcgRHlLxis2C3tSKNtWizAOu+poZsvWmOVIrsi2Da/wN9v1fVXXzyo5rvRTfqtWu3+gt4Z+AVkBHnbR+rHURJsD7tZgqI6oztQGHXZ3F5g//488k+IgSnKr1dGLMSXT68uclsgl3V3a5U9eTD6ZokdWkrQ2u8610Z3rMXNE932eyI+T+5764zMx7oibXrG8fuJQFcM6HI8vd6XiZ41lpn36YR8FeXBxedW4Fl4jcXQM95kJ66L+1X45ngqPJQXL2ISEplVSypi6KKAI/p/05djWVoGusAZm7U97/lFhCS960SIxDbi6tDsan52nrTG7sqOF4aqsgYdu4B6OU2E05yEAOVHA8DHRZYn21kaeiRjfLm+/02V6BeDYydLxP+J9q0wo3J3Elij/QILpnOtHHMLpO7FDnMa5R29oU+rIrUVDNZnmXGusoAHsxO/bA9bCcpHukzn/CQ7ZFbsdpxo4jcHKif/F1XTNf5SKwX36vBXPtlR+dFu+3EOWLXbo5vsTnulWMrfSpNcDBp0xFsde5YHx2jxpytoxtULCErv1ToXFVwBfjAKn0cVDGd+a3rV1a57aldWnzor6f8x1jJ/hu8TkD2oO2nr3ajuKuIfF4B2yVRbTbkxMy1v/6j6wDYyoe/vJoefm9xr3xn473Mk2epxVRpbLauIqC2+W+rp2oJbP2CksKFfEzqNb8twD7p/CM6u749Ypqx4Ima1WlmYeWEzja7dAMEhL7N/kz/Cl6rf2/uJ24RcuA89Dp/PvSLIj4NlyMkx5Ktu+eT5/56Z+O945ofVsFrmpZk7GmEqsaqO0kZ4/vS3K5tqp3iWuwM7bqVZT5fm/uN0B2vap6wOtAv5bExnizCWLpsJSyeJSUr3+226hKufDSI9t1uy6o2AFoEysHrK58wIqOPnHYWvTSgWJlqjAPX7bhkgczq2Sj8qUWjdDEtzqAT7TFGbk2ogJbsNPbPZ4OO3UPyttRLtgRguYYUAL5TE222RJWUzWUwwOaoy77PmSoGQEmb43aulid4orZrNCkdX7pT5TF+ptewkqKUvEihR9f1YUaw/oOOtpmb+OFfPR8DeczlbzVUO9re7lbTZixqAV8gKqDVOqumMdzrNt9ilo46qDuRAU9RCpUE0TyFQwcOr5i0+sl09TI/lt+vp0+aADathIcBrd3k0n+rPA1Mb+jy/Mr5JDdt93Q/kVMyoQptOGvegfxu8LsC8iMsdrfV+HCBVlVtfmTEPoKulAj1xSUAajtXag1TrDZrF/b4QJwXNkhDnpVH+VTu7QMTvQs/sQo3yNvfo2t1rPP3dnp+Yvp2++7p+dqt3nfznrleBLHDtDE9gOYVcfNmsBq8XSh2SHKurtkjhWW56VFbeCbjLuC7Q1BfPVHmeDXNefy8PeTm4jQc16Z7rKmzqH9vfFjcMl4K0HKvDatESNpawbJ3SxWW9IyUX4x1d+BrAZFLVRQH7bRdQzdzs5ukDQxNFB1ZPK75IOS2sqi3pco1I5C/3Tz+TCTd8FW9WcIZxvBjcxWqwZ6jSJlyaIlbe+KQnSt21J68/6QLtzLN/ynu45J8pUBjvbOfeL1AOxt9AkkOA0IAIosvOssfBqJ3OJuNQwZAEdukawBcqkp1TxJABF1bj0OHvY6RwzYFkJu/mz8T8FgrSgLslAEywHtwjyQQ1TEsExE1csRj2YuyWqizK1L3iTojHWJDkFj4AMDciMjYo5rp6qqD6+kvDwfQbqQvYG0qbI9q2uM3WiW6Zik5kcMLv5tJPueJj3YXw1PBztWD5SAzg6F4Dw2eVv/+dsSHZ3bfWB8bfaJ3DmDHUcMHlKsdmgqlnDSMrS8aVKkgdmboygUK1Vj5umqvGcVExEJQ4ppLImsq0kfzsxi8DciGbwXS3r+g0JXXiX1CXfzW/TIpSOIfpSkBXuzNxj+Vr2o9nq5xy6Fk2WlYnhhKnjhlWYwClo5emPOlI7BKoqmX55n+bu3svobw7TqB5bDq1kG90zeTdix51CetcC1Qik39ln8L8gvwPMVqN9Rw6s0d5l23/M+uF5R/vH7keVFAfIccTm7KC45HTd6ICSA2502qW1z1fd8i0lICvOjncZdN5A8++n96VfpkYqKK5tlixlv8ROHkBJJ1WL7DEDXPXtBxJn4jQtagp+HTy7XTeeWBhSUYmyy5eo3YZGEn2nr1jWoaQ/2nft+vJ31bNdX+d+ftel+1x9NeC/MEPp8ZRlKRXftxNlHTQNc8xY8EssjJzX2Mhn7Vv3wepdTMyNUsqp4FqtnZ8vMNgFQRe53cx0UnUTr0l3VQeesHMw8VEW7wR+UHdX3ElKQAFMRQWhs8XOf1rVvvsuS4ftLl9OlaWMJqMEdyKIDPMV9+Giqutdg7bQ8LClFkgksfbs5jd9TzsNoIySucXLimL8RkhancsyrLnX8kROlKG8gRFmcvFxDHMdA73kqq6jc/JiUOgoaNw4xqExIDQ+YJIEPvW+3ImH1+PcWggGolrzhx7VJPj+19P0p/iwhFWUac1ZipaubRxypLmY98dpL1rxFF3B10BTSUcRyEtQrAUh6HFJV1dqiuS9JZP7YZ6JFZmeGR9CRBfnVwqEAB3/UOqIYx+LRk5zEczRbzPhFsCsiK3ff9+Rz2AFi986/VCRjdDlEQqsKPrqldRKZ2ZuSDyr1Q+8FDDsBQlFPnEpE8AGWeahSNH62gh8T77EJaBb0uCbSmvCZ4xmMU0jZhxIB/eBo7qKpN5l7FYLHQyqEtU8SWEBacoRd4vbyM860U/hnGhAA05iatCACqhC0xjQoR4+J50Ji9DZEXKeHglUu1bCSYXZx7QrT8TcZgHFBNGN2t9Lpwf6nGi7K7qc5G71r7yX5oGYDlc8tjfbBhJTtWo7+UWHnNUUpqhtKReWcmII/ypdqJrcZSt7qHBBtSWuJqW03yeGIKoHexIxUAiRCdttsPWyIEllMRiyB2eVlkYu6ANzEzg9TZoG6Uvy5JzVapt0i6T1UsUciGAsvpGbVfqhY6dvGnnF9RO47Prv/UwOUTLscSVn4gV1cySFofTrvMi4Bn+fOSbkOVZKalBPApe+JrpwTKnW/t+ff7N2CjrqkhC+VHSiiGms/M8Cro9k7sNNJaw1D9fD6KMeIVSQ8yWDxpI6A92ZJLEiQt5Nhmal2Zc9azr4KGvRvV8OUpeKZVnHM8guDS0GJW2HKSjnsej2AnUbi8SN+jGP0L1WhU3ACNojSwbqhl7MqxT3Lk4DVX1r0VAK8/A7qu0Jbjaq/CohbHgTQ5hRvpGyUPLF0VbPF2cmXPjnNBhH2GJsmM/G0IYZ4DSKjivu8xhp0rgvS+BKT4/e3PCSpxXZeGp2HQTNYtqsbbgvXLp1pZ9XUr/UckDz+XVLMTzi+mGeIYnjDw+qRhBTQmlbKDitLOB5UfqL7eVX0G87Xi4EuAcRoAoaqfLBcMcBhPTJW0Pqxl164t/plvOi7aB0Bx5RMv+2SP0Uz1tIJ6gGF9/sMov/Hi1Dhl/Nfw+sGj+c+vXPuo7TaQ8uHR3mNlgvptq2U3D1Ut5s3x5OassBpgf15sVTMGeT8IqA+i9m4JA39o9IYKHicliiEM/lk8B1TStQFJUaaH7Ea6pnOdVOKBcxz3+IUDi3YMNIdAK0hT0Nbead8uxuy0aoSTvFiFUxEka0j3DxCKAzj0V0eEXTxbbc5+m/RUHCv/1wobJbEyw0qls2P9sgBqV6UPSxrEnaX/B9dTp7xfB6xXPXAUebusf5uY4yEpgqo+SlcUmNYFHFCfo+Jk1JWM5qWVIfEzgg8q6+mjN/BqJXWVuFbVcD/W9iR03tZWGOGo4cSx7fMGtl1tqqgJzg5SlbjfsFPNylI3iNMPwgNmdywfTnKVuBRsrPUCzwt4LypOi7cw9GtzQy/11AoB2IHUdTBmV2ZPqgAfNTM2gj9B/q4iXp5PvfdKpRcwfnxeabvo1Zl2aAJ/JAUAO1h1C7p+UD5FD/8GwnxbRQnh8ev3zr6bSkZAPfPM7h2p7nE2Hap2wm4gF2ZPS3jnyt5VLnb4VXVfjfHPt2Vn8rqua2DhJWvXHKcEURdr23vBjeyJ2F14S9d/sErR+cuggNElgqhYg2Eklkhyjmw4gsuBf4zhvN5DYxxtNPZiIolcfGW7oW3+u8+s17SYk7KFDbsZ2Ez7biS8Zrdl/crn7tdkrwi57jhMxJvBWztSFZIYJwAWEiPCevybquZh0Y2xtAcvGYy25zYd5TN49Sc2Nlib6yqpJYSd9JGF5k9XFfJSzyrMk2hzXmoUzszJHM3ATV9WmnUMnUvwiy81Jh3eFXrFOj8vdPD3tQmSqkt3/0jkOoPblDjLhBDWjqu1HbEozsqCS15XF6zlaNhVRqoz8aAxrHLbEsOulryMEFxWbOxmuCx8ua4NWkriwVNVZeJ+f5t5D3T1dzWQ0QJh15U/OXanyygjW1Wp7R6vH1tJeXmajdj5av8cr+6jmU3BLJnPhQSsW+1cpQFgKME4ls1jzUs4jX27sv0uCOUvE8gJUrGyWHm7CYh9yjXveCA/d2U0amBzZ3+8rF0pK6heyal/m0im0B1//thu0wxIK7leTaGp6igLqvX0Yv9UenCv3wuPkPlRuL92TEOObMXYT7Yhsl/MCtyJmR+jvh7uyc3/bq9ywNPIi9XskozzRrq8131zC5HdoRwsya6ychvH7c89F9mYu/bjEJOhHnCOgXJ4ZRlXN63+xJxHzlkGfqsRb+JjztJer9nxtsdMVZc9P4t6vIGDwxQF3sYq8ddsgdocdVpDd6aZwtWjYoyjdiHySiZyZV9WFCw6IE64UqWIrTY0ZkPltwwJj2oqLvrNtQgmraxOkhDa+gAA4aBI4kTynpwj9byjnWgNMFN+ldr5uio63+8hRJ4DsHLG1BpVfZMUxQgLoarmlFdJC6K73eUp0HBXXsVb6tLYPuH6MwHbdeLeYfXqVCPHNkPcmWm9OVcrdM32C22uNqBS2YXvqLxCBfxYcb0E6vEhP4LkGJ0aOCLbBAOT+w/Um5cp98Pk3EHBaYx082fl+6Yf/e81XcHKJK0GrDy/G8uYAtD2N7fvtNZZxmkbQRZM3/UgVlnd3x6vl85tr+Ra1zFVTcNKi7ayb1nS2wUuDZC96aw2XzwB3/q39QhWQfgBu2fy7AxAskZh7pbjBbv/9PqPaqi4/1BbMWD1+c5y9cMXNNsnNofaTjED/KS9hCGNNDcY6lVVdDo6exmuA4AijAvb/UabNbwaSEcIcRLVZpWqkO5yytPAbAfVvj1qp/1+v2nmMum2t2V6tcDcYatY669HuTu37NW+9I+9PboBZA0FNI3U29rtTkKl6hM9eO3xVdO+9cLp1aI5j3xYFcsLnY4UuMf0Q37UTlZqb7p+orokcUlF+eQXNX3ioeCF1e06WWqr/UXVH57sRtzDMouMLOD9Lg5jEqEIS63QV97Wk+KBnGhG4nyU38Q0QqB7TP8aWu9cLSIYt0HFdbLvwYCNp2WMow4kuQ5L5lXjlyoW7SAwbR/72xUGaiQDVZ9RI213cLCsR+sa86HWFsSCnwZuBefEw4HXiUujGHhYN2ym5f3KXQmzeosVXvNDT79CtFKkRcj4Ln7Mv7+8CjsufpKqthMA2hA8/z5Z+nJJJFLY9ewhVjUAO5/xGeJaHnGQtkwVosulME5m3nIgkBwRkk6LQi9ksZ3I9iQPeJoVOHLrvJQRs07ObFejmK5D3KNJ3i9VJa89//2uYoChawTTbxyX3So8bRr70Qa38g7TfesaAh5gv+U3zIxAhWZe8XpfRg7PsOURvszpmdXhA5AxyhozFg4tBIBop381bKlMAN/QMuefMiUYgHVFxa7r5E//z65zd3MkvgsKa6F4WqYGW1WK4/NjnsrG87+50jwbfdKeLYGwcG4QEb2/7Vu7uWxetlmQ4xyQWOhurCAD6bgcgA55lzUkoCFYEa9u38mxOI+d5oBLleghT06coIy5DnWZ2jhTVes5G+FAYD8+tl0pEUeGXDFa0ZnFBMBY16Y7job35oiEm17d8fo5m9E7EpCbQJkKVVVyhklU2feTvC2S56SXuKmLpJKIRLqVhSBBk3LKwXZVII9MAjgH2O8cyJLMI+JVU725R0Qy8twXMawoi508tYzrnmDb4W80PFImKUac5aWWWenWwQhiHkm4QLgDdkRQVdukPjxblAY/gKAF1E/V+CA1XQOI+T/XDob9v9DKg5Qn5hv+iw9mvEAoQO1nGMtyPskNQCAgv7R1EiWJS+DrGyNyPxaRt5XM+39yroslERqBCrLjypDCenwZAKB84IIaLvnEPNx6Dc+yuj4pG9kZQcbGVeqjnxIg4a/QFWXCk2WaKt/d2VasXTvrHNVrfWWvRxk4HJdmyFJig/x0SZKmYXE84UhE6irtb7yTJ1n98duje7FTtY5iC8cvdFur7Zu21ddta1+X5paZrUnPCobqrNA3b4XbVIodrfscXx8Vym5uI6He2fJtlYx6ZHpSqf7cqXGE4cjhgdbBPJy9xk636l4sFjpL1kMq7G/NZ6LdbOiO0RPwqWF2aqhqzppo7Gk7YnSU/VrlVq2XzJjgWhVjAPk/8JjbVcn4n1Yy6c9hQTWHt2selQbti85sHVR7sJa5h9MnYwloCwLF8fWdAMe9fYvX1cHDxmbtaiAd1fJ0o09Nkz2mLeVlF8BUkk12Xh3rEzDhxrXK8cBIJOq+pSeZ3b46KJ8TRsVLDsE8KBOVfTj63mjrx9/rrl0iyHkwaq3/RxtXddesnAqcabhXGF/9bP0XBFcDV4odtPrLNUZ3eW03WrLtCwrrq7MzY/3SUCMZezIXD/WFyFzzaOG5R3YY9vvdUEas/KhWu3VuTNf8VpFy9/X3YUxsVA7zF89LlrylwsKroXmI2HM1Zyyyj9a9FlY7duYHWHKpN9ZyLbvqwBd98qBkFjVe/kJzE3CU6zriaDsBC/z0AW9+XwFJ656HXR9V+fD8/bH4EEOLqlaOGJKEZ9X4Hm3YVjha7DP9Ic9mANZX7dsGUdKnAvyjEl+UYOgiR51M3tuNZfwdChBXw7dRJqDthGy6uDax/MQFBXjeIGuzmDoW86+hHb3YhriNR69oLpF19nhyIzYuMFaRZcA5D0ermx072CumOwV+o1/ic/u7uMKlzvl8bNtC9DQ0av3yAknlOgDcYiub5DbIuWaJUVXFPXQ43XQpDJeX4yTE4mu21nenxLHj/PTIvQjeGGqT/Uv2MHsPYFBIio5EdpV9BSA27abLrj6Ns4rr+dPBGTOY+/8fl59e+dQdL9euxKo59/sx1ciqo7qabdpsF/+jTrh1CJdVtiAy7jx1wf5qb2U/28Fnujf96TUzzOlP1Gh6/omqacseBgjL5SL5cMZ8a2g3iJXXVfWpxT0vHLC0yG1EVHT+GxbvrBXaZoE/2xqqTMqrIAZ1FfeUXJIYnZmPHIXnXqt6uH4RHL58W0zkGbVUpw4G56sKUjPNR3g65Dp3VC5KZoPBo/x/xWm2+tqH9KKAqu2ZvI6bmR7cbpPHnUM0Jlibi6JhpGtJDaLv2E0cD2xmDuWjbKILyxGtjmO3bnP2yQtEutQKzDL7vinArX+LYlAMxC5nLYuNjXMmz+zKOfa50T92KlbOFA8ugqpS/PCHocqYSvt8PrfvcxAzWAHgWW/sEFZ43hXCtOxQAB9AAI9q2FnTMXn0qA66KZnSf0feONh5gySVuUM01YfTVzxtZbqJiJFKnXEPyo60r8BBDE6X1BNGa235kCd3wa7L9sXr8rej/wMI5tPkrt/zpjGs6Sx1EBz2V/hhhIU8YVHosPzaJfmX1NM4K7KMZp2/v7F3IuM0/H9jNPownD+DSUT0tKPfKsM2wtnpMw1AOJ2q+rksPkdUb1WO8fUjiQoP73XuT+oMzfxQJbd4Fi+/++6WwI28SN73crJjVbh4EeOTY51fLWp9HTFOUFPjlIEgyft7a3SR9wJgyQ3z80Iovb9/Ww12jbHsmXGikbnQfXQLFlzsk5iJ8Vek+eVj4edJupW9qwdsGEsagzsqPjLQITeoeuTSWeP+hxeLP/eukf1SAQdxgcPu94QHT/Rvlv4IRpKuPlFVHyhZiycs6k2OmiTMoUkfANNs5KV6R23WF54CuK5HVzC8cpu7XePdngR2oe0a8tQMSqrZSauH2LQfNWHT1VZnbgJOerpl8x6k4gZEcV/XH8UNFcVtmtz7d3W4K8/sYETH3WavbYbN7JKIaTl7YtrpokfMvpzcZw2ZbhlAXznZFMIEzCjN1fHa2a9C/nJl3h6j4uEIujMpNOEREfiZE1KfZ3lVjUSm07VoV6f5UIiZWztAanBdETUv6AhhE72nhrLYBb2hFz5f2yEcPka9r385VDk4aG8zZwNtEDcUtBwprUekatH828xHqhJuQ8eGR+uRH0OM6hV+3Z26Iod1o6Qvd54QEZH7vk3TayYWV9+/fuqDkQHVBapRzLcAM00wgJH22vccq3GLrr0W9eAjl3GIESP8kSWkUDxwbAwMsTAOVdVx3wOQ67qu67J0ydr3xkjroNt1yrQWKNwIjBuMxFnlr5/wpDTJGhbxS0A/A2KBwba9MYl+e1TTTTpxLamqfP5J6RL5Q3Lod4yR+fsJdwZtvPvnoknJGN6tFwmUM9VJrZHbtNTkgFHMQBJSYrVGbc3S/l05MCi71mbm7+AzxrAK1/UnMzTl4MrOJfC81yKWcxa2Y3JMj8POM1K1YwRgbp6zhbpaueu8Fy7aMMUyJwE6TAQzNNxkVphHB4Q91TgeHCDlAggKQMiFnH5TIE7vozoYGDr4nToatry2OJ0pzCKTvXxodFHNd6bPqCht27/LpwMHw8wOttA7mrKJhFsHhRTq0HlSycD3+/1f/PMHQ8c9vrc/F7FlKI2w76EKuUiaeI4UzhoMbDKmFrNnYNK49G8MZUce5UE/vkCnmprsdjZRtsYiCxelbbaJHFOjUMUYw5qXcNLCNepGKOWrjvKrmrsotq/ovu8RPWjxKhrzLUqVK9TE7fHVmWx4jDHGTbLmH7YGhqritjGYDlXN3SYi3uGWnCDDP+4POWGOHSkaM51914cqRDxJgBmR+MtlM43L7Bj654/cwZB2cFNqfwCebSb2igDgUBtE+gRAziP6SOzCfGDdM1Wk946SoI6RptHP7rCNDpGQNpRNdVILf4ToeVbM0stx1M4ykIvXUmPEV96Aj0Ec8VARnHWyXMPzlyc7hRm753pIhm+ZfkukULidJHCZhs0CY4zP558xxtePh9M8Lhrmf1hk9kD6/6QpKKFQB8N3UCsSU2BzO9PQO2cxLjE5M1mFarhmceoI1By74oLQ84JfXBexSROyyA6XvOG0rGPdZOwxxnUVN75qA5cRxJAH1GmVTRbqEMS1+BigGmPZ4SpD7/DLzByZeTUnw1aqqnLzHB06Z9McLvokKFK/xQwobMgBO+uS476H4oZ8cmgXOtDur6n2iznQdrK4cUvhn6CGX3rfnBvzlLRzOXh7qHMflPqeH7FPZpz3uG8fRwat4YlKlkz/WdXn81HVoXf0pnOL73sbZo/nCjbDoc1udzGZlMl2UmD1EqgZJkCpQ6FjmNozmw/Cp7FC6JKjVNUSnSXYFwnytrMyMsRxjGA6ABx6Bwnh0qWx8SC7xZyZcZPm9igH9PZNCASEokNNrm44YKocY4iMy0/3+Sohlzt93++N2HFnFDGh5BwLqLNDOUkp1gGCqRQjRl/mr1/XRc86L6o6IvBSPE/XDR1Rya0QUAlxx4o+425tf8dQj9AZIs77AwrFV8fH7EuZcaQJr1vm2/qB7tFMsz//evBPknpY1iybaLwuOwBkqo4P3a0eOnNgQi1EGHdQRnVSlYTiL4atvPG6SIqPBFwSrG+mAH6/3+u6cIm5GQP6+Vx/Lvn++y8IOybMYyKCgQeHmyZlDK4GeUEHIP7XN/WNT8iPD6kWHyVJWTRCNSH1JpcqUuTm/bCDFhzKlLpWc61/MNzZIpfzk/l8ZDaPaq0frnnmRfo3FYzj1escCjL/asHX9WnUlHAaI4gtsELLxB4B6KBthW7b7SOUJY/78Z1mtypUL9fO+4yOtx0ynybzQJkK9sRvLCINwDSIigC5DlBtFVVtD5PvwbWdEjb9pZjzZu6RjNlTYYGci1J1khzjzrH7sS/W7q7YmQEzszGCGPN16+ufeGYn2h3aMLyKUmG57xy1NxQmc5nt03IEWK12lZSlmr0JV7KxWT+bqN9xXYI/XZ0TspUG8wLK+kH9leVrv4/ytk6xtvqTSzPEq9WGGC3UDIeqWBxf7Vvq7bpS6NZop9opRxWhBO/+yp3C9YiiKDNw2EOSfdof7ui3hwswa+/nJ0+6MZ6kRC/1zTOMiqfb4Ok0Mc2m5sJ9VJUcA0oMdU93keXsRDvWx0fpDweRZOvZLnnuFDz313rs+lvhxm+VhrqJZ2vaK1eYaY5QkkyYrDExZ8CczVbFd4XWFjOzv3w8MPSrgZ15/HJBVcY5fm+iKSVrGqAif7DKV6VP8w3GGISvw1dox7YsUxGrCJLEdGzt+VyMUp9oWBRR5WqWVCpB3EkuxjUpE4BjWSJlwxEzNr3LUcZ5NCxq+bwgVL11wd7Bq+fSJFVNc/lYxZxStTXJudTCeG6AjmHjt1h5ymGSJSUn6SEYCvXFhAlMgar2lwZ1EFNoiwYwh9rPk2ECD3du1rHxGKJl+qYwVSDvh+tkv5jDzxjYL2rHx424kZMQNtyRWxWcqr/wALITpx1kjtptQGIsZCej2bBr0oDF11qVuZNwDwNB4/n51IRlZC5YFPFJi1y//Xw+IqLpW9oC4q2eklnMnc6u0dQJ9BkxqUKUY62871Qu3byAUntuqkLcMfSdUjdZ0NZ/jdJBo3w7oj/smGWGSnM/WIFVnNJyW5dryAmXkw5ztuZgn7LpYngWJZIPs4aUw72Go9aedAtbt4MBIBpAIHgE73ycja20hOk+O8dtGV0DqnxSyrMI+394qYDjRgSuZXNGt7meqxr8EItfWqXxkZKzf7icRKhrYCAQTv8inBXNSsD2pEJeUWjddwSy6r7/NG4kTzo8grc3VKbeZy58jQwkDUgRuZFkrz7T2XH/NcwTNlvkyyHoYiYL2K2tp6b3Ytn3rQxXd2Gv4YmdSF9nXCzK3rlFGPELitWZ0fyE5Pf7bU0koTbASsNxTQDmIbjde673s+u38WRRyL+ikn2ePpxIBvwfBCpvqn4uoPasXK1DYyfilrpxiwA5CYsHZ7RiAa20D5uCrUR76d+dUHZENlctlDQ/ZmFqlazcdRjt7/XoiYwVhR2SY7XtSTWF2Li0Mn+1myh81SD5uWl3YxfiJx0UNzvLnGuz6O3yefoVo8KW4LWDICs9qzGqpMBK1Z2RfkbZhjdrWLbNgY6dMtMFXOYOyqtGFyHVkxlwE/lyTFU0NFqY948ZqFqj/nPcqlo3Z7RiVSVaKAX3LfnbdbQUXVd7Xy/ED2G+cZLWqMpW0hYFWJroslM5Khb5lunICa32tna5mPRhcr/PDqt7517Shk+VN+SyVYhhfo8Cw0IkYs+ewhbY8aPgHK/PwcS+2uwmOSg9jd4BfnzDXgmKczdnvuuJpA/lM7aH9G1wKJKJk/SWLjljUX/ubPd0Nc1Yb2aBU1u9ksvRzhr8vu4BeHZBkoH05BO8GDacOrop5VbM9UpipKjxFa1MM052L0V0C/xdWVeojllQdyye7FCV5COmKEyyoPxQT2vxN6xyvH754dECjSUUCi26wym5eQYnE3IG5kfOyU8q3eZ9enEHj7D7oAt4axNHGPbePBbOAjlThTW39MKEpw/fwahvq9gmKZI9Xoj5UnOjWOPqdu24NCxeGnovuTP5k1vQ+loX9ut+NskWpTkLE8d9VE/9e9S9O14J5636KcpNN7+23RyX44Bu+HcYXgR8LXZG8Ag8Y45w5+GWlU7jwkNShBeQjii0Ff4k+5rv/LHj5quVeCTTi5uvl/6dHtIC24OX7BPnXnhx7HYtp6rVNW1UfVI1+W190hciovIs1+CUwnK1oeM+zNZ0QVDIw2ILybExKFnp7B/vDN/aymxgVaGpqnz+1J97W4hVlBdDmTr/P1L1+fZF3Cb//M6cNcibKC0AF1eNHoW0bDNoAlKrBQkLazpYduua7rbZ2zzuVkSIedodS+V0r/jWrU9fdNGn/tDiOD6pVPq+C5sFMSSRY7L4YMI3Ig6vYcXtCHRPkK2xx+PkXlcSuypxJruqJFev0d4m/FVQOaegplBpWa5SrVEJyK+eqGmYWCE0Ngph8V/FVFd4UkTHynbHv0m6ec9UoRgECQ9ptnl0bjNt0QKiUCugOp3+eg94FqB2EvA0DAZnjFDHGJdHLC+ejQtRNoVFHUdfKJZ8vTOICzpzHewq/umqRl10kdgfL9tqVmEM8TuoOVWdeXVagfk8dzEA2g/syPslG0B1le9RgX9BZH/1ZBTrT2wzPWe/7bnFHw3AFFUssnCs8zdX1dF7zE9TLJUjX4zZf3o9Uemprob47ND/BIYD9A8j1adOySfJb6qqMUfDmH7zSgpLVw4sf0eq09ZKnvHJda8CeYVSsSYWgP3z4TsPGCW6cVn7fen6EUdaJG1XxNtNrtN2HB5kbZ5b8osByQTi+Kr8LG0tAWalX5aZ71nPBmFlsPqJW8OxcWCxm3mRpeUTAzxd5hJz1SoVx6wtdiKda2NZYV6qWvDVyo1Hkcy9FpUaVXE1Kj3B0xDPesYY7ZRyTl9w9wKx19966kmQaz9i0zO729Agf+pErnnMaslK/8kNo4PnIFXPbbGDtnfoEaS1fw8G0Rly/bbel0aByWl1IxZ3pCq+jc0mcQzlGWWXzwNO4sgwNmIY+wjBVZoaYfLJInEnMiazDj00x2LoVxHT9RyAguESy76o9QOX783kh2PjrcaLP9q2HcLlidf/WOaomAKk9vPgRT3pjlqs3iyQFPoIq2M3y+S2GK7XeDhEecfR2dp+5go+jyifvbf6sC7le/1PPZ4NN5CiaWOiKVQr/A2S2Ke4xI+OMf78sZmGKYpW+XVdE4aNRGuPdIrt5Z9IvT0fYOeoSkBuLvUzI/1qPt7JuFZbe6S5Ly50Yxw9zacWsbHB+5UKfb8GelRGhfSoH6bRepzqnmaSlCOFq8FmcZjaeRpZ3vinNZc7RE8wnK9dz+CV6ygzvU9tvSrl96aPuqu+3VluZ8sJ8zoLWEmRNehJ1+1NP8DpPlPeuD6UOpc2tcQ71auFfqGSKZu9DMNBzFeJ1G4dUm+35/65PqxgZIFn8HY1+NKJrdr9YYp8Zafs9NZDRwuywCNKSIPwpd1jKOPxyS6eizU5QGj1L/CXmpeHzZ3YVehxhQSnK7mrVRU/31pZ4S+ZiKOGxPppZWnXkA3xBmr6mjsRjsborqe4PNec9cvGxpXfqoaJPE6537rDn1BVHfvU+HMoXZn++wn+J6TeVccLb+CBqlV7/0fA1EoAaN3V6eNEyRQODh50as4CNn4a4+0yQvLTzM9EaYuLilYPsXQkPeBn4+CmvJIJqlplGbPmXFNrui6ZVVCN881xrLpv+EwGsW5Ragdw7D1XjZDqkp++SvJzT5tzLHmvnge18lX5dj33QFUBUT04Ln5iS1nyq/Movt1TjYZ+M88q9IpI8HKaLCd3Tr6xDEX+cx5bHVGLPcN3u9LMY0ReJPKCJeXwTSw+LGZkcipn4JGZEyC1U2UqDWciusDSujnHJggF7RwIuTitJJ3ldXoqpSKUlSgx7e/1TAa4HJxNC4ySaX5ROjohqxLrxuLgBFelqaqjRHxWbWtGzjZtC3vMYhK0mIflSVIpHvbOtYZuLCuPefkyZTlnYHd0GgD2O++Xgc3JxHaAVr8fK7WbFVSdcbHVEhuHhdbhQe5er6M5SVHfa1BV4Cau9Ul3aCqGWKn3DlvFuumryqKzkiCFFmcCKw1xmq9F4b0GQLJHmKiDTWoSoT4qaNuw57eqHakAo+ql+p2ShwOApKQWZ8EdJ9qq6pABQLQnoVaagbkaSA8I9ld5L2vXvBTOPiq4H+z9S7v782oxF0XUS6rv5Zsz7O5w+DrwKZKqNVf5PBhS86pl7XnlvVUizIHexxi3Kq7DicXzZ1Q7a3sM8dogXzXnokOShjhdjMzIC+vaMGDrx4rosSt/fOKtPOSDf2GPvSQAcFA9l/vy9v6SBKX1u53g26I5xxhm6q+ykl80fDEBCbMchhCtGD1uPhYEC0HMjvYn7msJYLtNCJ3bf2Mr8MCaDNdnhXxb7TKMTBt6lN8XofaaYbxuUfKqERdjB6d7XkeqxRyo6jB5gYZyU08iaW+9289Xs5JJ/89Rj5DUsYy0qoqsfdDU049aLCsco4/ksu39w126NHxi8mpnQ5gV3wVbY+Sd4aeWBYhrJgGsQnLUzqGzus9XDW1SSRd/b0d3kZ+k6uefP1jJ69sfZRJEi/rITaIqsdmRywhhh/8BHiFTzYe2po+juJmrBfdST1uknjBvTbcurn9VtZ7YWmnV9G8+xKbjdmtUC7xvKq3NwRHvMZeZivFF4Lt2Kw932BrAhmnOyJpSmAXuDk/huQfbsJZ/l9lDZz3HB+o6Y3REMLH4jR1q4Ln6+8mM1XYXxYXOh8altgrxdITc+2U6eOe3YyKUpk5f2po9iIVQFaOnz3dgmnrcbNhxlDL9wlF4/mApnsd7pIxRT1ye2kOD5tYPyRLv3LgLxZMqa2pkPhfuXXM6ltU/8Vdlszvddpyz6+wmcu+mBWD+SgaLee10wIPGQ0jrU80sV/nw7DXW8rWVmiUmX+32tOKbkLsNV42s5KVU4Rk0LiWwJsZdCLVsOHlzvxq+7xIaFF6WByszfz6fKgtxE8wfA4CmmbnT5xRW92QpAMQJTt1P07VYcsjyV34ROmtTdw/nJdfTVGxN4Pp8Es26Oe1HtfoEQ0O5QrvLWv2Kq6FhMVvZa+vAodJ8AVfEsmd2fviBdAHJj2VKyQPKO2qzzKbe96Q1+7coRPu0F6lodlHf6603lRxVYcnVl+xbVdkxXmzQ0uuS7lrpUIV+L2am/+xI1XFpB9IK2ApARbh+3hAca57jBExE7ntGqVrmaRRmyuNLkMookjLDfQ5/8/UZFMYf9Uzz3qhE3wvqjquYYSJJmdmKCEDzHEcCFPlopOAkqbA0xQOXjYYnNSyf7kdo6JBM5XXfN8Ty3RpUfjiFqt73t5DLj78mqYPwAWogLZOdBANjQHEJLN8t1yUeEpF+y85ok+xOABdJFptU+Oj+9831iq+mYFRhrrGJ1Un1DlVY3mJyjUQPxJKfr48A7na7+l6PvcuaV4tSzSGQNpJ+MvtU0/HKzhZIQc0LAC53QVT1AmkRX0apYEvn5xIbYA/XM0EPAt4Egd5D8TP65/v9igiP+4/LAnHp6sVLqJ9kc4/BZiyA3Yvhr1KcreSHYww7VMELT5+WFTYujZa55NWJ2fUhzcpwCWQaOsYYvKYhVNV5UqSZGbFcXibLnhi0qhfmkBsVnEk0cTntVL21bP8Lrrh1zJOPiwfGYpxWQhYbWQikeh7t6PqwXix+2G5H8kmOvp5CsJKv6ucl7qU+nzpfMelpSQLv8TfI5Z4NSblKz2pKpCnwC8DgNP9S9vx99W+2K9aPnhSwcA4AoB5slK4GOXdlAXM+HCELy84xAtF9pdeSMgcvAWQNdau9wG0fNt3MnbNaVWldryEzBaWvDIsw4dHu/C0twpP9X6YMcQqMJP0kI1VLLA1VNblWtRNUJxcJZW6RLHy7TvwNnebbC9RYpniS6KOq4bpIFWTBGLai7r0f+e7c+OTyK7GsBqSZV7PdwCWZtxFRYSV+7R2SywRZaAMVka/ZaMH1yRPW7DjuqeHv70yDvqjNtfdVtbg1sDM6fex9f2lGcwxQruvybEuG0bgRp6wY9b4mVnTh3Pu68UaClCWtfilhAqNwZp31V9Mn+oUi9+mWzlVjp6I/vcNI5pyyqutgOhf9reAZVcMSTeB1nhvQt+uMkZVNMQTyHNXNCzXuMk/P3D5VHYPGYVAS10WnuOr9nfq8CnhmwaodzcjW3AdVqoeZAw2bWklZNMKsYVc3x6qOV2s1S84Z7jYSXUc8BT22eqoKSBP7ANLZH6pDiIZsyJ4vHT2rywXOUhJYGdSTI61+ZH74VHNCHxXZcUL3TvCiAeewTUTuVd7WztwJtbhoK0aPDsGJeZKSHc5l8+vyvPt/e7sV1Cb89fkTN5LMoBGsHSFCXZ0eV5Tbfi8zhLV/d1dmAXvl5wNIUZ0DVgztjtTC02WUrnO4NssX+k8eaMc5J9Y+xli7cncUjvJYRWbB8Y2pNyKsw4D91V5/wvaif2rJp58NGD25v0feeyjW+bZhkSV3qH4DZ2JdTN0BmB9pslc4jcXzlWq2mRiuY49fNr1Tu2IUT+SpRxoRKuRNqx9br/g2hp9vnzetPlVYfx5Jun47qVefH8ftxyZaWztQR/hfrqPirarg3SI4wOIqonWN6pSRF0Vd/QRDbVXXS0TAD9bzmS1JhqPfyz/pai2uqhaHddljU/8eMO3RMqXpR33SHmZ3N7n7Uer3Abk+IRt2zR2hnMTU/O4/uB5W2IY+SJlHgB/82ALh6dInB7ig9iQs1ZC1hzvdUvE8sMojAI9uwOnKiSGEv6oxCDmqxM/ewHvb9fnOPwvhTsuzUxfkjIW78UFE6SrArhSbpn/n7LAqedlLbPoIgB2wXSd7GkGantJwkeuaQ7pQFciFYrXC4UPDQgaD71J1ycipw2aWxg0Rz+/bQMLpGlz26iHGlJF0wZcEkmIDQvJy5r7TOtpMeTiyNssyop+STUXVs33uYwRrxb3GdGtV/cRiP+aDhWx1T+R+av2OrwAZCuUk1VnPmXtLVN8iae7D9jkeP2cjB1KMw2gNi0pnZwyFLcZs1m4SYum7LSNTaKIF1aM12no5To2pA4yTN5M872jqnIGorWjUZsXuQtTJ/PT8fEe1suOF312pjnfjlCyK52HkU51ecl1e392Uo0X80UYeC7evXqBVWAbrw0hGTU08DzAOWu4Z+Eq0+rD6vr8hZsLGXxOnEdmeNRnxnzmXX8a6APbjkxuohWIWcFxC5oLz4zwy7DX8Jt2nYWFnvX/wYRue4cbrGHbvLLLHI+GBhZLtm2NxJMKxtlbg2G+pgVciW1GzVmfrXJ/Ub3cujWtxx8u3U1vOJsrZW8WlGMk2u4BU5XPA8/n6jfNzLP9E5/yZ8PPheVivH6T4eHFzYY8UUI2dG67ikQ7iU9SWltgBb0VHIrfoYR11a9MEAJrYVVAHERk1sroJwDrxlwrKTjc7jA2oy4JCpxhtq4okPwcFbHjGnavL/WDfTOTPrWqc2GDn/PQTbG2iPBwgxQy53kybPi+Ns36p0NuqIEnImLIJVesQFL2XRryqiypKSxrQCmjzJhOrxUktGxPrPuVaVaXI4hOU8INap+yd5yhqXrWVx8OwtkbtZ8zIkms8d10uOZrVXcIrJIlC81m4jRaqq9H+7sC3FveS2eLkVlUpWYC0zKA4QTaT9kQ9rByzX1ZzwzoWrw86qJFifvFQ+dEhy/KvBmYpsAL8g7J+qocxw9FwOSKxG+/2dpesev9kX+Pv/NmIPMV+zYRbEOkzYRoDXcAVYh4fSB6y/bQe7BTe5rNDAWG/nnrnod+hD3sM6s+KVJO40JP/wYAEP4kAVlWQ2nYvv9fzo/eW1vG95NEXfGKhI1S1wLuEtiN9fiROVT5Lc8y3/5MrPY8ak7lisTaXzzd7caReKbM0+g7wf8RauwhjE6t3rnup9sfyZu92RsqV9uZJPNVfdUt9siufl4vk2Ba3VVX1bt7//mHTnFIOgNsN9PFDLdexlSPiOyS1ZNbG6+CQ7XW+yNFuRtfCshtQDfVd+7EqQ7/fDjF8gkG33nm4hsi1e5nAMjJeiU9saTQ3xIuOjXDURrEnwJZwprX8j5y588MvXbX6U0pWjL1AY4yo+egmLdcD/CNOu6lCdOD/ZNHDAOAdt3Afl2M4DFgvkG81/2CHANtz0QiEenIJCz6WXpeKyOowCbdZAnpes4PJmffLScN1kniU6N71ePBHUYld/6iFawGrWazgmaV2ua1IaaGG++BCxHbGBG1Av55OVKAeOVeHXjEcEgDEGOoMpCcOU9V6JkCEx5iPsiShU42toqrIs7Jth8KBaLdGWs8ci2OT8Fo+4AEwY7pg2wuW9YS3qaBQTH2Edixf6pknvIZiArkdSRrXVQ92SZO/7kNwcsZe/qkvVklOMMaWeu9diTfP2B6KCMr+mbWh7rE1YjIGBrq7Lz/5P1Ubdh77tVv+H3nwWCnwn377y/pTpdqTSpmjh7fzuekZXQmr2wp1/Oy82nr5yW97ckHwJnE/XG36sF6MMcymls9VWYqX3AtUCLcW+4lZngy8hgBOSFaL04gjWA5mmhOTWwRz1cwvVzMcT47pLiZH7i0/e8jNf3Q1DcAHrfjLGl6v8+bpWk/8/aGkXQ3Inbc35daJvLdeaz4W+xGkF+qFDj84l4yZO5xywfVKVDTS1zRtUJquZBm5heCli/O5PWz+KzNm/USSKuz/Ayas15qOfGSdcx2/6ZPf1Zn3NlBxrbutCtbKo/6DMrdaT11cf2nx1MT0RnTyhF/EPAABcJnzdvBXwZ9kzOhm3lQ9zX1Cs1b4sgJwYNBZaYwDHgZDj0b9aBTzkvR+TiB1gVQM1auEWGDl/mLz9qas5PxZw6RYJslZtnzVWCAU4tTVD094GTC9izFC7LF1TIWzovZk2p0kNjqipx5T1WVj5To3r9q39AG4YoEtCdhc26P3sNw8UXv7/FTtOYh8v6K/Dh5V/nzR73nTkuy+tGhX25OwW+XemysIT9BqXMYR3tenhrSsnr27mA2Yag73IUH8HQXo7lbWOnM/OoKHU3J/0xE7qCj0b1KmJwDqV0++cgMjVwDa86yuWq1fjhOaqXjqX6z0f6pqHwM0cSvNjb2eF1LvM75BtHnPYnKWyutX6zbNH6m0xjpPKl3b3h7V8+L+8drp/DTy2T98Gho1MQnDfIhqwMZFvwT4R3Idq9UHR62WeRKQ1a5NWu1q/N2+HIFPrf57dHb1vtJ/c7y22LwgRd9DZQWWTbGhwVinvR9wb6AuNn2h5xmjWoxxAfiObytZYavwrzJ41qINGB15CtVZ52+e1NBtO+xOk6Q5yeMBl/m8lq9oVmo7/ZdsYIUgi7t49hsTd928i9lxJ1Oy/Tw6TgvXNYYs9R/szhH9A47z/oZ2vQdUoTgHSc5RvhWanLaJGIcl99firx4htCd9D8BRBWxQvsxz1N3iptNpA8+XOj2uOh7Nt0UwULrHJp1Xh/JBvSpVoZLz4rquYM+2jisAiJnaFnmpm89B8r5vTedsCEllUdxVbglEp+5GJc8t3hlujLEfP1O5Nv46DqpaQzJMXdvGYF3P4ARAwk6CVKViZlZVdtr6K5v59m4wsh7SIwBQDJtkU9UI1D+7R9mPRQjrmQN7jmfrNQVo2QmeRPHleRN7PIdwcMsYm9x5dFIfbOeMHWw2A8gVrXncd8K5a22WE08nOicEG2C1zqVaToX45KvoWk+tYcP0/PBFXR4x3R8exfC9tsmxr67YscXfQ7tXvhvy9m20aAZyOZ7sSChdXY3av++m6An+/DYHAO/0nGA8rF4+fZIN7VXFqyxleSHPxnLRZpEDcTW0GnpjH67zCPCqP3/WIQN+PkCt/EfG3oB5LPZiiPPb5qw8lXlv7v2qLN3g+RGdBtsJgL0Gxcb/G2HPuThbW2n7dpAqnzdQd+bEK2/sxZJQ76IhIOL0HuwkssCnGWYxF/ZVVfhB+sSIFX6A3DeyW7UTu5oz53hIazUugGfPa7ykqr7lcJPQRsn5iflsutAnCkz/NnGP/InTn4kKlx5RVQw/C+gMCee3WM90mn3HG4CdCbDUXGnCoQDX9cD3a2cYtkk9DcrMR6OKQOCrljwIQkALBfxfZJfTVG5Nhx+Z1vD6nKG0OHJoBKn4X8yZv3kwuH3eZkbftQN1GQHHdlWMCODYhWeBUEGhgArcsN2lXeScEClgGDqgGPSNueQpHhqTI0cIlY+lpkicDGSmfBqZGXfdcPZ07V5dE48sYDDI1VlQZZ7xFOA5zoQLgGxgW4bEesA7COHn3xiqugSZqKr0Tb0TZjKstRFzSIxvmEgV8ABn+Yf+XaSOp01ydn0+D/vXn53d+nzSQWfWiErzJGatJPYxH+xNLTw3CmeLIUEUoWJAMRRC+2tqUcBBXJGIiaGtrYn7vj0J1dYLFdmm0zd7gOsqe/NzmicxCkVZOqELcn2y2g9RHfIwdmrP7uXD//mluowB6s/9YX3+UuHx+SOonmgLOkZOyC3KZD33Ny1Idoz936dIOGph41OSxjMRmWd/Bc4zSqVG9oQxbvh4+EdndBmlWFuJfsrdIETHCFdaONMUmvRrnEGpVFp442xHxv0tHtvFBUHriznCV1Wlp+Xtl23XGwR9FlNwK4mxnIuHn3ow/1YD38rs93vNIS8zjae6sJ6zlu0mA9UhC1pkAuZLPC3OUE3Hp8pRQ+Qop80JawWqGtxQlir7R+BPXy34Lje0A7BP2zdPEjprfsia0v2zFS+vatDOe1pUHAA4JC96oNkdMxHRG32eC9vK8Iy+uBbxP4JdrU94uHVgP70sDSscNvvGQ++EArF70mVEVDWTwzSXIAHLeyFvDMHCKkXn7/NxRoYlaiha2YVaZKjuh4qapbwxOC5wcNB8t3uoKv68TQrsF2dMg2mqR0Og+o1zwXo3mWYEQt5Vgp/Pw35uuSInAcMyhJaeang31rVCwB38K5xeDZe/alybw63ppDPb+1kP/J/+H/+HRMMicMzXszTkAmiobXFQzha0HsSbBW5oTSIogWs+i+ynzGGGcIlKagKWzDesYwmbL98NQLPBlIivKuCxXJXQgaZUmI9QTTpOAKriEEY+HIuz9wg/Xtmu4BLFDa2QaAyoNOhDm633bew9WSwmI5a81/nV5LGazbqCP2EeyxKJhXsNBcZtmhSqOsY3efq+bxMGxUwlJALLOb/SSAGb1Vh15UbgSgrZlt5iu/YhNlFE6p6NquCUkzOX1LzliGY7DcBRKNkPZhOFTyarbIvCkfnYFQGKuLe/EuJkw0cFlJ516tbl4iUA7jQGKWgmd6uCHjke1gmtITZ21rV+koMnQR06vlcOimooYenEGOi400Bq5nhOsR2xPclDG+dAi73RzUVrvd84JAu3h47OPVq19Wdt1J7cJdMzcbV+bCEPNIfM7EFxagF8v1/YKdFxWCZxDRl/7/9W0cbVGiExXtAdXOsCQMV5Rk1PCoQYFi3vT8I5GZQ7Ji/S7A0Al08cVJYW1ZuX6fgpLzdujQP4RATCixITQCJqLCvAUIQh5DDsLr1u3lmV6vj04ARTQfr9fhHcAsAPxNBb1fZ1Ta6QArOoAMN1vmJAB2f+Bjd1uEiK1AkCr2GokleqguiCudpJWb2WQYlTGkgbewQ69+4gDjPQlZgAhB8RsTzcTaU4jRiTX2YIhg7iQ/nq4FAVfig28BljgAPhkzVWBA4rJqtaKJdMCpSqJOY4BetEO5aVWKSt0a8CZpdsT+nUuiRl6tiB4RPeeT69n04jSvL+a6Ey00KNMRR3MmfZgOd57lM3li5QjJyrGmOCOp0wSsnxjlvm1BVSF6lqrsNPlAfBMca3dmKahjZFGH2tio1PDM89vaZ7/mbXeqDO93ueCKO45cVUtm6IE3jS0wkC+O+/X5FPmrlpYAqtKlc0NlthlnpOjr+6ip+mi67mqE2BvKjje/97nRa3Yx1swtsdbZu8FZv84AhradOOXn/muV9hVo4FvIpX7T7E+Kqu8Neb9YSWqYXGNn7h6dv8KdeVurdaE5WF2iRtEEhxtVYD+pVweenWU4a6a5QSGvJbnKVyyMFyDkAVFeSUj2neX0yhHV6FW1+v7hdO1ge2mMUqUfW5aakLvLeJnMqyfs8BMDKcvO17TtxzSFmb3rFOBpo3BdkQj9q1S2y3qsLOe3IFOoXHHY4yAFBVcgj+QbGpx45YILSsDo7C/GT9rlS4TBxqf7vJjI+JOTDP1FBSchZ8qS24s7XdtNVaYPGTCq9WgfS3Y4w9x5HGzMqRyZ+uVOiTrxKg1XVjfWjqxszbKjhc/1b1qqreu6r37Qhc5Agl1ZJYt4NaGuR5ArSB/s4hVoTkvUYcJXp2opj36xrPXa7ueByFxRbuyJjsJE7TQudKDkK9gNlVNtbeD/E5Dyra89a/tdpqNuBMIgi/P1ysAcCTKi1qRNUcUCwJmmgrdclHJVowToO/I9xF3DoOnwUAfZpAVe1+qIJ+dI13LkRx535vxGSSiaNPT/j8PTTMrsgfcCgvm22c204CdQCey9kGP7hVEfN5CigJUsb4ZhcH3bpLFC6bazwmMQ6yfJMk4hg14AKG3qoxbvcgxuleo0hZ6/d0e0qnr2xwRWaBKJ91SonQVVUSYeosDdujbmlg2Hh4/lXYUe42JWTzVflWxdwgoS4KZML81OpPYETr+iFCRRN+EKSr8iaDWQHnBMQUkwUwS/9QlofcwQiaH3OhCqCK8VMsTbvSu9BB5aI2Hc17BrWSsp6jwiPD6DJHJenGGzNU7bHd6BjadFwNwmkXyeGJM3pg4SMFOA/+a2yfl6pCoRxQHxg3aFE05LER3WAmr/pwV6GNklIm2mwshqEgoBbJUcdgvlxOFYRS8pzTXmG2OOmzO+4upxvktZh2ru5HDdbypaTZSpvpOK/41WrzGIpiPmzMZrBd3vZKcB2uyW31pm66E3A4YRdq29X2GWhEUuw2lOSHQxdRVaUvR288FLcN1SPdvbH0ftwDPdIKNmtb90S3q3Jn8/l0LYbCc+/c3GBufFwU3yz55EAsTobNpEZ6duPX4kReFpnDcBOjwulrLoKkVb2eUYgn21D0JOETl6Uz9gHAaG+Dd+25R/zvsmGQkqwn7xZK6s4/ouY6PXiCD4iPoTkZvAhqqWYUg4RV7I/ld4ZxrsjuWQeZdhSBxmyWvXjWGoefT9zetD/CJaqDigweOF7peDbddxAKD2I5ZDPIy9QNC+m0zFHRuEKu6UsVM78j5T/1h3xfCyKrdFcZb8ap6/eCeC25r4qGjr6myB+gs3nc6QtKZDxTtfMy4QMAV4DGGyYvNxVUXuGtuioIPowni2Onco9YXiioBdiLqq8r8pa7OufXMdb5XxCgR+tRSZvxddVEHbjkspWkOdSz5SreNXQ1yedsqYl4akW09GtZ3wu/cRXNqaUxn1uHikjGK5qZHDpPg6oMf9LexUGUhXO6x7B2wdFqEBeCWktDHBorcie9fXAHG89nMRGxJSdIngu6UGyfJbaTXjJhwvZ+Xsc14SmGG1nMBaSNkHxqYG46rAiuGkdJ1lWdlaoTiAEf2YYrkdUwq2zdoar1LNVK7RrsqrHeDjKssLvdFewJcoafoTcXpHgYORjFUliDku0KZ2n5aRAWTnsILdtgrmxfiQyF6pDPnx1BRlzhof7VWZqKV+Nk8VIJyTv0jIhQz7PpVA8cjAqTR+aqSPYLwJL3T8Pno4Wn7DLVDIeeIlOaIDdq74hjI85LSa0O3/b5fgCo0w0bFq5CicK99UNV39GqY/GCJLbwzYQNLTi5NPTZGde/eRpwbmqUW+jtxNnV/8+5HVTnERVZYcLW4ovmJ1slu0OwlzlyTD0Td8GxuDJ7i+8YeT0nQAyIs6u3CbBdhz4qV0O36aadbrvD9BuM8luSbmTRx0VPfRTf/txKde+OBQA8KcRjbe8sMV8V1+RzXdk7jDI7MY+wLXU+/KzPZ2e51MzyLfPskQ+5DtaXCn8CdVbIQ2HO4OTFg9m5usAwN89UeNLiWgjjk705wjk7YvUtsPJ5e/7E2M08v4vVEYz1eR14h6KjnwmtfWpTRKlCn/eK4Bn1qM5Bm+2JnSxaVgisNzzqd9eoFoanSv6JdWFQzKUfUKJsFsw12UGIihLqs24kzIezHsyZYBvGIP56mP6y2slw7UcEc2aVB6HORayzadjdjmPXpOFctdnsptZf0qa1ahMRdJScQJKKoV/vpnX8qff9AFXfdhxlTvbxhK9deW69xnUs/7NOwzL90d5uLP2DmTtqP5PrhBO9O9ZRxIqCWRBdBwlHy45CzNrWQRnO15NKe0w/gIygUF1Iyhi2nuzsgTw/9EJ5mQRc01wuw9QCw3R+Xqz0jxqsFvjRk3lSsL2MLpDPv7pUUqzGWYTXhqaHwMhtWtU1oOOrvioX5tiu4wF5JFMDN9FrwBSp3w8QfKSeqoJjz2iC0r+qhwWuX167Ka+9XCGMv7ljqHeiLyBsQ6C+k/Io4fUtcOBFVXPINP4BOc0NlGmqTYVVpTbaA1RAn+C5KJZddee8hRDp2z3HHJyknZW+Tx/W5lSR3lEzXVsNohkKPBTQu7hZ2cckOaDwTP9cdxk+ITLbfR4Ine/3TTk4sIeqAqL61c0Aq6cZ6t8WXXC6tn7n8/AJRUWmdXSNkCssS+PPNTzAU1VMgpSYegw3C0EsGiK+rSUTpdpruXwBwGBW1RtutGztIjMrqZorRVEFeBOqKs9sOe36aeRz7voTnUnbbM9rHaaSvMdmtNTnwquEPYH3RPYdsOyCFzFsarq3dXqyV9Us6HxLP2Tevgt4VNVyW0n6xDNyWsMQWs2c62Y3QQhMW1IA3LZ4zbIHYPGGBkpICfkxPT5KekE4XEIKxzUXMSxOnW4AoCgR3o7gvZOzbrsUrTb+MlWfh/JuHW0fWlQyFcpxY4Xz4UqlxzMnnj6JD7m6a7YbyCxRGXhmQ4OxzOKf2NrzANQP40g6hDMySuVvXnt9lQrk6e2PliW1ZW3IQq8YU7b5ghvfhmaW1lxW9QTbi958R78C7C2uFjxU7lyPUlVbDnjRw/+BEXnolGZPUdwy8c1+j60XDTkOD3dPY/18jFE9prPujROB3iE/41tgCLILfYZ9km7/vKFQ+fCplyumR759l5FspacQ7ThNLaroNNdYEdqbPsKz24Xqq7S3lfmb3d8xmlwt3SkHcqUCYSz8rci1sejQmRRHNnay50aHh6GInQ3sgZ9lDDl83KW6RCs42ArYCkAl3IsycmCPI+mMWV+pM27Ia96kFw+m1fasvM7Zh37vEOwfLg7Hg055OvumasD6xDUXOr5Vo+U8xDRctdgK594yVuZuP1W1ytpqWopKvR6WGr2GNgwV8wgWE2WZ9R/misYSc1ndrEVrHC3WjlT7pJVsr15s7RPKWDtUI4VCxcgLryZkivFDf+1qRVXNN9SSQClrqxOuv0HHPl92LTucP+BbmxiwDaszfrGUPK+rPIlzRXeXkZfr9732pLKfih0/qdKKQuqaF1xjX5fayaNaMwXkvu6okOluyoDv5KbPKEcsKeHx1oAlXCAVdjjMfZnP5ETQYRzFpbMAmNPPC1eNC7KeIiixqRhAHPzHQc8wV2RegAFHf07JkMHM6tlp2mWOpkTPznwPHNoWCwwwDI+bOs3GVT2TMVF7t6ZGbf5BcWgenTNsnJB6uD7MfVlZv0vWQ20RqRs2ONR7Tg000/Dume0iRs6I0PXbR0v3RLq9sOpNovLPrGTt8066mlZhtbz2e+rSTXtXYzed7XXB80yHk2PwhOlS2+ztCKI4OHndA4n7Hyi5Xj3xUWVUHDhz4rvZ7udG1pqbjT4S7YhCtW7v7hPLkLp1wW6Fm1lZ6xTVb1l8nk4dF6ciszZRZC7HabmesjB9TgR/ciE0BgC134+kq88fhHTeL/H3RSdgu3a5zlLJk3hguQBDi7WfdbZthIzB4Yda50cAeLIO39zAHhn85GK2twUuyZWANaOOwuO/I7Wp/7HB37I6b3dOnfgHQETu0cF74l279t337fPEy/lmHPQOvGOWfjIvZ+igzZvWDUmqtpFIKPTkRRnlNrWbTPlftv864hpU63y5jA4Lqw2n+hTFnqkgbgrTH+jWxbjCrAq0fTCcOrZSzG7EXrBT1bDLBf0JHnTX8g0Xu0zMhlOXcOZVLt5nVQcEaIlnM1uOfTXNzzoCpOV0CjNW+2UEc+YlJcb9JNiHAYCaI2XLVBFB8RH5Gt8q6Aek/rwe1dTu+pJuBxcIbIGpbZvjuEed4cDkpUOUWgejEOQojVWpveDSPtlbbGb11SS31s+e0Fqm16xqyUkAUIftT7O8NPYWJEcc1GU7ZL02KkDRYdE8jCkGb9dR8xzbFnQsuDhy63RKFRiHuHcNDI0jBeIBJpfGI59HFvDmBV1O4IoM5XdUrhcI+sBDyS7vhtpQVajLl0k6YMnAckSkbFy0XhbUezgwaGK6uXo184k1R6ri9r1YEeMxlZ55fKHFGyQn1koeSCWQn559a4uCq6rbHlbferLT2mATLl1nglRHzg5MU2Wvwl5oOiuYiCb0CeuT+QNQp7pT1XDL1uX0r0O1VSEk3AxCmV3IJ9NyqREtKuewj8OqMjMYTfsFy16lTSFUXc2i7avhywFAw2itYbHOxWPrbs/eZUs9QoArlaCqYw74iynhVAu/VGLjnuNMDwKUOiQWndFNBPagxIBqS+O+y4VbcKt805OWycrFw3PvADPuXAGwBEeUj4V+UpO9LAk0BzATmA5VF6LsZOii7lqfVhxal1UEnxTOSxek9BnXHqYDIn0zVolQ59jiaOmU8JzmPUIS4aYajskKJxXKj8VtLt0nIjK+PbLDXr+lxNkvLSOtneg7HeV3TNyaQNC3y8Z6kSSup1z+T53X0rHlZWnymubFygQv1U51HC7N9LOMPvVct8CIOjcj1mR2mguU/fxOaWcw6+vcQFVeWlYANvQntfc0kakKU61EbX1ctOi+za9Kg0Fyj5qLE6Yn2P5cSyaK0pblxU+iTUzrXrZNi+1K/8i3R9Xg6I9DecSKUHtRK9/ZuD5xkq4R5WYfAHxE/l0U94W+Z6hejYEns8X7fLugGRpohe0D3JZ0pcn7/T+Na5yV/DSGOd7jtcuezfm5/p2vTt8u1iLLmlm63cilP2gfoKb9LR8rTQxV/C+Gp+PkB+6tM8yl8fKg5HkscyhGQCGmDjzm3noWezq8Kzdm7JdEU/GJpxSlXrZLOAgFk0XgavtFqQDHABVrDi6ShA6qxA7aoaWbLAPUY/RFu6pFyK65oVekzQUgwtwtt/MMVof7yBi7Y9dWtqcgFJd056Jkh1pb0wCqa3aZtd0mnqF4zQl49t13L7ys1D25dBXOMbpiD3xnJVXPx14srYUrsowzg6L+JbtaWhORPpBogP3yqjVUa5X2vZWpJ2pXElXTud70gxfbzVZ/d0l31GovHLd7vuN7tGuNvKX8uc6dOaNf+p6WvWS+tTiTMcdO/tEsVo5iXElRKeaV+d7fJTbKwi5aokhBpF1uFGPsAdi7LP82QVCdD+snjTNbbS8PnwxQAdVp2kxSFdturIEyritIYYDgmmgx+arikhf/j/+3/x1JCEtsg9m0ZWmD9CzIOeLMunKvUn2YQv7V7wTCAHIbqWMMJa7r0tMyyoKYzpQvLQZjrPFkuw7qavRe+iOrqoxeubzO4tfaagx3fpXHGoTiMxAJRPRtpEInaemfLrC2mATMqhpB4HmmpxpdynC0T/T2M7Pu+yb1ui6S3+/XR4pJxWjatHUljtPt5GCpjsGxPvHPPzJltV4f+VOLGU1QBhizquiwY867yEER6f+BMcZ33PJn4lVpa4FJAmoZXNnIuJKR5MfO27Jj12ZnJif00yFqhlzRTqKLn4ZX0rNpIgAaayCqqhGKbfr0733nz9qE8b8Wbhkh4yRZTjPw2YhLagKc+75JiEirFvDQRq7pVhNsCdvakKpufWVEyxpk8yKxAub0qxTgNhLuz+UzyiHWLWswioIjfXvQ0fO9ruv7/datlsYS37J5C3OCubiekXXbUP7+HZCrIOOD9liPwhgDQksLSlX5fgV6XX8wDxXy3RwVozj0zVUxht46Lnx4CZXfcQsuygeD33Ff/Hz+/LlExhjf779JJa86Nla963kpcTSMXtefHMepKoa6YhEVHUO/JG0KYoyBoXpdX8UNH6i6DhyquMcYJK41BwsxRArF4hQ0O57JDk4ERj3+LJLrLR4kt/mgyVeqkKYkBfPcA6S8G8/c31lPwqkl1KfyMwDBlXxYPzylOQZiJXAh/ubmR7vWF9+Ev/JVvS/Emd5PPmdx0Otlz6+HUXFz7MpH55jddh5O1qnfmyQ8+7tPrmXlnkO8avty1X0sdeqDZYCZ+d2LlphaUZfrBnCNGbJ1B+P1duP8LDw4ssAykK6vFt27TYJUFg0GuOurAsN0QKt2HQ+nXx8H8Gonx/WSpXcKpv5EpqWrII22SLL+RIHTP8eFNcbB61kObvM4iKnGdXkO4K50jv4qzFAiUCyjmiXe5zIsB2D2pJoMuKj+nGYA64gxk+433qjozxquRT/QVvA3fYK5sspm19wQe8nuVVY9s/6dngzqgM0PAViUg6paCumxDYc+R636mytxmNx2kpOqp+yOFbLSbFXEebEMgKph7urv4b4ytN1IMVE/VrKjU5/sJe0kl1nAHFCfXy9VrUOU1opD+1AmHi5kP/DlRKc6fJqcuvbaonBPVufpYg1zPAnVYZdbq7P2ReWoAVyk9FN7KhHcUuaqzkcuEz4vVA68IKn3GNXzvoeup33Vm5D1wj/mjK0DxbzRDBl6jsVsemTnbQCXxul4mDeAHz2i6sfBvnTKOzM/fbjTwZZlx8MBNFXAd0wR8j4f+hb2GcOWtgMrS7SMxbUJbCo+lUYj4yIOJyJYPbt+aJXYZeOEYAMp4KpyWJggIAJCLqEPAADkMTS0gx38jDYZUHhYtXmKH0BJgTLicyzRo0KgQvW1QhF+Bqj8DFyXfEAhFCK8/sXr4hiX/C9sAJBo+rKCbzUmAMUYeovv7h7RLzo4gKGwDOqquNSWDnQMxWXWzdT28IGE5bgEVAiK7TUbfqCk0dCab6MwleFn3ipAKFus6VGb7cICsyAnDVMTb9faKi/ttf14NcAOdqEMLRrkxwrNSOws96SHnyQ6n77Yr13Hbnjp02LRAdM6XCnavhbW9dsnFHjaI/Qf9Uv7VqvK3uBfE3CfsaMs48Na5gh/uy9/Dz4G0Hd5ZZlL+gFkdo1xgNMsDrZr6uQN0zoa3TFqxutY8/H5Xmf+fHMfVp6ECl0PzD0AVZoWwV+ZSnW0nmJuv/mFEUzd8oL+jpr9b3v4RqKmf+Y9lv8XlHvQYLxanKKZ5fbunm3Tqw2Lj8Phh9EoI7qrbCxO5Gxn56Pw7FoYADIafh5cnCUcQzswy+O/9w5IvwQR0JrBYlio3bo/hbA+35XCbiSWAmNunttuEhwPNCdJGQB4u1qE2/LK4hSl7QTwiswINi8k9x6o5/8JaG3su/Slqh+m0/bX203OKaL496v8nJVIFtB1E+RaDphLTszaCps6ZZLUXZ9iqqpaIOdFX5ROllfV67pEZODm8KBAApYjXMcQXwKeXSjg0FFPnvYgxPCzzSsi64RUP9HCmIykb7ioU5UeC961GFYvWVeP02ZSURrJdIriIZDG/xFGFbVObbLI7Ju50jnUkXvMlToHqWz/PdI8G62cZuDUPnP+0T7a99rKSmPT6Q1alIFEfc44JAVFovMD7BwLYA0FrO02MTRsUtVriWE2dQvB4LhIUonrghKD4EUhqVCon00tIK/r34oRh8X6EcwifqoOBZBhp5znyoMHAYI07WGDYoh8LvkDyHXxks8///zXdV1j2MmUfvz7UN9yA0BwZaoJ6lcw7Fxh5b/1Mpf9Vg7FrXqPOFXMHA/FrdQhvD6U8RUM5TXGoN46lFDQZvGdoXx6fNyAjFtWB9WGcLcTZ73qBoDalcceDP7oDIOY9axSFkwLuT5aUtCAsJODS3cvUmD7PeBbPjR93CczfzC3Zkqxz6wPFIVcG60y1dHd50HiBaoSCEgGoRnYaQQxJTGW0JcdsC5Kz8k2gjuXqsLaAuvghOPOOJDLpodEMQOq5nTDsdMZQwWyFzAhss59Y5iTNq43leWatQqW6H9rze1voVs/WSm0iTsSPt1z0oH2+Q55rT+AATCnNqDGdZUnlxMtKg+sYM9WGQO8BdNTKKwJVN5LiYmVYuWX1bMZQmZDHMGyaiHpUaAmE1CZut2HCswea1i0PtrNTX2eApi2YLcR+VNVOwlsDZ8HPzbO7bF5vJH6ZJWs5P9ozm/6mHyMb1FxfVJyZN4Og5GE2m4F089TSD9PiubpahKOjekfyDp/5mJialw3h8Zh44u1z5pAYvI6BbjvsS0Bd1Brh43TngGcDmjY0dnZqP48Cb85iN2GBetTY5WgaZla7CTz6FVh+jq7ANcBgE2v1oDIdh1tzy4DFYsjQR43WxeH9YxIoaFIxtec6VCZUFXH+PqRqaUtq0dCpK/wWmGeHUuLUadxaSFmUY4b/LXHF74FUHZxNHnZKdYMyUKQQARLLMqDgSzxlFxfJWmebH/qu/gtIp8axzXl4rQHwL7UDTtHx/S3guwZjZop5ToDWkGqJdvDgwMXSmaXXM9VtV37rhJAIxW3qsJP7SZ1EBzK+7KTv3B9+KHNkKhchB26+Uk5IW+biGcE7gsFF0XI61KQFweFSl5lS9JFMg6ZIkDi4uf6XP8iL9Oa//z5r//6r/8Fef399/0Xen/H9/5SLZrfx8CCT7rXHIPjS1utlv+P8C98V/IY4wvewBBwUAXjxo17qAyRSwTE/8d2mQ35jvEZ+qU4zqDF8yiVoCovHTZzeRU7aov7YopDcTufksDApiobZ1brmwyEVQ/sX+XDMYZsWV8OddZXD47+o908eZZVb7xcFYbKnMnbyeOL/J40v24Pj/YaVVhO1m03KPlVmifmVNdDpGht7lhh9lF+dqzhR4PYJZf9Vf44VljLPPkD+/pkQ/zFrun6vH6iJ5TWZ92Z2VEL9HtHHFRxaeKoY2urKUSzm1Zkjy5fe9JyeTVfAkBq63R5MxBo9o6SvNqZp6sPcNYAT97aE8CtcD2F98fyWI3OZk36YBLrtvKzH1W8DitZg39yMFzp3ODJz1tA4iczfLPY+WLHCyi0eYwZFDv9BMc329ajJMST5DPxGJniOTwp1kagwklAbEtYOtVnZO0PLTSKJRNq7Z690SmWz7rmrBwfjoaujBgRCzKxVldYRz3iE2oP6swh3JSCVxXjrGQ1R+rB4ImclfhTvKNuWoaRWQ2ArexXy/1kUJuATbHZBCMYIDz12AOgqvd9e+zvOlwkyaGmY2CzyAZPOILWI3m0IOKzHV+/DyY+IhPnNwOArfbE4pYi2F1Hzy+EiBbOQLLkimzdInptDsEShh77EWVT8rvuy5rrnpYqSgoFLm6RlCwna9onFzCEBm8zOQh5TLUoCn0Yt2P7vBlma9Se203VhrWS8XRQ+wrbwngiRjoRiZWM/JeRORQKP5eF0wMgrw/lD/9cuGgbfQcvXrhELXULMIgbuDkUAsglcl3Xhx8R2yJwMdTzxc91XQDHwEcv4jLmGQrLfXXJn38+/6UDqrzk+l/+63/9X//6r3Hj/8P//n/d99+/X/17A7iuPyRvvb/fb6baEDHKDFviufX/pfy6UcFX5QaGUoWqHBh66xfXgO0qwID+v4kviKHjlq/yptwkVG9wqN6+NEUdOgZGLCIBpocvY5vbGKcZmqZvq0eSnf4b4330ZiyLCIYdtuFOBgDgBljzEix8KQOxFP5km56a/s31+cw9QlWajgiSrJuP82l+K5qkNhsMbLuG+udrQ+RZn+xQPVrAVclUcjCGvk9REruvtj+Jen4xonq4VoPlc8xPhr5cB9e/1cltUOFvn78ieWPau4e9GU9q/jiVU2f3eu6X3Y/aXaBpfONn06s/3v/+ajWoqhtAoI4BZknC10tj0aCCV322ZaFvQ2q/2QvjJz4nWUOPajU7ovFv6S+Gt+xy+2SvONrb67p07gEwfGlykYkTrS3Td1wFWwEzwv9ZFqADYNvUXaXsZK/KqaETLD516j5bHrJzMX/dOmPbRNuVe99zr96uVefnG/c/GZidz9oTu3GHoC55r2sOJ8v0s3Zu4O0cWZGtBepN8mWYhv55wr97YMeT9hALW9V01X4HO7tnFp1dE+V9rU22bTGNFPVbjcG611BGUxac4onW82BpzNWjZrdzEyHgoygvtrW+98XOP8kqR70zH8LCluZQsLXVYABxcQbCLUY3EKxY1LcZJH0E/knl7ThWOO0w24ppdtCIYdVUdgDWmYxaeV57u61mcuZ+acVU9cnVqNsGsob7vu/7LueOW/1C8v667rZpeFWKXCJ/dOiFS/D55/rXv64/H/kjQzBIlc/nj225vgdoG4Kh//z7C14C+Xw+/1z/fD4f2yZ+WUK2QR22gfcDQL8qctly8ffW+/5+9f7wz+f68w//uQmoXvL5X/F//Qf/fO9b/+L+73/LLX++Q8l/8EeF4zv++/sX98CFP3LJn0uAL78XbEL+gokkh2Ko3oODtKwsY3AMfEHfKg3eX/7L8u6p3GN8VQf4peh9/x34DnxtrflWlfF3jEF+y04+W8Ughff9F4AOKm5bvTu6Sb/xKpoS3jmnFlj5rQijHkINdz2Zz5s458UtOcT/4FqVtkP+RIpFYLXLUf28yiy3TYq19ao5Fn1+ahpT2Duci9aykf9JICe+K6i7Bd8r31+92Ef4uEjLz5F/F9TWndkag4TjCfQ7GZttwsYSR8rvvVx+8qXYTucggjRSDD3Ycevf32DxAnwDoPeULh++9KkJI9h7pDa9S188mQFOGukrWiv/A5Wip029798e7WOqpgOp15/5eSaQnV7NWgAT90N/pSwnxRgjAavtEALk0c/+/Kwgmg1+ossUGHX3a7omdqNKnRmHos7DgtrOVfV5/ZuwsdAuC//Igli3IS5nRp4qOaEcCKok35MXwMiDKxZYzjWUwo6orDbnWH8TaRsvPc2sZ6iDJdyYKUrWUPFVIU4112iYuKeUGrRVuo6mYlL4gebOlZ0TsHNCVplP0qiLyBgDGWBiHTEUqubl+OQuADtJlzafS8GM7c2R5G5sUpFVvGzWTYPDAWTK16YF6t/Gz/4qzaSBvA5O5odJDcJXbLg4/ZNcJ52+kD30keoEKZ4o4CGadl4OH8LnfMYpUHiyYVX1TEZChwelF9rFcMlrydSqWJMCHUFF9Gw94ElEruvysPk1NlpEPI2hqIhpS08y8+fzrz+f/8Lnj+BfH/n86/Pnf/H5X/65/uG4OPjn+sfym933/Q2oLvL777+iNsf/x8pcuKi49ANgfHUQAhH54B5/eatCZUD1S/2r/74x/pE/f65/OAC5SIhc/xqX/MW///t7//fN+/6XWiARLh33reMef8Y9vl+o/Nef6wI+lC/kIgWi4x/qZT764LCYHA79/OtSvQfugS/JSwjg3/r3++d/88UNDtIcqXvov1WHfv5+9TvGrfiruIfqjX8L/nvI36H/LtMHamFCwDWGb9/XMk67YtYKP2mVpnkaM6xzY9MirBMQxrTmJA2F7weofOv1uzvyeqrl6jT3d9sc3l6ymqojaoZQ5+ehADKr2+IEkO4S0X/nV3uIJpdGtTwzMu1ay7aV+9vmkVRlUtFhaFGCd7hrVeLy57AMZ2M+Xwnn8DZF2pp7onN5wuSBJWfdopmXcIskb06W7U7I0Qi2i7bgV9RXY4CFbuzfFpSv59WJNkJbvKkX7+XpUs90d3hef8aGxDe3OxqqLVqsoHd5MRMmNQNrJILX6TMy39YK19YbnzSoGvfWSmzNuR78uvISjjXoRQAYS1XAdBXQpekXl+2zGrNPK8PkACCFyPSszcio64eiAQg9ngPwxAHW8fUQjVbyqLyukgSqzkFmrqV84nsAtq7SbRhQmlwmFFKwNfL+YhOqqviSUntPqCpUJHiP8NnZ9G92Bef4wp0UIXPslU1ULC78KjC0XToGCjVSBT/BM/WpecaJ6aJSJ6nzZM2mSQ8nYg4FcH2Yyc5ROmgKJ4cP6FWUQ7YTZA92qxry+/vQ+4O03ZO3KoEh8rmu6/v99+Ql/8ow9DPnKcCtRgqK6DprZY1acnF7ck1YSLLGH64m5HwlOqnOftCwUVhnnNKbvjBkaxpQO5DFC+/u9QOkH7mUdrgOMk/9gC5zY1VAwiGggagDgLuvFVrEmob4VmoD9YZvSRXpctHuG75Dvx7VNlx3ZcROMu2kOfBBRk1IREQApB3ZausSn7KN+M+ff4nY4bty4brkElh8/nVdfz6WWRT4c/35r//6r//Fn/+VjH/J+POR67/+/Ne//vyXu+aD//r8S+Sjqv/99+99qwhEPh8Kri/V0ltdn+sSflQVgxc4BoaMW29AqJfq/e/7O3BbZr1bx1+Kgv9c//zX55+/f/9epIXly/ji31/8/e/7/0vau245jutcgnsDpGxHZtXpnpk17/+E093nVGaEJQKYH6AkSrKjqr/WyuV0yBQFgiRuxKV9SVuoQlUgwlqzaNYmx9Nnpd7AG0XEEicCkgUhEQwYMlmRBMEJ1aNZMEKFkjlGn05UaZksqJ+gRPPFvWlV89QBWjDMl4Y287Pxt8fibK0b5AKMoC/+dDRyaZFlEHJLOqRF9DRE8AhKygPaK5RzO8pm8rP+lwBO0U7ihN585Sc7txIRd4uLDD3sEH8n5Z/2zqsezv61J0ni9RuHX/leYMpduTo5H0WNAAb6nJ+bT2Mm2rza3a9kBOtu/eY6grdz25UavH5kDX8EAMpeuWKP1YrdBSJr6IGeZ79+SST9/XWgITgQ9vH+AN74037fmm/JH8jMdCfSq2CfEyVdmdf22ZWEN3AO8n9/9ShoDtf5hBN9JwguZxcbSKdP9MnKJCT/VEvZHueaDCN6L68b86iqveRZp/aX1/VNzlWC2toCaAHBZY+sOcSOvXUCdW786s+XP4086IrJkdv+8yviPJOHG5dRxKUOCS5i0gqPnGSMA1Xx2PIlbI9ERGlDUu3ttSIrs/ResH01XAuwujJ1WHbH7oi9AlkmhCaZikbfiiTAYASCQsmMV+s2yD9W6zu7g3zifVOkMh+OrGkHXgk043Yaqf82tNxj7h5OEdGgm2/0fZ9aUWI3CnRIthTd5iBEs/jMbjPWvrGHM69125Hs9hJbuOY1j9WLPbbUhCIisizLOMfMjH08FHRAWKoZFFmsjWIqgAiPICgt4yllT0akqmGDzWAbOAAoInOJbHjLHg1Yzygis9CEJ6/JSPZNDUg87UswJ4sr+xKutGScmnWZWqxn2alJpa/bdm0jXHOJOHvSw0iHbCGRFZROO1zgPUA/qEoi0nE50IWGvm4Ij4AxJxq6raRh+4lH5HGWoisbHexBF4rOaXY2OQ42e+260wCmR/OV7gW6gyGAGOo27BNHePfBSgElC3pQybUwSh4hpk0FAQgY5ugKamYoyVABQ66bdQHnpG71JhL9AARBMm23qVI5eroZCQpLDFLXrjrvE5GdbLPfa2Sf8DCuTenKmohA4e7hQhHGKjpQxXNn5uKMHuleVGqELeaIIAMwQc+RX9TNYvGIMFilTlMppRhuwqlIKSxhiMbKcisPNE4y3WQqUouUe50et49HnW6oBZqLYdJatYQwmt3qDU5zM0poet4zPChTWWNOIsLMIiCAu7XWMvQ5ItriZnYHmlsK7Is1elPVWnDTmByiJnAiNG3A/lnwbCVUa8SztQYEa1nEn0urblLkVuJWYioSjrZ8tdnAmhmEWpvNTBgqFJGKCPEQrEe4TiHrTRQtGqCqipDF2xJTEAKNQkhYxGLz3BZTW3QxfS7+lccgDgv44kvzperiYs/2SXsGTYUicFkc/5nty1tARKSY5xqmaOn0Aa79RCrr3hR3B0RrgRRDa+buIUKQHm5uhKsq4W4GT51ZAPRABEREJDPKfb5lMBUwnLLT86xMFARa3+8yrPRM1cvgyoD7Nib2wnmDuEYAKEJ3t9Y6iV6lxpPvka87pIiCsSU45lpVo4UxC1/sR2fhHmt+qoM4yPXtB1bZ/5NNoFk1IQKIoTwwByc+7xYLR7dNMbfeCkTsmzkQEVkZgx5Q6TVJsvLEQSgfhfV1pOh2jWSU3ZIagYjRXSdzydtKbIf2zF4ioq8oIYDma+55ANi4sIkIuLP1jQyDCwkySErZpduEp9f/Tg4VGf+mONK/jrfE/yo47fYmrUCMtlEA4bBjtNvGTUTE18CKHWlkt79FphfbpIjANTnHmhdI1zyBsSqQHlEo6TVEcM0pk1kLNFumtBHJP3L1B1qCt6XjO5rwdrk8pC+hwTGp1+rpGyGFRd+WHrX0xgztoqlHUCkRZsMJcAunh6piy8U8+i9wN5ZjdfogzyV2SapIUV1du3cMY5U5+h7aTXvkWl9ow/u2Trwz2d4wWxOIdpAftqvUNXg1gpZStK+Y2SUiABkcl3u9GwSDCEhIkO5RtNeDSi4jkAiUDEI6vTUiqIOgOY75jUb17trX2Saa822Dvc2bX1ciFQNUqyXqjb/ai07e6IK7GJcZiVITHfzFMayAPGHY6PW2knq6q382xsOKHOCJ6BW7xmdjdZd61+fYwz5Zw7ofRSyOA8eLa9swHb1dSzgAyd0e8ALn+1pK7VFIqufi46Hl+KJx1NvndQZXQ2BmDsk5enHov78ljTfR22MtZoReXHlvuVkaN8yMOcWFU58yQuMN7jY412SmeDNB1/ZnJK7t373inJ7V41COddXBxh7G5Te26d+PyN9KTw+raAdtd5BzZrinD6cOscs/g5lk7cRXynuqeZc2le2TK59TVVW2NoNOp6OtB/d0skhxd4+gB4UCcnNfItcgTpVIeVuq1Co1xGEuDA2toLNGPEQeN50mnVhEik6cbjLdfzyq1LtMilIgk5ZbvT9quUM0emhygUpI2tInAxAWXCy4cpe+GyIU4KrEJlaX9gw3dYdKIEQs02qW6I7zha4EGVO0EhJoSpYgGRIecKWrhBEixojFk5GjCSfgEyyTPB6lVlHCmleBFTiicBGYaiNDlVUzF3nLWVmNUBCKADUd50KUGlQLmjAgUosUdVGL9tWWRecIOttn+1xkMVoLd4TBmi8Wy9fy5dIm/mj6BBzqEWb+9YRpMKLRCdEiL9aeM8UR5ukSIFQh+7FBRKReLCKMJMh7VQSlXrceD5vUsxpy5nB96bM+7LiReqcg42vhl0GFvVjo96femFJHINNfs+8mONZNMbKP9fuByAAI2Cmsd2MNL/msjXeGBzf8bKxgsxCNXe2k48JkU+7p/HHP7nbh1yFIxCNlU9mAGqcpXR+T8zp2Hufv2Rlw5rMH8FZZSlUjDuGnZC6hUc7O3vb+XybJ2CjP+LrrvI8MbktysGM1dgq/jWKb8dFN9NW4Txh422acwSu7WV2XgdXHYXtEtqNdHNbAS3nsdNMZfbpfQ7s+m7YSpF+sA2AvKh6ZewDYjwWGLsQRulYfPw1zrJBwlWlPj7zjvzmS880VLVtXMYjpuMzUO2Egr83NLCIYg2vuMRZl776fnxzGlRzlZf/lNNQNUB9QcwL95dTiDS3YvgyfmSHbTs+uX9LbeH91PmaXDdbHdvTN2t6yS7eDenN+No5F7Y/XtdsNHg7dXoewPXIiMeQqtfLcfuyKAXjwXW7TVGf7r0NRs7Xn6IdB2GjF+sJdNIsIHVnFKzBO37GSrTMa12xLp+mWPJbLTYoQkbQWL9FO6+T4ot3b7+ViGzbAAYqt2djzcXaAZKLcKfe7jbdz1jz3WE1B72jBOwJxgmeEP95kW9p28pkGjXtk/6GPbF1vwLoSNqn9NKJtg48k6fj289Y+72iuB4C7kpljk4jIQqKOwGWCRjC2W+ynQb7aCskQAYjRHdsFFIRAhFwNQDvI6MnEwfXQRXvhMdFSIYWRZqpM6S8Sco9JVVXoYrSmkMIiMpF/FH181Nut3guLoFSUm0yPeq9SJ0iCJ+CkWkXuZJi7u7mRRoiEpMkOgJpbm9PiUkSz6AFV02whEluAbGtPzYQzwnBS3NPsy2SxoiIq7mGVbYKwiig0c2ObuzfCIEG9kYQ3DWWAKhachEq/f9zvHz9KKdGsAQa4uq8GFAG0cipaU5iOPV7ImV6wEIEKGQGFSCBgIoRQRYpA6UIL3lRbTAAht99zsUCeAARhsObNov2W30E3uGFOw+vSnl/L72J14mfjHGIh4TDAnA5dmWAIQjwibWAilAIRhALuYY1ZuiDNJVjd44wpnvd6IGtKANn4aIpZ3SFEMlXTN9foD9FX9VDP+EgokgLrtv6vBBD8JjXOIQvcSs/3zTuQxPRBirE+6zvR4sKU9/sDXTpTjyPYPvZ06nm8riRupOopvr9PPrT3Gcc7I55H8EZM7vQ2UXQM7T1BGGtokIi09lI+4do3uxVoNM8N4tMg8+2E9520MH73Fy4fyUZfPHIi4S8lCg7m0ZNQtLYToJd9PMl7FwykbgaS29H0CsbZF4M8JK1+d60juOyIVQPkesKQrhTvduUo4K1fzoLfkRse9unLORq6ei2mR7yoMjm84rxleFGMx7dchUagS1E5kpXfH3AV6+/rCh1V9D78iB70n6tLWbAmBys4LNZ9YbkbXi2pbHldKCcMvpQt+ucr5eF855UigXWpCcaK1gf3uG0TjnfeTer4/ajBJ6tZxf2LUoHjythcgMZtMC6sE4pOA78sXOBSkXecbwAxhGyu21u3kJPt1UnEB5bzYqHvBAuvr5XlYOhz/2kE8oC+i2KZX1Zf7UPLb3CyLfdLupjXYT2nrgYEnvvnm3V4GEVX5bmlh3d76wD6rpMRA+OocVkkcYTzNLS/vQ475XBzIBkX5XP9fhYIOnpfYOm8jPfvWwz3hS2N8OyTi91FaHgpuZ6wjUls3V3Jkl57fbWKQ7JadLhLHh/nAXoEhSpSp0dJEukRQZgLVAJ3TBNKESWDYlVUVYnpVv+vSR+P6T5N90IRlwJVyl0nAQsIDzQDoO4qNAt0f0IXkKnnWnpDICy8PdPBQ0RTfKaT6YRAZpxARLi6unv6doDC8AKJENXUaarIDLHwIhD6x+0OeHiLZuaLt8YwFdSSDFoUQg8RtkCD6k1utT6mSetk0maEge7Nhe4eHhSpylJUw8NDlTkDhuYeIa4sRMTilCzxIwKvKioCBcTNLWIpRNVem8XBCY9wNrWIMIRHGKLB/1V+mESENVqEWdg8z5/y67N9LPhs7dkwWywzPpvPLeawsIxSIABmob6IFoUhCBFHHqe4ZMWg1bhjHoBAhVCyiZQ1CelRwT4Kzd/IGddds+0dkj4YL8brFPB2oudXqvVy54/mqhP8166uDOglmbqy+NP3K7P4P7muFAbvBSOga0ZXbj5ayl/GJZ6kgist3SjVdXTv+BoAYblmKRz4GnGSJd7g3y9cY8XJgTdt7G/t/jU1fnntnP2Vi8SJH41zsa2cl3jr63xz1r38Osgbw/y+55DvfthgG+3ZJ5Ayt0rA8qSIB4H+LB5sIG3YeMmFrwCcHh/vv3vqneT2fnu+E2bGl+7r4Vpd6t3rYtWKc8tsbZLnllLKCQtx1JVPsI4TMCKRr0T/10u8P3xpEADOzjOXZ7v+IOBJNPknIt3WUmKXaF/AeWAGb4czdnj66Zq5/3B5uqLnq4cKtdwCl0Holj+eJHaJ35PPbEvZELn0kQ7rsfmexjcq+LgZ0N32d4S8fOJ6i6Ru+YK2FRm9/lB+6Xl2oicaWTt7cQo0dJt4cKwnPCdqvkJ6XOL9T2D1Fj0d72zj7TancULT1fBV/F9EBoOP0YEbj98S/kfHwYgrAkxHo3yVrOAFCRsclnbcrvtj3GLXIRzF/DVW+MRpXi3diFVyZhcyBlGjawbj5wFF+3fd+klv+9U8RW7uy6+MLtuIxilLsGVVfNhZPoqkfWWNxo5ghLtPRSHqab7wbufP2CEtJZ01mwc8RLRICYhoEagG1EUKa0gJ3kudqEW1QorqpEVEYHqf/u+pfNzrXVVLOoI4GHELYYDhYUZr7p5Bmd17G9B+oigAYJ7OX+Is9oQ1kgKNLhVnan+E9Nz8Hi7hRAQ8l6eQJQ/NPIAmIhZQRHMXtiK8ibmbhVk08aZhpEO0MAt4gZQM5SkWM02l3BSVqKRVZdTFwwQkZ8wEi8pUSEa0ZmZVq2SSFnuiBTQUnpXCSFIWhqhU1VK1R1RbuLkHWSaFCgA3OGtQPOshICzoCCNQHibu7gs8wi38iflL7u3+ryWes82z/X62z6f//r38ftqv2WdhOAxCUBVZN7lpiRAD0JrDjN4IKhldDQg4g2QUioooFG72Qh4a9tlBvPpnEm+nBq/W/DeCQt996279nnPJzjG9u2UPPHTtn7Gm4n1fZuPvrxXmpK5+QNQA5VXsBhB7XuJhmAfqlMhP34/oFoBrmvJLD6NYecq/vgNwMfataR5wggobC7moDREhr+WfF9P0t/LGqXG2XyMEzlL4S3kj0XUVb94z68Mbz7L4a8HsDcXut+Vk9joIfsO5/aGHof2Y1Y3rxCWek0m+xOoW6hLRpQLPQrFdlo3+Xq455DtWuvR/FZR3WeL/YHdcryub3oMKhsvd11ijEQ1pfj20TMyeBGwMhrwYXJvGXXCkBv3mKNtvbSRAShnVgm1xRLw+2ngpl4yPn6WQy3UVCM7NBg14fGpfQJHhm5GZ3WVIHBmrqfj7TdIXwICp88a7eFJex3JCdKz+iCkQd4wf2/8tiR+vUsr24DiEzRQ9QAuEkudZfwXwgKhXQ7vS023pDAT20ObdiK6IXXdejM9+08nmeDP2uaHxHCa1QfUmfSR5fsu6Yveex4XXXctiIBlJsFj+duynt4zA48LMDqs9Y+aPqviLsWzfAQwp8LexRHQXsrUtxzFeYRu/n6bm5UDejjEf/WcI6d9tTVM47KlxF28+fiSZQZBApGtKvtTh7goWyCQK0SUQEkW0SPUmUspNS6XctNyk3Fhr8FGmCVIpVXQqtZQioJve5Ucp90mmDNhHRJi5eWmOMPFwb+FWPDLyxJdlC84DAEd6BGHLJxsmWAjCW49oNkWIRRbkJiDRHM2RUSUe4ShFlaoU9zkyB6lQM3xBUAm0OXyJFhJGgVAUFCkZp00aIgR0NyIcUeAVrEQRhFEprkon1TMzy1R0KopYmjc0Cw8G3Mznp7urK6RFpMLTAxIxWdGbeGRkbfgCBxXqVYThdO/ZeQA4I5yZ7scpIF3V6bO7MzziMemik5WwaM/2/Gyfs31+ts+Jf33JzzmWFnMqPAaz6BLApFNgaW2J1qK5UoDwnkMmC81ElmljzwvXTguyr64DzTeSEuJHZnSk9rnZ8s+htzcOzSO/OLHR/w3WMLi3JHU6sOxtT60mAOBMP/eeLgr59sv5nd+R6Pfu0Uf+uD7uwX3s/5Ab7qTyKHdu/RzcgH23Cm2Pn9A7/nSdr2Tl59iq3ufbIgAn3O58arBx/S2vPEiEZ7ntjMxO9r9F4as3npWBl3JkfheRdDk+1JcNYEiWzW4m4kmE3TB+FTN4/XJ1fbmwqpWVJatQwHauCT2VPEtEriz+MMANn//wGuE/beRryyvCx8l6yTpfCqjDr+e6Jfmr+4uuTo+fALj+KSIls3lgTY+zocxe5fx+KRNcBZrxp01K3zbh+vlaa0QqQ6uT4wZ3L4jQW2Nbb1eZFcd5OlNGf11DUA6PD/0cD153avLqvec+xwf1IM6mNMP1jh/dKiJiHO+R2O11/nJxaBrZM2Vjjzs/LNkBJzs8I9E5q2BXBeNyrS+BvyqN/g1mDuQ4VpwEwMtKAPH+6Py4ll4zOd/v94p3B5wIITzQDW7JAV4OqAeYbS9dl+DLxv0aLR996xKbH86B0A/r+QW9uIx3a7lFyW0dJlTrFG0dHFxvL6h7oZgBIHQFY73J4fCXGhdy4y/FoFOzHRs9Lefwr+dJIHtW+HE+3L2qptyKbj6Cu8OpohMLyWlS7x5BAsid00OnG/XB6aNMD60T5M6pgHXNaFGpJM0hi1d48SUi4MGsDrY0hgc8LCJacvU03tOjJ5Ra58u9bZk0Ui9XrklIzFmUEHdDMIwejmBbWvrUsIcRRwnV0BxchCFUI/MemRIqPs9fZhbBKtwSEjCzYoXTsv6wIQzdBgotLFVEBGYepBRVr5VqhMdUWJTeRBDKEDcLb8tzmWcJJyqc4Z6uoU6WUiRYWDQy+jqUkUdlfC5oIISActEQQAwRQQUdAqoZAgIkiwsnqKUVhcQS5S7TDbeFHz/Ufurzqz0bbY7nbF+z/W4xL/50d8PCgIXODXNbPApgJoww0kjNOtxrBimG9AAZgwdCKMzcPe4ne3muwFyqETFm78nw0JV+5pekY5k9NjPQyJm1r4saRxq17ZrTn+8q3W5yQCc/6SF98crDCvH3lQuGPvuX9dh0FS5JcvcTzvsHKtoNKwdHhYHnnoVLAD4cq+zkDgBeeF5dJaSrpOGjfXeTI9gPF1bfmZ3PbsABa8TUUdZc68nsd7BLk7aeH68vwu4sHS8iAV5XfrjymBWGGFbUIDTzxf2rxDn+dL0JYF0Rh2onia9wz5J/B1RQAwHsJYq53zcEtszPL7jme+PpAOfF+yvy8DddNjOxbzbIekcK+nj0vcoJV+H7RXjxxlivPknjqh7ReL1zemqUfg/izaU9L+LxN9J/f6SvTw45bdPklycM3fI7inP542CCFoDaJ0N7TEkm/yTLlmZxe3f3rhsKXlwHPErV1zEMl5wEyJey1ctFPGJxfB3JWDPtAzA7+1y+xOnpFSMVO5CzFYQNIYrrUgFWH/0kIqPudMqcMG6zlzvhOuoYXd6PT22gjvN17P8wL6fZObS/YOPbeXx9bYthHN0V1ePN0VfyOIp3DM+BE8mIWI9ox5e+20svAds26t+WlL8Q9L1SAoak3O+wNyZui2FTvtwIfwtJH+n6Z4z9Dq97B891Nf79mrwwkq49rScPJ4IQbxByZXv7El3hOeXy55qu8bDgM8UjkUn0VZWOcG+LK0QhhUIRKLKm7a0+PvT2Q28T9S7lR739kFqD1bWmw34ELVKmL65t+S3WqBXRfUhohtYQQFhEFlY3EZEQgh4mVIlMMsugMxwMc2MEkeXmSNI9PFxDBB7O5hHi3iw8bHGRoqIAJQskRMA8zJGOM+7klDK1EEX4bBYZJqS1x0tEhFAoZkuEB8x8cUdfdJlJqZSgBMJyCkVvN+USNFOldOunRxhcIlo082UGI5QUMW8KDaHAi3gR1pJlBay1VggKHeHmZiZSVARsAHrm5qCDBeohi7lEoZYSMIcUEbIKnVois+tOi9YH5KH2LG2xeca8yNesn+ZfjsW9udhfX/+eo0QLN7NAlBJoHp64CoBCJYQhICJsTbt0Wpk7rc4c9QzfsoS9iQgYKHY3u2wE+LqtuqEkDvSEazrdd51f7iK8YSRfG/CvenjJ3UZmesXDYYceudIoZFyRMNJncpRX9mbjRj61f4mEd9fI6SJiO6Yda92c2o+4OkE1ArYhdpuX0wA3y+s+IkRE1FqPlLj3mbkXx4H3F10MQ0eoOj0cxpiY3xcPVl7wDfZeTvE/v7jqQoeXXjoMjy1x7ZXCjy036LdmZq9BGsqxs2fSi34f+crIQOwtAaAAOzOK2NLeM+Ls5HKCcIPzukiua+aKIryS9MYtE//Awe9t52/M6y/75Fq27LRKhy87YNlD2XQI7AqbiHAzarkfcHeiEtt67v7ewAhSRIiouwdERHsRqFXLJClIv66cIQegZa9NxlVe2iFMALrZL7BZ2S+ibR9hp2Kyb1di1Hk2+eyKyvzsLj0bEtDNF6uLSOQCFfYwCxncLbZO8o6vJRfGOciMydzW2bpwx2c7MrPb1bEe6AGaY76mHAwR7OYhbpCPk4Lt/GzN+Btr/7LicCdnJLeg8I2BrXpRORoMti9nopZvO7IBDOtKdDzZGIj7UCdhmzIyjXw7NdzwWac6loPdyviR+6RsApOZEZJ/br5wI5bG/rddDXS3/j5vq0A86DAdVPewUJIhzFTwvdxsRLp49bzUx6Qe+3tHeHh2/RpxWHp7iRRR9+WUDUDySqDHTl4W5Oo47UlxkT2TSlWLANhzSKNv+41IXaf4VOCGq+ZskalYiHUFpn41ad1YBYcMGAzCSRGlFKpAVEopgpKJgCwiqpRaq4JsuKN+yO1Hffyc7ncpNTg5K1hVwtJYb9vGVJFwt+W3QUopgLq7NxfAzMA1dsjDfGEpUooSqhLNluVZpVAZbmZNRMKtYQvlz3VI96aqBBjuS3rpq3u0Nv+oVVW/5tndVYoQz/YMzKoEYl6+RKTW6m6//vPv1rzWKloAtECtFRFtWSKeEUH3+flUhEh5Lkup93K/3358GJhWPqfcbrfHbRJpJVqkj4G7mbXWbFm0TlmXQFWLkmQea5SiX8ss8NutTrdKRtjT2wx3syDphJk5HOLlVq0tqqpaHWjNGAS1aE3R3INM6z9URYIyzzOD6lFDKtVRSkRB+1ykUIOV00/3eV5+GReH3aUs0X6Xx6+YPv3XgnnOiBLxEAikiN45FRY6HdbT+3BMjQ4AFr5WuTFSRRGO1tqkt3Wnx5ayCTvjcHRhLgII3xy1R0pCrEHt485DJvXrmW4vm85cB5IoPYlHkOwFQVem17e+efRtMgoisDwd7NwfnXSnAet0vJYC08W1MtB2X6M1l9FxLCcLXQqFvgkZG8sDEB5ksDDlxszO5SvRW4VuRK84+8JytyEkNnK6UrbM4ImdXCMieoiJ7+LNzjK8q3nXEZ1Objd2oFoBbElCSaLX/jnLlyeiNzJHoBuROg9aZf3cbttrvSt7OjybhDYZnEim4rqI3TiezJ95MSlStz/d2zZNmU6zj4N7lEUcuZJnOb1RTFLtXMZ3wRer5BYRKsP6X4W3LApxMrCuclEqVJZ9RURavrvw5nsERbIXNwMkfLU1MCMwY+chA1eK6Jn1x9FFvMDkCYfXdbKK2tzY3HY/zcI5F74CTO69jQDIMb37AKfIliNvBQXr+uxm6PW2u+fwh8DJwLBCtjeq9ji0EhdRtb/+eOfU4Hp9/9O6dPaWZpb5VQbEkVlU6PjsAfWJvm/fOxKIbSFGjBg5P85B2IpVrF/f9lb/O5PsY9Mr8Xr5+HVhbZlPri8iVzlu/eUdkPF3Rv3tJ3fPRbsO4u9hfjm601J5+Wxc7lzhOXV13OcvFuFIYTlUmD6Zk4HXm3x89thn3noxqJcD3ODcXpGSrEXWK9mfPaxM7j7u18kaO8QF5+MSxbpu46hAri3fgn2F/wCJ/E2x6hG2/HLNh40LcrY7QQQV8KzHJpt6GRBJo3Aq1n1HFwoiCqVqKaKFqpQqVcFpmhiAN2+mkIn1VutUy0fUG/XB2z3kBqkIDWfzSoGHB7qBPdKRPdi6hRVW3GmWgnshPDx8XRaIcG+0QNCXsMXhzZHFpkLBME9SJiKj4DgVUZplS29ZO8jMPWg2KSHq8BZmLQBfEObUWAUFd5dAawuh7t5dLNfyYRZOyjJ/CSKPN2aL2Qy3Mt1uvN0FN1AJk6BMtzIVW57JoOCBWMwskC+ynQGvhQ4i4vfzK8LqNE1TrVVFsCzLsswRAXoylQxwBD2siSArEgMi6RgjQHgRQlx65Szx1NDdKhkhEiFd+gxG0ENKidBMXmdRltDmc9A+6n2OrzvvN9Z/W/0Vv4EvSimTkKGCm5S7TCXIhhbu3oQI6XpyeD9wkY3pIkCLkJBYs1qtWv5IAA9yw7ZJ7Hunm3GPp2kmuHL6y+4bafj6ae928ZU2vqQnI7XEK1r6HY14f72kqOP9lUXamF9/bPaSVXGQobODwUzDvUGPCfRTJye2fHpL/joKGCc6fCJZnTK9p9JbPwcu+QZjscrcm1jCQXz8nnePr772P/K406J6Oenf//nNq3dQv33w5f0D2o8San4Z04xuQ0j21iucAuFrlcI4Y2Lnr3yx7P/L11XswXGFfLN4rj2MbfLE6TRBJDOL2cbmuWr4fCOXxnC9BPJ0p6cAGkNLv6cRp/G8a7C/5iq6BUkpst+XSGrIkJ4NYLUIBgBNtKbFZbWYApnS+wXJewf2i62LzTJyzoETmxf+5amsMnva2QeqnWfIJ2MAmct2NBTzqN7knxwZyvBTF/QPumAHHkC3uwxQxQU/hw6/kSzx4pKLN3Y+5ZenVjgPbxwUi+vveWOnfZn99/DjcSwxCJSn7eRI7f48Xhta6nB/LQ22W1nGCM7TkLftN14v5OZt1Lm3ESd4SFpsNXb3ZRbRg3fHrnqD48D3UR9RhH4mRj9A3g/lcVwh47UxodPNdZe81nliC3nfRrEq6tzadDjHcXRVBRGi4ul+CvQq0SH0sNm0SK2Fwkx5UKBVlOEqMkkpqhNLEZ1YJ9GJVUh1QEOAaZruU71L+Rm1GAQ6gVMqY7ZEs6wSpYDRRdzMFjOHm/cq3W7qHmaRXqfh5llxVjU3sfda1BoWbTaHpVYQQS3F3VLtI9T306ekHeERHmaGoEewebjjOf8F3kAD5+bGrkKImEeEt+buDTMBj9Dp5k7A8mRpad4nS6K5MVBYgpx9eaIUraiPKI9gMWjA4aBWKPHl8BaxONytmS3IMr8iHgLVSM99EhG0MGuqLKVXkMwzA/MlcyJlHjJFgCgU1eq99KSRqCqiQmZGo3TlFAqDCmF4tPCKChGFa3iEQ5baYlZ/FEYgQgEx6MKpoUUs1OXLdZIyiaqqzFpQTJdSlIwiqNQ7RYKgtTDqj8Zwby3cbGlhHm4RUMlq1s0lz7P7drgy2VVkHzZdUsGDzXjYSrs3/kHKPKrlpw14EiD2p+Sg9u/Xmhcb2NJB731eexst3OMrwEGBXynKMPZ0ZDoTupGn7RDJVgzmIJqficwVhkRUtyjv0v9Yx2Z0TPDh/kaIOsaO0r93C3rnlZE+yhdPlejZaV4TvRXAjQ6nU0qKJrZB9VI+GxdANhORraSuqo6uL+sjQcL9gLcN53spxjeWze+FIgAZ/xjXk5Ah4rkvodgT2eFijVq9B4Y1fAHsipYVjyOLH/UBWVluMBjvIvhfITyC6044S8PHFfta3XqJqzcI3IEZG2y2sA280wZ/KZTzqEX076vMC3S0MpPGDZhe82KdMAD0BEm9InVEoBfQjIjYywDj7xbNuwX9cvCnm+Owtzvb95GgCBjr7Gy/cjAeJwE6hSiMAG8bbMQjgJMtITGzTdKVIL67RpL6AjNrPO9pvBjReyWCF9L/ShQ7v2tgQt2r6m892rdrW5QJ4P66Nx18Sw2xdYU36+TltS33b/bV6Gv+sv+RBJCkYE3ReFiZI1YPK6dTh4Nguo/lOPYuY70fy+lmYvYKJ94T7v3BNz8lk9teJ4csQO+o2Ju1+qLl8TuxhpW/gIeD8WbcgKfeNt596ici3KGFjEiTv7Jk3omA27ykIlZLoaikxzqlEIooEA1OlDvLo95uUHFO0KmWKqqUIlJVKuUjqmb/4Zp+883gbRtYARzuMPpivjCMBFwMEsGMzCUYvmRaBKcWqZDudAGGL82WxQmEtdYiQuQD4R4u0IgQsEVIQISttZCIkMWshXTvVaG3ZVmegGshJRjuvrg7pWaBY1vmZbHIqCQtqtrV/7XCS5b0EneGkGwRgLhUqobeojxCawv1EBBaqpQSNGtz+MxogNON8CpUKSoA1VEjtuLzLiLTVLIks5nN8xdons8y0+621eOl1lqrlq+l2z0yoEI8DAuckWXQFOo0GkLTizJL/5pEDQSDhCluRicQkgHVDboUW1wbSIjbEnBVUVWB/OAdFXpjYGFAiClSz7IF9nj8nH2Z22K2GG+Lt7ktiy+kBNxoFMmq1oGAh6isUXcb7+jRWS/30buNdnKB29ps/qgnXrn1fuG/rwtinvbvKPWOPY9s8X/3+i+IRNt+3+Xd1cUljpde8HOlOcdR9IJZ7wB4KWBhYDodFa+e5iAgvgNj6w1rTNiG8zGZCuLcfmN5J/nkOsaX4xrbADu/PsF5FVFOdy7D4aubGOPc1jd2e/vIJvBiob5YGycxZv8cbZFXMDb1ABphaxMBDJF+5UEIYIfhZ27vVdId3/uaU7+5/q7xK745LO+DsDEo3if1YHXfPvDxsEMkeqzazPbcqBK/g39rMCytHcIygrsLUSKjxzD/gXh34v07ARpl/VUIiNUhvqTNbw0JCKF7G8Nux+0KAKtxndhtme8IxzuQgF5pON4M5+VaeCncnBbHRjh66Wy+fjbPNFaPMAIjmU58cDDVDmjPiqYbD+hGjm0IPfY72yeiBP3k5DQyXjLcbXrXy+ubzYyj5voKJ6/VyA2GMx0Piei1Nk+/nijjuzdG+swPxPGQ13llsWQPslkLKaRf6UCb+hN5SpAD2YsAxJr+nswUCi/J676x0Wcs+9lGsJOn3CLXTrYxnujmSNG5KhsrSl9kZzptnONvh3b7vRcbZFSNEGuY9jgveqUDg19WDtnMMrCAQUKVeiuTUsCgxOKzOjEbjKXWqUy11CIIMyFLSHW5S31w+sHbQ2sxVMokepOSVEWdDFRAgoTT4WZuLcXc1oxkZieLCFiDGdoC9MSZaewXrUIgjGFIdxgGu+0wIiVLb24zSXjYMgPwugBAz7QgEQ43UMjamrsjHG7iTopSCwTUsEC0pUKqCosSZtbULYBweFuW57O1VrXU6R5LoTOmwsgoWiWpoJur1IiYWwuG6F0mQB9SP1g+whEGKbVgFhF48/ZEmyVMBKCLAPlyQCAN4u4Wkn51FlE13X3DbWlziAbchJkYJ49qKCyiQQnQMywqqx6LR7O5r15H1AVeAowgRVn0JiU8RIqkHVooQodYuFtkgXO3UAkVqMBMG33yQuBWcJPpodWklbtC4bG4O8MEAQ24t2hW5XOZP+3LuBijoX3p8+lfGfhMCEinO6JFC+G7CODjtYnmb32+v7n8wnGuklrkyXDyF65+x+urMGxTppfocAp6osBXQn2Vbo80tldDjwCpyVhGwC5drXFB2LnYDkNscMfp3ypefiNgjMyijyJjAGLzqLkAtlXjieh8/wjwi2yHK3jnKyKyct96oz/r7qq6cvONsb7hTWN8wjG+dkw/Os7X1mT7dl1dV1bINzrG99drrnE8DcAxayJ68Mz58SNPH75uXIwjZzwg/MDphpvfDSO6d0Xy+hTxGPv2OosZ/+B6t4tHxrvdGafyOqJso+yxKzgaLtec1n2M48RtqLeuysT43u1yILL6zD7M1/jvPQcQOJwAjADFMZr+G/nvJU6Pksm+avf13bNnc1umEcGLdSM3Sn7mHVnpR/b50ue4D+GVxQVHjfPlvL5LEXVtfJJyjgvg0OYFIehfzsGRKST5Efgj1T521f8/4+H7tT7Knbk6EjXXhfXu+r7/d6vi+zOK437bxdwR7BWfLx7P3XFazOhy5xmfHJ6KiKTgJ3oUx0fejevd/YjYNuSp560090uG95J2nPo59Db8euIcGISDNcPuS/hfj4hvaPphQR7NjcAasH5xqx076WcX5gqKaGWpWqqWAkpgobJlGhwjShHcqDetEFNAIRVyk+lDpw+pD5YfjxtnU4tiUTIYk6yiBgcpEPPFzNwWCRA+t6f0s1ECMDNrzVrLIbhHQFCKVMmIKnV4puhvmSI5fRMgYQwvsEBanJYIhs3CgnBm8VpnmAcR5hYaoe6wQEAjCqMKhXUCXVL9FFERj9Zao3Y3CrdlmT+fX0tMk6q6larKsDY7VHW6KTXC4Z7FyMIbtIRWxcTykOkDeg9vQRcRRnj4vMzhs9iMcIGSTg1SqhKAUchqZhqxZFIUui0LqSFh3jSzemJxt/RecHeAUoqqClLHM5IqEmFuFs22NR+hhBoDIayVKKHiJqElLVDiSqlKBSiaTls0MUpo8VJiMYfxxtuEEhKQycoNCq0ISSerJeiyRqs32G9bJOZiU5PFEM0XRRWoRyyYLZoLglh8KZShxOxIUiRebloAcDAFkTPh2vjUQbLZUvitG2ffVquAux0dkKlGvU6bsr1ufO9V4hlJxEBLzyaYdzv3SmTGQW1/4SJvrG+0LaBxZJrAQTQfX61DFrXtS0Rk/Z9teoZXHJjp24naSFm8urnSzBPdHlnAAGTXQ4DOPNeIz7P4eKLV20Z4mSDh5dydvrzC8EGwOb332tXLX4/42X89MNZj03Xor68Tt33JxfbOL3eSmyR52Rw1BmErNr1ry9C39nPII3eYzUus6YiN080TwCdMbhN6kv/ycG985BvhYXOTO02HHNfM1oarBrX3f5mpw1Y9DHAHpp8AjGUdrrBuw8NlKbxEynjFYPUfsVnKRFLWg7wkgg6wHESUbdiZbWY9NQFeCWfjl/GE5YSRHX3DyrySoRWCffLGMWbyhlNmlbEJyV4B95VKcELgi1esFGj8FQyMBSDSGr0SwL1PZgb8yIK7W2+HU50VvcjEzO+l+VVTudzPd+x4Wu9gV2+G1v3zRbmQVz2TXBOl7TaSbRuTHMrxnq+dwxEA5Dx1B6t7umCuvzj5f2okGBnG+Oc+BHZ8nFg1Dvr9AVqsgngMVv8clR3Y0g6ABCR69YktBUGnAq91pxdxF+vikVHmiQEqv4w3r4RKRoax5kPYoK29okWfoCJawEq5yaSUn9OHWLhZagiTlDvqTUopkwortFJuqDfqB+sEmUzFwWZqQVsQqFrKTRwwMfcwW9ya9yK+ZtbCjR5wI5kJcKytyIsI99YaQ1ASfEqEW0qxLWDMuBGSEGF4BMkicAu4QQi3QA+kdlsIeqnhxaN69+XJ1JeTSNVCEYS3sJkAqBbz/LTprpnLP6zZMltbQkiEIIrS4d4sok7TXQrDherWAuBUbl4myC1Yp/uP6fZDyy0agi4kJGz59M+vikA0t4XQIhCYUDSr3akwnMw8gLJImKnNc3iEMQDPmrPerM1ESaSJFEGIwsxae1IiS6pJDsGWaBawiPCGiDCKqhZM4WKR2k9VrcHiMmmEyw0hWc8X4iymagKT0mjwRfR2TzWDgSLIOTFfIqyxBT2EEDhiiUbMk9xMPxZflrBnm6tOd5+M+LKvp88WbQ4Lwt1DsNjM9dD8sB8lt/Ioup1p/VGGS053FincPdZMbjI8GANN6Kn+L+bPGHbziV9j01C/dTV8JdSe4xkOo17db78RrJNCcHBNXDu3iBCeIVm5RoA8BCB0DvhCCXk3nNNIOwAX/pufQdD3dJwnOjbKQi87H3pLOmYiwlVdcffVD+iFWrXxR64m0VhPMEZucoBEnMTO0N9cV2Y0jusEzHE4b6r59jG8W0XfZshd/zy/em/Wf96AIXeD7/BIHminFS9/1cDr/Lnj606z/27NXFH6DlEXpPVCtO8mhYOzWSJyTFG4PbXdvK6u5MuRxYPS28D3IMfx1fklzwG4HoZceTqQ/im9t17WdLy2fk8b+CWmvkHi+s6DyLs1yyxA6dEiwz7xVz6OG2B9waxuNnFRsq84HS9374mT/sYwcJ7+HYBBYhvRlT/pWpP6mwWxDnNbTFv4I7I6OskuKOaI8+hXQAgYZvOA2kFlzP779GcmawR9+OWAWAWNkOhudFuE6EVy/24Upz//CW169ezBqjSuxNOG2XB+3SpDh4c5ilXfVR1JmAAeTtChgiCGZKkh1K0QBPc6MmfIA5n0JHAIzBs3zibQjyiK1WJ0Gks3CP0zgtXhEaKZRSgZpIA5pqxVk4WOgmDsOUD9omBcX7dvUiC6ifxFlF9E1sBaWTIAQDeWsKcO7I91tJiTFBVhd+tHz7WuYlSwFJm0/Pnxs0IK6M2iGSKq1BrlIVNVLaKVMoVUxORag/H5CYdY0COWOTyiBqoE4OZuS1jzMPjiy9xsKQTMm1m453SbWaYRV5UIMTeLkKUpi+haDqQnG8mgvaaqQS2FFOGW5Ddc4PCZZshKX85o1qSI0VGb01EcCFRhpdxQJlGpk8Jsfv7q6Qld5ybGSgqtkZSA+ELUQkhRlBooi88O3qSWcncLaLXWoCKlsNYlxFl1etTHh5RazM1Mi7DBm7bwiQyYe5OMM0yaKm5r+h+EJ02QkIw1SjoaPX0lPJawxcLSPZcSLDV8aUs8n8+Pj3tXpyICTdAMc7iHmZs1N5K8TeDsM5o1rbco1X0KVmEzD4oFCkQjKRidMEqgBoVFa1YjQFgJTnlOYG2e3RHGGnQXBrFkok8Ki8QNze25fP3G5w1l5iMKPufP/yx/PW0Oe7pHRGOEUhwG0Jmyel/EQgUJ2/mFpOroBJDJbZOAjDuanXMJ4Ok40eBbZOW4+watIDUHFwAhQb8kUxueGmVfZGjNwe//JRE+vvotfeg5nnD2IfyGZZxko4hYnSAiFZsM1Nz5zmDpzPMXG+W8w0jXs9PVGSWGKMiT4Hsa8spdcDJInRA10vxXvY2yck8PltjOmROkcO9jNO0JM/20fzXQ5DEa3siCLzFM79U/v295lf6vQ/umhyGaFIejjT4liOjxTKd1+LJP35W9tBNxLIQaKVJv8yLsVmTjuD5PYkBXD1ZRu3Necy+DDD7O7z8L+TyhYhzX99LOqIRscyoim53+UOQhopQaayar/S0eFqHAmGxlFDDSvpz7KEV+fwPGuxVVquYPuQeTXAkAzYo0yfvHjbeJ68ct4Zcpz5+2s4WebR1BhpRuWowOWR8ukPM/qr9rz4F9GOt3XrKpbPAI13oCQXQne4RviyQ7X5G4fq442rJ39yPILURjk9t6vl7nTlLTOh+U2CIMM8eAcPUcz5kkACGYQRGxFkvzNErkp9TSSWMqdZkuN7yUsqUaiMjk3NY3RtqKhIXiBGHNEZJH8GUzyaSdc6p3uOW+JaTvNw8yseLEZoMfML8pmu598MNJSMR+FtYJ8TruVEmSVBBrfms6wTScuLVcfATIRGtPcoiwDWfoSQYPBbb61Gc6eUYRkmuoGXLIlnl+klt3Z2ICEAQhJdNdNlv16lUNy4B0po6amhIJDzAoa/LmcLNWyrTxns5a9lipjpCRELRuoIsOJMIRgdDj0TDZ82jkrvctaWC+w4SqkpOPyFSOwQgElUFv7gk6RRBwxLZdUo4ZtuqoOGHDnpGZf4FZRXCtvEHQw90y8zBDmMrs5lIrIjnRsu5Wd8+wLKFIiIpqRBGtwqqTQAtYQm8x3Uz/8MejTjetUgLmBBiQwI/6Mwt4KUOi0a2Y0c2XJcKbeRpIioqLmy3mLQC62fKMeQ5fos2wxeCFAvdlsSUi40db82Z++6ilqs0WbqC6N7NFVduyeDcfwG0rtYJyv4eh+aKiCjGfCxHhhXi2z+fX7+nxr6D+/r2gKGttzSFFpym0apnK9AGhaDH47XY3hD1/ZyWsx+NfevspiPb1v4DlXtSAaEspRaaHy+NXi6fWnz/+mP747xJY3BZFu7uo3h4fS+Dz1+/p8fHj//nv5V7dUW9FjQIqOPMZKOauIlrL0tr8Od+mOk0F3tpzySJrNi+klDLBfW5zZJF4QVVQwty8PW2ZPYxk0Soqbfls9iWc7pOG2eIe4YCD7rDmzZd5+fpEmIIkl+X3nARTq83P0CnqJP0Q4FPLPbRSK1iJokWDGghh0SIT7wZKeIEU8QLz9mzxGT5ba+aQoqVOEcKgUm76cIQ3j9AP0Z/TfSntieXTnlMpEvIrPgWFeM62NMwRMyWgTFLi0Xp2mtzYKl0ZTK0WmiTCCxuiwRuCa5yJkOJAGCPgJiFOFC2OGM1VyYpaeB6NeRgJSe4SC5NPDHL8KpvtnuXWw5SRxSgOBelXbX6jkNtu74R9qDdi4bvMTYLwOAgYkfVMfBe7t58W6zzUI1bdWGvVMGdkqBNTZFTSiTBLJ8ysyyEUyaJyo0jUNaOI1K+i0/e1GklQItXTcF8toCjYccJuhtjreekgH454wFqbZ6PYXc7h9ls2c27Ca1gYAShFhZ0sE2NqIERYC3fXqW44JJllYTIGYOOzG4/DJqWsKQI7ASf0WGBiG+kWq7CLRkJBzyPcJZX8YXVGJUkegkJX5koi9RMh+so5WLLzEYcw3DKaqB9tZQUe9/AxQjeV0lUUEwQZPRlX9inw9Vi+s0kBQSEkMug/hAJNQwXJCO+RKlgXigLoZQYZcBAZCHiY7NF9C8BW32NFwrY7UjfbBNrsgWvBuA3J0c2L2/oBuU8RSdByoJsPMEARsTbnOLvssG4oLYw0CMWKiAxyyGq9GZkT61ACkm4MOVE+ej35PldDpY6ygU5yDUs9ZNAftsTh+/hlEKkHgXhY38ceQDLGQhWjKhX7U+OLLvsTnViyy9p/C+fpzx3gI5ynBrYSspP+tHZ1eC/ZTQoHJXnov/8h3A49aA5uiS+3snZY8yVvisp6v4cixsE3NDNwcD0kIrOCtkha5BCZi3Ld0Z0hgU5KngfFPqT/wsWjeoBtI3X+sfedlqz+yNBDUn/ug+mWFVp3XNmRPLzxiHlCkLVkxtVyHNP2Palx/yPJurxyjnFA1+lzhHRutwriJOAhq552ORLlri/twFyrn+DNit2w+nI/hqymGSLl++17rKo7h89XCDm/8bRVse6R3IT9e3SBQ6nCPKtaNb6sJtNfpNt8Mh2YPdL+KRQNUcZD6lRK1WmiVpYSOoUW8CPqI+odmRofQipFQu76UFAY6aod8cy650XhLTJ7PUkn3W1ZPBARzZfZ20wzutEallkTGg9YEykZtaqZmLKzRXH31lqsUYRbiYkNjSRFVTXrrEtEsKs6xnTECVufKmBdgpNMMkGn23T7CC3QW73dEVTVcJMisixmFhqsN7Hw8kFEyJeFWChFWWoDhRUyoRapVX/8S6Y/EE4sFN5vt1KKC8NsUn38+FkfNykK98rSGjKaARRIWVpEiIe05gyWWkVkeT4RlrgQAQPKAKFdCRaREAkBw7zNiy3PXjFAGsNrmULoNLeyzKaZNkhh1try9Pnp9iQ8WltsiYFPyuRaCS6YA8UgE8UtDK2W+wcsiAjxFAeCAqFk0V+3iIVwwrB82tdfn79+mRmppd5gTbQWUaU6zCE5UUG5iSzUG2rNgI88IGg9HS0coBnNU7AKlygkhGLNGRCogkWm6Vbv9aNq0fDmy9PaV7RPb8I8VYLQU5VPZZ+A0yHcTGdr3gg/yCZ0B8TNCcnTcuVGpuKdVfh0oPp+s7+8rpwO6FmRcGT6WMXQzXX2JTCyE3CGt1iNAgFwpVrjq7cUGmMyN2D3214tIIfTiqS/76owbFLEhpZ3AI+/ftNmfef2SOTHKkOQPVVAj0LeCO+YjgL/YDpOYI8P8oiBEfiTCBfRj0wkDqyex/QYJ2BOf+ZA9E3LbtPNo+g3PGvEahAeoatKt4O6oiuik94eKtOxfVBB11EI8aK+BMBwSaPraSrXP98uWpygGq5TuYaXM3jtASEBlzev7PKSc3xRHiBvqmxXDTzHchSHYtgeK8AcAFjXwzA1EbGlAd2AXhdVPr7i8SjNXwd5kl3Gz2Oc+9n/6bisD+86ofWK6G2n5ZPbW2LFKC5TOG6YjYV3L8PYb46PjAtlkwy2ZoMv30AZj37uo5g+XtfXjX/6Me7iuhbTBp96fE+e+PoQxgLI2Tx0AksT0ThMkhhrHL66BmAEYNBBrAdQAEBoJ+1HDPRX5BLsHrTnSYsssrtrhJGuUeuvBwB45HMg0b2JDvjMaxXdeh/XMebEAdAu6+7N+6GNO9cDpE7sBnwaAoQcZ2B7tQ9FoA1ZyOSyj3q6yV1DG9fqKiZ0oDbIX876NpbrJGa93D62Yc2Pq3ToB3XHxbqjc7LTJqMAnSEBU0cLZ1Y47t05SLJAWEQZkDx69VBQRSpkCtQod5ZHud/LfRKt0BL60HrX+tCqPfunFFHN2uEegAtCQHM43NwVcG8eDR4iqpmCJgIR3ub562ltFkSmgG+toVcSDXcvkm7+osqA0w0IRQTCljloImJhiID3ssGqKhQPI5TRlCJwRgiFgoiwlsWA2ZpLM053Fg9IqGq93R8f9fERrNAqZYJo1QJvRdjcLSjiilJZyvQQeiw/jP9ZWDD9LI+PKB8md6kP4e1WpvuPP6ePn97mBaIhjz/+UNXPZS7Wfjxujx8/tVaoiEqIaeRaCiilaHAKb2ZsvlQKdXL3r89ZJSkohAY0RABW1NKtTJhuTtaWp83PZZ5F4NEyj5CAFA2Yo3mjgiwF0bwtrTW4KxmB2ez59QVrIsKiYEVj64mMgu6iATW6Q4yL0I3FwtcS2qLCAlkEoFnYbBJAe/7696+//td//vMfkqVMcbvX6SO0ap20VDhElGRQg3CoSJb9TQe8R6c9BoCCaFSLZXFrTdQVgKqWEHcvqje53+r0UT8+bvf79KNWNVuey/Ov56+/5q/Jn4vbAjeYWet2V6hr0ljP09PUCdYNlsTHuq1+lI6T3KFTJACvCfQqDWxqwq79HwjCa1//7boKTBu9PXJtRISnSf9SdR4Daxw79KHJdkK4s3hZ5RlCtqwpOZac+pV6HgTKk8z7EjNXS8cxVnC4zmcd33Q6woaM/OtSyeHKTiQNGG9sLt/oUS+bpbEs/Izz1S9grMHsngTqOH1dGRtmc4RqhEcOzPOwABINeTLPV2LxFfjDehgEs/HZ3ibS1bDb40dZa4+fHph+SrA7Ko7D2cXrHba9wVkk+HZBbXOyPiXD/UO0/bsOBjk+I4aPKlMem+/W5Dfw8ICBiJB0A3jRuNckIXuYQBnne1QXtp2bcMQF9S8/x9G+FCnG4V3vx7Fk9DZP8a3ifpFaupi+0Sx8u6zHTsa39H767X1qr0v8BVkZARvUhhMA0R28DgjkKl2Of75bi9dFtjfbluYbYjTun42yr/a4i+B4DOPeMBBvGoxLOdbyUEiCFVuowxWkHbZIZxZ5MeqXmD/+uutX47SePt+hNLs53cm7Bj9VajuO9NzhuHHWfl6MfVvBZ+E+51d4CP5eHwkA1zDzAx4OX0aoDlrfm2dPh8u+zk6eeqKHwtfUm0RCIwAaIo8isyx5IYVSqbXoRFVQHUpWLZMoZ1PBhOlD6kOnx3S/oVZKCU5aJi0p9yszyzu9NQ8Pa0B4LGHu1qItS1vgnomTIxJGkmzzbDZbm22ZzU3g4c3MbFlynUREVqrqLl3NzRCTwjEGAAEAAElEQVSrmcfMACul5B0eZaBo5nzaoqQStnlJ+9KW5iJoEUsDFrvdZbrdWCe9fUi5lx8/p/tHgwQK60SK1OqtSZEKBqUgQn/XOlFK0XBb4j/3JSa93aePP+vj/8L0E/VnqXfWe/3xp9wmX6hkkTp9PEiqgKhaS308OJVulkOEEOJU1Frl/ojlX/4Jb6S4SLjL05Z5nosGUUQAWyIiYnYHrBUpIhlDYz5/teeXLwvhaMaI4JK1f1VqWpBqeQgD3gwW1ugmgiJlnmdrs83PiLjVqQgERNg8z6IhBSn2ibtUCNmev7VMDIvGPD4LMkQzpCR88TY7bLb511//8z//638uz1lVebtbNLEFpWK5oRZAqFVKDUpAQkSCqpwgYA1GaIhLrbyxPu3uGs1tMWsyR5jAVaoKqtR7mX7cf/zx+Hmvj6q1skCitefv8uvG6c7fn7582vxlzzmWr9lMJIDQAKVFs6C7iQQiQFFm5uO1Lk3AB4NCMAtGHLbq6LpAPRQUT+IQcTJGvbCjnUjE9w3eURKs9rWth83kgaNsJycD+CpW5lhe0s+jrNbDQ8f3nujfS6p+gvzU5sK8/qbDTSAb22xEPrankg9y72Tn5lcQL5B8A//L64yo41M5F3p0ft/Ruxag/Fv56gTP+aWv1sn1z43F9wTbw50D/Bdt4SV47xbt2g9fYXRssHt/jP2MIG3y5DjwdOC5yhXv8PPNFcOFHecCadsGOiLhu/Vw2B0JzyvpPfIE4M36fjOe7qYSw+f6S3/fqbc9l8v4nrHwVkoUHeIhEcBmGskUAQnHaC/ZxNtt2O+Enk1mffercIRnOD/th3r5oLzpP082stba3iAdAsb2rzZSrGj0Ta4AkNZTcLd/57SuGvyoM+/Et/e/4rCLLNya5Sex5WOhkwj3bhhOWfM4hR0mrjQiyRkB8nCkso0aAHsOLEKG0pKBjC2Qvnzlsh4G5x8wfJOL/bL/Dxt15TyrrryiYQs3Ox+hbkYB9uJ6Me6uDs/O2MiUKPO8Eiuhz00iA30fQ3VWeBvJ9Hr06OFP21Icnd+4/9e3WM+yk3+Exco6u3sp2fOOv1JmvmfzGLSL8RM4bqLoacLy1EKQxxcD8yNLiIBFhKRSVqFEIjNfAgJRyJ11gt6l3qi1SKXeS52K6J30EGgRuXG6ozx0KqITtVKUaa3NUNQoIhYOb9aaeWMs3pZo5mZtWQRO9LLinqXxSGtPemO08NmXZumpYtZaK6WIKIDWmiNqAJmtMhxURATc08XbQTigIlKK5GdkZKs1mz9VCgGzQJRo9nw+3V1EjaW5h6GilOkhj4/6+OF6L4+fevvwAFikThnU4HiiFqVUCsOVBbW5u6jo3TD9bOVTpqn+/H/Lzz9j+kPvP6NOOn2Uxw8WgbBovT3uWm/ufp8qVanConWaeh2GABlUUGRCdT5o//o1LxAvtQjneZljaakUNWnV4LF4NHfSAxbKO50Ct2VZvj5teYpbUf766xdJqFhrlvUTREjVSRZvYgoJZBGyDG2z5t68GSUk3dqtNYsQhArYAuEN7lbhBD2ah9Hn3BKrIz7bcybc3cKec1va/Pnrr3//+uvfVZS1go3i0Z5GcVYpylK1TKgTtTiKUymTRLlrUaZyUG/SftZHi9YQLdB6cKmRpISGCuOut6nWH9PHj+mjapEgDM2XL/6uIlOdPvj4ivmrPf9afn+25y/lHMsT8+LmjMYwhAsKkAFimYpNsGcCEByYfOoA37D9kwLQaRppA1O+sKGL/fuSab3LIsPtA6mJy52hw1jtSfuDPNOm7uAh9IjxNKBTVO5iwNbzS6FKBrI+ErE4GqpO0O41THYJ54yGKzcc6fzKxQa+j0BmZD8+dfj+d2LhO4FhvFIeiIiVyQYAid3q79jO87u4tEkDo0KSLUYWcAJbYoRnVNUEK/fsyJeDsXjkMlf9RETCmyOA6E4B+ySM/4D0YB7t+tEFp5Oku+GhP9XBTvu6b+2PM9I9sje59zj8bVnJKnlzaNL7xzeTdY4CHxho/voqTByrXBrH613j7ZJA9Px8+5rkAUWJBwLYXYDIQ9DnidRs0+9HWWrcZiNm9/YpxV0wc7x1Onx4oU59L9xf74/SzMtn46jPXRNd5a/0vdmJ7Fz73Chlh1/2+6cS39sn43B/u7bg6RNU37162D35Z7Cnrhg7GW38181wuk5TMEL+juj3V2+/xq4DdIeendkcdBgwmeB3Cv0JqlfXobTKNsZrpeeOgQslvhKUDR6LSIfWUTcAY9AWes9JrE5w/i22MczLlhghVs3vCmcaD89ofNXh9b3fb6JdZcoCrsTGYUKIkIgoLJVSUCaWm5ap1ErRvt9p4e5uCAAKVtGJ8tDpIXpjuanetFbRUoXR/WQry6TlUWoVVSjcxEEYPHIZp5Xe3cSttcXsGdbcFm8LvIFIB+nwrPMljLDlibDwBmvhzX3tbbPrEN5iWRZ3qGqQYM/G7+n6HTQz1fRyoKqoFFGGs6gs7XN+zrXcKDXMnssCwzwvIsWCUitFLCRQyu1DHz9QapQaWlEqIZSi0y0DJxhEUdXSy1mDaLbMnyCgD7n9kNtXud/Lj/9W7n/q/U95fHB6yDSV+wQJEcjk0+MHAIRXskzVEGAvp0XAswgAyXCZ6F6jTFpuWm1SQ6M/ZzcTEfgSrVlY+BxZtMAjrFMTc1vaM5YZrZFGC5tnEYHRsZhIKaWUCVK+LLSUcptqLap00hZvtgRM4EUQ4a3N7iKyuLLebwTgHvAwBJaWlZpFvGl0AWatDh54fv2GtXALW5b59/Pz8zl/WptvtzvQQsLCXIoHQpRSVFVqKfUeOjkLy0MnF9whE0CiFik3McNdhC6ymAeEElm2phcjCEyihVJYJtTiBR7ewkJppuSk00PuM9qnfj5k+tTfH1L/ap//ef4yM4dDAFWI96UW7oCEbYFxr03EctjsByPasP2v1O9KOsbc80ci/5o+vOwEA9/cris7O8LzIj339hmvaOY3NA0X4X4YyMWT5BX8pw5POPmeYh+Z77lUVv91iPc79PZGAXiPt7P39UmqeQn5VQM5RaNtn4aDMeiMigu04xuPr94549bhS2nh5TDxZrJ20cIcl94iQr6d629et91M0eTd+o8hh8fa/iBm/JN1i8jaM28TXY7nYJ3EbUn1jgL2y1F2b4BXlu5RYlm7SiY+rOE4DKM3wjCdPAT0HMZ8zcqyTryRZ+xw1SNHKMc1fZJCTi03RJDsKQXWTXXoagiPTvtlxjD2BMDH+YsVg8ejiejpenbZOno4+uYRtzuZIVZUYRwFMzfPjpNRJTptxdNIx8lbx2UYAhIGVPuuEMeOupzFTX3cuhWR3DjDTL2ns6/u9CUbo6Eq3QwSZiID3YBNEd/odbea93B5BiCwlcr4lpa0o5Ux1GdYUSI7PCOU4wrpnryvqPdGqnp3HNrlnov1fjZAyOoRsxuHPICDS1AMCayyRvk+C9v3zIkkLwgosOfPjo23JelZj1+2KXhBRQbwToPmWhFzLSzSid1px12XoruDmauD3vMsZZ53vcl0K9OH1junjzLd9XaXMkEqREQc8fTZzFJQKxRF3FBu5F2mu8hEldSmlKrMkMoCKYHJAbewliFQW/QtlUYPb2hGX9CatxneaK0rJYieliq8LQ3e2vKkm7Xm1iKc8HDz1mq9FRFVDWaFYDObSZZbyR1qntn8IwIMVyo8w2ZIhC1LBCOM1ub5GXUp00drbhaOElRIIauWj/rAghpSWadyf3ipoQoVVC0skFKnCaJFqyMgSqiEwBvNyBZt9nDROj3+dfvpt9uH3v+F+sH7Y7r/5P2hU5UqHgtZtJAqIpKcRERAeIR75tYLwClBDxF6M7i1gEy3h4rEc/bFM2GauyBzpy5oT9AIz5BoWFYybhEubgVmy9zciqRbULgjRNLahmZQkKApC+mAtzCPZgyUUlBrW3yZZyCmaSr1BnrYYt4c/czdZ2+yZEBFRGwKgLuHtfb12ZZnNDNvz8/fz89fZNxuN9rshsVbLIVSDCQpqi4iRRepLjU4yfQx/fhvNYNTRES0QgSszPB2DZXkCSJSlCThQQ8BacEQDRKhYBgVKnIvwSr1jmlGu0u5y/RVbj/r89F+FQqfJL6ebF90BISEh61e/YLOYRE70duiMTqj2bb+SI0li23HIMpkSrAhk0xvv53eH+jEiQKMTIekX+qEbDx3pxVcxYiENnrVml4VJLv1biMZqV9EZLY9Q5fkNpLaYwC6ZQWxWoFjtXNdhYQR7O1POcq178REkkOSvYNTSpqW8lST2M12yXk7xx8Fr85jEvOHnI8c0HRAZn/LBkx/aJ2skzYSQM/p3tHSu+zZcgFo1irZRu1brACPGApZz1s2MLHabrZD6PVBGd7b800NIH3nwvRSxjipauP3C3J2qdL3gBMfmGGs8zCsrvV8Yj0HyDZ74a0VhpRkvrOgbftoGMjBULsjIhPXvVxmKbvELma8HPs2ZdtPa5xArpm3CxgR0i31sa2ZOErXEZFpG8rLXmLPdtSPEXFcLyOxSEDTTTb2eJ19SKetmA+620vJY0x9NSLiKppwJXWHwb8iYeNNDi7xR0Hn4Ae2CWFjyO8GIdcDlCtgowtQv0niaNGPfYBOeXF4tC7HF3rkQEGOg11TPu1LJ0JIluKIrdbVAP/ecuvkZVnlEw7/4cVxzazEkGtiz8u15XKNzDuyDtC56xQbZnasXqFKEfDEvXh0P9sbHwfUYd58Nl8RoHMPx1j7bc9vdI3XtJ7YZ/A6vxg3/3onazWcIIkIwNKl6B14V3hx1PdIYoiXuD7gmaob205WQJQ6sd7K9Ic+ftTHT50+yv0h013KT9ZJlCoWsfgyL4uZgV4gGq6BKeRGvQsLZJupXuavRbSFSzNQSTdL368kKyTD0WzuWWzC3BZ487YEsoZuJj6XLPwcMLcl2uJu1pqZCXtvZvZ4FGpW8oKIwJC6CrT3sOFHCiNCVTNBobtHLK01MyuCMJufnxEoZQqgRahQSqHePKpMH8XVHSg31lupd5vu0FLrrU53UkJL0QLReq+1VQERcBWwUgo1KMXsCdFye9w+vN5v5fYRWikTStFSdKpaMLdGQFQB1FotIgut5BEyGSm5RNcAA46w1lqzaKUUndQXw5cnX7TWRBzWfHmGLwIHmlvzZh7SFg9vIiJFGNGszZ+/p2lyR5tn80WkhMDDmuPxoeIStrTFAHc3bzPClCFadDJrc2tLRExTuddpCbd1v2SkNczDFqd23G8ueWbezJ7P5etzWZbw9vn56/Pz83avH49bJrkLs2gqUkIy3klD0JyBsri4TGqNWlWqSBGtjDBGCYEwcwHV6RYRyT/FhYEOhhnRYypkFdoJFKmMrKPQlFKDVXmXctNSQN6CZDH5jz/D5tld100QEUEE6fR0hDzsdOkBPzTfpM9OcV5x571B7G3wz2j4maMlufADRR0oylUkGgSDUeY+ArC3GW6OnRzY3OWn13adN2PkatwcX3civKchvBvUN1eO99S5R4yJOi8dvgL1AsY3369AxsD1uDotb9lUE5jtgVHQyudHUOMYk/kSkhOX3EoxvAP7KNoZ/8G8bF9kS3b75txp63n9k7EbFvdmp1HHoOkNz56HMHL2YdSvF8aVrfcOX8s/x3ieYWYta5CsoyYZ8d1xyuuXri7N16kpw4C7tC/UrT6FWQMgfRHI9cVcRfasHINhZnq3IrsBb6h1F8N5ynYlWT/h/bp69uUNyFBvefzpWno9bd7MyBPt8a9mlkKDai92ujtqX8DrpDAiIkQOutOGRltrCAxAdusFVyGY+0bN1Oqj0p+XzNbWdXAdxQEb+aWoppQve35ZAPAwAJnAtz8S2HXEdDxlP+EKs17UaoQcg0oWa3XXyLdEHnCuU0lmUucDJTngrUvXgxCfzVU1VdLtvnuLiCJDDt0LsRh/2vq38F34DicoPUvqvrE7lUxESS880EV/AmnXJyUOahuAlsFtaUXLsYwrJLXF2Il7LyKAXHYRp1g32SPs81PCgJQ4eoI2i7TpeHBNDbIiL5P6x+aWvwKPdcPbahfaXEAJgB49nfBbl7/9HjWxGcKAIKJQK+uPev9ZP/6sHz95+6G3jzJ96O3m5RFSoxIMYpFl0WbSEF6UWCyWWQMVptHpAmtAcllTza01B0j5ai0Gi0Xi2VoIPBPaEa6M7mi0zEqA3vMCeXg0a+G2FOG8LMv8bK113QBQVYt41FpKfS6zuxdRmUprrT1nVabDh4j06iURDJuKRAS8gQxbvDUToLVCaa19fX2hVJHiAUqB1D//9f98Pnn/8cdNym8zlnsDwzE9JhFpbX48frCWyCOGZXk8bt4s82ZKCfAxf4YIbvePMF8Wq4+PH3/+6/b446uZTFUk83q3Qq1V3auqVhYASkI1PHJ35sEUzMIdyFOQJYujtTaLW1sW+pwcp9lMeFh7fn6JL1UMYeYNbj7Pv7+etdZJS0Rrs8ENblUp8NZmhE1FRMTmpwOQsnz+9mkJTGxi3ty9Vr1Nldaa+bIstrQiWqqUUuZ5Zq0ZhxQRbd7XQM083A05HWY2z21ZFgks89fv379///Wr2VxKYcjzcy61mi8ARFW1iYiTaAKaqnrwaTTUYiGczPEgpT5KvWeGMhFRFIKy2JaX2XILRyS1ZE9uW4wiUgSEsETxEHUjyBCJonAFBFOpLMqp1o/l9rDP//n8/Z/nXx6teQCMJAUwz7Rq8KS8vVxJl7RDZY8E7pQ4aZE5M9U7uoUpD2HHGt79kfVMIHO0DyJRF67SrDswF0TshRSxm5oBgL0ezllQ7kHAupuxsvd+9os9w/pGRUUVa9mT7CjWl60UYNVmjv6c8cpQeJLnRrFkbLmWX3Ss9NZ9Fx7IjVNxAyoi07hBRCiSESL5VpGdXqXKplIxcENVifXcNdKCsxtJlWSR81jyjzSwHuclIWkYhh8BhHT0EiG9hE5mhqLE6IrMYRX18XoX4UjxIgBgZ5vgdiwNYMwy1NPkF2ovLZV8o4sWKX1tiye6fZor8rcx9EcinAI9DtbcZT1lEVmPAdfSNhsS1kd65enNEySHmsfY7gFyK9O5XZuD/am3rVjb9iu7NPvGfV9eSMvogMv4xw7voX3OUXpsrnWT9inYwBif2N2ZT68mac3Gn7YGZYzWH0deSsnU7ACQRTtXrQCDXH768mbMr9EwvvEK9OkaRYEDFgavwStU4+sipd6LRrhqPyfPpT2sduz2BMNL2Hi8DtCeHgTWdF0vlI3tc6MXY4dxMTa8BPKK1Y248Ch69qfejPE65A7AUdB/+ez2lmBnUQNa1iq1QzjaOszLXA/fY/hz+NXXnXNeAO+AHNNkjDv8Cn9/vNufDgxyeDb/+K4HfIveHbHHNemrG9WWigddj7KXufxe7qboPoU7bk+L53pZr10IgRJQaGG9oTw4/eD0k7c/5PbB24dPE7QYK2uFShRIFFAFvVRLM7gjAq2Ztadbrzv4NAg0yYuvcpWqLQuGyfJetyQYQQkFDQZrESYIqdqW5ypUOCNaa21evC0NRHiSr8z2U0V1qt0SsVI2dydYirSGUgrX5K27wSL2yAGSZtZaQ69qSnPztijUYGAFZCoPqR+FWh8/rEw6LygFVBYtUlVXISYyIz8pTHnMu6blQHWf6jIVZQinOyClTDeZ6pTEuYgIVUJWV7osP9Rpdtf0jd7lAuQJSQ8RAz1AbzaLN/qiNsOX8AXRwpu1Z5u/aDOVmfHTlnmen5mK1eHuDvOA5cTY0jI1E0NsmZdliQiq2LyUdocbCgGRQsLDvC0LzYtO93u0tli0ZVkUrEXDrfP1rCoRADC3J8zduoDSLHxeorVfX/Pz+fz9+/fz+URWCJxbQIoFJBjwxchQ1VJKqQo0m6MFGoT6iOWrzX9BOKvWRxQRVYA1AuHOgFkLGNyyKFVG5mwsJFlnY1FVEWEwokaEhQWMcEE64bBgKqDAQFeFgKqsU3zZ11Mxu0Wmtk0ZaHAeyMRA22YO+mmjXrkPXnGHU/ujqBSnLxgE5X94ndqvRJynO+8soCMhGscyyMrnli/H9a7NSW4+vTGGHkbJ5GTGwlGR6J1EXBnHxgtOvHv7ckoXsTK9uMYS5OWDK8jY4I3ZZuXvV+/r4SS54wHAMelFVy2SjPxvCQOv5NTt/naNfw45Qvq10di/XX4rYKMT0QjqruBchzDC/PLt38gPoyT2jrN/I4C96/ZVh7quzX+2HxlYi1K/a38iF+Xw+i7WdH1ua7dq2JlZb/caH0f7Dl8xokwCqw8IX6ze9ZdrJ2+CATgceF3Gxozm29XOtD5fFQYC7HUktnFtKzW1r608UO8YKxPtN2UbqQzAXNEyQihHMMYJu+7zK064xgOsGvOZDUR4xHl3AdhKH5NdnNwGmzGRL693U5BVbUjFHkOSK6RLqHnTI4AerdHTkfSM+yRAiTxiFkG6q5FYg+6xlY94kTMHG+LpjPX0wbnW/R1tOZuJa5OYO7cFYxWJ04MI2CZ+H/5GmPNdG05iKL2lK0ndwLtWBuhplIZRcOBzPdtSSrLo6sW2jDbmH/ukIOTFLNtW6HEfQb6rHMnullXgxe5zIsCG0KwODi0oHyx31j/18ac+/tT7H3q/R51QtIGGKGgRak4wfK07E+7W4EvYvCxf9vwdyxLmhFeCjMLVLpLG10whRVIKyYBkJpY0R6UznUWz1tKTULUXuQxvJBFgBNxaa0phrtE1jDqoAhVRi8BaxxGAICjKUmpRAItbeIQ7RRAR3rgVckfJmgYICffmtAhYOJ2lSp2kfuj0kPox3e63jz+jFl+WcruzTqq11lpqjc0RDyHhIkqGKAFlABTSIip//OgChhZ9TlpvKLUAWqUqRUOVReCUDGJmMIN7GJ4nSenUA6BHP7sjQgIZzBq+uM3izWP2aB4N1hgN1rwt0WY21/AIb/OyPH/LY3IGXCIizHtKWKClxE8izNqyzE8zk6KIZXJ3b1LIOk1SIuqyLHQKWWvVQjxpTzcLiMXnV+sneFGlEr3+mpmF9d0c5ovZ/PWc2/L12b6+5s/Pz6W1ogp1SniYLKZTlcDSnhE2TdM0uYcWjefzc2mOctMboYKvbvIHICKlRoiHFWehW7RnwGBu6FQyN2nur02B1FBVFZbWWmdx9E7KEBVwUqHKB6XHzT8wPbT+f1//Q9zpmNEANDKTS62O/oNuvwe7+pEaJw3fJK3Dnr+6qnaRohMBvUrDpy/fiBH7i5hwEFuNgtjvj4bJK3+RoeX4JtlOUDcGfsnYsPH6cchXaHGUnzgKf8zjxIMIISKrYe6FocSJlU1ubK0Hjq3ShScC1hl54VXSwyUGcXPTL46CxjaucwGs/sBmcdos8QPXkqzJs2MQ1xoS3P8bm671bIWbDN1t70m5+q/71GaZK7ucBW0IHBWA7U42+WbWxh54ViB70MsINlbZoyOzR+6dWWQ/yD+076a9dwDgKOiuMtvQssf4AtgTwOw9v/XdHyTtFzrJaN2LAVEyDnlvYQ6Aa1XKvrsRh4OK2KXZsvm4j8IqV5/y7jm0Tt++7C7S7T+nFyvfi220665TAGYHdFy72t6y7p/XSshhk4+QHGd4U/c5HN6NvXUqcVSbxkGRu50jnxlR9A7+bxbWywavxzKSlRfhFoyI60L8Zi64HopdG8dq6D7sSfagrRE/G954ENnXyKr+fN/MJDdrSMI+joKCNen8eaVtfOsAj5BuxNbzeUlsEJ4Y3hW3PWZjDz5ei4yHjz1sCvOIqLF/j8OvL7fM1uEI8LhBTnUANuk/5yPhRSYKh/eANzBghKY6hHSGem2xeLtKV5QyPBgskJuUB+uH3v9VPv7Q+0+53VAnlCkFTg9zmPvSGhhAQ1igMZawGe3Zlk/7+r08P5f505ZGaxOVSB88ZVb4kpLHjyICKRmAiU1ZgqZ65JaJgCwDSGoRMwtrJHWNOJSssr60dCycpokqGaoaxLIsrbV1y/bD6FK6TURVMzY4z0jneU53IJIYbISOAgZcLEhRne71/rPcfhIfLI86/ag/frLe3RbcqhRVKVpKKd0r3RnCrEwFEiIEu1c4NbwW1Z9pTZdSQxYAnlVcqkiFKlVChQK6uFI8DrkiGQhGeBZN82hmZoSzH2GjinaHvBbpz5MZkwogmW/VFzNDpkMNt2WOWGopGXS97Y614GNERPqOujsNVZSx2GKtqYRreZAM88d0S4cuhBDq6WcCtNYAV2QQboZvtMzZ6jA3N7O2+PP5/Pr6ej5nD/16tnmxCLpIc9Lg4mhRQZLz3ASuamYMt1A+P+fmVhykpGqx+Z2StJtBH5SaNdfb/Hv1euyG/y0LbnrnBgnVHl0Cg0XmwGWWWkZQQgKkq7BCHlGAKNSqWiluT1k89Yova6AHw0l9zfp8M9qeSd9ILnb6gKuLwpWVXJ/dCNE/kv7fHDbuMMT+3vcs8QAMVk2G+jbpIQcB+ntgthFtxHl75BTcPHT4AtAgPCPa1l5xxOeV9Z844yvye+IOb2Wea2OSm7x04jsHsAfJ++UEpIh3HP6Bz76btuvrxgF8I799f20v/aYHJpPbZ3Nk6MModrje9nPC+cu5+6/d/69h4G+fGuXed9coSOA8g/v3Mm71fG139RniXzcheHXkSvEOG+IGiM9KSTowpcVxlMA2S0VOwA5fd2KMDc5Uy9Iwe9irXfF+IVrh5dI8nsSd8MLhCGwDleSalN1PRGHc6qtN5VD05Pr27cuBKKAfjKT2cBJMB3h6P2YxwDN0e8BAbAgmTxDFxaoU2X6fzG1y2J01c4SR9uZ9suQExrZQAAQzY6au4faSwr9H4HjMkJaSkM6sRGT1xU+KluN5gc9dyF6X4k7fJbaIoStl7AbRNX7fVyfBDv8rGh2rBUZToeLYYG+22hkCQHjIeoS65fQ8bVvnONH5uefbzBW+gbWf/ffxRg/Q7QOP3iUJeDfG9e/b5z44kughYm84faTVX3KBCDBRHiw/dfpZbn/I9MFyC6lgCSoLBM6AsLmHNUQjGqMhFvHm7bcvv+352+fPWD45zzF/taUBJSe99V1pIiUdNlRVSopJZVMGdFIgD3bWw3QPdxem28+TgakoAG/pSYIAqCoiWVUMERpBaGuLu6lqKhvpdlJKaW1BtwJinmcAtdZNARCRUKbyoFpFCligTimQScpUp0eZHhGPDPxFuZXbxwRDESnqRpGyhaWCCEIKRdd9Q8B77lVVlSoOWIRCioi1kEIR1SrarTdBRiDLzCMinB4Ih1M2Z/K+g3pR6rwlFJFbnYItFouAm6Etbos0s1gQzjBvS1uegpiK3Cf5shmmRqgWsr+vb4Od9XaX5SJShOg+PQYNWzTVm+fzGeYCiCAIlhruFigU9Bzqbq2ZLe55lCFhbZ7neZ6XxfJLa2GO1szMHRIWtjQPVVR4s3AwzJaqYojWmlsTcF6yT3GH85PlOT0avGUM1SSq1KB4ZMzyHmATwyVFO6cSxhol4qS3jYl4unJlSgNlQEWFNypEiliBFlG/NZLhpNHBmQ0iGQuQ2zn3O0EJ6e5/u1PzW8kM6KXEyKTnK3EHSM1cdmDnyys3zDo2Zw71mjhsROKNxPl3cv5++YDeMVfDVt3l1H4UTPPPuOCBg24wQsij9B8xpP8/noScCHUc268Z1YA9vQewul/kmYAOzjYHuWVlzFdUdFFnFU4O7Qf4j9raDnZ+jtXivHO6bHZG0fbIOOOn1/Uvh0nwoYlseDg9si+5N/x0bRnYfdwGaWS1cK1PgRlGN0gv42yGn09IurDXb5zPAY7zIuu4glIuvx5k1BX/268REf2cYQX7tEQzGGedneuZXtqVYtROv91xPK/O4erpNPpfu41mJGJ56pX8vYywxgmnr4yXo+C79zhcL9cQj57fcQxmxaD3v7RYb4L72EnvP/aF+w013IDZjt7GqI5Y8yKfIE/xaHjvOwWAHZZXZukrDodrrKp2aP+9IjHiv19vQgK2MJcBsNd2iIhD4fkTHq6ayfqnjmdYXFVD3+mURMbupXc2d1CvyOkOVBeCEq8av8PPFZlv1moEsU/wGRspj798yYuXnu5EBMCsG9D/OBO+zk5OtD6OmbCPSs75pYfyZYH1LKV/kpt6kGwgFydPODwtm5ejK5CbTHe5/VHuf9SPf5WPH1pvqCVUQwQiKhRh+oO1gCPCBZlJ5svss33+J9qnPX9b+4Q90WY+n2zNXG1PVdHSyUNVp+muZZqmyetUtEappThQwtSBjANO2Lad6+7eLCLgJqAtLc8Iaq3TNKlqAO5eSiml2OKy5ifopw1As9b7cVfVNXNGtNZ2Sro2MDNAit6kaAFNqbVKvVMr9SZyA1X0hkwAqjB6qXVZAipBBQPdb7znHRowDgDUnBdCihCgFpA1ShFlSBEp3D10nRtOzgLEuj48PaEiuuJIZIhsmHigmXszby2auS02f7blibbA5/AZCOEkRZmyvJGk6p75bVxFGTwWMAkwmP47VAnL0A4Rka+vL1WtWqillolTaa15W+bPT8IzgC/C8mgo4zeWZUnD/7Ks6ZjIz6+vr6/la24kRauqzhXVHHAuQTfRYC3LEhZoy6yxuVM/ZVk8Qspsy/Pr6+venKXKdNd6ZwYbOm63W8ZpeM9OZO5B7yE5TtAJQTAPnyLT5vYpMGdASQFRRF1ZhEQJipbMALHo02qzcFswWyzoWZ43KZ9rGMA3F0nwTIVEmCaQwJk14AUZX09NX8kWG1X/J9coNnAwqax0+DWd6XLV+rqNaG+BNyPYL0Wl8b0jZ984yInEjbLvKEDnTb8wqVgNYTv9PBgfR3eG3Vnlyhr4Qojf4RnhHEcx3ow1rPYkRJ3eglVe2fj++NPpe3pdjnh4CeT12kDLlpLlrr89jtjfS9+ePXPGI3j7ZB3cvfY+Txx8mKNDhzitzON1ePDNl+uywXG81zV56OcNmz11eHrqG+58uk6raMfkm6DkngVoRcqwfwQR3gOsVbZguHFzvhv8AcXD5/iU9DSXq8fg5Wzu1P+7aeOQNvRAAvLZ9d8maZ1CmYeO+oYZh4nRR2gnXrsyc0LF9RrBvn6uPewjHRu8XA3aj0Qvsfl9grrIIpdsqgM+06lGtx3e3yWdrGyR+F0gX8fLXR3a/eFPw+TuTycIoezLw5mGvWGfSyYTzsF2qLiKrWPPV66U91OguW7+lSY5EBxyIR835EpQVlel7o2aL1vzVQMH+8eVtKVC7vYimLu/l+dnSWaK+8w+NM5R1zsyY6UPdD95+REPPLpspRCwnzZgf3yfPpyB3E7ncEY0SURQoFXro0w/9f5HffxZ73/U+wO1hJa0LjLMg0QL84hwE3gh6OHL0379p33+p33+m/5E+6J9hs1iT12WcF9MA2smsWattQ7tj2AYhFQNSub/h7pDMsV4eoa4e+Zo3/LcubsFPOBm7r4sC6iifVZJuCPl0cJKsrVmvohWSsBgS2MwLJ7zEys/a/OSK5tUQc+olZjSOoHiEC0i073eHtPtIfUGuYdW6kQpUmopCDSUqhbCsmouBUJPY++4MiEeDkK0RFCUQRiYWem1COCaVX6P8+W92kM61ASpKaT6xtF7KIQy4OFZ3SJCwhgtEebwQNi8fPnyLL6QkdXSPOaMgzBri+902yxWfckdTjLdqDxaNIul2bIEBVIRsSxLc9Raw2Ka6jTdcuFNosLWwC/7S9ySGohCmQQi8sjFYRBSxM2W5q3Z19f81+/n19esWusEFtcWy7LUquYL3Uol3DK3llmrUOnZWgJqQkbzxRZfDFJKfWi5h0wTK8s91Q/35hbmzVt4eIro7kGGkiJZLBIrq1mCHhFmPTxaQQHdtJQiVkOYoX0KFsoN5UPvS/WF8dna17KEOy6hWEmC9owhA1G8MhQZHBcjdrfmtc35NLv/KkHsK+oshB0FkYEAngX9rcFO2QZoR5Y2QpAd7mnqV99twwB/bL++lv7Hn04wvDOQjZJJ54YSJMJeiMvYuEa6ugE5v0BP+jOeJJ9gGGHuxBnBV/kb3l0nztJJ+lBXYUXIwEcOjyc7uFYeWHE78JIBS9nRebX0rCrdMWO/n+84Cb4xXKd+Qgj0cqvXSTz0E8BuHfNTV9sjiZVx3keosWLlJCAB6M5y/1jR3fCQw3j5a0pZRzHzQLHXga3fYThfY+TALs9+c0Uk+Q9f44he45ZEBgFzzc7J4awwCXp4z3W1ZwQ6Sr3jmu7PChgMbtUD0r2MqxyOjRlhkAX3zXlULTAsoBMG+6/pLOmZ8FV60SJJCAxBSuSvhGwZVQ9iYu/XSTBGX2r22K0V8nWe+mSktHoVLnm8DnMzdMFcH4K0JFj0dysQ71fhqo8cqgSkEHxF1FlAfKNKjkPIXJPDXlrl5L3trgh5Lwx3LmXQSZ50FaKrW2kjHpw3ZAX7NLMjnKnwjEcTsSpy7m11cehrUJHszg+er3QKw5CVhrdFlci+VtjtC2PNVwcAQxvzPVwthXJxQsIy32im2BzmfWRp2FdRbMR43xsRyJw+AyJ2Ws5td3Qv/5dpefdJeq1A5um0bMbFFOBzzwBIJ4NgervmurQSei/8IfUPvf+U+0+9/5B7jVKgDLrDGREeYS2auymNCGXQnjb/tl//fv7n//PnL4WJP91mt2drM9w84G4hGk4Eo5lnLKmIl8UorobiwWYRTrq1qiUPkjLzprurcqrVvfnS3AFzZ7qdmLkJi5ktzzkiau0S/zzPHx8fqspAs9l9TZvrYWEpvz6fTxF5PB7b92ESU9yTCKoqWUM1apXbz3L/Q+9/Sv3Z4gYtUYQqUKhq8zSbE0IIndCepDN1qHD0FHfu6yoV0kMUHkR4p1FkeM9Tup4BSSRHjN1rLi8JZJpCRKwndQFI+vS7OwmHGCLCGc4IpQu5uEc0Smjn0NIszOaMpbUw4yzpRGLN3VUQcHisBbWwLPSI5r6YAVFKoVuzRcSUIaFKiMDMLRxIpz253R8wCxi7B6C11mafWzMAU6mqdZGWk/j71/PZ+DUvX1+zFrA7HMGDhXBr7o0ohuVpQCoVpQi1syaBqhrCrImbL5/L519f9R5yE71XqaLFzLz50p6tNV8WRCZZdGWhBFgAUHrwX/R4c0MEzdwMXQCnLYbqpXiowAlP/y971BsoUaWBz7CltSzZYGF7IHBgDWGXGLKmxKCJRsTmkGnEGggOHxw0Nn50WiTbT0zO/crw1MfHvk4HVtZdI5PqZqaQ1UskuVnmzPSAgo40+cT6Ob7iaH7uKB0ov5yY6W4BFiAJsKdkI8lPyY2rvpA0gNEC3T/ZkyLamh7A2Z2pkvZy9WXFxjEBMDiYBU/XqAOMd0d4Rjxs4J1Y6krVew0sEajSuv/rubeE31dsUzYhfosR4np6L+kbmP0cX71l1Tuzm95gKHyZVxsqDl1R8eo6xNRt36/8a72zrv8UbVa6OUIyyl3vWKS8cPkGcnUOK9QRuX7TTMnY4rv7+98pAF2Wukr8cinyve/fdUUdYP5uRR3vErGf5GzsIAUKG4LI+2oMBlGgYhGxVeCLIKmq5kGKFHJIEkpmmrmOrSHAkbn/ADi8kxEEAAVEVkUnCPawN1/2jECHwcaunJHdIyjSJ1aEOuptJHStRUfpcNI9spQlkPJeQLEejCRldCBkTY2fXQ017WJ1SnMgnN0k2dfI6msdERG2zRTJzA0gLCnVdo16mKoVwjxS7iVLSYISyHNiaop2hNmCzUS9znoA7t5zPacc3BECZgZlgEVTpCNJ0eL7HuiZK9adnDADCEcEAhTRbfsMazGpai6sFnvFNM0y54H9dAhAngGyr8Agt0ooHuFlO7WMlaCHAShZ/yvDKNZRk3R47I6MqaySpHsDXZxgJtfPdeeB6GNaJzQAtx4OizWRS4Y3EDTrWgrQq5ElU+3aUE4fO3Fxdx6tX9GpEB0Zv8mMoIhVv900qXzGvd8XVWfGoHUGIytfySDVBLIPFsBqc6VEpJtBpsWUw0kOM3eS+5aSetzziJi9VVFFSU7iiNAiRVvziTqFtNacQNWmMLMP8o74gfLfp4//+/7HH/LxEbU2KZl+hooi7r40b615zOZfLg60z/aFr7/mX//j+Z//+fzrfy2fvypxnyqIr6ctS3NEa02nmy2NgcISFt7CDSLw4ob25BKUgkkLgjRz+/rtiEwcOlV9Ptsymz3niMhqtb50D34KFRoetdSpVpBh/ZzA3ZfnDKBUqbV+/f5s8zxNkwjD/Pn5i1rv9/tfv3/N/7bb7SZSzJZbqarSIgBomSZBBGabb/epPH7g9gfqDz7+Jfd/yfQxYUK5USUKIszMhCwiSwmDUVRrl5aSIzBrjndr4rqEwggRDbipe6m5Pp2qiLCl1zP31nJfwDNZDSQyNUnzAIFaJMzNQpnOKs1sEVKnKeDW4tOfQHOfxReR9vz17/Cv+6RKWPNwLs1JKm9wLM9GUqU8P38tSybYmYpKWIswhqTWS4ZUKahS1MzcFjOjigD+5bePH8vzV7O56AShtUwiXqePPwhflufy/Jqfv92WTF6kRJtnAKBGszAUKdPEz3mx0IBEoDXTANThMocj66uYu6iqBqS1WcW1FCha+BS11klJLIu7c1n8+dWeX7e2oC3WlmgOD1uey/w0e9rydGsMn4povbnFEtRSS32wVLdwt54iNQweNYgkv9GExee5tYaiUIFQin7U8vkEa6VUI+aYm8zR5l8xQ+AaJOk0Bz0kKGRUcYRhT42QMTC1lAiTQGYmdyJ1oV6jbC07uvGS7pkYa3h911Pga5IDroaezS4Um5AN3ay63VKfJyzdmEAgQhAICUMK5ESEBwIWqgQki1BvB/KD/NcJbKZdqlJOouFG7oBNLgchEET0mI08/zKPID18jIJYKTdSlFSRCMtAlqwWAyDCQnY20dxT1BNhHuxsln7JtLsS4ZYcJGPYUlbkK18DpQIQz5tbpMOK6n48uN1O/ptgpbzh3TblrXnrhH+n9H2+Mhm/pESVZiOyR7FLanSBrLMZAa4+9N18Pwj6sZoljkLnYcq6gUwQIbrxSovREyEr0RxMpQepPYYasiQ9jLKOe9UGZXX4dHdEz88G6cJbin9m5r7Xk+3n/931MQsNyToC35Lgi3QtiKm9ekonvSRWbDcDGdLjXbzukXkrd92YMFtrq+7UZ3MbeAwS/zp3W7rCLM3R9fnYQ/vyWe69pb42RIAkbuyoQqQckvO4Td/aPiAs46QeNshRdNhe/P3lGVGZStR+OrS6nqe2Jym5Aq/Ov7a9vSFoux9xiFUHANpW3nkX4nMfSV+2PHgWvc1DPLjTbfpxd8PswjyIbsPIRjI0XiV1Hs7KRhxuCCS5lnXdd62nwskuy4/PXnrz8aUYtOcNb387U9sjGzZi22RHZXTsdhzIyh4crKNMvIG0+oylWXPd8DwsxG1hALs/5XG83tWPix7fK/zlBGWZLwUg0RnYyhd2vOUOciBe6uvDMHe3qMiD3dyTQAhHC9mWgi0CWzwm1/OK5CC2lQJbR5WfluphGuC5sqOITUHqXHDwi8XWaToZwyO9rAa6gOPK2WZt+9IJaHieXmUNtHHNKEWIRopQyB+cPkL/LI8/6scPvT9QblEmVGEV0c7+BSruIuFkQLyZfbXPfy9//Y/2638sv/+y+VcsX7OHLzPIuZlZtPDn0oqLmcFDpYpHmKfH4fO5QLSau3trrYU74UF7LhYu4O12m6b77XabP7++nl9VCygScKQ7UMpIUC25lFMHSK+hzqKi0UpOoJnN86yFd63deYNUqXNblmWptT6mWxpXMidMnouylKwpJgZlZf0h0486/eDthzlQC0RDEGv4e6xWDOqRJgzL6XI5wwEXBpD5Cl/UDj/N+Lg+Vw5imdbKSKFjtXG60KVD49Hm5au2GdHg5jQZWAsgBM2aAAS8tbYsiGA4w5fliQimT1DKSHm+oUJh2YW8cG8efH59ai03kaiOEPMWkABUuqw7u7XmERBmYoAAEE5VllLu02Tm8xKgItg8gl4jIsKbBR1BVVale2TMgIgEaF2MLejGHIEn6xYFGRHL8vX5K/SuTVgKzM0arUWbbZ69fSlhEMQSEYESEZA8JilC8eZhFm4w954GIEi6LwCMpEtXALwwMJUbnY74iPpT70s8F8zm8RVfhiw41QlTElLpNn8C/aCYexzqapXNrxFrXnC50oETRd2p3+H+IF5kQt9kf3us0e7QsrU/SJBMw5uvJ6ZAVnPqLhwprsgWQ/JuPb+g/6tAsALPzqOFOztRskuBby3BY5a5lU/YarpKjtzJd1qDRJhcYZexYOEoY6LwAcjMbTj+NPpx/q1wtfHHdV58VQk2al9ePrhefvzsMSE9KHYzZWPlpDhDkorN3vj91SeEh3Ht94+D2jiOXy3TyXyPQb1bg+5N3IHZPzfItr2A95OOg7x35JhrVqXV4pvOXkFyJKeSK2wQ2DYkrP3rKDIBqYQH17D7l/z6eh2FsXHbjk/J8OXsRHRFRWxuO46S0u2QEnXNaTBMRu+CkP3s73xxdaDe39r30zqjg1LC1Zv5yvPGYIMDgrYKN8cFhONqG0exjfw7evfmTh/1KjvurHp/DYfPHG+Siz2udxX2iH7g0BUJWV1KTlHt6801Y+ZA+7Y+u/36H6tnaSPpnVzCf3f3dLyb2Ewl0X89rYc48ZKey0jYyxy9IBkbt9i32KoAbENYJ7f7qp5VmuHg6BXNPayHrf++DHyg9Geo9hGnjHdaZqeWLzA5KDGxnoXHJVVZItAHAje+xddVEsOvQQwV2fcG0Z/dbmNbHmPe6A0nEaLpIQyzrG2RxYvcSTW3BS7aCfCEOkn9Uz/+wO2/3X78efvjQ+53L5VUCt2ZJhgReogkhGmJo3vMX5+/fv17/ve/2+9fbE8Nt/mZUmGWam7h89yWOWZzmCuXTIQzFe1pFdF9qRt6UF4QzT0gEJojnISSCkhy6RCBJmnvUr6IpBClpQBorXm0oqUolwXeTFVqrUm+zMwgEdGahWqtdTE3s/v9XjRzoxkpqgpKQKqqk0trFl/TtEwPZJp/mabZIGWCiEgR0c2zTlSuu5WDZHa9Od7hxogGqWVstJJhO/1gwYCkDZhC9vOyJZe6apUyzSFtcY0QKeHpRAGQPf+pM5Ojq6oDbQ2VLqWIiNksIiI9LDgiFKKqSx4F9rpqnqmW3D2wBKHStJRui1YppUxVzQzeVEtoBagCkt5MitGpqtASwsXs82vWQkqWFrOqwtVtxgOAimi4h7kYJi0iskhoUJAl09TT+hm83W65Qpbl2X79MrlNrBp3GeheX5DuyliWJTodn40CD1EHKYhQetAjzGYJKEVV3ZbcyDCmAlCjOoKlarBCblp+yG2R+9c8L2itLQBtkyG0JyOlR+rcZGYkzkwftgmmlFiP4pMibHLSwRywrrSksVcedIjqxoXc5VrbNIRx3WZLffP4JosPnxn3rLhcIxMcv0d008xowBo3xXrznEL6esUo6sAjeqD8CAOHUIqOljSrD/2Pcue4765v92tGxFdwbZxrY1cDiegn6kMbbJj5ZrDjNUpHOxirvLP3ObY/jGtlPjv8vjG4k9DlvRLw+e0Atho2u0gjWIWpw7SGnO1Z41O4cOoDRe2Gv/1dKX3IEBqb5/04ir5bVyeJawWVZvtbeJDZBsxk3v1VxTrvF8TY7TCDXWGIiHREHx8cGH2sblQ6Qjju8RHtcRxgGYc6ouz0mQgD9wzrr6jJmYHhpQz4d5rZaYKzH1016ROnlGOe42F4L27mH9ctd4VnfcthUNfRjYMb73C4tj9zf57Wykvgtw6vKsp4jWv0+tT3tKCfkeEwj9cYU/TVy3dhLsc18x21JftJHF+95eUJAMlBeD0M510ChKtm//Lx01vwYpZfS/8nGjN87RLr6V2bah0xSvWvOdY44ycv2f3+EZ4R/+Nx88sFlrJjWi92MoFOrgweRBHRgAA15EPrv+TjT/3x3+rHH/JxD1EnjUSzFiIFqJlSkFmNiyKu5HpIZW62NJtj/qpEWxY4PYVBiMOeS1hbWjN3U1IQCvqtQvjH/Q+qGCLMAt31sJmr3uo01XoDkMl5ANxuN2+WMa8FyBpMSUlac0Un9EnxC7fcx2Fmme/4Vm7u/vXr92xBLQTCWcpUq7f5uSzLvdyBXq9AlRnr7K46TV9Lm9uXP59qUQFkGlOStQTT3i8BSHCcmrMC+dZC+UIHwIUanCWt7uBxbpaP95BrT9swhWWabkSr9ZaEXrWKpFN/yOovm25ppRSBW4St6ZWmaUoL7pZNdTtYZ7eYrv7cw1iyZWst5qeUKlpv01SnKYUwQkuZeA+JGt7cWz7SnSsG5TmHYra4YxHd2IeZS5b17TWkMcMlcCvsnn1BC7qDhIjWWinaItyMvhRvgijsQU4kwqWqogHhPfl6BEXCWshsyICKKFUlQkUXbbHAzDzMfGGkn3WQRCMLBRSqtgUopFfVD70t8uPT56c9G29z2ILWpYYMUATCDNEdd7jOuFO4ZSt1rsanOFKL87q6so9Ile8FU8sfXygDLznaaXG/XNuvmOnf8KwDtG9U6Pes/MqYDvz6JOKfXsrujJpevXH66cpBmKvmohdt33W16IxaDfLE8hXYV3kDIKkYVLu/veQQdnEA7DAFscPDw9vP12mA+cyVtV1J1trmRRGGk8yz6RIkR/eH63Vd0tucjl0dAdj54BUPF+T//6z97bbjOJIlCm4zA0jpeERkZnX1ff93m1lzu/t2V1aGux+JBMz2/ABIgpSOZ9aa4Yo4LlEgCBgM9gX7eAOuXdRrXy7j2T++vvE6+POURwiIyGs4gcfhGfELoWu/jkPC7alGKhM2B32SPXH6GCfejntboKpsMxnmQfZEyLJ5tRwC5fbuPWioIYeN2PAy8h2aO8++QO3t/nzthGeFaQDEWeTdTSwv5t4Bl3bECpFOjDcEPkQuvrDbcUZfDXs7gZH97zEFtp/6GFpPW6bhbTHOCM2t6avcsM/0EnhxDEz7gm65Ao/bItJ9y9svXfEXEekVZ4Uioidht10HfFo/wUsZy22nybjW3EkrIOwOr2+HfWytrzbDuNzyIhaPtOnNqF6/nuLdheQeE4JtlNx7Fmk7h2NNg0aEdVxXbgn7DkrUPQU3SX0/Ku3RgA0yHGMCr9dblKNH83kkGawgVFMyrfAqDihVxHWifED+gvkv8vGHfPvG2+wpO+DNxRnawvuaj1JbewrENCXWxaMKQ1Vyzsg5vJT1WYOs4ZXPUpsktFavLrVW0JNABVmlZm2FuloKpxCoqaqVGkvxZFUtt2pdPWsNIGoQtiNKEVGzlhpIRGpdLSdNWlqNsJwSNMKX5SlKE5a1rO7znEWamdrnlFsOUFW9TfPDY11X++2bKKL2tWZPtMBkkypYpda6Bw6KJgit5S8yVUmiLRpEoarNyNULk3e1oJ0y48yiZN/LTbx7J6Bst7fs3C1gpln6W2XK3l5VJdDWrjk0I8QZYpaY5wRf06R5Ql1I1TyhhqDqVoSuYaaqRjtVEQEwTZOIuHujt61uWm8WERGqiVsWS6oAqtF3U5C1VphanlJSM1HhstRa16bamSZhlFKfy9p6VkjUsq5rrbX66lFEVZQQuGOpCwyqXYRK7uqmJmKpWRKqRyaq98ALJwFOCYCWGmKEUFVzyjmbSYAlwkjCa0vzlVKiM7xukHejiLf1CwKVqgZr51Am7hEMLzRR99IVABVtkUoqWBNBM7uJQeci8U3vi5UaAJ/BqOIQoZICDZK0vZ76hiQJ0quU7W7xIgFszBndaYfH6fqZDHb/4+3rvyRNXq4LXb0IMQOuXh1WL5+vT/Haw2ufp/vd2OtjU/Tgq/06iKZ1ZbhysxCPQhI6uABAOUoOJ0cLsid03kYVwO6GfhX9x/G/Qmk/uR0avAGsiLSzH5GD/b0K0G8vRU/XPJ78yNa5tDFsm7YlI94aNZVgNL3F+fOuBWATT5pgs3tA7MMbBO52lhPNGtnVj20JYhBqICLsdc1HsBBohc1Pfh/sN09+BLuSwE0OuQiZXSwEIOi7dRN1znNjg8eWuvyqAHA4+ZdByRzJ+wFWbprZGzfQMQvQr68jnPrd5jrajXsn8ZySfx/u26uxqPEOD550Fay7GHTubQfWVxbcfYVeSVXrdZTVOGjtl60lQ2/746/zv7z0Otl+/iLjS3eA8moxP81xnMWpz2Ew4+9vKZrIiVxiAODbRy7L/9UIxzEcXwG0tGs8Glyw9jJ4AC3VwzjZbfG7erIDbacFr2pfI6Bbn6OWHzspfwvJV2L3dqgDcN7A4SvI44xX2HbHiOenn85L06nJRiF36vwWpOOAD6v/S5MWg/z6lvb1nLL2/RzZfIJbSMMm2EmzB4tQxUkKJk2/2/SHTH/o7Rumm5s54VRvGSGZp9zovW/ctiVOMkapvi6PsqwgsyWdc8itrmurYre6P55LCaqqB6qjp/ZMoirImqbbdLuh+conU8uWJ9EkXmtZn8vnc13n+Xm73bJNzRwc4anlno+WcqTBRBwBVU1JtZWYhSpMrVZf6jLP8zTlWtd1fbqXnLMIl7Wq1d3P/uPjI6X0+fkjpWRJK0rxWmsVU9UsySiqlgwpRD1ICEXcXW1qCkBL8w9TD6gqhsrrv0DCnYLu6U0x0NKx8Uge36IUt6OPHWHAnkSoSYRmpjaxPlQ1paSRooSq0lSpLYCzPdgcW3cDf+u81lpKsaz7gPfZNaN4e6+q7oEP3Mqw0FSkqUP0tbh7Kd4KMAusp+CEhKOWaLkSWv4fkiLMOalHzjZN2ryLSimq/Y2LKtUnqpmKCboBne5UJTy2uAzJJp+fn3m+T2mekqZsSRG+uAclS5BRGTWB2QwCB9b1qSIMjwRtnlfCENQVZiJpUoimBMBrJd1LJVtmgoAjTBVCkaQJAjNqyhT9Bq7pmzNazqeoiOg6CBGVkUR1p6qNJEjPtDPKrAE2h+ALmbrg24UQyVbR+RWFmsH6vyC7f2EG5pDa+DyAX4k4Fyltb32hpRSOXhxvH2/PDUN9z0T6qdfLSC5ZVo65y+lFA/vABcJ9SHGCz749fcuicxnzRW4eJ4eBXPzT6yu+M65736RD/6fHhxuv64JBSBt7G/HtNFS5yOXXx3HFrni5AwxZffZHvhTqzp9fuedBb88M/TKe/fFhdqcpH52MdJuHPMMBf3r/Y82+jZy+A8KvLnkRGvEC+f2nNLbon4wAtvPjF8883XyB0PUuSPRMM9u23w8jAVC2MvfsOnRbllfD5UUhOMAqiB781MfZUwd01c97/21vyCZWt4Dufg7Q5t/GNGq0wi3xFTcmt2Mqd6gJG8lt+uWWtjV28G4HNK2Tpo/K8R+6IHxy/d/edeisBzGNDf59kDi04K3GLRq6HWkdjrU+5G+e9LVzJECAuDg7fqX4iUDET8fugxAjgi15QjdKSTQ7zPb7RuC3/BL7+uLN7trJUIwizQCDfZYX28OGkhwVhqPSLYadtnfbEGbPmXTeY96yCrzcBy57rC8TsBPNoXnIIQ/1XzouDT76WwdAt3mfL39lBtI1JbSsQDsMdxR6oaEdIAC4JVHe/Apa2iFKNiroUMq3NP0l3f6mtw+mW5hG0MO9sqU6BVEXF3XWdpwBERE1BLyiFngwqoRHrwhHVSU0wFJ9KSxeAa0eztwTgUKgltXSNE+3e5qy5gSRAFkjZYGmNE2+LM+l1BKg4pYAKiwly2qtDFjPxmQt5FVSkg5S25I1AslsTpm1VEZKaUrZo4Q3+6+u69p84kUs5XmaJjOJiCw5TSiPSlLbmQfBkJzvnnKkGdaySaCG56yqRrEWgNC9kFS0n26N+Qe7bLqv1I6rJLfyXgK0hPhoRweBo5r1gRbozu8bXrVTBQGk2+1IBlryLoW0yIl2cNf8UyabJKXlefAJaSdYgpRUVauXAE1Vzdx9rYV0ZzVMI9trmUA1UgRljyIAI8IrSYbXvX2t1RmqVWvL0amSEkkVitg0TRFVes7UKF6hoqJTskpM4R8fd/cq8nMtXsMbBAQK0ZYjy4gENVMRdZrTpCWJk5AaoeYqAWZADapQVpYFzZtGhVSS7hUMaCij2e+jFpLmgZzUJqqSrEKGIZjNRCSZqLRKC0G49JIPDK8OUCCWTAVFxDTBbin/nr6hHbEUaSErJSIsnCQ9FHVL7SOxl5BvcYqNgLBZZDofOQlb0bgMgZ2zD7JCz6e3c6KjgeCFP/ef9MX3RrdXXK/YqaNfarMcbx/ildHJ7CEQN3x0kKD2TKcDtsvmnzNmSj0afH1Uiuh1V4ZLTMC9vuwBDe0ZunRXA5rE0bIGaYOESKCnEeqpUHiysWKLBFAekQMjmxhvvvKvsc1AKM6mrq9nO058nPEoMZN8tUZvQur2xiZCnKsZNA/+Tmj6Q9KL6h2ApGwEbyODbKG92+F/F2C2eV3XTt75a1zY9DaXnRVykBlOov94jaL/CI0vlqZ7xPMUsdBlUADoZ7CHntxO/nbJjmTj792Q3S1z23/AruC9hcDrzf0U5eVqQo5deruGkI9E/F+89nUelYxNBu0GL2wgGTb2r15xYCGATegfs0Tt9icOGtLrDnkd2FfXq27Ut7e+dwV7O+D2XLuxM/EmoqmmNnX0sAi29FOv7x2HeiXEo170anR5N6m3E//qXIB6pRz7NoiWxfwoGdGo2FG5ub+ln7hhkxt60311di1oGPPrnT0yKLiVCLnQxxFE4/3dD56byvcWXJd+XqG0m2SuhPUlde155BtlJFtS2MtS7vAc5bzTeIZk1xvQugA9DnjfXwcfGjfFl/TCTSxIBinSapRqoCUJbsFXSszQm6bf9fa75NmRGKBHqQhCtDlxrOsSlNrplqlq0iQSWlZxNzALHGgFXH2tTinBstal+lJqqR7ha205e0UtIgyA5bRGVHBOWTTV4LouopxomlJOs2iSpTRH8VIKydtkt/lDSHchiYCZppRF6O7oeYRpZsoIujjNbJrSn39+RsT9fr/dp2Whu4fHx8dvj2dxillzuKClnPP8fPyc51nFVJWEwAL0Wqe7Temb2FT0Nk23lGdNU4i1rK7QjdztxpHz0uyI/bp/R+p3sSO+XjtWbGVR3uPnwM/a7ZBwFQYdHgKmlBS5mnkZ8Fbbxpc8pfooImJmZubu7g6Eqrr7WCsGzSYn7bggtQMHQc8Q5Iwkqc2K1QuLVEkpySQqKqIiKSJAByxZnue7WQbCSxV5tgGIMKWUJ9wxB6u7Bx5lpXsQQIQmS+4kgxARM1W1VuSiOYsB4kBASMlpzpNlFTC8rFCzZClNTRIKBDxqWR1VhcJqogFUd49QhG+5iyMYImElNJnZHplnSeCGTqA2UTUY1VUrVaFiIpPoN53EJMwjYsFCurBUB4SgttI829o4AIULBLpTYGs1k9ikgbiyiZ0Oj6g4ENgvZaNfo9+FPb2l1UCIcqtmcTT7NXce2fouKr026I7ruy/U1zT/uM51ADDsI9H3AtaFHejGz3bPkeO9cshir9AcJaWdTV8kjQskv2Dx/wXz/1cXyXOs2nHwuKXw/uW1hbe2HPrj1C6fXyfyyh8v98evo/Bz6U23evBX8WnUf784ex8BuA9jz0bzVtDaiXZ1XjrZn/ovLctXW+DLMV99xX/VoQwXBoiJSBJDz85pm2GSx89sEp6gqXoERQwihxbIw2cLQMDj7MRWWaX3LTsz5pHAntzssZTmzInNs/7we05JW6KDbtXfEiFDjiO5QbTq58ujSLTDZT9i2waJprFtiwfs6eAhQLqYE0Sk2XQ7GW1iHA6LfvHauV0P1GqGi6YKtpw/IWoAAwy6xFUCOJGk4e3thsr1qAvnbTNeAFr5oY7NJMlmSrKWh34QQ4NEHJ7o7ZVtmX0rcxvXg42+oG05VHQLA4hdwxHdbT+vOnT73L1h2+rtdxp1NtGuMhHtRLv1MDCwfeM1xvY+vZfshoXNkrRhy24e6Fi0CXnthLfKptE3jNShZPp4jScSqhqX9/K0XXmcSnUUbS7OIhK9uMaWKUJllyFIAnHs/LZEvWhoV5ziIENni11DMCqDagJteUhbWzNIEmkVT76l+Xe9/Wb332T+JrOSLM+WHC2ZtVYBVmcIn0t5LE+T9O3bN5sUUcQrfDX6nCyy+VMKoGZqc/Xlx+e6FCdsrWVZSvWme2hKiPAakuZcavzjz58UvX1IzhOhy1ornskmikZEskmSQEzEck6a0lLWj9udyoQopay11PApWUopWSbpdV3XNQnm2yThz+dTwqdp8lLX5yKmliaIB71Un+e5ONe13myKiGVdVXWapr//+Y+P+Xa/fXy2smJTXp/+eNa//fffPj5+/1klz3ebZgpKuLHVx01snu6wlkoztaLF0RNXH0nPTrg0eP93nBn94pSHGLQjGvdonVbwbltz6V53REQoMKWEiFpr1GqKNKXy+efN5PvyWNfnfcqPxSPC3RXMU1ZFWRdVnSyrNXQ19xJRRWAm7oiIeZ6b1Z9ARARrrSqbS0PfBc0oJggPM1vKGl6bo4+IEERK0hNANWZkHqsHnXAi5WytAsMcbU2BUPBjnkRkXern8+ke1VGJrLIUN4su0zMCDK8GilhLqa8mWXM7tpnnWQTL4yke8916mmpJaboHdc+FGBGlrizLfZrBUBCklzVqy/ApS3WomFmVZGZmSc20ZciFmTWGFREhQa9VU/UiACRCKQmTTAlQJgLQD5nX/Gf9/lmeIkjJamqVFANoeZnILYJoO1pk9FMj3cnL61VrHUWcnYGy861BQt1sGmYmaBE7yDlLy5rlBYAdeQV4Ops91TJvhKidb7tHO7oHqENS+dgoZMdzPRRa7gbEfVJD1XMwGBE6VAo6y0ZXEb99k5TIPdM9u8yzGbyaTjsS/MNWMpg1AZChqtvZPEmGUFV7/MxYbZ2CzVAV0j0SCCobZw8MEQsnwQ0Yz2EGieW4c8zunbYgIvEGMsBgOBtlxJF5jcx0BAh7/v7NCW0PGRysUezZ2E66U38Fe5HPtoQmPTW2qkTQG2gaitMR0bLYjaWQ9hFtkks7MO/TYs9fu3PxDZbjYLYjNaCf1cgJerv1RnYsbl/JHnHU8bUbDVvsWW3NBtnskHlGOCgUaB6qwnagBwEpwYiAnE66jl3Z/Cx27OlLwna6284BNndlIVqFKTlLiEnwkkT2hGyvq7VZCC7YI3taQ3l17v/narTs99vB7SlV7ptH9put+1eUHYB+oPsFj7/q8NKDnCvGcaAUA6ROdq9GSNEO6rv5TzaHjf0+2l89ZwPAZQm+tgt+tVH3ZiNSjoNv/b+1Eb4Ktq/IgDNUh5HuLQcGIIessg31tf8GH27e/zGyjE4l3gjcfP/hzXhPYxaRnYxysHyMs+AXDnPbOL+8pKvBBxTes98vnuU7s9Pbwbw2++rmOH5IUAWUlmA8gtpyU6okaLgYdTb9zebf9XaXKVMZ3jLe9CMskSBXr4uHR7h7Uptznk3FSy2f6s+6/FifP2pZ6M1ZPDlkWX96aEBK5VK8ugQlhE18hIoldcpzWf/x82nGypiez4/7b9P9Y77fIdYq0YKakuac53nOKQ1ZX1xUUppU1cOaCOvultNGlwmIl8qotdasW6hSJ6Ia4e5MJmLZFEKmlLRnRYUlplQlZaqJKtQoJqZBWT2iQm3S6aaWKaZma/XZwlqloaOuHHzziXq7jiN1esXwt/hwXv2IVoNxkxyO3tprIwAyAlEjKmtBeWqUYBHUbIxa6/pc16eZTUlNWesaEdM83fMt6CIcjW0tB2iDPwAl3HuN4bY0LauJu9daWz6xljm0Vcfw2sSdIUnorR84tD5rjXCPgFmupdS1tJADd2dUEWmpWlt5B1UV8wgwsFZq1DVVTQnQFgFMD81pHx4o0bySwPX5bD5OSVWiahSNpOFT0hoibhR1aY6sCLFaqyCkpTTdF0tFsyEMjJAgmwMSQzXbBGzaUaArAACW1RJI0WjJt0WZJhOxGQkqMlmaav5ZP9coa4o/109qtCzLEABb4MmAN3shExV8edr79TVi5j61fcUvv/b2gyHpF71dbo6fL7LmhV+/40LXZ5vQGS+VZX/xIFpByUEswqB4jxttlAcA7HUA9r+bQerUftzCG7s8zeS0zbf6vthV9wHyus3xF2ThF/P9p9cO87Gft9z/9cFhZl2BHMezz2XseXvgjbPWCNjz8EZH55cxvDD+bQm+HPZ5JJeBvVlBnAGyjfOkOGFfry3L4n6xK371Cp93oxWRPS/IV+O/rFeXPeLk+CebxN5suONCtL9p7HEjG13vF5G9Utj+l5ejLum705tP5/kAkYddQTBOZhNAdVy2JpptFoixH9mK2J3btiu2+TRhd7OtqkTETgtBoqmqunlBXTSBzfdx/zu+rLXnpgbuF/XAkg6xpoD12mGdLMnh7n7eXVQeeLZLqO8TPJFU4FIWd1MxW7M299iEaZIUTQBaaZP+2OC0s8dQH0B42f9tjpt+d+yQjaj5VqoKOqJKF3swzKU92I8IZBOmBwRrPKb1tuGxyBBu0f65eASe98gp38UuhMt2cyRPbxKGspuDuHupDm3aGl1ZV8Pk7gWIQ6FtV4z7XE6BVp1pglsn0U5RT3M7yFO3PO1z3o4Cxva8/D2zz310zf203dlcFIgUmCh/5Nu/Tb/9Jf1+9wynCqluqXn5GAMl6lpKDbaq7/OUfrvlySTWilhZPn35XJ4/va5RStSohWuJx+JOJaw4l7WWCKqKQyzVurCImWjSEqxBTfn7jyc/l497/PXf0h/pw3IiPVrii2Sas+acUstWGWzRnwYzk2QpEBHuhwyhZqSxuruDYRAEEYxu+1OnOMWJShhgZgoRy2JZREwogFom1Ns6UCGqSXW6l0AtTClbmpwqlJTzUkoNJrq24z7GVscztjNG3ciJcDtqH1lkX0G+FncJEoLDosZjfQdj0Xa/h102us8AHRGgM1b6yvI0L3X9LOtD4FGXsj7AUIOZMOL5fIbX2+1mZmVZHRQlKe4hQEopSYoIf34S2H2jdyQ31YhoEUQMtZQsJzNbS00mqh4RsVSvpQUHpLlqpD3nt6qqzqKMiPVzeazLUtam26nJZBMFS3nUWs3sdrsFLbBCYlmggLcaVIzV6SCr5zxHhGwnMO6sYEhEXeecUkpmJdaFJIKWZi8rbDaznLPQgxWhDNnK97UF8Y5tKkkyUV1EYFCrFimFmZllERFa8yxnM9SDEiER6hGAoIauSknZzLKqzJY+OH/z+4/18+nLUwuLFCk13NnL5lErIQBj40QqHCK63hsiRHv8QEOUgS7xhaS0JX1vY1JphUVO0l5DUgyk52ivJ6IKbFF8m+V1eEWQjGtig87rod3lf+AjBK68ad8UI+HdQBDYypWiiS7t7GIUyk/zouzJl5rY0y3UnbgDqAwRsc5V2zKfCoSR5FDFef9AslNiDjAcNBN58WW4zOtfvhpjfS1bFiK7QvKmVsnwUu8DHa4BqiepdP+17Zcz/uw/+ekR3U+Btlg1GWZ6kijeiStXmJykhQFb7F3ji6Fw62IIgDzWa7iztT90NpVEdm1oSylxSB3kIUg0O4B1F/dhn2qTWq+FvS7XZcDjULcJvmmMLo/hV5WAX/dM4PDxel3jt518hSh9EC/3HbThkOHyltd3jSMZP7QC6dwihlsIgQyS+N5y7G0QRq+d7zCR87teJ3756XUvnWnQm7qeb2eNjssHydpB9DqG/qvK6evX19u9hEEj2mnrVYSV97tIBxhKB0LXWI77Mn7oYi65FZUDRMby7O/HPy7W6819RHsdg0s/e/YD+cLZ7nKNiztup7NieB3V+HWnIK+vEzll2fpF48t6/YIOnkfSgva2E08RRISYUVh91ukPu/17/vi39PvvOmsBawVoZmoGMZJrreu6rmsNAehT0nu2u0H86fUZ9TPKD/cHavF1qWV5PB6fn891iXX1cHXaWuJZShteQFZfl1IS9C5zytM03+fbt9ttUqEzIOm5FEvPiT0Bf9qs/q1AWErJVMzMGUB0l3QQiCZSt+T0IAxSSa9uzYbdYlFJUpwtl5sCyhCxpJaokqasqbFlUSClCYAHCIUq1ZLOt9/+WmWmiFii5OqEME/SxORjhzZ+JgEEtrCoce0ueHK5vkKnX1zbycYgvvUaj66gMMBALb7+pC+PP//388d/Zv/09VPC55xMgegZOcGIiGdZfz4eEWF2Yg3ts6ruMQDNvt5XanNGMjNNk6rujqDSA6m7jUZVTSVJi4802c4KmqPU8/kUMQZI6dXWVEVkrX0dxTTlLGuwe/YDgJMRcC+1SrKqREQ4vC1BRLijkiohxojwKLUAUKyr50oklw+bOaU8JVVaCaMnqkuFaKgkoEbzUKHDURaHimoKOMWUrI0elpJSsp400FpqVUYIIW1RQqK6LAUUiWSqc0rJUtY8cZosrbIu8HzLTy6P+nzU5xKrS3UmGgNhgDdXk2HddUgj+E+x64pC27V/3Zd7/8l2F4tzh8EYG499vr6Xo33qhe2+PggcWXQu3H8n469SwdtZ8zT9L7nwyK32mzoSZMhhfBWRzR9FDm3kamnexyDbBQBbmPgFRL+4fs3ZXxtfGAReYPhPBzAu0BXUe9TTO0b2cgW+GPxlUsdQN/nnbftXzHkrGo1/X/Hn9ZGL/9K5nyG72mD9Cx/F19MOwhU+/5Ls93a+rxN8jQO8OHfhjHWtEvAWNNZjuu14QEiJ6NxEm/oVVzMlAGwWrINkHFOVrWcRoufz6RLAntCscZGeG/vdbP/ZRvhKgLtA6t0CnDp56fPl12Y7jdjS+nBXbUWkZb34F1+HA+1Ou/GYyBiBAGLLW4wzosSYYEf2owTd+xqnthuKBpe2Y3aXdeEZXbo+3ka8D0xFmo+yANJZUBv3FkDUfHtGZsA2B+ya8RsCsRN0P5pd1gIxwLZNag9CAEZ/vi04BMDOyESkHY1d/NYulPFCMXdac2DvPuIBbv1q4s7LWefOIUBColE1yhvkR88Q3/mJSPcK1HOHr6N96aiNmWAAYqJky4MYATHKh87//fbH/zX98Re9zVVREZUisARRjeC61MeyLmut4S0t5sc0fWRNfNbnj/LzR1l+CFevD8YaXp7P58+fj8+fz1JiWUDGWmIpLKsHXFUpWJayepU0U4ViogYxIv3lr3+zlAhfa6w1pFRAAsw5k2x+Jr2kRTKITLc5onqtET3ZYkNYukTQtv3VCjOZ2RZb0kFFqGiyJGnKOWdLmWI5z+iGmRAVtdTtK5rVsums6ZbyjXqXdEvT3XJ20SAtsHsPd5TbFg9oRv2hFEBDuW0sHaO4oXMnjCci1vb0jvn9LGkQUNgtm2Tzkya5WTcjgl4iSpS1rp/l87v64/n53cunxhLrQ9STqhC1FK81ZVNkoBc6EBGoKCSlo2LRW2Hicu0aQqsl0h5nuBBhApiKtMDiEBejmSWbRKQSq3uJtiC3AJMhJa3L+vn5bCUBtgG04mK+riDhRA1/rqtHAXCf8pSTe0E0GV1FBO41YMpsGhFSUYJRCbHI1SUl/ZZhJqqI3aIEs6jdvX1ned0XqAVDK8QSBQhKMCRqrapJk4qpNRrL6lzdnYIEJUUCEWFBcReYTClngar6lKmVtyL+LU+PWD/5+Bk/f2B58PmIdY0iJgGXXpNDhoVpNOGgxxcxVET2U9NGbtpyfSWC/1PB+l+/Rmsl4w3v/opvNkHzVZ7ulwrpTaXozHWQH0SkW8G3MYgcZHdfzV2eaa2Ai6R6zQ60A6fDU+RIsjzoJPv+bV7+b0SFd4KmqvJshD6YyLAoF5n7FW5o7KihGoDYTle29ptK0yQcAICN+zpw3e/N3eCQ+obooxew7D2fqZkiXE5C1DD5YUb92HuQGU4fDofks/zZ7mDseXzFFeu6606vtIWtC3nnctOE/hHgsl2XdLc73HYBfaDkrVohQSXrZWXR621fzwHG123iXJO8vnI6vkq2bQDpAoX9h6tks+2mViVKXjbn7hiKAek5eJu8Cuj710PE3OXEl3nuW/QysNEhdQScbKl8d0C/Qa9XIL3M+hJG3Cj9DiUcmLdP5IQHb98yjoT0PcpzHyfPsubbEX61+U84sW3ZkT3/mmy/kqRf3OfgeXclx2/wp31ojcf7b1z7thf9Spvft98vhI/XJSCJd1V+3zU7Pl+W4/IikVe6/U+ut7zt7R3ZPcj3Ff9nA/51h8GwEJqglyBx0fRtuv3t9tu/33//W/7tXhOLRyUpZtYODUqpj2VdlwrRnNM0pXvW+6wTaiyf5fM/l+//uTy+Q9zh7l5KfT6fz+dzWapXIaUWrLWZzw3RjLky32+UleTPx2fzI7c8q+Zl9fs0zfM9uQNIKUGFmwxqpjue94h/KOntINu0FcgMsgsZ2o4OSLpH7Q4kDSA1KICoiKWsllO2lGAKiJNwL6VERDYhAxHQpClBEyGCXGrYx5zv3/LtQ/Osmis0ItLUK4v1E0hIS94SQ34JnEnB2w+jGvBOSR6W+NDwtwzlG9kjgu7KYNSoK7zQS1mf6/NRl08rn/RHTkg1Hl5VAK/u67o+JZhSEoq7N6E/IGron1sOp4g96r2FXsRWpVJVk+aIgBi2BAwUNHcdd/cKks2cD5L0UleotfjtnHJE1GVdlsXdVdNt/jBrTN/X9ceff/5ZQ0opElTVabKP3zSo8lw+H9UdpVSSXl0EUxLSSilUE0vazFlBNW3n75TofvjBaHUP8xN1tepR1wC8VHcakSxHIkSx5UbrqMhKrwq2E6MmA5IUahOpGYKeGS9LiISzp1hwA6CQQFRXwLFYhNRJBUbcJIUkl5irzrC7pI883fj5vSapnySLRzSXHhFoS1ErewbhV3I30p+NuHXOjjNPkUF+3R//dXryX/Cvr9oPWHwaZ5y57TiqHez7nc0b82Qn4nBw8TqGdzzlDZM95tXPr/Zh919140RNBnjLPsZXX0xOe1d2MpO94V9XFky+Bemvr1d8eEGG7capf+5v3MZ/wqJRdHmdGs541T4kkBfh4b86me3to+z3+uvlw9tmAEROsctfQXtHv4hxp7xPQDJeX4ECQ8+vjd/Od/zbHiaPk7S9ny3LSFz6b1+T91zRlOPqwQfDnav2tp0YCEkJ3yf/HqsOXUeArb7aWeO/fB6xKppJm9dmb58dse2y7eXMevchveXBB+1TkD1WcnNGlx2sct4ADSV6/qSxdvL71cXmnh7kdbE5ZLw5ze68Qf7FzR/7U/Jmh4WMEz/ANb6im1Be2EmDsYwnN135Hb3wj362TTKi6auU36Cne4DHSwOQvkv/XwHhLdvYoNBvjllNzwyvTQXjK17fdbC6F8TsUP16fUSE8A2uv9BOD16rLwtI8gVKskG14d6JWEQTVKgSpIaIaEpZ89++/e1v+Y+/Tb9942RVakGEiJqqRfi6lOdzfTwroGnO0zTdbumWkbgun9/L9/8oj//k87s/v6/0FhS5rrUua11qLUFaBNa1rkslW6xeW2X59nHXnJrUuNaylPpcC6DF//7t+fz9999v3+ZpmprBuHmDNM+Q3RcIREQsSwFChS1XmJq28wFRrbWWiJy7V4nQWkqcTsoiQFeNnG4w1Zacd9PoKFqDXgq9ea9YMkv5FiIQg+rq8S3llCeKurvYDSItD0xE0AMWZgnSI0tG/9p/ZfPuLdsz2iu89kXnqToppR23EiQDlM1vm+0gghFevBZ4pddSlnV9ZnGwmPI+5frjZ3hJYNCXZQlGVhMRrx4RU5pzngK1kSYzU49SirRsJynJlgqiHzoTVHWEquZpUtUaUWvVlMySDMcjycxUS1lKcSEkUat6SoLqneZpSm07ARJ1XZ7P57qu+7vMTNTu+Xb/PX3cv/3589P/n//zXGoEavVwqKK4p1oLFUZNZUvQEgmJSdiCBEDriSrF68rliXW1eSXzZe+b2b7rmrU4oorHWmsALiZcAwaTyKIwcQc1rALIliypppSYaq1BtEMMFUCpTpJl9ancbOrbmCIqJgKlmJgJ1KAmmgwqGvJAWWkrCxiN9Bg1yNhqWQ6U5J8kdtxkCe4eybJvh1F8obZFvvDZUyWKs7gjO1PktY0oMThqjj+NIldjLGw+7GeTH7nF6W1jubCqPriLaG69NAo2Wt3ab9mrDvfUq8R2nt0mL1GkVZje6iEMAt5JGrFdMzzJITzX9zhe+mqx6s+OdRL++cVBN2vnANzygVyIkgzK1WmE/Xp5b6/MdDWYvg7gdTwNI6MlZgB3/rultX9zXZjyV2LAmbNf8XlvAAAvtRpegXaREi89XzfC++s4ZzthlLT4wqui+PpU/z4md4EfGYG+UCC7PDPMurVJL/KrNEZHP01776iy2Tx69cF9JmOS/hF19jBIETst2FvgtAIa9JYukwTpvXTCF6J/vIjFHYHiKu436kOOCHFCnYFK6jbG2DS8oZPx70YW9zsNeioKFWHPaTXuuvNcQvRqMOgi9Rfz3TNyjh2+Iui2SymbL/JARq/hRK/v+gUen6kVAOiQ942IrstKowhXhN5LwG1C6osOsIX8CiHaU2VcBtY28CtVQudI29+xXwlwl72OA+7XdL9nanLSXa884AQl2ZW9f4EKnPnWANvXlpcOt3XswBgZDABqJ6YnfNt3JSAGJ9UZAiMMaZb5N/34b7e//M1+v+vdXHumkiblRK1reXw+f34+1iI2zYZZzaakgrV8/sfn3//n8uM/UB4sK2ONUp2s4WVlLWXPkVKrP9blsTyL1wqpAbJtDpmne3eYqcxpqgXf1+fHNxSPGvyr/GGaVaOJ/vN8M2vxAN3jXOgkosaWgUZI9mpQhJrQy1JruG5HgqampRSIOJ2UCKYkImopqwrMFCYKa5VcTelKUtVSSmm65ekekBrKlCNMLFOtrCtpsxXL8442jkhoepR6O/N4wzxOTGVgz41m959GIrwT2JNY1jFKKS2+FDv6y/6uZq/xCl/FC+qSc/KiZjaZFLp7yYmsdPeUbcqTR20htmaSUi7eg79VdTdbtMXAls3WayvGpKQsy3O+3e4p5Zy9dI8XINdaq5eWLC+nth81opArmNpZiyWHJYbknFNK1ddCCqx4fS6lEvPHnY8CyYu4is3zrGkCsFS/3+8RP0sJblUZI1iqZ7iJtoxDIIHwbBQEmsrEEBfJgcqKWJ/l8X2a7/i4myVOs6+reyhbmDkZrdJPp/yxpZ8SVCoJZzABEIkVtPC6iphMU8o3mmpk9jRH7koxANU0STAcEZgCbCxws1OYCcIygqYyTWqSoHedf+D58OUZj5WV0qbiQiWERvTMBoPDD3Z3atMtk4Sz+TW+F6QGnt4v7Zh15j4vEt6ZnCkkBAYJhuyfu/gl7x88kH93Uhk4OMnKarCII+xtHPbrdLYtE6TshRERhzJDckviJ6OcsHlUcx9sb+Cxy0WAku5Qe2tvA9DTPh4OPweFP6eh5HbCaZs7w8gO3k7tn15sBs3DpfZEdgY5IUSw54omR7JD95dakyGAiJ76wQvt6mvd2PFmmdzwZ1uTrU9lzxbSZE0CCnlb5moUcvgC1asceP4sLyrEvuj7taWSuyhL0nXz8xw55FjcBt5G2N3GN4L9In+e0ob+YnGPVGwkucVntnTDF5i8gmKUeRLENjldGFAVsJ2lMXpIAKJ7OwuArOZREK02uAYCuocwD6+UXvJpEKOai5K0GIMO0FaDdE+JrSJghIdX6em2YoPRi1q2+UUDkNEjkBvA9ywHfYKtdJ31eQ0Bsr04bi+d2DwpKaKAZI574/ApEgG5JW1XgSAYEdHy6wcjCCWgapsye4x8mIVuzr+4/i5jNYMmtqKB5LSyu8KA80001HQ2dUZl2/Dt7yaG8/Jype6I6MOLelCXaYOk9KA9JX1XgwBpuK8qREu9vdHuptLIEa4gqg3sEmFdAqBKL3TawhAQ0UpND0jcaDRaPv5dvhQRa/WhW30Idr+LtkPZXWF7uQayPdo8etMO4XGT1O663RJZ6g7XLTVvW9KG4XtZ3xMFMYgIqkYzlnA4ZMN2tK1qPCvPGyMcLAQCotdl5M6fNr2a3XDQKxJC2n5Cy17ZEnQ0Ym9ibly5MIVIQoW63WD/ffr93+d/+2/4/a/6+8T8fDyi+DSlpBrVl+Vz+Xx8fv/+eJSClBUZv4UJNcrj7/X7//34+//7+f3vSdSpPx9PBc3MiGVd1uezroUuFbHUUmMNlBLVGS5KVRNdK7JC1e63e/7j3gznEVEDSTN0qqG1RkrJNHU/kQ2pbE+kpAGhqhHe9qBC3Z0IRLSEP2V1M6gJIaVUkeTuavlj+qi1rmsh5GZ6v/8mIq30WfWHmd1z+pjysizF63S/pekjYJDklR/f/ro+GBG1ViClXl9KTE0aOpsSWiHCEBE1O+mkY06n7YRg5w3bfuzBPyBbHPZuMGho3NAa7KZDMW3bKPawkQCCSrlP8+fzqcGk/J//9/+8T3qf7Oeff95S+vj47fnz7+u6zrfMsrqXaU73KUfE8lydPuUJiho1malkd69rEZGWHUhEmuhfY60B1ZSzmWWy+QPhsT5KFJKijKjP5+c838ML6SIS7MdSzjCoblkAWrBEmiYVk2RaNByrrNCUb7cQlFKQwKgpJUvTNKU0TwF+Pp85IWcrJSJaj0JMqmmt3mJ8A8zJcjZRrRGatNY1C7JK8bXVNACXiQvXH+s6af6r3O7QXB9LrMuk2Qi0qmbhlKBaSJ1uv8EroEqUKL4+WRaJOy2pZWgWS4sETHPONt/uKZdSHo/Hc12hkacbIbFWM3usSwlvBey8kTjLUVKtUVnMZF4tJdyTrXZb9P7J5aH3J9YiXlAKygpXSKUHWip6hlBMRBDVTbtJDA6J6FlDTStbtvujeHQT+VR181cOktrIKUb/1YP3yKYMtPxIJ0/aHhQoWyny4W/vh3s/G+NoWz02lkQwVLVTYNlSt6nsVQgGuapzvf3Qr+cOhkcEFIdhVdGCFdHBBYKg72KZqNhX5yci0aOr0KdG9W7g6xyzG7yiC5Tc3Dv3KW9j3tLWtQ0tg6PtodH3Ocr4eRNUIk5ZvsdXmB1y1XbTsQXuqwgEzgj2dC/WeUiDOaSpYNLH0HMicRdqY88Deay4tDzSu5WQHQN2yWerVtdXB4Cg1hab18kdBCbNpuganWNusS4KkdFVbOTjh2y9wW3j0QezbqrLLqZfbILbRPY+G4RbY4daKz6PIfNWK2wJkcGrrtca8A526YMBISGqrNcTFencrsk80dhekP20SkAEtAmhHWGEoircqki0FPPO7QxQ9uwq2vfbmAXohD1d/rriFtBdU3pNK4nRBE6+2D6FAoGEUC8lo3fRdv/c5q49+VPg0JwCkD1f/uWSJgjycH5q77hUsNtHOFZaHUe7jSG2GCp5STf57u2XAwH0Et/RrOxtyVt60C8Mw28Ktm8uRhddsAEmfWGt32O9x59CAvwXKvmdr10eHV2D9uoG++UgW3HL4dFhDMfnDf8aXl4OeX0jZ7HFCnOrXdT8b07zGnfmvrfHmy30GU21kU2D3E34fXZfHtiNOHwQiENN5/vM/ptCPj5IUjZ2ctpBm1Ue13VHU0z2bbWDsf0oh4mi4cyY4E/7yVWvU4OIqj2HZDf1uTgpahoQhU2S7nr7q/3+b/bHv6Xf/6ofedWyLlEipZQseanP5+eP79+fPz8/f/5cC236lnOeppQTjPXnj/98/p//Ub7/h/qqltdVnp8PCZ9yEs1Rne611lJYKLW6e6m+Fq/F2VSxUGj1+TYlm0AFdJpuqtqS+UxTT/QpYq34bM45T7ZvjR6e2zWjI1fDXqYHgIlKSpvWx3CQAjHR1FIai8jHx28f35ogxLWUptmqWleihKrCOXFFUJoPEzWrSWgT9aXpcslMIYiovqrcotWcUutBBtpU8TfrPl4XnBxRHTsRG55vjGF/li0906E1tNg5hnsphdXhEV40XMCoRVVb9qQWHq0tdTIjqbAFW7c4e2+G7ViXtdHtbrIZDMOllHWtIjbfcs7Z3de1wpoHqm9yJC1NKaUm+o/Fgy1PdzV6VU3t7I9o5wVq2s1Jmmy+3cSgqdWjVEbSVFWSWHJiLWVdnx6l+YlNU9PzJYLhrAYtoaiW1RiAkV4KGBCaStAUYjCVXlInUJ9cP2P9VudVbU55JpJq8vVhGsrkdY0W0KLQlMPRqJcy4AEPoMRqmjrdCSHCal1h2ooem6YpzwyUaNHtEoJSXETci5kJPSIUUM0qs7dDVqUWUaVNOt/y3dJd01Om1cpqsWBdYl28FmEVFtRKr/SIlm8g2OlhO0MUQkVMNseyHXPeUkhs1spfYPKZJsuOJ7Jbst78PZ49xKABt7ekm9eLEiDYZJazC8RGtA/7y/GrYE9S9drnJpkcjqbt/iXN4jHmYzS6/yV0L0V7kY5O+3q4KdBL40ubE3CUR6DP9lPfZZv8s7+ot9k8IJqecul2h9JBMLc6CQ0qVwm7P7sbRnUTT8eT+fEOh0EdGasu05TjKKZPr1eolSYCj/Svax4XRL0IDKMCsDcZGpxwdR/tuZNr/10qkFf5agig38RNdr0O5AHPrRn54hFzkSVep7a7YKnq7tUSoGxZpHZsH0vHjtBu4v21ENjrdQEl8KuRDaLScPM6qzZ0Q1MYh6W7rGwM+53vBGhu8vyIE92H7owWx7oOC3z+iTi7M/b98AYk14DjrZPA5gApsucWkA0hRmX0mOSBKmd47uaKYTDdt/4VCDins7z8tMES23tfRdi92ZnoNGi0v12IP703gjb41Y3z6sPoynZg87o7b/jDu/2dcnTq6kK+T1bzoc9Nv3uvJm1yFF/vjKt5oaf7TZLXCrvoGY8updSPDuUY+alDia6hXHjAUcp+5DT7CU4MU4uWN0u6XqUK7jpAmxYkKAg0KwlFzCJll4n5rrc/0sd/m/7619tf/5h/nzH7UuJZFFCIR31+Ph6Pz+fP5+fn8/GsKul2+/j9229/fNzmKXR51p/fP3/+RCkJEKUEjfFcnrVoUJfitVbQw73UqIWl1HaVGq0AsJlNzesmYY2Vq9xuU5qyUSMi5Zxzti6Hi6qmrLolLnN3oUfUpiumLypAY9OlW2WAiGZNEArEFCFBEdX7/d4yXQY93BmWswAtqZepajYthDPcq2ISFVgiZZ67/5ImSzlrThUSQLhDReWkM79g47DBX5IUv+UBrwj5tk9pVr0eeEpxklyWxWuV8LIsfRPVdcrJfIFXL4+oReCKEDog4RWMKWWSKqxlId3dU0pNvG5QbdmBAF3X2n7VnEJQGY6e7aeLFJvNrh3y9OT6m2eFmOSc1+ciIiQiotYVGsZIaUoKACkla47vIh4IGrlgNRGj4Plcfn4+n8+1lrjf74QCuqx1XZvuU0jO2hbRax2y5QRNmIyww/gXESos69Ml88d3pmlOd8sToAGptVDoXiukROMdapqQ0MEdQqEzvEZgNVIpaVJRi+quFXiKWEqTiuQpBT1KDXgEVNWbBF5Rqweruwth5kTdk9bGGmLITElymg2YUrKwW0moqIuvKypUnHVlXVAefK70Si/qlKid31oR6mEvGzCKuwYJgWETGr9UXofrhb120ndJqoEzNb4g8/A4L689t28reTWl7Uev2Ajy6DjRTAbOgwed+2+jehOT8F+9vnjqFAs3XPt42jC2Gm9HJweXZ3fL8ZEYbPM7DWGQkgY2N7QYlYdWNbZvAT21uY7y/DjOPG4bSMMfuUiGG6V6DWkDGkPZHFxlc8WWbT1OXQ05rF5FRAwYeAbdYDQh8AblvpRILhP5ReOdmGzL9Gamr9cIwFfdeGxwUWyGp7C/9zS1l/emUXAcr6+2+dvtyiMq/NoyyFaCC+i5e7te0gkByHPgz1nhvoh9l1dfRLSx5V6CXgafJ5FeensHzSudOg3lF1jwxRLyqjj2m3wZ/K+vcfyvs8MXC/EKruaM+9VoX4cvW/g3NvXsFyNXYncY5S+FeL6YNI4Oe3Xkdu1W/yYeHz6Cryg37q59+hi2NDaVso2NHF/0ZoRjzyNFwwl68fYQYHSBGzdUsAKHYnxs0U32eKWJ6H6Ph769HWscyv3+iBCAKkIoQoGEsp0GGK2TWLbkXWAi55InTneb/rDf/m3+42/5r39J327I8ahS3EIE8Oe6ruvz8XMp67rWWoOS8vzx22+//eXbxy0x1eX7f/4/5ec/WFaE1ChRXZC+zdlLWcr6+ViLs5ntRaLWuiy1lM2lDSg1AuHuJU/rulIlgrXWlJKYNp/vlFLOaZ7nnE0VapuNP7ofM6P5tFdINDv8wCYbGrTqH9xOsLyTHYG0Q8ItCK/Wqjnd030pT3cPwr37uJOUZAJR1SDpLYNRUUsemO4zTD16zF97tZmVGpKSbDZyILbBXMnXuPTvkPxNxM7Oqr/C5O7GAEowPMJDiVqr1wov5fncjfdJInyt62dZnl4WYZEI9yIwgE3QB73WGmUF2aT/ntAzotXlrbWKmGweQSTXdSU5z/M0pdYgIkTTfm7QCgW0/D+tQd3yabRphdfqBGpEiqgliqpKz2jRgz1ELKf7Wj7Xstbg47k+1lKdUDVJmiK4uket0fIPRUSeZxW6E2gCcMsnBXoAAhM6IxgIhRjc65MhLknyzebfJE2AQcTyjBD3Qk2QIApERTVN5u5RHVKFVPdeBbktpEoSUbXwJaKS4lbNcotvmaJp/9oEz1a5zN1LXSJCIdVJ3dIWtxLaBfQaEbIKkqYpcdI8q0u+MTtDiRAWqQvKk7dPrk0NWOEroiCcQUgImjM+Y6vrOBDVnWoNBPYkarxe3aWkpVe6yiv/Ug97y4bUb/F8a3Tced0vbx/Z+Ql5Ui2GBu+f/ZKDn0H0+uyx2Ts0uA/8PNorBRj7l8HGur3oWjZUTrEKcvnbXHFeB3lZIx6vuxoWW8svvSOGZe19vqT5vsz3QgM5WAovLF5exL+BhL5XIF8xYftJLnf2Kb+X377AqF9IdAMTP2mhY5vXbi/Q+Krnlm5+n/sw+ENmw8YLOMjnx6gIEUnNOivSk9eKavsFXVragdW98GPo+quho9s+Dy2C3Z2jq604A71pRqktZ1CkmVAOOYzbPDr4thQAsvlq47xyb2HXG/B6c/xwYbQAcKA6N016vPZ8wNvjPfJ19Iz0rQ0A+4pGDFfDlUMKvEznVWS8dHhMqqtYfpZZ4xgOr7KsYy/m3R4PCiJ2y83Rv70MYCRzbwloRzM0s/V2fPlLWCghTRO5nE5sh4M46a4WfTM0WfmYXWyljEeo8qwSnFb/RaEdrh0lrqQEWwDK3mAHyAtFvk59+9pioM94KGPBlPEQoB3hscG7FYF2AN1fSNBj8EUEKpLdfotv33D7zT7+Ov3x1+kvv6fbPSYtkKWgUp0KrOv6/Pnz8/PH6vX5XCsl5dv88ftt/phU8Phzefz9H//j//X59/+1fv4QVngFmaQAsCTqqqpwJ5vniEdEKaV5aZpZBNR9N1+VKIkp50lMa5R1farCbFLVnPM0TfOUVNEiNa3p8yqkkGghHxERkAiVAR+6V2gI2QthE92fFURKKQRq2s7KV68G5mwqhMIAA0TgEbWGP2OaZrMEWog4EYF5SgDMrJI1KmvVcPFKS9a62V2VAIDBECC9VJjGoDy/EofT14FGnf7ikAk2xGriRcuGzqAj6GWtvqLWWuuUsypTsvL4xPpcl2ddn+FFtHniodYqAhGqJpLuju6GblteOY8hWDznGVvZtVJKy1UwTVPO5u6lhrvnrC2hU+unzcnda3AptQcEW5Ytk0AXkeGVxZdnztnSRHKt/lhqdUCzJYazrNUhquk2W0lVSv3zzx8/n48fj8/nM2oBAMuW0qSaBLXhTK0UoSkADTWH1yqCaIVNRDVEPCqdkJTmj/X5h+YPS0lTgkhd4La6TZgotOZXY5qCFVJpKhRN4WR1Z60aQYpqynShuhdGfD4XtZxageSUVAQQCsKBiEKWUspaOzJrhBGASVJVCYJcV6tLTUklmeWkU9bZNGkSIzVlgzJ0qlYfNt24Pjg9UH5iFSni5YmgIAQU+EYxL5xUNpPKqAPgl5Tb3ZsCsKPKFZn/1Wuw0H/x9MZ9xjPAK3VttoMtKXDrcD82P8l/2+tOLqwY+c77QRzCz3ibPB7/V6b/paD53jrwhdCyeQS8aAtn4eGlfadXW/Dhiwg70pzTWI5P71ykXsd56ecM4esET9K/x9gnzmaUy09jPwMmnxw9gBMiv5LfV/CeZJ7X2f6z663CI180OMykjRwPGuxFLXmLXW3XHLPo8htk83RPg/B0wvVdAPpqVS7j+ErmhsThazboXtvSHn22yxlj9PV+Ysh3/ogYFqNd+zB2BnNeaeILKvJ2h4wKwxeocBrGTqT+mVj7z68x6pybOrS9+c0URpy+bPLxeqswfNWgvXf3Cm297QN7p4dcqdKmMAAvC3HuIdDs/ftfYIv9DZy8p359Bb9w0z+/8UoyXptd3vRKZS7X5oB+onQk90A6DLC94MmwcH5lrC0nAnue6cshgCKEppuSSgFFQwJowgEEvWhtUk1qd7n9e/rLb/bb79O336ePb3a/M8saXBetQPXwcEYtxeta1vX5fK6QNH3cvv3x8dsf8zyjrs9//MfzP/8/n//nfzx+/J+6rmpdSWNdileX1LK8U8rjsTzXuq67pGiN7phhmiaomcm//7e/TdN0v31LUwa0GQ43ghKki+4BQoyInDpBiGiB3NEi1sREVfdEfmdqoADbINqdEJiK10qyHTV4D1dYUoZBVGEtkkDSuq7r52qWLGUVhSZCxXLOmZo0GQISreorw4uopZQ8alcAJAiqKFrw5MkSc0K8fwXNvroGlBsUAGlFZgMeUZ1krVXKCnCaE6OYWYkirIpqKpIsKTQi53lZHiJwp/vSQG9iZkO5020W8zyrqlmODcJmNs9z+/r9+9O9NGVgnufm81NrbZEebZ2b7T81KVhSRFR3ERcRMuDhAU0GmChJE9AsAwrq5+dnDa2hYmo56SRclmeNpXpZvdZYVtQVqsjZKSi1Tiot8p8R7qwllBFmHqwSKqLNQ76xwOLUp0suj8/182eevpnOmmdISATqZBPDVXxlOAAnAhKqQmgCSQlIRMsO5K2whsK6PUKjeimlmmW/TROblxtF1ST0dGTEFsgRhaRCs5rCtkBW4TSpaiTTVDSZ5iSmEInsmsQms3kSqpolTUlXoUpISKSICm/5c0jnFv15pU5fnwP8Gi132eCFEWPs5NLVKy9rvbwKQL+W2F4Hcxn8LuNeHozg5dnXQV5634E2Dl7wss07QA6B7DzTN2QB57oBI98c9+MIq4s8cKzC2MP5BHKnmW+X7NL/rue8KAmnxk1sBY7KzeOvlzW9NJCzvNv+cpvOtfFrF9uD43SGbo8J7vffPrt/ltOUdwXm6hHwFdBGmWofErml9zgkrBNy/tNdduASIJvZazQV7fdb95fh/fMYgHEaJGWLUN9UZAUIMHhKTymnuq1dpOsI3hMhtfYi0vKO0QEbTMLXJdEtFYAcnkwkVTU2W/I44DFAcr92gf6swxxC4QniQuJI27ejzhYt0Cb+Bmna+0fFBAC6ea5t11P7DZN2ZWIMteEO6nZni7t/0fxkT5Wwo9JIFPZ4ig3bWvCKvOjrzWzcwQRsCWb2AtxEtOwyEETEFtjd7A29ATpiYMtm80Z2b5t2JCVfXTvk35J74LS1oLYn1+8e9iIN+CQ5wHNb6+Mtr68bCUf7tcXRx6trdwS2/jcfHsrmUDWOdj81epnRRsrHRen0ITD6zkoAooTADBVUFbjCQZd+giMCC0mUGeku013zPU8fuP8h//ZNv93TNHOaq4oHHmt9FgAIMqKUsq7rsiyllNWrTrfbt48//vLXb9++JdPy/PPx/X///D//o3z+XX3JpjB1d/GIWtdl8cTQqN4MzbUZ/9o+bbabNuWc83z/uN2mf//v/z1PZpoDLVNOz4yUptRzQIjAVBRmkrZw3u5WUSsRrYJs80yBt5WSiJaAJlJbegAQ9/CWpMiMhKhRWMNNNM9JhMu60klBMKrXlCazbCbLGqUUtbxG6JTERFSTTS5KOKAp5ZRUFas7pLKnkiA3o6oMprULGjf35j193o4qyv7juBF2PJcz896xtAsYnQ0Eup5U6dVaNZMIhajq47myrkoCbqJmAlVoKw8BqjW/M0JUNGXbEKSO+66J/ntV4OreVDhLSQKlLI/nc5qm+21uvkPoDjwOtXaKrWZJ+9nClGdWNrxB8+y2RnIxTZNYMjOTrJIDJVhrrc+1OAG1GqBXiLmzFGeIppSn2eqyrqgVqcIrmREiaaMYTS81ywIFGq4qYKJwQB3BGq6xPvnjT9pN9CY25zQhKWLS2wdr1lWdABeFeMu8CYFEsqSSNvk/CCLquj4jqqY1pZTybAJn1OoBepSc5pSmNGUTCxXk7LVGpcMjIlgZ4axBJao6wh0hSsRaGgzFLKVJk5kZTZFFc7JbEjeZNWelJRgcQWHl6hQS0GAgwJZwUXnw67YrR1m1cwQKexadN1fzBNtdtXb8f215+WmUrjoFPOP/V9cm5ZwU1EPSarnSN05+bJmXzdVj+QbVqw+psZWXM/NxeC+DHwSnsz3iXQcKtPQ9oQep3/ppHI2XzttfH+8M9OE0tj7lk2/CVbq9HNRwOJkk2VwvWhAVXtZiE5VeTGCn9BXXp97E8kmgn/yfJtVlDMQhoI3CwBAJcCWw/9Tc+e7+qBu8fXaT63CkVNzqGbRv2HBmT8255bc4vX3r/ytJsqtYr8MY5nVSzkcFoMk/l2e3HQER6TEAexrEY+1fHti+XAF6qBdvYL37/3XGvI9yPyLcZe5uJBy4yz6eNqURL7FBOpmRsStW+4LF2TXo1NUZRdq/YyzEJvr9E3JzubOJbldNfXzv6yMcWl4exIB/smXeqNVf22OwEFzEAgwb8tcEdO/ngkyt5xpvilE3KF1AOq7C/us+HVz3565EjWHKsQUGnCK0ZDi/a3fGjF1vZ9d2A7TX4BwJ2dbh0f+FcI8YtWPFV8fQ3RKzafD75edaocc4T0R2/xxqeDGovNp4dpXVKSqIUFDUW3ZnQChJUha7M31D/k3mP9LtN71/2LeZ91m/TTCr0Aip4UuJdV09cjYJlrJ8fv58ro8aFSqW03Sbb98+breb1kdZHsuP/3x8/99cfqYEm6YQ/Xws7hT3FlG3LOvjuT7XSlrzAmCtzTwfHh4ENOV8v99/++0jpWTJIvh8LgL79u3bPN/c/X7/MNOc55SmaZrMZE55mlMUuns43B0RZmnKlpKiO5h1IDf39IggJKm14kEORkQz+YvqlBIR7iUi5jnP031e8fnjO4UeNRy3HPOHJBNT+LoWs+IQaJ4nY6ihupflGZpVVYVBX9dCj7zeLOd9EVW+LP17uUY833fusfS/1JS3ZgOz725SlVFVmFVWYUWYUMjl8an1GVGU3g5Iaq2UQl8fzzWlJAZRVUZWMxV3X5fHvq0uOwVAc9lqnjy7+8e3bzFNU8vuWkpp9GSapoC0GAAzq7Uuy7LNUcAtT3+z+WsAzaGmR3OoCqBlrY/Hw2tQlKKlrrUENNYWdB6hktJ8m6o/rUZAAElZElQRUESN4KSa0jTlWbXpRSIwsdQ8tkrzTo3KWNf4Gfqn5o98+6Z5tvlGSyo3qLpX6iqeoQxKy3LeKnepqoVrquJButCj1qUU6PJxu5lZnm6xllpZ1yWqe/aZVFVNotC2AvtpibuLqSEhghG1uJcqQREry5pEJZmZRSqWUzQFoGSZIkUocitwbSoT04ypwhPNAtayyEo7ez/ZpC5Yx0GaP9Oo67W73JBd5fZNOfwVEr9Ib6f+dxHxrJDgLKjt+2XcO2Scs4c1lirB2Pnw9vfKdF5f8f/79W6ast+7cKLjDq+/9nqkQ+ORc41vHATW94PZn9ojl/Yg4PGNDQF2GJJEjzhq43mzdm/H82uAvM4IJ5v9MKN3S7Ov3S4evHZ76QEXUF/H8NWw38jD2HSzrberQHu+3qzLi0z1ZvB7nxxqW1lPcTvsgjjNlFs8ZGuTUrKhW+7ziU3zGM3YrWvf1l524/m2q8d0nF30khYGdMxqSBq1T4bD4LZcfoPJc5/SKFpxWBburjoCle53iC2pp6hyB6iOVvxjDC1cqcmdosLYkqBZrw+wG5Xbp1Y2suW47dBQEZh7S3F+KDaEk8RgdT6vYrrc75CMIMA4OQK9dezbX/QWRbY0mv3u0WJXc4b+SYnGfuQgAZTr+WNz8G28HGyldq5c4RXRW7JWVd0I7mEtiKDZmXBskq7KUZjmgNxmGOdRq2VbdzYf+qFMhpwQSUT23HPNILt1/oax7Xd2fVJNgL3wO7HnoWzepTt0AaK5ubeR+KW3fkKlbfr1wHMGEL0kzTawfVTWV0rBnv16pbf5erPVMmWxBEs1fXD6S/r4W/rtD5ln6jfOt7iD2YgEWAC11udSH4vXdUrZ11rCl+XxuX5+Lp+qmqaP3/7yx7c/fk9TWssDP//x8z/+x4+//6+yfJbnz/t9JlnDKXBRU0t5/rHWtRQAqros9VljWePxLEErEU6oJbOcp5uKkbKUGibJpjzLspQ/f/68Oz6+3STZb9++/f7bb7db8xtXeHz+fHYzUOPfvSSwqSJ1CaO7d4vINE0Rweo9k7JYMpEkacop55QUgFoCUnj5/Pk9ieZJ5ykh6n/++Scpbs9lfX77+C0nrGUpq2qa3EtdHynPUcs03Wu4e9TwaZrMcksKmUxqqZJhNvGwgx4aLOKQq3pC7mCT+hryH3kLvlDg9/DK8/6lifXnWg5CoXj15Rke0+3mZa3r4y9/3D9//vn55z8+ZpTlifJEXUQkTdmXopr+8m//zd3dC4A5ZTNj1KQ1pVTLElHdKSK74X+aplJry/vp7tM0TdOtldayagclGUwzFG21nBvtnefZ3UspSeemRm4SpFevJVzEdKKIeZRwaU+lNFFLzipiEAPLY3kuawXEzJwhVVTSPLsZqfp4PDQ03ScRlFoRMSUDUErRKampQCJQazXr8R9l+WGWQ0SQY308vv+p87fp4/eKJdQUClWZpsSbB8vytHwvdYnAlMxSEoTVqpJgXutgDifLsjiZZkhK85zdvZRalmhW3vv9GzRE9D5lEZEnlyctEluZHCd8r5ATtS5eq4hoaelyU6oppUQzzXeLKaIaHJgs5RwGUkOMmNQmSQ7WlnxbBd4ydjeaGUB3SWxh1AJr/AyAgvZOAhtxdWccvdSxapwJ2tF4vInjUuAl5QxExCxz8+nf2MUh3I8t+/CG8/Dj5iFZHlxyDCPu9YnBXUmQix1nYByjgvEiX9o+Uz3t2cMrVXp8WuPCgwGuwaSblZtduc+WdO8FyA7DR+PLu6X5KloMKkQMbHoXqzDQmZYjGACbWM9TmrJ243KNFu6j2UsQwg7DrNZkpH2Y3GIzxvOcnXRoL4i2vV9ENY0dHkSSxzru1zBHYMeWUTrdRF5snaKXnbZx8P1HAQbPkTNuDPmmNuHtIhdteKgAcNRJOKklrwXXcLbSclMw2rXFOnYMN7PmzdHWpZ39diAESaZRk9uXvwl3F5CNbOZ1Ud8JfG3bOI+6CbGJOCfGJnLq9rJs49uva4lTWrKxzcWHHtthxK8NEBtJPYTFXSO6YNJleMP3AA79+O3Ix+vrw5P/P1z82mr4iojtiR1Zd6IWYLw7uu0PDpru2ykMIB3s6KeXts5bjSQhfcMNB8Ct8N+IonjnE9kXaCDfL7i0r2PXLn4x8gsG7ks5rlcvwyTXR/p7WyrYdwg3dHi5v9n2341npAsAWk4U78VxAgELzaKz5hunv8y/f8PtD/v4w77d3HKBFTERp8ukQqHX+lyWxyeqgx4Ugh414DC0FJz5/tH+nZRR13X9/vz5j+Xn9/XxXbyUom7PAguHM6qHl7quZSkegRqo3suXiMiUJy/uxSMgpoSoKkQDypCQ5kIFFTOzZJNKKhHPZTWzOU+qyeuyrqtQzUxETbMJW10bUpq9H5uloeGwu9Nb1hSJjSC2a54nNGeiWiMqwp0e4bPhuTwfnz8Mlj8+FFP4WpYVouIr1LJRJLwu5flT3Z+uNt9zSowClmRw+OPn9zR/UxJBqPR6o9si8ytS8u6SL3T7E8E8uBWPQnt0gFG9rmVdnolS4VmD4OPzJ+oyJXk+flhUevH1yViS4H6/t6T76/rsVStVAQZIZ7CWdd3P4XaJp/l67YywQ/6K20fWf7Lnndw9mJt5WETWWiJACkM8aoQTkiSRbAVrs6YKWLht2YRa70GutR1ERa1V05SF4Zqzl+JkIbnWep/n4qxRImgiUPPgQlcRpYkhYjskERFUTZOoGpUgaq3Pz/Lz8/Pn9/zb7xCligdYK6qDVE21VjQua1nVgMhpjluwGaQKgrV7akqvk2ZsdafhTrpHqVWWJ9CCg0UtiaaUqrUQC6HEngzLASKCLiak12DxVatKkpQmtZxWtzxNflNFJLFVxJIq7zk7p2dUiyJRAFzc1UVkzyC+yzfS8m9sufte2fRFinglYq+Y/8IOxkHERfgfRY4B/2XgDrZn/xzp/57Z4kyl2evnvRjGe7M3fGSX8E6N5eWN7at1GF777xICDwi/lQ6P/l+EEG5SJvBCEL7mjwp7+7ov12vkca/FWDf57atrEwJ3d4qTGnYhbr+QAOVs8fzqqcuvX01q57/7G/BfEcCOwQiU2MX/rxrvKVDHaxjzdZBv+YPs1vZzY9m8GF45BTbuwL2S8SCttdVNl2e+koTkoPqjjX9v8KUnN6XnIeERqEGSbHWyW93X3l8T0QdNSw7dXTfBbl/UeDfaA0wvi7rp+Ls3/OVJtiLTPEtaO3gG+O4iIF5XSlW3uNl9HzY2uXt+713tpUZ6f3sfx8iH7EkQIZVy2MO5z1e60LPDd8u9hfNkN9gc7z3u7NugOQ4LxMwgQARObnzdULFpy9sb99EeyYkP7eAMwH3GrWd9xR0eWv5x59ro5RFgl6+a979y89bv9HwQ+i9o8JZYHCPddjijbrR4+4kBHNn7j0d6niN/O/I9BuY6hc6WXtq7oxVn38ZDqgNVhaBWs5B7pG8y/SHfPuT27+nfbjHdcZuroWos7tWdJd/aCYBUj7ouUVcwklqER0TxUqNCxKac5vt8v93v91sS5bp+/ufj7//z8z//9/PxXWoTpwoXpWaGhnOpvi7rWuu61gg4bfXwgDu9SzwIUXQTmDpRnFJqEGZ0ZwSnySxPeb7lPLctX2pdygplz4u1ETtp2fw3wts9T9pea3Y1NkdVV1VsdQTFutuhmUHotURZWUrLChPLKoqoNavQY30+EExgai4yDjM1Jkapz+8SnETK4mYmyXx5QixbEmpZnpomVQ2traC4Bps4vXHSq+SkrXD4WynoK8r+9WclIEL3qKWsS3k+IHhWyQxlXX7+zMKsXNfnH99uiz8DJD2ZpmQqjPA0zajVS5Psw6NKBMGWsLKpW+5uZkE+l4UUVWVPJhPFa2M5e9iGiFC0kSkP92XZMwihGajUUpqah3GaMktEdRG2Eoq1hmgEVlEEESHN8n7jDdQaDuhaaLaqqkpKSYAq5lARU1Z4YXHc88qWUZTxMeV2kOLhxjBkFQPIqL6lsAVAQkl4ha6oS5Sf9fnT7ndNmdAAw4mAUc1Qi+95TjvTTYmYolbCC8na/4eDoFQ3a+e8mlToZFRf4WvRPE3zPU1ZVbNKzUqmqJVUUiP6ZnDSSVEGPRjOgEOJ4lUlTVLmfAPQK32pmpkmlazFppv6UssnC5q6CFGJVsS8UTAQbOa5EIjooCTssT0YiOcop45i64k3vbu+uH/SIi8C69jttk0uxqA4BCCxi+DVXX0UrycMAJpiMGa73MW1y+z26zXTETsPfmNA7Iba4QXbNhduElabUSUBMV7BuxnL0Bz9xgff0pGdAx4rJaeV4otKgE3056YOHbPoZwIbtN5dZ2gfMN8HICL00kTkEUQiskFmuL8xkRdy1yoZnwznQI9F5Lv6AA3Ob8f8el0kn1+S4qZ5dvlqk1WlnW+gnSO9M6UOsvGlw34+sL+39dMkh33V9gayiaSvHKHF5LCZ5LYTJGCrBDwuSfvs55TV+8s0vTeHvwWNDELqzryB6yYZP5w38MUY/0ZX4Tt1Fue0VuPsXoB/XKN2gRekeXtd6B26hHZV0USEZ++d/Y3yL7+r4TrfVfbl4BnPFwz4qrcXotzCqY9Dg7PE/4Ux8rw3BoAQG2F4S1lIjmIQeum0tmq7dH64hLXr9cDk8iHOWEQEkLYNf+UWv7iuK7vdfIceTTG4kjYRoXRXrsvcLz0PByybAvBKcY79f4CClFAa0oT0IdPvdv+r3f+iH7/h/offkyd1iaWsa/XmaJM1SxKnx0ovijBtdcxiXUsNr87aXZDzfP/It/l2m5PSP78//v6/fv79f67f/67h8+3mUSPCaw0RwtxZKp/FI7jWcGcg1hIeulaWUp4lglapIaE1UFasFmo1aBaNPKmkKatKMs3TdJvnPCUl/flc3X3KpnlSb0sQ2wZvBDe89gy8+8o2qOacYWqagT25ZJSylKoKeillXcJLEkSUui6kq8gt54LKWla6aeR5ojO8uzbVUgqTwdLHh0ZhfdaFqFUjpvvv2cwZqE4LZaDVJ9X3u2C/cxFlfoWandRcWVrHqACEAkU4IhgVXsWrh5vCWVFX8eoowjpnmZSFVVDvOWej13WpBYic56ilVg8vEi4IA1XEcm4OBqWUJuOyD14B7PUB2mRTShTsgeDNoNM0hx8/fjSdbZqmJkRanqZJBSLJlNo0Dffi/Qr/XCk18ISqWjZNOmXVtNaIdRERM8t5ChfRUgkAqrX1k1KiV6/4fHLONIuclD3pKYNRXUswQ02bM0cTbWUpNVkYPKkKXaOKF/GiUQRzS1FFFVM1M6GqMnY1j1Q1F2UIIMkmJAFQlyBrM8G5u/VoB6Gqq0aA0bNb16ZLWOrAJKsnAZvMv5lsVFU9CkmItdqzbOa08MqSaCWtqtqikScJldlo85TuaS4WhcEQYfXj9PUqQFxY8EVkuVyvHPn67C9PXMfbvxYuL1/Jw28EAOTEud4xx84u/mn/4/0XvtkniBdYXXnc19fe7Z4DDWdmYWqXOwA2n9N4bT+Sl/HvSQYbhPtRMtlHTFJOPv1fDn6kYyOLPESCk+ntSuL0VKBNRGQ0+GLwqoLKpZ9t/MO8vrjeCiGXif0aMy8S0RYkc3JH38suNaljd9ve7hwC/S7Bvr5ueNFub70KYCJyAcLbkf8CA0Uk7ZbpTbbhQL6wWXkPC3GE7nkhd6QnKao474Fxbq0OQEPDMY7+hHCj6CbHndfpxTCmy3wuX/8Vwfrt9fJgvAXxlrDlSxQBEOHScgZd9c5es/giU3LQfd9mtPyn11fEa/99655nC0sAjWC1w/+e8UOPYkb9WXYbfxvwuPMbY3iVcsbtOlrEZXvv6G+GEZ4RcTKTbM24B22Pr+viIHAOOscB22O2FxH/wrTeamvoNSebaeGtW9S+dtJmM/b2yjwG+tUBtV17SHd/vEVl6LnesBC5pFnn39P9j3T/q9z/ove/8PbB2VaxynUpy2NZ1iLJpm+3220iWZcSrPQqDBF6hEdZ1jUCQYFZyvfpdr/dP6b7bUpJytN//mf9/h/x4z9RHsl0nqda16UWrpWsLlEr14ri4o5ao3jUYKnwiNWxFC61UiphDlDrBLE8WyUjnGJUVYUKVakaIpZySlPO4o7w6u4FISIWunmmNlWpx0NuSlSL2jycMkNoIi2aUqLVoK0R9FJdqpellCK+uoK1xLqKwpuvNqEqAtTn08tKUaplkTCrvq6VCrndbgr15UGvOrVAU7WbIM2sBSkJszSVOgjTHSVGQQFn48iOjb3Z4B45XidmNtxsWWMjyHB6pYcgVCjwpObPZ9SnKcvjs6w/7pP9/PP/fP75f8CYPmYFH8vnuq45W7hH1HBGVA3XXgY2EIRBBmcq3yzBbQUBUAWqMDVRgu7uRASHKjJnVRayd1jB5lqkqikl97IsS8RqQAkvXp0CVUucJmhKZsripbTwg2hPUdAqlJfVV0vMSGrFaslrXb027Ukkuk7YYd4ZWavrDJAMRkAqgaDQk1Ri5fqI5ZNRlLXJ7Tsg3Is2YSUiyNB++lEZYFiy2UwKSLKKikrKHQ4tJiQobLl10AwftVbiqVuzlJInRzhEAkTHOBEo2sl5IEJ7Ik9pBbC5xipFKCE1p3V19xxIPmfoH3ozFVPJkj7r8zOWFW2truKjpdQ2xY66vfpuvPFRfsXVV7b4FhNenwQJidfsLhepgCSjpYgRQDa+fPTcfKBHLrY/+JWO8fbaU8wdBLz3c3jzb/+d8hENbzxmLS8CH7sb4xkmh53t1AlAkWsP+7xGFnaRfS+8bwDF5ZDhDR8c71+mJsMhzIE87dXvokQa+bvIP5c2B9/sHP2N/097mmc9pP/9Utv8FdK+TvkrmWpHgNf72JZpH0xE7IrcDudteP8FJPyn1/bGNhRg16A2MWMXTdLb1QV6WroTi8LVTXCc6vhinGd4MLDh74a4g0IzKHz8uufrnVG7HSStI9Zh6PZfIVXtOkbynmQcw3tB65NcuHeSuw/CiYodMHmZ2otWsGu4p9FennorK3w10/3lIy42p+ULBN5uodZGzxb6oXOSux73xSY8pJxodty91pxsHvb0ymFddmy8ZMhuH4JUMb+SKgI6BhK8TuQ0qvZhmMuAlq7Qt6L/uI2P9oFWIXUf846Hl521v19ewk5kYLQXgm5MH5h/x/13+fiLfvwh92/Mc7XsymctpaxLWZ+rC6cp52zTNNXns9TFS0/9TtKjrOuqTaSAqKac5ynPOc9ZsxCxruXHP/j5D6vPGTUIUqAT4CTpdEYtUQuD6l6Lx1rdA9XFQVI84BVhqOEeEEWaglBV05ySTa2AVEqTaQaTV9YaqxaRZKI5TaJR1rKW56xTSikl3crR0r26RzID0IyczfLXpLK1PFU12DxJttB8REQoghGCoIfX4rV4XWstJOd8EwYrA+7uljMFYtnMWCxcvMQzRNXS/Y8SNd++acqxPouoaGaoNIMyXdg93Fpeq7eEqLO38+bt34dCqjxToTcEFgoEKBHutaJW90K6gqpQ1lILa4WUsnyuz8+75h/f/+7Pn9kUNDD8+Yy6UOdSH2aWJCGpOhnOWrxUy8l67HXKOe/ZlnLWfcPHxnKqHkkHd4QHkFL6+PhoD6rqXp29eA2ompoAZgimSIACGvFkCLXJx8KopVApwVRr9VIvaWf3WAgzy1lSSmZJVYKfmiAGqgRYvMXS041BOphCoHSA7jWiEOritQCuLikQ64eXJ8tKr5qnVq2CW8xJMOjuPfJkd8XW5jyVGvuvUFVDy2+bdgoTEfToOSdUIQGvhZQaYgo11aSqZqlYUU8upAeoIjRL7hJRanWGiGlSiGkYKwivUUWDHiFiMDWzrNNkZtMtmc1hPyUn6D/ks8hRY7HlgwDQ3Vq3rAmHYPdCOd/e+QVj4huf7ANpGMRgphqY75sXkTTTxlleOPgb4WS7+W5gW/8XXnwJhxtOpE+mug1KV/PrAIarJvO6x0e+/AV4uYt3l94u2ZZ2aNgYI/ci1XRUHO7g5FUl19EPj1941lumf3kdyaTvrdeXdJnHenkvVf1V55dFf9PDGwo8iLgvhjkOCtl1qIMkfent8vkVCS8DvvQvZ31J5M2zb/s8T38wsvRw5+uipMuTw9c3RwyjVIQzEN/C/XqJDJrX0LL56v3y0dZz4ARxnu3N43gaXRx/+prKcNAmTgrANp13qrzECJEzudnziL3q2V0zk8123kIkxhjzXwNhn8EbGeJ1Zn3hdpr1iqs8brfQLrWeMHMDIIfsQ/uLDgTtcRpHteOT6kKOY36dTnuIvVlIj/H/0mI0/vo65eFBDoMRQHoY+tcxAJdrd+jc8aE9dTnK3K9Wg+qie3BjVCcK3jDnfE6yQbUDbFckWnORjqM9gYqImaaUPjj9O/7yR9y/yXyL6RbJCrz4o1YsESWeZQ3GnKf7PCdTj7quK8MlGAgGvaxeSq3VNLszSO1BYlmQFSa+lseP5ft/1p9/anlahHstq1IlHBJUUEPYcgzoBKmnFYGBaMEL7T8zzdM8z/eUcgiyzmY9HaRZNkuklOKfn5/krCKSIAI5++lK97FueqI0vBWRVryreX+qJjPNyHusqsMD3cJWa0WsrN2/xd3DizIe6yqIe55E6IjmHZKSCkFhLSYiRJZg1OXx888c6pKhRlEXT5LzrZ1IVHpIkC1oqq3rqSjipgE2yjYQnAu+HYToYhZ8ofuj/hmtFEKtUSq9qkRZF6Ez6nP54eui5M/v/yiPn+oroOunI6qXR9S6IkgqMkyMRIT084SiOQNoypWq1lprDZJ5Fo8IDwCSjgDf1Ko0DIyQZDvxN7MadHfZBryuq1jWVFWTBBnNxm0qSXoF5ZblySOIqBJU/VBN8zwH6MHVa3cXWlbulV87VXEgVBFABBzuKq3gsSLSBvPK6BUrQKqAqe274kWbPXF9pOcjympR27q1khQSIcHwAhLhQbpKS+urqnsaYgCaLFlGsIetu4QGtoq5jKDAfVFmU3GCDLiIpZQEKpo0TTkisBZnsMEcKqRE0pZDxhGhHpQJEM80IRIFzrp6+iwuqxIqMrmknD+SfbN5UnXhT12llIiIpq/GkVUPQQCtFFAMMt+rLeZyDTgsv2j2+tzGmryvx/aikyDefQresIb9626geWXH10uu7J5fyLJjV8FTJd2vGgMYI3df33/xcd0h7I3onbtiF8plcMiSzRb+6jtwelnL7/c6SDkv0DjH/leu94HrUxglIjiA8exobNZwTE+pKmPMzodDPNm6fadgyKmc1vtJ/SvXRfwYpvkVxhKCi9UXw8KNP7wqcrtEIe8avx2PDGfCb/D8VRQfFZuXyZ5iAPYPIVdYUlpQIzwOZ5gd4y/jGC+1o7pnE9ZfbcYnvDmyPh7jGcTNk9gUeOcRD2A/mhyUxXZI/VVCG5y33PYK/0r5/sIC0atUKOCkBEJ66aix5Yi+F8ifWmq3IIzy4J4nBscvJ+a6Da8tzZd0dpM3xh0LkJo1GPDogxNhzwd8Sqp1bKot8PcMw1PHA+K9Ar/Z/iXCTUE6iHaSKxuzRJywa1zBUa8TEQqKv51y9LRc4uBehyV2d71XAhFDXQgAslUSGELAf3VEuD01hKkezbhrmC+q5hZL0KbcJBKBQCwnhjBCKQl61+me5t/48e/xx++cp7BM0wKutSwuhQrxUiKYzO73+8d9FkVdl3V5tAwnCJayenl4WRHx9GWtqJIzUsoCalLLplgWf/x8/vz+/Pwh6xpRIogocI0IhTQMV8AgSQQppZQYip5nzFQh4qokNCUVm+ePb7f7hyTzypgYFIiJTqIGyS1u+OfjkZLe5lQiaoQpktr99s1EzGxL+SpJRNTUwrufjUQjDIAwhLjdv3V36Oa8GCRDg16ejJYWv4tLAMzsfrt9fn4uS1HV+Tab2Z9//llrne63VussCLFQM0gJfy7PH7Sb5hQUR83zRzJ1BcMlWv5fgtHikvvGb6m7u5Panp/wvcBxovVf+NruuAQETOAkHVHDnWuNsnpdVaIsP2YJyPr4/EdGnTR+/vmP8vmPLO6Kn0swuvncF09TRrgA7iF0QWzSs5NqIS14t2cNTpZSqrUyQBXTlCypqihUTSFZAwAD1UuTINhM/RpjLGnUQndVKBglSikIaUXfKmP1tRR3ttxAoZaEdZ5lmlLOWZN58LlWijuxPAvUyJYlsPMsZzjgAXfA6OqRalAjqlsK0VYesUaYSFLNSZIZvXgtiKi1en0wTXr7yVqUzJTqhMOdwhATVsqWh7GNXK37CYSDqP1wAClQwiGIkAhXauzOsUJ4KUIyi0ADEi5GcXHTTO2nW0WMFGdXH4VillVTP4toV3PajZaCyeistZaS8FipclOTsOme7zrfJSfVgsh4PGFPrjWiStPCuoSppgrRXQYkQIQcYgc2hfaghF1w87buatJq47W/8XVZrE4OQRFo6BiNerEQyV6dkdhiAGTP0I1fCSpN/Lq8/z1V/0oS4KbA776y3Db7QfmpgIO6C3yjPDMKPKMCMMYDyGCbH8YmzfwxUID+08i/TpIGD/Vm7/k6o+GrUkNCYLvMI4MOsINxG/PVuag3kZDD6HmWaEPYvKSVYCtVKBGuYoe0MPBIsh/vXIb9qvvtN1/47yHQ98Yv4ugXjxzdjr8GCV5x44IJxwy+UAC22wqE9LnvqXi3YWxgF5F+2LtLhe0+TzGQb69jgQi2NKCHVr3J/dIdEkU2w11fcul+sXsvjaO2nvc/0QIXBADKVpqYBJwAQlxUOGjMEnY86wXYj1aERMgQcL7JpaoqpiYaEdCetHSsk9eyT0TLFLsdG5BsFQP6ajR7xkBZ2sH1KJSLiGoG4O61rvvGnlT31HUtv0cz3rQiigyKoIU7tA3jvvd21K4Ctpq7aNFXl4JBYsoA4QhBNhvy+zZHlJ2EYqc22za5YOyhD/TfomW3PXzKCbqwloWy5bmHgGjOnj1rkIwEpd1oRKThH1uWAQha+sW2Zt2FsZ3/9LR9EY22C6U5bwgVUHQXOZBCoe6Znk9ofUCpdT2qWNBD5h4J63ZaCom9NIYMEGitDvzR9jzREJit5vFOMUYlNdBNY2cyoaCjGzfaHWCr+30QwA2Gx5KZULSvCAWiEqrPsghssny322+YviH9Fd/+mr79rf4+R2KNWAvXCg8UjxrNH3pOyaY5p6TUsvr6eKA8qS37Ya3rsywPrk+ShC4rMeU53fLtfvu4zzebsNblz+c//p+6Pp/Vy/ORlIJAJSSUUSNq0B0khFUivJZN/lCFOTQizDKiWsopT5Zu6XaTZAwLsNQqqpS7Wprme0op6J+Px//13/823bOm5gNTQTXJpMBSDQZDDcqeTKOFjEZ4ICCmuTle11pgU55TFpFleZR1Za2mMAXgauIlSnm41/ACRJ7uSeeEudZiapomS/r73/5aSnmWVS3dP+6PtZDLbPNSVhHWkpSmcK/P6T49Hz/mx7fp219ExZIEazhNJmmUzMzdpRXNBDdyryQtJycRYUN+zAPPW323Tt6bMaUzB5LaXYEjyCpUhVos65rdw/3xj3+olOf6837TEo+oP8rz77fJlp9/Pv7jf5XnPywrcyJZ6tJqdZkJWFxazlUDotRaa4nglJJU8YhSq1kWS1m66B8QzZPllHPGxqrXGiTUUkSUcLWkyWpdbZojqsFa/tB2nrCuq7LC1+r1uRavbHXisqW1LmKQAKKlErJCiUKdazKL4LPWNSj5hiLl+YBMpVYEPPh8LkE3wTzfl9BaayxVDL9NYgG0pEAiHiwOqmTLSTkns6wVdJW4WaGU5yrI5l6fS/nxef+o882ouVIXwklxByRv+X/aOnp4KUUZJFV2T6FKb7wrhUlAICYGhJMeEeLhvvqyqk0yTWYzyFIKkprlNN8U4u7rutbwlritCQUiYkIiWu6rZ60pWTKDA6qWM1IuRK3VF6HJxJsKFHpLd9WU1H7w8QPP7/j8k89Prg/xEI+Wr6lpVyEmSYkS7ho8u6g31dY6R4juUNrsOiBDVCCEAkKooNWbfiuyUKTXKN6UDmyyyx5PQqBLJ6KmEqHdHX+j942w1ihbZYloBENaPHqpokfIUCf6L+Y5AMV9lLMb5xCRJtY3cSV6YqFeQ5tU7zzXAXaJDd0c2WXHTWXai0h2MF4s5REiUjfJvpUybEopgC7FHOmDFOE9Bnpzh+sGUDmEzjbl9pYBOAC7iNXqJyqVIe0mVbbAmcarDmEmGAzaVn6wDUN6bg8lGHAclv4uEycRgUKEEQcaiJ6iH7dlEUTOGRIM6Wdlm2BgloE9BHDP+dqhS1IEu3exastE1+WcXUkF0GML2e2Jsnm6nZysThqjWLPiCKJPqkloLetUAN2aCkBUh7OaTiFB4ybmkxTVJn8xhHBRIaJlQOYGuk2Qk5bSkqgdSJuUvplgCRwVBnZpZ8/QSDCNqL+7KwDAWBt4c6YZda5XGfNVPhs7P00bZ61rlKbOJ1+ynak1vojNr4Ps/hDo4ikv/by9dtT/16+96BWOo2Rp6Sl4XL3ziLBhMDz9JbdyY2eAHPr9CP9mIOmMXUCyhAsjbceA50MAvDvyO8bfPo8fXk9CZN+p7/p5JYh9741iSt+9bIF82NWGjgmv5hNv4XYAEaRC6KTK3nMn42/OZPdaGOMVu3XiNOzRDHA6e3m16by5dczi/XHQrni9gVo7On8BHTbcZte3jxe1qgvGjSgJWkElTRMgimSS7jL/RW9/09tfeZ8W5CYzVNYaUWq4I2gpiWrWnKZkZqWUZVmW50NigYLSCg8VL0W8kBTNZok52zQjZaqAHrH6+ijPz7KspVm/AUS1dsbl7g4PusMd8AgP1mb5ZJAURNApoJhmh6zVhWtO+ZbnZEnAyhCEVddEC5hYMgvr6SZTtgiyqKqappRSL0gkIo29KZr2X9yVbOn2+9mRmYg8n0/cWjWrbFZKKXWtTr/PkyVF1BVKiNiUsk23Dy9hyaUU0kMVKQtNRbOZg5LyBGmVEJMi5eRrAUvUIknnnCJlCX98/pzVrLpqpaDZB9m4eLNWSjdSdrTdTnX5ouvyl1TrLa66R5QSXnpphvJAfa7lpwXpn1y+l+f3n08v3/9RHt8VNSorKwAvpa7PtrlqEjNDymFGdkd/EX0+n/PtI6dEoNYVYVPKt9ut1kr0MN/dT5ekirhjd8VpZJyUdW2lf31ZllJKSmmapk7VPUQkqUmCTbmVG7uzpjWpFlb30vLMClR+fn6qrs81fnx+PhavLk4QWl2Ki1ICAhUJgYLOPN8DpT5/FEcpfkuWc57z5IyIKF7VcotyjqiogEoruUXSWQXiXryuy+ejPhb5vU5iOefqpVYp1TOZBj+KUkqw1lqToBXAJNlKQ3Kn+ABVVDQ0ukDpBRERlZQIJjWzgKZWVWTnQTlP01QjWFn7QYqIiZpIc1oT06npI6KKK4P2yrJUxkISjpxUFL9P06SYkSZLptn4KbIu8MJyQkuyks7durf13CW/5pl34KSi2XOE3PNhb2a5o9bL9eqhYdAzUT8w/4z/vr267aQr47hsll3w3RLQ7RxtMJOd2+8n4af2m9xKsjmq9VSbVEhXh0R6Mxx56oaeAQDWOGa8H+3lahsqInTzmBh4XBvJm4ubFXn/uoPxlZ+yuSzyiOtFs57JBt+rsd9JEU3kCHZpZrUOEFzLhA0MuglXTR6wTT4Z7N8AiYj6GhR+kXBO1rmzxCKHMX43x53H8xXcRj+LYUivaVoGDNyBPPbzPjZjuKUQDH4Kb6/O/s4JY4C2l76+urwxLFw/AeBgZO964ZZGU6Tb/ylv5L+3X5vXMrrW1XYw2s4/5J6TPNcncVnOGLTanvVvJxr7Bh7zomxdXvSH8fNpnE274JahaJjLVagdHD/UIEp6UyWvnvERbyrhYSMrF89yAD27+TsBceMRsssHez+v7fGyInuzl7mcJrjpHtuppTYnCh7N2mq+K/GNC5LuQivwmpsMp7O/Lvhus9x94A7ckOPQ80QTLyM/zQsA3xwRvkJgBPJ44y0Y954ua/2aa+LttZPjsd+tGjdEpKfVIgOsESZsmpgiCBitJ+QmgTDFrOmbzh+cJ2oOtLyb7u5rXZ9Lo+b3j7uqTimnKQPyeHx+fn6uy2OyMEFFuHtdV6/VDrOIas7NHb9DLEiPYI2o6CD13XfZGU0BiJBo0bIeJdxruKOCBL0Z+1QiSqleCE2UPLs7xCtDxVjDNLS4pUjuSa3ViAVaVhN4rapqqCoCd1GKqFC754NCBdET7Q+mAaGIerDWKsHmj9EeEMHTfU6z21y1OpMoNeVi8+02KZhrXdcVgEyWRdSLlFJKAWXKc0S400TmfFtbhnR6TjpPKlMK4bo+tdylrMkSRJFIeuNqatgjobSbtghAWj03sTHe5nWPA0CvZKLYmInvmCxIEA+yenP3j7p4XdbPP6P8KA6Un778GcvPn8uP9cd3Y50n8/pkVDPTVgvOHdRufSeFqSEXAEn67XanIsrajnlNLLy0cwNRMVEFleGbdDXPNwCllH2vufvn52dtlWtVSdlcTFSVqRkqRaWV9PYIVhGRUFWmlFKgiket7gi1Gq5aiotXhsNrLM/yuayxuYAENKCAV+dSK+3WEKQStbbaojlNudUloDdPJzVFo9YCFTYdcbN0RkT4z5/f58f3j/Xf0u0+z7M3HclBQTfiqTatqUUoQ0XURI1k1D1SWWyTBxo0YnO5BBDVi1dogpgkU00iGlEVICWpzPMUfec7CfdwRpjBVDVZO4iwVhOi23fdXcIkwpKRLKV4RLS6BFOSpIqcU/rIBkuQrEwSn8b1GYgaTXGJXmmDIWEt9mBnxwMpJQk053VtYjFBf1FmW/wbWEcaOyJ/i386ePr460uwL/Wg6vJFhpzxMrNdntsat56vef8Oy/ZmYmiy8PaobmPto5JzuNrIfFsfwxyJ3eT3IiPu0NiNRdxOPt1dTXv6jDPo2hHLmFyMXf2IXa4YgfxqENw486EY7F5Y3JlsHPfRT8ivb2z8PGlDiQFK/e26w3Cf6zAXnrtqjFDOvHTMUrivz/6KL+6/QYlDkhxkD4w396+x5WbQUS4a33Ra+vEtX4rN+JLg7y1bgPueJaX7s7QoHQw51k7I1tCZQh47Yr/SvkgyiE1dHtncXfqwVEheTqhf8Xu/34eoHWXZlUYZHxxH3J96kfP2Bty4RB/SWZd9hddrD29bvr32xzePnb3u+lbTfnDyG7O7nNO+4zKRC5S2XX1F95eR6OE4NFgIRlF438CXaW4nJ6Om3hD3lH50660HHoztXxWn8SuHHs5K3XFp778Hs+4IdSDJcFzb/tmGdIXGKzBPA3vJFjd2wg2tz7muR2p7oPEvtuKgXn4xjKGvjvAvA97Z2A4lNCiosAUVaSCgRBBCWDhDE3RSu2u+4zZHTkVT6Lo+l2WJ6qV4KdXMpmmappsILSUAj+Xzz+//eDweCE+TBlBYileWSvekYmZUVaRkU0MMgxhgrdZMsLsWbEqsbKfAQlFVZzvpcBLhrESN5m8dLiAlRCtJUVHVNFmaRFMl1uJJzWC0BEvekuCpmGVnlFKEheGskZK2k9KUxMRUtVOX5vkrmlPLCsRaa6kerBGiypappni4O0NgBpIuAbF8nz++2e1bRNQogGpSnWyaUqbg5491XWliKQmTplzjpztzmlVYyxMQE/m4TWuISkzJTFtgdc2W6YVRWZ1qpCuVAtmS5o+Y83p1WrcxoYYcI1F9bd8/tZQpwWZzDZZ1fdIXf35qfSJqff5ZH39y/fn88acvn3nO61rK+iQ5TZMId1l/9D/eTz6T2pRzdS+1AEgpge6BUso0TQpTUOEgVMKsBXb3kli7V3qttZTSjKkNV01zymqaPYowwsnuKsOmJwBNj5SmAGCptdZl9QqBCiyBJiKqCVqpppaymisigg4xdajXWp3L+qhrqYQQQdRg8ci1oht3JImmJjlTAYS0KN6UpIRadLHS1/J4Pn5+/vh+t2SWbrdbKaXmlf5sC9xmvSUmqk61EG4cpHluBMU04C7Rc1rtoVbWCowS4WUtTzwlQTUBkNqdQKYpKW+3Bld4RMRaqrtHStm0JcSBKunNzNQKErH5daiGthS8DppCxFNKyWrIZClsnkBrMq8YzCgrS2EpzdPBSBULobMJm5vUu2PiCUt9cxVlHYTUwfB0xeT98xe2m3EjnD4P+sVFOHnT+WCBfrsTL9fOZzcWcHrLdW+S3Jx8xuuSn2fsISAqOvLft2MYnlJA9ui0XQgZqMdpyi3P2+62PeoAo2PCiePL8d4RsJd8kCOQ989vG1yuzcX3esi/DabXdd4nJWMWIx4E8iuqqO+sq2/vYHOxP/o/tX9TWZmbrt4h9jq9LvKOQsu7Ru9EYgAtKOL1vZcxdMmmB6+/aYyvBgckmGJLj3eMePOw21FEhga/APcbYdc5os7eG0699RGqSPh+IsGxmu+xSZrTP3pm9Ld88fL19fOF4gzk4HVGfFXayE0HR0eCfQH0nPhpH4l8ke7qrUQ7qhZdLj/mFXiPvtduW29H7NRWG7jPSk+L0uV4nNYF+2JdiMIIwDipLnuDjXzEJvFs1llxQGQ/3OkIjNGOTgHBoXDqXiVgnN3+6z+h3duQtpPL80//DJDXqwN2m9cx31OjjtDXLTESymMAhw7gDCQNUCXYYmnCQWgYQRP9pvl3+/jDvv2u94+as4Ol1GddPpca3lwDpvn+8e23lGfSnb4u659//uf3799rLZPpugJAoRav4mECTZZyBqaQJJsnaEQ0d4WyLHVdai1RS7iLRLAiQrdsQW0LtrnUCCc8UIFKBFkRQQlFnm6mRvv/svavXY4jObYgugGYkZJ7PPJVdU7P3Pv/f9yZ7q7McHeRNDzmA8xISvLI6rvW5aqKlEuk0d7YgAEbXKa5Xi8yTWTMAJWpXF6vL18u02Uq9TJP10uZKwOtNYOHcEy1zvN8mS61iIQXOtRagvfIM4paKzOv683VYIgIN7TYM7OWWhhwVd18kzpRnfkyv75wAM22zDWr0FILgUnnMFcOJmamqUxrM9sakRAhJ3Bbt/nrxZsimpDdbm9b3Gj68vL9Dw2PsIAlmRCKpwU4c2uAbLdNcbeK5fqyGKp4BIjKMaEi8NkeEtFPiw1gYFuUwsIyw4Oab5Vi87XYau3d3/+lt3/BFr395d5woXBPNxlwMHEpJd3xu68OMUkpIIJmxX78+LEHO25mYiYikzC5kRDCPI3ohYQgQtu2+X1OxiLT9YLOAUqFmWViZhCJqm5tC4BIHGydl4yYeZ5ndycPsZxs5O5BzFTMoE0Xs9bIPKTU6+v08fFB7AgjjqAaBBQij7Ys4T3wSh3LZhQLEVXp6XtTSQN6ZoNmidmjpwZOYzpMwrfl7cfbv1Dq9du3aZqu19cw3/7a3N1IdqTCQ4wMds00oacxD2YWBPYSEYXYh0RLbzEWhEJz0UqpRIGyR6lN02WuYpcZCCLScG9bZm9T4VIKc0/NFmRE3Y/eaZDiE5jBtWS4fJg721QgF5BRMcxTpcqFykx1Zv6I9cNAiBZmEUYsQuTBuywJP2Fbx2BF63bKlET3Litn2f0oO/rq+HyDDj3z+oMAAmxoTbs8Oz1wZ3npImcPtTrJhsF9hwxaeHxxHs50ettnwMonO1jibHq458yis5vC9zvj3KRTA/l0KribBpgzFJB8OG8cTeveDQ+y25k5IAMoEjo/HmW269GKoz50kmBjpNJ0mGUex5WjXx+l7K4sJR4B9iMDOmBJPwfIotIjI52nYifqGL29MyHt95/f/ggJ8vwwyWLuJPHd3Mg//kfn+Q/XGbPF6Zv7WX1WQj7HUQ8TbYcEaXo3GGjEuNJxw4DPEYiOqeJzQ/Bzgr98dXmo7rmDPlWb4jTG+8QaQutOp8zr/mjpDuw+vzRBT4bKP7x9WKQScR/O9Mw/tU/HybTwcM8nc/SzR57vxF1fxbkrYgjt81PH4+eJct/2vRvzgCZ/YpG84YEXTO71tFOVjnvOl91z5nx6z3Mbn2/7VA3AcKB6aOPjU+Mtx6rov4756xFCe46Pvwflz3W4/+lIcPhgF3no8+d6RtxN6U/f9XDDMdB3FTl9ae73S6mXcDpD2y8Q0hs7O4bDkt0P7gJ5kfq9vP4iL1/59eKXYsHNbx+brpuqBnEt83SZX19fX15emLm1WJfl4/2v28e7bQsBLFhvtyAxKg6iiCosIkVqQITEk0sw/RPUta3r7UO3za2lViAUDOJSwjwQ7m6AWWSSpuaxmaqhGdRg4RowggdeLnNIQRWUQlyChGqppfI01+kyXa4vLy9znS7zdJ1lFjL9IJiQl8LzNM/zVKQkPGMC7cH05AwCnIiKVGa2YjYFmVHAYdvSiCzBXJmmeb6+vEhEqDuXCpJSpzJV1satlYJt/WEA3DIvcYQFE8ClTterL/4BpjAQCQVaa6JruIVD27IsbQvhC+bXb1RrDhy6GlCeXXUfrrgHQ5QHj0cQ29+tihibI3mQBwcgYhQsPk/cxKu53j6wvMdygy/hrUhEGBeuMgtECiF44oITYZqIlDIREXKwiXvQYTA4pjITUU6MPGkhorBwskrVRcnZNgvipGTIeKQ6TbVWVd22LWkwI5xIsvoEyTRa4DvDx9j/PY9YRWSeryFFyrS6EYc3U7dtW9/XtSlaa1trZtai6bal/6mBapmcFGrh2BQUkIiptKlcCEFucIYHMTgTmRG5q9ph6nNXtE2m1tb19vFXuVzK9TrLVKfL9er+8QPezKxXGNYf5NMyP6xs0RWAJAAdsowiVBXkAgK5R9K5bsYMDNpPwESYS61CdI2AqmZAhZo2p2ouwiIhDBImorR25AlAeriJUAECYQEJqHhxFiIEsdMcPPF1rtOF6xXyFrdK/Bb04Zta81AwF7AD6Ym+i9Fs4IH+aVDHGD3ulJ/N5OdF8flsP10dzYDstDM/PPe8pVOwhw6geffGnGoPCsBp2//ccff8ovz3zJ53/rejF9B9OXwmyntAEef69w8EGD/ylj4gvzMYM/AAEHdy59+ZFOMJrd1BoJOu8rMCx/efyN8zIjpUC4/Ize946R0c+rSBz3hvr+ff4brTxzNQ/lSm723ZMcPx5d17Dxeyh6DhT6HLz67zHBi6K5+9fc7XPl0fwMnD5/NV3BNv3aHMrPS5ixM+ERFJOb/gESb2XeCxDfTkInLftlMJRJ8GG5zh9XkNP9Jl3O+wD61NjLX7zI03ZnsBdE/0T9SG7PED+4Xw8PYhz0iAHQk/rIT+lnsGTD9CLI4kuM+dc7ckRj+cG/v81Ce63P2v59775E7vHnaPChiGz9njg3vP7dX2nAgAaARtREREdwzOIUg8nlMvzWHejx+C3YnIaUT/n66fqU8YOthzH+6Whk87BA+sZA+wvs+ls8KjuB/c/sj55XH333Otjk3wqecDFoFQCyal5I8iZpTgGjJBvsnr7+Xb7+XLq19kI71FW3TbNIJEqpTper2+fPkyzzOY3Wzbtve3tx9//anbjcOFItZtud24SNQXkiIiXERK4VKXza27V0I6RYal3757ZsY1cocEEVUWC5ibu6v71rwl/bpDLTRgDgtoQJ2MOMCbuRQSrkFFnc2CJGkFq4JX84v7RViEIqw1Sy/qWuo081SnUipxBtWxB0CM7hfHScPGxEFsgfy1VGGQw5nqiAvwZlaBl+t1mia1TVXNjRlVOBksBVxK2ZZb21YiKiIAhXuENV1rFZ9KT4bEUaVspuvyASkObXpbV6B+sW27vf24fJvDFGEclQMIC0dYV+DpzjDofZJQuNMDYoi8O3UAP219/GivStoqoYIIdTB151iRIGuCtny8x7ZQW4h1KqiXGQT1qLUK1wjzADHnCUAC+lLKVKq7d3pdkmmurTWzYJE6X8pcWmvrdpNpZiSBPhHIHKThSWhTJNWJJEVjLpTuOmB3REQnWgCLVGFqtrkjiJFp3UDM3VDFoMoylflS0RjO1YtwEy4xF3KJpcX2trx/LJCymplZa7YsLcKE4e6lCBO8bNjCAupQgzpEKoBwDUOUQlQyFEFcKBQGM0PKMHfTDW2JOlXdXJtta5MpUFjqdLnqGq5t9xLO8XIPMwvLs7VhLxtyLf2jbLhdpbO+UHebTMcxbWtE8IQkW01pWMoEEhEptZZaS51FPVMzNAsnT1Ukj3REjIjY0hPE3T0s3J2seoUEZCK1RqmNuTCoFpmkTFSvUi+YZ5lqzNR+mEW4gjiQhL8AgffN9mHT804kSCAmIcIuLE9SJs+xHuEdJ7XLvUSmnyHvz6D2gyB+eiZ56047/AB4EY8E74g4e4qfV57HIw7pStpo6F2LRp/0GOq9LU4MOUo+WkGZUCVSkg17X6fMc0qTUcYtxKljqW8f3TY82pVa917biAjmg1B9B1BAVxe7Q/jpyH1/T77l+JX2QoZgHZXa+ySrxEnWxCfbf4f7Cch6bqj8cX/XfRZOxvmVn129jeSJRYCB/ehEIN+pI/ZXnPbeUcjdjLr7/u9efUZxZ9xyhwwfD1g+Be4EkGHnBuERM3NaF8P7zamjtbOKMg45DtSUYHBnATpq08H+T9t1pwA9VPT5KQrs8aN3oPaukaf7H1dRL3XkVhS6r/Edqc5+mDdiFR6rR4/f7Pr3z/aI3omPzffoO6ju96QljOWkJZwVdxwW33MDU3kY1TjqY+cg7HGanG9+7vyHPtxvBnpG5711f7cVnrvlKeT3vJmeW3deAbm88jaPII5x3nk8eNJAkh4n5/Q+9dH1h3svw9Ns/sQUsZdJRHvXPDT5XG0+9ef9Sn8M/Npf8tCz59/2Fz5071En2p873ihdAzpcgPrjGQZDZAAJA0QuheoXevm1fPnH9O1X+TK3GobWrG3mjihc5VLn6fr6Ol+vzMWsLctye//48ee/3v/8i12nTOnbNjUVmqiEMJcipWT6LWltVQL3UzUWhgTMPMzDFT5yncIlD+CY4W5hqqoWpuFBHuNfQhAFMuKVHbSoztPMUlBqgD3yyIwRjKa8rFVkKlIZ1tS35fVSpTJPdaqXeZ5LYWYW4nDjzPInYBRkniqPCCEHeTSLcEGhVCbmuZTC8NjaqttqZut2Y3iErR8frbXwFu3yfnu/3ZZS6duXy/vtdnv/KJXlehWEqjZrBrle5+HLrkQhU5XNlm2ZX14ZEWYRNBdp8OX2Pr9+p/AMUaBkoyRyslJKptrG/UY35sC9pIkebPf3Qu50MRHMW2utiKlups3bsi5vNda2vNH6YbpKhRCXWptZnS7X62ua5BPx94MUMwFqKVKKt+bcPIilmIfUS7mwiFApICmVryROIOJ0IQNRKmNQbQaB7hwjNJzjI6KUkl7tbVMfcdtwJxdHsBQJQpiI1FprqREhYsSizqv6pltrrTV7X7WZS6nEl+l6fWkRMm3NFORoptYsPJyDyYPZU+d3CTCCoOmLLyJwT958UBUSTg18kLs7gXposKPR9iHzhWBws6ZUNeHFPM+wTc33nTHXeGaYzkzVEd4j2YZAoj0PXERE6J2ZM4jEw7yROQpx8nPrPkN4yg1wz9AcEUk+FuDNtjLy8GRN9pAMVQ1YMQuzyb0ghBjsnOEJXpi5TKAibJimF+EiJBzFOUxD0AwwuA97pAcz+WFRi77zn8IQg7poubcbPuKBfyOkcO9ZcGz1AFNmHz+Qw2j4MRbnD0cF9mWIQ049VOT5mzgMOnsV7q49o+3Dkn9iE+oHXLjna3qoIc47AxDOQUyDau/hqYgYnkFHgXmCtzd/n95/87rT7vSMzR4/P6hqET2X+XO351MjBiCbs2N9JHVX7Oj1iBs+OPIfG/vZN3RvC87hxTD7Pl2fT7xd5h/b9HF9/vSZVWlHMs87/DP6/3fXOCMKjntKpV634cH20OF9FZx7hgCgdDzSKXb2JLCgOAPQXMrwCPd11HufFcDQAn1s8USUrvHMpc9CEM5UUyMsLN0/s+bCvHf2qYOOWOTnXjtD1f3L/fFuWxrvHHC0zwucdohueMOhxhyMZp2kf18M42yQPJOaJZU1UZTCMeLxT0g39s33cS6eKnz+JobgPw9V3jZyLJzaREQEjQ7dMNS+3MlORzuPmANjap5n3jjNOCp8rknCUwTGXOlnJqkI8QC1gCffv7sD/hBVbGZEkVXN8cVgeiUiIu6OD9HPkZPF7ujD4Z9wbEwRMfRALmVvMPCIsHuLAuc/94qdrQsichq1Q8c7Xnr/OE5jFKdLClMmnxqjmPzFLjmx41wggInFEEHkLB5Bzkz1RV7+Mf/+j/r9F7xcWqHG7m6gRuSEWqapzpfLZb68iJRtW7Zlub2///Xnf3/89SdUq4CbaVu2tr3r9sJc5y51SpnU4/b20dTLdUr3jEstQhymNNJimBnC3F3beinSmspUE3PAYFAuDGBdNw2ARQpbCw8YiERYyvX1G0p1FII4ipMwBCHQmGpl5jT4g8O2Fq7z/OX1On/98jrPtYtdIWahECYwS4R7s9YM5qCoJQM0SepEhblQt4IwB+FyLdeXy3r7WLfb8v7247//szBaa5fL9PGvtw+n6+tFbPvv/+c/2+vFzISovd9iXV9eLuHOHG25UTSAm24W5uSbrpeX60TX//7rx+Xlq7uTc8Cu1znKDIDgFE5wbxpsUtKLCYkFSyks4t6RDHP6nnt4jGlKEbRzDBLtLqCn3B2DP5o6jzbMbNUWTGpb023bFv14myttPz5qyVMcYY65vjS3ly/fpvlLZtItZsuyzNfry+XaWvv4+Lher/N0NTPDdnnNhLhehfKIICJUdWsWTFymcFcHI7q3TyAiPUQMJGrhjjLNpRSWSkTwqKVSpomoHKoRUYg8fKpCEuZBTFwnANqUg2+3GwAuNZEuUWut/Vj0lgdQxIFlNV/VA8yVCmAeLGWaX7a2ursIcZH17a2ZV4YGzFAZTtRM1fViFtNVhNy9NZuqdCkrzCgd/DtgziDb1u3j3a5LfLEUEgBFUJkqAGtbXyDi1jYhdjUd+eZ2S9extzTVfD7pgDIn8XA1yW2OwkKbEycMaq2pGUkQEctUa51froZwQmgeuYOZ0TdIz23TdHNr0zQJw510a2EuxFuQqr5cZwtlFZlmADdgtotUFhaplyIiUbhK5flf69tfy7vV4CIAwkzdwpwFzOzhHEiNlCKJ1QGQn2i1x86chEh7CCPtbOXZ6gfJ2Pde/hx3nv127s2ad5gsP5tZsiGNV+QSVBqSjkhOe3kGxxcABDlJtC6XAZx47oH7ELCjhieP8BM07FFtZnGCdUOoEC1NeWeniuiJhyMZz2gQVTMAyZMHjSG70Y9wiUjkXKsz6Dx35vnPc/61XSAeZq2TWTM6oAcGOokOlfPMJwCUk3J4DqslQjbBk2QUJsRjjdzFtpoZKBD+QHseh84W+yEbEfVcT6PPE0sQUU827CecNgraW3rukYcg4L1DeuKERJunBzLW6wz5zn04yjyjBXz6K2cY2NCFUmrnNCc6fIGIKNm0NCx6gqveJ3xWPgdLyl6Vgr+99nr1P9Gd+eLZEHua+r0ZcZcgcO+6hzE7/5kJMz+txph8HVbuTbrjv4+jl88a9vGWJxakx5Y+ahMeg8J/3Da0UvK7B/fP8fjlubEP39O9SnP368Oh52ea9//k+nRh04k16GGH2rv6oZ47E8j+b+dh+SSz8tkl8ZNeOr00O2xXcjzX/DnynU7EC/ta2mmXngr8H/XGWQ8+//swG0/9cF66j/3TS8AnI5uVj4jdZ/Qo5zNPMwbcLEDOcA5mqTx9KV9/kS+/lm/f+evVp7KRNbfmm+nmJkzEwzZH3mxb13W5ffzXf/6fdvuAKplqa02bbusWbZovaW0SkWmawcV1VdUIUtXYtqJKRKWwbbrc3rflo62LtTX5TBCkDiYvRMQFbA5VVXXuqW4CFmimzWHKwUxcuEzEhaSSFMgsJMQJ0ut0ealzkVJAThTzXF+/Xi9Fvlzmea7XyywimeaAODIdnuSSd3ClGSWZEN1dipRaZrmkASIz9xUW6ntiuHtoW5fb8vHX248/XfX1OidKC/3SWrPb218fP8wss1/Vy1xgRCSFt+UGTERspkfQvyAC0zTN89VJxHme5+lyMdSM4nB3uIoXJgnXPAfYp9aYxo9Td5+NBCen87klEe07zGebjFl4zlFtm28r2RZtvX288+1D19sEZxEwuE5TFaqXMl2IpM6vbG3ZfG02X8vly8Wcp/lSp4nNgljqREcSQ3eHWSMqxI3ATl5kNhhFvoAMEQ6PyPMl5pKC/GxxfF5NQeA6uTuaGhRBkqgCtGlLa05YD2tyx9Z02dpt1bWpg53VnJv5at7UmmlTIxKpUyWoKkLXpW3azAAmjyDH5lCLZnEtUgsTkas2hzCETRUBY2Z3ssz4mxMmPNzDNFzJ7bzpJSlLEJEUCSV2iLgdN9ydWp/QkrtHZN4PBCE83OEU4eagjIdtrXkCAy4klUuBhQWVEuZeiGutO+ESYfe/OOZMeq6u65qKHKVmae7s5LS2jYPFy25HFxB7JSe6yDSXl+QnYilFCtcf+FhiMzOPYHCU3Mc9Y5fCD201/3uWy3dbXzqJjW+O3f40xz/d8++2cXx+ZbtPJcT9Tz8t9r6qXfRkAQ/fD8nyJMfvAkA/qRiAT3k/n2+L3VluiGONHox8V34AZ7JEIIYHPHVTyueg//Pr39T8UYbyE1HBzwboSeZyZtoBgJCTMY7OiyvVj+4ViUfs8TBqRIfX0t4bD+N7D8AwGAt7v+GzaUanPRwnmtT9FQDcP5nkn3ZjXvwTKTD+9ftvhnUfdxEgD3jyfqf9/O1lKHM5fSUN2/vPlBnT9qMDurM/dZQT2WAnIqYR13m84yeD9NnEcnc5N56GV/JTP0aOVUbdHz9/2sx/c+2N63/tQG3o9GlAue/EvYv2DH/HqDzMwvwmmZjPTXhw9j3PnlN9spzH+fp8fbrF5N7+/OCo0mnn+kw56dMoTqWd1BgKEMiQzuvPLmEnQ0YOeCY285xwh3K4KwB7z/V8p/ceMil3z38+7SBP/fPZTvTwgX6iE+7jGCeYEhEnV0nsJG8xmNjuK7N7acdDhxORuTLzM/jjYAbMWYirT9+mL7/Nv/yjfv+VvrzqXBvHGraZegAMplouUphroSLu3rb14+3P97e/3v76L3ZPkhxrui431+ZAvaTFi6c6T/OV4Jv62tQhlWXvVaFQ12392JZ127b0D4lTHJIbzKJZrE3XTVvAWfZoMIKAQKWIVCoTpAZLEFEIggLMqCyVpJYyXebLy1VeL/Xr6/XL6/XrVC5zfZ2nKmUqhZmcJEKCnIk4OA9nrKkIaq3htq7rVHiIRnRiU2ETbsu6tnW9GcGsraYbdA3dto+3ti6+iLsXIVu+RETbNtfIvFSUWbHbGoRpKqoOMiLZzUsRBnJ44TLV6dKCwkK4ljIlG0qYh2lYgVgEscN0Y56RlpGMvroHwfeTdxzTx860nRMqiCjs2BhHEeZAMwMHzK2ttn54W3T7WN7+nH11V7nUQrWFzy8vPE0o9XL92lrzICnTNDtREBcPqvOVpKjDHA7mUqZpqrUuy+Kh7gEpVWTiC4KDHE7qBg8uwt2i50BGkwLg6GFgZOkW3RMicIAgSEnN4QGHE5unj47HWDJMUgvAhiDh6Xp5hWxBt1i3WBc1MzjcHOodAJuFaRjc92wAQabWPLI+zS0VgKa+Nft6mS8XYQ5VZYYzE7e0S5KAgt3UgzqvKRGHUxhcET4yfJu5IaPC0/gpwiUAb2kR9Ig9FooLEYWro2S6cTLpkVbpOBcUYeERTkFMxAiOcEsnIiHhkiEF6lANYiaSSYpLCbHmLU1XBkiQexC52TBTqtZap2liZqYSQdlNcCWTIC7uqkrYABQLq16sCKbLXEopk9RrzDUmAf/w2+KrBoEjOPwAydgBImEcGd955uaeybv4O++Tg/7lkCPnfZtPAuv4cL929g1838PHG7F/nwxYeyUj4N3qr/vejX7uzUDXAB+gbJaKIctGHfKhlJUHxOfeMXyqcEefFLhT9+/EWY85ZCbqWrRH6GjmUX76CEROv9O7gF2W/z2mv/+yW7hPX/UWjT92Z90TKthtpvu/PGbDk7wGDjA4IAK6Fk19WVGv/YO8jnvQQngwHWJnZRyMkV1/QKYcjbsn7ysccfDtAPC7sx3s9/zM8HjAyIj7U6xPgH435z99DyB3kt2PA+hqjxPvkSA9qqP3W+/Pff5bV+MfF15il39zArBXZceCntlZ7yz9d/ecuoaICB6nKf2oLw5MeXrqjvn06IhxfndS4x6s+yfL7rkmO2z9n7QUeFgGgT1r47F9BEAxfNcetqGzuQWfTPc73eDcV3v/7Lfudz6vzPMGd9967E/lbedzz/PjOxvxw7x/KHYv5yH6fvzr53XyM/3raB1FqgFPfeKZOtu9b69nfH9W3M8ug5+94hMd8OHm3NCff/3ZYo6Ip9SG++fT0D+f4YwY4GdBRURuHiMbw7nbiwiMCnHF5Wt9/WX69Z/TL7/RtxebirFvrmvL5M6lMPNllpJ8izDftC3vb+9vf63vPySCEBQepq3b+ENqDQKcCkmts4hsm62bts0yrejlep2KhKsZ3M2sqW7unkfbnACbC+Br063ZotrU1ZLqJyyoeXjX1phQnNgj3KI4XDtvULAUcoRUqplMdK7T62V+ebm8Xutcy1zLVOoYU6Ik/hcATual5PF9ACRMQVKFpmmKtM2bR7i5AghXbbft9tHWm1mLthKUYAy/Xgq7uLV1XRv2o2uuXC1AbkRkTRd3R1grIqJrAHBCoeJMbhoaxERUwKVSKWlYJiplcnQfA2jzUpgp3GEC08Cxpp6MUnfR7XE/Uc9b2dkKNcIWA0ggZ4FG3mxb7OOvdnsLvbG4ifF0YWa1xqXW+eogM+tIJShDRYmoNZsvc7iautpGTHWSaS61lrePDq8z8LTWmjVRVTYj6iX46YrEVYjMnJcbAIO6Z+9wXCSAqJg1gKhAMLCZh4ODWSTcYc3NvZb569dLlEvMG7/fqH4sm6phUeMIEMpUHVuzCPVMet1agysiQEIsQRyAualhNagq6EpSCW1f12lET44pIiIIkRGESEomPfM8dFGOTsVvZqFqqnDf9ft9E+sdEhQRo9FOpFAAYEofSCEuQUok6KnwYB6ECDYRYXWNCNewAmSsKlTXkf4XpZRUU62piLh7ZAhyeIzoIxp+QcPxMgfRPLNsIDwozBAt11qxCmBiFkwcJDIVEiKCoDi9G63elMzgFrr1E4AgJvdgOrn4Wyc72qdxvvocRHsnvu+36Id9+1PRtsujYVSKM8bYC/9E5t6X/CAZ96f+HkucqpTuKB35PjzFd4BvNHDYHJ+LfYaeEYFgHySrn9Zhh5599zAAtGeS+km1j8t3FegRsNFZQH8KdXDfhwPg/nsYFqc8X0/gKoDH4Xj+9Ty1gAefJTw/eNfkE86Juxv4PC0fitr33/3xdBWLk4nzATM89/95Yz/q4Gd1K5/cP3UnjOc+/Fkl7/sKAErnXL/npcDj8oiISENUIBk3PlmK+3iTRxbXSWMOM/6pBndNDQCGyITBx/3j5ac2ALlOqDuIfToV9g99vn5GTfDcX5/O4L8Bt3G6AAAe8YlN9++vuFdXzj8c9afHXz+v6mdW/O6S9zBedMpLcO43et5M7l6Bpwk0Pu/W7juf+FGPBxxzlx1l36bPtQDSXMYAdoKCfSPDA43KZ2dtZ1B1/jXuFYDzpIi7mfbJDD+V+TdTCXGyLvxE0zvfPC4CBcyigmfUr/L6x/T7H/Nvv8q3Lz5fXMSiaTNPMwlNjCDuMGRTdWvbst5+2HqDrlMl3XRrH+tt2ZYl3VqISdVL5VJKKZM5tk1bU0Nc5ilzADNz9wnQzVr7dHOPIDVfta3qFoBQBMzdDBFwD0+4AXawSnioeGYObkZBhZwnKRLgDDZW3cyZyeepfLleX+c5PH2I+57I3DnzipSpFnfXtlhrW1MOuK4fbWG4EIuIW+Za2lSVImz90OVjXZft9kFshSNMBcSMZHt399u6qupULzGRhgOFE+iJwKzz1WwWEWAqSRpvcDW+VPNGxHV+VXJiIZJpmhqEiHrWZPcwJeZwDS9dHHkEBRHznZ/xHjBHI9ymCwAichwzkAav5JltBoBRc9+KbxKNt4/b27/i9lbIiY0Lk8AJpgjiCHGzt4/36/VaC6/r+vH+Y5qmqQoTPt5/eNtUnShKKeRm2xqcO7A/zF53Z5ZMJ1NKIYiZpVbIFA4LJ2JiCJgYBCZr2tWd7A6mbGOmsQUJpLjBEN4UsHVdiQjBm7atGQeBiwMkXEqptRoxNIQIaszpgVOniUa8UINlbBHlUYAD7oRACzT35v3ggClYOBOORYQIeXh4OJhKJeJ0U3V30gg13Zo3DVdIHU6RbmbDCcAxNL2MbzOzDHxj7r52e08meth9b5I9lEAOs/AwtcA8U0R0H59oMAeJg8zC3YiaiAiVuU4McpbW2Mw0tnyAKKlnSEQckXYBqkJgt2QFQlVCFFQXEYWFJb1gJtwIRpBLmesLVxJAbAZeSn1vt/dYVm8riEDhgweOiDolFfBIC363u+5bzY6o3J1op4q/kyl+mvP71cWl7xZjxM54079ILD5A2xOCjFTORiH+JMx7jCXOp/c5UCf2HnBEeNZ8JOnaS7B8dhzuPV6jro8XYRj+Y2875znAA3I7LU/rtUUAEpRTPtHVzj5EJ3eXZ6kHZPqwsRFlB2InzvmEj/JhXMafp0qezkNodEF084ePDw9P0QgSAIB7e/kR496BI531tBMki9xXcV/yQ60+l+x8Soy4N5CZ/ZSD+VPMgL9VAGhcGFzPT0XlbHHcqwFn9cYpoueToX0+PyOQx+amwfHhb+zw6+77YzAizbRn+HW6s6/h/UGLIcawN350Sq9crnQiwu4EEneVuN8gKGXww690ckY691Hcw+L4eXd82jvRUenjhI5xqnHu6IgAjNA1v/NIxL11eS/8byrz6a//9pG94c9fPrTiIQbg0D7NH17R23iyfDz06qGYnd/11N5+84mg6lTaJ3ciArCeIODO6+7fWB2OG54kxNgmzkDq/N443/Y0grSP9vntny7+85dEj9kzaKT8xBD8OaUiEOZzKV/k+sfl23/Mv/5ef/ka12JFwOYKmBNTGIV504gwhLpjcKC32y3awhRgb7Yty21ZF00mijS7OmaRWmYiykyrhkhjrrlv28YiIlfmUN0+Pt56JQluME/2W1iYRz+SJgg4UU9silLIFdrcPByFJEnlqzY3ghE5BxMG+JXL5fJ6mV6v0+t1ul6maSpFesKrnb0QQlwoOAQhESI5uKa2hQWSpVMV4YxIY3tEgJyIlre3tm3etrDVdQk3I/PQ9HeSUiawuy/L8nFr5hxBEUbMHiRFpFactv60mLr05ANuCItNw5wvUkoBSBDEPaiZ+zNqu7xyN+rsfT1y/Xxcez+H87MdzIP7IjoHjx8LIyI8oOar2ArbYvuI5QO2VLKpkJBI5c2chJkKzN1AEWrb8h7vy227LaUUb7pty48fP8wbPMpUp1KXNayperx+/Z7ox70k0s1VkFp60stg8Fp27OcMxk7g1peAMO+L9+xW54FgCNLXn8w80Ml5GExlxtV8UbO26ceif/64vW96W8081Pt7HbGta1L78GAjIA8P0mbhbOoRYarsaIam3tS3bdsqUQmXktZjQzDC4RoBCBExCcLDyZpLmKlaW7Wt7ko1mLmUsmlBNDMFQcLCNVwp/H6k+iVS00AZYeGCvjOn71PyWrlFqIWGMUeS/BRiC1JVpggO4oIIV3MPq2WqXEWEyESISFUBV9Uebus9zljTrc36BAuHeo92AATgYKnc4biqJgrh0BKzME9TZZSwWiimIgVBzeGh8IJo6RyaW0dHYQQAwnTaOY+LHoXX2HXvdu9DTp0SHj3Lu/Odo9jzl/i315kU5KHk/fuzSNqZ5e5X6rFgH74ZpT3ecwJHfwfdcnEF00EGci8Qd2R59E+ASOLEW7gLtbMgO3/AoJY//zRka0r5eHjvQ0c9fNk/nH5heriHnhHX5xU4QPATGrwH90czT34+TI/34B6Z0DC4/Kwhz9L/rJY8nCQ83I/7QCAaR2TPQ3CWBZ9ez4LjoeF//0jnV+7cMmdgt5u+I9Le74hM+XcoBKfSs3GjVaflndIrYdPpwCJOYszpk/E49deptKHIP4PUh28ecO2plj+5mOL+97G6fR/E3cATEXKo4rGvwjgdWZ6HMB97rrOPjKrPdY77L/E0ug9FRTzOsE875Gli3SHp8yt2ad27Z+QB2J86/r2vCcgzg2d+8VTV0ybVjUSnDqEggOOu1Q+eEvjJpv/QIc+9/bM/T+N12vgGDet5lwew8wA9lDb+fvRQ2suhUXrADvtun2GxG2S4ynV+/e3113/Ov/5Dvn6Py7RJNHaDtWgalvEmptBmZuE6mDqbbjddbtbWgIXq1ha1TcOdiYhMBIEJSK5ABJtpOAlXkJuZbVuVORvt7ro1VxuT17t7Q1BqDjGcCInIItR8M7ijViaKBLVMLKVEmakUBYMLyYQy1ellvn65Xr/M8/z9+9fffrn+9svL9y/1+0u5Fib31lrlWqVM0yy1QMhhBuNwsqZNt8T02poruSOMPMKauWoEzCJiqlJr3d7fzVuESZhwdGoRNS/Uc7sKuWNtoWiTTLemeSpB8CBIKeauTdNTQkgoyNUtQiqTkzuIJDPXOlyEg7A1k3kiSlOxmbUgJ4oSnnnh0p7E4O7sHdFPS/t+knPDADkDgmT4GiLZH2LUcogiGrEi1Ldb6DpRBEPZp1owz1Q4FudaiKg1M7MqvH68rx7qRhEw/Xj78edf/01EqhsHzFpIMXLysMB/tUZSmFm4FpH0Iy+l6NZSsSWi4eLCUgrA3hF/6cZ4GBBURi7nsQUlRs/oEabUHMFSPEF81F6mhTPflu1jud1uy7KuTd0s1Fw9tq2pqjnMzBHpPFa5XupFIGatEYDFram6GtjhDDOo6rK1taCQuHtaxomNwlTVLAFPiTSCE4hIiCnyrElDjSewYKdIcncgT9LUzfi0SfT9IJg4+DgeR0QGtgmz57YQlCT1HJGbRuRRnkiBu5urKhXi4+TB3Z0DXCoRJSnTmEudDWb3okw1gBGkmiLfHRQcgTUsoOA8D3QmDm9wbo2YmChKZSII6EVKIa8ELi9EBEWapM3d48zfOHbFU2P3vQXjh4Cff/10x/4ZmP70z7MC8Hwn0P1t4hPILhHDH/3pqXNO1jyLG61gDNq7HhA8LIW5uz9UcjckAugJnu7NaneQIPZu2RfaJy1NxLUD62N9JeXUEzg+N/CTDwPZPfZbPN6/i8uHYgW891VPWXC6zjj4rp97fvRH1v9x89kh+VDqnsV6zw0daYbrlQaQqLbfclIp7zDtgzfO/TQY6+ixM88PxlAXT0U9qg19z7/vz+PqQ3+sjk7VeedzoXvtnqdEPuuMOJ047a/OE4CueD28OuI05ZCHzt1faG/SAw7r28qYnbltHjeckdJZ0b+zvD7O0c/7BSBIwrN9kXwK74n+zq3lvtWPR9sRwyepf0nDiOLJE/JUTwpYj4x5CkLCI5o/6X/n2v77yznExotwjPTzKz5XA/DEo7z3cGf7iZG+8XThaeICoGStCKBvbx4eiEFPcMIveX86POy1STMtEDt0zsQRyXYGcCRmADET8yFcPxUDcTLznM8ZcXdie8fA89yi8/cAEjIaQgLBQUGW84AggWAiT67HvSHAWGme3wxVirO0jLU7bamp0BbiCfULXv9Rf/tf0x9/TN+/+LUqUwvfVFs6vDR3JTiZe1NVdW/wILfw5k1ba21Thi7LbVm2TTv1ShC7waHTfCWZqNScBEzBQoAsy1aoVhIqFWBrK9lWOTSc4QAsXJMaJeCB5uoO76DEVeEGB9pmbjAwuJIUKxMxO5V6eUGpVC9SL2V+uVy/XF6+XWf59evLH99ff/3++uVaXiYSmJhVKZOUuc7zPHORCFu1RdPNtxph7bYui7Y1XCksXBFG5oQoAjjUtGlbLaIVYXfzCAdcQNY1OlJ1AI7u9y51muf58vLyr3/9WUrhYAFNVLhcOBDNUl1IwW9mGQs4uZPUOkWdpgznKKUw86YqM4DMttwz4IZETl0m3neSh1m3z71dzkUkOcaxatJ7Pr3ChdiJKGJzh4eHcqCQEIVbC9NSGFOxjYgLFQqCRStEHrre1tDAJLptIjIJNdPt491dl/c3YWqtJYt5ivZSuEzzsrUk4szg0Wma6PpClzk7JKno0nd/miaWEkAlYWapddDPp7qyx4Z19J/xG1MpNKIuRbgQuYiJZHaDiIAEMTuhma7brdbZCJl3rlnLoXFzpqKmu/oNYY4qQqUymNQA8wA5hQY2x+a0mjd1NVY3i4BHqdx6DmxCeIRF9ARrpZRSmUUAjzB35+iqnVBvUbYSZm4WzNZhnowKda4qJJUHC0kwSQiBCLyQRRoHgpxICEFErTUiSm00TM2cgwgyLAruHtvqbiqZcK1UEXHv80fD3CnC4BChwpycguMkh9zdHIgtVVYAEaWQUWE3GAzNTcTX5qAwni+VGZzKae75CjK4qrNbUFdsd5LEoEifBZKEtLTT9YYhzxXvbEr8LGeJCMiev9uxdzlFY1/NY0+nDF0EBYJ7PAo8ENaPGOih8FyV5+wMNubrSWrTAdM7NVXu/11ny78HuL+DWPwAWHeZ5eEgJwgoKLq3Z97jg/tuz6QRgSDhHmeZBy2eFLHRWWhoRzFEFP1XjL2FPsMw95vSTwDJqNWdMZ5O7IIPN/f7PzsoeICReX/cKUWcHuKJFgLdj+A8+sz9cANAOEiwuwOdwVi+eLz/roRPMMAJGu3qAT3aBA9DXuor3VcJdydCkf5a3Yj8WPmIXTc5vqenmRnnFLZOOHlPxQiWHybZjuMeyny+CkWyDqYPZrYaiXj6a3rMiBMYAdqndO+jYa8y7PhMk/icuYi01k50FWN5AABn/YhEQDuH6u5rFREE2bNlD18r6tPaKUnOaAS8Y5iiB9DEAcgeptcBSvevRugGKJc9RSapH4nXxwyO4Eh2BrN9cHQMGRPc0leSdqMAkWSKHHePwKDSQxogzUykR87hpEmnfkrBRytypbH3Y/Ic/hyyACczcQaCM+0sYNrslF8hIgI9+Gx3NY7cFPYFnCpYGho6RsdITNbfmcspIoI8mAlE7tqHwyPCSDh/3Z0Og3r61n3WZtSHcMb3mYgwUZ4fwLuXswgZOYICNhgY8njOR3X2QQQRhd8ZDYg64ZAPPrwxwXJbGRtk7oNjpwUQ3Od6wKPPe4BJzYOCmfK+0Q+gTuABjtMm4tGD8905QGFE5ICTKUUQmAoTsVKxuIR8py//3+k//sm//0bfrzbHhqU1bAa194+b92y7OT/N3cMd6a1/+zBrCGvmt2XL2NaItE65qyeGAEnwXC5fA2LmCCswCn+/LTej1+lryByo2sCqvK28LqSrq23bFkFlmiPi1iwTfoCLa1s1g36DmOaZw0XNzUOJNQogkTGyPM3zlcpEUolZ3UXo+7fXf/56/fVL+f46v1wmCaXgab7OVRhkunkQR1mXD3MVIts2mcqybrVwNNw+3tflzbX99st3IV+327KsQEylFMa2bf/666+IgLlZU9VkOxWReXr98ePHNE0wNm1E9HKpU/lyW1uZX5ZNYXKd5h8fRrJ8e3mxKUw3FlxfLv/5n/9Z6zTP1/f391/+1//drDFPt9uN52m6XIIIwuuyzPxVRMKDic3dzC58MTOSKSLPDZi5MBcb7H7MvKvc7k4cPfnykdOQmIXAZg7vXirEBA9GwA1qZLBVi3UTuAgbM19fW9jM87os5EyM7eMNZoVlWzazaOsSMIpQVWtra23bllKKiKQy6xHthogfhgBRERER4apTxXrT66XIFMSe/iulTtNkjuXDuJR5utYiHtHWtVmIFClCRMGUbujmDhGUYAsOzqy5zMLBqfhToRYNIrnr1st19nh9VZ4ubyumLd4/lohFPeYa4Qay26IAp228NW2tuYPITZsFSZ3F0WxzawpsBpfaIMqyEUtrwj7VWghAyaTkGmFNI1BKrZUBc3CEwjazxgQBqQfc9gNqdw9TOIVn+l3mOhWHmTVzDtQqzWMqIqUEcXh4bMN+JFQozFpbXEOIKV32RTZ1C013I+I8rFu6QCE01W0zE5E6MbOEBwmXqUplM/QE2GASLmwRuimzZ/xPhkBEnmygc5vCJhRxjVpBlZnIFt1sQQueq8gsZZ64GsQDICqEi5QX5zXa4r65beRGMCYi8lAi5oBHxn1E/58jnayIHBlDFYGAa08A2j2E+7FjN77mH+eMSEUEALk5BQfcA8nfT5mIiAzOQBpxbGQK6uIPwwAfYW5pa6U0XKKHIqj7wHJI4gozjwjiAiBZT/sxdkJ6NebM29CXdgZhD/w0wABonB4kmBFQMEkeOafYOtkys16WnWDdrz1bwVlUOlohkTShawBUdmEXEecTicwYTRw9l190nbzwo5d4Z30c+IFpOAdktP8d/u9SEuheohlzhaHM8Ejpk4aGAY3I3bF7AUT62WcvsXpL6LuPWr4pDTrZzwyCZz5c34lTDyUk2Zw8TRty0j0CgD2W3EPJ8989rdsOFkYsSYz5lfaPfgbuRhlmA2GALNJw3M9nUpdwA/Z5TcIjRH4oHjQCUZJoRCLSu3XH+kh1J2AdgHV9r0/qhDvkhEiyfmLqGyMIZSSitzM3S0dIGEddXSdLWrfzAN+dkuxTZO8+d9/vj3t/azoba0/luPUplrN9V8vG+OW/PKa7RNjndfiJ5rrrZKc25N6crkr3KRn3BGHZiaMCjBJndqA7/0J6btSuNY6fTqRgu4vq/TWqe9fVIB9EXk5JuzaW8XgRn9veBcmA+9GnzE+t3Rh+HVlCn5T3Zxf7/bzvxKmQjcNCToUkugrBY0/g0+HXKMYjOGARIwFcLozU8T0t+oahhPaE3sGnfj63lIgy68hdD4977tTl069OI6b9bm70MQ2MOZ9aiMMRsLH4jqIiApBdKQMowERCnI2MsIR3TkmiKGphpuwyobzy9G16/Y2+/+/pj+/0bdaJG0wtMsuummtTVU8y/qMhDtN1vWnbmq7bsqzrqtviav3sxbO7nIKZCFyoVBCDhJndzbWRNwqfpiuRhFMk5Y6Ht811DVMPBdhdLSi6q0mIiMMzisA9mIoI3EjVtMWmsZFreHCQSOHJAzAITALEZZpQKl0q//rt+v2lfL1Ol6nAheAiXKtQeLNQ3cKbZoCvyCx8e38Tisqy+ua2wlu05eOHM+ChKQl1s9ba7XZb1xXmqtpa27atNQMgUo6Uc8gjAK5V5lrL5O296U2XVWudCnhd7B03bdvLpYB8XW8iNM3zNFf1l/f3d36V4GhurTUqVYQSmYkICSOcRCqSN5LUjGMnxBihBacQF5y2mogA9fU7xEyGC3tPvpHrM/chc4QholJd02k9t9M05TCpcQkC2MxIPbyFe+YP1KbbtgDBKfStEUKYa+EItLYShIhMVd3ctdbKBEJsW1s+fK0f83SZX15rrSByBJepZ3dkmZi1rW7mEe4IsIFA8vr6knO0TmFmGg54AflqCO2LlQdcAEsQcSkRTihNVfWiShytmbLPUqxOCA4X860FlQK37hKjDnWoKoURktzK1foRjOX/Apv6an4JDk6LiakZozMXC1EQ1FS1gayUIig5hq7a1k0mE+4ssX1xunsknGd4WvpBnQkp0VuUIl2ieYxTwS530p+UueRWy+GlFHe4mfuRUSFnDXNhJmUy79mUzJq55DFqD+4XhpITXGHu4VGYIJxoj3KyCRwBj9ZagrcEZbWmg1CCbQ+yYA0S5RZTQaGJxXkigCkKqAqt0OrtXZcIdYok+CMQR1r9EopF/m/43HdZABhR2v4PgXgSsrzTg+5So+/1w0Ka9jGOgQo7xYgxEJGmdRcgnuTawA9nJLvbgGkArD0k7FM3cRovAcD3wgg4y8G7B2Og//6gIQDiJ3m9/0nUE11lsXsvjbd0xSAi+ucuMPkUWdQPWGj4N+/l77191y2nUTi1Pc63PVQVwz6Ln19n5PP0eBpAd12CiSKZj84h1BFpMRzewuhjntZYOiOizzwvPunYU3tPyO3x2o9lMLSfvN/TCtzJTLsZu4D9lLJt3HyHhPfSiCgIYTG6rluHsl1O1ufiWVugbrIH/qbKdwNaBh+tPzzRD7xOoTb9w33f7d/zI8Z9nLLnzsWAvM/VTNMXQc7YLiLA6ZaSLUt+Kvl0tu0l7Wox7gb78/t3H6w4EWtEt4bsM/vwEuv0Xklq57YvlFx2Pob2ruEPbzwpmvmuc/KO3YPlPCFw0qOIEmGO/ul96/sOMnr7OENIHoqcIPvbP+3Ac4VTYWA8T9B+QEkERJoN+ikBgyJ5GDtPcCR/yOl1MQobC2D0mCM4pcIQb+cdbr9zHO3cKRV7afeNuav20YqjjUNNfeqJGDaPnIHPP316HYpfQPYzAYIzKVkgs/xALMT4BeWX8vLr9OXXy9fv8v27fKle0HxTg5qr+dq0NW/b8Pm5y6wO03VdvWnT9v7+3lpjuJpytw1w5HbpxCQkMk3TftzkjrYpU4Blmi4596bCtTBCVTfVre15rzKc1Q3eRW96P29bOEGqBLiZm7uCHFCHMSK4UAmSIjXtPVOpX16v379//cfvv/yvP759//bl60yXqRQmR7h5mGloWDNtkcq+rpsm8+H28f4mQkXo468/dVkqIyhuHz9EhNyQdIdmqmoaHLit67Ztt9t6u91a0/2Eus7z5XK5XOfL5XKhqVCZpmmS8q7vET+2tcVlRpGtLeGAt6nMwuTw/Qjrcrl8fHy8XL8JM4C1WaEQJilFJobkyRZRKUwCJjDl2SghWZ9Dg8LTQDgSxpGDHIjhgpcxlJ22A31TO3g5xgboluynEczk7jFiYXf3xx65JOLu66bcvY0pwGbN3dI0kGEeIjyJzPO8rqtHpBu5hUa4WUBCHB6xbWpmboQgJ3Z3KcURDLamDAry96UFERGz1FJKmeZKlRnbtjiB85i4Su0HgRJzbNvWWnP3MtI+DjNwJjqFcVykulREvExwIpgQzSJCUpzY0bQB0dwRQUKACEW4x7YurW2tRSa2C4cDu/0BgIhM0zSL90TOASZikgiKDIOxpk5EVMIYHuGtbet2K7qVejEz9UHSc7qG4YeIOMgDQZGnmMf+P863QUQi0ql7RRhpehRhcrd9B+g6AAiAIbmKKIPyzR3qHsZsVLSgTjLleY6G+KA8CggRO8y01Si1pmsRZRh+0qeuzO6eokm7k8WANUHwEK00cRSUypASMkUEhNk3VSxi7CmYHEBJIujh8R8UmVmIRyKwsYUP4dXB5ec77Zj/HVec5cshXu8ByYEZMpAjVwf5Gb1hxwO0y5QzsMbw8OmMlX8DJc8fupk4Pz6xA2UrO3PA6an0xeAkyL4jtyAismg7vjz3SSb9lZ94U98LL8I4GN8T8Z6Vrtj1h353xMN4BHD4pvykN7op6rFnzlDkb7pxF3k54fkk/c/xAJn3Nu12/InhkgCKe3PtQ5WeOufvFJvHIT7deeoM2lW+iF1fO8cbHEjs/IrRIceXfMqehAgggoLyLKD38CdtOfdpCg46GdZLH+b79uyD8eyOnzmox/r8BBLFYa2He6dyfu5fH0mYx7AdP2McuIybz2rooTaMIXwcjL2Yh+thyM8/7CXEPa0edU+eXck7Bvhn0HnXiM81jyc954TmH73ozhvNeURiQP/PW3FWBO+OVsaqOKHGUwfeTcHHRXg/HfduOa+ffOIcRDWG3rLD+lmhBaUtvGeCPL8k3J1PfRtDHDsiUzGfmkPnTnvggiA69qnTtvtTpB5xWI9O8y3R1Z1uFieV43ncaYQQ2ROzG1kedjoRez8lDQLRqheaviX0L1++l5ev5fpKX8QoVDe1MGcP29p2W3TdEB5qZrY3PyIQti239/f3tN122FQ4YuSKJyJIeAYUcpGSCkC2y8yaxyxSS0GpXMpU5TLViW211nQxa9u2mVlE0nr2wUlp3f22AywopURIYAOJsRtRkEBmnq5SLlIudb7OdbrM9dvryz/++O0f//jjj99//f2X1y9XukgUJoS7ba6bqjWYMIdvEXAy29q2Lq011e1SCBHtpm7bXLzWMterrrTeloCZmW2WzuvZAa21DvUGZjKzlv9rLe9k5lpNJAJRGEXYzNw0KLmGXMg+3t+v1wtRMPO6rhH05cu3j+1GRLXO4LI7NGawAFL7zXP7capLwlmHLm5HNMsx08Z0O809GyXvG8IhdQZmOrYs7QGdMI1wqmUyqdrWfqAvwqAWJsyU/ulhAZWShKc0zuLTOZwzbRQRmZmZQbjME4KXTbsllSRjynNKkBmLMNBayzCjy+UlCMxMQgS3ti1qvFUIlzoNH0ip8yQiAchUCwGSQdLk7rptlojRY0cZUyk+TYDiKszK5sxWSgkyNdoMpViJcIdj0DaIMGNdAizMPo5eEQyirKwwl1KmWmspLoiuAARZkDtYnHrQrrur5XlO1so8zEJMHWbRmpmDgzgTQLjzkKd0JFQGhgsKdUDAp1E+3CSAegb9fSyA9MNKULhtWy72XX65uwdpOq2eREYqWvv6zTBgd9MwZiGGCJdSiLozs6q6mwi7O3eOuz4hC5KsycUFlSiIC6oUJwexE03kE+nGwaSpOLM7BXh4oO+zOVt00mm5u/jf7fY/3cmBOxmBO3PV57bQA1De2Y/i07fs3wuR3svlXshYv3l7/oifSOodG5y/oaHh/wRWHa/LygxJSqcS7oBZCubPXv3J58OqeA+On3v+Gcycb/uZfNxr8vDrzzr804sCIKZTsrR9PzxXqVemC+y7GJKHgXtu2jNe/dn1XPO7Opy+jMBhDrg3I35ajf2bu1Oo+7G4izkcLB37rPj0qePxoSdEZOZu4I6Zlc5w7rE44N4Aed/gh58i9vOLx0buoP8ZGdOIbd1nM528vU+TLGXVU2rBEyD77KdPv95H6I4cE0CmcMf92osTFsfjskFEP9pM5DqCM6I3I8moO5/wEfKc9Nc0tsBMd/qwIOngAHlchMxHp+WHLmZGoA/Rozb3oACg88jG+HufBTLuCU5vy2ODSB9GdgpmRoqTzKkU5Mgou4AzmCI8eYv392brrHMBBcK72302gVIA3M2T2M8KTj2P0cM45tUBqsa7fqLZP2VZjrHX5uZyrHPvBMh0KHinXfJpXsXY0PP5IBgi6e0r5EL11+nrPy+//jp9/YLrBdM1arHJm7sRLBhEat60Let6W0qn0U7mN48IVXWzt7e3jx9vwmDmMKNTSB8RmCmIIlWvUus81VqZCWGqoerhxNMsdUaZ6jx/uV6uVWDLcvtzvf1ouq7rTVtLP5/BVtqhZ+5BwkEyMQuZEIkxnGAglKlcXuTyWi5fpE7zdH25Tt9err//9vX/8x9//OOPX7+9vrxe5ctFBEoUmebULBTmtl6mF23e1nVrizXd2uJtI86556GNY/NtXVaTDBi3FQClJumhW1vXtrWm6pZRYXWqc7qcIp2CkjzVPMyjmfuyBm3LshRGCNb15loKuzAFWbiXIoBP09TURKrUWiYXLtM0BRVnESkECQJxMYeMJebuwRRMhTsr6lAAcm/J80wnYmQAZGT0b6DHzHiuwThde2DAMavJAagqc2EpQSCiaZrUJt96vOlUWEQsbe0eEXDXDFaPiIzzBkhImvmyreumxGyIVZuGVpprmZdtW9eVArXWaapE4o7isbSFmefLpQCtrasHFxEiMM8zT4WIJOk3kwyEp4kJ27Y6MzOF2aYaUhTBQKmFWSiioLuPOGnSUk1SggpDhLdpiiorwogIGpNFhlbM8+zMAG/NzJtpuANELLUwMSGYVc20AWCmZdMvMw0jQkQQi9Q8YVUPdTcnT9IeImKYuzU3leqUURLW9UzLAygzYWJhhJ9iqRNERlpaKeDO6Xl/6IFO7tEs1BGeBLgAC8aK28GxheeWGRGqRkSZJTpnhY9YwzQN5JfpnDbSvbVQG7JDEGwaLD01mIjk1M0ptm2bu1LUiKhV9q2vMHFrEe7GMOKLSMgkM7MH0AQboJ34SbPJFAgYkiOf+mfdg0eJkniXPAHu4WJxj5Y+wV6U+SSesFSeYDxu0Meqie43HYHhjY2RwqhbJAOIPDULDrIugjk6t2Zkovs7vDTkCHDkZ8UeOdYrLIcgOy/ns1Eg8tybdndav7O0CoY8yqhkPmR6dx/f8RzRboI+5H6qeXF29o4TZ8Yd5wyIKPp5Qxb9iLLOHqrnIdsz0d6BxojhsoJDeYo8K8hO2pXE/DMA8JEAOP9loMOoLmupG+MAlyS0HRIeQ30F8XkWRdc5iX6CG2OfIaevEI9+AUffBnV88RNN44zfTprbHU9UNmaPKqQT/smDv4zLTadrnM6pqOctfnxdL/OsADysll2reF5Fz9cz/DrV++6GHbDdv2g/aiA6VfbcBdkMOiklZ/X0Wd38VHu+f90nzcAICnlsF/nD4/uvj/N4H5WTab87GY+UPXSPwfPLO7efOwWDdvS//9rz5ezG8qc+eW4vcNdFJ1h8Vg2Pnqe0Vj7N0RipsO8XNiUXU5ecqXIQ9Xb1Fp7O/j5TXeKkr48JevrPPeHPqSuOD3uV6PDLP826p7n3ydvvB/Rnt42P8aAA7KsGnQTq9DIm71wTAXMyn7l8kemf119/r99+m375Qi+TVTYRF0SBGgzkQQFT1XVr66aqudFkFLVH+t5s2trtdmutOWPPwKpqadVmLsOnhEAiZZouL1wkdUtVdQviymVmmahcLpeX18ulkC0ff/7153/9ePvX8vFjXVdVXdXc4CB3p3EKF0HEZZooZDKUiCAuTuQUVITqhaYXmV/q9XWql69fX79/vfz+7fUfv73+87dvv3yZ5hoTmiAYTg6QFyIwnCzcltsPeGvL4rogItqq640o/tWWWpjcIuL28eP29uMyz9NU27a6u6XH/5ZuJGZmq2omWBVJW/Xk7lwETK21GGl/1qa8qSHe/npzEAXatgSxMxWmRvr6MrXW3JWIWFKP4sRSRSYnYp5KmZxg2oPbIIUCafJJLE8sfV9It4qx3T8s29Osc5F62g1g1ulGUgGgVIf2uUnpYjR4QnISlGKlhJfWtqn03YaJNAxAYThDNb3/c4cRDyZiNStllspwLxWlFJCsq22ra0OiRACJLxPyJrmnlZK1FJWPt3ep5eXl5fr6tda5B8gVCfTDkLU15kIBEVm1WRVwKekaL8wBVBARPJzZqLkag8A8ERHzFEoU7g4iW/y2mRD2HWnnVk0+uhQlFBLcdyF3aIOWiAIiYSoRZOpGgSKlFNOWS95DxzA5EYOS/EdrOHdHLcvYC3XkWZlnFMi9EW3f4fP0RoqcfwLgI5tB/9MwYD27u52O79PVCD1McPA0EEU/rDs22/TWy7eUeerpgSMsVXoSSS6Z7Csz9KhQ5KbOzKpbhHRq5+jOt4WF6x4jx4zCwgIWsES4hAJK1qCbmyoajKJrL7FjvlPmqi7sMgCMA94p1HYkcOqrXchS4BFO7VJvlwXP16eSaF+J++d9vACQM4R3HQEn4N4rf/feO1n/jDw+lWW7j+LjbfFJW/IA51zVM1A5v3R85nDc+1uMueTx8E3GAxA+MbB+ej0I0Oe+PWOP8+eflfDZxeFxCs+gc4ccjwd362Gn237o0hMU/h9fu38aTggwInaDJYDhRXao39QdFw+saz+ZjUfl6K5657vPA/1g6adx5V73jHUe2rv/Wc5n0GOldYUsG35UiPqT50m2F4fAXoO8erHe9enHRsbd4jkNXjzUJ2i42o07+/dMQJTH0NJE7R1q7/2CoYrfVeUuv9opg0EaLJJoO7Xm3u9H/fsekJQ1Z0K70Uv5BVGntSEks9djvPK5hjnJMo51v+3o58zFTDTMgejWqLFB7O31NPsSIkwgMRwOR1GO8WjcjXXvhvu39v05PSqwn2DF7pMcSGaD1EgDacUUIuu6QMTDGVykbk8Dn0dE0ob2xUS70o8judt5L+sV1KqxtAABAABJREFUuN9E8sM5kG68DkBPzX2+f5+rpy8Pz7y7OsOzv3bPbMRxDvC4EHbBFhGAC1lX/ZwhheS3+vLH/P0/rr9/55ev9GXyiby4szmZhihCzdTMrK235eO2bRu8y4UgMjP1tm3bsixt27bbQvAIMjNH+v0akYAliMGCIA8LZkgp00wQEk6EAkCkQmYFVy61VqHQ5ePjr//++PFfH+9/Lrc3c1VVswznz4hMQoCSCpW41ElR1EIdKLMQaiXzQnyBzCRTnS6X6+v379//+PXLP399/ePb5dcvl9eJCrVC8NbUjSOnmZtuuny0ZTHdmCyaRmgVoWimixCRbQBZ25i5UjQBk2tb1+XDNFRNVbXluHCtswWTlMgjC1CAWYRAFs2CCGSgtRlM01NkWZZSyj64TVszZbKpkmpjhplJIQDruu4+G8luQSK51qkUKROL+NDwwcQ1aV6STRJEkNzKusLcSzrWvgOE4fsRzAziXfhFZKKlIU13HjPmtm7QJsSWrjiqpXI4Lx/LJtQdooTNjDoOZjMzDeIqpZrFbbGp1ECZpokE6+1DylyLvN8+lq2ZBXEBQy3cmtKWnMjzPE9FyM2bSy0iFQBXUdfl9p5KabNwB1iul5f3t79EKjGXMllbp2kKKU4gCYcrnGzKbYIZEVRKIRJDMzNKKV9cVOdKfp1CWMXXiIvqGvPqGynlfhZMXMSBgBNx6sgRESSB1gy3Db+8CAANb6pbhjGUiDL2FiISKQURPfo0ApwKF8xd3dXdhlrcL3e3EbHdt5oeaalmLSKIBKix53VK5hAiH3PAEG4mXS9jqHdSkb59wT2cIjyIpIsP4XByQ0Q4gaNTd6j5ZlrdpvBaa+avCHYzY3URSUNVTo/MY1dESindRx8Bd9UNcHiBh6uZCAHslYtwTGCIM0dlD5FOHAh2c3M4QsnhhCDOLdIpMk1Y0CBGCUQEB41dZhch2eQjt8zwHk+RW4Cu/e4w4ZAa92LikCP3sGH/nO/I/e4ZrkUEwDzcRHFfSFJfOPG+ivmc/KiPWu6cuUedi+7nCclyE7tAR+wegzTIPU8I5JBTHUVgDwg8jMd3Lb3XAfa6o+8qu4RlAJ7cKPs5PEjymL7z5g31b/TGg5imfmCFuOf779pIOJ2MIEeTicaqAZCfc3OM2OEWnd3o95jMoSUmUCG3rsactKwuxRD3x/Z0h9wer4du3FFuxyx3ER3nHuCzywIR4VRC9z7sHSKjIT4Uht715woAyBzV3GN3MyQfEaBI4qngsQvhwMbUlSX3YYPubvbHCQCdsOnzaqHDBs9ntWR/Kk7A/RynuBd4Luro0KN+o8BDbbpThsakPN7lnQP0cX73pfWkIT208RiwuLth1GIv9jADnAvc6/PwU7pJ7B5aORZxOrI/l3aWFnEIj8MScNeH7iAfLgEdRT/0cF553DnW092ve+uGBkkAuAc603k0H94+vqTjy9F2As5szaN1ffdxRO77vasjgs4KXY+ZRuRBKh6uk7T7FGo/2ku4p1ml/ZGxOMfrnmwPn675/XXnRXGeJHvF7va1c4E5e9JrmFwghfAq0y/zt//98uuvePka16vP4sWiOIoFTDc0j9Zaa7q1ZfnYliUnj5vtfdtsW9d1WZZtXXVdazn2UFUNMy6llhoEouJuTuzhHunPnEIxo3ky4ZK4dz09fFN7225/bcubrkt6DjixP09+ojAKFkiBi7prEKTOl0uEQGWN2qiCRaTO83y5TN9eX75/vX59mS41KlTIJuHWWpi35B8Mc922221dPoQdiLZ8hCldKrlWkctUbFW37f3jXYSEuZbC4e/v7+uyMTNREalu1lqz8ICXMoEzPFgRDGEWmYus62rhDArwptZUTXWgahBRKUXct+beGrPfbrdS5HKZLGBmqzYsC08v2R0ezmPhGKKKyFSpCJlz6YzvzLy5OYLc93M/5uT6OCb53VwNuDWPHjaQ9+Sjd5P10AqCKLQ1tBXkCFvXG7XlWhgi6fhkrmYtU19JoXAyM21uEZMI8aTb+uN9uU7hhFpKs+3jY3t5vYjw+9viKFyFA+56u91UtRJqra+v1+v1erlccs5c58s0XZo3ZlqWRdVMN3ANt3CE+7Z+NHMmmV+ubrZti07T9PKqpiHCzCpirLvLSiCkFi4UBF08FVISdgvhmKZiIl/YFrdrmzdwC2oeN93IwBCycDdX41rCGqwPcSlAgzsiwjRa020LtmCnIiSMWZgYpYC5eJpCECA3S9+6QGYqVoU7hcPSL646NTPr3HwxbALo0iEXcvrRAeBwJ3TCp5P4i8E3XagwEXBkNiA6kgsD0Dw0oCRhY0MEgom7agGYmXrkWU0ppdY5Z9Geszl3zswzwIxSivTA3DCzy1Swuxd25Nldm0qxgllIxCoFSRAbS5VSSkEREnbmgDCE+N02AwLh5BHsg4DhkIAR7sF7pGeQD77/s1T92X4+tuXPN/xDKJzk76ci4Cw9n74fUuC083M/bnoUmn9/7ZXp1UgL2y5YqUvnDPw4t2J/PPCJGDrKf0Ku524Zb2fAhgux7PRKWeZPLdaHlf0eFt+fYOw/8dM3+1twwnj73H6OhciXHtXLIulu3E8Vz88SCMBH9gfusu+pWz7tvU8bcn42Is4+HaMtwGB33B86Dnbo86J2h4nzED9IhLt+7rceQ9DdT0599jC9H1ZN/lnK2HX2cu1sBx2rE33Wn9W4+4ZTd4lzj53N1MwBZ2YKuBkQzJzuj8IVx/ABGHodsXtY6Bls9VglwE6+aLkXjDSCo2JDP97doE80OLSPBO8tuu/cNEoTgsbemqXyKTvBGNK4rwkGL38/8giPoSXLTtmG8OElAwBJG0dESbZ2Tu/XN2UqGOXTfUgP3XsN5rM02rzf1tubsQPDGnRMi8gxJhqnE5E2y/5rnmCQu1epADpD89HwTA3tg5CIIkKYgyhMM68hA9yZgsM6G6mh23cITAgRDoqAhXNnTMTwbODTDM5pkAPs/Vhm75wxgbvl4LwsGcA4AT9EbPrhOgGfBZnJSSDRmO054YiIuuP5eUo8bRwZrOTKTAKZSL7M11+n19/nby/yco1rsYJG6V2vsE2jbepvb5xEhdum20aR0b+NmW63GzPXWte1/fXXm7sKs4ZvH9vry8s81/f3d1VLSu/WbL5cImjbVlWXUpillAqQmVPEtm3u8fL6Slw23V5qnaZC1t7//O/3//7P29tfaq3W2sIBNzNVB0kpRUgCoapcCqhqsIJJWD1uS2N5XZ1aEKQWnvrohFP4r798+f3760ytMgrM2+LBtuUJg3nbtK1tWbStCCschQlwD21rXKYK9x9//uvb67ysNpUK8kIchNttSRBTSgni1traNlU3jWbmpFREpBKxebSPJWedBdZNEbE0ZZbrl9dpvnx8vH/5+qUKt22jjJ0nqrVGZKwwlakuy/Jyfa21Jt1QEd6WG5Wp1m/ufnm9oNZSpvQ3qXW2cABcS04+YQKTU4ykF9EFr4i7hjsjduZhB3Nav4ly8ouIDQS5L0Pvfuebq5m2QsRw29apitB8W/5s0a5zfbleliUJ42nbtlJKa41IttWXVa/X13B5e3sPqoHy54/l5cvLj/d12W5M8rHobbU6fy2lLMuy3ZZl+djWm6q+zlOCxfe3t9vHR7paudk73jzCwyJCRCrNLGWuU0QEcSlyuVxqrVKncGg4waGNuUZABORxs9XMapnneZ6vL+rGVOo0US2q2ppCtxFnjUIspiKYZnkhel83kZjniZg3NagEyWrmprXWUmpT1/ZBlNxH2Jpbnr1pUCkAWmtMUeYJfeknfuhCZJomLiIsRDDTbVsn3erltZRSzUzERZgIHmZqqpxuKgwATujbDifSiUC3WPlOjkGs2ratRQSV4nnMJ1XkIG308HQK2iWIh2+qg7oT6gbA1LoDAzGA27qISjWfponyjRoAXPpZUyLD1pqpllJKkVLKUBKwuyGZNyJyRKG4xsSE5oalAVxrjS0mEikAnCSK8GUrZaOo5SO2JL9CwDw8oieNARF5UmIBQRnQxBAS4X17j5EiOVvdPxBzT/tgCgzlYUiESFMMJVV7J8/OTM3J/U+jzEDqp570u+mKbj5g8JC5Z1x1hMoR58HaIaCHKVAgeeieMu0I2AMPnaHnT00m0BhELQFQkFtaiIMK7dU4ucL34/L+3pH+CUSeyGy3AVP3WfcDqWe3SLPY3WYGfkhHtm6NPlAiUT/5x5GLaKAFHybtR1jcM5+Ntrs/mlZ39BIHt8FhcXsIciWi7rIRvVa2j0j3jt9lOog4iHpDBrRLP9iz6KcRU7FX6YzFz9EdAxkKc3J83Bm48wazxBvHfADYHUlbj3325mfmkTx6pGBCMtJ39ViG5hkD9BwuAehQNp23w7XP5OzD8e4kBUmYGdGdDN297Nh6b8C5JXt7+pfBoEeb6/m28/3nP8+30b0P/dEdu5H4szo8lPPwOEYh+8XS2WYOaDgWHwb035m/jnI6oju7/n+uQD9X7Kye/ezOc7v6dO/ddRRFJ9f/A9PnT5CkGN0fP8o5DcvDdPzbOp/+/fy481CT4rys+8WI6IH2kWvcEEEUycC8P859JKxvPN7zpHQfhFTQ0ePliY+p8HCS45475DM91dGr+d9T0wJALviHkdl3nP3fc+v3P88/9WLH6jrNw8deilTKhShoknKV+Vrmi1xnvjCKK6wxVGMT8+bhm5m11dcttCNaeKTVVlWJuv7TWlvWhYiYi+qW+4C560FxmX1YiKi5m5l5FCIwuTtSF3UHRZLWo5RCDGGmcFt1eW/LD9/WsAQYyHwGAUeEmQUHEUutQWLOFtBAc97cP9Tb+6pUqc5cS5mn+fLy9cvl+7eX/+ufv3+9zoX8UuJSmNy13dTFm8Oznet2u7VtYYpJ2LQBxKBgloyjNSei28fqlkEI3LSta1N1gGudm7n71tRU/faxbttmEc3ZhsWOmTE88qdpiohSKtdCqWlzkWmyCA5vqpkZ0dQ9jODkNM/z9foqslGRdV095GXCtm08MZMIRSllmiZjoVTC+xKl6FFzxMyd9v+02XZh6/qshYLczAN0WBBGQw4pBTtL0MopwpzcYeqqhCjMpi3nRyEGMRHyP8vazBKEkiM2zUCP2JpNTpXFIaZqHixRWN5u79u26baaGZGIpHKif/75Z+onOylQtuXLty8prpaPj9b0crnUOgeiMBGD4dY2s7Dw2DTUeLpyEfYJwmSGZs0Xd5/n2UCr28CJoFq4gGizdBlRL0VeLtOiboFaMBXaNBwSxCQgKYBvH9o5UyOS8dNjZUMpLFKYOZIaX5hFWLiT1QxaBwhLLeyII4AbYR7mqlvbFkQFwAxJgEskIDDDMz7YcRBOBAANZWcUZibyI6Ywz3x26GODaHpnAeIR4JFeZcn0NXLTeNAx5fL+iEgFIPeB3KWEeEcDpRSiGPomYRzpdsFYu9/pCAseZicEuTdTuE1RAITCoAJmJgYZ5e5ClUCVW7yH0+ZtM8sjuJT9aoZMWuQd00vASQrDBhFfDO+AAwCdhOO+9+5S++FKWXC+zlv6/W3Htv+IXrqjxflmot3E+wmI+hwMnJfz/qWPlCB3kuh0qnCGPX+PSc5MU8fG4qmDniHc+UU9PcVDPZ//JDql3T1DCN9JRw5k0p/yv6vt3uQHXPcZED9qG5GhvPHwPTCSViXBIDPQVY5UO/fYCfxtlx6VP0GF55o/ffikdfnfv++B80tPn7vpc/8mrzRoPvfSJ0LkVOzD5CeiksogMXcVkSgz1fWofLpbDH/TgOfrob9o2OaRPPGjBnvJeYThdLzo/MF+slzBP2X7OY/f8f1T7utcD93iC989/nHWtM7v7R8Y3ecvaGhm3b3+oSbp2JKZjPmxG3dnlYdOYyoHZ/DdloTdwNPV347ST/1zLvCpPqm1+0n3TSME9fYSxXA+65YDBzCOanmf4JnwHh4j+RghIN3bjHoGusEZRV05gPdiE+93tyge4+sezJ0iFkibxN1Gdsz4+y/P0wmnRTj6Z+c5jnNXo/dE79jxi5+Kyg7/ycwfkQCnLwI7czOACDEUogoU0FTKRBVR3cWiNoe2iLZ5QwRBPdoabct41ty2VNvt9tFaAyhx1bZta9tKKUC0zSICLBqIbTN3lgoSj5B0v3VvzTLxDkHCqZSJqTg6LYm6mbYASy0ixKq6vulygzYKMsPAjSAS91APIQgTcXGHBTaPFtSCNNggThXlWqbrdPki8+X1y8vv37/+9uvXf/7x9duLXGrMTIW8bas1hTsC2rZ1XXXt7O/EcPckbWQQcaTrs4WLVF0Xsz6JTDtZilkwS2u6bVuAw0ndm5kFmcemqm6J9ipXIgqCmQczuIAkAPWgAHGJgKpvagyqYFVPah6hIrWIyOVy+fr168fHcls0wtt6k4CguGuhYKZgjuTZTARGHD2dXBp6GD3jZucS9xMBefogxVC8KTgswJx2yhjZ0I+5F50CtCeghQMh4aoatpqu2Ba3FhTlMk3CVCoAIwoPc2+tbZs2g5mt6xqQ1iwQFjG/XIP4trVmPpU8U2rb2kzbtq2ujShKKcjKuROzuzHTYDft9qqPt495nkmSYHTTIhGhbut2Iy7MJZkrnTDJZK5Ym0x1nq5lqj1NFRPgrTV1ax4BcJ2kFBYBxJug1OKmYReZqM7gInL7WCZ313BbzLpxIZopc/EeYktSp5I7wradRClROoAJS0Z8Il13hoBidmLXg+3Ee0KMjWTN1Nv91pOgRbfZp87GAfZIdoCE5gYmEQnvuR6JC0hBkrclNXtu1BnoL4JSKxFl6owIByUyc4eHh4hEKnpB6sepEZc0hTQAVUpEGMzU3LWUQt0MmXpyqAZHUIlNSEQyhtzJyUlCWMRdzVhV2SxKWCg7e6NO/hBchbjIxNdrqQWThRRb3mORtrBrQxg5UfKGoluKsB+w75pSEuDEEFNHLl4EfmaU/BQin6H/p/fQGG8ATp+UQJQwN8llyM8hobnzJ2ltnnInH30nMjlVI7PCZSO75TePjAlE8MO3JLeJkR2gO+5GYJDn2SOiIESeww/49oDEnqTWyfJ6d6VcH67LNArrg9IFegcbRHuStTHf7674qQLAuyXtBFLRMVXslm88YOOue+/+vbS3Io6OisAeATmojVKon4Kee7neHYYfYyoePp/B2MNc8lMbR1uOnhxbAY8O302GZ5Z2erJRIiL2oCBCQqzdaDvKGOJgj+G8L2Q/MehipGvKQMG/u85g62+uHeSdVYXcs54gF/a97PyWrgz8hK7rDPJwWsYPC3gv8yG4ef/X3R7u/BvF5tNX3LXx3qEwpfzupoYTAI1hOSYi6ux+SPQWT5aG859xrxzzw2p/cCL83Jj9yUVjiz/3T3bYuajxxd+U1g8BaDfnUD/PTbRPR7lewBZBIPe+JkABikhmyx4slKfhnT317PO6F4Qn2L3XOVMa7TpSYrD9tvsePrr6vtOO3n4YiL2X7rbP/mpPjPDUyQGn1KaYuZZSvQiqGaghmsWq0AhztyBtmUAty1TVZVmWZTGz7NVMD5T2v4jI2NwiFBGbO4IyxW0Ke400/zuXkqlAveexJwAiBGINbUpSKhAR5rro8u7bgjDycCdVbQrNZOycJ8ESxFszI9k8Nqct0BIPcKkvvwRfUStLesLz60v57ev8WulS8DIRm623RZebmRXiTdvtdlvePyK8Fi4ykalqKyJNnZAozskNAEsBVTVd1y3cicKcmsa2qRCWtbXmxCAp8/UVXJp6WxpOUUlBEJGRcVNCG9JBglVEiOLlUgixbDpJobQ+wtkREdva/vrrr9fX169fvwO8rD+2bSvzhlKhi7Y1ZJXWoghJ/WzJ5FrirrafZMe+m91vJl1GMDMnLHE397RBZlZVePonWIpK8ght4U3bza1BN13f0TaLkEsVEbNw93A3CzJtrZmGGVnTpk4yqbsFBfFlvjpcU42qNYjdsTYtQsTJJU+1MMHJLXmuxwL0cepNAJZlaa3VaUq9bt/xmJmEmUokH1+wyla2Aq5lLTHrdJmpCEsFVUJoW9XCiLhnWBNmQRDViVCJ1akVRykU5nDfvr5QhJmZeWuAq6rq1iql30VP/CQiIRLSPdpVyY0zUJ6ZiUTHUXsSAAQ4iClkpPIlNwMUqqJK2xbwPK1yd7PmZri3lR6QKMM6hfiQDhTU9SeWuhtxc9kmq1OPIx6X7wYepgSPYIJ1TFlI3NJxorhrt205JQuQqlL0owYf1x6NfpakahttISIhORl9D0oJteCMgVa1BqVeZogh3CU4UImDLzJBpLEUmS4hbyE3XW+2rlAzqzE0n/76nsDBPYKcBi3pXqUzqLir8GdAc+/wODb/Lt38BPieFYM4lQCAgp0oPoOGTNkz7N4DpnKA+LN427+5HAPaH9XoJq14OoHfYd8DlMLIL7Gn79x76Rnnn+HHgxfA8ya21+fzytNduO3/5Dpj6H3r6zD9M/3thIWGaXL8MB6/N4bem8kJAvLzS39WmYfHH244FuDwoIlhXqQRw3Ou87+FZA+/7uVDnt4+rAD7tD9vCD2B3Wdl4tSl+4iX9HVLe1O3Up/06Rg0Of92UB9G8fyOcwv3hcd30d+HzEu49twdGDP4YVD9Plj2qMYAjg8OTg+CFqO79jDHYSoecVoUoBEKn91/V89uGkLqrMN+gNyLQQ9LavinHZoypbV7P3aN/iczhprWTdP01L04i5P98G6onjQg/tGZZ50nk2r00JN8eXZXh8x9X2PuAb7DJEN0SKxRjW4cG00OGS5JuSUP1zYAKMyOPK2m6FQG4WbMNDa+vvyPPeuz62FxnkYzF9vj/TsoOR7Zf+OfHlCeZ/W+tCIiN9ZzhofzEfCZGS4QHmHqFJhKeaHLF365xKW1ppv52qIpetJfDXdTJTgYZnq73W6327ZtAEo5eZcG62YJWSIAEg809Rw6DyRXxI56E/1Hz+ZFNmycILmZN1eZZ4eZa2yLts2tkYc7tLlZtKbqzlQ6yaODIpoHhEBiHovZCgmuwVPQZFTIALIp/GWSb6/T9y/zdcZ18sph26bb5g43vG3Lx9tf67qmZ/ZIbATA13U1U0+zr7swRKSymKMZr82tdX7G1qIpNs/kaXCPWnm+XIgLlq0akhCptbZsjZoyM5hrrSQeQeows0wSzEy///FdENu2xQRIrM0YKkxYNmY03Uo5iBNaa24tTEnMtq3ho1wX4qnkBp1Li1PHDfKAMIiCumI89j0bEwcEokRjOb0DyQjGgEX0HME+SJ6JkJ5R4YGg9NjSRqbRNnYNt2jNdWtmWy3aVlVL5OfJP29oLXNXmcGLFGbclgVEHiFTJUEYbuuSyXJFah79574qQkwMj1TSRhIxTkaLzHhWy5xMsrVWEG3UprlOl8s0TamtmqYem8RXNk2kFLHE2hYqlUXKNJPUF3AQqtR5qtNlllIiyMx4emGEsLp9tNZgPoVPpL9eJ5ibuilpWwLSjLY6R9uy/pH5cr1vyA7e0/cCQFBEno+lfDGCDOdDgvCexNfdIzOombGZakOkp7wmgKVh+hlbfie5sYCrl8z3ktsIU/pT7/vPDlLTK330vIjsUYb7NniHXiLCLYIzjqSknW/bNnfPA94s1mADWwPdK7gPLnNnnQ9YGgIA56QN5MiGS4SbiQkiQq3RCoAQlWuAzJI2GGTEVsok01S+E09UXmp5xfQXfbyRvOntpq7knVFmuOh6RCaCPImvAwDgtPn/zdb9DEse7tklDn12W7ric1ce+PjyIERJAzOB0k8yz/3S77+b/vc776udEiQlO48QxVExOiTOmdSxf0W9GgD8xILfyz/gL/zURZycKf0negDQJ/Q8KpmcwnR3A7CrJ0NNOwCuRNgD9n149vOrh0HtNyMCdnhB72VERDAO9hvgeJD6SUK2KONFY9j59iqlMp+9Tcc3e8/1Qu9r591S4O445gncw04+5AcEz6zh98raZ0Dl5/1xvjzOgcYRYUmLxBzjNICIxulw//8eHkp0UCHv1aBTncuBIPdm/K2v0t9UGidEvnupDoYZjIp2vPmzEvZ1uFfpAfc/qwH7/ecPDzxC+7/Cz4qHR0T5LINahHdnsqefzi04v/rhqGsoVzte56MVT5V/uM5f7p/NjzTdNBwiiWjPYxBDzjz3yUNRRIEeIZ0L6VTm/TEOEZ3PCnCUPG5AdhIT8hxgt7XEGXP38ge5swXtlo19ptI9P9o+P3GMo0dEhuGel9PeJ7ifGDs7711z0kyC8+K6ux4lAe3L6JhLPgJWPi2BiJzQTEuIkAiVq8zf5OULXYuW2DR0d+pwt810c3dVZ+YgZJ7aGGFP+8qKkWkoutgi6manAJFZuOthnwOSRwXJ2oEgIqYSHbjgdvu4RZ1eXqZpirC23XxdwxweYQgNszBzs4A4R/EId3VilgIuAJv51qiFO1yFbbNgq5PMtX77/uUfv//yjz++//7r67eXUsWhzXRxVwCt2dvb21//+pcIXeap1kokYU5c5lnyFE3Xtqwt3JkBtDBnLuQgnhzR2uquEQQp2jYLdoQF2PN0ntVD6sQls8Dy2jZ3twgB1K2wODjC3GPdtnVtIjS/T8IZMs4QX7ZVGFOhCL9GJbC7f3x8fHx8AGB4mFH09E+ZqlmGQpjudCNDDcW9THj4c5/lZ5MkyN2cUYaqOdIiRWh0ckC4e3g60ZE7u8HNdEWYIODB4RZtWT+2bTM90lSR6bqu66rgzAfvImRha7uBuDBqjn54oQLADQHLEG2OzImUzMZERCwcJ3NMDEuYiERwpkvDMFwV5ojgiD6PuBIRWJBQhhkUas20ZTi1VL99EEupFw5z8qCkljRz88yP1LP7ulWJl1IrUwSZ0tpiWdXcGpdNyqZNRNQoNL3QnQ+JNxAeCZBppd2tESX0D87cBSSEEBGSykVgPVgyujN9RD89U3fbRzl9djnNHxmZY4YTdOhzgGmnkxoHHdw9+CPSU7Xj9ZwvJ4CrHb2TE8LD4BwQEiIIRURl1j3477yrdJ6lOIh9zh7SGT6YCR5TYUjzkJkxqARBnNRdGuAt4x9EbGSEdMowYMpuvAQVqRfIRcrEUqVbOG+2qptRRMCSG4IQARHJKBdP59QRGrGvnhg26Q48Pt2Ld9mBXejnUwdD3POGf4eZhi9D7CAL/b/5XM+8zod87yXEIShxEkwPb3mo5/M3xI/y7vz4nawfP+3fdGkVgSGd95If7vn/x8W7D+25wj8N2tujax6+flLzeiXvi3nowDNuRE/ldjfi++e4H4u9ELmv6QMQfZgSGR4X9x04Pvwbi/nfX30/QWTGbD5hyDj5zux17QuW4aZ3zDo/H9d8RRn+aid1ORigM7XcAHOfD1Wvyphw52+AbiPH09Tve9/T/emwlQ7k+Y2dFIP7V2YTHvFl14GeThJGNfpC2ifovmTRtc8Yw/l3igqfXJvOnUwD8edfQB+8O+v7eIyezhMB7JvYPvkeGvjQqP2e/5/W8B4JsNdzR/M4RRQk9mckn0BaKoB9rxnQP58iHCPav+kcAsBw52Tq3LdpNqHT5giPZD/Ik5R8dd9Y6eQ0dRhB7q4xvp9/z3wEAY/xPekVlHwLx1N3fZ6zgpwImdg5dZVzJfikWOYHQxiwkM+1Ci4v9fX75esXeb00wc2mFdYQCjOHqerW2uLubTMSdvdt2wIxXyqrbNumeaQbpGrbqtEJ5h2UlETd+8fMwjNLFKe/BzMXljyiqbWKVCIyd7NmgW3bTKTMdX6Z0d7W9batN2urbtu2qaprywQDRCQIdk8fLnByPWVQCxOoQipzbZBapteXl9//+OU//vdv/9d//PbHL1+/vNSCpsvi3mBuTVV12dq6tlLKVGSeLrVWCqgZABfM1ws3cvfNFObMtG3b7baEo8pEFAEhnhD5kEWGKTMKhIhWtdZ0jDgTF5Yo4dmYHLFSigUN1CS18vX1sqytCLla4wbFtmktKCwioCJciyH++uuv9/d3KZcE+ggLZL41JwoKU1ViJ3eR7Lhjao3lm6FXwL4/3M06H26EQt1o0rmt/LhylH3H3GnsIkaEu27kRggKAyM01tuybdvhCBvRyVJNmYmYwsxdPUx1K1NlDo21aQBcyxxB6+22re/X4kIoImnZMTO4uyvBVTWcSinYjSbDQlFrFa7oqclylqbLXFqLpNQqXMBiQVILEak6zDM7OhHpulHxnolCQ0TSd0gtU5EoU0wkXuLVSpmlBUWIKb/f9EdpW0MRFBYvxSx5lpAZZtQDjtSJ1AOoueG4mbtGIEIzZIkhjChMTFaTI19EwB12u8OMg93D1dwN5hSxs1gCSBJYs0wWxhlC/Sk2yh2Py0TqpP1owt13kkgi6r3hLdWqfVPjcYjk7gJ2g7qaWYBBAkT6h4gIMSyUPEopVLi1rmmkyoHBnEP7CadnPgpiZngATgVQU16FPGqBsLs028CplDGcggLNiJRDqkUR1MJME9gpVT8lVlp8W721SK5VgOmZFvpZxhHRkOFHPz/ftoPCM2g+ifjUBw776I4TMBTCtO3RSWICT5LX0wHlwACfSOesLXf14PD174I3TXL9AD2iRxj6Xr99o/iJ5pD7m5zu7O1NHHn3UHIQHbjojMgO5E2H+//j646cwScfhHHDKOGx5Ifbzuh5/+ahUef6AMhTrMEbebbic+9UJIvOkaiXiID0IuvEuBE9q9H+xkSDD3DrjBWf6z/250dEcW9G//fAbHfpOdWWmRxIW8voDcKwKAXOeSoIIDqfXRy1PZlE/dTS/LGkHHpgMx2bywg9zqmXHAVJBPREB7QDUz4pwfn28+x/+NAR8PCvzHivwafbdR3uAaOR23/s3wy6gOchofNa2Uk/ad8ksyQnYqGuAjDI0be/O7eiz8YuB3jvStoNDBH0vITizs4cw2LR7+8nnnx+hIap7LSK0nv7MZ8AhnMLnxL2MeARcm8fotM8GN/IeTuLQDj1GIzocU7h5y0v0oXuPI6jr6NPmM4kwJ2li+SIsj3VOQ/yiKCHEWwAaO85pnoAVfjz1Pp0KeY1FpLtJ+YYz8Z9EDAAjjwoHBv3WGjA4ct4DEFmKuD+q48H8gjmcXccRpdK80Vev5Vvv82//Hb9/pWvZYnttmFtvqZ/S2ttW9d1W29mpi2CoOqdrnu6eLS0LJZSAlCzZioiXCQMlBZ9IpEQ6sbC3al3ZwtJWFBrBTxgbuHORFzKVK+X33/9Pgts2ez2sX28Lx+35Xa73dbV3FwjOhd1OuMSEZca4EwsQAypdZLZZVa+qJdymb9+/frbr9//12+//P7ty0sV0a2tH7BlYqJAa+3jY1FVEXl5+VWQTkoSEQ5qrdnarnP1mJwc4qVwqWz0Hov9eH8vFEIkhQoXEmqr3W5tnufYGkEyMtVag/tUSpBEhIULO3FRhYZ7OMGJAsnFbgZgnuv3r9/+9ed/5to2MyY2M2GizNZkbBZt84+Pj9vH+vJSzez6uofBg5kpoKqxLlOZKRIKS3Dq+Rn/2xcL0diFHlfoWSIao+QxcERwIMxCkzmWgLJvFEREJMTB4R7q2tgTtvbVuiwfbdukTkylJ40OL6XwpoXgRKpKrRkRwFIv62alTCLsFq21dV1v7zfT5fXbSy1US6Gk1jdzVXcVhntn2haRIDD1TMlEpKpbW4h5mqZZZgdd5kuSP+7HWcIRxC9fvpVpzmB3rM3B4W5tK2WiCOhma2zNRGpyOllAdSP4XIRrJSUHCSlRealYCr1WulZZW1wqbfM89vbh25o84Y5NsTVrJi0YxIQafR+LSL3RHU5CcGEWr/XCRcA1Q137EJqCS4R5muMTtYdFdIo0nOACEYkUljpoXtjR6R/dPUMdmENENIW3gzkCZO7mYCC4ZwJQD/AhQTqldAAezmjeWmsBAyhPWXJ2ZZz9wPoZ13GXbwTDD5OZVTd3TzEjGAkLdrij5sKZrwHmTubEQUAQZ5wI4BoU5gKpTEGT0AvPxEICCS4oH76+tY+bbwY36hnc0IwpiGlERJw03pOVqv+HCHkSfmKpH0gm75JkDI/u5cvPRtIdmZzF3H49KABEeVh+F1G2d6C7F0kd/nTWAHQuMtoZNY7Q3gQvfC9Ndql9FuJnZP8cq3xuxf4vUdJzA85ONt5x5gWiXSmi7mxzfvVREx9Bpf11GQ+8U5/fAzMB+ecg+KcBEmegctzdM7A9F/JTasp9lp6KlXR3o36O5CPEHBGhAaHEmDFM3gSE9zD63XqZeClPZjopBfUo/IiTcTBOJw84GQofrrEn8GmsQ0AQIXiY75sDTjMzdjWMnJBMfcP9p49lp1fsRwRjXu4AuTgYQ2Htbh4gIApxt8ciHwECEXl0yOGHPngaKnR0N8aDmcMaZ6c7gBAQwOQk3d87u589Z0m4RYcsIEf0oOwkFGPu/rPhXROiEbVNo+eSAooAxOHzfRB39Qi0zEgAIMIM6WXhBkr4vidlAE6+X0dLOxz0fVz3sJ30BPRBsgbOVZo2KgHTsIvF4VFDjh4RcRghkI09iIz2zg6zJn1PCSaSJKR3h99ZS5iGWvV0BjJu6Cujj24QJ49y922lwZsZbolexirO2Ubp5k89t8DQ9IhZulmfACd2TmIl955PNzoVIxF5RCFYVkpgZnAWERb05RDIPJ4JsYfKfz6h7sfZ6ZltPTdlEKg7wkc3FHi+ph95pPXFA4FMidlj8u44iyKC7ugI0l7oMSLysk/TwieZXg0hzC5I356Zpgkvv/LXf06//TH9+uJXv+ntx7a9LZ7c2+63221bP1xbbKbb5iGbqXtSPxb3aE2bOZGU6XK73T7WpcyTu7/dPqZp+vLylYiYzVes2xoAsSzrNk1TujQDYY40NYpQqR7RwEI0W6CWcn15vRSayP7rv//PX//P/9k+PnS5qW4uzTS4oArcXG1hn5gLSRoaeNva6k7T9eXli8r04ewO/n8Z+7ttSZYkPQz7zMw9IjL33lV1zunu6cEMMPijCJGcBUmLS4LExQtRi+LShfQM0gvovcQ7LfFKF7oQL0QJAwoUCIAYYDCD6Wl0T5/uPqeq9s7McHcz04W5R0bm3nUGsbrr5M6M8PB//+zvsym//+rdj3/y4ac/evd737z75mnJevbTha26QgMYKRKxg5ySI2lKTsmIJeWc2da1nM/fP5ecj+e1GY5NVcvKMpvo8jB//vTCsOSs7UJukljS7MTHp3dtLaWUw2GeUv7cnk+n0+GwqOqUyNmFnSZ4wzxNrZmiSZJkqFUTTNwuz5/rWkiSQ9dzu6jCW5ZF1bNkILGl06fLxMtX7746n8/Tw4MTcZqSZBgtedJam57ZsxwtglAbeeKZiBooM6kPrMCcKLlrbAXCHmDRzIJBN+YcoTHJWk5uJpK0Fl3XaVpomhVeapuWIzPXtro7mk7i53peklwudnl5Me/qG4qoDzciS4kvl7KuK7Gz2Pn0uTqlPANsipyfzqc2L0c1SSm5tY+fPq3reUr5YTnmLEnCoaVNOddqpZTE5IRlWVprazk302mawKzWtK6Bnp0pTxOAouZqeVrQg69i18iSEpEwJ3ZONPGchXRd13qp1eu7d8KAa2u1KElOk0gGR9pYJYdyAlJeJmbCxS+Xy0z0/kHWuqyqaTI51WrqjvNKy0QMuuBF16pEBhhTQaqYSpPni04pL7KoX5yRJiH3dV21ttgNWrWLVGNJOTsJcZJEkZlOVU2bt+aqiKiMCDUIX3+DoZtNHGhmVY1BQoCHz9hNdheJtPCc3OBAVeckLin4/tmchMHiRq02IhFiONiRKRmhqqaUZGJIas2sGTwogryawrQfJUEPEMduh5u+QaIIOYlzsIch1e7lmyXH7qcGXt0UroyJUiZVEgESeeQAA5k1gNQMFS6MTDkJpZTtYfZp9vSskswn5meqF7QmKmBWJ3M3GBAUW0FkP6K2YivqincDpDuSYRBqaRwZIjJaxIM5N4TwDedtUpkAaHUfWxifnYlth4m37AAYwK7ZNfw9ymqht3TC8MnEkFzCUOAEGgIVAPW2pwq0AR+ZGIQwX/KGRoi6OnMc8juAPpL8DPzjDqeRBDiO036GhkB8VVGi5wIaQNN7Hh/q3C2BH66V9F0ssptLB2YBVgPhMCNoZOMoxchhFxkbbnS40RMjb8+tPr5TEV5JToM11j0Y4248WUIfftWl9ObYKOBqCw0NLBExQSgAPaEng+6NYxaSTnJqITZwypw8AgIj2K+rKyMlUiwhHh4L/eKhArg2jUz7aEXf75tMbS3OJAEH4ObhV+gBeGygRXc1QzOTLeicYobFiFvEMoUJgQLJmYOQNuX01k+jR3Y917Wp4GhPz5jxluC5uza9AhGN/MRR5s1T8SaO0BqCMDvZCLNRxPLoUXRDrNmMErcy7nUuAl17YU4DN/KwrLl7qN/CqDeiXJ0Gbt8D5X237CXvG8ny2rRNY31tL4VNdqzGfVHbPAiWt+ilfamjaUGs+4aY6zv1wLVLNzWFd5LB15qAwe0TncQDw4d/zkYEAaDTTjAjbFLuXVjrXolXhloMYyFRqOHg7OKwyHEv4JCZ+6Ydc8idx9S3oUeJiEOMcF5/1W/bZxquQdbz1OzEa7JhVSDaSu6dQH0Q3a0nO7+/aEj6Ny/daRR2bKogIjC7WXNwP5lYiGekr/L7H+evfjR/eCdPcyG/NL9Uba2szaFrvbRWtblpz2+jqt48OAEBKqWstRIRCatbCx70jaw7PHE5efcQiBVu3hOIgobif5qmnDMzKERkZ6LMQE7IOQthPX2+vHyu55OuJYJEw18giF5cEkAgMYgBZtAuo6RqKGUtBJOZp/Tu3bvD03I45seH+fGQs1fWStBWintPfdqaVnV1MrhKSnlhmZmTOqn66qig56LZ5bJOtWmraoZ5ys1muFKqRO5MtTZGS5KmnOu61qbmcGLVmAwpRlmtlovxxJL5clmDsIOSj/gZF3JjJ7ibStiyzdXVygpyb+pTWpYFTqoeuufWGhEdlwMgqk4kKSVVbXaWKSUKm5INsyWcCUwUmWy7MS3MWbL59e8mn8MR7jGm7lArxa15ymgVbrBWVjNO4eVF26Hiur68WLm4Vau1tWaqaKWeT9bqWCNmhp58LTzBrJpSIyHStdm62qowq2nmWsvLy3Mrl5RkmtOcpbUCc7iqVm3F3adpSkyllFqrKYI3cK3K6tM0rV6IgovSFQ5Jx4enaZlrraU2d885p5w5c5qmKS+q3szRDAF988SgpOH71EJ/5K7NnLKLMKzGZt6KX/yScxZQSiwE9SbujzN/eJir11Xt6bC06q0ZsjOBTQv8olUdTb0ozkXPk5Zqqg4m5jQfJk6JARG5PJ/UWrAolUZoClFjYu4pHiJ2cdtAvPM0080VWrSIggiz5ED/RsZ8NeNvZ8oIyXVEZB2xQYMXlg3qO/3urRIaQLOK4Zcfminv2Rh9v6/2qABhvrobjNs6G8+V5YxGboFmOs47ExE3IS/BXUtOSO7uIkLGEKbkTmGWdm8KZ1Nw44mIJOX0lMFETk4NaK51CK7MXTNnO5Vm4FN2stiAR8qk3XkdQIAj/6RfLdW3GnTjPfn9/uh/88s4PuJzEJkECvsCEuJ+1uzO3yhMA1z28N9+ZDiZM4VycXt4o/HYcPY2ynHu8JgqvJ8zO6/xaxM8XAQD/Xf8Rg74RqsKQLqDYjyydy247Y1dt4wsDR1Zb91L6FrQu/M3VHhXeIErhrrr6ttXD2/4/f1+FU5uBm8Hn65/DpX/9RVEKb53V8c1HHssZCaCO4/QrP3a2l6P8S82uLK/b6v8fXvuu/GNz2NVd+4iXGfR1hxg+F8QiQ9w4u6BaKNfNjwTfc7DLWVjtDDcdFkPeRn9tFEO3U/0rX9vR4v2N+zXzO5X39+59RrzICEO0RMgBg0fxK1n367DEP0ppF6/YcTvxqnxtLvvP98N2PYn4RpHctOoK8zuz3fPXL9m7emhmSHej/lDRMNKs0leHSVsEsKuM200C+F7Q+NLGtvONhe3I2YT3nyYosYMiP/dL+nxOtqE1ZufKCTAmEdjRmJYJUZQL+DMBESq45hjMZP6io8CYz8e/UkU8jIAuCDiXax7RXlsfrvx2l2ODuCuh1MXAK7LY0PJuxK6UHHX9v3S6v/uNqzrUgQYEvtnMGGIQ8NTT0iZ3AFjMSTQRPmBDz+e3/9o+vCj6f2hsa+1vZzLaa1raWqttdLKltEjXhjEPgQRSWZ2uVxK1WhprbVVw+YrhfBeMPfqETAUghAMQDjYbALA4XBYliUCgnW4YBuRMwkx3M8vp8vL6XK5tJFRjIhT0swJzubiDguSQsCJDF5VK1g9mcOSc5KcswhlppxlXlJK5FD1JmhGBoIZimkzUyOXTCwtTSrSWCJTb1NUl8ozzahOZ2vntdXi3vh0Ya1YBKWB3JjNnJxZIUyi3rSZEDnxeVURAQnxZJwU7dLa08MDmX1+Oec5M6eZEzPDyYibSOelhYX1CeEGbR7klWOmjjVpBmCe52maGsNdRSilVFqrQF44ZzFvMIsznXai46ZX2w7yKNxCuRde4/Fj31XIwknGGg0293AJgzAMsAaKlKrNWtF6Nq3mTa2qVeoBqebhbegj86t25VEsHnW4G1qrVUtpRV2bP0y5XtaXzx+FsMzHFHAHZq7h6dTqmnOeljk0iHGARjqt0tTMp4V15K8AU56W+XiYjodpmX1NbCYi05Qs3OCqSkLKk7qYEzGnKTPl1HKtKwuZ9U1UVdemSds8z2AlYWZxcKiowxgsIl6LED0c5/ckBaitlcaXNZW6llW9VYeKSJ7nOYJwzKu2ViPNcFUWJksppWlK4VNXWqke50trjVtjaUhM7BhU38NVwN29q5iMMQ7T7Tjptrkd6FFVeBMRv2o3r4wam1t/sHj3eahwi4TmQ5VK19kVG4JqD5xlJhG4k6EBcL3CoE2GZGZJKZwHtz1z5Fw3dxcGuUf+0N7bXYqOuzVk434umLCbiHBipkSWwkcODnPT1pwJSdIkWVhSMnFVN6PavLaqkfMhqOrIOl8c3LvLPzts51fDcPBO70ubauYGb3TF+bb9v6Y86YB+Fyk7PuxvZgBsDCDYi97SznVd+3bU9XK6B8H93TtOAN75LGzSGoArBvMO8u4P8622+0P8Btv47raNOQbY6NevNwcDUv+erkJI1OYuqwHuyXP27TK4217pybfo5Y3rNfrvzxLhjinhC7DwJpriraLusFbkZH+TAucO0O/h4tinrwt5iCKvcIVfUXB/qbN3Hxv002UgWe9a+D5VR+s4lgCIDNdckMOTinuJWxs7A1mgI/arg/qGPP2aB+AO++6RE/YQat9rr4DU9te+WPcb4SdKvhvCm2rQ1ul34o7v102U08u/w6y70u5m0uvF8PqGOLBv7nwl6tCrNu4He/95/PnqLbs7MfzOv3jRpmi/aeldJff3+NAE7NlGog9jRJgR4u/1p20i7l8UU/DN8Qp7HxPGmhYa/s4EAfd20nV/MTNxOKBwAVnICoONdB/1tQ9p2XfXft360JC97pM3L7+Rzl+Pwk4G2G+UuytUcRRwGKFGIRAUbiyR6FWcs6dHmT/w09f53Qc+zo34rPV5rS9rq8WbuulaL+u6KixzhImyObmTCHNK7l5r3RT5PiLzqGcC6mLDFjxEEPfiQz1kZl0ASJJzDrQaUQRbQGE1o5zc3VurdW1azKwHb4z1xcxuRG7N0QzmMAiInUhVL1osYnjno+XFU2by48P0/t3DcZmoGy2KWlGrRGTgarY2jdBSmSblfCne2iX0KK1a6GjJsa7lslY1TrIoaqt1LTDR86VoWVOmeUqCdKl2Xhs51dYSsTUvpUwpCedK7EaWplaaU0ICKAlPtbRlWYgoxEiRIOwBkRO5aiMHuZIgZwln6vPlNM3vu/ikPa1YrVUOS0yMWte1Qg5P0xSM+0bm3QnELPLCutmmWzEzUKxBco/UVDooqt3dI18VwGYKV6gFFGMXVU15ArGRuaubuzXTZrWylbqeyvmktXir3orA5pyCqtHUW2utts0CEPKe0+CJ6qrdRlmIPMKapzknolJWGMSro20ZZKdpYpJaK5NAmB1O5JRYWCSzzEwJOXFKnHLKWeVwKvayXlLOKU2cs4Iu5bIWnSbJnshzUwMsC+WUr17v3oI8TIidahBAcWQkAMe4MtibFW/wzfxFIn6c5N0hXy6Xz6e2ZJwTKpm6urtBiYiSeDhekTiT9txe8bFfDBKR5MncAA4+HCIydzOoahKHs1kzM7fdQMZo2jXedzsttlNjeFQPv88djh8N6VE9TldlhzkUXV40u9KF7bcytfvlHOb8sFNGNPD+dRGKc7PHm1ksj1u41kOM+rvczFyIiERyzCsZZ5N4EBSLu7KLOzQilMMfjsGcSTFzfpRFCc3NrMEu1U09eFjRMx44EHoWJnKhcHBGV43tJeor6KGuXNuOgN1hIT62u9dn6P6bcYKzdy9rv5ZJb9y/P2v2R7YR0M8d7mfHhrWIiJL1iHNcJ8AeS9xUPsb3JvT2FnKML/FXX9tMo6Gtf92cXqWuELkvIV7Nhh2G3nfsTez1rsCbErb63+FD3w3f7QjSDVLd1SQuvaWJj0WAV0G3/afQg7xVzn5ebTUhov1Cx64b70rYV5JeiRN379pG7NUMvEeV44adc4phr83fPuwsGFcZxr2HqQ0DzRbXeyMlX+uAbc6/1cK75vV3e5ds7vro5or3XhX/Q3F7i/6J6EaOH6+IpdRJ6EFdWnUgiATCRZ/6951VxoEtMGtXJR6h7NubfKdFvnL8d7q2WA6dBW77nqxrX8ZycjejENW5l0PUI3RfoXPcRrXHjN0G3nv40PjTN80Adu2PTQYe2UE3EX4YE41I3tJA0FURHY/0WUHYgO+IdQARRaBf9DEsNBGR3pAjTpsIhFBmEDCUFd1xjcY7Q4FmBJaYvr4FIvR2bgaKUS+AhkV7U/xHB4JwjewfXbqzA9wsHphZRCLuJtjNWNx/2GQiHzRQ8TaOL+CU4CTGB5o+pHc/zh9+LO+ObeKLtZeLPq9WG9QcptbW9XI+nymJZIKRqrdmBJY8MXNptbXGzFnEh0E2Wh0XcxLJ2gYQGbA+DlsiIpJwdhERSkIppzS5o6k1t+bWVKfE4VvtWl0bk4fC0FtXgRsZQZg5MXswXoYLkKM5DEwsYCFOIpmn6d37p7/2Oz/+/Z/++N1MwpWtqZX18lwuF+G5Ol/WVpolmYVTSkf31NbL6dTcFeDW2rqutdZP333f6gpzFkwkIKuX1VVX9eZcnEp1JedmWla18nA41tUBdbV11SSYcmomVnRZJhO9KBEcvABpXUuQUmLsNsxjfF21rZnFyZLwNCWYmmu4uEzxDfhyKUZMZksSJr6sZ11bNXm3PBJRqRdKLD1UpuvGyDor+tU/EObOceqQDVVS+Dfb2FvMfSSdDb8jB5va8ShG2WohOJnBKltzK/Vyev702/XTd+Irwct6cdgk5A4zd9W6ruu5lFKstuZWmxU1RKhSRJhbpESwmBJTljkl86a1ZJJSXgiWcyamPE+RrquVypJSnl2tqQE55ZRSBs0X5WV+QJqa03pWuhhgVS1nzTlPSePEnabHnJ6I5ueXcxBe5YVcUkpJXdS5VHO3MDGRMJhsZAlspVqCOETg7qpNrWbpxM5kmhlPC10O8jzhmdtDTvywJHZ7qVq9tLquK7sp2Ek4CTNryF9QhFFOtbUWsXRgDgkwLBsW49JaTthgOobyPoQBM0uRWSx20bEfxf0bAO1Qe6fOsJ21N9rbg+DA4AQYVN1du0UBkASKHB7UYcEAc9tWGdwPiuIR6R5pBUYFSIRGkBUN/domAPCuqsEfFZYE77tTszmMCTlHchUNoTqFsxlzDroN6Q7Tjqbd3xM8ZaY8O5FDzYyVXmw9m6qgOx+ROxH4ns2Gh/aZthN6Oyp24bnbJr+d7GOvH24x8EG3sz17BRr96CEicM8JQNcfdo90zMNgH2e0D///0N778B8ISSaO8HgPO3bK9HGSj5cxX0+ooPUkvK3wshvge1WZEcG9O/XjDqptrYjIt5tcBDEZbNON7mp7c23l3B2mvGNf9G2r2zrxrRJeXz4U0PvPDCZsXAjX8d3astW/18q7phJAuCOgoyYC09uKzn2Bb4lYX7qkr9ydAODcEZr7yJUUmHDfXURjgOLxgHP7mOnwtxqyFvVGuA3x7Ea0uKvq6HzCD2cCfo2H9gNwdwNux357N912mW8a6LdMPAwPJ8o7eeu6ad6+nehGT7yvyXbK3tfTenK13gevqiGgDb7v0X+U+6bAs/9AO0fD7Sczi6Xrrx+hN+qwa2DwsdKQhkKi0HDUQ+f7iTkfsdfhwBfZiJm9h8Vs/UlEzAJgkOsMiOKxqMltmCh926aAvvPRdcejnsM3jACbrEMkAd9BhB6AKCDd75M8UssZ9X00eKiYYPA2rN5RCd7a/6pzsJsY+Ks2DokoS9xL8G8WC3Q1xk6K6H3RrrKyM8nwSggnXWal7OmBpg/p6Zvpw4/nb975UZrX59Kei67FW+fhbqqttaItx8To4RHs0k/f1pq6pZScpLWGCMxKFP4JNILVNh3ekAsAspFRi0JRLVOm4QsUSl6AOJGApynNWRhmZdW6tlbUm7q1sPwDAERE8uQQbgi27mK6VmsmnDIkq5upTZyWZXl6WL56d3z/eEh+9rK2din1VNfL5XIGN/O8NgdNlBdOi3suZ22rWvU+gbRau6C1Wp+11iykpZ6aqlatlqa8VicWpVTreqmXWldrqzCQFtXwo0ZzaUoNTpzW2nhOng6rEpmmvIDEsJoysY98dd09higYqyCJyJCEpyytNHdPKZVSMtPDwwPAHz9+nGs5Pj74+TwRn19OxUDT0bWV9axVl6cD+bbiRhS7DcfXvv84AIeatUFHsqOMNHM1b+7WQjERAiFL99tkcoosxTBYdVO3WteXy+ljWT8dMwkbTGtbOXeS/jauUPMXbbFUw7nYIu0xfEoMt/XyUmtld/OGqgQTSR4JiM1EJOdMkLVYbZZSEiQjV23OzDQ151rRXDIODctlvZxOxb1xyiLyfK4p+SSWp3Q8HiUd1yLny+paFcrMxkmSKgk5Ic1oKgIWJkliJLm5tmZ1SqzNu6c7dXQSy8fdnNjNEvg4pR89zqUcTquFLLRelEzNFXBiLsVmVUNopGXbDdZ1FRHyvtBSSrHb2XCLNYWFX5UhDXdE7I/CMZqIMNbtinNht9X3E+dW20cbiOwXmeseUtjuV+zUe4gesZu8uWEVJCKY9ODscXUNgsjuvfd6kA26qWrslLxzRQhWU6bkHlFMGYAADjJmIzSiLXi0m3/NrTRXE0pMeWZxmVwOlFyMuIlBLxQZzx2hLHJymIbDz0CivZ9jQV/5f/a797jtXqt6s+3vz/rX30ce6BF0fD0yrkjr9jR586zZxyr40ANutX19bTjk9ffBa0l0Y27a1x9vHZ1vvsJ2+Yu2Lt0/a2b7Gg4scF9no534MqY0NphLV+cWXOWB3Y53i/fe6ISxHvYrawcGOkbdlSN7L6DtXXsR96ZRt/ffPUhEfnsNSHbfD/uZQ6OETsx4i6vfWmhdKWlbspcvXFu39PaC8KpRsaPQFZ3evDoFC82oxLXqHhwvO8Ex/vTdu/cTYi9x3vXpqw6K/u364H1/RT0CVgIAlIAwWeJ2KhOFKEfXqOetVa4AXCQkou3t7CHqO9mVSomoaw3oViYm2rqSaIxxyMS8y+K5r9U258B0F6pCHcdv9F5j1MkHW2UMX9eaD6kgEMTGM0ldGiRzD325da66cEMhc4fDNsYeos4Y4EQAMaVoLxHprvLOZBZ8w9eZsXXpyNs15NSx8COGcXBI9aQY6LMcZj1gAIEwHFtaae8s8giVQrAVMImHfoJA1BNg607s2F/bV50wanR+0IRdR7A75g55z99YStuSvrYX9+FEo+0AExsFGQExKcE5hVI3eRJFtvQ+Pf4oPX2dH7/J7975EWfYSdup1XNppcJUVYuWUktr4bEDVbOmAKc0GZmZVTV3Es7bdhoWJAfcaRAXUfhvbEusN4SFOBFLsHzOx4d5PohkEKUpt2IwciCllBIfDsuURGu5nF7Wy/lyOXu5BOUfETLznDJJYpHmbK4Gb4bmXtVaF1rISUK6mOf5cZknBmmBXqyc0U5WSmuFmdVdzUhyno6Hx/dEuTacz7Wt7gpzW8vpdPrUtCTB48P0/OlU1vVyeqm1wrUVnQ+P358a52Vdz+t6JrhpNWvLlEwuMDUzIWIWq4pa0ySXSlY887SWSk5LOhhZno4GEQaTuxpbbLLGTJgzeT0eD60VJkpJrHFKLEKqtVY2s2r6cjnLlN29tZa7ilTmeSaiUgoy1bYmXcQy8RRMN+G8raYbv5YjmLHMmzrIvTuckMPVXKHqbtXViNihEdeRMgso0ki5NjMCGbR4bbqe2AtpQSsOoFVyc2tl1XDlgjmDJmEyrkKqZDkJtJmbNTVzVxYIi2qpaw2XsFaaMFLOAOZ5dlgtzVVZcmlaizZnN7Ki5kIyO6e1UbPmIOQjVkjT87ldVmfmicQgTKk2dyOSvBZu9dxaa608PR4Mxozqrdllap6YwNSMEkvwFAGUZHJid621mhmEibrK3wOoqbVmRM5ghiciXubf/YoVc/7uxet6Jie0xKYiKaVWI4CfFJ0LjJmT8OVyyTkn7vl6E7GLgGytZmbe1BwkwpTMrNTIG9BNl33nFBDFeAFs7t7MaqT14IgeIIIwyX4hB9lHP3NDazlApzqZaWyh/XAHK5oPD2DtRLdCRnDWwW7e0X8EEkuCj9NhuBeGgZGuSVc0dm6616MbQEEIpOi7OoDOJSviUGK3ZB6h/mTenHkiokZO5BT0KWHzUHclAOzOmFKmoyycmC0xc9MGlLMVdo3DR4MFMNRMvlmt42AK6esNepJNJAiABXdA95A9msbMQRdH9uapwwYBOhtliAE9E3DcEhDhlt3Svqzj2wqm8D4EmK5O/YFoN3mBQqe2g1gOfbNgd6e7P7f7doTXe9DJO3PGlaJw9Nj+PJQg6B6aDB/C6laUAnzDp8/unY+DfGM7fKPO+w8bINz3kg//o50IARpBwNf+cQw/q16B21ftPWSuhKux7KiLVTcg9roSY6bBBzXzVZDY9TMDfWINMsgohd0xSCAwHNqiDnuEvEkvoZDdVL9bTbiP0W4+0HABGO2JuBQfwvDI8uAEbAZoxZcsALQLur0bhruxo52w9bqc/cShcY2n3pRofQN8O4R9pX18JWDcOHKNVbGT+/c3E7G/HRLiA+Z3Sr5hBHizpf3FO99K7FQ0jFdBwEOfvVX1ujLQ3Rnfqs/WXV05CniPcDKADBDqPPZKGGkZgqS/p8HuOic4jz3IfKRxCMIKdyMkh++iR66mujc76kYN8CpTS5dbsM3Ct4TvwNIjKkbhHBn1uGeXvMZm7BVptyqZDfhuXR3CgLb9PLlWbGjm+K4yd9e2idCtbH39CXCP0E5yigVHMM7OXOmBlp+kdz89fvMhPx1Mck318wUF9VJrUW1m3mprTetlXddWrZPyt1aUGlJKTHypl9p6ph4AFsw/iBWO0NullBAq4bc0Q4PfhijJNE3TNMUpLpxdDLgAoCQRgikEK0XXta6XUi/eaviVZo4bJicJP4e1tVqbKhwMotK02Trnh+mY8rLM8zJJev/wcBBKrgIQWWvVtDKRpLSqw4gpTfNDno+t4rxeimmFFdPL+vzdd7/9+Ok3gD0cllIuv/i3f/Hp+4+n03NinudZa5uXc/GsdHp5eal1XeYsItBWjYqeREhVk8gULJ9lzcus5pXKMs1aW4ITZXZLNLOIsLOE038PrhChJJIYj4/Hsoq1llJSoeBUjT4vpaxN3T3+jGHiJDkvx4cHETFriQ9am6rSIIMnc3O4dRdEwM2MI+mFqap22jgzcnQH6Qg2cHjs2RpxHVlEIFfyH4aZVa1F66rrSaACM61rq9xOpjVyFG9yMoUaG3Cz2hoG/lPXZq7qjsTkqsEek9zM1JiE4bWuMktEFStInNyoOqXpWJuVBiLO0yIpn9dyuTRizmLtspqda1UwzWlqwGVdD8tSWyWray3+ya3VlNLhcMApGOvBlzKdc57XaZpEqLU2T96SZCFhSiwQwOj5+RMRzfPMpB08a7fSqSqRpERuINOFhQ4HS0ci0Xap7VzbamalnGu5pBSot/vRRQq2lGQd1jZVRdOG5tCYMKrqCiPOiZiTO6m2/ZbVSaZAIQB0xL/b22mombYF2zcr7xA+0OwVgREHW4mqGq7aQRsmWNwYBIzCy82HorKLHHrd0OKR4fYQAkAPGd5hABoBjPst17vPkl8bSaSqpZQwELk7k1tjC1JpVWUnZTCxXwtxd2+m5u6ZiBIykbDMSORqZ5SmbjAyVyZzJ2+qmpjUXaJXrqfQiC69UWgKEHkz/h0iR2+/3x/ZUZhbPwGjW33A/eHP/0Zpm/Fh++7u3z52IYG8qtUehtOtBXt4Vg9uwz1gs5tCdmVe0dH+RXwD5N6IXniNy7dpue+uEc1yxWwYGVuBHkm4Dfvds292/r4ORNTadfbuAdIdxBp1hrnuyyGKTrqmT9m3zp2G58E+VtD3FdhXb7uNNgX5G3Xw7dPo/r9aIIz/Ykh+txW4eftt/V/JvdYjZLx7i3i/e/R/2vfCvtJbU/eEqRzUevu3ejc7yqtU1ducfl1Fv8pM+1dHRXtHMcu4p6u+tk7ZZqP3fce78qR72MvW0ULbaMGhPpT33MUuuF4XyoiyAhEJUYtDusuRji2qn296zAco7l/6fRt3M/WNi3aIcxwZBMBVQ3cO7mYMIoq0XBRijykAoZAN3V8FtQQVvTMBTCCm4FciJ75VJPT/x3aWOMWg07bnDR7oOPZSP8ZC+oYIu1q8fQwYzCyLAEQgs96D3OGs91U76pmIXcgUkWZyc4H1qAZvmZSvrVNV4bSfb1tuBDOLY2DryX1Ox/1U3O/LkWKDmDD8Xvr9w9Ybuy+AxNxgIHJhgze35Dxznqu8z48/mt79aP7wTf7wJAcy19oALuVyabVYq2V1tGq6rpfaVgDTNLn56fllTvNxPrTWzutKIjl3Z2IiAjhyUMo0r6fTuayTJHdf18oMNVsOU0ppXde6UjCpE4X6P8/TIafZwSKS0qSqrRnAzp0kVRIxaV1P5fzZWiE3c3U3EZ6mKbIRVbXSdC3aGhnIQeakY2JPy/z4+Ficaq2Hef7m/btjTqxKrWpZqWly0mbVvRZzScvy8Onz6btP67w8/OJX357Xy6dPn4IOtdb1Z3/xF5EW6vn5+bvf/hbOOaV6vhCty3Qo7bec0+lyJqLzuT4+pJTS8bgks6lqKSVneTgci1ciAsn5vM6HpRZbW1mmyeEfT2UWHHImI8lpOaTPn6qCzuv68HjISaacbcqmmnN2ZlVdlgXmktI0TYnlfD5TyofDIY66h4cHbT7NfDge13VVXD48fVXMlpxj2ggzEam6E0sSAqmbh+NWYC9VGiuwuySNI1NVCS4iwnJp5eHh6eHhYS1NRFhSVX08LqfTC1plU3c9P3/C8/euq2sp5UW8dttbU4UCWKuG6875fD6dXiTlxPzp84sTE0spKzjlSUophJ6OykYEfyllWVLO+eWlgKdW26V5KWuejqZENJ0ulROa0MW0NlKaarNUzpDV3UupqirnnHMWkeeX76Y5WXNmvHt4zAut62n9fJrXJ0nZ3apVSSQiy7I8HJ8AmDoWZk5z5pzI2mUtL/NhcVXAW6vBNeRQV6816HFRS2NIInJvDDlK+upxsvbO2lou51bWWtMypVKaWSOa5pRTkpQkzSKMiSgmQCkl/C1UIwKHibsriEWaNmLAzZuIEKTTeRFF0KoT1M1r1+GlNBnUzFzVycwjS3cCIvEJm6m6oztaurmDaUrTuVzARCyRM8KZjMjNiMQAVwdgCvXYoliQOyZjNrhqg1+VC5HGGV0CQdPqtU7TtG2eIgLy1lhVAVONsAHa8lEOdhGKMpmZ3ayWxtSEzVpSneeZKKzv4s4kJOIQdnIjg8LdW2uiataSe5KFg6QrUVWnxqRwNa/NxJmJJfWgHe3kiNGrBnUKb9tN6vE42eWaOgZ7EBynuo2cx3DHCC1Dh00Dyfib8kJPUdpPrIAjg14iHmR3o6uLxCaMxdP7cuLM3TxvB/9gP3+306orswbi8d11rVZPFU8AfLSIwhK1u2kM4tXb2bdYlH4ydhafgfnQJ6RdLT+jiwJfdumxKyDhgjeEAXfvAtOmm/ZIp+VxzzbBNsgaf9obwbvBpRN45ho/jS/qMdkdzKH7vmG/pO5ffe3SDcJdo/CHxB5wqNbq7sPms0GO7d8roxdob0mgVwA5XnoVOLea2/202wlUu2f7om46ACmGwUIiqGbrn1FXwUYD+qpP73XVt63C3c13UtGbt909Qq9EzPH9Dzz3Zjn3wK6H/3aJ8L5FQccQW8ZNwOvWZO8HHo0VvC0k7Cbi9ud+4fVNpP9ntwv8u117GYlHOkfmEASiOe5uof536G1W5jAHhJckg6wbE3tbxiugkcmK+BoHTETUCaA58md1eQ9XuTZ6hsfAxVSVqwIjuigWNnOkEaEefu2v+plon+0ZQR4Sbi52TfCIL/Xc3fzcDe51yb351F56xtBY/MCMfT2fYyUDMHgNXYmn7Ol9evhxfvfT5etvpvdPfJxsKrW0AmteWltbba0V19BOkTBUiML0wTRNs0wiEk7esYWamZo1t9a0tUYpu3bVYyxmVSdi2U3OmKibm6/kPE1TBDVSEgi7dwah6pCUiL1Wrm61XBg+MbVJmBJtJuDd3PYRoVHUm0KNQJxzzikyRPBhmZ8ej8dpWlJKBLOml6JrqWVdSwWlWtwTLqVdLu3S/FTs8/Pp0/PH7z9//3J++fz58+fPn//iF/+WiKdpupyLKgn4+aWW0ua8rOTncwUuLJimiRhOyYguVb1Ua6eUeaGlnVehOk2TiKzNdHUnJDGHz8JJZmUUd61GbNLcOUmaluWQ0yzSc+10AZg5MVPPfniV5Od5PhwOOWfhVNb28P7xeHggklaVJhBJThm3agK82jqEHA4OvAELKT8xu7v2gD/OOafgKRpZdUFi1PYrl4kUZlq8XVzXenludYU2a5VQ09B6mllY2EopliZJnFKqrXnOKSWwGCELk4QqUIkgIiIcvJMiIuQpTY5EPNVmDYxGyhOQ3KVVFGUmbg1mWpu5ezXD6eTUeUuJKCVdtbr7V+8/pCkF01FxRTXV5sTryyVlkkQyzXmZ05SJuLqUtRGz5ESVzXXJLsyUJwZTUjNrWliRaRYiRVeXhJk+MszkoEBv6yz46nFp5d3ldC6lXC7lBEvhLenqULpVgcdel4R5MHzSUDAwhfGSnCRcIFNioLMADUDwBroyMycfagqKwWVmhcOMaNA1ICBXPxmdiYRpS9HVXV2IiMBX2munof1xjxzeYyszd2cIM67VGIdOx8uEzbFQhETCGTNonHkceBHVFq4EXW2HAc7Cd8bdOeKftWqTGjogI3bhJGYeejozIwvxKfJwKJp61cRMRAfkB54bNxcj85OX1Wpzc7JOwj+Ubvu9fQNW7k4k7pEV3u8s0jEc0Yq93n3b8PcL9m7x3p0RvOeOGV/2D6OS110aA34Q0RYQPDTTA7n9UHza7sMOA95evuV22AsZX7hiHDessmusbx27Pwe3O2nXUV86Ru+6jjZhYyj27kr2nfZ53+T4ZhMM7gof99+/pQvRbzV5a+AeRVjzHev929EX+/fG43YL3OnqV+z7Epi5JyR9dY033nj8M5G+UvNj4BZgc8Hq65L83ttpVHfL8yBhI9x+Sd3HqKtD9/p7HjJZvHustT3Y/WJL7odt//l2Ht91h8twwCKAunwGYJDNb9gQ6F4xQ+raXYYRf71fzDwYYmhsdr0s7//y4KyPRyQYdGKj39k3ruLXLfof0r/3/hxi2Bt9u290MPxgk4O3CX1dulEwAFAE4nj/8Na/3t2ZMIY8yu++9iNy/N5cOZYBbxsQrhoNIkfP2Bms/RbiAYjJzYQ59llskjRzeFNtIzQGDWSb6ggD9lMfWgIiTi7qHTNgr2N4Vef9975N1qsMsJevd+fFzmnPtTMb7Jfu/RjtXufh9k48qH/4QPMTjj9Zvvqd/OGn04d3csiY0Gythqq11nVdL5dLa0VVewA22I3C2ZtF8pynlGGITEBgDsZ9MzQNrZszm6pqc6akjm6N6cHH3SEkyEPBCZycKOc5vP+ZU5KJiIq2srZWzVMiYRCpttpKu5ytFJiJkIPFGRapB0VEnCAgMbC6QdWtmVcFZOoU72aS6Ol4+OrpcRbOAGmz0rRoK6oKcno5ldNqcsjIqOqny9rO9fPL8/P5dD6fP3789Jd/+Zcfnz8/vxRmnEutVZNMjbzBVaiSqzVLrK0dJDXV1WDnCxFE2Mxaw9PTLMnXcjGzh4eHeZ7PRZtXTpJM1GpL04Gzm5XWlsxohrV6Q5Y8Tw/TJInJyjnyITGzEEwGNVVT9quzBBGpam3n43yYlwfJh0tt4eogIpzSft/YLjNz2kzVft3QzMmcuOfpJFfaEqI3ja1YRFhyLAwfgjczEzncXKvVUst6evlMZfVWtRbVYuyupq05iUDcy1oLM+dpmg+6Pj+HawqImCmlZCB3hWvIPkmo1Y7dmQXgtbpxNmqQXJR4OqwNTc0gRYWZpVGtVrUBaG6lrTUodMAppUiVW8p6LnZYFgEBllMRIQallB8fv2pq57p6awVIzchD3WanVefPa2KbJ3/3MB0OSKzhxwVr1qq755xzzkQaSfnUASVmEUnsINMEzOzOmJPPyRfxQ/LHiU4WuKzBFBYO/S5oicXVonPCWcvMiJxImNkoM2WRFJunEwn3JEruHjnCoN1XODrEsB0fQTzLzEmIU7ijWWemYhazzvESkVbOYCImAbuR6tjQY7uXYNphGzlW3cDwmwg5dzJTMBPErN6BmNiGhRnmrRUiIsohlqSUQnfgFgoIR89YMjZOEYOTKRGMnYjM1c3QvHV1u8KVTcSFPLm7uBExQsHtTk5G4MKVVotYuylNJEdLTgfJEEek0V6tVupa0AGsenaBnUaU3WwL5vKhtcEekwQfi1y9GLbv3QyyUaxsvddPhkG/EfgkuqALIT1jbo+WvPb9FhdrOywQoSJdvxdYepeXYA8Et9NqfwjS0Ljd3bwH0LFfsd8X2G/b4TG7Lccj1pGxiVLbT5ErdER9XIHyyNq0q78zRr5k2SUs6DA32C/sppn7oxlvXfte7brWGz9w3rqXAIc6NrATxWK/JF7Fl15jAKin9BpYyMiNthSlMW8JG8kKbsvBCOTtAsCrs2AvMF6dl/YkVCNswnjDsd2B2aKio43wgQoDfPaQmA1+jkgDwDrHVIwmmbvfWwA2GDQqcXU23UZo/+FL43QH1+5kqe0Vr2f563LupAhcV8IP6dc35c21EAD6egldA3O3b2jQ1OxDsP32usGdu36zLZ37GKFR7A9Kfq+kdLPISQRA3BWgLa53jDv2/9JVtMEI4O7uBONFFoqQvtf4NYJnYHUev15rxTsv/zglaBMluqvNVTSiLRx5yIHuHFmBI6nz/Ra2a68QKV2bFKMSW9wb3TWEm/1ECgHgjTwGuz9fT+P+tiuR6BjfN0cLTuzC5AQ2TEizzF+lp6/l8cfzV1/z4yMdchOvtRa1Uk21lstlPZ3PZycjcoJsXCyx+zP1TEkt3M9EzEzV1lpaa9U0tAvhEQ5sGT0dQGSvskHlEa245v+apzxPYDaAhB2otdZaAaQppzmHs7HWVsta1nOr65YAiJNMkpgTiF1IQCIO0nhdM4+IeADWaivrlA/HKR/nBWRx7pfSSmmtNFVXp+fP50+rZk0Ln08X/e3HT59eTt9//FjW9ePH7377/Xff/uajus3LsbV2Kc2cijYAKSWZ87lVmB6Xyc8NklQrGJExdiJTBwjN/FybanV3ac1FSlMkZCQl0Wrq6qyZydXyvBRVPyu5mvkhZ+Gc2FQycRzTRqCUwgXN1DfATe6+rmsQ8hyWB5G8rrW0lubHaV5IGMKgzXLYMX7svObYVL9wRDInwFjIrEcjxOAKiIiKN3KPZMMiYiCSpGZy3XPcXVVrbUXrWtc1aTVvtVarq8IYaK32TH40tEdkm3eEmTF4niae6FxWc6TU89TGzeH0YkBp2rRxyuqJJVVzIL9c1lNpy+GpePPqZLUWLaruWrXVZsFbZcSZTeFtLeu6fvfxMqWcU0qEnPOUJeec0nlZnDk5+zwn19mtXs61Nfvmw48vZ7VyFtJ3D5mEwRJeeEmU0NiNqdTLyjNEMtAckfi2Z1hv5qpVGKIqrtl1YRzn9DRLW7M3NUOCw01Vy0rJKEFlZjPj4ZypFuS8CBdEERHJkjJLNmMzNdh2MO3Pu72aqLN/AsPJ44cwn23Ac2fs3s6aKAMACzthy1sQvvnxom3HC68kwPZYJOoTNg8mYlBsAj6MFWEHsJ406qr5ih2JiENIiFqaGbrPW09fiNbMqQJElBA5eR3mSLu92jyiWY2u4lNq2SeeiChlZqfkCg3OC8CbbVmN9vu2wjtyiqNt+/H2tLlRTd5d28DdgZZx2UbScvfU628YpJ3BeR/EGER7V83Yl0r4Eqzf/r3Tyb5+8K7+b860t77sugl3N2vbmdjb71fAvc2u3b/XKU27V2yBxVtJb7boS72xlblva8dvOxv4q0eu4eC+Ey3oFo7vWnejUvwre+zNP/dt3N/z2nnpBwrpwMwV2Mm1e/EMfBemTl1P8DbQ7EvABzfxJgCgs2nFkA9OF2yoNPDcBiXp1tj1Ru/gC9jrzZ9+uC/2S3E8vyWhuEH/5HYXXTEKcSCioYd2n8KW2TXO91X17jOz5c/iLY3I+B/tJArDTRg4EY2g7f7uKyXWyAAAbCujbyVE5JFWZicl+7bVxTrfEoE5NhPVbSdft7wY7OgAjlRfV2EE7CNoLIJ4x2rEsBVcr6Awvw0n6urHYRFiThY5jChc9mFmkV8pOt0RaJ4jvg77yRBrtIsKQ9RwEG+rFtdMwbcbTa/sRghwVf+/mmN+c9pdT9Od5NZvHGdn9MObJ0SshwQSp4T0nh9/Mn/4Jn/4Or17R0u2bKu2UmutZV3Luup6qedTWy+UKOfMoKba1urqOSVm4a5KhEIpicPd2Kx2Xx1tETQRyYaCkn9kBxvR/GPmD3mWRVLKecpzkryBEYC1NSJJicFctZmuOdFkDVWtlshhpFYVnjj0tclCSnFmxj5DhYgoEDpRUZuyHJZJGEII9FlKOa+lXZqqqvla6fPz2QtL9U8v5efffvvtb747n9fM8utffft8OtVmYHGn50tlznmZ1c2B6XBYDtPi7tAlSckpE1Tl8V1ezxdbLwa6NH+Y5VJKaY2IRORSmoHNkMEsiSVXq1qV2FpicqzGStaqZiJ2nzO15oDPaaLwXLDq8CQpsQBIlHLOKXFKCZJUNef8/sPXj49PhrSW0kDCyZ1MwVkcG3mLeziIO6yz9o5Zd1WqQYjN6iB1jWga6ksDpOYsiVNGHHihOkT3B3M1t+barNXEkIi1dnjTFq5m7uvlQkRgFpFmqqdqtTk083wGiGg4TVUzfzgcTpcyFlq4u0uk6LisTZCKEkNKU8BPxS7VaaLz6urqpKXVaqpaS2lqVNWDAgfemmqrtTVLSdmVQQwDkIWZ2QygX+Zlnpb09O7hw9dfL8viSCzT5+pQ8sZCmprPqypbgs2TcNOJZU6szZ+fn2uty3JsdXWwh+IY5ErQ1rQ4EZsumb56PNbypFrb5Xx61gvBCJmMYaq1NSBPQWRppvv0Dd1DWjKZSbBpTQtYzKBqrjUlvkMYd7vNGH2DuZoF8ZeqYudp1gPB44YeELzjJOgOnIGXw8WfIrjXCOqkThHF4XGm3GxxNyfsXa1MG3CFSq01Bm9ehbTjtzBrZiAO9rZRTkQEANaMRMwNSRqQGdDk4l4aJzfzts9Q5ohV1k+MFc3dJ0UVScwTsWQlfeDZ4M1Ujdy89RO425G962bvUe+XrtHGyLjRteFwD6NMZ8Gne5gYFnDtp0P0RteK4Xr0bDI/DbRy1cdio3Gh/gXTFRtsNCV3mNiHsWWPxbv67sutu7tibHw4P98ccLvbBVfZyiI15H4GAb7FUjq7O4YMSUQRa/QaLt/M3ld/0itZi3aywXbhtrnWY5e3rbL7qO2f2ibztYl+Jc/po7LvwrfqcN9XO00iXvux74AnAB5ePeE/eBvLurVj9EBkE+rikvVJ+Iq5xsm1XWM5qLNawXvapxtXt32daT+jjNxfsQBtDeORo4Ridd1qTL80Wj+w8LY9ZX/bW0B2/5PfvfFOYqYvyPF3A/OaKaUPyZv1Hyuz98PYAjbr/+v23nXF/huDS5+dby7UTgw+CryWuVMfWjBnbn++7qs3/+w1DIqh0KV7CBVKRiQbeh4441a2JgpiTlw192pEXURg5ohF3kU7XA+SsUHsa0V+K7N9ccJsOckp4gjuB33f//vRJ4qp/wYbwOvrtZC532X279pP9TiYiYgNydNRlq/zw4+m91/nd+/kcTYhhZpq81q0XC7n06lcnls5QUtKh4hTpmbWVIiypBSR7kwOGIMnbpfqQ9nsTFZNIyqDw2OVMIzvkdnAzIiHZtq6V2sQquSct7xxRBRO/JmlaDutl1M5k5Xp6fggxORJRBm1C9jEHKc+MzNARhCNpLmSMznDIK4goiwyzfnp+HA4HEIKVVVrtambkzk31aqoTuditZ2s6m8/v3z7m+9++/13xKmSfH86t+qyPJwvZS3NsTw8fEjzPE15nuf5sDw+PiwPR7NWXj7p/C21oqrv378/n8855+Px+Jvf/Objx48vLy+1mgjUDSs5RaQXORJxYoGCq5ObC+SltkU8O+eJDBWeylqNbGIRYQCqDHLhlCQ5TCSJiAillKp5a+1wOBweH/J8aKDw+3f3SykH0xlQ99ynMZzgHG7dtHPpJqcR0WEWaZ7MLMxBFK5m6ES3zT0yT1U1J3KvYDL1fVwawQiWWFipEaWUXCTYVURE1+qESeaU8vl8rnUlGDMTcRIJ9TIRUQ9QnjOLkcM5pYSedw8AN6NWqalZbZcGLaUqK+RS/dKsNlN41da8tdYu51IUbqzwMGKFhwvz5ArV2vcdBYuS46LIqWG92PfKv8Hjt98+PL47Hp8eju+XbMf5eJgyiZyb4qWcmyVqj4eFtB2S8yFL0qoKuyDSJ8vkRHD24MODAm6tmRuABF2SPEzpOMlhkvVSG8DUPRyYWXKe5mTtsqGucInrDkkRvW0Wy80ooYbuwMw6JQbGoXt30ThWwwCg2lku+p4/wJnBVdXcdYeinIkjwcuOUOW6O+024dcvHW7zjp3ZcLf1BUnc2N5vd9q989v41YK41npicich9tTL8hES0LRnCOZGRJLY1RzduTkuBkUmYxbxyGzmPQZ9nmfixJwOyIWnRlqQiif1Opjvrlv0HjPQOJA23Lzvij2w2+/6134baqW78+L1tT8d/NX3AjLeMlsC6OEUMQ59Z+6jEILc9XWvX3qPRyOV4VvQ4vaIvB5wV+3kW3rruz995IDbT6e+FnasYjfXCFHdjci9DLBZAAC8zjz9pSrFI9v91+rt+H9u53Nv71aZ/VE+bBfXd41XvNE/XxqO7cF9/wzh6ubXbbn9QGPvPnvIaXQdvu0GvmWp9b0888V52sHtvqOwowHlnVBC7jej2L3ihi54P+NHDXwb3bu58mY97u/ZVNrOI7QoHmR3elOa2eZbWEn2V/f+D8Mo7t/Vh6T/fW2Fv5JwxvZxIxG9WZP9/AjY3D37Iwyewmd8yPtAl/k69N+7rFwDqjbBw32QAQxyLozUcthZrIa01pG3b/sCXbMuMFGkHkDPnPeKxfN+IfUqb/1gZtzN4VfuUu7p5UfAXA8VIAIpARSxwuRMbr7jOQ5Zt0fUubebeUUdJw1p7o2JdDflaBNjfD+Z7x958/ubMnd5D7adDlsnuDFoYjl4/iDHb6bHr6and3LMmKBYy1rL2rRWbaWUcjmX89lqFSAT2K2pkVGmJCJZptjEgMh+7ARuqq5opkPv16OCncIjXWqttbbAhRERTsSD2LFnaJqmaZ7nqwNALGczd48w0M/l9PHl05Lppx+elpk9cWJqxJGzDYPQY6Qhva4CSDg+c2lKTCmlec7HZX58ODwcD0mktNqsaKnaajWvzdbS1tpO5/VSqk3cmp5rO9e1uj09Hv/i3/7iszaIWG2qnB4/UDr85G/+naYsaXp49/Tw+E6mnFK6XE51/Zn6dxMu8zx/9dVXHz58+IM/+IOf/vSnP/vZz/7hP/qjaZnX9VxrXdfqtUhOk6SmLs2IzIidUczUHN4IxoswAEqupk7iBFCtSmABJ+IkNKUcwdkxV1tz1doCQaaUUhLJpTjAIrl59Fyq2vW0+2U1yA9jeUTMJryr8DVI9xOzEKGndXMiCqxZWk1TDuZ7d1fDBHHvKb0QOAMEoNaKdY1ochHRVhxOlJgF4eXfQ3Itp4BxvCyLqta66jiYa60p5dYaKKLuCOBWG1jV0YoSp9LQjM+XYjQbyflSz9WaaTUtrYY1qVi7NN9Sjji5E6WcpmnSWtFIWFjIm4oQE9VzLWZCqcFMvTw//+b5Bfh2kuPv/vQP3j+9//rdu4c5GQzFm9cEqxdna2syUpVjmoXc/fxyopxZjAgO064KQQDN4PFptXi9JPhxnr56Omptl7UJOZnCkzsBHAY35h78SkFHq1pKt6SHSDMsNgFoGED4TG3MeO5OxKHKx2DqNOuxwj7UlswMgmkYUTvriA3U5mHdiwwqdj1xMNjXADAlJ2K+UZz58OYa21rPG7xtheGlYkYEJGEfcfBdKe/XcmhQLkavMLN2JOJmhq7dtNi7QQhHJ6i7GjngxjRT8BdRUFwwMxOomYsI+QQmc4NTdwgCCzM4TZIWmRthZa1Q9eZx0iH6Jlz6EbxA43S4rr47lHw9azwylV3Rjse9A2nfnw79QbseXlEOM+DkTICNY5pI3K/5WgfDV68BAp/s5D13l13C0LsK32NcuuZB29DLa8S8leZdprrPmxQfuGv042UDQyOIQO5hK1F39aebeRWoKcpl4MqX6O4+PCBeV3I7xF9j7u2G6wcngDfUdw/o3fbljPvheNv95rVsMESUK1jf/7s9tXX4Wzjj6ql/14pd3W5ERQCDnen61G5qb+Uo0KMgxjCGBWYboc10w9v9YfEIyxLtvo+4mQRE4ihEgqMAaEbArWNxX//szHsN67WjxzZ3L6zcXXfCw4b/xjdEQ+LZXzcr7V7PTTQCSfb32BBWcDuosSmTj8lKRCAnh3XvjluNjV1D6cf4vZ4Q258KIiAO+lFnI2LaEmiNbuj/78YJvitn93YldjIK2Qgw3Ao8d70RdaQOFEJD3GKf6a1gJ2I4qioROnlP91A0927Dde8MuuyxkINKQ7sUE2M0pmaAGmBMBzKJdnVSCra+rzBwTdLS91nu4+0s8GvOFIqMfI5hEdj2IBr/jgqP3ePGIPvWtfXt/kPspLyj1tp2NHeXfR5iJoBIc0KesRzp+E6O7/jhkeYDzalxa2U9X9bz2YJU3QxmtVYyJ2GiyO2qBKSUiIiEtTV3S6G89R4E2LRFkuDgPA5A36wzb9RazToTX2jKAurBWakBIOaUs4gYAapgYhdVJbCZ1VpKKefz+XIpsyzzPC8LNQnzgcIi9qvbc52pmVf3ql6aRQLZMa8Aj+zC8zxNx3k6BPlPuPyUy3o5rZfT+XQ+vaynS/u8tudVc2YFqrZLKaUpWH7z/UekmfJkF8fh8W/8R//zh69/90c//esv53Ze6/v377/56v16OX3++PFyamvj54+fH2Q9LNLUVY1lIk7ff/z8ox/96OHhcDqdPn36vpQavvRwVtVaq3MnR1K10hqsTPlRjSqROkEdIGbOScr6LJxTyiISDj8xGUqrgp7AK6W0HI7Hh8dlPnLPzOBsxDlN8yHl+VSqcO7TzLtqg5iiayO0zkFQhBLfzS6XQuQyTU5CgI7hXteLMNey6pRdm2o1g3kjdnc1czPr1k5hIrqsJz+f0SrT5u7ZZ4gTmFJta2vNncJ5TxLLlGvVtTRTAwuRW9N5WRoarAHkSKXhpZgSlybVOc9zI5jwRdUFTvJyWYs2A1XVdS1mDWStmnCk4FYCnMFJ0pSnecFhaa1NWYhM14sQMciNXooZcVNXhQk4ubAgyb/91V8+v5yeX17ePx7eP+aHA0+lkZZjPiRvLRmTz8LTQZqWc7k8PD06OYu3HnUrwuEdlwNALGbnnA6ZH5fU2mFd1y0RG6yZpVprIZ8yMbObQRtPLJQ1J2viQNPIuTUs+EzoLCUhGNjIA3CTrNTMtpwPsQFZbIh9FZNSawZm+MhgSMMEDIBTNlXqEgCbG9/yTe0BGRE1N3cXvdrP3cndmMW9vbVJXpkiadgBVKuZOYy807AwczB1srqZk3vo2hLx3t7e2+vNLHhILIjjnMOk7WNm8uaIDGcYQyI+ytAUVSlzYpmRjaiRga15BUyJDG7hfQoIqIZTVSCtiHoDu7eeaL57R1zlgdF1tPv+Btu8Pj4ARLzcvpBwrO1/XvWwho7SezzyDhhsKr8O4x3q8NDJ0vAN2F65e2TA/VA0BrPcW9c40Tz4Tcwcbv3EfaNF12/2VgK6KepGe7uJgnt8Bbkr8nZCDsHMfevnHQ9V1/Zy4PnX2AYdltq+MlGHiG3jXVf8MBal21m6/bvlAdia/MPXG/cMJLwvYRu+N5XIuHUwuUOY7h6zq88x73rJkRXCYV16hDMR4zrP78sfjs2Rcd7dPXnoFuM7ijnavX0dcNemrQ8gb4CxT33bqWbDwSPRcNwYabAif+SbHXftncFMCsADcNM2HgTwhsJv/LccDsuSoBY+9Pu5KJLilu7RQ6DODxymjKHRDLYeMs4USlcfMzvqmFIaNtj4ZVs+e4ItB3r8UUrJrLm5W3NEUDyB3LSfE5sUaE7uESm1M5tshuHQ9HdWH+6TnroPIl2pm9zHhOgjBg8ChKE7pxDuxlCxeyMSSRk+xEAYMYftNKSMYbGCU08gYMFDAribBi0gyM1CsAmEL9xDd9nNTGVjVYqwR2YWQw9qjZLJ0A9AIo5D7jqf3InQYxWvW/ZeAIjmGBEDHpu97Jh398vPu8bEt00NADE7ucaSiOPaBsdRcEQEaxKFSyjcKdky8+GJH7+ZPvzO/PXX0/sHm6Uau9n53C5nq8XMtFa9lFbUHJQzgBbc4UTOJjmOzgZ2Al9KISIY1Fo1rc3WtaobC09Tpp5G1LNIc21aiN2hqm3O4uaJEkEcbvDQWnpiY6FQ2CG0cazNSimTULPKJF9//c3v/vibr7/+2l9+/enTd+fTJ3LLIkTCkpLMRnCic/Fmfr600/nS1DNnQLw6kwsnojTn6Udfff3+8XFimokMuVmtZT2fPr08fz69rOeTPa/+vNpzMTmfL9Z++/1vaq0f3n34+Z//3A2Q5BV4/6M//F/95/+z//R/+6lNfHgvz5d5Xd8/HifSv/xX//S773/9068fv/2z76vVz5dzc/75X/7mfFoV089+/pe/+vYXU6L3T+8I+s3Xf/Dp8/Of/MmfndeaJhcRZmSmWtZwramX9enpAcQ8zd9/922m5auH2cnUGnGe52xmzjRNC6xVbUR0LueU0qWsU57zNLk754nz9HK+vJxUITwdmHk+PqaUT+dVlmU+LEQ0TZNBskyS5/Ol5mWqpqFxTUIp53o5l1KEPIIKvKdxILOmajlPcGXHJHycp8T+eT05WJhqPeeJ0SrImlV3W0vL8wTgfHombfBG2hINRbKZg5+fT+4+50MppZyqTKm1taipkTofnj6Uj5+ZVhG5nE7zPBfzqs0oFZcXyy/FjCeW6fPZWPL5Up/Vk6T1UteGZqxqtboa1AyqcEzNlik56fHd9O79+1Xx/uvf+3yqaT58Pj0fjqLreT19nEn0VPJDmg7T98/PHx6ePj9/FkYrqHwh4qJ1tfZSLh9Ph6dP8u5hev+wPB2zsx0Sk4MvlmktFxyTzUsSb2gGq4CoopmAc6IkIGFRdTeb2JeMzJq55eQMd4Z5O61tniSlB+t8u5oT52nOBMAOOTHm81pJEhGreimF5kzCksVMYQ542A7MzOAQVrNqykw551KKaU9DS0lqa6I6M6lTaWrmKc/ruprGYUUikpndvZgzJYU5mFKWCFgOsiAKzs6r2QAdbEW+a1TTOGdYhJiD7tb3Lhywgf6vKj9mdrKhVQmVrsf/mFiYE7xa7b5D5q1UFxGRlAPrGAhmqs0dat6wJXAUSSmBHa7uEBF3NQvLVRYjqGurvBgZwYSRj3ycEmakSYlYvwdWNxMz4WYmTfzq4QAi2tj3u9DRlaTes770AySwaUAgdmgQrKg2oNvSR1bQ0IaTuzMYgAYGR89hH9wxOmzQbq4wkGgnC/K4pTtQcYciCGYn9KygWsuAy13w60DlGtkcIXVdaaitsdPIrBbIzN2d3DsPblAOwEFQU+6cImAiYuljBEB9I9AZNqmBIH0Io8AgLOp+DTbwB9GgHWxGCETZJZtema69vhZBg8GCBt8OegTjwJ47aD1Oc24Rghzlj5pufkrxDw/JM/puK2QvvdzmQ7jeOJzgAjvtxYDOGGum7t1zycxE8nZP/5cAIo+M5TspIwqPeHofQsL2VCLeMPMV4owIybjvyvJJBHdVIzOjoIsIn35jIQ8CQepCSEQTSRcW+tCS9U5MhshDEt3vcFhEblIQRly7bN+SfZ/e/Ba7xhB39ngXA4d96dkf/vK1LAUAkH1y320Yts59fW1b3laIBVEVdXBPO04YAGZtV/jNZLqZoQCBiX0wSYUYE+pjJyKWuP+mIV2pj+izu5nqA8RTaEq6YcH0dZ9fOySCaUM26REkd8yw27RTuICUrsJiqO1j5e87GQpndhB7pCnpZTIo0t90AWCM983AoSv7I3c4g7s4S+hGlyHThPVn7zURVjAenNbj2/iXfbj7y/bvm9c23FtHXaXW7Zuh7SAi5wh0HnqOTdQgIk8P6fjEhw/pw3t5euLj0abJhc2tNK9qWtWqN9faQocxTYtq3QL5Y3JuWkONZE9jmbTWwwFDMXzniet+zVlLNDb9YY+P01q9SzJpytF4ZhkZhbtbybIsdHhMU16Wxd1rK44qQkLMvEwgThMnUdXSajOOBL4gdm+qbqYAB3/pMs3LclymeUoJrqbVTUiNQttkrWk5F3+54FRwLtq0VK8KZ+Z6WZ+fT9M8N1B69+4P/8F/8r/53/8fvvrr//6f//qk05N/9+JQquv3v/rZp0/f/82/+Td+8/M/+c2vfjmrkuNS29yMkvz5n//5vMg3X79v6/On8nxcpnlJv//7f29d11/+6vvLZSVNzOt+1YuIqgO8VidOlHLKU6kvsxtg07TUch6dL6VcfERuBRSYc0ppYubPn15+89tPjw9fLYfH6fg0TRNISrMcGklJHp48iGgEyRmSpvXywp27k4MeBCH6Sk4ppTRRuEJP2Uo/IGVKSYK7qJIrMUmSaZ4A1FYRSRinnHPWNItIZjE3NDRVMzVtAvcGmTqrD7mkZE2t1pYXAiylGZ7cnUimaWGG1nXMf1Fi9byCVtNSkTI3NyZawc2lFX0517VWGhYSC8UFwMDDYT7M07t375dj/s/+i//8/dc//eVv1z/5N7/8/rw+1EJcTy/fG9xrPTwt7/MDH57yL/+ylbWWC7ky29rw0k6Uc0RJqDatyWyJTNXNSlNatRU2FGkL28JEsixT31utaUXrqXMtExITuQKWhXKinHhKlIRSgiqIPKUUiWyHtiH0phZ7KsEZNOesSDaiY+OgVbPhf3nvhDN65uYU20C2EWprxBMRgVNrbU9/vCEDd6gpnJ0E7s1q4Bi+TTDcHXT62bNtXhHmwURxVIEo+1AneaiK3QjZQ8ujcZApdVCoY+uiviKG+4dQkDwQOQZbEoVGdjtrYnOLw5bCTy646gIPjT50NYgwyJyDXd2FtAjlDGGRJCRss3Ft+Vi1nbxWmHX3qNADXZ1RQzdF5OEi5yTsIapcYY35djSE7/EbcZ+3R8aQFsb0cI9jqg+3EOkGM4Ch9Q+M9gXr9JVc4bpN8ZBShmHhDmx0E0GnR8eNzni7Nv7ADk2J9p4d26ykwV440Mu1dW8WC9w0ZPtMQyu5/fklGAYgMlITd5QyZuAmuPYy9ssHUB9J1uIF2B3ib9dq/+/tmN49C9yAxvHGL1T+zongVmf/5Vab7yhJ7mDq67oRdR70K/TcElFTN0J1DbM5++b7jUD/cXXtuTnRyDse0zUEj3sUe+34e/nph6+9xcN6zmCOyMU3y/+Bzr3rPnqF/m/v7ELSvtjdbW/Uf48GEJKVu3QSAtrjRSIarEeh4LiZoLRrM1EYGGisYd4vISJiYrMt111H/1vTwgszUKxHRMQXu+cLXUf3XTSmV/dHdOcugUfNze+6Jh40s0GZf4WeRKHgiA9RQEBk2QSAsd7cncx6MgSOXXWfzR5Xd6ih0ieEPmBM82F3DJnhPrak78CDJXerapfTt9QQ1Kd4tLm3/I1l3VekAyMjGYEGz64zmbOzgIVlTvlDenrHx6+md+/l4VGWCczmXn1d11ZK8HtatVZrWDFTzk7mes0vuEXvRW+31jDIPWtVNWvWGT/3NaVOyKixd1+zffEUTP/uzmROLpyFc0qp1trcZMqx18ezCneSnPNyOCzLwqDSmqqKiJAgUrftiNWoxw70Uai1qjNkwohPje9Vq9YCtZwzufEwamnzWrU0uxSrqqdyeV5fohx2E0LKSUtJ0D/89/727//o/fefvv3r3/zkX/7FLz7MBzMD6Xcv333zNP/9/+B/9P/40/++ruevDsdLufja1vPLsiyn+szCtZC108NhenqcHx4e/t7f/Vvref3u13/03fef81ezsyyOeZpieSeQArWZ6yWD1NzAWlXIzYk4TfNCQV7LCZJIW04TAJ4l5ywgLVVV54lY0rIsQanErWZCyomTGFzhQlB3YgIzMbvQII2+7k8drhFyznmaU56ImDklceW61mbVeBFJ0tpIBJGJIIlEtWltWio1DUoZd2dKJFlgptfAD3ePIGYGR6Jl4sgH5W6kqlNi9shtqdOUAZAImN27fqiZ16KXYmu15GJmVEMzShHDmiWpaq2ltou3mhKWJc1Tmqfp+Pjw9Y+/WWv5m3/3D//g7/y9//af/OlvzpNcmgt/Pn0stNilNbzk+YCUf/+v/22S6XL6/Ljk8+nz+XzGupYVbKq+qvnFFI1gq0C1LfMkh8wTqLFKS67ixkSzS51mzjkb2Eytdfh+qWsWFjLV8NLr+3kkSFatMF/yNCV2rZ7IrMff2zDSx+4knEFCAweDKPYiDzUb3R9Vw5n/JjzpCsWAWitRjVQerbUQFUgS3AGLsBMah8jd43sBYCgEtsS39ztnqGUDqIMklvj2OHVAPLYm4sxE1PlFu+Fi6KFp7EGAOpmBAWeob1SDuGoxYgvSViSs88wwA3MijlnUdzkEHmQaUI+JSYSABBECWA6UWzpcSvncSnGDdiW997NAtHvjdqi0nadBZ9N12AGthqR1h+RuIccOqO0EM3z5kO6nJwiITMA0vh4Aw/tZdTcZqDME7SIAe4eH4u8muDxGH2TU/bw3dfs4W0OY29EG7oFyiJZjdPRLYOmLrduBpf1P/y7Qbuvn4WF+3w+b5/m+k30oYXlX4N65OtbohtiAvXB1f57u67PHkLidDPt2vW6aR96OnQDW4couEuD1tS+nZ2m490nrbsldAGC6ezwSR24iUHQUEXpeI7p5S9+U0PsyXCHCipX240e7y28ZXq8LY1+P+x68HcnXbb190f73+3J2d97dv3/K3VME8g2upR+ef6+vmz5660Vjedw/cveiGAwaQcm9HLov//W/9CoCZuv/AWuHqBr3v1p42/b6Zs2vj3e9vowYYhlLa3gbksJZbSQAvpNNiRxs6LqjLUTFr1UKVXq3F7t7t02R7fXf+3Hf2m6EyEB8dfDp//H78QCwY0549eOduePaD1+aP1chzXedSQi/IjiRsxhmmR7y8ijz1+ndO3l6lx4ONM2epMGqWW11XWutIQBo1abNKYLk6utzZd8J209x4sYHHQftJi1EKGroaTbkDSDnTCL94OQAjynU/6oaHsB8TWMOczRtTszMy7KkZKuae48v1eZVG9glMzNyzlUNpjyCq1TVAEkRJQwA3mpta601ZyWHC1srWovVVovWWkszNS7mh4cHq/J8Obdaz+dz5mle8lrKnNPXjw+/95Ovv/3zf/kXv3n+T/6z/91//cf/3X/09/+na9Xnl+9+/i//yU/eHWaqGZoJrak2ev/+KSUB2o9/9NXv/OTd5fzp9//W3/ibv//XWtPD8vD7v/e7TNMvfvbtn/7s55AUoZPTNLXW4Jxkaq01h6mmnM+rlqau7vPUwC+X9f3jA8jKWqY5z9PBtYYRLxTDIaeJCS/8+PDIIsakZgqfRaZlpimDZS3tkA8kiXIi4eZmgFUTyUEI6oxEidNEUtw0zXOaZyHWwGnC6lZL45SZEpzK2sLiTMzk1FqDG5nDXFVJm9baat32im2msUgkLXaWUrXHz5GlxDlPa72YISx8dYiXqlVEwOJm1dEMpVlpvhZb1TXIJ6lKSpykVpVE2rS1WmvRWpmQBQ/H+XhcAM7L3EDf/vbj/+u/+aN//fPv/vm/+ou//O7lw0/+WlM2Ofze3/p777/+0Z/96b8ymBwWmZen9+8Oc3qY08fvWDiczk+nYoAZu5E3wuVin+Gu62GebZk9JU78wqEjdKf1onpc8vFBRATKFMH9DDgbPNJqmJnpxmdPG3VPzpmZzZRMXN1IiNwk4spCGh56ggGDQ2pmgTWjob/cL/Nt5W6rnocGPYzw1ZTNRNWdNMJ0Q6nNbDsc4N2DrA9uBOtvFqookEcCB4O732mavKMmeJcBATMQuUQKcpOI7+n6AlUBS+oFbjuSbX4MtzsY0FUn8Wx015a91d3dWxgBeLhIYfDd7UsWkdiQ61oifFTMYUSYUpYppSPNxzQdLF2Ue4jn0O/YOEGI2GCImAeEQZ4Bc6NbGpUbxP8aP2wn7N05MvIHE4ZT8Z1I0GWE62H9Civ/gJ5vV5PXZ+C4bA9w7x6MPtk3R7oA2affyLhw7xMxnr1v0B3wuGvLvsL7l9614g74vYnWfgDF7WvYVxC64jLg8h2Q+3fow/vrrwSQe/hh9sVp89bVs+v+8EtpYGkaEB83YKxrA4GhMB2zl5k1XPt4h9jjV93RgUQJYQHYXn8P+HYddwNbb2u5698YEhq1ii1gZMV6C9l/AcPd/PpXXv22yNBGZm9nW7gRcuKD7XmIidz1vgf6/WEa6DL3/tdrUTtUfldreiUnbKj37h4i6qbJqBVf53FXue9kxLc60+6+ufn1tv6jEI48AOGwaJFozGGkRLL59g9+YnI3HvtCED1wD0Lv2Q9kbDohFABhGBWKfBY0EhkD3v0pnQja4zpCbL2qi6KSFrvkTTfuNhd09ZsDhPtx33f+6273LoHEjO1CSpB/GIUpGWLMjJnzu3T4anp4nx6/SV8dscyYsklq8OZWaillXdee36tVbaFbJDC5ejj1bCZXHZHodt18ux5uq9i24lQ7zYZI1nZd51ujcp77AW+9x1JKOWciUmx9CEWXK0LMEZFpSktO5GdrhRyqymaqVrTBaOIkkiZJqyiru7ddlBIDzCOALw7ynDgxpcS6nmo5radzXJdSm7ECkvL08AhdTqWczi94PgGYU2YmJPn6afntz//1L379/bnh87//d+Tzv32of5Mu67/45//4j//Rf/3t08NPlvbx179Ea+oukilJVQXZ49P7v/8/+Q9/73e//l//p/+Ln/7omz/9kz8rxZ6efoz2L37y9Vf/6l//G1BiyWpQgzmZhY3CWTITQ7CW0+lcJxKXXB21lKUayK26iMmcncSgEvZ2BYFzZgBa6vl8Lo3md+/fHQ7L40NeZkoiaaI8VUeaMk8TcTJwUzMwCFmSawt0lVOK3lM1yZOkySPEjRgMkBj8cHzHkerYSoyseoS7sDBP06LzXK2Y1sjakSgB3LSzw4sIRcQOS9Gm2vqUMCMg5+zurbkwmwJkDPfgF4W7oTYrzatTM1HrlsQowglJpKmWUgBq5dJqhemUacp8XNKSJAtdSr2Uc/1Oq9p/8w//6PDP/+T703n19P35ZTX+nd/7G//hH/7977770R//yZ9/9/wRaTlXM8XlcvHW2G3OIpRZjvr96dJgprBiTar7yiRC7i4k5GwGVV8vfkm4FH48Tk0dnJeJzAwKoKrqtMygBtctIy8zMyWiRkQM5CQ5sXQr4OYQTEP9FblMxIEdhDTAyYlBxZ37Z94goQ++AgpbXMRzEYIbQFuDu0wZQNXmTiBu1twh4sTkzt34LFD3Zt40JAQhYmLuCX9jJySPnNLqMHNmso0Zb4dzRzqnHaTjcbIws3OkJwCNfRvbjtXJZ5uqdL3SNeTRzDSwRbdjtJCZw+2NOZmTc4MayBwKmlhi0sIIUCOi0IMwMznMGgqBa5wNziBMiTwDB+Qjz2drjlLhDVC4R4wBGDwgubvCEm2O7D0w0HurfggXDoRwo67a/YqtBP/BNE8c0bdx+u9FCPR8RFFRXE9x9TiMAUHaktLYlg5oY7f0G5qmPXLDHQxwYFBXbfNx29VluO33ugwN35tN+ncH0/tHXj91xZawO3XfbbBsrCEQEXvH+IM+kYa6YyzPYfzQEHRvBZjt3y/DyyhwU7fuKtGh810auI4baMumdSPU3WskeVfbvq1svgvoXOxD8vL9U6MO2GIXAhh6RLOMVb2/3/ouHgJAlBy4Au5dz3sVAO665t99hMdTOzx93Wu6WvXu5tsH35ivr4fnDq9vN1sPtogNyO7KebO2u23wKtSaXcH33a+v69NX8tgOutjzhZf27zu55N4D7O1uuX11Z2+gYWHYiJ6xRXbf6tT331AXDIZLT+jx404eNgGC26Yq6Ebq0V7f/gkCO2J3FgMxzB3OnSLSQ+lF2yzqAsCdhsOZoLwltgiQSiC7Lv0bcTG2Odx77rytM3j952tBa/+5L8IwivuYpRF2HDwtzhDKlB5p/mp6/Hp6+CCPH+gwWSJlUrfa0LyMqw3Nt2oEArKQhw5+C8sLYm8arLLuEaWaYihZMrTRzj1MVUOvv527W9Pc3ZlIGESdkTvYMIRFJHhv7JZ+pKlarfPhEDyhIHv+/Onz54/Wqjc1EAknTN7dUmDWCA7rrwaQUmrGZlabTnlhpjzJklPOWRIxrGq1VrUVD8DozMx5mg7L3MBrbdWcJC2H42FZ2P3j82ezNgn++J/+44+fnmU+/j//q//L6fn85/8/+s13H//7f/Tf5vr59NuP//Qf/9Ev/+Jnc2aYUpLn5+eUWFL+1a9/9ad/+q//xu9/8/f/wT8A+zxN/99/+N/9oz/6//zf/q//91/88rvjMn2uipTXVie1LMkJnKbECeFS5aZGn8/r+2Nai7nZU1pOpQpREnGkVhUEISH0PG6qGs44TG0mOj49ToeDTDlJzjnneaY8G/PE03w4cpqUWN0VlqeFHAQDiXt1h5oTCXMyMckTCRsBRmCCJ5ny5IcUBABQJ+E05XmxWgIeSWKGa1lIq1pduVt1npP46qpK4erTGSdbYD6iTr/oqmaWUp4nIs5Na6JEVM3MWS5N2duleWloLAYxhhOBHSQpJSMjEav1cglW1venl5fz+cxEhznNU8pMyWnO0ooWvRwOx+dPnz8/P1+8XQyrvixPP3o6/m12WLWvv/rp8fi4ZAIxmD5+/EjtzNYOWZQx5zTP88fn8+dzUXMzbaTVpGoTjXxkrRJW8gR9YTtVKZ0glXSZMgs5mBMBDoV7p9kNTE6pk94COadpmmLJbBm1I90vqG0Uk0REEPTNw5tHLi9SVfMGR6zunRvDtudfl9L2jbuDmUiC+N8hnKmqRgYJIbh7NXV3quTOOswX+xL28UL7Yytm2M7hu9dmWC7CIGzubkpOnskwzhiHmrlRiuizu1a01ozZmBNduTc2TEnARucfv4qEeTzhah/ApkTYKu/DWbEnGDazplSLE2EtECGhJCLwifmB84WzuisqDQpsIEYmSPPI4PCg4qR+5HWcEDjnxul/f/S/PmXuftr+uz9oxkG2jft2/saBK/sD6HXhXwamb1w8kJ/vLnqrkH7SXXHF2AmG85jv+mR3GdMbRvUfqPZ+pu3RyA9Au9fgaj8id99vY3Q92oaH6t35vuE6fAEPbOVvb6SdRPSlAbp78K7m1y9/8NnX7aJX4iV2ivibKRpO16/2lq2BGzgcnbWr6n56OwCkzVnwOoPDI5DvB34TEWmEFnVKr4B91o0T2wsoFKmdSfIGu+N2SO62yDfX3pt9vf9MRHBx96Aresv7KvplB6lvxIlgU7Z9sczcdabdzwXovCr75Hg3NduW/109x4f7eAaFUaji71pNg9iyL9ix3dPmyunDgVVfr1Ki0NuwU+iqhj8Ldb17v+2K8MEwRBzC2FM23lka8f7kHGp+82Ad7Daf+M06hB6hBui/qI/OosgEHFMJFvwUXXU/OIiJANr5dMbe7UQI7wUnus4o0KYJ6O1gAmRkK76utGsXDVtxlMlmIBraPCMmF+pJzsDZ0yHNT3x8nx8+yOM7LFMlVtfaXJ1UrHlZ22W9rOuqWmstof6PNMjmUNW11doqMyM8N/rUSq1Vg8/zxMxazbyzKoNTJJPo4eHOTMkU2rzp1WnSnCLsMqZF99wnIRIDe4t0zBH7C/fOidGaSvdTalr5cj6dT89WK1EPmWBmTlmEzFptWhu1ZnE/EeWctKHW1prmve3YFNoMSDCQzSnrtJRZL5ULsWNSnz5d1s8va20QmqZpORwOZPbbj99PUz5kTlaOoqTP/+af/kMlKR9/9e1vvn/+1bc/fnpvZt9/+4t6fpmndH55ScxqdVqOVfW3f/nrX/7i2z/+F//kf/zv/Z1/8yd//M//2T/713/8Z2vFn/3pL4C5lCbpkKdZzZ04zwc2bFwpTSFEk0zVqnG+tJVI+LioFjM4OTc9TDmxmza4wmfHoH6HTNPy9Pju4fEdZAJYHSxpmhaTVN2nPEmeQMxIoOQ9l5a5hltzMm9xXJPkLCJ57rQdwi4J6iwpLYymZsycBcTThJSsNmIiyU4wNDAxM9IkOUH4+PQ4f3copxcnEkrMcOssGTlnTr7WCofk7ExVVTjnfDCQaXXy1syglKfaHMBqqE7m0pAd1OAQcsoQITJwiO7+8HD4+sMHJte2smMROeacMyWhaXpcizaAmglVs0uiOrMeEj3Nh0dZv/35n/z6188/+fob9w+fv/8NgMPhkBInzjPBWm3VJE3vl4PIx2afL6XZiD3Q5pY6cYaxGFM1WDNfI3TVM4HUDjnNWUSEObTLaqpbPH2H+BCYTzkveYKaBaGna5wLgX+H//1VAm9m4V1HZuFSFGEFUXKE94dXdogEkbchZIPwPmpuxBJcIoMPgDfHPzOQsMMjewG8GWcndmLrqUVdQBLxVv18AljAArbNKGpjQ3b3iNCLPC5R1605AGTYAZg52YiXjU2WGHwF9F2p4Q4BkRsMBIezxZmig5ywk/53bSh1bBipB2prm6BFRGAK3KLWZQAyEBsxMpEJeRWakjglowPnI0/PVLLVC5hISbBPFGWR6KYzAjm2yNp+3lwh1B5ZvpYB+onfoaHttKNMRB42kA6vYwSuZ427g2yXjd66h62T7wJ8t4t3swuBjkiDBhAAu2w1pB1AJIsPtqF/14ZhYegJo+PcodAJbMACIwoc15L7T9ahFO1BUW9j///w/93dcB9Wur/2/fwaCkY9e6njpx32td3nHW6M/AbMW23uXvoDUPN1DTeBYeufG/D9BXR628j9DX+FtANg09/T4I/d6unuIwfJkGuBngOcxN2VbsSbjvapT4w+o8LU0/MAyKhVr2TaD0NfhHYzPDd13WDsXtbpCPCagmH7lbf499s+fV3sD/es7/Ix3fXjFoq0n7vMbP5aALg+yHxfmQ1o79c/7VxrbpoMADe9dDet+zR+Q/b13Qy4URu8quS2xjZ+4rjzvjl3b7n2c5dn9q/oMlyP+HG//tt9b6LJGIEBu7l1bTaDiUwMJswQkKn3RAGxewUpZ0goDOz4tjrZUbiK9lRokRlgyzE3pIjdgF6fv863LwxKUHS8rW94e4LRvkzqwXEsZGCSTOnA86McHmk+ejp48qKtmtVwlDUzlFbXUlprppECVbvwAQMwjAONmQncWlfwx3kfAWoiUkoBwMy2C67bdhzmq9rvZldiamaRPAocx28X1XrAAPuw+faLk2jz0+n08Lj4AzNcot0i2gLLMAABVLVGnldFoBtKSVjYvLQ1pZyCtlU795GpEDSjCSOnSEbWpmLZYZ7K6VJKJZbl8EjWyuWyrmu9XJblsCzz6fllTlxePh6X+fe/eXe+lNPLr7Nefvx+/u1336a8AHh6PH7+/BFCDQrgvF7WT+evPrxfxL/77fP/8f/0fxbHV+/4eHyE53cf3n36eFat6fAu51yrunuelkjR1BQiufo5OU/Hp2SnlGczcJJilCgR+flyaWzLsqRJPn88E9xfXsxMRB4eHnKec85O/P333y9PXz0+TDnNAFclZmISOBGJg0WEOEUaWW0qTpFOuAW7mJukzELCyclhanADKcyIKYk5EWPKE+WI02ZISzlxzgRrdInAZU7CaUoypeUgOccGx8wipO7mxszTMrem53UFME2TiZTSrLpkAljVHV6ruvmcpgYBWIkbkbJo46Jo6pQnQziUQoSJaJ7nb776qpWqrZJpznI4LsuShOCEWhXgw+Hw8vL53bun5eHdw7t0eHf8G3/77z6f8Xu//9cI75OLOb+8vJyBclmfluXdu3fZ12SX8vLpVC0nCIPh4srB7h6RqUEMROBpnvKUE1urKCcjVaCZrq3OhTNblkwQBrQDsFChuUEitCPWlAiLiGpTwJ13Dr5qbmqdG8PAFrzqQ92JG5QADA3lfhXHStwEgFikzW1ZlpSSmjEs5dmZXTXYa6wv614gIOCuNY8NZHjXXI+z+BDSJoaFfFSsQwQzc2Z3DskQg6gecIVHlIk7k4h7j/XnEea430WjCdQx5YBH3mMs3J3hwFXDaGYkzs7imdjNxN2ZyMymadqIDXqwQYcaIDMhNqneGJqhDcaJKCEtyIuLGAvQEjmB/SqcmIPImQVwM3Q2pw7Hr/aTrXP2H946kQOk3jJSjPv3+GTzBiFA3fCqqB+AOncnV4zXHoO+/SGq8Trm8LaS19G/RtlexeCNnmPMplBH2SbxfqkV22ffA8+39Pq+sXOOL2+Os13NewjerXjmPYz+5vHtjW++7nVXX3HFWzrlvScI3QoMr8uhG/nkit1/YHy/dL1+cJtXvvMg2K30Dru3ml/X93aZGZx3iQL9RnQEgNTjnwIuuoW6aKsKv6ZG6ntiNB40IBtHoI8rNvYW96HBxVa/fefu67RdHJwIQG+hdcE90Y7W4Gb8DK8mkKoOr8j7Yd5vl6PjegnhzIwdg4G/Ejy20TK/eS9dQ6/a3ZwYeprOyUNXWYXRNdPmw4oK9CyPvfJCNPhcCTYSuPguDuxm4rJ0GT3MA+4eErmP1JHB9Uk3gRlxwpg5Aa7NmZNTd43pGiXmrvjhEUTCRJTUDWrCoGDzCj9nYbirt5DHgSTXjjIAqjvnpa6O6Gluuts6JGLrFW4WNpeQD2SbgZ3aEsOHaSwJc2NKPqLAtvB5567aCi2dO6K3IgV9sKV3ZSqLu2dJM9IR85HnRzk8yGFqyYq1Yu1iRVU4E0mtei7npiViSMh8Xc8ApjSHvr+U4l0dqK0WVU1Tzjypm+QknHOao36tre4e6XVob7tkUrfSanj4uF+d71trWA4acXScIqclAHBkGavsDJLwqXV3IzT1ZZFlWTJLvVy0rkyuI7FlaeaExICEtsxq1XU1d08ptQGJNoGk1tpqNW2MYFeEJLjaYV7meQH45aK8lrVcVAfTCGSZ54efHH71q5999+nT7/z0r708f/rw+DXUDjll9nr6NEnyZC++ctOnw3Req4PdXRKza/DxOwl4qo2O00FLOz7I0yF/eDoQUVlbqe5kRcukuhwelgPMfTkeuLT10iCU5nlqbZnScsyo+Pj8ckj0fKnLlNbSEiGlnGeZ5gXsZkhCkKRWHx+fjo+P2gwsnz49f/jmp8fD43e//fjhd/76+/c/+s3p9KP3P/r+fDkcHkwxLbM6zBB+/EmEPRxFTHIiEDFBVV3ZqZkGGygABmfKABoJgAqiZSGQweaHR3dVCvNqUmJzTymnPCnoeDg+Pj79+pe/SDJlsbqelnkG43JeP39+JohIrtpOlzWlNC9Ha6gNpZTW7Hy5pDy5pOdTqU6MqTk1oDZ+udS16bQcqntThVNrpTZvrbLQw8Pxu8tvA8bNE+csOYtpZU5TXkjmT59PlOeXy2V+OPwHf/iHf+2v/+R/+Q/+0+Xh65/9+ac/+ze//kf/8E9rg+T06bu/PAnTu+P58mKoX331cLKVoLW1y/klMeZ5drHTpSzzUtcSa2Sapmmenai6OUwkcUqcdVny4TBPE4sQixMZSImoaRMGcy6XZk3ZMeUsxEuenHld10UwpclUU5Lz+eS+5GWWJFrb6RK0sFnSwimzTB6RrKqh5t+2/SuuAjxor8YuGkg3zoUIw1CzlBJzd49hSnHsNEMpTUTyvIDlUgoNKrk9I7APVkcdlo2QEDyCrKyGnBAnn5rCIcF9BzfT0NOLCLOYaSNKkQGavOvKHMwEIhfYQAhB2czka730TamfYhrtDW13iA9ElJhUkYTdHc6uZq5unISmKbVWiHKiyLvHaqqmZkZZ4O6tUKOU2GozVVGAKIMXXo65LmgX14uHzSGOLQ7aHLpyzG+yWWhoryr5K2AaCAHAxs4chXRa2OH1cHf0Y/jUdweYXShqztnMItVwP6LGkURX7mqPQYX7YOLvXPhxZm7+1RHLsrWrAw8H4lwOqSbYwIbqzEJQZWaHmcFciEmurmhMxExmW3s3olNgC3cfrhMRctcxQICJncqeiK3V+HNA1AGZOl2O81AnUsQfcgow6tZ7IOCpmYYbKtFgXwyVZJDcA8xCCGJdl8RBZBfnrLsLS4fOqtsyHALRFYNFx2yLCIAwzMwtwnWCNBXDvEBXO0SkfFbf8Y9vWNzo1vVoP08A5U7O1PmC9/CXx9SKhoMoAoYo3r4D+pujXX/CDJ2D2AC49qBG7rjeZHj6mFknnSeizV5jOxluX919Vr/+faSqpjdCXvxVmCm7x3TfJuttX/TPe/jO+/6477u/4rot9u2f6PaK77Yb7qQR30mcdzJGr+0X7BJvVPtWQBwd8kaZ48EYZifycdsXhdHtXbaLlLj5abQe3YPGidwRruPUpwqcKO1a5GMKXEVPd1dyMpfNYgtsHlfUl4hvB9ImXI3WxXngiG1t/GbuzKJja/ARqBCJyEA3q+QHJgOR3Nl27m6+m4dbGF84VnVVGFGCZKQD8iPNjzQfPU/KUtzWVlctzVRNIxC0lNKqqnpT11LLRWsDUB1ktNZWa21d8aemvV2ttZz7xhFqvFq77zV3HnjZ+m2r8zaywy9ZmCUkfJboPXASMG0Kgz4lAADMnNI0p4O6V22qVTg7kzCcZWOAsZ7Fz4kss8y55x4e4Twkwil5DKVZC68GNzNXsmZeVSuzC+dpmpbDnC+F1vby8rIqQ46JU0o5sR+Wh3fv2rff/gaw9VKXRNa0WpmFVVdViDd2ZZIpcVVXVXa7tLMkWo4H5uRO8NxUwAdTbcqtiSQCUfOLAZJ5OizH47GUcrmU1swN4JRJmBLAVX2txgo4JQcDHz+fM5kcJsns4Je1iLXLWp8el2mZD8txmpdW9VLq09PTh/cfvvrxT3728189fvM703JQx/t335BMD8ecpjmliUmClAHgMPozB7Fj6gKpJXE2sBqBhDkxx9AricOZJ/HOYBMGtjhH2cKpN2WZJsIiXpEzRABhydO0kF6SQBjLlA2WJD9f1svl4kySpmkiOLuTM5daagNxShNV56ZoymsTEJ8bXapVWFFXA1MwxpCZpZTItdXy0x//hMlbrVYLXN37oRWz5VRWZXw+F3M/lZffvnz0mR/+h+V3fvq3/+P/+A/+h3/2//4v/8v/6ue//O7dV19/fn4u9fLueEB5upxeZMb5zKVEOgJn5pzzPHtDzdmnaSLHkqdlWXLOKSXOici9sjcAdZ7nPOdpSuGJJEKSXHLYUpnRXHUAma7ooW2f3V0pJWJXONRCuWNmTmqmqWe8ETWYNzVSdYIw27b0tnK2xfv67Nvt/IEzJMiII+4+DKXWnf7ZtJ+yWxCRb8rd22LjXao2XCiH/ulmS+yKF6IU7e78Y0wKJzPAWDiyB4gIfIODQw6xTlhsZgZiHkk9R7Z4H2EA6iAybQhtc4QFA5E+wfY7nu0A9PVEMzcztaqqrCpJ4JLhM+WFJDkLUfXeInfvhD9OwdAT34TpuxNhjcH+0mmy9arffn7zALo7dHwHqK4dH464/cu9tv7qdmJ73f9t+f66qubhrjZuutZk75ExOhY++CfijYOdqet0YtT2Bw2650gv9kvt3TXzDQQSH/ZW6LsH90tgN3Xvb9i35a4E3Cp299+/mvD9Gq7v92w5r+/v4/Iqg+9+OPZ12+O0u3YBPSXD7ap/u7TerpuWXnuP+drMG63/UC5LCI90UxrFuvNrnEbivYVp1+aRVPm+77jjlj6Vd88YbmM+aXfDfjZ8af3sG/8axe678vapqND98Fz98Bx7tni6vQCENxXdRppSxIAOPX0UZDfVuGmOD0qtMWA03n2t6laBuxm8qz8D3ay8i/vu2zd6GkbfSvTuIwh0IpwQoa8BJXSj6cfr0ewtdiUCUxw8oQ8GPGwFDpBDwWEqDs+zHiofvvwB/UescFCKuty8IrZO6noA4s0l38JKtEnP3XoEAE4SNibf2ZGx8beNAmIEtzY6ALAPNqHdaPqQorqyBbimy4hVa2B2YmcxTEQPPL3j5QMvR5omzWhqzWqtFnEVbtq01KqqDlVrWmsrq7dKJA4t5mstl1osbP2tAZRSAlBrzXneDtqqVtQUJEQiIjkHs0YA6+jsHpwNYhaWJCmxCIsEGQvzMOVJZk49B3W3fVtkcU4iRKLN27qOVDXeYwS85yLIktRDwHChxAuXC6XUAwrg3MDh0hX+DGYGmMDZDdpUi+qpriVzxsSJZclpEiZvZIU0OYwkB4TJeT4+PP3y24/Lsqy1mk0AVFWmrG4cbIzVSVUoNaLQCaUk8zy/f/8EJC1u1WoDuxBlAhty4kSp2IUbeUTWTofFDGYXDzwnQiSXshq4aruszt7EkAmSeNXm7Nn+/5z9a5MjSZIlih1VNTN3ABGRWa+e7nnsrAiFP5V/jyL8QBGS98rexyz3zk739FRlZgTgbqaq/KBm7g5EZPVeQqqzEYDD3d569HXUuZl6U/Vz5jxPqUzEUqu1623KpUynaT5Tzv/+61cl/ukPfyjzEzifnl6MsmlLMjFlgHv2P3MUu2Emd+Yt3pLMoEys1cDEkoMohpjYHSnF/iHYSDvqll1VdQNJStPsZGIsqUgqpLc8lfl8Wt/WADqq2lRFckppns8Kd7DDhRNLuq2otlS1lKbM0GbWXMHVXCvfqt+Uq/va3EABTKecW6tzSW3VnPMf//gH09raqlaFtnxTYkos+VqX22JflsWIbivqmy3/059V2//9//F/+6d//Of/+X/6367XdZrPb8vb2uqPP37+8uWvc26FrUhubY0pM0etoXwKs07TNJdJiKdc2BFhXeQuwiYMdTdNaZqynKZyLkjiiZ3EiSBC7CDtpophBjkyQMAMZlFYYbcOjkx4i6D0XnabEyQMxtZ0MElANrftdvqNHRp8PLv5rAOmDawMSp8EqktVtZQEzqbaDE5oEQhEMsgaQh3pBa3Q2dtAhKhC63WvV2XUfYjoC8k8LPwh1N1Dw9nFoDt1cj+OIB8BgwP3m1nbjAvxQXQhsbAMikwa2Nu79GGCCBkzARJS1NTammWizhsAV980jWrhWyCQmTXVWnVlTaLiaglcTGbkmfIbqux2z4iYh3sXZ6nnqg3WlB0S3cmIvwlU7l9hp+80poADPZMwtHj4nthGRKP2bYyGdW3+AfBoRJD6wQ6HcXPfNNTeAe/GQerW5HCCHwI+e4b3gBHum+1/g0DeqaJ7v/fud4uDD+G5ozns4JA2aLst4e3pR1x5jK0/jmBXxt79kLqVPFq7kwI9gLfj0L0HjX/zdQTHse6PlLUfXvw374bg8jECMMJfDrjxiIjiZDioB3eq5uGTu6eHGtBDxHscV6Tyo8cdI1ROd6cRCh8EENzLVQPDPJEebNgPIPW4Og/T/P/PKP/Or+5m7t0gv//V9zbnA+bD/Zz9zhKh7gWzh2VqZt/r6PFW9x38G6skXpvK8Q6Tj/YQofMG0DiFiai76r7X3/ef3P/ZJRx6XTCKRB8QhRMyNMROdU2IDF93GwGNQD+PIoI/GC2xfe7hIb1Xqbenhyqlo7IyjSxndyhG7QCmTeUNIs1tuPapvLOsPHSWPRhF/8eWHLYEFR7JVwQyF5MTpyfOn9L8wqeTFzEiI9U+MsxcW6ut1baaKpt5q60ubb2pKlNqbq3ZUlcL8nAzVWWWLbwnnPLhtfR+lJNwlpzT6G94M7eIYQzSjJzzkToDwsGA68QiQkl8lAeCaWvNoUTEKTPzcruqesm5pJxF1lbbcut5CxGAx4mZhZTBMCSiML4yhIy0mZm21mptLFlEpmkqpTDDrLVWoataZWdRhVthyomS+JT42rxZ0yCldBeR0+n0/PyJmZdbrU86JdGVJCd2pyye7G01W24OhTncchbyfJ7neZrcZC7l2hZyKmma53Q6pdPpVEpaarZvt1bhJCIyz7O3ruqJ5DC3tapRCqOaJXMzW4VKR0Ve1YgoQ8nISc6X2WHgxEmr+nmaXz79wMzf3tabtz/8w3/O85NTmi4v6lId1cmQDOSDmAnMoARXczgLmXoU1KCuGyipMDGnoA3p+z1JbWrk5J1d11x9mCEdMBA4CWd4Y045T3Ux5jTPc7u9Wq1wq+pVV6C5JE4llq6qRuZgVW9gJzanCOADmZKoYzFuYGNqzY3cyQnIOafMgOec63r90x9++enHz3/9y79zwKzEOWeSRJCe+EDUvDU350x5JiqrlnW5fvl6+/e//L8B/PLLL9+ubxC9nOZvr7+dS2b46TTNc0K9DkwsBtURm3A6nU6nk4hMKZ9ymedzzhnMZqbaXKuTMrkwcpZpYmEjbwo1QxJhGJMbQYZGgW5BDC+Njiw6dnfz5g5ADIMqGHd1eZiFPfXjxAluxBzZEX6IeD5Kn2PVGgzbBw/PHsJrRPm61Ef566RqxCMxd9T3oKOl/HA8xjWRnrUdiQeJ32uJdsYv1XjEuEk8Jc6c3Qk7MFl/8Wb/GpHDwXNF94HjA1G4WSMi90TUIbmZtVZTOpRy7+CPMdJXepnhEeOkqmjNSdh5Ak/IJ0qTcwVZZNZaLwMMKDsbGYF7SgXZ4D6K/hybd5zW3YR0tGvSASIPLeURjex/koe19UO5fJT+fhje459/8zUE2S5zR5b14Sl/A9Htn2z3jJVJHYTQ9vMj9Dq+327+EAWHPXn6sc3bNXEfH3kymzQ84PK7caOtAsA9+roHG3eNPF65vfdAPIcmHR/60K/jt/8n5uX7aPDhVt8DKr1c3V2rDprSuzuM0HSLb903CvVQ4x4jfdKHTadhD3+4GvfThrsTx/bPD9vDDtf/TVj2eIfvgPWPbnKM8erfbg8lCB0cEsd+fbhQjh+GJDjw725f7aNhxy30/RWygf7DGD5cssey033cy4eDsK1LGi6/41of3x5/ttMRDBsAE3HwFA/vgQ97A5kTkXdHbjAekAtRHIIKZzMmOJNRp4cyeIS42XGxdn/wofGhLnRdIuj0uAf8jLM5fBtRRcwGfy7RFvEfgx1qzDZo/ZuPjrNHaRSfsIOYjBkk7s3NyZGdXtL0g5w/p9MTpqkmqNcKVReDM1TNaqu3a6s1uPLWZVlfr8vtZmbEasRrcOrfe/mJyMAGVPXMnA5LjtA59UVkqwRsZsQcbnIMjv+U0iafjKIelDdzoh5hvMn45tZaI9eUEpgAytMs2c7zNM8z7FaXVWsTmJq5e7PGKYW1T7W2ZkRTTwEkaeOwFhEzL6Vc5unpNJeSEBU82QEWSHiKyFwYp8yXKWUydif3XKRIZvGUCgk+f/58e3273b6u62k6JxAvCmYhlpxzKWtaWjMSUiFPcDOytdW3G1FmYMp8mtLTnF+epqdzmafCjKYwlVbJkc6np3kuulYiqrW6sVNWbSI5p8RQ+EpNgeZgkJhXBRnIWZiFRNVN4TAFy+X8BKaS5+qO5mma//GP/4R8WsELOJEoqIHK+eKSIh8YkuKoDHgVmAssABmRBc86EQlBiIi3dC9mAdi9RVI7U0A5qa5mnig1VzO4mauRAZxSKW/LYmapTDln1YUpsXqitCy1NgUbSwYz4GttbfFKDElwWhZbmzqkmqxrU8rVkoKdwwXVSByEnFiYkdi1sdt/+ud/nKZJEqUUMK2vPRJmYWVOnBkriynUicFZvShARGXmpm+/ffvSWjuls0aRtomDwtsMrlVHnr1zNvVm5kbTdEopedOc0t/98ofT6UI53XRZlquqCpAllZSDy59JErOCiRDhVcw9NDYJue9JwOPF5h5w34lgzuSSCEBbyQ6wLSL/RYglCVFTA1rX7EmI2b35gVUi5hrC3bbp5k5iEHQWOOq5mExELCmlFIqoSHIHqbqpucOHgigIil44mjl3FzHHcWMI7lPxyKZy9wNbaD8/95gHcWhUQRlH5SjI7oOOxnXD/d5riiPKQnjQjYcq0uUK4/7MZ/LoH5MzjAfFpFsz9VYJ5ojB80C0bqpMQuaB/gekUVdEqd8Mn5jOLFdIASez1bvHGKY0VGVBFDYdYhexCgx4FzlwFFIfvd9sRgfwQEds4+50CHvuAd+mI8i2A+oef4/Npu8G3ZLOsQk7gCExQz5y5B6b6vCDxO+LLYhxDp8w6FB5ZluB+8LbhRQ77pM/Hwfho9cRTX3QyAM4+ei2g2VwvHDXI6PIlyJSrcw8Mjf2sULn0L/XXhALidAt348Q9KhajEiQgFJ3CJ6IB7Dz+/8weHuwXTx8GvHBwby+kSmRsd9lbO96yFgNh3979sj2712VXx/v+/88bhKepYFLeyoFMChTnX0QM95xNh0HaDPEPszZFq921Ip+Z+K3afqb6wMHAPfhfeg7TTp8+Kjdfu/i9+3xYWF9/NwGif67327LFPuy25fUY3/v4fymDHyvz8fVjS1L9/t70u/vf3hKB9q9PRR29VjQRhwB/D373yPSIAquwJ2CAYABR68nQ9Z/AHdXcvG+xYxAtpvGtgn1wwu7/alrq7GgQ3PYerotmJA826G34/6P1lI/Lg+2gW1e6J1mf1jqUcuMwQgCdnaeKL2U0yeZn7mcVbx5WzXq/OYIfK/abouu1Vp1MzbV221drvW2GIHYK2w1srsqvO7uGiKNKJKWcKeq0cOEdr/BoYMisqF/IiISD/ZxDOuL7CpEPK7WSsNBD+B0Orn7XDLI1mW53d6s1UQkIq2qGYKBFN1rUVlOsbOiExGtO88pZ5vnObg7gvQDRHEugyj8Q+bGoJzolGXKaUqWuKT5UuZT0yW4OC7zab3e3H1dV51msCy3VXICw8lLKZcT1qpElcxVLRN7s/XtKtLEnROmCZdLfn45PZ0nV1uWKMrsbqXM8/l8pmExqrUy5VRE1aZpylnYW6sANYcC6gTORdiqKi21nBJBDKbmSfLXr19ba2U+G6pXPZ+ffv7jnz794U9/+Xr96U//YKn89cvXn//+H4QmB3MuztRBGbP2YGcV4h7RRZ30jsDheGPqFFTutoWkUxT9GpsJQKJkobFSFICAqpM6EZcyX4PESQScmISJ3FeAARYRcHZwa1prgzPnTE6cmKDLutS1KXEDqrIa1+aNBCyKauEP9J7/zcxab5fL5e9++bmuayklkh0jB1XgRJJShqOwFfCc+Ka6WlPLraG1Nqdk1oiQC+WSW2ur4TJP5NB2s1auDm590tWg8LpqrdqaMY9kUFBJU85FCVDoqq3WwnSapvNcsvjmzEySkEVEvEW+j41QN2JWIoowA0caWY89riMl3jTqgZ4JoR6oemuUDAy3nloV58lxU9+f5HeHDw2/bkxloHlid4CZUkpFPdg1+ho2IxJzjxyM2OYbKMeQX9truAUIdBecvTePPxI9Q+i4O8hcqVGw+Pd7HpDZHe7cJK+q9sJS2B0RQiCOlDYaEQs8ThqvlcwsWUkp7ZWtCCzsUDN2F7jCU5C4JnMxFqNMMpNMkAmSnBrIO70mu2tUBAPEOzmHDzH3KJGPwuVuND6UrN1k8zinH6GpDZM40GXoNvvHxRA/53ta9t+BTP1le2nZ/hNQ8EP4fU4mBr7aBOK2Zph5Q8wdJGzA5iPcfPzkYQAfRuB7Xdi6vP3Ku7z3h2HEu03kB1/B8ebHuKb7Lm/YbL++kzK/qwLxkEuwPe7D/n5naXw8GrhPcH34qsee+N23HqWIjrbsYXbfrrFRn9vgsO5x8qEV4N3gxx7eWpiOQS/xgAhv9J4U8thJup9Rd6dDyb3j0x5+S/ev7y2gD9/sz/rda0Ys+CPUO95hM44+rJIhlMcYDdNIlA0YwPbRP3VEbb127xAA20Yaz77bPPft/2htxZt7BSFm9t2O2rk+H84Outfst5sTBf394T4jlQBAzHzwBveY+s7kAHg8Swzec3l72CswGnHc23trdldg0DMdgG/3zxgAPUjNrhIQ2WF9Aght3j+0hUTlYKe9KrBv3oGg096XvrmNRBdubgAbQZgy0gnlksqZ8glZlOqqba3V1B1uzWury1qvb21t7u5qVWtd17asrVYHmliDrRASFtXWaxIBkQvFllIaPTrECTB1MochaOOHdAAfETLUB1k4uDu9R4gQJWFmArOkpgqiLoxH1V53MhA51Gqtztrinuycpwm+qgmIwATr4UZ1swgArbVaVSm5S6gWy7Ks66q1WdIIJKim7N2UQ0QiXBIz6fmUrwbIReazk9R2a6bJkVKaSvJartdrYp0nqVqzWyrs4FIKcXl7vQEkhuttTVLcnRpAPhUWosuUny7lPEvJ9Ha7/vrrl9dXXW5NeD7Nn6ZpBhCBQMycUpqmqdYWvbNVzVw4URJtTZtLySm5tpvBSFhKoiEOX6/LbW3zUp+eX85Pzynncjrdmp5fPl1ePr1Wt7Zymabp+dvbFSkZ3AnEcB7bGUwgZwKxD363yIjsJn4Peose5ueqicXdzbVXBo/7sRBRI4kTz8zYTEBUytPT09fly/GUW2s1ODNLziRFDetVtTklzpzgpNrULBxTa9XVWY3NeW2tiTshQrOTCJkC7loZpLX+3T/9cZ5nAp6eLiklM7vpwkmABOE0zdTsJScTpZTJl0YKgboR+VQy3HKStV6vtzqfX6Z0vn27Pk9T8BRHoQkQVI2IW7WqGpoAEbVazayU8vr6pg3GeKvX2+2qTWnmKefEwqhkLiBOSQq5sIiYa+Qoa11rXdXhTXVsUg/mag+IDwCllODXISIRyjlXjfOfIoyyRygbABIReLCqB1DG8WQ+IoxtdqQfrDAza43ciOFEOUc9b9GeEzu4v8y22pcPqv4uDzZMYEbdekq7DtOJAWiTHHyQlSw9qGeTIGbmzcnI3dUPnDmxeg9nb6QSdDvlgYY7EdiNWJiJ4Q5zUzfuGRYOArV1cREkd2t9iJydwAJXc1LX6prHc1trjZ3hLPDMNIlMkCJpNfdQdzqR9V7rJsT51sKoUfRdBHfo170drwEUlt3hlO6GPBwgCt2BZgx9gbvr+1D2Z7tMqAdrEcjuzMMGkI/ETewSddcufJh+t2+ly5e4gYPgZI4e4rXdh4givqoDHo6ohIOH/B1o+X3w9uEA4oAKPvxqTOsH+QCHC4yIGCS0+dDuUpaPb9zdR1TCGENsm/E4+O6+afv3s/bdZh8nbtOrD689zfruYu+m+TEr+yy4R1mfxye6O3pZjYMFs6/nXWnsvYgB6S1wI99CDQ+dvWsSEd2FABFttQgeVbTxsqO3dMP9+GgFdJkX+9vZI/aOgqWxR+TEv3wIEdlm8f2I/87r+Kv4qR20nN4eu0fk9789LqZDp5jFCTzoYu5miMZr/8lOjhT/CvbYITk+qN+Eid45IY994UOq63s9YXwVqP0xl+N+JN/rxGNYXMckEBMMHnFBTq4GUNj+RlRJX2sa5zYTqRkBNA7E2EQWTttRRCYUiViOZuZM7FA4IcqeEgmjmXOnlO0tB5zY7pWlvth7oUcH2MgTibOTsxG5YZzrtukg+N0VFVRIQXyTnE+SLlyKSSYRQhicWlTihNdadbktb7fb9Va1AXA1q2tb1nVdl3V1JlVtMCVmTzRyeXnY+8l9cPjwNqLe6dh6bcdOjTEyyyNKxJmIxIjJyQgJzMzNmyHmqGcUBJnpcXHGVykld7pdV3cHkxlz4mnOOBVZG5uJCMXD1c0bIwmn2zrYBkHu3lqrbub07fXW1EspLy8v3QwJsjCqEECRdoyUZGmSRBJLEocQE1VXbQZQTrO2W06Tlfnrl7+q6g+fLqbmhOmUDZ5TZm7rokWdJlpXpx7eayVhLiknvFymH57PLBBgWeqXL9/e3mytnvLpfH6ay5SJacpP50ueJkpCRLU1kGhDrbdWa+xxd1q1LUubUimlTIKn82kSsvWq6svtlnO+XJ4ckFym04Xy/HZr50u+fPrhX//8l8vLTz/+8staNU+QnJwp4jF7DVISZifKbo22MqxD1o1d0uEngsHETFUlZ3enbuej47QKMZiNiAa/B6c8n59efw1CI1CSxFiFyUzy3NRqa86SUlFQrfX29oo8365LazClxdO12aq+ggykjqgXYp0CUFjEgGYQdrj//ONPbDbnbKcLc2rGqipVU0pMMqVsbJTy2kwZq2tRZacFSoS1vjla+AAvl3Mzv76+zYUTUCItaRyzrZlLig0YKlzO+aaaMl0ul1ob1dUJrdbIxklgIcDUosZiTqUUzqxQuDND4GuwV9XajFtrVtWbmplT23Und3cSyUBT9S0ZhsjUpcU5QxKswaoKCDM7x9QdTvVxBN3DiC6etkPAzNyVzIgdLMo1S+aS1lbbWptvxloLB//4k5m5qrK7unPYUDqc6ocHD86FvnJ2+eUAO+J3PSKFmcKbG7asENxutox4mfD4+lAwhqUf3HkZO4nPwxm7L9t4umFUqB/DYQ0A2UIpDjaOag+RNqNaVTtFhZuSNrPakgPZxAlIxAVSWHIUdoQ7jMxBFpKHiINDwV0DZFOgNNpbeGz2UV7E2/ikFwaNXmBHAmN+3Z3ZoyLBXgFnm2gA2mx7rkfOCTiif8Nd7NCIqfWQkNRpwWKCjKzjCichIt6gYfBD9aiebY11hECb36YrlMwQyeFI7B0nowMdubuTKZgjcrjHKnYroQORlkTHWSSiY1jzI5Z95x+gQ9D/IVsmrqSBbTZ3hLojBb/nkQX13lS9KwC+lzXAu1eozZvJejtUo1LnZjb1g5/k/aoeQ7ovj8M1PU5p72+A9y2S550asI/hwd4/mvH4Ex95SsenE5Frv5tE1VWKGnF3uuJxihMPvB/TycQsTOQHAH1Y3+TqrdfoHls9wEeENAixWWcqo3HAGIwdTs7BoWottkf822E5Ew2CucN87MrG/SwyxtRGUtER0ob5EZKwR6Lvc8zBi++OzkQWBc+36obdQM7DFmtmW6CgHyE1PcZvOLOA3Vu0vAO7znZJUUYRgIUsJzBDWKJObp9aZwyre61NhCmFCT+cQUREUVvFsflz4WN57N2ExPlNRIBGDBgwKqCPAPwRbyojrAzU4/09Jj11RkKC606ZicDugQhNckgkiyAaJZCDpds8I2LVe0XhsMZT2JjJnYhDMzCCk8AdiMrtwLi01xE+zCJGmgIRERgE6/F/5A7mAozMA+JxfPRDXEaRPKIe/UTmBm3mTDmzzFQuVi6en9JpgrhTI1gGaUrammutt+X29nZ901rJyMyCC//1dl1qUwcM1eraKgmTFwNMHWrNjMkkJxGzasxkhhb2PYCEwa5uTrxqa26K4N4RSKpqUy4GVxsOEY6AdfLIniAYdRECN20V7tparVVEylzAvDZLzFGmoCl+epmneX41M7PMbNVdIWwk1V3hLJiak2HNWdpar+uN4PNUfNW320Ju63K9vn1blyuA8GkASAZ4ZRiTkltThfmU8pz9+ZxuzY1WQYZbolOiib1N0/zbX391n5dF/+PL8sPn57frq8hbSaxWmfF85jXzrXIu59tiVf08l5KEdD1P8+fnUyZo1bdrXW66rPq6rPn08vL5U57SJeUnkddmwliX+svnP9zWGqWXTFti4pSsvbm2lCQlKdlKljmluYje1te2nKeUhKb51Fpr1U5Pz3m6zE+fnFO6PFGeJM1fv7w+f+YiqYHqsp7P56U2YqHYnwpi72YOyhYKXSfRViKE6kfDY+bOau5gTqXWtQsP9+ALEkkivK4rkafEDWhtLQIBr6pOqcxPTf+NSjLDrV3TlGrVWmvzpEZ1rVXVyIg9kbTmjGxqS2OVYgXLza5rW6L6krW6NAZJKi45UNQssrz+9vn56YfzOTuJpHTiqVxyOa1vt+utiuRlWW5vfDqdPKd8OhWyyfzarNZGxM79yFVOwqUZwWma6Zx5RnspM8FKmrS223pLaXpdmjt/e3tbq7/88GNtzYE0FSWknNe21FqbVrI6J56SoLW64PIknDkSR1MWoqRay5RXNDexVRQSMVQwCgu6mUkWZpC5iMDs9dstZcmZQWZNtbVIAShlNiopzyS5tRAKNNBDCvcdYCklphTaMTO7a84iIrebxt40M+YkQeMb9Jfeg8HmU6nqQSQQbVMzIppyCpXcFE4CTh4Fph3eDExwMvPgjUqcgs0cBCJTUxpP6dVowyPjCoT1T4nRc8NcfaCWLul6KfcwZCjDYaMGmCPUe3QgsSsG6CGs5k5JGO4EtqYGEpGg7YSZe3UWUyeIg0ENRg7inJylkUIrN6JVnJhzVnM1V+fFVVUZPkGuUDXTVsmMqBdJ1igpE3XTYEKcJKQxqZNTV2yGadaHBOlpEIENdEReRbfcXQ7GaY4Iua4Chb4GAg+nrqmGyLYoekk9NDRMbB1UhMcG5IgidQhyjg4wejibGzPBR/iK95RppkBdQTzkwVRH8Ihq3QoHdTs6Ewu6J9JHUosbtGchBPYiZsBgDngSHjjQ4J57tp7DN2QQ1iul4dsc6Jzdved7jCh/dP9FjLwSU5JI4u8Z+W1tDiUPhe0Qqsau3uAdRwymDA9iDD8kowcjmWndXArBwhRKTq0tEFdMilnXRzutP7lFHQmBSOrjb2baQ66Gx8W3JPjQ/jrOh3VvTEcie3hPEjEjWMeF2FSj+7C0XXOIlrMT4HYoChao0aMXwyXkHnWiRkD13l8GqyqgTLGoulaTjlnb6BpP2xSFA/LC5k/YtKKjktT3gds2AX3QGQLqRV/J+hHj6MlQIy6K7wsG43dNtnetGgrf8cPQTd5f7J3a4c4tsqHFuw/H62hZ1+97vmgL2iE5ZoEQCUbxDjj59n486HjEbB/SlucO2VS3iPIYSSebin88Z+/G5IPBGn0CMOhNeVcs3ydFdOPEg2q7X+Acqbvh3+pVAMQ9GC2DTyNa5AODB/4epglHqBODpCI4RMcDovYF3afLbCnCUfi2r60wGg6dh6nTHG2GhK4k3W+wnrfK4MQg5ow0IV14euLTZCwsoK7HmzXT6sHr35qZmikMph1nu5EpmiqAZtpaI3WGG4tHYZGISGXuhFzHfcckFPkVBqco48VJoqQaCTOzhXiibgsiDRMOUxLuPH28BQjFSRo33+KD3b2qRmU971RPHmMGJ2uuqgSjxIAzMVkmgKiqt2Pgbxaa51lYJZfz+VxKiacMYiJxcyIXMkCFjFy1Nrcmzm5VdTVy7rSYlChROV2eP13/8hcjSia/fbk+P516TLY5w7LIXOa5tbVaEjfDVETISfmUuQgz0Vrt3//6H3/+62+31RysZpzSTz//ICCtTUClzLo0dQNzKaXVGuF9zACLI0lyES+COacEJ/MkYspW21rt8+eXaToZCyTJdKrKL59+ABd1cUos2ZyadfOVGQiCHtWzGbQ8BOHRZBUb9YMTjDr/w9FaA/hxZkWktnVdVzNzdjXV5uC8VuOcJRVPQsheV3M3JzOYM1iYWrBWqVetrpqCvGhRujYsBnVp2pyYmTPYmDllpBzB962tBDufpvM0XaZCRO54eXkpZf7t9WbOtem3t2tJ8vTyaVVPWSaf16ZZlmpOZg6LBEVXqDnBM8uceM40Z54TuRI5OFibwGr+druq6uXyPM9zFNcr88WZABaPYP/FWvWmaMaWmShzyiWlIrkkkeg+3q7f6nKztWsgiTkLp9SypJRS2M+YiNgTi6Rk5mou1ZzcaxTLhgJFyBzqg4HxPstwmKTu8pG2Kd6irs2Ci4ggLIAOR79ZG4uzFxrSnpIPGoHEvln6e94UdUubjYMUYGbT5hscYRCRCAMwrSE5uWfdCizCmjrkR1hfgwaGBa4h3XGQ+B9KmU0iH0X5toa1N14B0VGkKSZidMui8g2Fg1crkTdyJwY5Nc5SUbMkMwiY23BxM/aSp+QAGXdkRh3DshFj5OHTcMIc4qS/LzOJOqnJJizvvjqYAt0No9YXweB6z0kdPzTrGM3gACk6DYYSHObejcdxzwgIFBod21sO76zYZHDcR3wETNyN0ETkrmHToy4xd/xwCMI4Dka/IL5g32cf7ETE+2COWpK7fW0HJIfBeciUsFGkYQ/rj29Z4M6hK9EBANwbiAP23GVpvoeRx675sIX3ym7HJN0YWOqeh4e1PcLq7tAjgIhroHuIgl5xYlwzFB6AbPPQHc353R13F0S9PfcBzo31to/tMdTnXfN6Ipm/w8PsYH9kAbLR2o9fW1O2Y+7QyYi5uGuB++Oq+t5t3z/if/BX74/X33/E0Tkby86NCHJ85nHP9F/Fn4cbboRK2zVR4fAozh/OwW3Wj23eXHjHl3caxzvk7buOQUMruKuB0LHvPYg/9mtrz0NP3d/17nBZb3OPRYsI/r4vB6LuYWPmQUiHA53RNnIbEN+P0b5FjEG94simYWK/697y4xD1IT0sxZC4xwC28UNsg9/l4nbN+G1iYnAmnimd0umSzkmzBEqJDMuqviy2rPV2a3XR2oJ6xVvTtbZlVWtqtdYKoJo2bcxoYTEIBaCrJ5TLdhq6WyOiiJ/2ceRTVAMQ4VE6dIOMoyM7MWhc1rk7RQBoMwDRkjhVh7vTW2tNVwCZc2c9ZGdmb95aMzMTpGFtUrdm3lpb26oaZ3qUoOVSMkHzVKapMFOoQeFysl4pCcwizEQtMSX2TJ7ERa1ZUKMoyKs2Z5ry9Pnzj1++fW2tLapfvnwp6Sev5hmWkAUycWZiTsSNsoF5LoWiWCTR9dvrqu3rl9cvr7evr2+r8nR5+fT555eXz0xJUk55Ys6z8m19zTlL5uXtBjhcyZTCvkTE5IkN7sLQdUXV+VTKXBJcrTpxLqUaOYRlAueXzz9ZmkmypDJdmFMyEIGZqJk2hxDLMIZtq/H94fZwjGybzkeejA/Jgx5gR+YIRsuAESklIlvXN1VNkOut5XJuaVakiJkA4CQOquYOMkrDu2br2qq5mphKU6/q6jBmIyZOSdhJlILMFEygROutzil9frqcCp8ylzIz1x8/fzqfZ/6NRUSJv76tItfzy5JkLiWllNxtWW+xQqbGzU3dYC6glFKWlHM6JT5lFu4puWZGJKv6bW3mZCDOJeVMzKfT6dPzU1vWCjAcMIYTWxKcS3p6KpdTupzL82W6nKechcirGsyX66K1ovP5EgmT7CcSCwa/bkRNQKS7tmxw3sMZxAbycAIbgC1722tthwnd73wHbnqIC7u7C0G4Gy+jKjSC7lNbaz4qnNiI6I8rQ64/wAgAfh9JTOEvtU4e7Y4NcGOD4psBeNzQzI12y310gUFmHlShscePAiP4jXqF0WGQDOzFTEdKUFWL0hhmHuOWOLzcm2RR1WBPiGnoiJMMqpCmmlRZg2sYLkIc2IPgxACRk1Hq+jNi/AlmxtKnlbaij4eNtwmmh51Id2J33HaP7umzb3eBTxvGCOO34S7QK3oVLFObOkF3Ud3j/WFeWogQPIQ3R4zxnWy042+Pn8fxM2QlSShZu5P88WjyQ1Lyds+7Vh3CQxydP/c4rgMkbD+JUdqMX6PkLfrK9KE8uJoPPfZ70G4cp9GqMK3K9hV2GENEu+IxtgbHWbq1p/+q6ztHjBS+wa6wOR7UBj+O/r4lj232fabGYND47fYKy7QBj4j50P3vAuMDvu1gbuv4h7/a5FA6Cqf9u2Mc2Lv98PC+I6t72bb9uZXUxrBSx5923EEfdfj9gx4+/J2BIKJjuufxV1uP7pfIbgX4EGjSPXL9nZYfrzl25Pj53biN1flwqzh/vSusv5f9fH/i7z3aPjlcg0PNrPh5pEod7RMH3N9ROt/F+bEf1o91G8YBsRtAewEKDGUAB33gfsTuR/uw5AhjP74fn/eDFutKNbbQPstEW7GMx9+6q4WdFiLOSSmnMkmZeZ48Z2erTtVobbYuutx0Wb2urbWoFaS681KHZ6C1ZtQ9GwHgVJsPS0OoAWrVrPR9wZxzDvzQWoOaDmq2QAnbaGzZfnR4xefxPjaXmbk1AK21Q5GBvsastXVdmXmappxzBJCTo9aqZupG4GBchZnVuqx6vV2rNXUizswcRZcAdai700hWjuAHIlKtpjWBI2tUJF9O5XxNU2lwaSS2aq3uqq1F9IAK0nSaP//089dv327X1+ry19++PU1iE02JVRxGEtmGrU3MJJQsSDXdm355vX19vX57vV6rropUpqfL5+dPn8t0WtXU2FzAokYGPp+fhNNf16YLmatpI12AldGEWYCS0iTpajdtjc7T+TSnxGbNAU45IaX5bJQun348X37wNC+U0nx6PjOXiSSzZHBSVTVwkm1ZxnQRkdujav3hYsZBlpiZ9/r2/WJmbq1FNbdSpqmk9fql1uYOctSqU5lBWS2xq3oCE3lyNVNfzYIGjCinDH19i1C0qq0am4sTQzhBOAVhKKQ7P40dRUQZk6TL6aTrolPK5/N5nn7+/OmHz5/+/JdflSCpVK+/vS34819//vRDKaXkfCr5XLLAnakq11oNSMw5S5YiQkQi3hhmDapaa1ODudyWel3WaiL5RCyAXC6nl+enIqzLaqYGCCwLJ05PE56fy6dLeb6k5+fpfMnzlFjgjuYKMubIigWo5yaFcb3W6moiLCJheGmtEXkpJeyxADmxSLDiJyJxR4RwtB44uikt2/HrW/TOXkfMou4Sh3o/lIH4ialqJGwurfK6OvWaHiLSVA+I/PEw7IHdnTHyuLTkaOTezm0ictdI7hjYITgSHEGWQCbE+7e+G/4HBWNH2O9PZhplDSLEnDcFwJUHL9BAunuIy77gd5sORISYhUc0RcBob1qbS2J3cvScUFOjRskBd3YO9YwcALtJuKmJezAFQbrkPeCfg/j+nqx/GN7jbn3Y0TGm1oscH9O9bDM48sF2uw2J+wglOtztaAnellD8fd+Y++STdz04yo4jQthQ3H2P3D+Q4x90fHvg+8PtgBb6H77XmkCkGW2jvUHEu2Tz41CMJfnQmHGBv5ugj/1UY752n0Bvw3tDTL/VvoOOZsrtgi6Pxp987PJdexj3YSDHkcHQPz5cex9++O4OR/D8TpWNWQZtU5LGd/4I/o7o/13urP8txeDDQf9+o48azBG473f73m7cPt7u05+ud/bm32ntR/fcn/VB1vBHr7vDqyf6jyTpzv4bJr27BjycGv1WARQ2gD0MKn7IaSXezRIddncg75FISkSDEGrH94PYud8B6Nw/Y4XbY1llYmzt2A+LXYSg5wPtTY8d5AQbiWVAj7WP9zE4fZC3Hh1m4yhxNgVgDPLdBYefSFQzOH7ku9q23znmIlYYtAMyj2oAhkScXYrnjDLLTK25VlS12nxZfVnbem1rtbZGNLAZtLXWVtUaLCJmpuiedDibmXsPZSEijzBC1aarr8TMucxERMwbnR96XkQPE3DHESKYgZmcQUwGam4nyceTSFVD+bFePqxvCuaEXo/dEvGp5Llk5ho/WW43b93MFhPT1Mg4kL26Gpig5MweFEEhhNSsuVZr1VpV71YSd2vuzVuGCHFOmIucCgm4ghY1Wqu2qmpOmZlXbcTp84+/mGTifL58+vbrv7/eqplbdhMSaze9iQhMKRmZXrWpOojN8Hpd3q7rt1u7rpry6fL80/npyYyJ5OXl00/Pn2ut19ZEcilzwAKJ5HttXm+uN8LKAiHJws+n+VKK6KzVhXtqtVnjlCHTfLrMl0+Vyudf/oR8mi6f1mpIZT5fnERSMWZOoupgEIkPosPjlo8DajMZOtGWZrSFQdwJDKtam7sHCdTGsNRaba3lnDN4vXZXwPqmBkmSATEla0xc2NGaGoJRUaupEbIQM6eUWoM2q0bmpMRKrM6SGTyilcxoExrWJuanOV+m0pZ1FbLplHL+8YeXv//ll//63/77r99eW2vEeFvX9S9/hfmny/nTp09Tpqc5Z7LmlkGQTJ3WllOKQnKAgcx01ea2rK2pN7Ovb8vtZiv484+fynQCyTSd4LTcbiIS9b/IPSfMkp5mPBVMyU+Zshihuboi/DDNXaMQ8BaBq4Nsd2yTXm5xpGkGx66bKRGEghI0E2eDmJOpkluLNEuCatvPwo6fhgrXw7e8tT3QmQ6hgKo7DXwslVqrejNyEUmeamt2QKsbuIub2GAB2m5ogWwORiiO+DMCEUdAPNSInSkxM9jJHPBwfbh33L515+jEwCa2yCKPCyOoIJa3RGDPsDcDAfWE3EDeqxG7Qd2YujuBwJud1eP8NhGK8oZg7rBYzcRaa6lVtiTOCSQOVvKIq+fOQRFygNzDIsVdKvTJd+YujbZc3jvkw9vng4UXGBFfhGMoS4z8btvetnmMj6OziJAZmfnGa90ZwQ4PRS/kBAsOx3HdDtZ7YA91c9sjGB2iznsO+9Ar6ChHYRyHyLh6F6mHaPV7L8RY4mShc9xZuLFTexM5weB8WHjG42nhwfB9UUEtCHRpW2Djnh1D+SELorewryg/4t2RibBH73wIrrb7dMN3L9O2f9Ux2zAXdsAM0Eijdx+VNvwDULqP5OGrfpnvlRh6s7dMkx3SjJZvEP5eoRoqhg+z5j1Qf2zJ8bd3/E7bKx2h9vYAfB/EbwB9a8r4Zf/5g6paDhX+jlPC9HENMj9o4RjWguNAfA/KHy97f07tisH9+w+Hb7uJfV8be5iYwxd3HpVNAByjOLYWbj093uSuYeOTmE4fyTT3eh7oPkpk9I8xPDBx1diiD52NRw8vGEeexPa1B1/DsGxt+vp2AQ7jcDiqQER7wUUahEgPw+XD2vHxCHfGgd/Thh+6Ix0QbzlPfl/q/KATAg5WUgLYWQyZ8ommQlOiJBC4m61uRk29rm296XJrdbHWtKmqmqG1poGSQ4C7D+8brCcCduI+ZoaYD27+ZkgppTzRiNK5d+xSwCOMgIEPg24JzJzMmh92H9+vMeYUpQPig5RSTnme55yz1W68r1XZYAruB/S+wcMNAY0qNZQykwuIW2tJJAWtvbt5C28AS95y6FtrkSU2JZwy4DY3mhPW5JEiTJQgXJsR6+Xl6aScpufny+nf59Of//t/1WVZbnpKWDPnRCUlZrS2UmZtpg6n/LYs377eFrXqdL58+vTDz0/Pn1I5z6fL+fJ0Pj2B5dvrt6+3G4imaXaztVZxJDghgh1UmEvyOcspCZu62VySy8k9MjVpqc3UNdcsZXr+3Facnn7yNMl0EValxPlkcKTELCQ5KsoGwtsW6hA5H8iMA0i6O7j6GjYyczOlIKMAgnFhXZqZGVk1M4VITk5XtVxmTq4uJJOp5cTVtWkDmFJmZwdM9dZJYDObEtzcmqGZ12arqUgisg4ZmaVvbYVhmqZ5LvM8R6fWujDR03n++z/+4ad/+fzl9duyLJREhGpbf/vtN9g6Tfl0nuepsFlra2PKuYzDQdmW0HsNRsCtVje6LXVpvqq+XlulfHn+8fz8kxMx82m+uK3X261IAifzxm454TLL85lPhafkAjVd2gKYiAiEPZJGm1rsVbUINYlxLqW0MezmRgROkpgMrqq1qZBDhFPilJMUpZKUjZMxuQ9eJyLmxIeozuOb7VjYFACMjTa2P5EwETuTiLQozisknLaNr5v83RB4t7X33RoxQhsrqJm5G3wXQDGnrS5m5lYZDAFz0GNQa+vAQO5uI1VsP04PRy51mH1/KB0UG9sAxzjNDE7uUYsm1Ixe9DAUBt5F1QGKHJEZzKxZY0OyxlYTWxLQRDJRTr661h7x30PnLdQJIgosPqgoCICRPdA1bn38fWg1LMfvBfdjLl9fUWjYIbsPG/AmE7vBCN9/xerq2CnCcg6L4NCMPaArvsZRRJId5nQTEMdMle4RGo3f0GD/+YbQtnPsodejnXv3t2X/MJLuwZp4Vzz4iJoO99/vvOVhHptNFGRPO/i5e8r+5oOp3JDSuErf//Z7f/q7yBdsovMYc7+D5Ijc6+xG2z7ysT23Hf0Abx4efVwMD23r17/r5gjWevxV+ii+He4exQn7fwfgGFVg4jIbxQuYefd/DIAV9oD/s69j7giOa/d3PzyC5m0lbe9xkLKGoCjwXe/v7HtDf90t0DGudh+k8vD/x6HHUJ7vSKPsUMyZD4VaolV6OIAiFpkOGmF4AxDkQNhLYm3Z61vfx7gFjOBA7tvq2fTX6NhhZ+5LkCKjlshhUc0gugLq3MVjaW1WByBKDkU791C/voq3LefUKdEBePc+9/wB92GE8UdREmNEvNtIxsI+bAkSHAwY7lsORr/aMTwJ91GAFNRDgAQNu1HhfKJylvmUToUn8uwwBCkf4Gbabm252bq4G1nYObr5sLVm1hxK7CLcs7E655Vpa+bk7iIJFCTWoNBJyBxqzbU2c0spRVwHvBvyR74gmhsJC6e+LJzAJDmFWRE9OhwOd1JmFk6RtMfMgyFBAaRgPyJy93VZ1nU9eAk2ye1KGiwifWk5DCTCibO5rGYiUpKUJORmWrUyI0c0FXFXXVQrGJL8NMuLFiy+1HYpop7fbnWtGkRYasa5rEpS5nR+ziX/+PdZiV9//cvbl/9YlnqtjWHCKEmW9SYpGWBgkH+7VW2pnC8/PD29fP55Pl1UTZ1zORnxX3/97b9+eVNVc5yfLs+fP728vHz5j/9YdMmJkhEjMyyx5eSl8JRY21pvfj5NnOl6rbW1k8wuyYgln/Lp8vzpZ2mMfC6XZ+VpuiRKhXKGOnFRUCIJPhAcjDR9K4UIYEHIyG4fjWSPhkhLh4fOre5kONCA8NAoYgG7Owln+FJrBVMpxW5V3efL2W1Roun8tAA5p6V+M3BwRpFwQnZAFWrWrGkUTmJu1VrzqtScPELqwSmlknqUsxkTc+LsTq25CuBU1yaocPnpx8//+R///vX69uf/+PW2LuAizG/rG761Uoq5Wm1tXQhWBDLMAa3VBgRZiqoapbdrNae3m741qyaL53x5fvn5j5InuJ9KljS3tblRtQp2ciXWInIu9FTkeUpPRbJAEGZ3j1g4SaxGvb5acPu6m8OgDo2Ef3cnU/fmKQ6SxMw9yA9GRNkZJM7CksPGQZBRxI3dmYmYaYv8OaAfYWLp+QZxXu0egNiAJMwWxl8PX6JqHJBxwljEssfFmz855JrIXamvGNvY6rFgVHUEnNC22XvGjhtR6BiewhXjvVokA+TdgbnZtgbdDY/R3E5mJ+p0xpEwGqFE7MQiRMIsbkYRUkXOIGFQjz2KFKaOLX3w77k2A9gzNjAd5RF5QXWslFYmSUlkRpqpsN+YIoQpID7c3KwxM7ao4JBZEfREPbd1Eyw0eP2HsMDI1Y8fdfNvN7Fv9DQWzetVIIY8AlHg+wGIqSMAIiIn77qiHYC7u3tviXOXid1K7QdUjR5OvlH7bQ8F+g27Ee0AMIihxg6wdcWEumFwn8bo3f4Tigzj42uTsxsOChh8AFx+gFjRtghtjYtjNODdv03bWNEYrw6V3XyMDAfMwMCkPUE5piYmYgCP0Z7ekLEpRkt2TYP6zw92WOrQafyko1mzFvO2DzXFGPJxTA6DJtuVhyVxnAvBgHCHJIRgj9RtILfkVBrd3lr1oRoQLEDDqKpAYKTdiAwgqprESk5HzWzTZmhv2aFLh/dbdPKDDnQHuA9wfB/xjwD99y7Yuvc7iP/hyPONoGB4Ho6DtaHAg7ntvWHjTgPzjx66XXMc/fHtroZu+RUb+t+e+71BwGEWDn/uoPajcXhUBIPq63eG+sM2w+FQdjKKihWbgiFAP+yPvz1qMhi7alP59r7TBvEd6FIW91YW9P2/B2v9zSH60KJAkPfugofF+XBnY0qUkkv2dOJy4tMsU6LsldydPMqkGJm61qYrrLmBQNK91tbL8OlgJ2DmSNRzM7Pampnpsexa1NOlfsptIg1MIqK68yJvoxEvEUkpA2i1WxBzztrqRqbhw2Dj7lti8X0+sauZGW1lvFprFHRgKatWEiGJgqP9pFBrUcYzgVgSktQGb8ow4g4LWlubUknMnIJMmpkjSIHIiwgzq6Hq7cqmRRp4zriKGjQstDnPS1PITGn6utTz5dM//F8u//pf/9dFra1vZqutC1yTgnwi5bVqc7DA+fzyy09//w//+Kc//cOX12+//fp1qUty+/XLN/r6aq09nz/9/PMvuRRO8vnzp7/7wx/Wt2///ctvPzzNNCWRlqkkUSZldiGdhJg8Z5GU3t5enSDTXJzL0/Pnn/749MMfX375u9kzUjldfvi6LufzcwOxTA3NiM2jEkKw2Q7KbZK7Khr3J+0W3/WwmI+7DKOYA4sAnXwWRDlnr9qcUspNy619AUuZT/XaQJKnk9Y1l+J4IxFz88jvTFykhNvq9etrwx6j3JkSSSQRg3NOc0lTLszcdG3V1lXV+dt1+e3bjX2apombCq11Xc9Pn//0xz/89etvt3W9rle3ZkzW/OvbKzPXusIdtU4llZIsCO/RvZSmXk1bs5zk27WB5a3iWqkRGU+X02fw1MBP5/Npzm/L6+3bK7tLEjNn8sJU2CeiKXlmZPLLNKVMUS43pZRSqqbe1CU5NyXFQJMt9mmt3pSIIgpy2Ol9SlnNmlWYJ+ZV22QGRXi+oti1qQdV0oBuPZ7hqAAET+7mKtiiHVJK237vEspMzRq1BjeDg9Rbba25CctI5zUnwHmDR9ILBu9rpgsOZh/kPqrOzAE640xQYLTUiBH+QzrEF+3Bn3xckAf7631u1VjbPY3IoW49oBG9zoCoGbERsQyd9v1Z3eMhYWaWyGHOvBtSGQZrWkELKDPnUxIpSBPlDE4gJTaEAt3/O+KQsGk1N0R/D17sowzCAA8Y1igcpN4DsMHIvnuQLwzSkQoCIHLqvNvdHQfDXEjt35F723M3k7lHLNDxN3dg/a7KQf/k3WtbdcdH7d/ydl6F7W+0gT7wVxCRqW5kdBviOqimw6rY60BHSswhQcLj2LwTghjwlx1EvNVFx+F4vAsAvmvS7mcbF+8n8D71w1fG8gj5ApkM7rX7ogd+nNm7iZAjWMfhY9hgDIulFTSPY1O/M+o/LKcD3H0EePtA4TFogg4egIefpG0cH9buw1Gyfc4MCyYPgCgkm0fZIiISQkoMgGDEJEM//gg73ike24PsEB+5BWQdKXeoM910Bc4Oo8ajWqq760HQbuLWR1Z7HIVjXR11GB5qJQA9bvKHBfe4//fxefRnxdE81vR9QNv9HbanBiZz2t0w+9BtdGkAgnOEDhUPug7N+5kt4ujlM2PQhHZfQW+ME4GcHMTmzaOMoPRQwxgfd7ejs4LCX3unfgAw+mAjuvfEEwBEkcyqzBtHMhGR0zitulYe84tq1QE/xNsdxNsxmyUKvflmi9pmTU3NrIeqHFobDbC+qzkjnXi65HniwsaubVv5prrWW62raouAY4aAfNV6u92WZTFXEVHf7XMiQtbUoczMnIows9bVExPnZbmV4nnOZq2tcOIypaZ+u92aW85ZFcF1GLihtWYGZmaR1poTcs6lzH35IqKJ8rKstdZpmkrJRLTcrmZapomTGFzdQhSVclqW5a9//evMOk9ny195muq3mnNG4i1bMUoviUjwVuSUQVLNAC6l1NYEYJgAWTofig9qC4MbPOeU2JmQGKc5nVYushDn6XRaq15vt8V1vV2pPLk7cVIHQcrTvKha8x//8T8///jjv/63//3f/+1fgwy1mrelkUuapvP56fL0cnn+9PT0PJ8u//Jvvy7L8u3rV1V9Op/yhJfL+fPLy+fnH58uFxKqtZYst+vXy5R++vT8NIlVfX29Pj1NL8+Xt+vXnPmpJH19m6f5drvlIk/PLy8/fAbT56fPl88///Knf/z8yz8gXUo+laeXBcR5NpaUSzXnlN0A4mYa6lashJSEAAtq1FEMLk7LnLNHdVVzdYvwbB9wH4CbttY2QcjMkog5mWt4Lc3M4BB2FZCQpDRPr7ev12WRVNbb69PzD+v12+22iEjkaYhkTqLB+krEzHOZvYG1lcSN2JspErmXOVmtpqjk5JimSVutDcpuVf/lv/+b/+EXSqmZX1gc/PXr15fL+T//p39a1rW29dvra6tWplRr++3b61prTkncq7YzpmVZchbmZFCFm/ut6nKrkvKKfP22vK0VaZ7On+anz1Tma7XPl5fpfKrrra2VmQVS6y1xLkxzljmhUMsucyrn0+TWyDMzlzJJSgC8VmvmrdfNjfA8J6y13tbVXZlBhJy4cCFdVRtR2rGI21KVkiVzyWTukqd19XVdCdzMGS3nbDARZjKvZoOsu2ojCes7E3FtBoAlD9S+w03VHuMQG9AM7tQsUl483O8xcZISnONE4q3K76jrxMzu7N7DxihlM+35VkQi0uqCTiEAAE1XuKQkCMXM3d1aU2ZmEAsYnCXBXFXhRt6pj5jFaiWilBJ3Oa4ixaxJIvLk7uRBbe+SRECs7uzMnIiPAMNqq6PYOXVDitRllbO4W63qxNM0icDdtJpkuLKtC685JZk5zZRPSIuZ6uKR5YMGgJPAPDjyDdba6sFbNGL5N0GFe8i1CX1scs6tq0KjpEwPft7F146yjODeyfiBYeHu9lMz825i6/GoYTGJugi04bEIUhrRURTPGndjV9swehdrjmEdF7iPkpLYRnXkePgwvZuqyX1MOYAenhSmq51Js6eJd/HKQWgag0e210nY8XFfb62NlUmBKMy6m0JVox2bMkNDDUtjLbq5kUWmCh/A2CblW23DW96v77DP9smNKmVRt6r7OoJHH0xAYjL0KsO4MxAHfjEi+KDBjb3MIOyF2N5h7k3l8MPdHKDN4tk1Iu7a7WYz787/bQzHh/d1sZiYhJyDyyimR1vQ+8oGWSOCpdOeBhztaSGe+BBcuK2h8cm+M99j1vevrd2/8ys66BgPqPfd0wPIfvDt95rx+817f/GxkccubN+GleUB928Pepjv402O/24/PG7mu5bwY7P/xzuyteT9T45CBfvIH1kOPmy2Du1cPLyoUYkDYqZHtqwgowfgh2Jtdpzxbd9R/EMPY7I1m8brfY/+Zgb23WH9nREYs/nBse7mDq5mZ6WJ0znNZ0rZdz9GVNNa11tbl3Vda11g5A4zV7e6rlbXKHjs5hELB2YJKIEe73TsHXVW0O40sJE28H76UkpRPCiamnPJOaeciYhIZWMrHJ4ZO7zCXBHIIIygceC2alnEsLHRjfAtCpzvrVZVJVagp8EJiJhAbO6AMrHByJCEUkql5DIlYXJrrYGhrgZkJoigMadeFhPCfp7lpZ1eV39rt1n0aRK/NSmnlczratw9xMSJJUlKeRJiPv9wvRnVumQh5pSoXObL+fnldDq5+/Vt+fdv1/br23q7ujtTOl/On1+en54vn55ffvz8wsbu5s3cVm1Gxk+XOf/9L8nq+s1SPZXkMC0cZX10Lsncm67i83w6n18+kSRKk0xn5JOniecz5ROkQBJAnAsJR7q8k29kKdtJuDm+HxbtQcB3GfD+aDPCCNASigBc6gUc1nUldkmSqLRWB/E7NVN1W2u9vHy6wb98/TW7p1JUNaXk1JzQEzGZzWyaJmNBUyHORU6NnDioKDNBxYUg1NVCVQezgZ3Trfq///plqesffvx0+fQZZmGmeXl6+vs//em6Lvp/6PV2W5sRF7A0cFur1pYJb8sqIljV7NZUFc5JQGw0/frlzZCAVE6Xcn4u5ydOJ6X09OlFSm6t1eXalhvrG5Mz+SSYM56KPE1+mfMp05y5ZBFJIsIsFknWY4NEpnpgENvKxQyjeC9ZzWDOTMaCtS1bDGe/g7uTSC4W4ewAmODWmprr5nnDvUDZJtp6dv44tPejxjsRgG888hi02vu6GGdn6E0eOcpE3RYS8f19de1n3bCkGVlPTIqvRvoj2Ug1YvcO93wMDjGs16rqpWrjAKMofaWHUx0YssODY/4BAEGNE5NIjDb7vhe2LXMUwUSUk2yulV1qqwkzW/NKntjWJZWccjqn6ZlOi6qaOLWw02gcXVG0KrJ4D3c6htBsAHQTFn0caB/P3DmN7pwDuDeYHu+Ae/nuA1C+xw8P6+HhdQ9Utt90Fr6DgOuWQHeP6lE04jX6t8M6TBTWvSF2x4cbirtrVX+ubh+OUPAOPYkoYgTsMCzHNotIWD83tedud3wHLx3H7kNc9DCM70fVoe+TK/zOKr+/ou7Adk3faQdCokgaPj7rzvtyj12/+4rIrg4yujOkH+8jkn6bF7OPQZAdKnIcW/UeV99fP7TW8bpXAEaNkb2pd+6wKBYokST48Aw6oP+HaTh+/tCs9809QvyH93djuD2I8P6JH776T4Iw52BX7+YJ6lsT2LJlO4+N9WrK+8GEOPOPK3UMiB820vsGHN/sA0vjJ9HT47gRjMaCYNqwYn9cUGDT7mvutYSPYLofTLwtShsVxQ7TENptAGVD7wV7sML1AvOGkZPdj058vAF8SJ7e3/CgDZuBWaik5E4cGcf3Pz8O0eHeYS34TpqUMzDqhQVV4v3YB/AOWbgtKXdzZxdmp4T0lM+fyulESVTZYVHzx2pty7re1rq0tqqqUHI3NVtbXde1Z7AJNTcCiClwhxHC4hYQvI+aGMiCjUS1tVbVavIUm572c7krABFj09oeydPvwwSOMjBIKQHOHDxIIcYTkaiu7j6SCEJVEACckxtaKLdRZ8jJiTiJqra2NmqSgvAQLGAHS4oyQyNm3cyViJJQyZKF2c3VmjVSQYod5LB+tGU2CsAKOxWqqst6+zQnfD7L13o10qWt1SmBhLQtaAISLlkdSNPTD3+Q6bwsSzOF0cv5k1ASkdWwLMutNjUCy6cffiQ3IT/P09M8sXQm9QLU66pam7f1zX35+nK5/PTpSW+vbwul5wv0xminyymsv3q9ciL2TCkj5TJdTs+fzi8/KKfp/JnzWfLs5UQpcyqJWVIGB5nWxurQy6LtgrAvQgF4W4eHjd4BBFFwhfUIZieEa9g4QqiT5F5aWOFGnAPxgUnYPUnOqcySp3K+0NcvRO7Ey1rLXIjEvYlIRD64geFJCC6UqSl5UzfLLCZI2hjkTuIa9WChDQb1as0ABpPwVBJeq337869fv719eVv++Z//6Yeffmxu7ctv//zP//zDLz//l//yv/4v//Iv//u//H+bwRU54VRkKqWarrfmXim2RipmWG9VtSq5ajJKTGkqp3y6XJ4+p/ns4Mt8cte2LNpW0hVWwV6EErVZ5GmiT+f8efZPZ7mcy6lkCq+XwWrkzZq2prVZbVab1lZrrea32l5vt3Vda62liBDc1dxFuqs1gu99QMhm3hwczmong5t7InL3ZmpNT0Rjm+7okDeK3hG/QYf4gW65DOgdCWkjyCFO+Y5Y41fDIQHrVdsj0eGQhdzPAcOuPGwN8pEfvOHSDacReY9/aB45T+5uTuxCzHBngDlCAGBmEkvU3d05uF9ACC4gGLG49yyW8OYPAOBCICQ+lMjYPGYA73iSJA7PkNhHNYhiIMxRvbFTSlSspHSR/FkuK9W2VjV3go1aOtSFSPyeNwEPAIMWjnaZMxAf9czdXSXZUweHQHcCwNzBPfaAn40BzMcxIADQcVRI53j0IWqg13HbkdgmrrZ7+iMroz2avyK52Yk7hvF7xaIn+DK6FyGQYW9DT4EYMrTn6vS5O6DBWHrRrwAG/YOt5ceHxlJ2dx8lFMJ7woewogC0PsDHNibo+YdGxAeGqCMEJxbGwXIfZjHqFZNtNK6jJ2DAv0FyOD7v4+mjYJkd4P/9mIfxnrcubriib3zdkPY9cGVCRGj4XXpGvw0THDwA/QNi/PC1Yc67T/qSeI+XAsXtCsMHVDzbXX7n84cGHVWW9z95j/sfHvE7b37n4u3P793//fUxpR+2kO/vv2FZe8dR44e0h002YNjwPmoAH39ybK1R3+p3vfsbk/041MfmHe9DXVHZFIP+PhgzQ+nA0WNJDzV3w4QTOsAWtdZN0tuZRfi9meqCkx4veL++H4buqAB8tPfGInw33u9vRXuv39+EEmchnKV8KqeXcjo5czVrrdXqtbW6tmXVWsNuJ4lIe1lNM/OmDgWIkWK4edT+5KAWPWTxRhuYuz3KR+i/Wt3iKYkohxefOKXE3ZwMMOect/vEPSUKbY143E2U0jCkbQsyVLuUUimzwJs1N4dzSllyMmYDE4HI3LqsIgJRJxWhxGpQV3ckEgO5Nu48BlGwB6rKYIaMku+ubtWY1FwV3pb12qrBOcMzICXlfHLIl0VqW91bFq9sq63tBuN0YiytEdHp9HS5vNzW9e3ttq4ryWRgYsoipyQpJbcmhCkna6trK5HxDDNrrm1tq9XVzMxbq7frF+Dzp9PPn3V5bcv1VNg1wf3l+RIk8Verp/NlMnCZWLKS5NPTp5//gHTi6cRlRs7E4izIUnLhJNv6pK4e3SVvhOj4nZPtey8iYk4uUUdFB9pndxLINAlgIDdjJxER5JynMp8vjHY7v1y//Icaf/70cxH/+vVrfXuLdBYK6iOiRIzEbs2bOYzdHE2cck9SdYYiUiQjEx+cEjNldReRKYtbe631//jrb//6l7/+v/7n//JP//xPaSrN6t/98e9/+vkPxHl+/vRP//x//fXr1z//63//y1/+/Lost3ZjkKpNObWqWJxEQ3dOZS7zUzUBZREppUzz03Say3wSkdaqtcXbIqjMSrAp4amkBD0lOhV/OvHLWc4FiaDWMombVzM3y2ZCcDWyzsG1rmtty1L9bV1fX9/erm8+IDRMDU6Jg8yHDoWTtjO/qnpEyO0H+4ax+uxH4Y4xj7zhicOJdHdWD3weq4U3b2obKaQPZ51viZgjmoQ5SO4PDY4zHVFSGDAn9q5CjhRk1WoW+FXcnUFbwimOosp6Uu9RlkVDmJmpBy0AkeJOSWTzlzD2wB6yYMg93qF3Z+9XHKEbidYGpdzJnRxCTm4wODVU8rXZ2vKECfki87NNC6+tqbbqAmMYGQ/4yRRhJVE/NnDbrgw9wIkeezwaREQ+6MWxg2DGCLE4zm+Xqx9x3P2u3PxY+h/veS/edh0PAMg2Xu2wdt7dgYbG0VXLbenuU7D/+47U33x3aHd/UUcXIad8QPOPQeAR/W9NMn10lz1csE1HXw+H9hxvTvTB59j3GojYyeHc37sBDLJDZei4QbeUf3gffyyX5u87+ztwdCx76vnoCJpE9l78ZzOq7iqHj0PGD1Zjv8sD6UfDmKMjPvzA8k5EQRAfYGIoAF3P+wBeA/iQKWjrLXYNe+/8wyM/ePNdlLvf59jn45v377+nIb2fiYeDZnvE9uZ40MeyBnemo+3n1qt7fPDaNlzczodk8FEd/M5kjk3B7xMGdHAeNkUeQfb7EqexxQ4DsHd/RBnumqfvaU69Jvluc/dRRzDM5jZ60DUB96FEUtAUxJKKM7PHrkTIqoyDAGPz9GUwUuSjX+4UNPcYBgcKEnSzUQr+3WR9Z2P//quP0n1VvH1ToZuYmBhGGekk+ZzKhdKkpK1aVW/BcL9qW1WrDGZ+azZy/DRMC1HlgMh76UzzqOfHoETcnCL8N1QIonC1dC7hoP8bQZwsLCKyeUsYbObqNBFN0wSO8nkknEqepOTEWG9LsPvH3WLYO20JkFLupmhnoog90GZu6uomIjlNyimwCYNyzgQ4VZgKUWYCxKOyhBmNg8bdI5gW1hgmJCQs3WvAJMIkROQgDa4QkIi0ZTVDpnQqbITk9HkWSFq18WKe7AaDLQpXU6pCqpLKLFMqc06WZDWzTGRtBaxkYUBL0rqSK7lVqHmDsRu7a4Vfb69Sb95WZiaB27rU69urLSfS25vWq5QTCYMk5+xQwJ6enuZ5Vqfz03Mup8vTZ6f0tvqny5OlQnmGTEjiArCTECLvZaz5o8iMP93dHJHxN1gT90PGvfON9CP0IAVjI4uIAg4jZicOkhViTiKq1VzR9c7srg5Wp+uiZb5cv36b5pcfnk7f/vpvhBRBYZCunEUKKXlEWlNJ2dBq2AvJcypmpgBBzAkMkgLKk2QS6TUr3EAyXy5G9Pr27evXb7f/5X+rrUH4v/3bbzzldWlg/uXv/uH5089/+OXv/+3f/vXPf/7zt9cvrTUyE0luIBJJJfhhpmmaTpfXa8vzdJlPUyk5p5QSvNlatS7Qha2xr4xVsM4ipyIT0zn5Kdkp2ZQg7HVd12rP5Wc1a1GEm50hDCc4zK1pj5EjhAauqlOZsnBmcXOBiUhKZGYZrKotovkgYFYzXVfnqhzRX1BY7NnAvhigX0Qs+H848j4RkZM+6qUwu43CcFv8nscdPdJXI4WJzD0kyDBJxjm7mxKC6JP4jkaPiIL5x4NjlOPcNjdLSUSCyMA2o9hDYt64jQFwaIT+0FjYRARE4ooxS8T0E5FI7zsRkffAMGZOQ8NicFQvtwgDN/LgBPJhUnYikvBYhmhgJiW4e2tNiFgI44yFm6t5baiaFCeTF76sxVbXm1aL6mmPsjpkHAPmrr5zVd8j+004R0QnhW98xw9Dmii2yJsjFo9j3CNT0YHdA79P0EGs9UCAoHMFAGgn5D8EjI2cgf36Dfdv8wYAttNeYxDpRHXnkD47if5df3uQj21wDoMP8IgAY6lvB1hQCVEkN4fZ/W6wI1rYnfb8wx5G5ge+2n0YxjiMD8Z5yL4Dmd7VmI4Yn10xG1Aqgjo2jyt3wNP/HD6KAZMwWna88xFAuo8KAH0s9gSebdlsV/JhJQyRwO4eAxBY4SFO4YDx2OFR0HNrzFG4YF9jCDm7PfpgbRwYsfuVCYgKHMOR746jB+B7Wsvvf4VdD/5AzQX20uXv7/ZeW9gUie39EZd/2J7fQf8ftmfbww+/elA2olPNjXseNz1cuR1U75vxcEZs4UPvH/q+R2Nbjvd+N1AUQQJHiDDebBe8H6JjO33Yde5asvVov37rlNGB0CquInay7YaHvvv+yYfdPLbtd2btOEHvL/vezR+W2WFN7i2/mzVC8GnOKV/y+SJzdufWvGpbV3JXrVrXti5uiiC9cQR0aE3NTMMrCtaIiB0ZHg8TxMyRytmzlyKeJ6Uhmo2GbsDCKSUMM5s5EVkmyTlzErOo3mMp56D2157g1ZVSd98yztd1zTnnnIM4KE5c9ShgrHXVWitwSilxTu5O5vF0IlM31xDbJAQH1C38xeZObuQw1WVZbrfbNBUuJZ4AI6uLODy7uxCJMTkTOSJpga2x0FPKilSNKV3szdamROvNVq7KJgBYnNuSkRLg1ZtVMzql8zwX6O312/L29maLJyEyTfAsTO5lysrG7Iy2qi3LYsvbTKt4KyUVTpmMyaHr7fpNrCYh0ypsTFTXG9iZUUpqrqD0/PL5xz/88fz802/flt++vJYnTUmSZC4FKSMJ2M3bsdDeNukPm3F7HQM6j4defEXvfuAEPex3oFPPhh/ZCExEnkQybFXVpemy1q+vb8/T9PL8g+cbuX39cl1uNUkBNYcJk5FqM1MlYgIDLkIz5wwhatlpnsu61qUqMa+tR5IZcyklMZRRlZdaa2sQKednJTYQRFRv19ty+8tfKRdmLvPpz//P/8/l8jTPk6M8Pf8wzU/Nm7unVJgTS2JObqJqrgZJn34oZZ7mMiUGvLk1q6ZaxdVtha5uV7Y1s85JTsUn+CmjCGfWzM6kMSGtrdVJHbFnV6+23tptqetSax0xk97MtOcp0sPpEdMiwhG54e6ERIkANrNmHmibxvQdM3ZicrfY6+N7P6R0ExHzMI3HshlARlWNyZ1Clw8LCgAPdh2PwwtGnbAogBrrbjgPBNCja/bwYnNTh5aUJTEZuasFJTkZu4S5pNt376oaD00DETpIROQbf39n8Y/3+/pn3grIAACTM2cerBvxFO2W42GOvj/wmZzYmeHE7mitkke4IAtBOIGZzL02r8ZVS5ZLmpfJrr6+rvXqrUeVPFg2e1RRkEsME9sewfKBHTe+4nf2zW1r+/AG4J0IeHjFTOMj6YZ3kOa9HPRhxgJ6cBKOB44fC83utBdjUsKA910Y9r5rgUM2NHL81bGbkVzb7YPv5/Gw/rfXoNa5f9bo1weD1hnbH8b2DrM9QDiYUfdNdbMHwI42rO/U+Yj2KqjHluxoSu89P9tAEbvbx1O8XT/wRoz/9vOYnXg0UzTAbVMKt0fsu+PdWnqPfu9FD23/3C2Dwy/SsXHH17hvT03YHv9+IdIB/b9v4sOU7P25//aIcfGdjfFRD3vP/ibifL8h79YuEXV+3w/KLSGA4r3G9gEKH2n8H87K7+HdoV58OME4OA2ItnSZ8dNNctz/ZN9BfNSZ96PnsQ27DqDjVOENytOWDB0uPN9V0p41f7w/7Q3sDF+D35f6RI9TkpyFYU6jwMfRC7B1FmTwQ5vJRwMeDDv8cG5EWUnG4y4aLydQSfm5PH0uL2fOpUFaa61aXdWtrre23rQu3pTQ6TvNgtZTOxcHC1y8JzYgjRAg9Eknoj02jBnMFIzXkc4bMjXiA5gpULIM44EaACQWjuiNYIyhzgjpwJbPh8OCjINV1UuR0AdC/QgbHjk1w9LqdV3WlrPIRkVCwaAFhjOCZ5BMWGrb/P7cwx4YVk1rq+uirSFlwJuqqxHBnBgu7iQklAxOLGhcSgmPWJom8LQaF5qudnuyzJll0drUYOrsDRFs3N0MVEBCUzKu6/W39fqFW0vC7GZtVW1OTkRZRJiInMkTI3hYr7dviappVhUBManrurx+mxMlouvrt7nwNJda63ye5rmwUM55Pj394U9//OHnf0jlstpXb9YMSRLnQiJByMoizi6PZoTIeCYLhwkd7TFwd4UTsP3qKBQftv+Wcqpw4eCR34UojeiFiFGMgkZExJymcp6nk6TT9T/+4/Wvf9GGUs45cdPFvTJzYn3Tm7sRk6qZNyYXSS6JBep0PpVvrq7mQqrezAGYgtjF1XRNEGW+6lqbGrgqpfkyz3Nqzb59rea5zCJ5rXY+Pa9L/fLbt7VVkHFKnISZn15+cvfWUNfmzknmlJMnnk8nCJFprau3lVzh1U0BJa/kq1CbE85zfjrJlPGc0jnT5ZROGcKWBZyTpGICBouRkZk2rbVdX+vbrS5mTfvQmdYR3UdRjy9y/MmseXVzd0kFghRlK12c2bn79I6HNjObUVjfHoLxgN37N5JoR6Bzjw8cCoOIDGzX2h7YveHX7RRUVTcwYRDJ360Z2mhGH0gsAuy6m1trLTMLs4ig84LHg0zInXs+QGD+Y5pWgCoQOTNxQP+tmJQP1YBGhnH3AxA8vALMvCNUj0y66sPaGvVT7sHG3dHtnbNVMyXwyEhUs6bWlBsKkjGeZf7m58nXoq3R4mQWkjDkyS4P4xEf2C63M5yIrPvVjxdHk3bbfPe+7lHdHtwsA/juFWd76nN41o9s8b4vp/iwh4BiCxf56EXmwFGd2OBIF3F7g3TDee9AFAAj6gmCR668wWMRIcT7D0du7J25cNz7EWLtz7CGgw5wmOV95L+T54cNchzf02ATGpn6dxjSwzNAI2wBhziXHvzT2xUNB3CkNx15j+G+o1j4Dwe1u4OcwA+f4zibPQoj7KNh4lWiztjKhxkZYO9jC++DgNhe9KCJ7QmeuwLQz6YATtyPL+80oPQuiaRbpPptGbQnhQA9w2CUS4iB/l5IzHF26aBf/s4bHJb79/q83/AA7753zeNP3qHzfjT7XlF1O9ZDWe6L6aAIfdBTAgAhspHaPb4QUMTdGlGvx+Rj/AY4jkuHL3J/xD1HwfHoAtCRotAOcA/bpyebCzY7QY97fGh3D0DpngHjXRsk6xlcfVHdKbXHQyR+0K0j4WwbCmR8465E4lB23kgp+o15D87ZkqdiDIk/ztnAOKPGU6JJ2zLujhJyRoQ7cBwALugIse92pAuffigvn6ansxWqjczRqtfV3ayutS6tVXeNPPFgYFGHDhEuEkm0YqvSLvx2LxN3dzebWWIBUwYkZ2GxPvSAafC5CnXrGXW+tjgQmUSIxAjMDuecM+cShsBmGoH7EfbDzJH8uuUetNbMtBcD9o4/WmvrujbTxEycHAx2ImcHiBRkxEpm5EzsUDJjlo27AU5bkivDU2JYFHpSKXlbHtQDIVhIVNuULwDXtTGDM6yB2J8y6CLnkkqq3vzros3aai6Q2rRZlaSSnSX78nW51ZTW1K7rsjQih7blRkBKwiCe50ixqKpOcGuAWludtd2aN8qJTikRrOqap8REt7dv5NM0FzI/TefnlxcHXn74/PmHn//wD/8ppfNqkk9Pn6e5UUp5kpTBHJwpKSWMIkLHSd/Fz2GvGUEQ5nwArkSASye3vTuRaJw2vpmKvddWC2mnASMY7kzuZF5bExhJymVap/nzjz/PRNTa26+/qtnLD58vl/zl61+wGoxTSsx1XZubSs6rrQAElIWlSBF3o7kkXQhCLlCOKptgb+yWhG/X1ZwBMbPatEfxE7++3UTk6ellabU2q9oAQHCe56enJzC11t6W21LX2vQvf/lrKXNOJedpmk7zdGaWauqI0nnN6mK6ijdvzXRBsoSa0Ga2p4lezvlpkkL646f5nOlpkmki4mqELJKmAs6Js5m3Zrb4auso2GfEVJijCGZU4CWOI1Tdo5KduyMIdqDKzCIJIHUBhDhBsncOVnLvlmwS4ZHsezjDenqrHQgEY20wM0tWbwQniA/z837AgpxZVJTUhZnZwWCL2pGqqkxCW8ZxX2s26HQCsB2WFhEhwoBgUFVRctma0w38EsAUEgSK7u7m6p6Clpq5qgaprRClIQc2fHKUC2gruNQAAQAASURBVERDXJmPtCW+Z4AZWrHqpjncSWfzoLI0s2AsdDBFmSR3cx4R3EbaYI21iRUgKadnql/5ttjSsETwWxgftnFmVycLZIshYfeRin/5MLTuBNIeenSUPvsJsO19BOPoPuPxfi8NThED4ltoTcSCK+5z1WxTWu5Rxx6T4ADMw826t2an+iGKuK0+aNQjkuRAFkV7GjEBZLCBjykix9CRz9G3f3jeWEN9mvDRawRU3+VM+iFs9TiePmKDewrzwO8BWB/ufJS26EH5EdyFoMEFQOxbRbBdRemGxbsBF3qXYW2+tXbv68BaW3zIcYIozGAfBbHTnV3/Ec9tI4kBEfHuzg/3xKbSDEuBH9QJoOexdMUmJI7tmC2ZN0KPWLrrALo2b2axVHikLTKDOXlnKY5MQdYoLE/7Eh+3YmEJDdijZnAUQpKYMAZ2rkQQ9ZjIkac87FxkduzVYaF0fuW9/c3MHcyDmnwsoA6JRulpjM8dam61+bjA3F1Nx4REL0IH6ocRgKgmOIiMvT/CEV9SlLZ3dvdOu8HJXXulz348ux8qO8bPIwUU3Slp2o9tUBS7jmi6cZY74I7Af+P43C3QPTVEYynFsuhTAsA2ZWZL590Ek3eqA7gDwdGLxBzME+NwxIDdu2lqE3LWGaaJI8jPnIUirYA8Amd4EJ3XeJK5db8zYGZq1uM0mQFoxItGC3vxlmDLIMANOqxd7GwCIhexYBxiZYeBE8Qh4XMkVhHM00znH/XpFz9/olMhdtdVm6rCmnvTtqitRqbQqquu1ZtWNbXOg2EOVxAJuZUsVRsMLAKKIAEDkHN28yypk76rEZGq5jxFDjCpMhmbcnIRIWEEVdCwuwfyjuTFlFJOE6VsTk39y9drgp7meVmW220tpRDJut5ildbK7id3f3u7MvPT01POxZoq1SzUWqvq5/lsMikJvCV3bgZzdTdypJwzTcL+ZVW0xCmId5oil6JuLCRCILO2ZmFJoroyCK4CTCJMggZ1p0xpvqzrrQrzPGtyR2NhN/s80Q+X+bdrXV+vud3OkjXlAjEmMy2ZQXW5fYNIltzqrfmCtlKtazN1k5QvT0/n8xmAJG5rZXKzVpdrInhdT3Mi9XW5JpKn02nOfJnKqTBM63I9n8o8T0L89Px8ns6mMn/+8ce/+09Pnz5T/nRT+/J6S6czT2d3NuYGz5JyKillIibI9XYNelZ3r7WJCJWkqiypmuXMzLKuq9aaJbEkU2WWLtooqa6mXqZclwVEAnI373wkkcXnKec4Nqvv1G/MgDWowrWkpK3BucxnkF6//vr2dk1aLy+z1cvbbzdwuuDpRZ6+ff3t27dvzHx+Oi3X1ZyYufDs0p7myVXf1kUk4fY6w/Op/Me35TxfXs7P//Hl21LruthSW20GztpDqJ2YTtPcWlNtaJa55FJWqs2cIOZLbUhe8jydT6VMqbWmTq2ZA+fzZZpPrdmyvjpJYjYzhpuuMEuE1lqr34TMa03ZZvaXOX06p7PQCfY0p4lqIXFttaX56TxPmZlBnKWskcyjisg9osmlsl3N3Dyr+rrousBUOIkZzKurc+GcJ2aowluruuac3RlcUp6UEpAlnzhNtcHVyd1NyR0QN0jOZgYnd5gjCGccvZAQB20U8dKqOZypKQXoigqAJJyJEem2RAYSkUSk8aHBiZ2EpJO4A0bOQuzuKaWcS8hfZo6WtbYw90BcNzt4EcCAEEspStBRfsfdGcKM0JSEXFFN+y9VrZmSc5LELO4mQhK5xrSZnwyg1kxEmEBRgdecYBJBDujCwq0Hgbi7WQM4qM4AcjUHSUpmXhILS9Q5p4APrd7gOWckCFzIWdzbW72iXJ685gudfpmSwVWvWn81XixJA69wmCRQIiQsbhpVqPu2uvfqh89/AzMUlWYouFkjo7iH/bg7SwY6RS8Z0Cu+mapyEAyr9nzpwFTWoQIzB+kSYCRk1gO+euC+O0XN+YFLQ36NVhl1kp89lVbdD9FoAIxYwpDJIJiJMBFHadsoKQ9YpLx31iahoZsF21z/a4S6BN0n2PbhcneCJhI/GPUHaN4tGpEl54eXjC8xzJSKjoCJGURCPLCJO1ytEgX3NW017Nwjdm2gG1e4MdhhDDJVMxLJA6IwUQrFo9MrRzQ/Ao/tCsmY6RDEibrZG97RrLl7ImluGFWDiMImM0Cmh9e3bYtK2/BjDAUq/vaotH7YHUSchLu92GnTRHsLAsWN7MqN1NLHo80i8YQiBrLjYVh3Sw90ndyVDnELO5xlEJGgqw4ctgNglBEO2Lp5xHbVf4tzHaj+A43t4cNt7RKRQHwrCn3/q9/5d9OK/J1fabv5wO53BuztK2xK4aFdm8a2qQLHgXpQdQA4E1uf98DP44Je/9uDYYq8T95DuPwotreN8Pu+x/+Nob2rIxMPwggZojD5e2DlO30RmzJwSHNxhvckmb2Ddw1g30pkb59vCgw2P8CwLWzXOJy28AUYGTtvh+0+dxipVHZwg9G9oeU4Gn2hEtF4onmLMWKQUGInZQLFhm1mjcOQTwwiQ04uP5TLJz7NHEw3UFXXClNoc61mTb2Nw2cPdRtnVhhHIETNnNELs+0GMaZE3LoPl5wHmWbsT42EPzPup5hDOTJvh8kkOitEBhcRYXHu1LAGSillSsd1GNOxMZDEnyFlh62FaXB+gwUMl2KcBavV6rqyUMqZE6+AWVNTYiV2VXVQkkLsRpxKjkNMVa1Vo8xwITZr5Ak9v9mrGyXJhXJmdYBE4VAlAkOYvADWPLU2i7+cZKapclk8ry1o0Rd1Z6sCypQJ6/X6VbXCuQizTDKVaS4pJRbKWW7a1tsruZ8ykePt7U0iqmeenk7l+TzNmeZEk/D19S0Ln8/neT6TMJyaUUJ6/vQH59OX13atr5RL41Smcz6di5R8mtJ8IhGSFOEX5ha1igBM00QjpouIWifONyIiFgGFWkgkZt0VjmQe5TCHtcHuief6oRHHlu/REcxwVbjCnRmcEixXb3Vd69o4pzSV9u3W1oUE8/nkmc7ncr296bevGwEkM1JKWZ2ESSkxE5qxOzU3zCnfjIRg1pbra6s3cmtrT+Nz6lyEzFBvrVpmGWYkI3OCMUDkFoKWnVzNmNyzpCKs4qsaXLVVU1VrcFrdUZUJqtVRmZ2xzkVOWQrjxF64PhV6nvic5FT4PMkp4zyHf4sNtDQnryJS12HydIqIvVVN1YUMZKpYV9Sq8IhLEXdlIhGk4FqNWGEffB1ExOwkIHES68yvu9DZT6ceaRJHpW9fxZaM5WEEETGCmjOzEbS22irMU0opBf0lq7s1uBtBEpE6bbUpD4EmXTb1HJvhbNyAEUVxgAAf3S2gzDyKkMRBy6AazgoWClO0Ox2XYj+3mIJmxuDyzix9PM8D+vSTOcbvYM4cJ2oPixoLcsMhW1eYYO6EUXYGRuRGRFHZkNRB6kxsK0zQFltVZE65KPAi59d8uVmpuC2x1YhIEgzuzaFwxWMc6aOgObYZQ5x1AqaQ9b4fvOiehE0C7kCDOz0rDqbosPofLekYGckH6UlgkOkdMnH3qK0zQAEAcmiAxIMzwwaW6Ha6UYl2J/wYUV2hzPTcmCFkw/4/tIs98S8UC7Bvsq73VP2hlT68H12GHsU9AqyMkKM7RBd36APaqRLHPx9N0x2Usq3vmzAGLGIlwpidSIavoK/V3kcMUDFmLtQY3zmOHl/hXcD9dhiwE6MHj0HI7owRbo39YA8D+lhLRDQAYfTlsDT27t/5zAgYpBTbBdsWexgrd0+dnKK7unzkhXfw2jXaLoN2UDh2QJ8Pv4fdxxH88Iw4bK3dmQJEKXLe1sG2Nzbhtw3l8d8HgNi5WMaDHu8zKq7jYL8HQILIDDp2Z2wePz4lfj42/N2joxNAr8Ed+lZMrm2uARqpvXEubPPpoYRuXXs/bPvoHcf2MCPYguVpHD/oDhMfYzMOsqCa7l/dEUc8vHlYcR9dsGH09xvAPWIY7JiGtcXqPD73PdzfDo5Ym8en77l02y51dyMahpB+OLLHhmjkPZQCyUHZ5SnNL/P5nKbCAm1trbrWIDmptUZcqVvEoWt4URlk0BBEAEBxOpF3Fg4JINJ3HdMxpn+4MBwjWndbgscub/lSuNu9nlISSUqdC5yIcs6nnFpdNr9/WDiYE7CGE2aLCOqloNwVDk4sOYgVJIVRO9ttZXciLqV4FrdWq7W6GhhEzUzdwGzqrTX1FkillJJzZiGrEVHNwnkAB1NYRsSuODNzzmbmCiIqkkXS4vW2mFrN4pc5ccAz9dqUVU2dzLFWE6oqqtXWK1yZS0pS5pynzAJGJSOrVZc3W2+JKSUpOaGk81TQ1izycpl/eL6cJ0Fbta4iklKapklyqgqXcnr6dPr0w/npZXp6YuaUJ8pTBknJzpRyIslMiViIE40K88x8bdUJ8zynktd1hTsza3WLPFEHkRAIiCmIzM76cC7B2RSxxtAXsJlbFiEKMNrzw0iYHX5gz9gWSeyIKc9maCROImUyrbfb2/XttS5v6iZ5glpbamuWoFMWEjE32KpamQGRpjCz1gLaaLOlMM3lVGttnXOKqno1M2I4mqqIQBjmDvUtUZUt6GspSiBrVThTYhJiw9rU+7plODGTqiQna0qVBULWbBXXOcmPl/PElsCXTC+X09NJTjk/zZLELqcc5bdAHg6EGApmZk4RGrfF+vMI/K211loxkJmZsWCrmrfxkcOZKTElJwGYiAFh3jgfx9a+L/41gM++r4MRqBODyh6eJ4ltuNY3ezMRpSTWWugLYRDr94zIo7uXbTCnU3AdgiJCCgxOHjeLujJuTcf5GdGGh5jbLaDizuSxGwoj3wSbjD5E/jyc/xi6UxxsZpbkoFeYb6v32KkjGPowWZaoB3nGKdp7ZOaq6/JaSmIvheScL8/08hVfv63r6k28y8VuJBvC8nhz3yH1ruAdjIbbV49ZhV2Jx11t44cd2n9Chh7eAnSu7W2+9oYQ3UnVkX3X+YGAsBbauGFIz104brGJ2wVbR47wZhvhjv3e5bOGg2JM9N7rRDyatgtlPyBdAFvckXsIZKc7ZBUX7Xfoq+tQnsz77Ng28nvo04Mi8U4dfQBsh+ceGxCgv9dBimEIhDYeAzgIpDszkiMK3oPjMsbG34ltzI/jcAeZ7uDTIXhpDNOx/e4+CA3vXmMbjoE6oLvueAqKiD6SEap0uMmh4lTahuaYfQwc29N5iI+PfBj9hxX/0Uz4toAe5oPoEIUywPHjKnk3o/tSu8/c3wduHCLHH26Dd7z+URLfv44n+0eNebzeaViwP4DFu2L68Mu75Xi48zbaeyPH+UIHxe74FH+/x/b35O/Opoeu0UGn+mj8PzogtvrBHvGFjB44FgU11J3NWi9ExbSFvt+3bevcR9vg/kXvKuTFNQxy64FV5A2xRc3NDYlA5EmUEysnTWeefpyez6kUJlb3ptZWrc1adVNrVbXCnd10b4Yd8zQySTdOwABjztzRQxe6oQDYMCJyH9s9GjKk71bW9/0sbKH87ppyYhYddUmJOGh+ltvblg1sIwWQRw3gTtpo1lorpWwoBCBVN6eUSimFdaGUAM2ZSSRWibsD7MRG6mAFtdbWas0qmFjcyYgc0hus3prKZjRV9CAuEXFX4ZwYqjXymLNkkbSuzby5tsQ8Z/Zmtd5QHU1nEhUYk8LN1K0mazIxwJxSmSaZEgmIlOFwtKV5vc6ZC4OtTczzy+WHy+n6+m1K9HyePz+fLlN++2bX9XqaMjiRpAZuDJpOp08//PCHP/3wy99N54s6LXVdzY05cZpPl9XAYKORJdZ90M6jUmkz5WE92lIz4/zdEnSHRYm2wuzbCg8M9IAe3CBZQnYq3KOIrBmRJxEzhzUzBBMfp5JLVAFel7e3t2UlUMlFb/zWGlimy+X0dLHa2u16LcWWCuFvr1dOtDbTWqGNhSSLw9ttdeUs5CJaa875dMq/vdaqDcQOa1qbEQmlksG+kduaWWcuiriUPEdPLDJKCMSK5qbuVh1CuhJToFYyTWhMlZLPU05JWq2kOBf+4ZILaYKfM316Ki/neZ7kaS5Z/HSaADTtqju5pZTGKYFg/V/X1cwlCSknZlK4r3vIoirMKAmDIkw2DOgxW2A2YlMlaES5MvNaNeAx32Vm02Z6d3cbHoBtrnl4CGOrWmvuYodMJ99CTA9uefNGlnw07AFYDAC6L54tnp55Y9whEelBJ0EJehDBLMRI7kYDkRPRiGfxMZLhP6QjPMABcR6OrwAubmZbBtl2rpuSY/TikPB5PPmPYuc93tjwQ8+R8iFO3M21rVde5zSfJMks83N5ebJvX/W2tK/NXdjBSgyoG4FdvKdqHB/hD08/vogiEri/wUDto513IBXAZlU8nuoxQMdh2QbhIxPz4WbcldKtNX4Iajg02O7b8F2JvyGuYUGz4wXu36U7PyKr478kw9swXtsu+7hHHQvtsJDfZYr66KAQ3y2yI8Q/3G37IYCjtZtoVwBG5ALv/zIff3g8nw93pvdPv+vIw97kd2rAO80wLLDe9zUPBXz04tiS0YK9L3RoE3rsHzaE3A8cIaJQ7XwYf2PzElHqfK6Bpd0BExARCdNYjgxg8y4FtUpnFT22MizrHZL2zeAeHOJwb9S9HtjadxjWfTK23UcHXP4wysc36DFwxw8dcKfI54o73x3BAI658/2E6nNqx43kw6F/fGKkgPYHvtuv/fDrbq+hf+997OvPoVED77CkP3htB+LDlhihPu/QvG/jT1ENbwzNYQR9v/OwUe2gX7vZxwHQMWlpjLY77ul3rBdWIScPfdmByF+Is8+IyKFjKwrIwg5n9AjiQ8gdZtFxOFy2J7rDgpi/h8ZuWSRCMDjUSYDhozUnJ5AJqQiDyCiTfOLLz/npwrmAvWlba1sX16qtWa0ROsxuEfPJcCFIP0GUyZEoOFiCxo6ZRYgTuTs0yojyFm4RwrinfITGMAQ5HUrexEscbh4koCkllrQFEIckjqhTh0NY4cu6rrUGL1Dc2dxZOJVMwuo9eaJqa6YOqMOdmuG2tlMpTMIpqyMzp5wpwZsura6dSESqVzWQiDcsra7NiHwqE0hba7fbjdxKEibknCPiAyPhNYhWiLWUNOaxJwKamVmNTAlJdGYuLlmJaBX2Qu4CR2pVF/FamzulzMQM4ZRLypkoMvKc2VV1zjhdck4croNT5pLSD0/zTO08l1ORwlbYm3hL7GAndmLKZUqn08uP08uP5emTp8klEbGZq5oRv62t3daXz584FU55BNRRIC5hnk6zu7fWzEAiOeXunBdhTmH4jyM1wnlSSimVsB+PbBeEoPW9zIcDTj2UyM222I9gtfJIPSURdXVzJpKchCayU62tKUnKJaUizjmlIte3r0Kuy+2tfanmJc8sU61LEk9CSFSVkTYWP5dEiZhIjLk1F9KM5uuVQMyFgMQs7BASgTuZKsHJ3MzFnbMEfjSt/WxhEkosQm7WVIBMJkzi1duQBa1ae2NYTnyi0/PpJOdLIj0VnjMmQSKfEz/N6TTLeU7TJE+nOZfUWvOlH7Ouuxpszdta13VZlps7ODNCKWcwJ+bGDJiqqowDzj1iz9wdUXKBiNRsVbAbkadRwUMdhEO9Z3dmbqO/YbnfzixVDacTAPXO3KTWiJkUg1GFfBi2owp4VxjczZqHwcd6fIkPWRCovGlzRQ/DBthdADCsAUOKdSUTQJeDbmYCZmYQoPBBtR7kvdbVAIT/EBus8QMjyFADNqDfAZbv+gMO8nQXLgcotiHITaJtBpGjkWvcbTeLYMhoVWVWEJsu3q62nkhm4XxOz8/582tZ39qqdqveqBs0G9kw6mIXsltHtjYf3wCbzvMI/jrk6jxG3wnfPaLJQCaDZX97eljcx5Xu3hNZI85jBMtsct+jLDiw6WaHNtMuYo7tfPzzCJcfVQUKx9o20QOwPo7ANoOJnNCp7eAwc0YUsaDjb3ZQGzmNhyU0GnII9BhqFRHRYXAGLgJ2fLI/YTxon9AjiNqfv3V5YEWgB6cNFiBy955FM0y627AdR7i/97077ntH+lNGID22VgfVB/NI4IxYDgos6mohMmMEonGOe1rELnAj3mQE+u6ahFGvQDOQJHZcFzSgBsho0914ufsxz/UYnHCcxbslcx+TdLyMDri/y7MIXRjMwQ9PP97zYVtu/27JMYddCqKon2L3NvLjIdUbtt3Hus/3bjoj4eF45+Nv3/cdwHvWmrslguGz280G31NyPr7/puE9bOZjX+7H8G5Y4tL3Ldw2MN15AB57DTwsaPOuRCh13SK+YTN1B5H30l9ONEpMAg8kXHsbjtaU7bnfG+rtShuLc5tf76GOG0SEmnnmBocjc36Sp5/L8w/p/MylKLSu7XbV5Wbrouva6tLq4lbdlDsRWmQuQ4RaqLoOYqaIjiUEw91xcJgY/fvR1KAEPXoARrdtkCTIIL5wdxrMecHjSRH5qkos/z/G/q1JkhzHEgYPAFJVzdw9IjKzqrun59uXlZX9/3/pE9ndma6eqspLuJupkgD2ASSVZh7ZMypVnhZmeqHyhoPbARHUFG57qfu+D/6fmCFmlnKKPSuYT9BtHkzJ3c28qH3c9+vKKwtJJk4kidyIXK1orQBIUlB+OJIFMFIn8pyzmVLT7c1dDWyNzSO5a/XKnoIECJOG5h4qkJuhRloBkLNcsR6qyUgSGJzZj8ROfN/Lhx9EmsXgvGwrXCWltC6c2JSKVWJJie5lv16vtG7kxkbCaV0X1JKpUsbPbxfXWm7f77a46rYsxXAYKWTJl+3tp7e//tvrL/9t+/ptN4chb2uWtEg24u8f+30vXyWTJBA7N+IMB9RMcl6Wxd1LKUe1pSf5zUHSkTxIAndSqymlscpaJBgQ0HBM+4aKmKyH50ZEWfQiw1U1JaYkgsWZYQqoUanVwPL2+pVe30gPO+7OnhZRhu57uR/F3CF5Fd3L7XZjB8OTkCxsNR+1eNVSDpZFmsWeqoDZE3RhOwzmFQRhSmzu1YurHtuyAOTqZiBKImJOh1aoO1xNvbqzBgOqmYkIe2UXQWr2P4f7/Zp9ZRfWCx8XTlviNfFlkUx22bIw54TryuviSZzFJTGAiHNTLbXWepRzH9BgwRqx7JP45waox1o7d6HZpApxkifT1VGLqlqQ0T9ipmEw8impdAxxxOC5taRbtw7KG1kCKEz1RI3XkAMZnIBFiI3O7QI9Xn7MqHknZxHXGo4REWkBGH0ncq9mqurEwRUX2VLNJMFRZryLj7G7jl/PiTqJJDyKlwfoM23aY1087fBDVs5HG6BTovnDnSO7qVAlYXfS5OVux06SctoW317Sl58u5Y/jvarWeof34j7NXPWpfZNkmT88ff7hS3nLkTvfZfj6ZtEwPner6w+Evp/DGYiCR+DQNLMipv9H7WF3f278TONz4oQfCffR22G5+9wD3QNP572f438e1LzPQGWc+YgozqeMuz39NN/h6VY/7oofjdp4xI8vn30LnT8n/tldB2O8HpqKrnJ4R1/zDB/z+aFVQwv1wBo8AkFjsQG9/GoHEvOKwOMI+gThuo7o7i58zsPGAkQEILEbBe0Ld4sCNdXKwxxscywghT2A+JygwwoSgx0nhvSa20pEQYELOAg8WZF7y0bPtm4dF3aYNytV/S+IeoDTPMn4kzMtbmRen9Z28OP2/OvJ/+7qoflBRyPPjJV2zO4tAkbSmMzT4hyV6FdqqTljUB/aM30eHTJ6eOjHZ78Ek1Infe6acvs1Rme0z330y8lAHCp2EFfBGd78OadaPYcluAfhZuwm6t68RqBuIogmmnv7nlpMLYjCDGzt71lngIqdto2+uJ7V69jswm4jxOStOPnQJMwsStm7q50ew6YGNAMXeEvbz9dv/7p9+VmuVwPV47jdyvv7cbujHFb2etxr2d2tpVqachd7C1GttUZmCDRUbSaCCEdNBPdYI86xdCYLGZO7c6/G54PFoEfwz1uVu2diEbGWxc8UpBKqieHutVY31f1ea8Mcx3FI8GgQCWfh7G6z90BEzKCR6VzKbadSfePMy8bbSvfDD1fViDP2iOoxgJPB9lJvh5pZ1Cu+3T9SAnwJu6aI9M5yc0uhigRVKDkIpai7CZEZXJ3Z4GTmLNIyOO/V67Ewy4JMKJnNHeVuvFPKBiGSdcsEkZxyys5UKo7qcE1M60W2Ba6ehZNIIgjzXWtydpRVULTejxuEhABJTOLG6fLy+u0vb3/9t5/+5d+vP/0lX18SIIkoLfV+CMlyfXlbX5bt0kyywzhEYagLQ6+7kyEor7QUNTNTMFGD/o0bLcjCg6bM1UzarigWBC/BwRFhc6rufR8Oq1cDrKC+hE9USETCbqqGfS8Lc8qbWznqcaiWSuT89S//7fj443J9eXt7q+93Ma23G8P/+P53ZjcFL2Ls6tWZkzGcmnEu8duWmHnbFqZXvpXf7rXoXShlhsFjwV2EiSnqUqUkkpMa0q6VGc6VvdbqXuEucIazqevBEOHMzDlngqvrL1+Wl5yEwW4b68K2wBezbZWXzHkRSdhWyYkoOTM+Pr6LSK21lD3i3EpRAAwK6B+TnWHElIQYotWqafxUa+3adfyvjVasYoJAkvAqiclZ0kqyVo07u4EiwgZ9d+UweIzqVx6Kd2hrKXISzIzIRn3MtsWBCeES9qrK7mGQtB58G1u3mpnB8LBvxPjnnAEQ+xkXHvR/glpN1QBv7n5qQjw2FmKXcJdSC84ROgF99Iy7p0b768LwYPdvGxiZRlHp4RjmU3CPOOSmQkRERwcPdu6BMZ8/Wxh92J+7JJWQVnL6Xpo2xZLYTUu930luOa1cKLG8yKuu/u3yvd6PovcKZ5BTY7Qjoi6OG+yjFqI1RM8s7x/iXvrAm7sTkjflxAMdRSowMz0Vu204xLoZKQADM8Ke7MEohWEbaoXhmbwn4dIU0dCBxNls7khsNL4Nx6N/4+xncoeFaB4x/XHbBmnOpjvgAkFU1TqllQENhDkpAiZR741HiHwCCSJHm/Rz/7TqBzFnqAcCAIg63lM81Zgk45unW7k7R9pOwxIW/0Br3gxwvD+9OdjcR4haT38F3BuDTiPxCTakrn6He82awuD0SCkzC/d5JnQFr42UdcaHGMSm/qOPJ4COlDrGBhG0Q/S+IUTdcQ/GFXeHRCIlA5343QEgdarX7r1q926WPMRvpw9x8Cidc4imJJ4Z77ZpNM/UaYTmGLJTFyIaoHAeSyLyM/SZ5r9E5E/D/tC5J8SMQ7XO/zzzVLrPfZ5VAdbR3bJPM/iHxxOMQ9/sYqNxP1Xq/+I29Aj6p8F/fhaAJ0VnrPA4QYQfTu4f+LEbf9SFP3rWrDR3HQYjCwWn3av36rPCGtm5/Yb0w/v3M/FEhTQ3crizfcTG9AcaHDBmVjKiYN5BC8bwlCy9bJdfti8/59dXT0l33w+73crtQ/c7avV6qJZSjk77b9wysIwo8vdC9wiqZ42tU6gttP/iCPFG1sTO6Mlmn6Ng3nq2jpAFcGy7jLqFM1JVtZa616E/RCZArMeWANCFa3yTc/7Yb6qq5qVaqaZOkra8bFi2un/spZBXI5ihuplVReKUwcex1/t9Z5Kck8PCBlRrLaVolpRSWvIG/ijhKihmVSgBLSq6HHVdc2ZRq8GPSGCDcy8hwnBCXSRzTpqghmJmO7Jz2laS7E7Lto6UCQfvpd4PdjVw/fbTT8dxr7u9vlyWnMr9puVIVK95+74r+SGuq/C2ZjVUsMh6Sevl219+/td/f/vrf7t8+6Xyst8Ks1/S9eXysnByYpIsjHW7KJw6xbU1qo0YhajD2hR+MyulqKq3Gq466FkUrmrLkhEk7qqN3zOw0Ez+0/M0RCSImMa6MzOYArYtKXYzVZWowQmuhrcvX9lqLeX4ONRY1kveNkAZ1UF5vWhevx9/Pz5uIsv2+nroRxR1E2InM18giZf8vhdxqebCjoVF5GVLeXnxXNT++OP9IDLmxYVF2AyJFeRgMyCLp8TVFCWSR0wANnMzIeScw8V1mMFrclspL8wOO3CsnL68pEtObjXBF6ZEviQI1ZzSuogI5cySJCLufvvnb1teorfHPkNEVrWUsu+7WvGqZpZzFpHEbHqYuqpW1VJK1PgkImkWN2aCO9xIQZmz5AxOjJTXVZHqruG7crfHbCag0x8PhDcGd45aiRNi1+p0hJRS8h65pOpgMrgZzA2QiEOqpUQ445gwcdtQwsdOOOYRumk21mC4OWLxNTzpHjla3XRD3gOXZjkCnCgnTuPOcmhmRpO4fDwfk+jqcMC9KzBDAXiS9fErTz6ZGR4RNeIHImLiEM9mlsxhbuUwJ057XpWrJcmZ8iVdv23fbvZ+K++OO3FzxAM40f80NP+FQJwTu3vbnj/31UqjwpJPMnGs5XHm+aW792zTJ4EbquX0/XiW0VmnKTj7AzyMwvTPj/vh2/0oB8D9hyHK3s5H78MTQAH0KT36M8Cgrm4RPVSlxeMU+txFn19n/v7p2h9eQs1I/fyUccJjIbDzJiN0DueINPV4rJT2d465+NEjfni02d66Q5ibHMeUHdTwc1/d44ZPasa8cIiI7Gze4BRqrwekoZCfMzWYHNQ8SMciiIoBeBTYgQW3fMuCdgprSLywRC+OFqROmKCqgwArOHHHYhvLe+7cp24dUYxjZ2kv73V0Op1bV5vBPaYRaNUPxqTUBp5HAybl59SNibw2d8yZ9N5zHHFOevQOdWdSM3jsX62eAHPDkNy9hPBgAfXO5xp3ALXcJnCSYeMJmdL+OXVOY+VvCC8xB92OwxER4eZWrTmPiNgAh1vjte0TtzlmzFvsjJPwUBusp5LMOx1Ps1nCSDDJgDE2AZRjwsVnNOkyVCmJaWI29M9PdBDmILNp4fGnWhOnJSwouZi4VfaxIAYliJDUagy8Xq7/8vLTz9vrm+cXg5V6u32vt+9sFV5rudXjblpzSvXYy3HAKjpnortWNeIIijVVBVMwCwHBzshmxkwQJucxsCGk0edzSslqzwzuOCAQjIgQSESWZWkRwxGSTHQch7kHnUj4BO/7rvtORO44jgowkYQ6ISL3+11VTWEKSsLMAYlKKcu6LvlSqn7cylsWpLWCq7l6Ywmtx16q8boZUIFifmgUUWJrIUJ13QRw8+pMRihFj1qOajBfls3dSykENrOj7FnYrBZiigARAYmsOTOzujl0uyyv1zVHeIzh43774/14u8q3r9eUNzWoelDU5lWiXPPruqyJ9tudhFh3lNsmzLqz+JbodpQtMVt93bLu9+M4tm273Y+0bOa0XV/z9ev201+W1y+0XCsvmVfJCVSL+/f7vq6XtKwsKQFHjWQ4BqDuiaKSnBf346gR+X273WLIPj4+RCTnVUTe3z9eXl5yzsdxALym7MC+F3cXSXDuBSxdLQpO5VKKVY+NVFWXlLiVinYtFcAikpeFAkSpW1s8DEnr5Yrbh6opZH35suFayn6U3XUHJ8846h9H9UKyF60fN6heXl7L7Q/L2cwINS/ixOu23Y/foiBISmSKLHRdxO5lIf3pdctMt6MoEYm4u7qtIiBPOcX+v2RxThfh211/f/9OZq9r8upVd9GamJZleclLS8jykthzzmm9XhZfRNmhdXcmSfKyrdfLkrNct0zJ1YoT1nWF8P24r+sKIvFYRBGAabXWiAaCVagxSBIvWUSolmIUBPwe1EDhM/POpJlFVPV+v5NkeFI7jJdtXWXNBo4CILVWkTWQa9yk1kotLiJ2/lNIUWeAqbUSnepBSOecuifc/V4KEaW0mOkUHoJ+vkZ8sE3054AxQ9U7zY9GwRx3rbUS5XBdupqrqZUwgTKza22xRnpUPcgFwgQEwRdL26Z82Nf79s7MknJ4MKwebo1uWFWppUIJM2s5Yla7RxGzBkqY2L1xoJmetx0x1uPVQgc4jiMsLqcBjlFrTQhfE0UWPjGbmR6aEueVBF73O2TLy3KlzZ3e8pf39f37/vu+fyiUkzhzKSUvkQc8KTzEDUoj7OkDcbm74VNQcUdUIV27Q7g7LWJKdPxG0njvNXKgiCh0GW9l5cKHg6HzhO0aQJLkDZr46LReXDbYdZwDXpCgFRY4UzWeQDPRsMAaIncljEcPOkOYFdRdaQoaiae3CLVRWrQTmFp9cHegawZdZLeXH+I7s8w+6gECU2i5D4AwPKI2Sf7h9wjD/KllddjXWjjD5T6xYyACHfOYeCk10AIf1mN+ar97t2s7EqfQaH0oS4+UOeO5zZNjShS8w222xyBFfxKkB9Y2ix4zhXo3ej7cIjLdoSX1yzARnnxi0UPMCNu9zfFLDDNLT7AbMBJExQZ64LTywFeu1pJrp0LKRHJOSvzAuD3D+nkw+jw+z5mbOM4fnzFNHep+mqcBfnri82z8gR42q4Mt0KjfpYWpPLzdn0Tntyse9ZPx3P6lTX+ndrbPz685T6AO+x/eZQBu71TN3iMH5mb0zwxobBDD9AjANKaYEJvrgz1meuunW/X+sjp/ORrY3sumfnO4V040wunGVZ+f+DAEn47e8M+HdcpFdzempr7CYdWTpTWt3/Lbt/zyRdZrkax6v999P7zseuyuxephWlVLPazWavVAd1P68EvGHO/aOneLiLXc3LORZu6dj8G9cfiNNTV6wKYQoKFrNZOhNjufNcsO3F1hMNOeZkdTj43bxk1G+dhao8CZC2FZlpxXhZf7/v1Dfrou17xWEmMogZxUQ4cld1LzQ+txHLVWAqeUhNig18tK5Kp6HEcpRThHQIW7wxtxDQZ3WkRnOYOYmSSllBKHa7GLBxFOxERuEZVh+nZdX3xVJyd3kjDKgolIRZAJKcFSusjFzFT3t8uCUHfqfV3Xl1++QO3j/Y/rshARrfk4DueFnfPlJa1XT5txcsm0XvL2IutqTMt6YQYH8YvD4cI5CatG5Na5R6lWM7vf79Hbx3F4B5GxLy/LsubFzMp+sLBr4Cdh5lDqtEUExt10xj3NqWVyHDuRt3GMijNM5CilRboLp9BIzcw5GYuzBE8pNeorKBGzM9HGaeFlkZw4f+C327vCCjgTF9c9iSzLctS677csDBYXSovUw+pxO3YW5i+XfFlpS/J+24sTpcXMaiWrldzWJFteOKeUFgfugi0JY6374V4PPTJ0E+ScXy5SqxKwLGldtpj5S6Lsel1zYnjOmVg4Ag5NiIyMHdWUK/ZaE2UicbYgLxcRwEfJi9GfkTrBHGWF4O4aPLZRBBgGCBE1Ojwbs1FIsoOrEUg4pSSLEkd9LsdsJhzhLsAps34kes49szH0i2ThFmI6Bp2I0O0v4DDpUvvd2Q2xcMZ6HzhgfMNnUH6AqLMx7hoMHsxMUIR98IQXzVpIdArQpw/jiF5yAj8W7fHu0nR36gESvVui4on14zSKM/PTHcY3AyT1XxuUYYRrlNoQAuFBJXNoRd2pFq62LEtBWrBcaF1lyZwNh1FYSx750T+P1yfZ559G8/Px+Kt9vvl44nj91p9Rd7PDoYEBGhtseGdaKl2L+HV3IuZIWG9GPQ+NAgDAnx/9o0YOq/zjrz8SvtGwHo54upvieBrHMWnmN8Wn6TRLw8cvZ9H2gw4cf63W0eyH+/jzyZ8vx8h7CbH+J4M7RuS508avMYhO+sOmTnvFw7XUNPYGMjXYuePIsYTpERTNLbHpKTTwQ3cnn93wjPPbDRO1NW89ehxdzMFDswTg3hC/O6NFtgJQcjTiIns0hg+4ic9+qPb4XgShrdzxDi30Zfwdr9cGahjuHSAm/zRFabrg4fsWP/aDJF1qGjx8ztpuSfTUNfjTBD7f9PPTW2xbf6MB+KbXJx/q++gpAOYUZZnj9fxZ1YhrAYQzpSUR9Jp/HLEvxARG1IEnIgg6yZb3eDzAQ2fupQvH5inzEyMGpmWpP7izWnSgP64WmkaZu/4ZYuDsN3OEv4imdJGIy4S3UZjyE3r/mLt3P0DcJjRmJyKbqA+myQ0AzuTO7gzlFflruv41v/11ef3KS6rVPj6O338rtz/0dtNyq2VXO1SLW9VSTNXVAHhAuik7p/lAGoBzhMZvPiS7WYv9JcjQCbUBk3D6twRfdzdVbmViOIwx5IiA3ea6J4oaUbWqqoJPEklmpkf0D7A71dqSTdHtc9ZNM65132928L7fL0sqFZ6SJ3YSpygQZGpOJO4tpqXuB5kvKa85i3B1WhIXKy2KWt0JJMKS2YsIZQ5iU476PyICGIggzDnLsogkgE2j+pIQWLVaqcGGDuCyLpIXAPtRgveTSIrW8LFQZoW7ETPZkvd9L7DrdSsFUYzMdb++fmX4/vF7ymyKZdlu5WNdLpaWlC60vmG5erogb3m9LtcXyqvBl3UJ85hzyxjxKCRBBuYcOFurmbkazIVa8Ek9Dj10y1siLqWoFVrWJcleS616eX2ptUDY4NqZfxRqZtCGX80ckSBOBIKZRuxKKF0ACKSAm1mpVkxEUmLqtetbfQkWzgtZhEmYg4wYmhKT6VL9pqXy+rq+cal+6MHO65qdcL/fa9WXiywplVLWhYnlUMuJFs7vehzHvmzrSxaktGZOZHt1EnKXg1SZYLgkerkugcVLVYfKmthzzSh1L0lE0st1yzlvOVel+8cti/7l69u6rvu+w/S6LksSFmRel5yFbRG+XrZaa84Sxkh3mELZEekxUezwLCNF4Z3rGrXkRCxIREx+d6+qReuhdQhFZk7dfubdjC05m5MriySWbMQRfjWWnrqHp5eJhBkWtUpCUoRFtvsDz9070C18co22yvIMkRpbFhTm1ZzAwsxOHHXKEvFskp5v279VVSdK1OqTPEGiU1q1SKcoG3L6sJ2ZR9UtBlGvOdpI+RGBl+pAooRgOu6VnsibCxSApCgU2GNEw7jcy+A84T1v/AGno2AYSpp606KRA9+0890bn0kYtMLx606usHoQkucdpZDmLLzxuqXrNV+/l98Pa5aJ2JcmGDcZ7x4oSoFJ/H3GVWMgvAVon7B4TCr8+Pg8jh4xGfEjARasX26AMRgPGp1R1J2bcgDiPxHie+KTISD82XxGp674HKvj7tJKdcV9zrzNfn9HGOXH+/rZnxaEyTYhlrMtD+D7ER09yP3mX0CzgtsjjJwh+NM/22d7UGw60hvmeXH3EYXP3Kj9veHe9h4AeoRCPDSEfugL59HCr4jkKXV6Mozy6Oth4WUioh5BP6o9BEaw1lq49+B/aduIArCuDYJDbQC11ju8KSLDBkdEHqoFmqYBIE2xeujZmRPS7XOIQA5FuBNakm5wVxEAYu+FBugc4dlt8ZyR+yNd7dO4PsyMT5c/zYBx8tM9/cF4D/IHBiUfmXaf/RJtCO2hQ55V508Luw3tD30Fp/k/VuJ8zzH1p6c9JDJTXzfnJX2MaOSgMM2VMnousowbNN9OVySm9fY8EP/b47ME+tSBDy0fIBhoQWJdkLn3QPCny33yb3z6qd3ZH706ROSuMEeQw4PVwWBRua7bL8vXvyyvX3hZipf3j/uvv+5//Fb3D91vdhxRA5hgoyDraPZYseMDtxQ9cm5FUd3d1L1rrc1MlRJ3vXz44Ny90Xz3IkTU/sVD+IWDvtaqGuNrtZRSajXP65pSMiCl5Bolo85IQWukeM1IPFxqcUjiquX2cXOWlJKkhVPmBE4LCRvYI56BKMmikOhoppQzRFLOSUSSMwtQrZj3TMozDj5eJItYJ6uFkzlUXXrNYyOYmqkClFJKIu5+2AHHuq7LkiJdspSShCXlqGDAR2RCS865Om63m5sJkem+5iUnwPjL19e6H//85z+1HJTSmjNR5D7x5fq2XL4qL5425SXlq6wvsl7TukleeMnVTJ1SYk4JROGHLaqRqDD60FqdY4PZsiz7vsf61aoAUkqlFHevtYpIiyFUM9ckcpSiOOeSqpJNu0S3ZwwTdYQ6KJzjQ61mriNCtNlM2g3VIWmBCJmHhBaWLAtrWbes5X4HqUZA2LIX5/sdexXhxU1ut3r7Q1VzTq/Xy/2+G1itkOm6rsClHAfBskhKJMS1gOGcYKBEzJBS9i35JpU5ik/bQirusjCtGyyXUkRo25aoBvXy5e22ST3u10yXlRYnM14TuVdU43VdMiWSlGVdI4CfFER1s3BteVNWh9jyk8I/PPIuzJJoyczckgtjiQ3/QHSjiKQk3dIamD4xM0GIl5RXZzHDUa2omhMzR5xoPKtp+HQuwL4KQv1ukfrdq9MOmqAA9ejWJjzcawvh+MRi1xFbnDyWGzVV/9xk5t1ygK35Puj3aZYkjjDZQXzX941+ejxqvLWRMSMFCfTD3ug+GIrasLBZS5zBxFEx7IxzO4cJeRa71vnNqJuN+ju21op5OHG8eoWBCuNey03KRWqWnBZaN9mu6WWRy91KdQXBmeaKzp8F0Oj4cYJNUfJ/JjKfJMX48MObPz33eexOC2MHD2RwHuHZw9szJlIXTzI+Pz1iSDRMM+FH2Oa/OoYgi5eb3/GHDx1sSNPpTY7To9YxXufpiWOZzN98BiE/fPrnb/yTDw0NWz2WUHi+A03XEjrnzQmBHN6R1oyy2sqNHI0fJUXMERnTi3iPEHvun4eWnT42GuMyn0lEsAkhT6+fohvHugrW2f5zM9727SAM2y2H0Ts1Wkv+bskTDnSDdrtj0y5Gq8bGN73GqV+OWTKm6fkOj13Qv3ngDuof5hIMD1jcPVozd/TZ4zTrzdH8DtPPFUI2bveQ8DEB3OEqRNOs5vHoqrP3h3qbVn/mr2uPpjZ0PzwhCuCGMdgpzAYCgoHnBAlHs+h41IzuQ4mAoY/+ymb3D2bZ9sKGbvl+GpfPS260fNaDGrOqBzWoe2vRw7WRo6WDpflxZ4k6iH0pPgQOuru60bmXhbWJAc6yvKXXv65ff5brqzLd9v39+/79V+x3Kwe0uh2u1byaVTM1q+5OYG71nDl4GWFKPYn5ZALpgt/dQYxQwMEECXhBvVYojQjRR/0W0/wZ4AAjny8cHaq11jCJDEjhSYoVnYxA1Q1gIUTU/hFBI0mcyeBbTpnlXXcY0rZt22Vdtm1ddFl3TmDS2JQlS1rdnUgTsUXVX0oMEmJO7K4uYuSmuN3uZs6yBixwI12LajEkd1T149gdJkKqFEHK3gwliCwQc2ZKaV0TRWnhVEqNaLxlbYkBcGRhM5MkSaju5bh9GHHOWYDEWEQ4x9+UkzhsP+7LsjhR4vSxa7q80bpdrz8pr3fkZX25vHxdL6+cFu4sSSQMkl4YlQzB5sHsTNZo+61Wq9Wstq0XkpJsq1VpXhciYnjZ7ybiZjnn435D8NISubmegXYkwap0uzFzOiOI2rastZZSCjwxkzvUqirBRISJmHLUqgg7EjOYlbzxyJK5cGJxs7puuaaFKS15Y1Pbbwraj9tv//M3M5Dz9fXNs7AXJgMoSUQzLkUNZEF1moSyWMrOQmUTIuLETKlmEuZ9t0y8iLkXZk8L5yTV3MA5Z4YdBwGesxCs1vr1It+uX7ReUkq13jP0+np1BDksrQuvmd3VrBY9RMTZGbyua8RZ1WKuCkrmtTqgRopyVK1dhSZKwsJIBGa4tySS6i0iLmp8ULNwc/AImEVqettDJGeRLCJqbQtq5/R6MuaVPRMFmcyJb/G4849r3U91nbo+EG8kkkPZG+dTxBb2ezIzqZFH/fiWjCssZ9JWRCGaIrK5wrPqw186bcszYKKAJgBT8xOaUsgwsvCuhNmouVnMTU1JgUgCOTdn99P8QdSqus6CfwS+xb421KEpbIloKoLWPnRp7i1hrLnd2MgcNfZDVXC4u41UwRW2e7153ahyEll5W/Nly5fv+k5WqzhTlI1+FED+SQw/fPMAsObd+xN6e/j16acWfd72+dOE/hhTMEata7kUIg2DtL3fc8D68biBuzArMPQjrYCIWpLr9FMIoEfZHaOp7i2wYwSIPMroiGht6qu3+TDbNU80RY1Rysb9HxDFhPFahzzC+HFPecR7IwKKz4rFjZdpxi3d7+G9q1uhtdaGCMe3s9/6mWGKdXgA+j45e9sm+PpsmLb+VBuQigKnxKc03jem+oCS44joi5bRema9kjV2kXgjdvdgJWyQOPamnrMRM406d9WYBy1m6wmQ9eimiDhv1EjN/D+4H3sce3+n3usT0HnQqcfsH4M9fXhY/I9Xzd/TFEbSe/w5GeDzMTap+Zthv4kvzp8e7fQ/utWzBj+Uuc/tbxOA+8ww51mJoHPSP63Secs+v592XprydM+HOo9JcjbeJ1VtsgcQkTuDW+YHfqSIf97Izkc9n3kacrzfcPTJ4zb0uZemez7c/090jIdXcAKEAFDPvWKmvKbt2+X15/Xti1zSXu1jP/ZbOW6ilfQgV7eqVsJ8XkoJAg5yGJHzc+FhIELkQ4shgK26GWBE6ZzJw+w3pD4zxzYRydlPL6Kqc0BwVMwlMgJEmC3cVf3MsPR0pwFNsb9xeYveqSftlbuLSM4SgMaNSrXqkCXnvJIk5uTMTpLTIint+z7cESICZyFiWGapDiEx16PWfd/NacmJiJQUXmutVpVYrL/XeM0gXmwpzglrXiK+C0xLuhBRqfqxf9fqS2rKANyDWoeYvFjK4mr7/ePYdxbhlK+XCxGt60p0vL+/a60BWL9///719Y1AxKneChmZynV7kfW1HLa9fn399vP17UtacgQTCDOn03IWwKvR+BCbmWr1qmpqVd2NGVqImZdliVczs9vtdhzHknJENbh7Sunvf//7ly9fnD5cUq01EgYoCr3lnHPe9/3cJ9v42jBXw81YsrAHqaqjHiWy6jmJpESJhRJlckWQ2EAtQAaTMHJRrUrViWSRTDnnNwMzqHzcf/tf9/sHu+RlFXXTw7UyI2e5XC7fP25VlZlTSsvKpIVRSeSyJU7ulAjiC69ZjowIYSrlYLAIL5nNxd1zFpGlZorPLGQ1ez2E8fb6sub0/bve7UhUmdlTYtC65W1bgtrfvGoprJxSGsnxgJG3KI5aTVW9WGSkaKkCohRj54C568DFql4OHStoPsKyHcxVrAAxU/JQCJlEiM2gUWEG1IGqT7ZJ4TNAPza/YBnyFh792WzfC4B03S+C4tQb7V5cFcHuwkzWtIJ5kxk39F73Y+yu1BNO6NROgCHUAsxNJnDqigcA0OyZPIHvmKVm4S87OQBn8f3Dg5nNe3z/J9k99rTh02hBQTjrZM8SuRnjmGqtoOJOnLOokyqlovVudadSsGQYRPKaLktasyyHajNi/klbaZLCD8j+TzIAP8+l+T6fDzPHJ3k6w4khztDLJhI1uDWHLf3phx8358ftHD3/ua2z+CY6z+wfWvhxe+5IupsvBwAMri1MjyEiN5/xwDiaLONnZUyfYUafb/ZsVgeAQW/aWvNw/xmKtBecAcfZ2rNj+wBNiA1DS+ngt1noGhSZwOrZe/g0wcb33IhL0bXih7X53Lb+j/GxJ9OTe49H6+dTjNCE7gCkPpmmMOLoK1fAe58RGj9ri+rz6fumG+C0mrdYMbKo2XdOTYRGMhGEfXqxAWLmE4BWYGuM2eeOmLceCs3VH+KfMFSfxyNCm7zH/Z/fx9jM28181SeVw3v0m3dK56dbRT+f42H6w8LfoYTa9EtrifnzO07D2fiFnAnSl6Vz1ODy8yqg8dTyefPWMYBHPTQdKkJMpSYSfgy+LfTjXvziHK/u1fAYiLbXG7fyzAIA4eYWYibT4WLCWCM/fGL/OM2BFisZz1VQi2p1M2NiSYR8XV9ety9f1+vVBPdbeX8v95ta8f1OVlSjJk5V1WpVtQqF96Ob9i26emyvUUbHvEsRVW28CE6RX0FEKSXqjFhm5rEeJNJ0Tleyd0xfSsmepB9x82rqpm4tNNnUaq10HE5EwoKT9uucWkRmiGTH2EeohzowqRC7eymVj2Pf933fq26SlsiUFMlIJDk5OCjtXY0sMhYk8h+JKEkyPULHgCpIkpgsmRXkUZVJE0NEQt5HNj2YDO1/IElCIoJmWW+EBvU49v3OnFJKBj5UoRodWGuFYl1XVTWrKTEnTomXbSGSJKIiHx8f5vVyubhH4TYBy2G8rBfPebtcXbJBrm9fX7789PL123p9ReNob9ADiOh/MAk1P5qTQGut+66qbtXVAAO7u2RODArfyH67v3/8QURuFQAUtdbLtvyv//yPbc33Y0/b5V6KRpBVSgDMvJSac54jxMYmHsibTbmTAJoqtAKoVAEkJgEzp7ZbEZw4dLNuZRSDWvVa7aixVMEQWrfrl5/oX//7r+TH/Vb2D26E4kSCVZKa5iyX6/b+cXMmzpKzVLu5qaTtsi6SUC2MvLxkSbK61bofXkGJovZzLV5rFWDLWSW7+5ZTygzz9/c/ai21yJa2l8uSRM2KFXImOA5SIgdZMbVamVkgCeyu9fBaay2mVomjNobVWvWox1Ebtw/3khjcIBQLxLmXszNrJu0GcM1smCFbHYyWG0XuVKtph/JEFLSc1I0cFLlXxMxcrQB4BJbeqbTRa93E5RJh0hp1nt0H36uIsOkTHESH+5hAWJNZ1J5Ibdtz7wyhA+u7N6agB/OWj+1nGPLOoz0Ozkxm5O7cZGKTPtxqUzCznjpACPHTFD1JUgcLd6PvqSShhxXNrzlL9rbFaYROPYSC+Bn0qBXKZAZyKsYVTFTWXF6pZvZVIMJLTpecV8FRoE9CPfLlHuRO8wWdfCfz+T8E033EH054BAMTxghAO1nQQ/prLz007erebWVD1j3s+UCP+G2yeE4Ctj7uvULFw9DYOdOmeeWjZWczAiWfs3FyOGC0ZCpMZQPfdSx9fsY0q+mhDHPcKNpPwImmPpe/nXr1Aac9/fr5oMZ++aAGwJ08iA0xnt7HMtrQ/o67GLEPGEajkx4guz225VPbHmZRGBemMwMwGxE9Afrp+sDkD7cBHJ8RFPm5PxBRMPK1uzz2oD8MfHwDdyd+pj4mHpOjAehJIzSiTNSVpz6NxtoHQNTMCwwjF39cVJ9x9pMC0KfXw1+nU/WclyxRkMTPQ3gS+zp0DqDvV1PUe2pp0D3jjhwOo/CIWExSOJyFmIYOE+6aB354OtWnoK6yszHnWTZpdX1bPIlnMHIuIoJxMDmPyTfW+aeebOxm/mh0aYorkZuBrNvOidzNI8n7h0vOzAgwntKD4rQnk3kfmsak4j1ghihqaYCe1gEQtq6H3fhPN9zpHUHCPUAWRA5xWomvsr3m9Zq2dJgepd5vdty9lnLcxdVrQdXgQGoFMlh8yqIzM7MohIuYXdrlcAyEmkUfpW4IYTQxpZ33ugk2kIHZDeDISIl5EAqASFSyEhImgCSJQA3qBSARqeaqhWoAQxHCLCxbJ0QughaokXnQdCTiLGlhJvZS9r1aclP4YX5UYxGn5JKRjJ2EczUcx0ECa6yjKUUhMwGT5yXbrqp6P6qDlRWiGUjCrdaYqkhNzCAUZrcaOYEG1GLlUGEFUin3UEiikmtMlbRsUcys1lrqzsxrSua4fdyXlGMHEMnrhcEJwiI5pVRVu9Il27aplq8/fcuyES/HvVy/fNV0ffvlr3fPu9qX17f17W25vsq6GoNFwGHLhJNLC9wSMldVN3Ozcr/t+25VzSsssjyTSCNZKqU4tOqhqpfLWmvNOcN8LwfUbt/fybyU3VjCHxLG7NgYSynMVGs11YF+mDmFGkKVWOCqte73ey3Fa7lcLk8rwj0qKxGxOAWtw5nTvywLYCIipIR63G73o+pRkNa8vq7XN6vF7N0BIbh5lvTH+3e1knNa11XDAiO98AzzkpM47+UwdSLASxKSJLuzOy9L3rYVwK///A4rMBdaiFCtmLqzJKavb6+q5ePj47f94+3t7cvr214OrW6E8FxxKcFHyT1MPzhw61H2fbdSicjIHKbValWtpqW6VXIjJmGSJBzbMhMTg0VhBlKnlj9KnDgs+xpETVGrquUeslDKBq/HUVTdASZmrJTdPTg90YO1Yt+xGpaX09UZJr3H/dCIUgulIK+d0T+s/kLiUWnEaKqC1YA6BRwY23s3prj7lAsxsFQTaP389hW38IBBAR5XE4+I327pHG+AKTqx35yD75j93CTP5w4o1h/QkgCYIlPUjUaDgw0oCpyddwDclSihFzMarcWw4Ib5o59spq7FwI4KqpWZjzvVg2oFsjOxk4iwCExI3YJyBUbOYeKKmIYw4QUy8Ic4LpowwP/+oB75OUYEDUfZQNiP2KDx2H5Kq7CG01pC+QP3DnXL9AyW/qRFwcp3OjnHI0ZKySMOHJD7JNP0yfOMmc7E28AHwjcCRy6sw6dK54ErJjZP6/pw3L/hRlWjXojavOkDZp7Top+CMiZs+dT/Qo+m2CdB2XykDXGzu421T93A+hyC83hwcK+Poh8EpoYap6pjnxv2hGBdOFmvSaWKEUMeM9GZ2M9INIeSj/d6sFkH8W7vk7kWxxOybWp8qqcrqgNrD6d/NjOaQs3GfjArNNQ0SxMidFRK09/gCY6HShQch8M1NcWj2ZCFgzvHh8HSe+QAS7MjEjMJQIPJPvAhU7c9e7OQmcJT6mVZaSw8D0ngTT3qvRaKyqnezaZZFREyN6uDlDYmqJAojMHmxhBza/DcyOcicw6DMZNZnVQXcg/ipDZx+6aJMaKtqJzT8MMSwQlMyZsLhRDbbw9oilxUdeJWh5JrrcxBdNB50lo9gxFoxHgs4+JI7tpC4XxwCTNJY5VgB7VINgBOHFzmI04VHBEpk4WGpj2UABjBibumTc5Wnaxlxc7T1NwZoo2rCP0tAEBtWDUQV0U1yyiMbF7VDMLinA2vOf+8vXxdX8Vov91RC6z6cdP7B1nd9/0ohQBSx1FhtnIObomKWqNyHIsAkb86AmwMzixOVIPuWlLf2igxO7xqcU8AoNAAHYkAUvUIPA3TuGqFwVNyX47jSHltksNgDnU7tGr1MEaqarXTS66qVZ2IRCQRUhJmqmVnTrUebhaRLYlYKGVJ5XgvpYiwmBN5Nf3+8f6+8Suv6fL1+Hjf72VJl+Vy+cf/93+8XLZb2bOIkUVR4CggVIrmnKKK5bHjo1iqt5vldV02scu6uMPqQZKIIE4b4ebmDdBQMbP7vSgCATN7rHF3c6sCSpnJ3F1v9zszb5fL7X7/44/3LOnLt5/Kfrzvt7Rd7h/vYR+UdQURlfr7778K82Xb3l6u19fL3/72j6PwulwT2eFy+fqtcoIs15dvX/7y8/J6tcSFiJiREoGruWQRycxsau5HYhYGgW63D60Hk3PmWrla5Ug/kHy/35d1/f7+e86iVtWOUsm15svyz//1a2JZmFZhKmp7+dh/XV9emClqgJXjyDkvy/L+/u7uEjVxTUspxJzyAoYZa621lFqKw1mEEwcnJtCqrIQThpkFS9vuGG4R6KJExOFQFtFy1OMo+3EvtRyVzZcv374QqtvHP3d1vebrRTat+9vbWylFTZec1HFUrbU4r7H1JJLrumzbWo/7vu/hwYD5ZV22JQMgaErp29eXX3/9tZbdbV2XxW57Kbuk1TkTM5HkbYVaqcZiOa3LlvdykCTAihVXvV6vr68vwTBbygF3LwattR6laLB0RiRuqIvknhOul7QtnDLcXJXcvRY9tJYKdSZZ4E6ma95SSrUeRF60ELnBhZKsWUmY5VZqyolErNRg1pKcmrA3qFZ3bzVY3KMUtxar1U4jjggxJ0ru7uwikrwxgTqgak5RTdpgbuTMiSkJZ1Bz6NeqRMSJjqpVPWqPMAtcAWEQzEDESCkvgyIWoPt9FxF/DA4ktJhzCtuBMcHIQe6R4UrnFhcm4ADBIGJnN3eHE1OULSylLMLRCvLJqSIsxOwIt0buWQqlBNtPYoa6ea0wN0V3s7m6CZS7hCJ2N3NVVyW31hqClipRRVpA5ORRmraq3UPUpLxp9WOvOO6CSzVWHM5OC6eaxIRMW9w0S8hsbwY/skinDvBFhFl+OeA8e/gjaFN6wLP3AKoQuNpM/t6/67a/zo/kXeIjFAB4FANuGLrVFZBSCrGzcyDOTwieiBBhaXiEwpM25e6eJLVWD+nc7taBIyZAAjLVUMDj8ig6QkQRWdolehzck006GAMiHpEAtWID+LYKOUSEqBzibtHTjoKWuddGY3BiIqywWgnwzsTPA1C1Zjzzuva3OxUq6iiWQADDW1JhCCfJKRyxFrTqADys8hFBJwBkzlY1DyrCiE0iB8PDWUsEZ+kJg23hgBBcbwBAHAECRF6KEoGcBmlYMx9zizTudU7bbMkidJqGAXhqsJvDdRxm2PFo4ozoN+ZIQzRDdT9ZgM4Z8zi9Rm/GSTpFwZ293E7XHunRNAoAxDjniJ+grWexBHWS9DQ2Un629A/n0TyPzwYM3rU+wEbhifDYu9BLgIHgbvLoAEXg5tZs78WPm0XB3dH8kj6uYASQUXI3r0TkpOEQcIBJMFWqcncKC0WfeA9d55zSQ+fHU4DIMeNWp3kg/EE0x02Bc+/GKuo2/DNv+3xWf3ZLbQRQm/+zGebHR3BLNHL3VleEjayVYKQGxNugA9THMfwYbWGM13w0Jzz8NB/htSTAHmddcxVPe8wY/T+9T0gyREk0IocQJfDGKYPZATUrtdZD64Fa9ttNe5xMRHEg6nw5tBUKVREJ6hfTFqlSvXFY93ApU4Bd3dld0VjFmSns/R7JsRAiB5Ew1KnRZ9A53yIUGLXWojVRcmY3Jwhzo3+M2HpTL0Eiviy1ns7iiP0XBpxhgyqGg2YnZovWJi5CQTOzqn6v+vayyXrl5UXSnaChV1ctMCOCiIxMQ/KJDI4TJyQHcVLi4sRqWy+WVGmPeAVTg6nC4ELmUGc2NzHQuq7VPRtBOKXs3vY1AkLGiEit9vFxd6ZvP/907MdRDjfay1HUc6Ltcl3W9fbxUY/j9eWllLJtGyf5H//jP5QSry9YXokCW21puaTL6/btZ1mvvK5I2SVRG/kE97CamxkImYWIqFpVNS2q6lEgIYgORSQnGHLOf/vP/5mzEKWPj49lSfeP95S4HneCqaLW+u3r1+M4tJS0rqmBI1bVfd8B5JxrrS8vLzml2+1m5cg5Z0m1VpEMsIjQukiienDZb0ct9SiSeVlsY0LKoupwM8vpTKD04Eh0EJFpgUW0jAIseX19JVuX22+ot+8my/b2k2vZf/97NcOyvr2+7rePUv9wr0S0ZEGQWko2V4DMaugUWZiWbGZZ2NlLKd5KR+l9v1PKLy8tHMusruvqPaY55m3kV0RvFNPszCTIbF65tqiGY68pc5CihnAGorieqVo91Kq6lnoUrUXInTxxJm7BmFGMspCb+lHKfS/lqO4ulAbTJTORZ7ATuDqoKBaQMVNysGnVHrkRtlAm9m6Ui7rE6kZm3nlCaWTO/WinaiFDROp1fNX2QDPUSiQc4rIZWmJ/0GGLBQwdxDMLwxg2CEFGOE231J5CLdhTgYb7u4WvgQaeEgVOEdxYH30WvgDcjfiMIPDJDh3DGlnv4sE6OkzaffSb4R/o8kPh8uDyVfR4ofGIqKAWzAo9khvcFBJnCXMRrCpTKA5KVqtxtaJczao1j2hyJsCa5WzApSZVHY7a/nse3Wx5SrQ5xa71j3dgH/DBGiP3BH4CkjyW3KGQfic9FE1R4ywNIY0BiP+GT2yABO/unIEZps700dr/4niS3bPR7fH75xvFuu6YubHhYCDvePnW9uBu8v7W3gMAeoJr6yga0SVTRz1kBfwZohjfd1IWavC7H73i7/nX3YlStdq6KdYCem039O6ddKTor+g2AUaBs3Ai9TeEgJR+0PHuY9oME/w0edByjEFETiNb9FQZqZMBtJEzeDcNxxd0enV8QPPHpz+HAAHtMeZ1JswkorZM7PxmfCAiazkAz2UguntluIpGNPkMhcNY0mgEQRYprTH8dEbUPPm2zq46G0/Ua5vQw3lE3e/24Iqdrn2m+2xnTFG5YYyPuglkDyeP5nUPwwSSQjvhDrYfX+Txn6fzoYX8tn+2wKrTp9R3JQecFK0I4MM95w/9EQ+2gafDT4+kdyEQUz9Up3b5yZI1SkQ85vu2FfbwqBEERX/aBm5LdHqLtm7ZYdYsIuOYZ2aPqKIxI2IbboubJKUlp1VIvKIW1XIv+12PQ+sR0eROg6xAI5KEIHqUnqwZ+Xnm3ionnFxYjx3YfFNt3npwZA/BOSxDzNzX45wpbqqFOR3HEeUtwTRycHPmo5ZzpNREZNu2j3I0w0+/ObUXMQAUsSwiw6sWllSeuIn2Wu733V9yymvKy05sWphZhO/3e5QiIpGUUrMjdn8xAGbOOVV3bW6NkhOcW1B11SLGAKoeWqqClJg4UdIki6qyejQ1/JApiG0AwGpEMTm5U3UzQpKUc37/uNVamdNeDrMKk3XJcLvf7wJKkmRN63b9/nH/z3/+/vLll8t28XQhxgKR9SLrJV3fLte3ZbvmtKW0uYQrRoSTo+08nWWZ3b3e9n3fS93NWtapiHASFgEQdX/3231JL1ZVS0USMl/TCmc3MtP39/fL9fXjtlezX7//8d9fXyTlP/74bmbLZcvbejv27eWqcN13BzgvzlzU3KG1AGA4E0lKrlqJqqrkBKDWuu87JDGzJEkpqWrQQXWTVi9uT+Fq4UoUcXLCOTHz27ealyXJkoXhMKPyvcKX9UVV+djhiKjqZVmJKAuHFsocFS5gDElExXNid7fqNfZb01IqzK/XKzPv+26u27YR0f1+j+KUghSNj6lYTPd9z+uShGsNiB8VEoydqzfOWVQ3M42iGFqPo9b9UFWCMVlKkrKbV6tc3Yice1nl46jHbvf7EWWzYwmArEXLN+MvTN3JqXqjuVQLxzoziXAaXPVuXZpIAHIzg52ZhI8gbELVDZcTiERyzDlmTj1VYMiUtgcPJHjK6LYXEVNiTonb7mI1MZS51mrxFDXYg0UmdtlBtPO0iw0AMVo7ff+4w1OLFGLmcDI4D5jX7sjNleAhEdyd2wbagBQ9HgIZlQ4iWUVVO3UKBTuz0IPJkijKD7QHR6vCAOHYOS/iFmWzVUMdGAUiWAjBx9XfjnCa9kP+Tn0+Seo2ok0Gn/Ufvee8daT1UKDtTxiEfpBXMDp49HlKDxyJT3/n8UWjeff+RPJPqOypAedDpza468mic06eZ4wx3zYk4/Tl9LL8qJD0N3Qdz3o45rXT7+MDF/3Z0Q24D4bI6e8THBrtCe/HeeensJ9YKONdFBpzlYgscvyM7GmeYEZ0U5t54uGxlnhwDspDpwq19J7QwFuzIncIQRBEAIT7LgQar3nyjLUFiwFAzi/RWYdmjVY/JzG0ofJo/ydm4oed4nnv6MtmeurDfZ6nF8lDgNrTBvT4XBD1wK3pWS1h6PHk8drz49pZDyaHh+UxwvTweHizjs9rlUIZ7EvE5/U5eubzMQhSqJsHAGCwzjRSp/Hc4Jz+dJdWs+xxU+hNnVDm+StzDP1D/mhf4WNxeEtIJ2UWAsMUZG54pIsddcXdP+0v3hOI21P+xALxuZPRpOwk+WhMxT/VZLjN/iYzxCmLrGnNnIlaAHG578d+O46b18Og6MIj6gc1ehBv5v/xakD45OFeE3Pi8NMO685phqGRcctUC4ZWQxMvUMv7m7bvFsiBYk6pZjNzR63FHMwpJVRTwZhsYOZlWXaRlJL1WRS3PPMrpuUZ/aZWAOSUOkqjWnQvettLloXTUs1rVWZe1/Xj4zuIwfSwORIxc63VHSKSZDGUeznckHNe1uROhGE3CpKTSgTTqiCCkxITIlXgfr9bq1hLKpSIhYUZ93IjBohqrUn4crmo6u+//67HUavljWC+pPBtyHG7e9X1cj2O+vb1izr/r3/8IcsL0sbLm/KmcCUxWTm/rOvbsr7k9ZryhVqcAoLcjEkGzzc51CLQ5Kil7MeOCNzPKees7lrKbb+XWkvZIyLfXF+2y8f7d/Qk0H3fRdL7fY9LtuvLb//5n389Dma+HTszv+Sccz6OI6oHQBvzTymFHQHo28CyNw9jXjcgcg/cnYKgdcyrT7k37kwwcBJuSc6l7LBqlZwdab285SVntbrcP8hKfady//5xVKN0ub6x3O73u5tfLnnNi2sFEPxUwcU/VyYiopwzs8JIoUv2o9RaD5HcMqVggAS5DRExcSNZCrok+P1+hN+FmSPeJN4oUnsDxtW9lFLCcQciPfbj2AlYUtqWvC5pzXCrSjWsxVkYkX9iKEWPXWuJ8moprEOxxA3uBmcCCyMT0tgerVN4xXwDEIp0X2gKwCyyZU46S3QEZ9ayqxvdZ9AMGTwsuAQPJZ/jznbUSkFRKuyxi6m3vCw2jMXVAEHDXnMAPXV0Hvs5UaTnhSJhEdQTyzOIPtFyDTEE/TR/Yic5eXjGrjIex6FKNb3HPMJ3BeRRvIwQdWzRSla3VUbDGnIiy4f936hYYcYoVdYe1y9p8HpUOwGRmZvBtLiDhPxBx1C0TAO3tqcRyYh+mdD/M1p46o2HRj5KT2/azQPoBxCReOdwnJ7zBzA6osmp6359ZZ3CfW5kX+8PYJeZrc6xDJM+OUntPxOj493d1VsXPagZT5//THb/8Ju5nf+Hx4RqTuk/NdLpE7QbLyiSxudhjMNjn/d/Ts0LC5d3hdl9NkM/vc5T57i704m0Ag0Oi4DPcBRknR61DTfgZOTUgj3ii35ramXBY+r2xFSAW0gVfpBuOjnlukoV6aJRegyp/zzBLGDEnTeeFsLAjpEDPE16NMs9z1sSxl9vLh72sIsQwnrqf5JJQ50obX7ueJkJ1rS+NjtXuE0AF6c260P1ce98NJOe2su/wz3a318N8J6VM/J+5lGf5p8PYOseITIj7M9jv+6vMXxwzVAwMP/jTh33OWOTHmeehgSe/Qx965kBfZta8zntG2d8cqVNU+dZ6Ro7x/ki4dhAvDj5xB2K7uyIFQu09fCUjvN09I7lc7l2TaoPGXjk2Y95ShSuR+qKJZGTt8XKRARhSjktzMIODwBRa9mPeuxeD1cFGUHcXb06tVKDVQvIoqItguFRgU6zxRHIepbc7jKyEy61OUo0Nm7mzksSm0svBzXvy6oKlC5NB/JgZi61zlPOzFSLaiEiYc6RntuKDLTHMTNYOkM8kzQ7pwiJULKRPEfV/GOvX5eF80acijoJv7xcvn/PITJhbrU2s6EwgMbDzSwi7sf9ppXvy1ITlpf7WraaOBE5wxzKpJxEEQyKBqjbYcpS7UjEmWXdRiwiRexUEjNr5ZCqu6Oql+Oo950dsmQiWre8rgu5Hvu+pKzqIhm8/PFxP4y//PzLev1K29vhubp5Wnj9srx8vX795fr2k0siSVHtGARvRc/boo+cq1AHiSitS7HiYZ4Q4ZTMtNz1fr8vLOS8rms97mFzJ7VSyvvv7+u6Hrf98prM7HY/JC/XL29vb2+3vSj8crksy1JVb/edJf32+x+Xy4WTvH98WKnLsuSU7uXIaSEOD0DEGApvjDXdbjeStEQCwbJRkmJBT9kYvIgIJO6hc7UX4yTEmcjN2UWtyu1jNyYHQzZZXm0rVg/V8r6XBF/ysgpXBzNyziml+7G3MDJ3mLspzATuDK0HESVhJq6HMvm6rk67lt1KzYsIi9UDzpkFaiCyaRMKbS7nNYJt1jWXst/v9/v9LolKixJ0VT3Kfr/ftTRfVi3FTUUoMZJQFk7iRpHSepq3iYjAWkkrxXI8AV8A3zAGQ1JemTLLCg75qMEILOGBdY/nRlyfusUkAcAM1xZc7PCxP4cCwKPWBARQWHX3aqbegppCbY7KfhFaM6PAJuPcmWxm0vNe+2xoKW29u3MHiBLo3LxZqyf0RQ72R16eafsdX43bPtFLmJkKpfA2BBhSuFmw25ArM5goyrOQQxITUXCqNH+pnzpTC+lxJo+kwMj1EnT4FcK8RWd7WEwA59CjyGCluDu7AU5uWZhzkpw0JXAx96BUs9BCIoL7tII5aPC+t4D+p36YRNWPIKy3Cpfnv5kHyj9FPE7reAh6b2rDA44MbNMtUD8k1RjoMxr7DFLHKAFoemOPJnh6nccz51eA2RylNi6ZnzJQ0zMWn25yUsqO57o7E354/iOGiUfP6PbkCPr0ChjkK+g9E6FxTbg78GjIDundbmJTUG5DaBGLpdMKYXcPD7UIiFriY2B1pzMuh9r/nQjcMDDZqDshTO3CyPW0VjijFctuLPtA2OAiTKY3of1HqAHyHi3VRuGkG27wY1QyphbZwwwzH+rRjPYiffkZd87HPMwd9/34zD7L9Sk/o08I69VqY2Y1Sp1JB3jQWf/sEfOy6SstMPrDdPehCjw274e3AtBj9X7wxNDc4nwbBJ1ApDNgWqJNbf2Txo9oij5re5N4nvpTV6CVXO0b1nhx875jAY1B9kSiIIL05SsOj2qv865PRO5gSpES3X8wWKSZdRNLVBvuGtEIkcI0WJgXbr/5EC4/7IcfDvHnL8f4PnmiWme2hwXnZEeTYU1sO4IRO8zNa9XDa2WOPGhMcrQB+ghjBaDBy26TiIoPtbrDVEFElIh6qRFuTYU2IYeuAHDnrHgY3EdjRucvJAIJsYHcVVVhxgJWjiJNUCv33c3iEu+aUkB/oaYAABi8okEbmohFQNWsjRQTp2pUAcrL+vKmx83Mcs7Xl+1+1Bpp9d2c4dOBtpNyNRR3rrbfy/tyv6zrwoQsgBFDEtTU/NAgIBM2NoUaHCSySEoppcXN7nrQ7kzYtu3j43s1zZKCq5SEr9ul+ME5m0X00Soi94/bvu/X9fJxu3399pfv7/ffb8f17S+0vOSXX95rNrms18v17evL158vX76tL18oL84MFmtxY5N4js05MkCO4ziO6MDX19dqCnMnFK2qGkjitz/ef/r6LQu5Sj3Kb//857cvX6/byz/+8Q+rYc4nScvHx/sqCcTr5RooCkTSmTEiu/T9/V1rYeYlJQD7cbh7TguBKTG5gdQhgLEj5RwGac4JwmEtZiaf+LaJiCgB5k4cxKURbuXBLyBgrK+v5eOjQvJ2RS3l+KC8ba9fy8dv972a1SRIKeWcE8tx7GtO2iLTIkemNHIhkdPv5FAt7p6Yr9v6/ePd3FPKKclxqHnNaQWikobPyQDZhYS0GhHlnJjXUvfj0FqhRxER4aiNrT2ZAbUebpWJUyB+U61agCUzC7m7aVjrcRz1UIsIOCKGB6+1ErV4PCMQSVouS76wrPBkD3buZnANMpycc1sDVWsTqIwOlGNjbDHuZsMD8FnctHOisLQzCce8EhY3V3d+aEPLfXR3ZmIRYp8NK/E4Bs+FV4mIIruKzN16eWHjmAenldoI/mjReDDWDnkx1n4MAE28nNFNcb6ZGUiZPUqmA+Bm06Kut4xbhV9l3mBjtxFKY788O9a9x75D3Xv1PTCzlepMEdF57qUinAhMbjAzU6hbddemMJ/u03jOeMpo3uiQz1KnQ5fzvabviUgxzFbjp1ZW4cGqGAf32vDnDJks3LOcndb4wAAPt5rxn7s3E/Of2+DGMb+C2/NzP7f587VPzYgfZrwxteoHcny89dP3j1jFP//01E4iCuV8vtXcLf2SyQfVsNzUzxHko/ODmmU6sJb7UMNOB9FYtj3wFw52imBmmu8zQgwIAnYOlOKxYIQMYY4HpK1WDzt105Cp+wGo76JP/d9ebeqt+fWTtTAjcnfqmemgcFG5dyMm2huf4IYIvQjwwK/jkeHgEAD0lOmCRhOgNfAudXDYLDFOgilAcKgVRnbyfzF1ftq23cwwf1TW/SHWNACNQGP0ReMpco8ae2NmGICme33SmMOz0ZNnHxZGMyCcL+w0MDudNvv56dNXLcZ+CvJvbxbQv30MsEcKJ+/RisA5/6YnxCg8P/fzRnDiuc4+h+dlHBC3ERe1q0LFNqees4subQDwXLKkPfc52q8xR83Kz3jzySQ1puEY2HFnedqYQqKEtmIe4dPB1DEOd6+q0OIgZ26pqW2pKIyExbxvw41MM4z+57wiIh9ucW6seACIJJKGrNUQqICFA4CZrZd1pFgKvb+tK2xhNHJXsATx/3Ecqs7MEUlC1Epj3u93JmcGp6SqpqUxJw1RGhXRmGkqrMPMAoc5eFjxk4H2YgzZXr/u3399/7gL2ZI3J6VSKqKaWOOkQFheezpBWnLOhyqBhGRRo6JuYfJkkOuScNsLQ9lhbBE9AmqtcveWDmta6u7uiVhSLjXkoJVSi9oiiUhY0rptpZSee0e32wfAe9FlfXFKt+NI65fXn/5SSSpvvl5lffny0y9ff/5lu75R3pBycU+SnIhgaLQLFiuKnNxMzUopeymlVmbmlCQvgQuqWVFTdQPLkvfffv/+/fe//vKX435nlmMvqvbT15/+/vd/3O/3l5e3P2736xfhvBxmdy2S83rZzEzVzZDXxd2P+369bn+8fy/78fXr12Vdb7dbrXXbNguvVVEmF4rKHuxE28trE2zc+ImZhLPUcrRF1I3HZgi6cWpp7BrEYZFRu2xXmMPV4bjoS9mrgG07mL6XUnR3wI1EJKWk5WARASGZu+x7BMsZmJeUOGCTGUxbKrcrEXJiN/KeNBzTe13XqN5FBJCZWylQVc6plt3gqq2msoAi/bqqGVxVrSq3hH81LYmRU8qJhaK0rMM5MSdJRqiw/dDjqLd7ud9QDlcX6ggvhKu7OROcJOUki6TFKQES7JPkLgRuzsCwZJtrkI2CGK7VGBFPmxhErYq5e8vMVlWRFiOkqmGYV3cwkXMY5VTNvIhLOKPiBBq4ZEqGdY8qIhFjGPuHOZwYZq6mRJKibLSqBH/8WTGm1/1lZvjY4cLQ0+oIW8vSno0sc3zROCf+YSaqPvYcFxDBSoW7GZmBQGbuoMyEZhQnANDAl8Q9tkF6Pj6DGKIUPBydWK+7IEYDam+kwVMwqyIyEmLqMIRJmuJR3YpqMa0j/rJbQOJjp1YMo95DFDU6kOJTGnbJFbgRHJx+pwgz6slgcRM2M4/iA3NIwuTnRxct46EnVqOH78/zmYiGtdA6pKbwk3DHSe7ekcazQa3XpmjcGePoCkafNv1an9/x8VZPf6c7EXMDQmFK71LciZ5zUOenn139CEX6P2evyLP3o9n+BzWSN7s4yB2N8KpHTLSMmrO5LZNw0jceg4XiPkEg0+EZ0DHqaM/DQT1H/4Q6faMebzpo9MdbMxEl6j6c4U0iJkcrZB1+JyNFBAmdYT8nYOoFfMNO3Z7IEQg+5gd1TbcHKDRl6El/Oju6uzww6azjhE9zxDpEdCJmITp9NGNEtcVjejttjPfn+RFtTmnpValnzfvhKuvWFyK3R1fagxbeI+nHtaMTfzgL0RfTrGLaj9bGec50JrrBZvq1R17BeuTvtJyoGUy7dtCbdIJkA6TNWmc8tHkK+3u0uODhQc1xHk1Gp62CE6OlmnZ9ifqY/qhKrj/ULf4/OXpY5zyODMCmgp30X80uAGD0ZGWyoda3ljaWURbOJOzNi2dWamJJKVHXfwjwlvHbSv8Mys6UUp3mORERO4OIKIuAGRSltUPHiEEbE6kNfSiv1EIEiJjhZ9BnJEs1oMDCQl41FABJCxEJkfVo76rHZd2ap4LMtDnWzMw/WVbaZJMRZGXQZqRiSgbfj5qd18sVaf39/deFahJOmQcBWZOrXQ9H8+NxznlZci0QSct2jbpYwjnYk4g8ES0rK0Q96JaImAlu5rVWhUIt5xzbWc5ZFtn3YhYnHG62rmtK6Xbf1U0k3W53CJkCwmq4Xi8f78e//+u//P79oHR5++Vf0uVLXtbvxV5/+ivytr59le1amIlcmFkYzODBIdz0ZyKUUtw1+h+drX/btn3fJSfmxKZ2mMFJOPP6yy+//M//3//nr3/96/04fnr78u3bt99///315QtB7vv+9efL+z9++4XTdn3Zy+Ek337+iZmP41gvW16XqNSWUvr+/eNyuXx9+8LM+74fx7Esy+VyiZZ4qUSUEy9JhDmSGiPrdwCyakrFUqsE+bCPmcHVASOwpMwEdgNV91JrZcmSlmPfWdLrt290Wer9twwq+7vuBDvcXeBrTqTr+/sfmWVZk4ioJmb2kydKRpHjUde2HoeIGFmoi3lZIhUnpaS6zzMzgqyu8uru+7F/3L4PXb2UErX2ai2qiomAQchTSuuSliQwdZQkLEIp8bIkZ4GXo5gZarVS/ajNrRuGeRa4m8JhzhEVJmLEcHID2EndEXUhKFiwHEN75ywEwNQDtlqP87EukrxZirqIjRSjxz3Te9IqUYT6s5n5JIPGBigR4o6gpgl+RuIW7d/22yhbwTkN4dIPc1chJycSJGI07mbAzQMrmk0B8c+7ByY5OP55pkSbNb8lMRFZiQQMtyhn4A4iIyRKxC7dWumn1cnPTbXvleKiJ2w97SMj3knjJj2JqG0sIUtHbAbByBReUdWtOBSuoUAGH7U/eQDQkQ/GVj9+ClQ9/4RZRn/utA7cQUbdqNirrOIpeS+Gb3QA84lkRs+PxjRsEyHQn3IkRlja83v9WRLep4HuovbhDvPo/xeXP4ExPIfc+NNTntp5XviIIma0818f47aBc7gpwGcf9rnX7fPjTz/OF4nkdT6TsIcFsDGXPKaOxIfG6OQDjnWVotfIO/vqUz+Mp1NnKzqJVyJGZhrGE9c9ddT0192Fp5J2LeQJZpYijLhNGwdaDHSk1s4dGi4kjthfb5CIzM20ueSAyC3yzt7UmFJotM9tMkW0N/fmrYs34QbbDK2aUgtlmd8u/OfNnFlqHaCwjR+IOg9a0HQyiEBRj4mY3CNp+1zJxG7NgMnu1hyys/Y/zy0APXk39qR4BW5hJ+Y+slXj13OEqNd6RFe3m8sGOnSDXiDmfOzJhtRgvWGkCT+yjsY49sfF/SPhTGnsjXSyFgSDgZm5N8E2bRwtoJ2F0Ep5h20ZjdJ27G7cY9ZBIUnC9BAT/lwbjbqqGbCf5qsNn+iY2QAeN45ejS8ka1vJ8/4Yh4hYc8GTkEfIO0VUk7DklC/betk+fk/17gx2YnVYNbdibhEs730sVN3cRljOGWJL5O611qCD6Su9DQF1WEZEKSV2TymtKcuSSyn12N0hSSgij4lTSk6oQaBpJdvikykubhvvFZE8EX4BQI+ybtnMvMYadNOak5g7CQOccyZOtZpN9dfCUhtgkIB93xmp1pKWTILXrz//ftz2vZrVarquK6dUayXHvu+m9XJZk1AWOcz1UNdmKTiO+nG7L/Ja1D7u+3XldUlMQmyrJTXUavdyKAsLCZMRa6l+uKayLEv0sBNzkv0o+767u1q5LKukXFXhTpD32y5LdqCYkdn28lIVr99+WS6v5eM33rYvv/wb1uvu8sZrevlC64Zlqcw5ZVqSS5CWuLqWYiKScyJGOUrdK3mjH12W5fp6ifmmjvVyraogYmInjTpv5tWJ/+3f/v3XX38H+H/9/Z+16r/+27//8f7x+uXr7//zb9v1ZS+lqqVtMxaS9HK9/v3vfyfmJW9upB5uE0rLAkDN9v2wannZ1mUliLsyc942ZnZoqYXdl8QiiUVia9Cwr/a1EEZw6kmdQUUYzhtXc7WIhlN4qdVUV+F1Xcv+8f7HB9X7hZ1JSOTl9dvBXHcz11rrfruLUGRj/+1vf9u27XrdYjEexwHzZU1Waj12BgmzO4PJShERWZajllqraU2JTMvt47uIAPbxcXP3dV2ZuVZ9//hDRISh1Y9jDyEifU+LBJ4Ic2IBg9WJKViRjQURCwSr7snMiEVEUlpApuaqXquKZAXU9mGHZWYCEyemxJQIEpOQmYmN1MhdSMihVqxUAMy5IsLrIUnABDd2lGLbtrkV88qcVGvVI8L/AJh7VU1JOImrqRszZ0kAu1O1WEqm7gkQEVU9joOZc0qxlxbdo04UGTMopyQgwOJMAnKWfS/Hxz0cjmoGUCRMZyYimBkZWS84Gk5sYYQ7M2KHRlxWiIOO7Nsx8DeaG6IdOPErM6eIleoUS2TmXjUnDpuOThLWzCS1wMVZlrm7cFYrZkbUGEKJINIKq3GrIWjuCpJEDlVmdo4yb0zMLuwEZRTVezmOUqppdQMxiLXFYMO90z5OSldjquzRGoARRYmrCVL3j9RDMZtziZ0YpgZqNZ7RDerubqpz1Da63Gce9AlDmgSosSEIwoPUVc3gKzvvQ13ueKi6hMjaoga99PGhTZ42CW5DFxrCNJt5pDa0kFHqxpJ+hwegOSpY9YZ7Iy+YDMfAsPRVrwAaY/tQlk7kP/MHAtQ25xNc/YkqMt4oiks2JbJVv40slACfkYXCDekDjARHpAMBEQ5BADrOZBrv0LBty0iZOwEAzhwetK5zRF4ZuBMJ6Gn/jb8thSSkaaBUC6L5EzYLk7DUWlosTJ9vUf9U4N6465t6EwSy9SgxGKNJhGC+m3SXKNzW+7d3ejPSP9r+QeOf1Bs3n/D0ZZ+b1vOiTkaIeNnuobDmygnIy97q744bPE4joofbfx5+fqQMCyGKJ4Vp4m/xHrH94/tOx9MJY9xB/5tr58b7aQV50IMHtnb3MyjIw3LUlNHWYLIgS/bOs/RJX3rqFp5HPJZBa0NMC8fEXRXEEeiBX6G0xafgNDiHgKhHin3y1Xz+8nliDAVpthNYux0ee/uh/c9HBM84CNb7DRQF7cygRuTCJAkpU9pYbu4VLVw1Kuc5gZjZgrua3V1/QAo2HUDwiEdAC8wf7AFELeWnaQ6xOYBIOHYEopYD0LvZQq9odv0mY9SdHdqCA8/ZhrxIzjmAkXmLSDohIDcCxNZOySmvlDLTwW5CkKitUmuNvFfKJLxcXpeXL8WtHDc15VKaoqg2ZmybbM0Wa+6ute7Vy6EECF+3LKXoIZZQiCPEQoWYSYsWdyFhlgziYnVOKWZmdzL4cdQQ/J6bPp+XFdZCpAhQUDHPkinlt59++duvvxeVX/7tv28vP/9RbDd4EifKwrKusi6UE5gR5ELWkE1K0jXiII/qvDRpcpFRq1Sh5vt+P44CuEgydzN1cMqJIAe4FK0gySuYttfX//Eff/vXf/t3T+nt69f3231Zlv/4j/8gopfLBcDHfnf3ZVmYM3Wr8Lqu6SLublXf39+vL5u3nO8oNm3JqTISn+Vgx2brHhEghNMK0CaeR0+6GUCIkHQjIlV9v98WosvlkvDL/v3X4/tvx/tt5eSSDlUzrOvGVo7jWJakqjnn15cvpe4RpFQL7fsd3QxsFvZr6mYaNXaBZEkUyjA3FikzCw6l0HNFsmqJ0oudmyXYdRoLUK21Hnt4AIiIYOy25LixE4xbpg1EBOSq6g41NienZEhF6xzvSzS2MzIHGbNRNWZGWNkZLm5+kjK3WRqDRT5IgR3qYYgJ0S6gEv1vz5uVPx0g64H3cUJsvs3QdjaViDixZJEDCm3xS4CJJEDCwRI7DE1sY9N+dToFGeSubs4R79iDZkSk+57Pnba3ok027rH+T/J93uHPvXGE6ratUiZWZJ8vbEU/uecsMseeWWt1C2ZtGk+IFzQCtyI+w+AmIxDVmZwdwkYOQnU7XA89qmmF24nhf3CMl/rEuEfdNzPZyB+uauQfsZkiLNDNzG/j8IlMZe4KmjzbIRdG//xQpo/5Nm6FbjVkluezT2UG4xLqoJC6He1JUo9ciD/rIjxYrB+IvDHNis/To9/f8Qke/NmFCAax6ZwxRR8MhZ+OPlLzGjxv/ucNPqd3vz89XRXWz3lw4l8DUwa6pXZPRBAkJkdE9EYLD3PCyWXjTkb8wNIb54Q9d+4BIsJDMtv0Lu5T/zzjqNRN+wj7PIBWKivcT7Ed0YkNgX56lDpzD5ovb/7Eob+2X/uEHGu30x71f3fdbrTMnDyAkZON77skbk5Y6ibnH+DInp9KTNQ1SPfGflSibO3jEb/6oHtr7empj+fY2niToQaNrrSWk/EQWnP2IccIyXgddgcoykH1oMAHv/D5xB6J5M7uCDLQ0YreyT1v5NOrffru/H7evKLouqsB7KPQxGNfWcDdkI3uDifmGI4xzK1a2BQg2Ur+QoaG2V9q6r1OdzV/Od6oB1Z1kuOnjYzOqenuwEg184D+1Uu1YlClRImREuVVlo2Xi/qHmg0HITWOQkR5oMbLoe5uU11kjK1hwPRT5pmfSeFEIk2IiEiLVo3RFyqluHPOGWHQck+cFFGAbCfyxDQo2PgkWjV3g6nXyVmMZviJAAAiYpGUOphWG74I5NxcGSBxZTOvxQhVkJk9qqBdrpe3r1qPj/sN6rUeKS0CqjV8fRzpuyHVZEAu1FpRXO+H7YftR7nvR6YEsZyJzBOxJVRFVbNanIRTClQSAfHgRJIMdFQr1aLuQUpJnYq6OxZqlH/xgiRCstCyLfnyUfzw9NO//rf19dsfe9W0pWXZ3WVd03ZZti2vCzj1KFevtVKSnLIRrNZaq2oxg1BKkiO0Bt62QYXXasRQQwl7OpMHtUNKXmHMniAOOmoFKRMRbS+vv/322//7//n/uh07SQLwcbt9vN+/fPmyLFutVvcatJJEBCR3bbsriQiDNWovhNJvwzhHMFCNitdw5ohyJbPqHsXYiYncvPZwDmo80o1+nin1BSdCrEQAUs5rftsS/671/fvv4i5plbTpcaScE+Xj/v04agitt29f39//INecs1vdtk2IkySIEZF5U1eIyOBRmJyZCUYwAsi91MLMGnZ5tVJNVR1W7/eUm2VKTQdggprVCnMGpRx5LOSuzJU5iu2CGYkoMcJEau4KNRez5E5VcRRtpj1qE5gY3kLBmIjDEt8ltrn7UYoQIOrQqIfI8ODpMoqSsE3Yh+2WKAiiNQLJWvGZYGYciV2xkKnLEusQv//pK719H5RtRG6MlNhdVJ0AMhc0cq9jN7ias4ikuEfHWQQQPYC8eUuPRwJRE7Wzqzye6e7moyB9s3PHwSSElnPrnbvEAWdyJ6+EcDhx7HkhYQlw67PBCGbGznBweNaabevkVu/Q9kxgMEIickNbpcxE4ky9SkAzJ3ESXpImLl4OrXctu1ZFGP37WLT/N0Ogz37oT8Izbh4RHdLXY4wiiAyIGgvuRhGYzR7BFGYaW7e3WjHRh03NG/LCO0ynbhianz6f2dsT35/nGIEI6cFq1bIE/4SK5Myg/BEQfw4Ja1jR6nz+mK49RdRxpnei/xPTdEMz/OLp5j+w9I0PRC1KfjYKz28x3nfcR2ObmxSqXtpV+m7ZovQIPRZjuv9Ygw8Lp7VhhqyMrhe2U0J/iARiJ2l2XCJmi+gEoO3KEaASEG5+ISbyVrS3tRPa2HxbwT5zP8HhrCMGqqR5XGhGjOdD0lDopzEY/zyLPo1FNYDI9P3Dh3mOEnlHPGPAxlQ4D2qqM1tsVT864fODWgvpoZTBpHKcJ1unp+hGPoxL5ttar57Yzdo/sl0/Hp/30//iIHpQ5vqFP7z9w9Q/E4FOF8rYE9Fl1djfo1V4vENbfiekNjvX4vnYz+/CgAWpWvMDBNx3Rs8f6gFjoyfjkmmreqgCEQwIs7Hhz9b8Dzr202b0o7nkDNL2NlSr7UXvd73tdr2AiJnywvnCy0XW3dW83mupYQ2UljHbI/gJQNBFjNQ35lippu5ODpbgBm2F5c3UrIUJgVy4sViMQlqYpqW555xHVzBzUTNvFXCl9bBTZ1dU11CGIpj4yYmMacEHcwsRV1NSQucAdW5M5AyDVdfaAuMdAMxxGAllXl9pea/41Z3sqOa05KxmFCDSVCMgh0hEcpYlmUglqiziLNW9FD12K6x5pcS5UbAxqdVqVlUZ6q7cchJohN3HW9RanWRJiTk0c7jjqLby4h4cQAtLRkq8XNPl9XZge3v58su/3ky+F/vy9Q15NbPXL19lXdKSIYxQz5oOjdxdPPXQUo9YEeFIpZ7aBBJ3r6VEiLOZJVmISK1oDZo2NogZyqEiKW1XJTlMRRgpv377Ka0LaXl/fydmLeX19XXbtojgosaaz9ZSPphAkQ/NzNuSL5dLRICEhkB9g+qWtk5/Pu+9IHT78WxtTRxFrgngvm+1N13X1bXebndh/3J9Y3Irxx//+FtGluVKZa+Gy8vKSX79598z0/1+fPny5XKxetyjvNLlcuEITnM9jiNCdOIZEd1eTEeISErJ3Go9RIRYUvBCopHmVC3mKqLuXiNFRNXdgzufgJhvErnIVMtRiTwnTokzRU6OB3Y3NNN+NZRqe9W9FDM2i1mgOOmbOeWNkElWEFuLmnBGFLiMOJPagzzR4t29ZS5F8XCR0NbOPg/LPjPrGaTfRqo7frlOOULS+P5g3TmM7gCJExKzS3J3b8yMMfo+syejaSM8hQ2000KSoBV4IuaRREjuar2NYzsam4l1RiOa2H7iNJ4e/YRN41BtHlQRdiZTDov4UCfGlnii3l73bPi4vIXdtDhkIkoRPxlhLeiEz9TUdXITAiWRJUnOvCa3Ut2KaXVTuHFY0yJW1YYV/Gz/J+TdtoM5eHVYu8kmsiZ0e5Sih6BgokIZXTduM69fTIjL+1gMqf356LFYA3E15w/0wXLXBpRgn77vCbI/eGv8SMKOoXm482mJ/9OwnM+Hd+bDH8LIpw8P/3zEnz9s5A9/cvfP74gJm/XJ/Pxo6zSmGHOVOfSXJ8w5N2wYK9vCjIBrH+e0UbaWy97KfsVPYY/ksEiHg9J5PCsiOfrqbg0zKCOAxzkibaQ+I8+w+7RX4tPl0ewQZzrrOcPQ9pGhd8bUYera6qDdjB4i4uoPmBtAs7A3s/HZrfMJUwuD4NQ70I/3P5WW7rBs+dcz3REB0lxy1hWPSWkLrAzMILirKfaMPj9VLZiB9WOIVLQwXsrdMee5E5mfW8zD/h6nUFe0fHJljGeNae3jAqAFHXmzl/ukA4wxHc3r3wi8vfqYKPN+3A3PBkBBCCqJxg7ERoiKA+6oUCLimK0euiyIpGdWBeHDc+89deD84WlnnPPYjJpKHb9hLLDWdzBAJDVDBzng6rXYfi+3vex7PirnRRh54WXl9cJll1JqvYdhj5iYmAhCzAnuXiI+mAxQuFt1kqYJDCLC2HPVDOju4U62A+66egdbQxftcv/sjeh+VQUb6UMcEU/koRRefo85SUKcmC1FUqb25UvLsuScDaBizJRSIkgxNwdxkiUzM1zJjoR0ySnil6rjKC4Ap0W2t3R5M1gtR3XkUP5jkffqVIlZnbPQkjglJoIzVXhVL9UOtUNpM3GXnFKE2mp2bWK9at1ZkkgOLacULUWHrEvLmvNSyl7U0gJhYeZt24pWI4DERShvtGy0vv7y87d7wYeicnr96Quvlwr66edfLq8vEbfpFgWdOahIc16C2F5VnTncESmlzIklg6ip1OBay/0oIqJVYVGVOetdtZS8yO32EbqWHkVSjrigWqssC7y+ffm6H7Wqi3BOOWcIqbsf911V05KJyIqZmRblzMzkRLVqteIa7DFCkLDgcqehB4BGWtU2CgrtishNrWqY95kTMakHZaeSd028+cdEJAU8UdXb/WZV6dW3vH75+a+///br99ttSevlyy96/8N5XS7retvL8VGPPe93oBVtxE77cWzrYnB1MrATG6K7RQi1Vt+7apczNgAopThUPEd8spmrVjMzq2aold29utVatZ75Wkyhf1aJinzQNIpitcOYQMzqliSBMirpYXvRo2hRL6YGC0c0MYGYSOCc0wqkwdLWw2eQszARmZsbk4uwt3odsevGjtRMi22b6iQzZh6hgUOzHcuZiKKip2twG8We0ZBj8DwwOKoUB+ERg1jE2c3JRB5kQdcWCIZBWG5qGlZnkdgsBrXcAG2EcBYFimaBdbfiD4GXdQrOgTVh547tYdIcogyspAi3CbOFBZpj/kX+gQPkhk5ZMzAfWvKTfRLEvQ8b9SeLu0eyGkSYEnFjRQQRJ5GcJKciDGYlBPQ3sFNUAIC6c8tYo1bS0Sdzb0jSB5J0DDKWUBt8YJAGIQ1oeXbhBTqJRqCxggEMul6awrtjRPAjRPt0jBZ2HSn+SePw6cyOkiYe/bPWUA+1bd9/ArJ8xnH1t/CgnGonNKti/2vPdxiv81nEn+jx09vhEfB8uuOzH2AWl92nEcHkAKAOtOoQoIfip36+dItWYADa5v+wb3rHhAGRApj2R7fgjijI9dCYqbUNtfpEJOWBFa0loPz5cYYVR0dOKy6mOkBTGshJ63R2YyNfmqhggyHwNJ+PKdi1lnjXhxU4g/UnoDZwrU/KNBognpH3gwL2NLp9yI0+0WV+7pX+ev5ZPfYeqdkG+LHNz8PTfwrwNPoD+JOomh8d8yv/uJ1nHP85rZs0ntozLTOddBmfhtPCezXm+9yGKQq/v8IPNhTGlFz7tMwePvh8ic4Ouyb8qOWctNkJalviY5+fWJ/IcQ5Bf6nTPf0wqaZe/TNt4amd3i0o7uHJNzKq9Tjqfjtux1IsuwunJcu6cNokrRCpJA528kh2E4awcAtLdXdt9TPN3RVuo2AwmXdupAhRVWtxnzTs/cGISt1yNrxM0eeRxObD9dTwtQ8+vnjTwIXuOniiRuxgB/wnFBj5Yd3KiGb+Z6q1uiqR5JzXJWlxBpLQkkThRGxOxU2dMud8eXn99stBSq0elsi6oRYth0cGfJCCwmPUGcSMe9VStVTTEO0Gra7VU2KHhdE0iZupVnIUcpceHdVqMIcNSyilFPVx3VUkL0lyzpJbtjREUr5sL18urz8v19e8vNK23JUgOW0vSuycr29fUkrqrXAVe2Q7wr1HcSjMDM4p5cDxAgEiGBPuVK3u5QhOHiIqe2VW2YRIgOJG+73wJS3XrSy2rJdipRZbrlJVec35uoXWsa7r9+/f930nR1DIx5AdxzFsS/u+mxYzg7U6U6X02l6t4mOEWjnCP+zDdnCaURKxMQbPbEwQs4hZDz6ECO40ERHK6fX1uH9Yyst2vb9//POP9+uSNskvX3+63z8g+fX1rbwvtX6IyNu3X77/0xQe5RGy8GW7COj333/dAWYqx1FKsVpD30gprcs63B0NOpdCRFUPNWIuImIju9fdg8nT1N2Lqapao5g8GWNNjYgSgQVJ2Ayl7OZs4LyQpCgYICQJlIuZWS2qpUb6u4OFyINiiyNqHEkkqwsgRsQhJtncTJiFuWUJ9S2ruWt6jo33jIto/wjHpyAFklRbUt4DG3dfrd1BjSYkZuFEk1023CWRzBf2wmZlmODgDINa9FRHpY2MAwp3bnwYJs4UNKQgYmcWt5bkM1teQl7MtqqnPWfsw6eE7V9qszK5B7UHEZ2G8/MdI11YuxoQd4ijhW15ZFm0za0l6kgiInOq3vejsMsmpCzLsqScITB4EAgYIZzZ1vKvBKj40THLGnoYtWb7GD1AxAHjevQIuC1Ad9cORk/r5DxG8xOfOvZzez7DmBlIjJ/adPoEch5k6BTx/3iH/73iMY4fwqr5+ifx/cP2NL318Us8wpK55b2g1YNO8vm2mJBRoIJxOn06ec4N+GEH+FCwn22poCkpYYBw+lFFdnijLkYX3YYTo5sZWg26ZkN3Nmq+yr7EOg50VwcBg6h3imppOO35eJpU1NWYZi59vMIAYhbvDuU/u1cbCTIQ9fp5NEY9Tugm2xiVM32wBfOf/KbDdh7dE2M8Xfug840s1QZ2P7eQOr3N/P0PB7iFafbpGL3t7qG5jAXzfFXEKnqr8PLD/pn6s8lop3OzBhk6fotIuz66PrXzdAJM007RFKQxs3+gKD8sy/8DNaYP3LzbNd7c6ZtouWMwDzjgbL0tFKZTQDhKU53+68eGTepQfGmffEEBBdq+dOpiTyPyNH3dACZF4+t3IoUWK0fdixWFcxJJi+SV8kKS0VkXmDmllJmFkVhg1Syyb93dqRURdkdPx2zLcoQGhVYWopqEwcQaOeV0av/nBh35WyREFJHOo5SSo9GANkgUjFsStYoBgZ8J349JWq7oIieSLOlRzTNV04h+kSVlgy1MQmCKCoVhluCobMZp3S4vi31N0Nv7BzOvSypux11dlQCGEHfTbPRetg8tR9V7qfshR9VSUBlatDJIEDa6GhbrFh9uHJXJACeHu3SSBDg5IeccukDoWgEl05JlvVzevl6//rRcv0K2+2GX15daSXkhlrRu6/Wlb6wszJAI8u56kbNpzDuEwVc4M6Xacy+JSA3HUcuhBi6HrutqWo/92PKW0lK4lqJvX7+palFzEllXK3Tosazr/v37siySFnPIkm9HK2p7Wa/MaU4HDLKjdV1rrVoqgJwSMwe/z/f398A6RFGGWIjITJecmVstmIFNKU6iIFqcoke6XaDBKoTl11hE0lVVSfK2bTmv9/fvaloc68uXb38p9fZeoWm77h/l/X6/JN6uL+Xw4KCoVu/3+2Vd397ePt7fG39l948Fp0qWlFg8NZXGzErZQ+eptTa7FJ/EMlG3q0lPJ6iRYSBdahM+uJvysibTe4BDM/NuBGVmEjZmVSpqe9FSiqpX9QgbEQkWJSEwUYZLZPIDAjTOcoOaKRsLi0eIr8VWYARLMSiRIhI7QCTKt7gsEhGz0qpQMauqEyInrb2pwcwEHAbvaLO7Ww+dogYt4e6uRuwDOicCc8opJekxOYg9KlKW0UjVzNBZMdHscGEF7Bh9AknsxA7nE2BNQuEM/eV+9HN4yPEH0U8gZiFp06+zG4twFBcPdOFgg9rpe4dFGRl3d1NTqzGXnCNAk/r4RpGvSJJxIofpSVDDInldl21N6+LSqr5UU3OPFDaFA8JMsDDeNHmH4a+eSf4nuePNGzC4TCah1oS7WyQSDFsPdPa0x/mjAyfAGgM1Gc4eH/35iMuZTyO6u82WfplEY29/01Ke7hOhO0OsPD3i6cunlp89gD61gC6VAxbCfBREow6j0Yd9Hv8HxebxeM5InDHh3JgZoHePxIhH6EFTASrbuJ+37L+GsXMO2T3BvU9PecC6jctjVhXOnuhY2pga3RQMaOK9KQwMQmNLtLAddkhgbW4Q4EZE1YwFiQh9uYSXuEWCdEM2WtRcLyQwezBiJ5FPlcNOyysZPSsT1lfIGIzG7m8I32Gr3qJwMlf0wmaTRd/9YUI/9eP/5nhWA3gKznkYTI9c1ClG1sx0lOr+0YQe+1eb3N4HsD1ifusoH/SgII0d88/a3kTv5JrBGQz6f/b6k54tPeWIY5/noEuymEEexMqPZPD9rRWcZlfdmDE8kpB87kp26ENCsBPIqeUKn99HpCacHOZCFBXuG3KP8psY0+bU36YReRoCnXp4nif0YJR57B+Yedi9jCADc1c3gxq7OXli4kQixIlI4MkpKiktJMQEFtLiEWVBFvw7YVypVd2GEYKpkbwqQO7Ec6rc2CKHF4mcfaoaKCkRicJNzSMoLTaRrlRYqe4ukol5SVwNyazCTRG/j/25ycUk0gsDNwUgusuizqiSObSSKZEzE4lwA4oKYUZiZoKpUzHLBErLcv3iZkdxuKW8aKNhCSKLWPggIiHekuxL+m0vquV2t+9iL4ssvC5My2JUKRGYRzRL1K7yMJIRUfNzcKs5VWs1VyBv2zI45guZk+d1ydt1fflyef1pffkG2Y5K6XI9nG9aXl9/ev36DXlZXl6OUjgKsIlAGL0qg7ov0iu5+qDHFYCP49bqaiVR9VJKdWPmsh/btpGw7mrAsqx+32/3+//1f/33v/3tP7/f7+7+KgJPtu8sKWIPnOn9j+/btv326x/X63VdLwy6rNu+73s9yEQY91rux25amDnlJJwjjXTfi7v+/sfvOecogzAEWK01BduMUKy7sD4y812NgukdrTwfETEjglBmYR64TI8dTIkTM79wvl6vdb/fP/4wyNdf/uXX//gfv/32t9dV1PD99/ci/nZNhAzYtuQ/fvv47eP7v//bv/387ZfjXohIxZlLpdrC4VDcM4DEIjmp6r7f6lEOrS8vL7XWUOciPiQWhVpRq24xHOGVbYqfMAPuaiBbhNdluV7W28c9C6eUcpKU0pKQsnAKdwFqrfUopWipOAy1saNyYhaJ9GtxJLho2KoYTJAgUHWGtWwcIjYza9E1rdYCADRAr8FEaYDkRd2YGmUwC4RJKMoJAORD8TODqgrnkLXMIGZ3JWcEE2urkBMqqaoKWYtMaBg80SP4e9gNCAoyjmyfAUEcgMEThAgS26sTu2u1kSp8bsJjvw1vhoe/rhd5IHNwKyTFHDxoHdc26xk3QpwZb03wsQMmHS5NtJ3WTLVlgKgZUdQswszkGPykwu7CqgF9VJUSESfKK60btkVzLglHLQVF0bgc2AFHcrIzMOpBSrbxDavWBJj4NPi2agxofW7DOQD0XFUym1iVMMEDeqzf3IQaPQQkz1c92RlPcWlw6uI7BJG5UYf+/Y/jJDl9etm51u+fAf0n6fzcD2B3jdw/OLqb+mz8fIfHfviBT+ypJY8fyKxZJKcmMYDa6eCnS9pp5xwOwRrumqBfQRv+MTNny71P4dOq8VIGCJNHAI1j0J23drsDnSsMQARHU7iUyZ0YrZp8zNW4qHEEU+Meb0L1fJE+QwNWUFRMgqKFhnazC1zQi2f1vmcecP8hkr811j2RDRPqAFgGwLz2fjwxDVGQ8HtUL20blKm3trhDDQSPIjtC3UA7RdJQV5SbC8AxR8bzWBjM3Gp0Ivadk77NTyR6Tp0+VO0+YT0d7wsAJAQ1a5YYAIZmZaGueSvc4QSjKBlmUGuqVahto3ebOSheqdVeDVtyw9CnntM4dGvInmbzJxgNe1zTutzN4TZhYn5YOeosDndiCqLfEI9uPV3biSTKORsqw80TYEG+Nq0ZJ7Pmc+64v71S1Sa3IrgQkWnusQF7ZEu1JjWljkkcc8BcqBFSaiWAegg80K6lM1tkOHgcDnCyMAxZhJISCyVi1dnVGIYrRqc/673X1VsmZq+uTM4sHgYAZjMY44AVRnUA5gnLsnhKu7FTyus155TykldJcN13YiaER7qqaqmlU2K3PD9qdRWEIABZAGEmkcwiLKLqDcSyMDNB1LwU1Ua2DYdDyNTu+67wZVm0HOUokhJLciiRp8QpiQXzF7OqajXJKWWmmzviISXnzInKzYgkL0sphYVKqStLpEKQ1nq/LUkIlhcpRSTRx3HYbm/LCiaraqhLSsdxX7LsR3FGpk3WZfX8/ftR9u/VfK9lL/vlupZD3+93SVvarkQgrcmwsQjhUGXX6stecVO6ctK0HFZgTmYict2W8KSs6eI5U0RZg0WYpRm2zffrthJp1Qos7k6UFPny+vXy8iUt6+X125ef/+WuuB2+vr4dJtWxvn5dXq/L9SJrrqbEXkrhnDgnMLkFvAunB6qZuXGiFANkVFXzmvZaalG9He4O8i0vKaXv1QG+3e5/fHx8/eWX9/1Ayul6/duvf1y+/vS3//v/Vi3/7f/x33//+8f92JdtvWzXWuv/+J//8fXty//6xz9TSmlZrKof5eP3P67XTTh//8c/wzOR3cUtp0xCtR5BdUrmteq//PXf1i1HZjB1hqCUUl4WC310Fpla1pxBney4+8GIaFkWtaraNkDmiPwwMJOn2MwscqRZtuubiLxk7B+3X//xn7/9+sdCJbPU4/5u/vXLt3r/+Pj+zzVl3i5//PO3VfLr9afb/X69XLft9R///J9H+RBB0VrfqxuxwK3CDa6mhdz227uZSWQPIZriqpUIIFUzZmFauBexZmoBbImx5rQsiaFWbhtTzpyWFABRHVnSkvN+3BlM5lasHKouxllRyZ0diyzEogaWxCmrIyeB8LGXbduWZXn/449aj3VdDbbX3Z1cPcpKmZpXD5Qlo0wNs9Z61EKGtCxEZPthZlqqMxZhB7eInB6k58Rgrm5GvURHMXclEiZikoiDirp/IEBACUJSjuMoh0ASUlC8q6o5WBJqVa3CmZmcaUmJBQOYeggZpkOrECUiQBITSCRTADURMa8syCwxWwScIvPYAZCAcmj+bnrGoIdpg9gjKodgHtxaDAqqXQRVhbX/ubUaVgwWWboLhSLsYAAOd1c3qDPAvCROBAGzg0ikaHWjnFOSpdZi5my65HV5+7Z9+cav3+4p31B+1/LP8ttd380PuIo5OyEgWYgnmcARCRHFy3k7IVCstk4ERg7AbNrv2ovBahR6NtPEMk5oH+I0aumMQ9zHU0zNes6Y9FgsVQUEjXov6DiakahxiHkTvAFkAoiYteRmdlQ3d2ur6Yyu8mGm1p643/og0JTD3RP3OloWLgIzM+75bA4lCJERwtfhp0Ev7tFrkkRMa6iuQyvoiR+xXwV+axjLGkrp+KFVVxiek4bsiCoRQZrXKyD1ACSiwQtFbn40by/nJZWjlWQO2qIwUaIZdlssTh9Wc4ecpLre8TNASjA9I3mYUxSCaPelhll8jv6KF7dY0Wi6ABOGt4I6JETLSgkYqCNYNAI4AdRRvJnJnWGQESVMzcvQUodnr8hwSVHPAfjh0ZWBoc3ZsL16pH6KAxJBAM3dTK0cGHVwTkTDE0WT8XvSIB+Mu+7WJ/DDMdzZY46iaVboQzXOFTR3xIM/yxtJGeFxls+fZ/23g+OInG3pue5tP40ePo27/zsPxvy+8zHk37z2xm7Ss/YadO4qjYULknumNiFCGez/z9ifNklyJNuh4FFVM/eIyKWqUAB6I/nu8JEy7w1n/v+fGBmZbxR5cy8ve7nNRgMFVFVmRvhiqjof1MzcIzLRpEt3ITLCF3Nb1I5uR6tlgZxIDOaksBgg71620BUa9t708ph27LWueG0GBNRLg4WJYe8DjZK5VcdzN1cQWyz4eII1EUnu5MbNpx2BMW0l1fG7Gq/eyt3M2UbqyjDQlQRz3sjpyRlE7DBo8bJ4mWwZQcyex2E4jBoVpvIglIacWARMIEh2nWfn2In7/Eez0FTBGeq1u7sZKBORUGKROtZxZUpwJkgY/EKKVYM8nIurmfbiaDEQta+JiKTeX4t7zXtrxgoWRGZ8XxRErbk9RraJWrMCc3LLbORuuqquBjdEiujKnMW5LKuuhYZERI5EDGeiAcPpwa0YNOUxj+OyKojAYqGhGSeWIdlFNScq6g4ocQEbsXECRSVV3xrPLMJgXq3AmCk5MUsKdMvkhJGZEwNAMVtWG4Z0fHwcHz6cHj7k4ZgOd54O1U+XTzB2h6ZkzC4hN0FEMmSJYY3hI6pU0kTcfFB1i1UUD3gCSpKSBO2jFp/n+XA4XC6Xdx8+fHl6+vnzlz/84bf/1//1r6e7u5TIfHp4ePj85cs8l3mez88vv/nu+/P5/OnTp+Px+Pz8bIa7d+8+f/nCpj6v7+7uvOjnTz89f/08jiMlSkM+L9NQljwe0bIqhNMw8LquRRdvJqUgCDqdTo03vb8Cma1mPiM8CVF0oooOM3PeZGyzQZBDQDUm3mNzTgAbrFApi+p49/Dh4/fnz3/PNjPT5KqOogSWnEfYTDBVf34+f/ftb5f1p3kpw5gfHx/Vpnn64swCIsqtGaV7ulWVAmEZWd3xWITcTTjzAIIAbAYtGosioOSQZMwkwuRmxTI7wyWse8ROXkq5wKDVnMacmL3oZVltVTpV0cSoSz3e2SmJmYKMuNbREUqupl6IhXfca3WtQdCqiRcLHhlU31ac10y2IU5jo2IiI5DXnTtKekbPxIjEkm2Am0AWwxi+bm+Ofo8Khe7hU+tFA26kAZMz4AiYsAlMr15dEvdixDAATObkKKWHHdPu2N/ftqK/pIFkqHqE3R0GYhIWEtRMKnPryUsgEG1pszXsZC/eq3GwghgO6UqGeA0COJx16GDavbsLJBFSlnGU070fD2tOF7IXm896nnSKdKAoMtSUDPa+m+z2FKKKXBtV1HXwSW1r/9Ja0LKCOsXoFlGz39d221a877UrQIRejeMNUOnwgCC0Gfrrh/3J3JSLThfnurn+b0DLhjr6rwSuVmq/mWAdiUbidwvxiPId1kC81YX71nEDz3YvSRRkGFszCLsslMAhN5f/2nE9k+ufqzZ9I7LAUWOp43nedJebbvEabYU+Px1wsDVWw+peg1flq6b5BuKqcXARp7jRa27HWxMMRhyzyXZDs4Ws74csOrA3/fXKwm7y9H/THk61KHzsphz1R24wqPUQ70VDe3w/J3QT8b7rbP/i1QLo/1LVOvZJwNbNxg2l7yPGdhF77bv+L+1SRrqbh4ho193U7PTutYwFIew6W/gQBUvy6xz5BtPxajkBG7f9m6/fWun9Dh3Mbz0TkXneeiwKIzjgEcxEhLr2tBb/i1ixvsF7jVmNRPWgJPKNJWrf/zeNfz1vUJ/l+8Sm+ivqRAdqoZ2qSddzIuraEHzSvTrObk9qQnMngKrwCiFSvStx0ZuLPyagEKEqwTE3SKFmZdV5Ws+X5TlhFSQeEh0GjNmkksOkcRCQe1Ezuq5+4r3CEaolgGqKLXkYs1RJElW3Vd2fQlEUEXVSOFRXLaupmQmRmq6m1BAxc3B3Xak3VG0zWkoh9g7oyRF0NKESeEsXTizY2oAu79q7mEhOnMuy9JBrIneoqpbiwzBEfHbcoZSiwuZIQ767fyjrZZ2fJA/D4fT05ZdxHLMQCGrFjFki3cBSYjI1pxJ1Xw3qZCAZRhEjNwAskhLMyUjSeHTOJINBqNbggtcKqQJgVVUjA4yzcz7ef8h3j5KPnA883g8jwyiNJ4KIE1KmfDAWYomI8EMvMLxtWhTrBQ1AU3jayAU8l9UdqlZKYUQisqjqOB7O58vnz5/v7u7my3S5LOOY//yn//673/0hpXR5OcOdQYllzENZ1nm6fPrpx//bP/1Hhz68f/j550+mOJ4OkoY//elPXtZDTsHUFOB7SBIqX5Kk8HVdCyxl5mKB/CJTOqCeqo7DwVqQMTNSSsHoME1nAG5EUS6tye1rPLGbZu4R0RKmBEkDmWnhdCCbz4f7d3BzUykv2e+MeL6cZ/VBJB2OZV4hyXV+uTznr5/H40jCL9NzWZaUc9G0rivImSFBY0UCCkIat1JibbtX2SWSCABUahExCYEXxmMmAlsWHjINmUM0MiOnnCKaX8QpPJe6ri6gUtZ5wVJsLWWe12UuZsY5RYh/dEPkEhhccp7nlQCmVFdTTqqrqVpBEnLyXokcNaWkp2yhDcQVpUnvfDNzMAsTCQhubuZubvAhca+F1AXLTiZTv0mIAniNJIwpuhNQWgnmiSIegyiURgtZilaapQaHtr0bdQ8yDzuSm7VqmGh7UGcY6ZLwZjvrv/becMTTayFCry5T3ku2vaDrM7l+fsUkYeZdatVnWfQEiqoVX00V5jkNh5zuj+nhhMNQBC/l5VlfLus06VxsDR9D3UeqAd72+IHrhmxULXwVWRFRZ+Zo59R9auexv7JREtE+wKavOGr82Te9gRYSvId3+37bbrvpAFd2sf1Bv2LrfN3/+zbvRxOoosSveT9vTr4Gh5sJ/81J0t9r3z9t0G/PbzCm6dIReO0eLIW9F/HrR7RWsYH4trDQB6sisVpbOjSqyDvfU9y+YS9GVbPbrK5qNhGR7rJb+0xBN9lgPys2nFnNoG06NQ13Q/yBa2Le9m6nbmigzZDaL4kpu2UqX+PtdP0+bTpS1+E6fL1Siep6bmEYO4ng3XvST97/+WuzYfdvjLrHort5aPurh4+8cfQ53a/b93VNSv6HquN+WbZ2xTfAzur2v3J5f8HXn1EXwJaSsr/Wb18ZsRTCLUaR6+1SC0QA7GahYfZg+3jhKMhJHOYp96s06P0Equ9rNz0G0NaStm3c3gE1zizegVFzWqz3ddskHaqRcortteum0b+hbQH8ily7+vtGl+sLo464oxRfAv1/hYBOQzolyTQmGjON2ecEcpAgthgtVEpNtjfTyB+IUqxAkoFqOCzcSY3dTNWTNOtyI7RRCy52GOq2OZd1jT3brZSyavFaKrKi9r6O9ocXXZYlZwIg5KUt7MAuLdawRoZ0IOIt27j3TATvJiTTxWoicrUrq63zpDlnVZNUw6tKWZLkCXR3SMPpLj2Pz89fDpnzcHAjd88sLsnUTFcCE9ysMCe4leKXeb3k5ZzkPNIh25APQmAGM3MaDuwspBA+HpEG8EAk1b1lZuqJwcyVpYfycDgOh3tKx/HhowxHZ7F0oOGUU4bCKB1P9xnkkvJwACcDEVdqz76FNDNfTEhQ90N29oba5ay6zPPccrW8lHK5TAA+//xzHkfm9PNPn6zol18+k+P//p/+83qe7u7vnz5/efrl59PpNJ1fPn/6+cPju8vLy+l0+vLL5x9++OHjh29/+uHv333zzTxfPrx7+PD48POPP51fnh4e7iWlYmZl1ZVjapWyuBNoOOSUh1xKWZYlJY6qEeu6vpj2sRZp5N8ITaAWHWXUClzM3LOhYnE0rOYA13wmVYBJCM5qax4PRMS2Dmb3H6ZyOVC5HInB2WymlFio6CSjSc5lWX55/vzdd78ZhL++fFlNc87Ej2PRZTUiCRlkDs6J4V6Uma0ZBIgiyN7NkCXDLeQQRVkrFg4eJC1MYI4EeiThnPIQ5eBSIhEiMbiV1cxcpJitaqq+qi3FFJ5ScqZwrjkZU6V+Ujfi5L5U+WYWqSOqK/UuawIlAHpKySmylF3dK89PK7hWoVvoA808RI2jpmgY8MlbsIftRgetdHeIxT5LzUxL8d2OWYqt64pGHoC2d/c0RBFptALVoBuC0d2ZKSRWIwhqCiFfhbxvAOh6mzC78hLUdVQDnDZJjlptrpOWepX1YdXclTjoYipOM6tVluMhZlagpARl1kSeCNyIjcg8GBtAKfl4wOnI93c4piX7i03Py/nL+uVSLsUiByDidhDQyMxA1oJ4t72so5HYROpGs9/zW8VWbNH/UczVr7ruFoFUEXQD4G7Oeb0L3By7E652yRt00f/qn/aRCH0U+nNfoxq50V7eOvZAhXbz/61zrhSP/iHON3/9LnT7zavOvGnAzdv1yey1mEwFVkRU3Dd27V3L33zHPYTrVY8cIFG/hqm9zUStTkVVs+HuJFx5Q3cYff+U17PlpgH9z452rr7fqaPXPfz2JEl+XbghQCZV63dXTTYljCzsEwXYshlu1jCqPleDgrwhWqLNhH4VElO1LgKASv1LrdPqPfWaVmmjgK3BVrv+8hu9cC+PKoHNP8T/FQ9EUksTjpuoauP99hL1psN5c+9StdH25RjsP1STuuv5Qd21a8OOc61aISLupOYwRNpE5TSIgpbkHlkNXokgEZ5ugHeqVHxDe432OpW5BvaF5IpaMf9ABFReo+3mIU3CoNjLozha2q+Ha6i6RrahaXf2NgMZtchLLLZdCkssrRvViLqOXqMeiaBkRHBf1Whe5BnMqyGXA9MwCA4p3R+P79676jydUZZkJq4poP0mNSrtT8ubABEJsTMaYUDfCIUpEcTMS1xCrFq0Vbla1rWUwsxQLaUULWjbpzQduw1K5HVUxaOUktJQH+TB8u7MHHVkI1qUiUpeVRXOnTcmTAhJWJhATlTnZPSeEDO5lXU1h3EW0bUkHqyoriXISWctg6fDcJTxqJQc4DTKMGrRlCDMou6uTr6zN5MWn7E+XyZh5OTCmthxSscxoasugsVpdmfiISWRHJ2pqgYlygQBjGX0NFA6HR4+fPju9w8ff+eSHQxJlg5GbCLGLIc7DlZISah2GA6UtmGXaq0IULIxIGup8QPqtjpSHofhQCRRy3Wezufz2dWPd6ff/e53//W//tfHx8fH+9NPf//522/eMyjIl5IMv/z8U2KeL5e///DX77//PqX0x//+5//yX/7Ln/7+x3VePv39B1X94X/85d393d3d3ZcvX56+fL0/HXRZL5eLwRfTfDw+vCNOg4gYPKUazNMK61afD4B1XQJadUAWWU8pbXFNkSsVCsC+gFHf+K0W601ERJJq7pa4S1oMeTzoDE+Hu4+/vXwdLp9/Ssd8SsN8/gosqlRo4OxJYCJjGl3Y4PePD2pDWaehDOM4fn46r6WUdS2lQA1OLNlJmNhWQykxjYlEzUw1UYaYMxUDzMCca0wdGRm5JUIEpuXEOUcZMYrMDo4sYUmApmFcCzmbs4MVXDl+YUtN1ops4JRExNSj9yrZjzoMEIr8vL5VUUe7VJF+j5ZR1erxFsA9KhY3S54CXvUwrsxgsQT3i7HKAYmKZwZEliL1w91N1cFEEtIAarpoBFjVFrI3iVTTasP+U6VzfJCQ1H1H2/YctJj+Bn/3B3oj++QxM05DVz7j27rKfJPGcYQCE9QRvjvQdKruP3F3mJsVVY2INEdLLrQoGu5DHxe3qO0FZhkP+fGBHh/sblxGfsH0Vc9fy9NLOU92mW1WL1HM3h0Olxqljra/VzPBDaiqfeuA137bh/53SOpRXqwP6D+ssHuDxvb4ss+0PRZ8jRR/7YM0yBuQod9wfxN6BT1/7UE3Dw3xftM/e3gQtAT7E27B4e0jdsC6ftgrw4RGj7Fvefujjpc3s2bFUJUElQA4iTpaqvYt3vB9eq04EfkuZ5t4Q2R1LbdQn/5SqmoUAYEI1bdWK6rP270pNR8cWURE6K7D2wKz/ihvF92GCwWwYwbAvjG/h4IhDXPeDM3NQPRv0vVobYMXN3w9vZrFcQvRCWGKbu8N3N8SeJsH7W3bPzZV+41AlCBAiOyuTQjtL3e+4pOpP9zqwfunu19l5eN6+mLXpPa60bcRit0qL2zsPfWJ8Z/XLdy/3fb99brtU3M/QV+3sImn8EWDHNWmuSUQ9Ann7hQeUu6R5RRUd2+RWPmrx13ZCF8Lhe3Ppqj0DI1asTFCd6zqyrvzo6Rj08LR9L63XnmL2moNeEsu17i1vYIeJxu7Rc0y82UueHIn8wSchjyYHHJKj3en9Z2u87wu0/QiqgemJBsfhZmtlfS/Vghvob5O5NQ4vI2YKdUdF160ojEIrVYi/69ETpybmYsivArcQmn38+EqkMDVrECrP7o6wet+SdxXWUMPFvnaHFWtUkVXbbqWUiKXnsiZQY2ATHU+nR5TSsBEhGWZiy7VHQ9eHaNIPp6O9+9IJ1IcjveXpy9mEHMiFyYjiNCQOCKVgtbssq75QseBDone3R+IE0muNJWAuZsRmAnCnNoaMYY50ZiHeSnqlPJB5eAyHh6++e2/+9/H+/fGmVMGy7JqUedxPB1OlAcwScoxBHCnJDlnLWtNKidyq8TA+/G1HXOlGoo7i6Wch2GwosHT7+7zPH/58uX3v//9l19++fmnT/en05Dypx9//I//9E9//dOfUkoJdnl6+sMffvfXv/71y6effvft9+cvTx/fPT798hluo6SUkhzGv//w1w+PD7/88unrL5/f39893D+8PD+tpdy/e4SWxJJYJGcwuRMnUffpfJ7nObB+FAY+HA6H8T4mlaqGSlPxpZaK+EU6ia2qCqdtHe2WkYGKqRCDk6DWdkp5vFwuKR1UCuVDHsd1Xe18MV9TGtRJy4vBlAczN9dilEVkGA4pSU6X87MbcRpkyCcM81penp7L/KRrEZDUmUrGwdGUhmFIKQXnkhXNkiixWKWyDbbQnIWALJISkoAFNRaP07aCgpWLiMBqpMTmKLauxYt6UWfSoSbkh16E4OXU4ktZYr/u4jqenocWZk3Vot+cdW4I8maou7qpGwCp9J27DTiUbanpPNBqJxZi72z9bd8REW8bRxfRDcobEakahEWE6BAuS9Ud+leg0gLy/iZdtmwC1hpwMGu6YYj6Zt1sQTsx8XS5doY0WbSP747JZubM3Ixf/SGxvlbmtNNSauyAu0ur48twAtnOlN63A3VTQxhjql+LQIWICGScczqd8rtHebi3Y15En2x+Ks8v5TzZtNistjq09lNMF1ASQiOL278FMzf2lcisC11PsUNHsbaCeTk8CWa+oYFf2bOoGSNwjWq8WcH38n/Duv/QJ3CF0/zq+5u9+9VWvrmLr6ZHR6VvKB7NqRiT+y3j4E2zfffbNaJg2c/PNwDrFQ551byrWYSdurWd/8Yd9o942y7++k+/VmPicIKt6kyBf1pgmCOi9Zj22J2oJgj9A2S17zd3BzleocHXR7+VuwczYR++HZC4fVAct0nAVLWuCIGqOH8PFg2AMDc+svg5qpDW128mTArb/yt9MY59SNkeJbPXHCDfDm05pTtVqT4riGm03wpAWLhbKsQbqRU3U1YjHjRi9QB0FbNNMoRmGZGRjj0LVe3oqnMrmtVnp4S0ecmpP5VQiz9vw98Y90OyYFu6EREYNE9gC6+B1YBOh7sAb1evQJ8BxGgMRRR2cuL9FftZGMmD7lcvuB+3TTQARNQcvu21tzGtf7tXLbVhDwmnk3srA1216lhgBlAtlre5XBuN7EZlRbtnYXdh1BNoooScAYUVVxCm1ZPTmPJLOSQWy8eHY5b743F6KGU9u9I0pyTCTqoAzGxRW1dd17WoAkSVz3szu14534PSW21ddVlWZxJQQfUCB0SoNle6WqLVAObwiJxlTq02VpcUHZQEmGNmWM2L4oYSuLHFE9GYU46EZHKmHJeHHuPBhJCzeXAdqaknAqzoOvOYixYAKSWDS07mtJiPp4f7d2V6+kW1pOGUhgW2qiozDcLa4k9G5TE5hhh9Xh2LYnU4mFPOeZBw1JBAjEgOxzsZTyklVytlIVdhyjIypZySwo3yeHwc333z7tvf5/t3K+WlIIHycXAYi+fj6XD3oHUiEAlLDdTdGSARzt5IJ5UkueJ+RxBZJcokDHUsq6qtXgDoWtalABjzMLAI4ZdPP/273//25eViZfndb77/8X/82/Ty/Kf/9i//6T/9pwR9/vzpb15g9ttvP/79r/9GRL/9w+//5V/+Jed8d7w/nU5fnj7/p//8H4Vwn8f740nP559/+uSmH7/79ng6HWCU8zAMzkxGNXwMLCI5S7e8hkqrilLKus7BfycigyQRaSo3iIgpcknV3T1SE5sZJ/avuKerOZwFROxm7iQiaTyAKA0nJ17WGfl4fPzo64R1zkRUjrqMAJb5uawvK6+uPoAPh7uMNM2FB2ZgLXo83adShA+gPD0/mc4humK6JmZhSkyJSQhCsliRRCmJFo8kYHd3j+WgwaovAkkkSXKu0U8iQkkoYmmIQT4tZZr1+bz+8nT5/HSeplU15r1UWti2viK8Sh05jYAToroXvBQhJ6uipCoM1PfBQKixgNtWCKhqYqmELGpeIzAp6p1FILvXXF5ngtQwgRrcL5Q87Jf11oHlQYji6oR2+Zhy7FRW9Cauw9wcChKmxILKPeS+z6yjZngKQc1EYeTSMC84oqyCMBOEEB1RY4zbiwu1ZM0N6XsDhRV8tOypsFy0+gPXm0vEXgtF0iqHXULcTHco272QCbSIChdZtAzKJJGVxcIseUinQ7q/x+m45nTB+lSevyzPZ32efXJfgULRq2BuVqNoZKSB+q6qMbXMiFq796rNTo0ANHRAIOgPt9zO0PHqfQDQbfJDCO29/6UpBhv0vwkMe/Pgbut+C/3DalhB4CfzDs+udvYbfWMPkPafaZ+YUUnI++YLtAj4V62LnX3TanowR5jv+9n9EzV1dw8D+6NvMInXrA4CKntPe4t45digGZtHzrEBtU05ae+54fv2XU1odm+fg6ZzH0BEhuDkAcgFnTuWbHMDYcdbCKOwhLYbGPaG6diWsMc5RJWSsaoZrlubqQa21VVIVwExVV6R4zqzNnr1RgHg/s7uhYi8kz1e22Jp/5koMA3a+AeP1Y3Od3P8aqbIW3okgEh46ouhjXHxmnB5BT23GbNLF75ZRX7zoLca6WGkrPejGw3k5g6v798Vm1+585aw+xptB/3O7k1jE8fQ00FANZGlSXBH1LWhMOQxsYOjeso2U6/C3lo7t9fZlfj+FS/hJiLfcOzEVAhAr/ur4l+FpzYx+nP3d7t5FqqB/zZ1/fpE203JbkVwiv/DGF5gICpeZpcF01nPtBIJD4Mcj4fh3eO9O5Pb88sByDVAp4TVal3XtZRSCrMIeRjgtxExi9qiCPpfVYOv6zqXlZkR0c9y9VJGVSzs0X8/oUUK3GQTOlVTvZqZdA8gqDQTGu2OztVNNUrEdgNaT0gpVZ3XXXVdyzzPl8rLbmCGCK2q6TAUN3UexuPh3pb5Ml0unIZhPC6zm5Vg7gejKAnTkNKQ4Foz4J0ZLGBZSo32BoMlp2EU5xWCfOJ8IEbBwo5EeUg5pWG6rMf7o0/+ohju3//+3//v9x+/n5wS5+eXF6L1XnIaD0KQNCg8j4OqOqqVNugptm4R3vfwVnPN69zjymu+M4OZl1KW6VKWlYGvXz9/9/Hbf/nnf/748cM3v//Nly9f/vL09eO7R7b1688/Pn/+8HAcEvTvf/3zf/gP/yHnfHj37o9//PMf/+Wff//9b5dlUbNfPv348P7d/ePdv/7LP58+fvfu8fFf//rXpy9ff/P9dyKyLIsJSUpB6Rh1o9w9D/l4f1/KMk0TABFhgpmdz2ciEqHj8VjxXxSo9polzFGmgSjyLlpuz5Z+1w0QrmtNlqcWq01yfzysq4qQmj6/PLPI6f275TKU6TKOB/bFl2M+jPz8aXphhhxOh6eXGZjfv3+f8uH56WmdJnhxOYyDpOEelGGYL4IymyqLsGovbBABTsxIg+RBEicSxSrOKRET0VoW8loKCszCknPOQyJHTOaUGUSqDi1Ovp7LvNrLtHx5Oj89n+fVWQ45pzolmZ3Iw2ZLWNcVPKSUQB4BdUQwM0mRzGTEgt3uE1pJhJ0wkUBExIsF5NqHctYZFubtGl5ZpRVtzoSN4G4v7Ws5vGYt6jcsWkLJF+Goi7yDMQYENq3cANxSirHbXxyaosgYOxExXdWloraDYrdP0R7it32fmav8aWXa3L0nOFZg0KRWnXLt3btE2uEtQ7VSebiiCKYa0ZRqkaXMnouUIuEKSyzERJJMSMZDOhwxZBtExc6+VvIfm1abWDwZRaZAsDYE1qvhvpvFLwRuBTJB0dQwrnurgxTKAdq/DjUv9Y67BGH32zo2/TN1i+b1r/uY9T2+wltHP+Hm+z7ir3+KfIz90R+3/9C74Qqg736yV/kbb562fUP7X7dN3JqJlnbJvn3W8S4lev86N8/1/chtU528cRtUnaUpve4utMHxunLcAQi9TYy5X0R9jfTI6usl5t2K4M2F4l2HJPwaLdI/OLbpsb/h9fevux27hXbzfe+HpKV60/aJo0RElAOqRSLUVvsjWi/ORN5p5hpLne31KtLXhJ5vjuX++/RKJw7NUuoWfhs0qepExrJjhw2Y+Opt0aLam1eirzS4u3Z4Uq+oLlIiQlBhtrlV6WbbBKVmO4kHcKOI2nqzKrz7cgq0f/39GwFhbgi2n412czvfdKdMb7sCECogcTWI1Pc0MzhHZZxeM8/dpfET91tT1VhLS0uvPX89sbjvDu4A9GpfqMTVsTys+tjrG+2MCggOo6sJYLZnbo0GBICBu9ZpHIkNXlt1JQKqdaNuIEzsrm0ztkRQKAsXTC/LU1SPoyLkIBoOp9OgZUyJTs/rly80L3HPUsr5cpnm2cyJOJgH6p4NiqI89ZsUplZX1WXVZS1mYGIjCEsxXbREeCwlqR2nmnMehlrlqtLqpVRabWnalROPeJ5uEGrBHlrKsq4bgWDvzFiqzHw8HqdpMrOcZVnWouvAx+PxLrY0lsFLOb+8wDxLupzPQnw+n8cxH/Lg7Ic8EMuiZZpXVzsdTu+//Y0X/eXHr8fDIUPL6u7q8HUtZhjHUYoNLC/lsmo5HA55GJDEwCRJAbXatnVdFeKSXMEZOedhSIRDmELMnDgtq8l49/H+m8fvfp9Pjy6DOgP0+M1HZjYnd085S6IAkczELBFbFOUSCQTiQG9hqkwpgaWWWPbAGTU4ainm7sMwmPnLyws5hiTLNL88Pd2fjsch//TDv318d//ph7+tj/eqKqB5nme3u8Ng63x3GEbmi+rTzz//0z/904+fPr1/uHt6eVleXtKQ05BM0/np69///tePHz+mxD/++MPp4X4Yhg8fvwmFlVOSlAzuUGaQJAIVXV5eFnJkSTlnEVnLMs/zOI7MnAhmNp0v67qmzOM45jSamVlx98ZI6/HikRWwk0AJMCsLB18qwUyDDJSYI+iIWfgwPuDdPL24rce7x5IOy/kFyHd3D748HI53+u4bLTPBPn368fPLTGl9vH93otMlPUvxx/fvzGyezkW5rE4kZRIrk5VVRBIPZqV40VLdzSmn4sWKORNnQa+b4sKQnEUYZgUsKR8lyZBykH45PEK8TAFPS/G1oBiDhTi5F8BzzuRrLI08HtZiy7qqw8xOp4O7DzkT0bLMqHuqZuGiuq6VYIeInBBCfp5nSUMUrQOQs6yrJkkCQpR/Iq8Um6pmlnM2DyWtgntmDkMDt1T+kH5EnpK0PXAzeKWUllXJVShnScTOREo+z5O1xOVSirmHDqNa2BPtYoFiFbQ/m900oAAztXKwwZLq7sU2ttluyA9pI61hqloAZk5EKSVUwvKqfkfWSrgu17WkYQxMybvU55SSu7oLEWVJTK66soOZc4oC0iRC6rYUo3kCI7gKJCViKDwfDoe7k49ZjuMqtEIXW2abi8+KldhKWeEOI3c3UEJGDTSw7r2hygkGoDJ/Y4OMFmfX6MUdLOZqVGEzVbfW2x7B6agG1B1ca9DTd6nVpmrRz1ZL8aAWKnDAYEY7UNH3hU5R3UEURfiZOyMqKm/JlnVkLRzNXqNLvFk/W0hY31NDfHqrW49dA5i5B//E5oOG2vur7aZZVQB2SG9vTd7BoZ3To5vAiLYwpBDU2+tEhJZZl2+m/SWoetJqn9drAFCUxlDrKDGmdPgSrRKMbrG1tDlPdipEaMUxgAbboWcPpl+HEWA7Qlu4U5hfHQjXme937d7DFcnQlpNATYXoJ1frQEO2aKpja0MMX8147RJmp9txYvbwANQBa7pw9ztUriXITRgPbc6Rq6Mmp1bTdB3SXwth2sPKa/i7Q4rt+/55/31vzN564V3Tavfe92x82j+33413PAa78ZBWyS9qbVKrBvIrAXNvvd2bb10Xww4999a2Md3Gdn//YPkBUOuVsMDZAeLIbGN4ZP0yqNGdd+2wGzx3+mJ9yMbkaVctbP9W9e9W0eS9AN2/5t4adPXT23PntsdaZ9r+oUS4uSUR+e3TIxaoSSIzkIGdXN1ZQatOLzUUOUmiuzzcHY8JziK6LsjZ1gJgXdd1XRtzf01Ta+C7dmJEyff3MjN1X1VXVacqnveicLO5ukf24Q6NtWmsVb9R1XBThpqtukYlgS5nKxF4k4DUUkLrhqqb3S7iqFXXvpsRESfJBBXvvDFEHiY1acmIaqpmiZOzq6GAhuNdvr/nz8e5vOSUTvlkVpZVi5K5kiGnJGthcldX1WJqBBIG1Vh/YUk5O9idStVthiRRMEdNdfV1Xd0wUD7kw/3x8f348E6Od8ijpMzDkIaBKQWzm+TEKUXkNBFhSxknJidwLNc9EWFQsMTQBGJ099U0DDqmuszr3fGk6/L89QlW7k/Hl+ev33/z4fL0+eXpayb/+O7h6evXP/7xj/fH05Dl3f1hPn/927/9cTk/sa0J+re//PHry/O7xw+nYTge8qdffvn088/DcPjw7cePHz9eXl5kHIdhWNWODw9/+vNf7h7v3314b6ZumklYxEp5eXqepun333/nuMoW5ZbgQRQu2oqxhjEdDodiAGA1zSxEf1uSVTu+ssgMKZuV4AhLLTAw6JOWVed5FobkdOJTWSZdS3Gm4cg0FJTh8PjudDe9fP78yw/rPH34+Pt1XZdpvqh8883HfLj88MMPSqfhlB4ev727f8+UpmkyKukgDLUylXXx4gRIK2obQ1OrbhKIwp+MPI4M5JyzkLvmlEiSgQtIWlUJAI4CV12NZTT2gkWNY0MVZoEPw5Cy5HEgYTYWifK+MLNWj7MKSE7EnCg26aYoujuYWhgP9dopBjBREkpM8BpiWX28DndfSyGu9WRahQ7ha+Kvm6HBjle0Llt36qSBZMxBu17dvc06wb5DbA2zv9pGe0l7r7lA2G2mVZKGnPEq//eN9GZbvfFV+g7U9m/6hT0xIE6Ie4qQiLh5jbGiynAAkSFakdjdiwFualoK5tmPh6HiYBYWkWFMh6OfDipYUc7r9FWfzuvLbLP66lCCERB03gwyMkQYyFtBwgC8hmTE7hYEswHIOzlHZcsI0EAUJY9b4NarTthtnf7m9/u94GY+9NHB9V7c70O/HmuAV3urvzq6RvH62M+H/e1fD3HfWXpjbtpzA35u8F6/Q7fu9X/353SwF0ugn1N36srn9o+cEr5rf5uH9TM16yZdX7sfu96e+hbXyYfewLozXh+N9JTbQnsjomF389eIaD/KWzv3/dl7rA8BvRIs+/an2BZ7fEuEQPluSkV+HuLV3EOZbecEK7wC0Falo3Zj1C7BzVvc+EpuB+nNX/s3b75GWIi3AWhBjRUV7VwQtWFNjvdj17+Iuki25aFHGHnnDutt2xZqG/TtEb0xtns0714wBi66nChYcWIyxayJqEo40Mnl0LQOd7KoeBsKwNX8uPqwdTjQHFw1ZLVrcN4pnz3SwqJQ11Ve9fVIhd/zZoHVLurB/ts4tuj/6L/4iCig3RREInL4nrq0Dbe1XaMSvsVzw6BbR2SbXjU9wMgYNfMnRHd140pU0tHFJpsBBRGL8Tt59DFnOpGqpyycnEhVL5fLPF8ibZd6vdIKLhk9iDnDjT2y9NTWUtZ1tcaFTC1HQkDcgvzr//ia9WITRkxRVl4VweBR6U02CRtzOv7sbDYppcRCDoYnpmIuQinxhv9qwBKKRmR5Zmit/kRsa0kpCUuXqiDyUqZ5PpzuCLKaDQY+HA93j/nu7uWXp2HIKTG0KK08T4Cb+UA8sIu7FizLkrOUdTQncCJJwkkkiWRjYqdMQx5GkcifNoCcyZCMjPKYxofTu4+P3/xmePxA45GHkceRJYHZycm9lz0D0IOq2ySvHCrCooB5VITKRBR7hUbtUjiAVV2Lt2gQZcI6T/N0fjgevsznZT6Pgs8//Z10PQ2iis8//m25TMvzZ0sgPtyN+enL109lPZ1OyoCuP/7099P9fWa7TNPMND0/z+fz4939/fHw89PTu3fvnn/58nC6m5dy0ct3v/2NA/NaskiSBE4OSml492785v0HKwuDtMaa6VpqQjntPGbmBeRmtq5rqTHnEUceQFpEpLlEpC2v1ktEZjCzxMIRMxhyk4nWIHiVnIUpwZK7GxtzYjL4CtJhzElyUXp6/gUM4jXzIR/v0vHdKT9+y6fzMk+zzsWGdPfwzW+ndf3y6YcyP5uv4JGSpNzYn2DuzoMQM1OqrwBEJc8xjYCNw5BF3F3IWcTMzNnJCZxCNSdZylKsgFJRmhddVjWwCELlHsfhcBwl5WLOjERsO3nFUiWb1IVHcA3bCjNZsEaakXAVAK3OroCEWISALcGqKvzu7l5KSSkBMRgEYVR7oFGTY9TsL9U4H/tVG013qEVmzsrSTRLcQnS4B/zEpRXYV7HoRNXeJCBh8V3oBZrMd69+GDNrodXQkNoaE0ZQw/q9sg2w74EeEVUfeN1ftr2bNsZ0B5iIRQJgVGvKbi1TIvbEwgCJByWaw1cq7malFEzTJEJ5GFJKJIlzSoeDHw6aafH5eX56WZ8u+rL4ZKQgYxB7FACGEyncYAQqrgBaoTej/cv0fus7WYP+ZF4LflXbeQUS5DVDL7atCMS6FfJRSJTTzfbKbV+52cHxDzf3zmhILd2g8eF4H4V+jbvvzVLbl79+tC1v93QyB1rEiPW3aGiq4tp+ScCgBiljfG+fsr9JN4OiwUXbfb5Sfpzhwe7JWhzovq6wjgNonLb7Md3dvM63hjOoexuCZBG12kBFZ8Br/NNwTmC2aDk7U+WA2mADOnFlLffTlA6QeUvka0ttG0jCFY0KUbtztbHeBlrTbvT7EMZXN2dGhmVqIB491wEAgd1iM6Cmr4cMsjbwr7WTqrwTtWSL0FavMxJej/r+8pvvsVMY8JYOgF0s2tZBRLQLn7hZgf8A/e/v0H9lIkCIgn4/KnK/Csvx6xn/ljH7+sud3i9EVzNqu8nrF3d3Z3GAKwtyz0rjVuErJs2ubiUMb2DrqjruOtwIAFm3iOzFk++8e9HA/d36rWqbQ7OxnuRi1+/ON0RMvT2vBxew/qh/dM52E/NgzLFYiNEsjlA8IiJ2dYUuM2TUeUnrZGUlTyy1M6WaIZd5Xsr62jRiZkBxFiKkzKrsxsZkVjTILuAAMTN2cefBzIHdtOlvHY/ogbb9VzOLlOCUhJnJ3F2rdXFnFEyNY7taFdu8yjkH4umHlRJAJAqPCzFc3Yxq4MQa4aEoWrjknN1JVcs0W0qQ0Ryr2qJmOY13d2W+AwrIKeXsmJfVzdh9FD4wD8ICLQXLsszrsmhBA+ZOUDMnkTTwcMh58Jp1Tk4MJhnJcyI6DsfH07tvTo8f6HhXUvaUKGeiZHBTdUKSFPkYVgvAVWQR5GBBQuDu2DmUrTPnRHN4s6YUU3d3VSG+XM4vX7/cf/f9YUg+wYmQZX6eTMu7x4fPv3zKKf3u+4/TNA08zvNMupSpnN4/XJ6mly/L+evn7z5+gNmnn/4+Hk5g+v7bbx4fTueXZ5h++vGn++Pp8+fPj3f34/iOmQtpHg6ckxPN6xKTYUg5D0MXab4r7EBEUQKiqYu5zx+NLI5IEdnNip7cBqCF6lWTRywvrzQDBhaioBLGMAwR+lF0dSeSzDlEgbhhLgbXQzo+fvsbGY/PL1/Il8NBUj48L545v/v2d/PPn15enl7m+Zj5eLj/8P0fQPT85ecyPYOMSZnrq0Ua3JArSxC8hogEYhEQOYYsERMS9hTVNfzc7AFQBUyOooZVfVr0PM3TuppZSmlMklNKKY3DASzrtLQXv6K0d1dYiQh/dyJYZwK1xrcDczAGSURU3Kj5UFkkavJebwfmQc4Rngh2guCV47ILQ1wL/B2sB7GnxIaq7DCju1p7rcJ4lbjKgD0fkbcmxYYeXKXNZeqNveS2XXU/VdtLmD7fAreH5zGq0lQf8rW5t94HqZKiXkl1R/i1uiPCPMK6mGngkMmZzcDk4igg2DpdShI9lgSklIbxKOPg44BEVmxep3N5mX1ydmcPt7j0HEg3isrKu26/2VnqnkjWISmRO8yjXDTtNz7vrNk17KaKnTAj5rfGuY3Ite1/HxbVu67jmY4K+nT1a1s1dvsjNWh7g6Zeb6N7GHPTPKqZHbsbEt3g+5shfqMNVW2Iz3zzlBq+0loLIFZJ23l9j0PwKvfg1aOrVoyetBu2s/a6vUtbZMcbXXfVAxuc23bnfZ8EA1tr6E7n+IfHbSdc48k+avvx3f16iyfpGiS/HkfgBrBv908gCUZJ9HEi6lKRiWoCdVWMOqbZtIWr9kWpWrA3OzqoBST1pvTm9pnX3+xtVYHa6bfKQAg+7MYVVSuiXTBAx7nXkUK7ZvcFtp+ydZlV42vXgt5Gq7tOJwB2lY4fevDm1apelDqQBJCTAtvrd6HT+8dbdgGTeKj9YaUN53SEFfKrJtVdRwmpCv0YNrMt56OWLre95aB6IeosIbTg0ZtOA6CNdx9Aj+/xti/ZXj2oFFihX14NcD9/P7gRvWDmRLV0C0GaUrbls7arqppuXoiIPUx5kXRGgJoHqZa5qwOGQaHK5olVWF0jE45Sspa45g1YB4n3TdICVf5+N5BVm1k8komEJRQ7MJEHC0eLnWVmMJVSpA1431Cjc91dEWgPLjnsZFFYV1UFUF29xbHUHjAnD2d6DQSqScDsLBiziIiutCy2rmspNGTJSeBa62h7Wxtq6o16CoA5m/q6CCWSQeGXsgB0fPdORNenn+fLc6aYg4nIhCwL6zCcxuE8r65Q03Vdl2W5XC7r/cmd3OAMMyN3goiwk4CdhIxaIhYy8d1wus/HB+SDSwIRi0hKInle1eAgJhFOwiLgGu8Y8yy2AXM2eCkazhZ3X0vN6Hb3NByIyKNkm1bkZEUzyzyd2Q2uf//bX7PwYUxfPn12K18+/fjy/HX49/9O5/PXn1/GlHxZ/DjO08uQ6HI5L5fndXpZ5tXWdX551nUp03lIaTydJMvLy9Pnp+e7h/dz0ce7+3fv3x/G8en5eV3X4TDOCp1Mcjoej3d3d8MwkMNVg8u1ig5Gz8XyKHcVEtA3goTD4dDxQWohaqqaeCe1th1aDEY8EBuTE9RBQklSWtciIiREbq7a7ulpEFW4uhUri6k4kJg4Hx8f8jAvlzIvk1licad5WdP9u7vDcZ0vvl5WL3J6ePz4exkPZbq4reTqrlGrchgO45itrDX41d3V3J1hRG5arGhKzAS2QpF8SQAxGAYtZhyeWhKASrF5KdNS1kUBTpEX1aPPmyTyGh7WK6mZmamuqiuDQNX/0OyOO9HnIGF3h4Y2EkHHQOcC3zoZFSM2iBAHA0K0XovB9hQQwXbh1z3ukJkZpYV4EhjGLMzLskR2QdvdKOiCW/3cLdDIGNQdlNhtCl7QwqX6Ftmxqe3yMvutuFWbjt6TqJTcph/dWC6j66533ipmzLiFQ24y1p1chZDFwSAPX0P1FHnTh5k5D8NwPIzHk44ZvCitiy/FVmNV3iCKu3MzCoEstr0W96CtH6hZam0/Xu4eHhSCNd2mdbX36IBmO4P2PbEjuNf48ub714jiNZLbn3Pz53af6731BijffMY1rNp/jiNCQ/FKebhBUDefu8v6zVf+taNP3S7Bbk4gImsqAdX5W8vvNqt/sPSwu4PZzW41pP4gQneZRJAh7f0E1QeOru20K4AdM2qb0P5KEWv3ukKBfSpSbPmRTUTNXtPwqrMbqMqQWv1pT/S4exQ3ZN4zVK9zM3Zq5GuvhTuienyLKWgxM6CeHeEbbVS8JaPaDG6Pm61ldzQOx7em11WXxcP8jbl1M0H3L3CjFey/v715vfJ2vl51Uzte3ZN66k/75m0doGqo1wpXn9av53ST2IZmram2hB2X0dZUCIlQ04tb+4VI1GMOcw9VanfYKpBdvVF1bPZIx6tfX7f8Zgj2//a3AMJ/4ADBwwGqtLMZNIn6xiwwt/3dNnED3wTQq7Frjaw+GYe6Wyy1Zu9hIoMzQd1ruW8Huav5alZKFGBSTQRJGUQRSuE9UN7ZiQFmY2KXRFTvSO7EIFOYFXdxBwmJV67zWFNEqRsNqG/hzMat2mgLWanzIJQfRKCKi7tKFgmOxquYYCKqmU87no0wDFMrHeXNChJagVlZlABLchAZzImIRJKIkYfSDlRlgImdiI45U6hciY2lGETScH+fWZ+W83J+mZbFFUXrls2mmTBmGQaaZ69OgHl+fj5f7k/l7pjSAMCdzA2lDO5JIMNAiQupFzMX+JCPp+F4L+PBkzgLDYlzoiQR1QVmEgZT25aJiSoHXMUZEhu49SIA7sHpFKAhqiavwfdUen6jEZOu83S+CGM+X37++iVZeXy4e3l6eXy4s+n8899/+PDh/XJ+1mUm6PnrL/P5fDrda5mevnyG6ek4LMKX89Nox/vT8fRwUsNyOS9qh8Nhnufvv//tdL6ku7v/8be/rVo+fvwuHUZnyknSIMMwMLOrEQBzSVsAGO1yTqIksLX6X/FGzKy7lbWfV8A2bfZxvQ5BRFSRuxnMCUZmnJJqqTSkzERYl0l1lcwpMYrOizuTpFzUXs4v45hZhNOBQGIuLImzgog8Hw6UZXrxZZ0GYj7ZCKTh0vId4U4GT2kYc0qIpNyIeCoOhRaC63oxXYVIyK2whMWEpYSeqrTqGsEVq7oairmqqwYtaN1cm7Alc7gTOLlqV6SrHAvzP5k7zCgl2e8I+y1JQEVVVcPZ53pFuXMjpszMvAA55JhZpe7ZnttE6H6A9pKw/mnuHfsKAZXya7fYk3tXBFoc8DUawG4XoM3u44Ay5z5n+oebq14fVawFKUjD5W+e2cknri5HNccTkdT4PrgbAcI1cN8BjcVuq6oxuMa8qYJJUuKUPAnYnczIFFZg3qIpkzM7uxFAjiBO6h6Aa7S6M1r1nmn9c2Woaq2Pnt/vsxVXEJHt8dru2E8nuta43uzn/TTo3/TWvsYV/2Ae+qvjzUuwM8z1y/tuftPa3rxGe7ubsfF93dlf+Zd29uzWmDf0k/0L9k7b9941Stk+dtX3H8/hfiXtvtktjTBEUhMF6KuD3gJ1/+D4tZNvXnDr0l9p7c2F+9X69vm/8txEt0b9en33RsXy3O0cHjHf2OLK63V0HZLOjD3Zy83bRjtfT7haLuUKXl/JMgDuff5VFNsFXZxvZlyJ23ZPoX38FuP67vvPFoC/5e5vTobN8Ycg2msP3SZPVQB22lBcUQsZRNjn/q13A2MtMH/3sjUKDd3sROStwgRRxEzz6y6uYqs/t8aVRSGwGna/9UxtTw0/vb7JjULFr39yjynhUR/6qmPh8GqNr4PYPCTAlR/gejHXX2O2eVOHUF2xuzHdNQZBr0+ReMfuNQ+f1J2JSNwN5HCrkUJWVl3P08uZj4NLFpaUCkk3vHEtWBS5GSzGIGvBFdE6MJxYYTAzYokgVycP9MzMlXqeuHAF4lH8S4gbITm0jYVZONAQ6QLa/PrerI+8yxwIzFdsu5aIcs4xOYsuo2X2MWoRRD+hUXnEDu1oZjeHELuaQZsptKKNJFG33LyuZkJiInAeT/f35fL8dHkpc4EnpkS2EEEYQ0pjzueymKLrJ0G4LkKDJElizGByNZfWV64GOAlLHsa78e4+H47gRMySR8msrqYASRpyxA6v6gZPwk7sLeeImSP+y9xSSg5ECdH+4sMweI+ZaFFepZR1XtaL2rJ+/vmXu+MI0/Pz09dPP/3H/+0/uJX1fCYv/+1f/vX/9f/8f5yO+enzl8+fP58e7udpGofhdBxd18T49pv3X55eVN2K5mG0tSyr8pBsLQ/jYz7eXS6zFvvnf/5v6vaf//N/XkyZ8PzyfDgeKZ+0+HmdsqSH4+n4ME7TGYAF3bjWQVHVQjUcdl3XoguA0PE4DTGkIqItpeRGb6QqB8xBThxZT+IQkBOKmRclYQsuJUFfC4BxIsBIEuy4gigItSQbcSkLyCSPAmLmnMbDYXiaplVLWYXGIQ2SoMqciTllmKeUhmEgkmVdg0LlcBhcy7quqqtzcVejxXyBWw1zJoORATnInYxA5mqmbusMYFl0WRYtQY/JzCyNxF/II+FBo3SayLqqu4ukGoFtVfaKSOwtV11XrQzX6M2RhJzIijNoECktsaoSNDN7g+TUCOjcvfOe7eUe7dA/NWNBDfSyEoxbHnSZVHX7iAWqBAAVnElzYIKZvJF572VmCzXxbp2pUvc62XeTz1Jz5za/k1k4aTcg6VvP7N/rJkx3j/bcvXOOxtoUAZmHAKdG2udOMfwhrIiIzevkL+pOnBInUWFKzC6ciBQgV6i5kTXMEGCOogqjqTtDyLWG39cNviZ1oBvj3KsPGbXWbxOo2l+j2mjJAHCYqelqO7s5mIzJa0j+rxg6r/p/Z6zcf7k3Ne6ver0/7vwavn/Q6/NvHtFTrW5ODv/P7rkeqY64ns81I6I+dG+T3qcXX9kT98dNU1+f421l7c7fKyfcb6AR1wAH2s7Xwh52rdobFm+Ho36oMmAXILV7IiigQXyOzUX296Rdb/IWBaA3g7t1jt8MU4zmDmLWFjRPxpsaQmvazZH2zdo+OBOF1LhKFXImcjI2dlYogxXKHvHoZLXwa1uoTPBgQdurfbf9ezOcStgvsVZewB3NBYOt9K17ZeGNqPe93GmPCAt3zNTY9uLXrUPbBNp904aTozIfcchQd8QXoUgDFmRo7dqqAFiXVO5UEWGkxmxv3T+0JM792NP+G29LxUG9NnWFbdw0nq1v4m9FcFZeL4s6dQi4UhZ79P9+HPajU+Fm766W9UtAsJ6FfhkoPLCiUVXMfItUpBgIx1sZ8q9FGxOHsr0Na7WsbA1rantsMNgbD8wdZJWuzDWz7HxLcBTzpfjluXx50OOJH+/zHQ9A/hr1c0KRiIy9NpT9E6JaLYJEhJ3ZYdpYymsr2EEk2twXmSRiUYLYkCnKs3FkKWurmCOpVjatposWm2OqVb8JS7ZVjl2qai3MCgBppm5bC9nWdXEws5a+SwcmoGCuA4WRcg0TIMOKbSVUzMzKQiI8ZAbMXNJwuPswX6Yvn19W1TExD6QFScBMB01jHnIxR+GUJY08jA6aikpRcUqckgyUUvg6WNXIi5spKDGnIY9jHg88jJ4yUk4pgSSK3nJKMgyV8bCUwHYtzb6KL0P1VCYiDw2kFF0LzEmIKc3rGmRZwplgq5ovtpwv6+VZ3LzM68V++fTTw/Hgp+Of//THf/fb73745afff//9v/2Fvnz5wm4ge/f+YSnFrCzL9M0331wul8tlliEDKKa6zKQ2f32iPHy8//brl6e/T3/7+Js/gHIpJec8JvnjX/788dtvL8v88dvv0yBDHogoGP1fXl6m6Xw6HfrqaFjQAdMWkw3AoaoaroBM0mPWvUWQ35pjg/jT2NwkRQ1HcoZTgqkZTN1tAQBOgBdTUyOSPIiL6rKK5NP98OI+P5+HnB+/+VZtYUbR6Xw+F/NDzhjyanT38H5alpSSrSeU2css6XC8u1/nqawrmUsehTMPupqTKWUuy8WKKxkocpLYjNXIjcEmBnVjgDz8+2EetmIryupG86zLbEuBmQPMlEQoZRbuxdQiI5o7a1bw/7irgzkyb6LAovl178WSJHdngjA0iiyKEFFxY2YScqMgdaQaXdCspx11OLl7KequaRxwbd/tHjw0312oXmZACzjmJmH6/lUD/2JwwygQAmOH93Z/OMxpl06JJhD2ErhvpnHsIozqHc2MOQHuRkZWQIIKHtqF9VbebDQK9CgOOFNUSnNXQgaInFmYDcqxkUZIhzEnhO1Z2JGqtrAZPkQkDaNnkpzYSYSEIKBsKPXJrnAheKR3BNTx4K14DYIN3POVwxSjbYa03adGo/gexgTQrTWhvVp2+vEmyN7LZw+wQVe/7reDNyFTzBoib+7uV6ax3SFEoe6oe2LWazTy+uiUd683aGoGyrjBTa5wx5PXb9rM+f0lOTmCl8mDcau9I9X/Ahve4DdeLWK5RNDquW3P6uuof/lrrwnACAL41VtaWIHdPZz5/SYUGrizdbvAjcLmN7famh1d18N+CGHY2QZi/7m/8Q1u/LVEA+ZaZ61NyHrcDET/M5E3HZItwLFV5sTYVSOGLjhQ2dxA7GCt1lQ4kjOFzg4iMFk1+wKmgDLvmEaBYDVozUA8sje+pjwHx3rEdlWd3yNdr7Z1c4XHkEncXdHIMwnpqn/i+QpATZlrNapmW5V9j1Dwh8QLuLvBmrml1fMjd5c8VluU9Xkf78egrekAExNaSb4uEAGQS9iuAGt2evfoWO8DTN6UREcQkZoIEYsDQUVPRMyEyjEVuhKi/BdQX4Zq13mUtCRYZTpyVDHV4vVdteGM6LkaNmPmuznksSCr2urujU7YrURNRA2l1oEIY6uKASht7AdbEhZq8nF7RPAzGBStAk88NaQwqN6zBlp22eTubmSBqAlMkeBmxD7bUseQhMiJfLXL06XQnf0043R6eEwPOSfKzyuvi184eQLDoWowZSKBwSFZiincRWAgrWHKEOICkGOQHInaQPjQCMIOV9XsEomDq6mAOPiYiBTGVkn81LxStjtM4V5oXXPOKadpXdwpBfmJmQg5mQiZuQhJIi8ac28ta5Z0OhxDx4CkdVnNfBiGyRZvVnmRzJwUCqJVS8xkcep2HUiaSjmdjl7KKJwSl7LkYQBnM6xQHt7dvV/hn0SLwHhgdy1qAhrzMKymKrA8rTjP60VpccqQgThRIkqRIadwXxasZCDmYTic8ukxDYdpLbGhJaaU8svlYiyHh0cHmSPYWlPKKSUyJOGqw5gZFWY2OMjWVaHmambIkoY0OsWeQaZucDNf53WZJp/LUTKRX56/nL/+8nmaE+OHTz/cn45DpvPlOSV5fv767t27p6enb7/9ZprOInKZzmnIeUzDYfz0y8/v3n348vwCSU9fnz58862z3N89MPOnT5+mafrN7/8gwuZ+mSdOQpC78Xh5mT58/ObueH++PH95/pKznE6nnMXdF19ZRdA9P+6uBocgiwBWtDhsHMdgAjUz3Uw5WnaJmzsbDKEZigzuy8zMYBSLnIwkzOZlWVdmTq5qTtXbQKsVGLMciViB4e5RxgPUCpT5SOSseaBhnebZiDwdDgdTysSSRDFTGuDHdb7M04XGPB7BIC9a1MHpIHnIqawvRJFqqQQkzjByTa5iOpR1KstlGA45sa/TPK+r+rLOmcs4JmebpqUUXRabp/LyvM7z6mREaUh5zAOZC2Rd1zwcTHVZFmyGTHMnNXVVV5PQ1RM3u4VXy5oZIxJPhOBDYnK2UlJKOWd317IyEzHWmg5cO72UAlpGFmaOnJPKeenOTJnZACJOxFxNDRLxOQzixoYc5cYOaWQiX029kDAZDTJQ8ohmc4DdhBBbtkOFGM0aHeFujiD/paieUB3oAZjMAGZwhAAWLRZ1iEXAHFUMABIJT6OPSQjVr5JEOBEBqgg+9cp950ruwuwsqy5O7iCPrdMgwsSUkzhBbS1FhQjhuzEPL2UiEDG7ra4pkbEQZDEHOTMxJUKGJydWRoETMCIVlcVCzYGTgUjZ3KPiLxjMzFoM8L4+qEVEuJu7onpuIt7MiWBFAxI2rKEd2xBQt7q6h1UepVcgGESkGuu05YYFSguE4HXiNJp/giNokuNoid1MIKrfE7xVwtnx8zRO2+aHUSNicod51KWLx8G9Rn573eiZ2aLUFXeLVs9+FGyuMgKhRtt75NZYVJ1tLa9Aq1ZdQM81rUp1lHMJ4qSAteFbSmnwhuWoKlPsrmFgRUXSIc4EhKVYfXEi0/B9OVGttRwtF6fmWa+GRasG20qrX1SbkbErPCbV+ELe+BpjQNlhxHCOMW6CNazGEPJiVte/VHRnBkJllmdmlqp7JiJ1jq0Q1ENOapRN9CQLN2atQKEbWUsz/zJoy9WkmqBfp3CKEpObUa++SCt71ikXAYpqfR0Attt5NxSHztyUE4tob1TSK2wzPj7r7pugYqyP7/+2wwG3qIxe0/kQ90VT0muUfHB5eb/q6rhRPfdNqgP361ogrpdrv9vuT3FXIgm0xLUvWob+TTBOROTHfH1bYdvU4q2ddSnGm1KP04yVbYgd+dpl0VyQW8qROQTuTmr1ctT8dNvqSlrVCnavvA9jrXdGz1DpamX8N0KG4vItspAqj+RO6tWFSe6u5SoK0LtLi/cj5WgalO/yDRBKRZcU2Kbnrm2R9R/tM6LK9cihRjrH4jcrqm5UPk8/C8bLoCUlHo84HnnIlFyhFCnXIA+KpeoI9b06TURCbAwyEw9nHTFI4V6bRJ2OoJs32AGRukDb1ltnOG/vEgz9zHWhEVGtEVuL7nkppQ5l+CtY1BVqZJ6TRAnVEP3acl1VFS0xECA0Ag9qrnwzK2VRFecQ9FTU3Z0dbEpayISTgJOnMQ/3Mr4M4x3rxDqXSZNw8XhZT5QAX9Qu8/LlhU/H83EchsPIkvJ4IBlJWB3uCgNLFk6UD8yDOlwSDQOS5PGojl++foHzcBpV1ZgTMTrjgwOEqHuwn1fbhKwoJCK/ixoMa0ppKWVZFvconEG2LOeXL7a8nJ+fElzJddWU0svLy7pMl5enMWdzGobDus6llOPxzsnevX9/Pp+XZZnmOQ8HGgZTvCzn+4d353khTr/9+O2f//znn3789O///b8/3d09T+u86LIsp9Mpp5FzEsmP9+/WeRbIaTwMQ8pDSpkl6huYiUgw/kSJpagIsV+z3uygfhUn6WjFIph5HEe6jgUCgYldrRPSWBWr7uDD4QCAao5s56NNqmrqa2XqB6XsXIlwItiNZcgHAuDMqwLqQBjf2VTWdTYqlF3IiZngSCbF3Z04WyLHKIkPQ17nNE8vrpo45WGADVomEBkzbFUrbmxO3TDBAnOiJCAUs5fL9HR+meb5cBwSs1lRlVT5poIeyQdKzDYvhYgiOSTB3bXtNdVcGRKjdzhT+x8TANUaZGVVOnmg1+RaLNKIYcxBahRljHqctIiwcLNj1BndR/NmMpuXuLBHYZoZA+Y1sK2FaQGEFMRY7K5s147/xtgQYMV7VGeXQGgAqMve3p4gCtsHzq3rKhJucK7dQ8bMWgrtsFdop31b98oV161THevW2icAmm9dAEPQrhFDED4GdWRmGlJKyZkUrnCDrl4sPM9u4mAHmytBzYjMwBFRW/eat6gCm//fK9hxjeBhdzDMXbvd6ibXYuvhOmdARFG48zXkiBDl/vTd8NwChbav0X5pB14wM67EGOhLv52D14cRkldbYOS4v2n570N2816vG1Z1gAod3eBXJc92N2nfbHOsxtBezzqvtnZvcz4ocg2ovD3WuUu6exwd2nXQ8kbGzs2L1B7che5QBFS7UkRZV03OS43tcqDSxVIDVIHDbkaq5jmIcFhsrzrTibaszLo37VolIIVf93yVPGbGO5yzf+LN2PUv2wfCLvfjphOqAhC5v7UIHrZujZXpvCfMqv991Qh298onVo+r3Jre3ejgEcCuKDSqiTpO3dCdt8uphv9dAd+umOIarL/upliSr5oUKkpvxqvolN2E7rMqFh+1gKI35xkRtaAY4EYBuI6B2YMVAM0V6/sbUjgTyAkSRu06YQEAZiYkm/Cqt1UQzIpzZRBy56ZstKJUMSheadfatXXCVSUENTqtBmK1/A20R6MRcdZXqILhtiN7t29vVBN/41drY9Fy3qmtEFci3j80nAe7a/duvi3jvFUPCHwcEeLhzWjdzkQ+z7Ksujh7GsTGAUzLutGqhB3KqZL5xyA0tama5YwgTjB2YmJuapF7WA5aqUKhrbA5pVoOyIG9ApBEqJVDShEexlyBO+BRClFqmEdYL/reHzx6RY2IIpc07trjQ8wsmFWqJSCCH1JS1WD96sH667pSqtNvF/VbVFcqMqRKNITDeHd3J2G/n7GkMxNFUDILiFx1LQWwZWR7ecnn0/io95yy5ByFnBgEpiwDJ3ESZ0GSlEdJw/jwIONAOc3LclnL6XjPSdQtFNlq2a6jjGJtlnplw40qHKVZ6AgGr3WR1KyUxZlShi5Fl3mdpun5y8vTFyY7T3OWRETLshyG/PL0PE/Tcjl//OY91IhJ8rCsKmlYllWEh8Ph7vQgkkXy+WXKeSDIMBzY8Pj+3dcvT+NwMOLTw+MPP31ySovaXNYRPuZ0PB4BLqYS5aEy58MwjjkUABaKKJSIdw+eUiESkXVemBkeTryt1iOilO8GSTdk0zuso7dgl+3e5NArqFqmY0r2EEoKsN0RITNLPJHDobRGL1OSLHXLWbUM6Rj3FHBhkCmnMY2jraskEkru7kXNjJycYKRJMlNScypRv4FlIC2Lm1OmxAm62nqBUB4zuJAXohXO7qSqS1nndblcLpfLJeptj+MIU3aknNwbQZZHAKeklKLkHxHJVhKoBj1qxb5VuHWZ0PEYM7fuNDNzsh5Z1DZvqovFWyHecFwHq5tXGEY79cz21J8N1UmEVYp4y0FsO1E1PIRA6JsUR3Uw0H6H6XBNQIROvk9dJtSBb9/3e5pZCJ2+mVorR0itBGEX8sxcepEWd+5OYlUSvgGnzUhNzRCyg4rCMG8B+QAgxCw1AZEl8TjymJGpsC0oK2HVZbXVYEbqZA3iWTjJxQnERtX7jaZssO8S8+JD6CbmLc7KgMg9wZskKO2o5JUdiLcvN3TRhjW68dqKR1szovt3P27p++6tFEOruNyeS23zv7Gy3VJ9oGliDfTVx/buDw/Alb2gtaoni3qQttwoP+gc/KihuUzbN9vzqxuDWz2E3jMx5TpHU59vdQ/CVs+E3soH2J4bFuum7voO21C1st+0KRQP3lDi/vfWHGrovBXX2z23LmQGoDcta28nqPCBQB0uu3sHOO2/pK8wdq+HsH/3hhqvVMRa75nQfDBVAbgKKHKPaLr9wVSp/ClIKHajdaUr9yEPkLMhMOe2Z2z3xC0T/L5Xr7939roNxb70SuPZxq9F+7zqpjqNXmnkdbR2A9bPf3satWtv7oNqi60fQtC30yI47M13ffP9+TUfdG/bdScj5nDFse7hIewnvO5hr37BUhOquvGAHIiw7+hD7eoeNgUvDruRUFtjgvABRn6F/r0qFa9a0lVeqj3Z/93Jr1eC9WrWAQ3QX3fyK2KB5ryrP5G9OcTuAVjKYuviq5IiZ85Jidd186MhQooA41a0Ac3rR5GJy24O5xlmoZMRkznUuzm/MrIT9zzUjv73Y0ctHLkv5rrRqhJppMtF9nkkE7dIHgmMGNfqssYJ/c69ZnDv7boixFNK4oOqlnUjFdVKjcJWy6M2B1e4EZYlDbV4U85Z7h6lrNPTYosM+QDSTJ6JRmXmFYCZaeFVfVnLtJR5LVPRQY3gYJOU0zjkNBLJWszgLCLjgCyHu/sFMq3LYj6M4/3jw6xWyzW07rqBDX0SUtT6MTOz4hZ6ANc6kRDmyzSlMQlRsaUs03R5vpyfnr5+cffLZb74ROTTtOScRZKDUxqmeZ0x3x0Ox+PJzJ7Pl/P5fDodTqfT+/ffTutikMs8gYbi+NtPP3/77bfm/PnpWYv/H//nf/nzX/7y4eN3n798fvzwTc7jNE0//fjz4+Pj6f7BCe/fvw8Ht7tIGnJOkSGdcw74Y7qWUmClibKNljFqGvRo9Zve2C+0m1Vstq2ifkN1iEhYdhNvWaF16t56RCtajBQUDyRKPV8IKed1XYsVYziREss45iyaFm6l2czMi5sZXJFSje4afCTWMprOcylFuSgzcs5CnABiKQMTir4AZV1XnZZlfpmml0t5maalrKUUYh9zylnKYgCyDGAJuiQv3dfqFZe3CApBZJgDgGpB5PrvZt0eGAW/gld6nrotoUo872aUIOrpoqxfXh/dDm51jvY6QNMoHNBACg0Lbim5vZqvmYWbNIK/rNFP757CVXUkItpcvq83kfYUABsW7I2MZ/U79veN6Kkax6hb2qW7G4gJPVC3tyiUycTgYGMkrmllIEjylmu7UwNIclYRDFkGoUyWfeV1cjuv57lcis0KMzKQVT6Guj9zGL8AwHbb2X6TdfQaXnANLgYPG5kFcL+FJftFtEdH2O103qAhXa+gN2+y/3yzbOla+jVDR9+mtTdvz+LfurvPzNiGr57bm9oO7Fp+2+b9m/bmxZzsKZqB/do5/VLeG0D3s24vmkIN2PtD9r/2FdSnbp+oWw97pyd/3bFvOgQi8PXWOFsbXe/5anSuTcb/i4Pb/m32bPab22LnmNsu8dvheD0rXr2U99J+/S32MzddaQ5NmjdQVQNFAOzGTNubVpjl7r9yZsTM+6aYtozGuMGv91L/iWoB2apvwiLxdZO0LnLrX6uhzHyb0lS7ybE3GPfHNaR7W1kNu6Jae6y5XyXbh19/pV87ev/s92hsM4mbiol4unBz2hDvH+h7DbWyGod6SuzdPACgpm6AI2rQvb55tW50md7m+86nU+dTbRjcu5pcK6HAW/5Hm2SRxbvzgcbo1NjElmvh7iLST2lRylTjiEJjgQU3Zfy09SDdKAD05tyqvRoPIFBLKFL4ouulXC7lsmYaM0seSbJiCczrbeXF7i0QoqhtyMQkLGByIzfj4FXpzathdS4M1NyQKwyB7phD7bseyhJH/bVTBRNot+NyI+cGgonOmRlMQZ6n8LmsqdKJGiIDWHVD8+4edcRM9tKzDxOX1c0oJTeIiNpKloKc3oqmlNxckhzv7rBMl6+/GCBDJicXHxMPxjknEUnEnFjNl2LzWi7zepnXofgoniS7pDD1OqmCIAlERjSMh9X0eVoLCQ9jOhwpD24TJ4kRDE8lhVcVGES8eTB6PMxqSsxBIV9KYdvsrMOYSlnOl/N0fkFRXeZ5ej6/PD09n4loOl+Op9Hm8sIXJjKzu9P9PF9ExCml4Vh0eX56MqNivCqdp/Xr83MpAA+r0+evL9Nifzg9/v/+9U9g/vjx4//7//P//c1vfnOeJs7DNK/renZ3TnL3cH93dy8iq63MnFBrUJhFGTmvOVWwCOG1qsuZawERpUwUvgMWziKSh6r49XHvU86vqdw3VGFAS6w3M+zzVneKOlEGWHWNzJXavTU6jsOyG7GRlQQliYAVupqqlkindxGDK3E+3jOzSJBOwldXVbeSCVamsg5WJi8HWS7zcinzpMouAJuzMyUyAq9M8DKzw8yKlmXVedV5XealLKWAKErhUei8zEQyjGPkd4a+YYayrLqWcRxDgyJyDgWgKpBqZtILa7SjVs1rek48gKiqAbTbFFoH1t2HUTN/3L0bULtc3cOa/dgxszsTRbWRirDDEBzvklJtj6q6VxvBDVCot4occe15utXMT11qUZt0AAvCz9OYRkOSEBHXHIckzmSVew1M5EyURDh7KbWFFusUb9rGiIjYmQNbh3Eqttp6shE7NnpbpgRA0kCJPScM7CP54BeZn8r0dfnlRZ/nMqsXdwU05HH0U2x5cV9qxd4AhJm67hFe90hC39NaKH/9CXUrqfZEQzglfXuj6HU0paUyFNf41T0j0+1C231/i1DRdmeAA2wTRRrlZmCti5p2KL9F5/bh7lv+DZqkne2fmJuj/4pJpJ9s6ikJU0jdykTMLA71BtnicmAHjSq8jm82WpE95vGaI8I1APzmiCiGXejO66PN5A3u18bvAT1zq3kPuJv1/tk9iuqAdwjkndC8haDvW7JHg3b1Rtvqc+sh8cRRorRBMuvgczeaPUPVw2S7t+R2xYCwPSWYEfolPbyw5jZs0SXRiWn3xrTpjrQD9HWcOjLmXc+iwao+2OiFclsX+h6i7WdqPHQn6SoEiqVEXdd+pRP34cT1JPC3Ov36VyemMCj0oWq9eXW3m8tf3412R3t9JOK946bf/Ndm6s2vrdN866VXGQ7uTuDX79heYLthvC+oQ2ShqGBZz28TsUU6xr2sgaTWAG1hRbtsXKC5Ndss3Jkqrodssz+1xl/1WPxIHBI/Kiz2+/dlTNWpB22hVEacHPvIny6ldtaOeh+411yrZvdqo0xgEWdb9GUqzyunxOAkkgbFi5mZukUFSiZqi63doZIjkjPMVQ1qpOTuTMYekIMJhMox4t4stRHyGt1lZlr7cDN+NDkeuyPnlHLOxS3KdLJUnb57A/YTyZs5JMKabcdqGrcVENxUNROCCiTMjR0E7NeFqhI5M3QFg1h4VSulpJQAZpKUs+SB0wCemUzXZjADmEgSldUAqNusmMI9T8KS8jAOh5O6FUNZV8lDziMfTjIeAKRxeH65nBcMD4/j8USclrIGp+ebgi8SOnuYdd3bzM0LSinLvM5LhMySMBEdTmMpZZqm5+fndZ5tmdd1zVmmZR6Hw1KKzCLEz09nhk3TPKQhXqiYL0XX1daC4/FOjS6r65fnL19fmEXSsJheVjx++PhvP/70fFnev3//57/+7cO33//w08+//cOJRb5+fTaz77///v7+8f3791GdYNBDzjIMWcjm81nXKWdJKa0ac9vYweQGmBVrgU2kRkmEmDa6mFjFV7t+7xDfBQJ5o52tgqKtUDUApWcV9zm59WqXmTWQbDMHhtoe2f3MzJyKKtiFU2WpiUQ+wCUZMYOck0AMABXTZGUmHtKYTJLSizky52G8W+fJdTYtpItjdlFbbdJ1fT7Pl8taVnNbVKeiU9F5XVa1nPN4yIHUBRSGfxFZ3UzNFMo14K3ClyA8raJjU5Ldm2vgtZWxfWbmSPoP70cwsgRo1ljaVip98zXRJ7CJ+K677nYW9OUZH6xUqBUtQoMCcQJXwtCrfaGL3zYTqhpQxWX7qT9yv21xGB5a9P9+Mni12mxaZd/NmauhvWZQBB1ZGH0ib649OszzqRk0GnLWPiMbY0/VoCRYDThKrWcfBx4zDrIme7Hz1/L1eXme7LzotNqsvjrXuLWgZXHoPso32JaN0Lj8meLRwdAK67CHaiqi9S3XGyL3TplwjUCu+t/7tnvjItj+7KvyBmy8RjjY8nHJbMVudQN15rarXsUXELCjldyv6G6TIrp6nZuW9JNvboLbo2lB/wvH6ztcrb69nkBX5+wvf7PzabdH7B9xU5J498cb9nVsqtfVetnZZ/8Rxrtq6u627s5OzQtrQRy0/xUA7ajn/Rrabe+7syP0c24EVPv3qp+ZOaGRY0YGu9eU0wgMjdC4WINXNn73jt3qI3a7yJbj2xKotukO9JKz2yUBGo0CmlSmHWuX204f4Fczcm/lerPHcT29OJZxBbVUo4w2Vb1dsrX4JrMZlSB6N0viYyhGVKfJ3qTa9pTWOftJ3N2paKMeEaItiq62v59vNbCE3beYMGqpJT1HNnqdgAjj4U2TqBjcWpAv3HiH4Js42siee4/caCPV3n9FNbfF1W0qzPWgSAqVl5rtBGlfNdCdrqqSxf9tP5hN4aRr6dameCs14g52bBlzbtuAuxJR8EMwkUFXX5YyLXk5sksa0ng4m4lZ0PkFvCLa9TYIHnH3KRQAWppC1bpCQBFJkBvINhQRgUi3zJi5NWvbvqe6sKNmsUspaVmpJg7WPAF3P+ThkIebwKFmIHRv4UYAyAjmNWw8KuBS3ddVNbWAIiISDmrzaGFhZnKsujJTTsOiZZ0vUXAAgClY8unugR3L5auuk6raag4XoSy8FCumbLKs5bKW1QFOnAaSDJZI72NmySlJppRSzhgO5/P0dClyeBQRpkQsy7weDoe1lP6O++5atQCIwqcxl1RVtZiuWpayqC3q7oriRZywalnX+TLN52l+eXpe5wsVo5SHPDLzOI7LspwOh2VZyrIIyeUy390dl2UxwOmyLAs4KYmq8uKr2qLJ1L2UlBhymFb7/PVZZPjhl6fD4eAyfveHf3qZJvJVRB4fH0+n++enl5fnMxHlIR0OB0+MJKrFXLUARTylUqNJTYglVepYEazronAoqGaRSsiWsmxaX+2cmhqwVTrvy42ZrSaRAuEVczV3Uwq8p6BYRx7up0r72MwHAIgUpqaVNI6iPdndHVrrukmEv7m7C6SmsMf/uQp6IzIW82pIZ2cDK7KLp5SFwGkgV12XMj+HrFYnnW2el3le1rIutj5d5qfny9Pz/HSe53kWyYfDQYhMNYmkNBDxqrZq8Hh5zHyHSiJJLbK/QWRqwDdWlog0znt1J7NdPk90rAMAIyrQOVdD/y6qG1Z5HCoNSCIOnaGmplhTnLZ7wt2dPLjFm5xv1sptU2OGeRCSMnNEdkVg1e5WbdAd7GgejE3nj9eDVUNj2I7aQ+vWELwCMZagxkXkCDulkhGoGEiLmZoHnyABBnf2XTX1LrU9uJMpnCKb6ANawglFdFVNWQ2blpMaOIkcRj4NGHji5VmXz8vTpbxMfi66GEoUe3ECXITYKYgOvXP8G7l7pYquyMwUzQ4KbEbGyBoAkW4GzRDR3kxOfRMkbwh7QzjYxZTWE2JexYV7i96tzbitWb7+cxN9jaLwCiyGBa2PnXfFw8P5f4WVY77WYH2qtn+K+kK75MU6Veq6iF27votUm1Q4Z+GtRAAqOSG8xi5zf5d2T6mTfGfBw9ZsNFyAWpG4mfOvmrQzVfRe2rqiMWVf0+Bz75ab/ty+dPJu0CTpyEYg0Z6GQ9pA1H6vcVa3igSBvAfh1Fmx8yQ0WeFoQRot/mKHfnYy5xYJ9/4iItlbFioUFwp/kaNCahBAOw+As3sL2nEQU0tR2Fil0GXQ9jzy2uIrzNcmNHmwxe+n2q5Z7a/6q6IWV2gLnjsSvenN/mePodz3Rb9n/34vAekthfX1VPi1w3ej2+7TABwRO+x/6Ta9tRIZIzfbSaVzag9q/3JRD595H4J9QOqNfO3ryj3IDwlQNBlUY2F4i4Z0d9n4/nt8SvRYMzpSH5caqNqedpvp0cUfdn1eQ1Ya+iduRNBemZXbJYSqpsfqDYHC4d0GwjxzdfPeCW0cDXQ7W1pXVOXT3MuySFoXPq/HqZAiST4ej6e7L07qzSAHSZScPfQragGHNZA/vOY1pUI5cA2AyPgBUVQC6hO1as77FVHnDxEF8w804BRhZ2iBGtyJObXYRmYehmEYhrBuUjuYOeccHEHeOMLLK+gcnRNYSHhQ1j7ZmNkptFMLLTgKaVFwzrvldWVmgxdTCB/uHwGU9cIpU9EArMOQhmGYVHW1ZdXzup6WdVrK6ijm81rUJ07DMOTD4RBzW1eTkYacf/zp08qHhzvR4uu6DimZailFrSYdYreozaz1m1lLYp7neV3mZIVc3cDOQCU1NvD5ZXq+nJ+fn+d5VcOivCyzreYpzWshTufp6zgewLIU++b943S+HE+P58uPagrReSmn02laXfJhVrOinA8EUbeLoRABw+Hhw9fnp3XV83qxL0/fffebUuzd/UMpy8tloS/PbvTNN9/kQbzo5TyZWVnnMUkeeJBExrqY2VxKUV2TyDjm45hzSpzzOs9wAxNM4SO26vLiKH05u7upI3LQpRPhWx/l/aohInhj27Dcy0vFbOtkVn2vra4nI7NiRkH/QuTE1JMUPRicyUopqpWynZmDvK+SUAmLsxM5IQ/3prMtszGDE3koEsp5JDeCuK7WSmKbqVN2k3n1l2X5+nT+5en85WV9vswvl/n+KBxay1oaY4+CMJflxp8ZTUrEXC2yDVIzV8t6DalHz8XvH/aCpZoJI1XReWPt6DHKRLv+d3a4mnON+0JLwLvZidqEt8RWdu70vpyp8cTvNyZVhVmWmzS/ZnrkKwUmbsfMMfpdova7xZ8B+/rTmZlaHKk3EFzqZ+v9s/t3H5dLwdIMcoJx512hVkbNYVEH3glwg4pGnmYBExELSxoyHYaSfaH1xc5nfZ5tLr6qrw6teRkASAncImNb1iw5rG8ucG8mSXeQkcMrKblzZbAO3r9WHvVqjLbt++bY7031qmsv9P4WRETNzHZ7VcMze+ARmzKuE1TahW805teOuOvVBuo3m+l2JuqE5NBZsXMdmEVdINpB/Jb3whsqw60aePu+N09sTbpVWvbQ6PVVcdZVGuH1416PF117z/YYdZ/75Hu8JFd2KAC1GNY15MAGi68UvA3DXFVn7xjZXhPG7BtXH3TtJQh0cSvYd4qK+9Z7qWi/kTFzRDY3S3/cPXqKI5iEmFWrU08koXIKUuU/rRqwV+xIziAiAVePs1mlf68q467Ca/wTcoxZWgU3obYqAfiuc+NDLy59vVq2QbqZHy3VY99dvQeuejnuv9YksDZzW1d2IBv7RXAohZyMWPqtSYwAYbEloj3em0kD9T9U9avWVKLIE0d/EXcTSQBHegx70PWbmVXgTv1uMXucwolJ7LEVtxeg0A0IMV6qa92lrLiHy1K7S7a3D4DXSFAPN8e+Okzr3r3G8sp+8KoY+DZMRDVHDAAZu8PMOZiAPWJyaadINKuD7V3kYaYPawO2pxtxTDPpPUxuROxmDC++KC0GnQ1IIw/HNB6Wy8XNBUQZupbF1/v7e3Z2NQJSSpyyg0qJrdaYq1/dgpxHREQU7lbgnCVZhdo8DAMxv7y8xOxy91IKST4cxpTSPM8Rh1GhQ53nnnOey6SljOOBiBSacxbhlKShOyICCVXLLrnDiEkSl1IcNowZpoyqZgSIEc6r6QAnTsylE4aG4d/dgmu/lKWs8yIgt3WxdZ5J5DAMTgALSyZJ6XA8P39xAiWheH4b7mEYhvEo49FIztP89PLyIaXD4TDkAwBby2qmhnwctZSff/rl58/nd9//joAsMuQsIBMppThxsQhdESJnpkSShyGi/HUtZs6cROA6r+cJWOeXp8tl/vDx+2E4fH0+p8MdZXEZni9ff/z8HLFDuvo6ky26TEUYZDjcv5uLUxofvxklp+yUjyfKh8fHR8nJzudJbVrWLIlzPk+zrzZP83A4TktZtayfz9O6fPjw4f6bD8/PZ3KdjN3kT3/52/FwOB5OqpdhGM6X5enHr1n4/nT43e9+o8Wep/OH9/cwWqZLzvllmonov//rvzze3X/33cf87oERicuLup/ux3Ec16KqOqYM+LIswmjbbYifLdgsEO0+1KQ5gYuqMtE4jqqp6Nr5pKXRzgAszCmzqpbSfYNhgBBmLmWZpomIUuKUUpLsZmVZgpgoCSXO3gwW6sqUYmKvJWpVs4hoWWBEEOEsmSCkqm6acnad1YzTgRzmag51ysPhTPz1PD2fzy+LTbM9vUznl3UcD6fTHWDzvAychmEAyMGqTpBpWijJIWUAKaWUEjvMDfAeSeW7KDsmKqUAxsxJUkrJbKNYJQprOoXbLS7ZZBTLuq4NYJGbZUk5Z2Yu0YcWFXBFzc2suCVJ67pmzoNI/BRbc1PYiMxtLUSIdeHuzOLuQpwluZUYX0mJQMwcybhDzmZmVkIbDO6vcEGklCBSSkHzoXGrMx11nSNKx3vSUWP+EQQ1wKq6dhmkqpXWucIARt3rLVFw0hFQvbXUEyqomYLcmQGWMGcqnMyJKRAEA8wZLJQknw7p7jgf87NMUznPNM02GRXnSI8qbX9hL4WIKcyR0enVTu2xnYW7pe2JHOYyt2r+oHCUVZ71pqdtanbdSOO7Fi8EhLsdoF4wy52oeqLd3bTpUQAAdWOSXShB+18wmMak0g1amFpidjdvTqHY2dDTPc0RMZ/VEFixx05PAPX88YqSgwSS3J05cZIO9GMfDlnCMZkRTFn9XQUSAW89T6/WhGtmUd/9y9tnIgBaJ174twsA54o+m4vMun+se7aj2ZGX0obDzDb1oMO5bqLe/2Q7ek1VrZbyhvQCTLt7Z5kDavYCMxNxDIdznxHgXW5DlHJone/ubh44oWbU0M4i0N9lF2YcRr9qeZGdorX36G7v7B7s4g7qernsjMUAg0VY+tpMO4jMuzSJWAfWNZdGFsVatva1djNR3w9on3TiBux4zaNbafdN5wfo709NZaMd9dD+8Ha2X1+4/wxUsPjm5b96ybVaFj3zdiP6HOpN8maq2LGU9Lv1Wdhv3kYOzfiyBRr57sL9rdp9QsSQb6duPYlXr+zuPd6HvUsmXCdfqLfYm3iV6pTYJz231KV+1D+vWrhZfbaW7RoPxC4LoEZ/YosErefVqWsKDx8ZyIm5pZAR9ikQr4eYqim+d3WbTTtfTe//3vOlTC/L88twOfFdOp3G+0clVmIRdyctJjllzrWQSi2wwe5dpVKunm6FMjF7856zec+ar3G7zMQckcf7KcEttJe7bOOa3tkDdQDkoId3jzifcRwDTPSbADCzWuQohEgY74kGSVrDbYkcxKSqVlQ4Y7+pi8TqVi1uEQhrcR9dCwwsNAxDMVvXFTmnPBozppdi7iwoYUf0lHgcx4M6SNNw4DSsxZ7Ol/Nl+uabylN0OBxeXl7meTbzNBzI/Pz88ulpPn34/nA4JMnuvs5LWdUJLkyJmVl4q3dbgye07VK75Aozc6ibudp8vjANOY/nZX1+On+dlq/n6eIJOZH5qssMd6J0TJ9/+XR/OL5/9/5vf/3rw93p7u74/PyVebgUjPfvZ5AVx3g6P714PjoNy2znyYobKC2KabXn85KGTMPpYml+mZfVh5S/nOfz8/PD8TgpqDgf8vO0Pv2Pv18ul++/ff/N6eEvf/nrh3eP37x/+OXnJya9Pxy+fHkaDodPnz5NL+f393fLfLm80DrXWtFQnc6XUsqqZIRV7Xg8WhQ5u14jMeXcfT/r+nLGK0kIp+CnD2jbFABsvV0lHlGQ+TsRuUjmts0FXKbIIoVHXe1KS+Lk1SsV8pOterrLVWUAAAEAAElEQVSDTifcm3AmBjtSvIs5HMmgxgmSrCSltDov6kpZhiOXxVab1ufLVM6XaRxOsex7xLO5u6oLB8hm7YUgq4KdEmfJIkKwAPd9i+2yovtMuNZg3nrD0WwQ0XHEELjViJ3M4jV0czMfMpBZKp8gwSuYDg+MxacOR5g5sSSRPRc2NkOY9p2lgiTmnQDehruvjv1OhGtLyv7keL2e9HyNHTdDWr/Emv3e37a5po6cCRCCEASeRVgSE6AO1v0LspuTuZtT5BSKAUkS5yHlEVmUbcYyY1p8Ml8MxV0jfg2Vsq2WHKibucM3O5Q3KLFjAq2MkHHOFtcK054cuwdtRPQmTHgTgew7BN1qSISggb/GgtSO5p/AfhSwI2C8mav7ne52de/aRjvbcHQ27W2yOxHx5hvtcUtcvhmvvUU7R4P5aqrsP9/cc39D351DzfH7umHe3CC0h/vNgtb/ZL5O7Ok93BbU9bu+cbwGcpXxbAOB5K88APvDqNp03f3Gcn/zLgDgb6wy1DW+KSrcSMN8B8e2X1Hzgvqw1ont7u4JteAJqtoGQujhgW8dNa+4Nc86PVnsClXBEzPbTKuOBrm88wmgCoWq0pYKFq/UA9Tcz27Mjs51h2NXUCzwbKuR9jaOp208rmHinjP+6hK+mTRA2LiveKE22ef7a1GXKEBXabgxJXuXt9nTylwT0PPKN+DSRvn2jXYv660/0Xqqjvy+DMc+8aieq+Rw3niNyDRavJnKrasBV8iAq1Hdt//Vn/bFwG9HwXadH91iqiEuySKitCk5QdlM5q7s8GCydQderaWIMWjje9Ut7mD0Qs5bY6C1A6Kna+noJkMJxcplmc7rpZzuxuPd4fG9HA/2zJlASqoqeRCBGVJiETGvQYdck2tLRwYhT3jHtSJELmCmGvDATESlFG36kjo5SWYZJBXdINpO+juqfYIi4CfCe6L+aE5JrUKWgMXLskRUTFwbqCKzQIQZKXEsciJZ19WK5pyxo5LMIkJcbLVuBg4uKS2lMEgGyQwi96WYSJThBaeBOKU8lLJU7G3OEext9vT05C1W53K5RFNTStPlUtbVVEG13IGaE3A4HIZhEGIzL6WAjISZycxIuP/P3UuJuj/uIW0CyBQN88XL85kcx7u7uejyfLY8fjkvz3N5Lvr1os+TGSFzUs2rWTE7prRQPiu/G44rDz4cZ0qFx8tlmn75erq/O5/PILl7fLjYfPfu/afPzwZ2GadlBYvNRjRi5IVwPB55OK7rPJuti4kQhlO+e9BlvRTH6mUxM3UI5ztF/vqyuD8ty7Jcnt8/PhzT4enL02FddV3fv3///Pz81z//6btvP3777bcPD3cAmEVVbfHx+JDGwZ3meYYpXGNuhPBxuIgkSaUU29mnqcWNxPquMoSIgjY3zJ4R2VNXjhERopykojFZVzETi1FS6h4kIpJgETWN4KBQKUpAQ4vQILQ90doWWiE7RTQRZZjB2MyUzCUxhjAq0bJQGvLpIc0XnA+rvVxmu0yqRikdEiUGMcAsOWfOCWB3UffVNg57AIkgcNfCaRxyZkYpZmZ98ru7edRHl50CAKJgCK7lwJ2DYWIj+Q3zZ89Kl4YVYOZaACGWiIsnIjB5Uzx6fFE39XHzD+ecrZp6qvc74vKXXUjSxv8TrOZEW2ml2GLMXG2Hd3dZ4w52VFIUwKyGE8Sv3ERclbpEkTgQBRaphYRv4usKI4b/w7zVsiUiEU4pNR+msu+rPcU5XmNe3eFu7iJETJRTGod0GG3IxsvqZfWl2KxaQKWhqCr9iXpFgIZuXVvMamr47apDumkvYAuAULGq+RJ6E3rQhLZ1SN2/J6LQIvyVFbxvWzcopQl+2X15BU5j50IndN73ee3w22ddvxnquiaq2QW1qdxgYucvQmPy7574G8hw9QhraYtt/+Vm4mxxVoQmrYHgW90a1lG419gQ21gQa4WBLUJsq0/3GvjuO6pP1ytzLcS9FZ3bOq2yGBJRx1ke5RKa14JaMmTktlJTKnaPrCdufX19xKtF1cXGdbi5yoGODytU7m32K3PAFT7cYcjon315abKWSRugnRs2860SMACwW02SBQi2s8XHyDZ98Wq+1mJscTfQNvD1nhFT2N8BXXzQpgHve6eylqIWN7nt3N0715e51iy3R+y6pt/BX9Xq7Ze8+WVNmtgx7m8PujEAtA/RC60Zt9j9Zp1X+fLGl28YD9wdHv6l3uZt8VsLP72RI9vnLa2qrVUztKp0fQlFulLs0ft+A0rr4Sul/8aHczNc+8e1V9iJvwjKDBoic1DMUovl1mQg9wV83UVvz41I8r4Sr1A4+K3FSFTXRoHOPl10mWDjMNLd3f23356fvqyXaSSBU+snQkQMg6OILCoNsxG7BKk2gxIhYt8cYWhPLBBGFPMBSimr9v70zrwkInHb3TpveoXHEPPe3p9a/d5uz+vG+101om0meLMHo03FUoqpHg4Hcg3WoDiZGGTUNhjd7EymziAalmVxAqCGsZhbUU5ZxkOexmWe3FaoUtC9OtypFFOHSM55TGkgJ3dn0DRN7p5zZknglFI6ymipchaZV0MsWqjluq6CVCP+d3Osy4q1FFJr4Rkyq4rIcHh4OU/TpdhKP79Mk9HzqmejmZK6nWddlhWrMw3zPMnp/ct8+eHr5fTh2wX29DQdj/dm8lRKmf1pUjX9XF6+Pl3e5dPLSsacc57ISfKylmEYjFMxnZznaSaHkqzTLIIP79/98PMTzKdpSp+fU0oPd0cr5c8//P1vP/7Etn7+jPcPp2/fP6j6Dz/+NE2XaZ5fzl+Z/JefflzmeRwywdbl8Ztvvrk/Hdfiz9NcSuE8rMs6L9NxHLQsVE3aqYsjqrWobiOzex/2A52jVh2k+1/cI2bEugCJbwFEcg5Rm2AB7xg9W7hW32ti3xqDUBcpRAQmjkI55OyJINSK/VopxEwQEmFfC5Esy7rMMhYe75GPhfNcfF5ByIdRiCRRyuIp8fF4TGkoyqa0arniieqs9sElWpZYFKWUFuwddi5w41mKlRjGSGZWUjTKsoD9KSU0L0GQZcYOvy3D1vmJqThJhYd1y4vu6kn2RFQDafoCbwpA5/iPt+jRmNiYxGJka9zXjSjob7f/ydeyd4xwc0F2CLLfnpgoixCR75IQWmCGBfrAlTmpahpw4kZmGgoAvPQ7OyJlovIaAUYWQtxhFDuEpIGHMY+HkpPyUtZVfTHWBlqu7PG96UAoEeEfMHePvI84azfc0RZrNqndW7RFQ3S9D3Zr3P/c6u+9UXvI23v1ajFuV23P3X+mhpv7hfvH0bV6ADQ72Pagbg2kzXbp3NUeInpV2ekfHN0D0A2nu0W0fSCqCLt+Q9cgzbuidT1/ADTF9gojUVOGr79x3+HDfZ8A4F1Rzv6IPiL/02PbcTZw3u7/D+9ArzBtuxXfTNr9+TeTrUuJ+uydJ4FaPnSsRdQJ75VO1EIt2Xo7zB9xaXR2BfQAWg5A1eTQvqoPrTVEYGHG8s6r2i3mV/Nm99rcHvZGT1l9KrujVmAi9zCjuhsxOxrXDXC9/G4m2esTUAHrTUdzm0BdEPRVKl5DaK4Wnrs3AwDv5y52hvF2q6trWku2EW2baL95XYd9KfZuo6ophmZyqzDUR1kPGgwVC+zOTHt6qU7SRFYj0ur3HrwIiMIr8L61OwCtcbrojgUCGuMv0Go94lbnueqfhjCuhUIs1CYKm8EA/9NjP6PaQ7fbdgLT3n03l9ftidncVyoXnb+u05eyHPKY7u/f/fY3P//wb8symxM8G4ffmdGZQhrnd9M3mwVdpJqszKyBeBGBRFl6K6Vor+xLpFVOtaI/RMQcfR3cjiQCJg0m+zy0rd175a/Wb1X6G6G4CUGr/82ZmR3UiIOolivoIpJzzgypuAewJAAS8SAp5ombEYw7TYcaDWH7rNLa4EgZIlZrmyKCJHPOhwO52P3jcDieHh8evv/uu28/fn88HiOfeBxHNWPmlDI4yTAUzgODhSyCYpkkJwep6lqKOjhV8sFYO05wQgsf6TqVqepSDOPdou6KF+PJfV3tl6nMoKdpNcl8HMxRzpeLzXCMKc0THcbDvNr56+X3v/vN05fPl9nejTy5LKrP5xV8NOHP52ml0SZPh9M0r9Oil0JjSgvzUjDNa0rJ1nWepsxydzwZp/O8rL88uftxPKzFkXMaBownxeXzeRqYHk+H4X788P137x/vfvrb//jxhx8OowjpPL3cnw4ppceHh8Ty8vXp/fvHeZ7zMJizRSCWLDkNd3cf58uzO0zVqETIf6y6dV0DzHmv4Rr+K4sSE1vA5A3y6MuZiABjWKi13lZXnGrmbqq8+ZGARqleRQGKOSKSXVIbqQ2Meo2EEbhWs7h5vdwdYHIhSm5FjUyKSlZJl2mdzH04yHAHOajxvHqCDaecJY0JeeBhzCAxtcV1XbRElkjaELaqJiG1dZq2/OmaEMwRqSLhsGIOzt+rxCcARE4c8fokIlZd5TVssrkEKCL1FRrkM0SUog53ZFbViPkwjQt2rHfW0isJ1bAX49MdtrxLzt66dKe6+E4x6NImFk3IouqxJKusKVR9lYlJhFQt8vj6nUPoVYuDV5qXPnncr3j/+1VuVXjGE6pOdY1vWjCkABA4u6xUyLmYxpYCIWciTk6kjlKWRZfVVncl8vBuum/OdLhzmIZ2W+UW4RNwimrZqabS9snvNQ4i/rSKH0KTc/erIJywGfaYkk3Z0za07VLXnWExgFNCwwPB49Jqz1TFrz9lt98FI9MePdd/6a39DkCryUBtG2tBNRt9t9c0hWreomjYfra3XnKgh5n14bt5Lu/TwXfZlK2FDQX1eeI1d4w2cH0FqaKS9MZXUXe9ffJufUDUgGOg1mEwi+aFxRNNp26zosWnYJve8IZIHNubeRtW3jnW+hvt5efrwyv37DXrZNWG+NXJbUQDruzovzpKrHO0N4CpojF4q2QBc0uc3KvPxxCVUdyB1K90i3pNDXc27xKCWKIODwXi3y3Xmkjh7gTuDpptFKqB48rw4L6Zya/fmPdxUY39MV6yXqhAEEehw+IuXPZ61c2NKwo038Uz/ZoWsbtPMM9shpadxKc2dPtrq1G5vazt3vrWFrt/Vj8TTd5cNXs/wO3P3pgbzWTrkGvPQ++Tfav2L2tmxB5pTx7i89YJEIfCN5cIWXNs9gbsT74eYneVHTGnwx0a6gDX7NxtxGurdG+DpJv37aFv3hFwG+idw7c+681lycwKn215KfMv89Pd9PIu39/fPdx9883dhw96mX0FIMwCQko58iWq174atMLoFTE5zizmtAT4j0h9FmY2xIT2ALKdx8nM3LcEgL0obBPf3bwULaUMeUDbJHLOOefK09J2dFUNEF+HMIrigVBpHUvz9mzxysHQzsQtpL6UIklF4Ckl1aCVLLFbOzmKqer9OF7Wsk6LOaU0RD+bEwmLZOZEtJpapFillIbj8Xg6PT4+fv/997/97W/fPRwHRmI4e8rDIQ/OPC9FdeGUx+FEh5FScqq7VXFftOhqMox9DtQAlRbz4+7YGaeXZbnMy6SkLLPxxdPTOr8sejbyNB7fPz5dpqd5AUAy8NHW8/R1KSkfvixlyKd5ffl8KU8XTfnw08uiixYnIhzvT8MwFOMxH1bQrLaCzbywFI16eF6Il+LjOGTndV0XA0lW0q/TnNO4FrssywF0LnouJQGHnC6l0DwdjsPff/78lz//+fnzJyvrIPjwcDiM4+l0Ml3HnAOPkvkwDF+/flXHeHrIOS/Lcp7W07qOmaPuhKr6ukYlYyKa5znnzDWm/yowL7YTuhbIdVnZla5OpsHdX0FcxXwxHIGQghWk7cpeaUMJULPKzEA5iIxvZimIPDYwF4RWJ7EBmwV7u6ujGOBeCqSQOA8qbCzqUpyn1abFVDGIjGnMKeWExASglDItZVl9LQogFo7pGm1zd5FkZmUX+h82yABe0hJzAuN1c7u2aCIiavAxjPHFzPp+LiJh0adWC7wW51ZLA7kzNfh/LS3rUcl5I8e07Xr704CqFjRL/+buwyuLcq0iWKHo1QbBzNRciPuruniJpYadhGcQmEk2DBeX3FQfb4KuwVYQCAKKMC03Y642FG++3zBbMByscFEQmIo5RShjykRkoFLKTMuyzqUs5s23s3UOIqAijJWo9vJaFqC9yOswBHIr7h7e4+43c9jr3MKba2+Ovefn5ioiI6Z9pO62i23n3P6JHeYhIgIH69ftfHgLHvTRqSbCV4gzSDmp4l66Kfzd35Q2OPT612b4r8XGvHM51v7Ydc0NPtn3g74VYXHzFrwraYJfOWiHD/d36Ytrjyv2LXm9GHFtRaQa3O3/4On/4OjvDgDBRn4NRPsJbyz2nbEGuNK5qLs0URVUgAjSsFwNvuqvXxUAq4MVvRnQP5aiY/u5819JWPfbTdCkqF8NMOg6Q0VCcTK67evtgvqWpFf3cXeP5NGupaIJr7082t/QdpMV1/fqjWy92ebHTrf2DcTfAsdWv3a7w/bn9u8uwz2OyBZvtoHeA0S8h6rYRIbcKNNtUL3feN9/hP8/Z3/6K8uS5IeBtrhHRGaec8+9b62lq3umSXYTGEEQof9dGgogIMwXfRA0M6IGosSuZnVX1at6y13OkktEuJvZfDB3D8889xU5E124fV5mZISv5j/bfsY+11Ym0f8GVUEsZEV9kbi6SmiLnvCIoBJpuV1wdfkRqBWn000jb8fECkt0+1JNAYv1Sws5T+mLmZaYk+rOAADr8mCK0FEABGTHysX+0Xayae7ysVr+Vtv+5T+LXCiJz6qmgnLO6+P5+OX4buAw3B0evv4yn8+Xjy9sDMQCWUyDkWrJYMay/Mh92a78AbCJEYA542FAZqf+VFVTUCv5qgbE9VB0L0GE7rBU1cK3bWZwpXW7cHR7ZHW4AwCIyLquDhd80Irv3hewWkPMHiAuKTs0MSsKUgghJfHnjMGTj0tqgT9TrFf+N0JJLArJSMPOxnVY0pJF1pRSzhkEKGe5v3/4zW9+85vf/Obrr77YRUJdEHFVQwYeohooJFEZmYZplBgwsDAJGIiIbcij4ZJNTdeSaaA555xRNKWUUrqk/NPxMty9gaRztmOy4yow7oSZ43R+OX56eUHEw7Qz4ox2XtN+fz9nIx5hxMdLVh7CMF6Oz8N08Dm/KK8JZ4tA47wuaIZECoDMSxIgVEOMU17XSDFOo/KcxBARwxSiiqERLYpgaJIXyfthCOOwrOu6Kph9+pTz5fj27u7rL7+0tDCu8/m8nI7PL49ff/nlL775ahjjTz/99On5aV7SuNt//Yth3B92u50Cm0nOORCZ2TzPsi7TNO1wR9Ui2YMwq6sXENjIakkjMGwk2SULrQs7NHcV9qeXy4UOevZfVf5vAEJCVjADyqpc8t3RzJBr7AqWJEgxZBcNZgZUC88EsAAIBoohh+nApvGrb18IH8/HS8rneV1TDjwc9ncxDoEDUQawnPOSdUlZMopog/KFBaszN/gokbWQ6BrQ4npdzh6Bgx47p5pLal0ZDVUVsbKhquEfK/NpE6fFBohiduPBAwQkaji+PDM7syYBUSgHev1Vc/ebCAG4IFJrSP0WBSIiGjKSm04IN4+QX9eW5k15aD6E5v1gKDWMCNDoc57eVzYm/zkRGYQWXOQ4CgsxfnNbotWhRS/DiIhAoIgUgEMcBo5BwJLkZCnnLJrVlHQzfTZiPmeEdkCCoApioEVlravVzEoJLT+bahXYsiEqfUU1b91qa1fbAX3ke6B8C7WhYjWAUo+grI0y/tjf1r0Ca5j+q5d295tZtZRffd7mpimr/nYAcGVea3g7QjMzX/kGrQWTFP/J7du1oBcCj9Yqb+GWMtGkiq8O7BJz6xOKaGqrqF7uvCo+ED8BrhZ2E0qoXpIEEVtdB8QW0dCPCbdf1/5u2lSvMdR53HSwpj7dwHGvA8BXjLdX46MGbnADUBXPJCRqqVR1Hd5I102iVrTTP7btvnYim6cZYJG9299Q41s8TNTMk7CgjQ8i6ba+sc4puIFfa9k/6y5s/KmGikpGiv5/COV+rENv8Dm5AA5h675t8VBluaA1VzMAOCdYWWqvoL9fPQzqV5JqJtDql6Daw2YEcMXmM6bidtWBLv/lE4Su6aLKtW2+NqzQYwBhSZ4Dl3FbBI7VjhjCzex+ZsNXBWB7xasmYyFCxar2UfWiQPXf+bI2QwNQASFTh+KOx8v/wC1k7EnL1kACALjF8yYOqm9waWctN1Om0QSAO0cEovPUKaIRY8UniIgEpW5uN0rlEH09OOSEz6/WA1b3GYA41wIYNycaKBIxcEiSj+nytJ6GOD5M4+7dV9On59PjxQACgnoFXI5qhgpG7AmRikDIMUYnwlUFNSQyQ2AuZbw8o7ksaQ9ZUSjBzaouUotjFthIqe4682oACF78kmpJgc6Jv20lN/9rZXscOIQQ/AUV+TlXrxIRqmXVGIgDWs5qQGiRg3khqlUEx5ZIwGFgEwDQJIiJiNJyQWIiYCr1d6dhGKdpXeKQhmEYwpoYVtf0InIk/uW3v/i7v/u7X3377RRQ8yxLNtDd4ZBE15wQiGIgHg15XdcwHDx9Sc3UsjtUOAbVmhXQjk8ANAiEmiTlZV0yCCzZVgsJwvOiIeo8z4BBacQd8Lg/ny+Pn344LasaBg5LFk3rmhSIskEY9hlReDBJcdxlRBz2CUDRQggvpwtzRg40jGwQAq3rep5PYYiGFEJczuec8zjujsejZgkhRGIEYcAYYkoyhjGOuziOoNlMZpXL8/F+CMflbOfzl2/uHr76NqIe54RpWfL55fGnu/0uEGteL6fj2199G2MMQwzTbn94EMSXl5cwTuNun/JKIjAEBVty8lxwx1hjHN2XKdUkaQWNYXGLtt1kZsUeLeim08J1AYhgmj0dxhr6JGBwwzGCcfOy+sIpS1QRCACZAFRVshpnD/8gIqheZQXSLC5PpZTRaPLOvJYshwkAEMiQjSPyuCbBpycLe4EIxJF5PwUmcwJpMTO1JF6fhRpbjiuMqAIhgIm7qpyuutDHV/iiql7TwHcfYxF3/rlZZU7cxs2a/G+XlrvLKHf3K5iQl2tkBGPEkvHSRHT2zUuAjEjRuq+aoNNqikBEVDRIngQrlvs8P5cwm8DEYNRrCIrAiIrAAIXtoyH1Kqw2UU8GrgZgFwvRIaTtMjO3G6YkIZChgTkhGQRGJiCQckSq8wiVcgIUGu1jQDNjAGKNTCPqYBBSxpQ1qa2qGU1UrWqcbXw2Q2EB/SW6RIsuZtr8UbW1UnEBWMcaYlvoxZUxAlooLzT0fxW3XQ/cz1iy/f851akWM57D0C2kyq/+7MtmZI4LpcUdl9sUX2GBik+K8lii2zpD6NV0bVNs6LDxBmdTl1LSzfHNa6n4AT4HptpQ9z4oLI2D3Fl5YDvjtOCQ1pLP1Ym6GV7VfiduG6dQ/ZZSX70SQoaKRoZ64yGxakm7eQfAliN8q2Hc9BoIrOlO22M9XLBtZ1MsFQBwi51BT6arE+3Gz+rHqv1CUNEKts2s5HgSYVuTbfBcoAUFMgeFLmFdg0LyALrCUFAr4lUs3gJuDbxYtzmQNP8xIAKxVVWDkMRAVcmAmMj/RioPqi2ywk6IAC1EqpheAAF9gADARBHdhovFWqzWOT29tRgCtBjKarFGVXROQwOvjouI5rWv+7A5JCjGTkL3R/tCBLBKjUkUukWDHjmDCECkNUywBfkhABACegI5lkECQgT1wAJAQlLnvwNTNWZQVR8frOeBmqILmnqytsUtlr3vVs+txiGgQGgIGw0FGYiIR3arE6cQqJFkySjZ2X0RgKpKpqpgCkYKRYqVrUCMWHjuoC3fypILUNghvKIsABgoM1ckbk45RmBmGpjN36tWN75v1BKK4MdQ3TACPifOXFVkvCTLRCBmpZpBWUJiZh62RIgAPvo+dkY4EKMZz8tquDzr8/vTeP/lL+7Cbnj4Znd/HnZzWo6gNsXJNBsxhgBGOaec1Qi5pNdoCJEAU5I1ZQAIgWOMUC0cRQCpioKAEZGCV6jCwBQCGciyZiNUw6ymCoRUzC1gZhZjHIbBtQDws5oZANZ1dW+AFQMRBGYQpZEIq8kTUMQYaVWdpgkkrykRguWUZxjHaKKEOgQE5XlegBjUUlqmab9KXkXvdjs1tPU8TdOSV83xshw5DpZmjLwbxyWlEIZMAYwQeYxD5HWKtr87nLP++m/+5l/+q7/967/+6zEEyWvAEcBkTSCgWeMY15QuSx4P4xjCON3F6ZCAEUkNNatPmppMu4kDqVku0ZRGZsErcYhMMarA8+VynPOH5/llVRnulxzCtMMQlyUd5+X4/P58WS5L2h3247g7Pr8I6m7cLZc8X2azNI7jvCwIIGpJZL/fLzYjYozDZV3deUIIkBOazPOqgG+/+HJZFiIJIQwx7ndjzoqBlRAA1jSntBDgMAzB+Pnj5f7+HhFWsxBCUkuWT6bDflpVvn9+PDG/3e9HRFwzrss47ObLZQg40O7hbjcF2h+m3f1dGHbHNT+fLsO4n6YhMBCwEmKIu8jTfnd6eb5cLvP5GOgwhNCys7I61xIjoqQFiZ2Sv55LiBRUBAhMLUlmpRgjoAkYEapJ8xEWCVONR4wIwFj0CzesQRWZhrVIBwKqZjczlRg2DE7zIVQ4TGs6oXnKeghUk9SYMWRcCScY3vAuZdp/ieF33/24AO/u3+zSGqMFFg4EkZPYsqioMUQ1iRwosORVBcnKuXrY7YkI1GvcKWAxwyMiAyOgqqgqkDCSgYhqiNHMUMQloksbIuKBU0qAhAjLsgBAjKyagbjEniACMpVUCDYVN3yAGQFyCGomzvHF7LY5IFjWNRHt44BMCNRC8lJKajnwABy99rWYqmk2MCQkZLTVo+OIAVEB2POOAEUyGnDw8gWCaEREQKpczDUexkiEFLBmJrQIQyUNRFYYkEFNTbUYpRCLBRQLTYqiJjVVYPbyhhQjhUBITqtvCEVSZrOSvmUgqJbNA5acMchdn8PDDvZoB8vTuvKcYDZQBkwZiGtFKkRicietqFIXswCFxp4VkSho5UQqbh8z1QxACJtOWH/oyalKtToSWKHPDuS/VifzR0QnznN9ubpe3A4NZmZEAiY5IzIiIQUkYCgeewKo5m0rcEgxeMSdKRqFykYE4LFUrroDGKDn3WkPvQlafR4PyTOArWIpYvW8FRWiafxqWdQTCxuxv6mpSkFZUFGpARhWoFS1pgLffVS9vQUG1AajpgxAjjSsAgkCwC68p3rJgYilRgQ0SyRS761yN/zm1CKr8KCCJddnSsE7Q7yKFiFDUCNPhdk8Op6bdO0JcVIV3/9oRckqJO3g1JlQjXgVP1eICGaVioBqOSNHVoglsJJUymaCSk9lUNicDX0Ai/oIUFhWnW0ZipwFh+sVvUNT+YqwQgTEAMQI0BnBEUBLgkrBT1Qt1g3Sb+q1mTUVpGwJBUVDbS48asRgZma65Ql0AJpas6nRRTXlzgysTpLLFgNFJUMzLx5f1nqZGIcFdKW9gfcRFdSHTUARPHXQU9cRQZv1vZhL2y83NOkDUhQT20z7xYRwqyGaGQJVEggoSTNGjkHBEDrXWDX6Xpl14VpDb3/YTbR9MZN00fnmQepo5NPaiTEoJmRGU1RGFRTVTCTc1ZAoe0bNzdm+4gGsaIqIYArIhA7d28bAbcQ6Bc/TSspzzZAMN9OId7aGEKBW15N5Ta1mCXCh4JNLfZ2CbsDt9TT04wYCxmYZkc2UUNQECFbLCouCPa/j42V6d/8Njbu4v4u7u3S6SBYTBARRADFPAFasu4SYgT2g0zn3gD2gFhEpiwiYqEpNTXCBi11FW3OtBgCAtJkWyfU3a7yKVyEcZkmlN+MAQCtjVFMKXM0B539MKdUbjBBBshGBCsEACIAEbMaUSj1wQeBGTC4eyj8MRJRNc1pyWoiIGNEg5aQK4zitREv2kkBhN4wYh7C7/7/+4te/+Rf/6q9++atxHM2UmTkAM2qMIDaUhMMwTSEOg89UWtbMABwNJIkKIMVQwLfzsYSAwAaChogK1fuxZrmIPi35ac4vSYc375LAaV0t2fvHxz9//+Ppsrx79w6I37//+PbNAwCleX3+9Kwi7969G6e9V7NiIlUdxuF4PK5rvtvvU5L5fClhV6JpXnLOFgLHKGnN6+KMRgCAEC4v5xh5GCZmxGkQmSTlnLPrrzklDgERs4EYDOM0r/OaUkDbIVxE5Ol5T7SPuKNBsixrlpTNHsYxAubjyyceeJW8JrGsq12eVTmGIU6qel7OBBCICWwYhsAkIiI5YDDCQqTSCW0owd+l0lJX3yoY5gLxTZzGU/2Qw6pAA6CZlhAH1M3XR6XQhwkhArvX20/0Yj4vUJh60QExxho2dHU1kgAzEyQEEhQzSzLDdD/cf/nw9S/33/3hvJwnHqaB0LIZqUEyyKKmTGZkZMWeYIhIoERU+KWqZ8mdEu34sBoIhFiKdXrjzev/OS1PSe0FL6ZmNWC12Z5bcFTr7PYvGYKBAIECBiIgKPvXUY57q92GIwqwUXpepWfUj9w0UMgKEYE4IuYWu1/uLwdSYW1yhOrivZ5lHl0pLRJpGmNrNrXwrTqd8Coau0nsdjgiKlEwEyIgLoxJjIBkSBD95FIDomxaR5vc1sNQxCyBwRh5DLQjGSTjctLTWY5LuoiKGxn7t5fGkCfvQo9ewPsp2kVEu/01m5mrw2pSA6n9sVY8kJtpH0ENEbPkeg8YFKa1duiUNyLcnE2F89C2xMRubZRd2p/47XRvcciuX5XbGvV+XWktpLmydX8mZNevahF3E96WsEFwZcLvFtv2iSfs1hbSVmvoP3uhtfpCUIUAIjKgXC/vukr7i9pU9kPULqwXdCsBXq2N/jJUFQIiIzdHlH7qdbxH/yhVQyyxEdDt6/r827e03MS+wVh1xO1Dz4oCdsIbu0WALJoRsSkNFS2Qx7C0neg6UXvsa3dM6Ee5jqafYVsUezdYvn8quPcB0g221nEsKA8AvMR3oSIq8Gubs3IUuLzr2l0goaFZ5RIyxT6W3PwVSsWUTlsLu6nVpnpBMRZex4dsUL6Pqbj6jjbGT6vFERBRSoBNbveW6VFDAN34dMsYlgokJW5ZALAaCrpNVRQ6bDxNZXEUBwcgOEn31Vbo7yTApkF5BSoOnoSH22iYVwg2AwETRAUELJVSjIjAxNegr04/MwtSL+2vgqZlCeO2e6vG7qeldGtpazAW7ABQJr376nqfV1nsR5Q7T5iIpI1tu70TrXa9weoSKGokVsowA0ASwFTop5Gy2iVdjst53i9ThN2bw93DXX55Nr0YAhOJiBtEFAyBwAN9EGMMgGjSnKRXypgvcyn+bQMAEYkxBmKv9mwiJQMSwMySCCJGd7YWF+EWcdhjFKu6rqqyU5QSqbpHxRqY8xtSSodxx4wAnGsUuBmZGRO5GUNViTexW7IRTFGFmB2Cs7LqNrYAkFJSIN4N0/5AHElJYcbAA4Zxt/v7v//7v/rbv727f/BmDMyRyRhAWZMQETAZ2RAGjOMlZ6RluWQJO4pA0w7jEEOkGJBZxZTVzNyuoGoigiKmogiCvEg6LfnltLykrDy9nC807E7Laohg9PbtF0DPFOIyJxUAoHleQfTN3QMTIOLz06eXl5dhGIYQRRINEVT306Q5pXXVlMMwoElKKzMjgK4rB87zBUVIJeccY7R1BRXNel5LhdRpmiIzQ5Skwziq2eV4pMC73Y5CnKYhMGlaNc9rWtM6D2oSI9swTZHQ7t/Q/WEYd9OHDx9ejnQ4HFJKSmw84DCFiHPOYRhDCEjIxaAs4sWYmbYAdCN3WbndEhHVSD2izczMBApjNNd1DEAlWFqUELJZ27bU+YGhugKwhZgYuSUT2sItoW5gZu7V9HsVQetjm/gCj8Wvl1UjmJs2yQ8WNR2GHd3dpbfffPur39+9ef7hj8asQAIihc7QfPeR94lQoQg3JlcmCbHkJ1O9sKLsyoDpIKBsiuKDg61npW3l3LNa/W8rVV4t41729TN2IqtFRQCoP+YAAGtWgIhgrchbDpeaO4gmBq0WmDVzczON9ui8b3kvo8ophFaJgqHJkMylDd2MoJkSgNWz+3MozZ+TzYw91oDqILOrAdB+5Cuphf7W+CpDrFwcZhyYxjAedrgb10AXSUeZT8s8WxJLcB1e0U5GeHW1r7R7V6ExLEu69B8AetbBggW786Xec73Sr0fDrkHqbTMq0AQA/ozhcnuClbnu0FolNm8Su7ahj0HfSkT9HCCGn2lenwV8PZC+H13Puf0hXv3KrEHPLvofKhKwer3ucv/AMp4d17x1acTtD5dyULGKlq25jU8dF2zNKa/ROuv1sU0ItJZ4jMJN7/ouY7WyN16Drnku8a4HsY5DT47i5gPfGaZkBoYKXbwZohN6Yt0uRRpDx7yJ6CbWuioUNlW2S20JVbnZumEdYKrda432KKBmmu8ScD/XK9gWt/8trwLFio6yrUvrJ6y/mQCslBb208Gs81NsT3utsF63rv9qUzagrsrPzi507em30OeeX3r9+YfUI6QtfaLPy2VtJorPya/+yb1kaYu132AurgGAjYSUBJUBJBsqWkYwIEMTBUFT3SRgm0ExQ/eK1t4WkQdQQthfMwt9tl/QphsAN7ZSqBNdUz+K02lTZ6/F1lU6zusxaUL56sMrww/WmTKVBRAMGAzUSMySLpd0epqfCYfxftq9u5ufdotkR9hJhHLzL3XHa4m+NUMtsU2oCiZZkkrOHkPgMe1gZiYKsdr5qsmf3LulqpVo3BBMPeuXtAGvPq2wBulecfnVCNQiSprdERXRGBCImNkL/fqrmTjXsqYtmqguUTK3rtXDKYRghoNXRxctmTkpp4CH+7v7h7cfP36UrEgBEKdpevfu3d3dHRGllAAMOahKTskkg4AimoioYOA1zaezUAYLe8kJKI+IcRwwDoYgnn9taIYigggmYpqzmqasFBTgkvXpPH+8zJeMu8Pu5fFFL+kyrxzDvKYwTNNecs739/eS8+Vyeffm4Xw85bT4+l5OZ1IZmXJaJOWXdWFgBFjmmQgGpoAgWU0lcDCCnBZdMa1riHEXaDUcAl0us6VVhQAARExt1UsmEtOBd1Z5XUIIqgoKMY4552GaJNmyrJo1ECWD5/MlzXY/0tv7/bgfxeR4ujzQeNhNl8sFiDXIGOMuklJEZkaKMZaKRQZWHUfbyicCQgVs4Z4ZsmuGrZp9URdFicGNvECmmhEQqdZSrSdlu9oaQ0SuIlgFmLidUtoxqHiR7Svss2n74EVsmgIAVRfd7nXjCVocJwk0rPt3X3715t27H0NkAlVxWrECVV0TcZq7UiHXS6giOfNQjWnuRY1fzCwi1mQXInuibbln40u4QQY3l9YCmqXd/uOOxKyJbp8Cr9mspn0CsVr2wlWIJZoCiz3eHL66U5nL/KLL5xth6E3YjvBaTMCbCQhUMVJzB/mKbd6ANlmq5pVIbjpunZ27dc2d/EzMHlVEFMgzpLDkY2CRYGDFC6pmRgBUjn4kI6YQI09BBlxRTracZJ4lZRMjIEDRwhrXD2lrSf9HPd3qPXVIoODA1osr2p9urOoD63nnn2GF6Z/lC+oPawAAk2ukvqGpXoxDh8der7HPnrM3182vtsd+Dvf38BesYNabXtcfYj8ghFgiYV61qP95v+lV+x109fbXjbdbTOgDsv39Fyb95z5pi6H1x65XSD9cf3mo23rAa2W7TuVf+pUTsl/hnJpr4SNWO4t9Yz73zM0x0kDo7d/dFVSb66rpjlfjAgCdoVfb8jazqpYXfQVa4netIwgAXsqniHJw2KiEaF4ICamBwGJdKLFiTlHtgn+jqfaSUVSkODBSpejqO+b25Y01qHbEuk51/o1uXNrxUr91zGVmBgjmjDqeOQDFSVMf0xrA/os2xI07CarqBWUb+9O6tWVFgWniB2stB9f1bhZWfYFVJ0hzqNSmoQN3qDQg5JZrVDXLCAqmAGqa/UgEExVt7kVGNjMtoXkIZjUQiwEQFRUJSnKJItSp63h7sAyLb3IqEQKvVm239ja93JcBFcxRbGlQtGqniwVE7gakbRPr/VEEBNCGhQBK7S4GANCclcAUAqAog1qc0/m4xKfLOA1vpinu375Z3r6RZU2ns6qpFZqKAhXwdkf18lEkpSxJRNUL2W/JglhOaOg+ISJyEh7fC2KaczZF1U0wiWqrqqiqhqReNrlqI645tEKwAMUH5yEZzXRJRMCFfkVVMYScs0hS1YAECJHYENWEsRQ0dTDk5YfNMKukrOu6xnEigizr6bTu7nb3D28/fHq0QDEMkcOXX3+1O+xr7ofTOFhO67JcTNQBhphmUUpZKaZE04S7/V5otLijEHwkDcmQwhCZInkkuecpIRLRapANzqs+X/JztpdsL6sscwq7w8ePj8y8OzycLu/Xed3v7oZh+PGHH2KM62XG3eH48kQGYxzO6wVFD8MwMZ/meSC8XM4P776a57MsM8VgIlkF1NhUUlrWi5mIZZkTDDEggWenpLwfBlVVhBhYsmoWIItDXHNa13UYhru7uzFO5/NxXdfDYTefz8Gdb8Q8jGA25zyv84rEvMvPx4+ffny3D7/6+uFwOETEh6+/yGKXlABzDBh3I2A0MDRNaxKRIfA4jowkInlNpShYnXoFKElkHKwYQdz6jgAIqFmFACL7eVMXnhnFjTdGdfOzV+UBiIi7pDrDJmzrFjUCh+O18l8vB8igUJ0iGGPb1e4PKCwlxC7xEVBFDDjE8c0XX/7q17/59Kd/Ho6PkC+IYEgKhF6FGJDUIZ4SExJ5Ar8qWFcbwZvctGiopDeIGEIoUfIOoCsZBmILfK5jq1rNGp2B4HOmJbNWUkDsWvPX2jpmZoqOia+lJUIJJ26z0Dy0sAFgLWPcMHFhqXZsq1rSEmpV0uq5RP/KACpCC52ZxmCb4ivg1aRf62B3JAkRBUT0BAgCInRp4FkQPp4cUARyzlmkFoYEMyAVZjNEC6CBcsSZ5aRphpRQxUQ9u69Dq707oDdW9kjAmnvdmk3QfGSQ3G7tsKV5V/pzzZ8FAKDi34Jvl4YTqFjfO968K2RlAFId6lswjCCA+0xarESr0lXPx8JW1PvAgTpDfvsUm2rqGKB2pPQbisGxKcAleAwAEBW0zjWA1/+4OvLKwqdy/pQBhPqWbU/1QQ1FySrhwD9rKOzma9sy2Bp9+/kGfnygnG5SzHMqsO0+D28okfZd9QBr9rVuZbeda7CxNfatKrEnVisWlw/bn1R78/lu9r1o5oDyEaEH/lmdTbMavu7fludj97+aLlF4sMqiA4BCpGM3HggI151pr2l85Dd6j5lpczv2X5U/uvj19rQiEB0jVq3FDZYl5qGCNgBg5PYc2FYtI2CNBiqRmIA1vUGlucXqNKtzFl21DcC9lt0yfaUB3+hq12UNbm++nj8oi0O7zXZ7Q792+yV7fVtFwzX8ro0nAuirVYQ1urTfM+U8RsziyW4MRVa4mcjQFEzNhSYqoJKamUnemFubpl4IEyzbNb0pmiDFlrTrGdk3He8HB9D9Ce1jBx7mJj+XqzWaiwC2aKe26/xfVW2ez9vh6ATOzWTZNu83PgQzEzMESACw2OW0xud1dxfH+zDE+/307u1yOi/Lsp5nZiYzqDnFvnbVxRghEAJ7fjgagJiuOXv4rYCBkusAZNDSdm8ESuPPtmonBizEIIyFUwigFherbFctlwAAvGKR18rFohyUZVwqGfn4EiCRlnQmUVWRlHP24xmrJThLJma3Bba3xBhzViJSzV4/WLMsy0JgLwSRKY5DnMY4TMO4++qrr6ZpUNV2OLWIZA6Yc05JFCyrYCLeDbvDdHhzn4k4RoisZOu6KuEw7abdLr/aAAqmhoph1fx0WT6c5sXYwnSS8+VlDiGc13TYjfOSDMgsI+IyzyLy7s3D85qPj5/Sef7y3QMjPX86oinIoMslp7Tb7SbiKdB5XWW5QOZ1nZloGIZApLIsp2NkUhMQzedlVQUglMxGBOgckYjoOysyj8PufHmkGIno+fEphMs0TTGE4/MpcJzns8o6EDLyeblATiPyovB4uqAugy6Q+X4Xl4cd4IFMA2ZLy7rMYRjHccRhEIB5ngEtMpWatS3kLGUiAhJAAil5l1bjChCRK+oVKcEk6rlghEgIWvy3/U7EihjabqpiZ1N0RVP7vPzqOsL/RlyIJDQkMkJyJv0mOV0xNiusO76IPD8cQtwd7n/xq7/68O2vPp6PS5JpF9tKq0jdn6OITASopJBUoTy20fk3yI4IAOu6ImLkEEJwtO0d84rdRBxCqVIHUrxnALUsUTcs1I2A1YXRekeFzkVUmWjLdFK7NT9jCUASrYW6W35CmQuH52WohGpUYpOBJf+BNy9063WB5ddZGT6MGDYQ0wYHERub/o0cez25iIhkiEAAhBa8CJinAZh6MI5b+lpwoxUDlaG6gQkpIkQW0hRsJVkgr5CFtMSddsyn7bINanf/+QrA1M/qqq6WknLq2tVvXyOBilb6zm5qYXezABjYhuxvrv4V1tmS9YqO8/Xvboe9N4neAJIbMOqf3yS9tPlkZK9Z5qpRa1WPW24G53pYtpXRBrxeXivgdkhvGnmzU36u81dyqZud9qtt99XmQGcgrhf1P2yr/eZF/d/F8/N6FVVo8dlOfbb97b3YHZSfW8wF0L9+Alb6zOtFbv1g3vwq9L+vT0GzYty/eUVRAGp3KiLfphDVilJrxZ6N5pqTYAkyF7Or1Qaw2XgAakHB8vX2iQEAkDUXW4mpN1JnDfWoi7bkq7G9pt2YGblbXJXqsmsVrBCxAOxiat10yqJYVEUFoGTtehx5SVdDrXCW+iksW6t2FVoKyDZhiFYqwm7DXAmEoKk4vhYRARlqPDwiFpYoL3FSmMuqrDcAJAAkNE+fAI9hLfqPgmYAcds/kkGBCgbQMnrqvFzZ00toW/mfFV4CMKoJDM19eUuoimRwu/y2yxe1W/tD2a6FhN6qLQEAkFBL8oF/0HG0eYwdebmtYqP3e8wM3WqonRYBhICBAZHAMJl4zk1GWTU9z+c7Hu/20/0Up7f3y/HtsiTJFVIZIrJCgUZYjGpIhCEENTQzUchiiOjkXFr4X314cODgaaYEgEiMZGY5Z3M2Lirqgap65L0RM3OMA3MQMHCEh5hSyqZU+GRR1QhxGAYnUwJQrcZEcuQaAhF5CaSSSKDmr1bVQMSMiuqsID6PCKiSTAPx4OHJDYhg1T2WZVku53Ecz/NlGuLh/uG0rCJmhJd1uSyz8YBMXv0oI2heJK1MkLNcLmeOQYlVBVUDYs7rcV0hKo2GwwRhhBAwMDJZEt9XWI0LKpDVLilfMjye159ezgvEHEYaASkyhy+/3k1xPB6Ph8Pdy8vLMs/Lsvz622+ePj2OTGmd3xzG+fR8OZ1QZAhky2UVDSGsp+dA/PGHP51OJ1QRAFlXjlFVfDmyZDKQvAYecs5myhzW04k5nl5yCCEMo9eBQ8O8ypKed7sdxUBGx+cXsMtuGgYOx9Pp/v6A5pS3BGiKpMCEOM+X0yXvgn1xNynZh8enNzv+5ss3j5/eM0FKkg2W00BhoKzE0RSGYZiGEVA1rTlnRAQmEcKcrYhKNnTmkM3/mSuhlpmpKSGqipi5ClBs8oio1XqMALi5rWlL8MUMxdHniaJE5CxD/uQSlVtY1a8OZoDiRHa+Mwe44q1yHbXYKQEA1EDEDEkVAdkQ37x9+OKrLz/8EwDAMJREYDMDQGYmBQBBYGYOTssKlYVZxNUDIm45AL22UwMVwDdsCxmqvW6B/lforTJI+ilgYAbaSCPM1ficEzM7q1tumZ2I4ziKiObU3g5GXrABGgO/o3Y0BPVAQO+xT42ZioipNDLfa9jaQL9/7gIMEazCPzFzih5sINgzf9reByjFwXtJ7vdbjZyhdr6jorPFknkeMAevcg6o1ApQIjarGzWdEczUmXJCgMDCkEhmS7OlFc0phEjQKvC162AJVYVXATl1KFqMnBb0Qk6DWCyJZlCWNYBVVaDB2bYaCdup2MLy/9J1A8rhGrn6VTkxfPC0Sd0C6cp3Xf5h8U5wCSXY5qXZiQumwq7l/W9rQ5zOFgAcXFk92O3mV20EesTZYU0sR3EX62fbVYVAXZlXOLWD4K15n0XPr1+9DWCrC9mSD2pYh98p7eGIzsSvevtSAOq0KWwaprvMtNAdFQTbYXfvjqLDpOpS6YF467VLS6icHT4OXjiqcfC3CbMyg9Q63XfZa5jUkSREcAT+Gnu5hht6paR/ll1bpuvoucOsKRm4Ebb4DeAm3iso3sqyVg+Fa05Fw/CVQNWC0QZF0V94pZm4ioPobLmQQQIiQ0BCdU4QcEcvVQOw3oinuvKKIgFtsPB2B75ebf1YQV03V4NmZh2dqF0rowCfmYZth//8q7v/VAMDLx+D2muBXYi2uvlcFTy8HErKH6BXN/STycRMnB6G1bSyeTLyRr7UPd+jS6kh8dpmLZvLXctFfWoDdaOn+vTWqYTi9t2M8VznazvewLBQwzUvRzc2r4Wmr/sqq1vyTb0NocRc1RWiXqtC3WOrBiZgCfLLenqK45tpP/A+7Pfx7ZtwXimJnGeATOSQCESLBYwRmImRWDl4zk5SVMEAlElEUU1BgQyBAFsowSYCzExFnRcMO+I1InKyyLZI+v3VzHUt09dK4HJqq8tvZmaAUgKsEA6BB+/5OGQAIAKv/ivSyaZ68VYtuIQmezgQAczzvCzLfhpFIYnu7+7p8ePL8UUQfvzxx6++/cUXHDkOSUQ0zZLzesnrQmgI/HI6jrspDFOylA1kETsvPNyn2SjpeB/2055jVNXL5cI4AADWJFWPVMgAT8eL8HBc9Om4XEB5N4Rpfzjcf/zhh/1ut0o+n8/DMPz5T9+NIf7ql9/+8Mc/LfP5r37x7W//+E+7GAOBrvMQmXJe15WJdlM4Hs+HN28+vf84RMqaCXBAY0vpcrlcLjFGJlKRlBLtDiYyhGGI8eV4zLoc7t4YUkrr5SIINEzjEIZk+vDm7vn4Qjx89eW7vOQ0L3PKovLp/Yc4xd04hoABIiOdj6fT+Xy3u2MUgnzJC8sK6/r+46ff/zP96puHMNAUeUBWs/l81CXxsD8cDma2ptmnyqPJZV3HHasqqqKAIRsVhwwiikg2BSn7ixGZGDwt3imSa6DLlhxyLavbOqw/ucpXI6I+tbd307c9265I3At8M2MkL5WLntaG0CzE/gYBMwOvvXD38GYcd2wpxgEsZ3FGl7KwAYAQOBADAipT9NWcVKNHOyGV0gQVCjCzg/uUkneRavkC76OIiFrOuYtyLZdHRd4cEK37LSMAEdkHtvJHI2KM0XV76Dxm12O+MRk02ehMa+UcEkUtXkTqX4bbQYabAgAtYfH6wHXo22rtlbO7NQZfIcImzbZ7Nk8IIBmBMRojslc9Q0AUr5xSwhQ9SZiRCCWn7blMMJIFyMEWkxnSqllMnOsRjdAsdcCxvdqqEbAt1+vzAl5/Ql0WQU8cchOI5X0CaIHyAGDu//EbIwd4dU4ZCGHwv/pvbxrT/6Q5svSaEOKmO6097QxtNjinhIe/eG2w7ao9VKH/rQvo5tXtWGpLaLvg1SdVGrT12f8K2x+dqKkDdt3azUZ61XjtfHrtKysg5T9jib8RTfC5qbnpqbexn8pu0m8gYteYaykK3bpq0f+fHe3+Cf0DqeZc+dZs3WkS6eYJ4UZmwabBFw345o1M5EbFor21vFAAMU/i8WpDAgBMrCoer21FFiMAmKi4bkSM2MKVimsJEQ0ZDMzQLaeGEEK04jv1oinoRAIgqtWuKjWp30xZDbHENZYgNVHTXALP/Cbcxp262ivQkrWqscdyb2m+TTBqCxER2ZUTg5bj2s4ARMRKNhc4AIBqTS/rsHZVWq36UEqwuIeeR/Yyk2pSPCwABoiMCCZgThlRrReqVPImzArXgUeYKCO6N8DUS1c5xb86zRkU21JJQBBTV8YQnanGPa2uACIiOldDtdQgIohKG5lyxpgzRkpgdqSqaiGEGzsEYiFn9ZejGhICBV9kUiVmnQuqg9Q2CQMUxw16LnXJSaKiTgK6qwELpxCpx8EYi0jgaKiLpCGM57w+L5dpGg77OLx9mJZsBmf5qOtiakoMaioSQpji6GhYBTEjs9N7AxEFJICMGM0gK2QVVUNUZgohiGhKSUCRiWMAs5yFOSKqiCDgMAzEQVVDiE5IknNWhJxzTjqOo9ImOFQ1xjgOMaWEzggEdDwePW1xWS7TNDESkklGESHH8UUB9gHsRLNJWldQmXYTgaW0qiojXeYFA9/f3xnCMicAWJZZ0nrYTT4FT8/PDw8PD2/evTyfkuSW/iumwGRmOaW0rus8p7RcLosvqmRgSNnIYtjt7pckYR/CMPgGzFlQIcSRkOI4MLNkjWOQJYVh+vTpabp7+O0fvv/dH79/ntfx7m7aHY5Pp/XTp6+++mo5nefTKad1PZ/vpnEI8fz8lOfT2/3uw5//NBEcBv7p+z+D6RQPLy/Ph8Numc8ff3i6u7t7/OlPy+k8vnmDpo+fPn7xxRfPz0+I+LCfRCSlBZHv9rvL+UxEz88vh8NhCMOS03o+hWHcT/tpsON5vpxPISYM/Lv/9I9fff21SfZACBH58t3Dx6dHUYjMqooYVAqbEO32RnS+LKutvKNPL2eJ+RANf/21qgaKYppFeNyDszOArsuS88kj/gcO0zSFEPb7fRgmjsGQkmRVMUMgFREwYuaRo4ioqAFIEemOF1BVff2YUEopUIGARFRcAm6f5i1upD+JDTGrAqxExISEwGKNbh+JrDsUEcAUVZUweBeSZESJFN00jYimKtIMGSiSNa2imYiyKhlM0yTrMcYoWVEthKBQnGmIaCCoVFKLtKQ6uIlcawU9T87OXqXTJwLQ+XCZGZj9D60Z84glVwkRl/USgpdkQERcczKDGGPO2fNnnEpfVQeu1bbIk9pKCUSo2IWZIwwiLjEoRgaAQh9utRxejQJSydbFTGLlCRDwTuRSb4GoFgdCAI+9KWZdMxMRJm7IqSo/ZualDTcs4mNVuSNLvJFPaIslMzOTYo0rDgoAAmXGEAKx/xABPdejlFevRwYJmKkG4lI6NbCNxLsRdsNMeslp1stii6dlgZplMROP5fRGtgzm/nzp0U4H0RwalnvcL+ogp78BumvTY/3wZz9lwI1LTquLiJJzOcMBamJIWWx+gAEAFMIM9W3X2tmSNwC8JsxVS+og+z6tdNLaiB9CsVt7Sh7VkjJXqsi2T0V8IZV6ftWjpSrgSqLVhPKCajp2geb7cvq4fvv3DW53WnUi9V/1Y9ugl3UmgzImlZHJAY11GTsIdQrcO4doRFl9v2CzvV7Fd2gx/mKL+yj5ip0ce6VCODr1Zvh+sWIt9Zk1l2BQpnzLKgYo5Cg+Ai2/X+tgYvcuv40c+WyZ0oWrqgv6RawJJ9VpTyb+BPccggEws4FB5e7DaqgNbR1f9bDtBrhqGcDmYiu6h7oToFTrqNBQ2syVB9VyettMqxkVUHb9inIbotP713oY1qAyASAYmqJS+5rMKvkKEZgYmFdQQBA0MBUrqTVtWhG7V/dv32waRjdhWIiFiOpmyfYtr4Kgejmqhtqe0O+cLd6xqZ4+kzfaRf3bLbVmWLyTzjeK5nYKnxK3/Zuhx5Wiafnb0EycUkE9SscM6mLxVvcRunUSDcxqDS0gg0LOAGCFM7DkKLvtfutIma/6qLJ83Qbmo9otu/IT67iASn3qth4+O+A3c7dtFENAbEteRACoq3UEJSHYY4gL10HJylCU1dJZ5sflHCliOAy7IT7ciYgsaz5zXpOrgQogZlklhOCFjPz5VD3sAcm8yIkqoznLBgD08963nzDUGInGy7KJjCLsis1exUrKYCmq2tGimaqIEFOMMbrt0+UpFRqiiiEKIXfOOcuKxKqFNbwvsNKZRbXZI2OMjo0868BRUUopZ/XaZPf39+e0XC7n4/H54Yt3Kcvlcl7XGb2Ygpmq5pyBcMkJRLMiRI27MIhw2I3jNEwHGIYkNq8nDvHAERmdN2OYxsvlMu6m777/abr/4sP7T3/40w8/fnx8982vT6tGte/++Mf/+v/2X333u999+cW7dJnX8+nDT++//vJdOh+P5+P9bvfy4afDFIHshz/8ziR/88W77/74T0OIiy15yYfDJJeXkYCnyLqmef763d0yn/YD5pyX82OgGAGOx6PmEYECx4i2no/TtItITPby9IlPx/uHt1PgSxIGGMeAfDg9f3y4f5uW/PJ8/PLdF+/f//jVV9/8+OH9uq5mahojMSLHISTENCdgVuVsEIaJBzEmBf7h+x9fRmLGuLsLxgtehMbDmy8Ph3uftZRSXlYPVR+GYb+/i+M4TBMBEiMgZ/Pjs3jh9PpYRTQ0aEwyqoA1VL1V8N2QXykqXK5meRKRnjt/W+SVtEo7GGFmJgpsACSyZlnRCBlU8JJzq3mJbnbw9a2Qs0peDTKaERgRDYFlGLj2yBcrVlMXAyFZC15FxFIGuKt624sRrHZNh0fcseveiKAaQlk+ISRkCqVA5O3VTPJcK4V38jYjBc898KdpqRkSQggC4gfXJvraEWYucFAdbZqKqlUU1dpW+ljpOiprc5HJzFf2FETsCotaq6uqpSxJixey9hZ5dTJ2/QZmDmQEwE7BBEgly1e2TgEAEyMQUfahJrSRYIwyUA66gs15XSCLJoEE4KWl/kKE6RXQbP+aWQ/v+jMXC0bcfv4XziCo9v56MxR6+J8BCQCgKgBlHnu+IMLNut9sWwCf6dvr9ty8zsfbwCr97hWu6G+Da2/JlclysyXrzS7+zHPMo4Kl/7yu6vLzNtRYUP7nSJBqAdDXX3FnqL1ZqG23bp1Suyqy8HoAYXvC6wG8adLNJ35pxeb+TX//Z0e7DxOqsGQbjb4xfpVc2fZjatQhV1f9Vcvw7pKyrEMacPUWbArATcfMEzTKTWUnIKJnCzYdoI5r+QMRy14GAzWX0jVMvFiVyqhhucs20+PPXFZCg7QcKl6YgtxdioIA7oxxMY0AhF7uxTkKrYg5TyO4miyAkoDkO63gX2+fAYAHO9mV28uph3x8+jQG7yPUgYZ+DqBK997O3x0wV9oXABISNj31ZmrqfVTyZX3P1drCbuw3hcItjyWO06sAeoxvCSoTh+q3ywjYndGm2xr16S58q61BWiIzGd0oT65zgIFDTM+EbVAAAFpO9vY6F75U1RerJYid/rTmaXRlBNrmx+t1s/0pUL6ui45KQgBgZf31h0BFPCVPH8AxjxpoIgmyngGDMSnyjt6Nd+HhMJnBmhPR5XyWNSGAu7AUACnUNnhkghIDm9tULINmQTNBLK4hh+Nrzrm4vFB9/pjRC/oQInAjVXfzIRQsBaYmQVV1GAZD4BCZ2AsbQQlmBRM1hCFGZmzWRyKP9ikuISJ0217O2bJowDLIoK0gK0FjQy+WIecoHIYhDmwghBwYJUsMlDOaWVrXabe7u7ubP61PHz/FYTwc7iFERRARyGKWdV3neU2SQYDmBFGJhxhCjDGEAcK4rutp/SQh8nTgcRyGabc7ABASeWLDNE3P53n/5t33Hx7/4+/+YDxNdw/LKn/1V3/zH/7ht7/86qs///H35+dHXU4EeHl5HBmOH99HxJDT04+fBqLTKc3HF1wvAW09fgyyEIqtKV+W6X54fH4cp4EN1yXldeXhPl+OwxBYBTTN59N+vz9MTGiISiY08PF81kRIQU0CCBpejo8KSIHJbD4th/s7VEqXs6T8i6+/nOf1/u7w/Px4OOzM7HI5L8siSKY5EMqagMMQRlQSWJnDyzzbfP7uMHx9H0FhHMKwRzRYLhdh292pqoY4TmM0M88DkZSRSTUDRqiVMxUk55TWdRgGQEI1QgOCEm1eAoALPFIDNSefBc1CgIwEVkoGEFbdckv42SLdsRw84IyS5URyazcUJh9EBCcgUyFAIjCVlLOnfYDhui5epKIL0FfTDNlQFDQxZoNMkBEygaKTEW3He3EYE6BIwiLSSlC1k6WCmpu0m02u2R29Jw6biQjqsd3LsdIFkYDEgBjQmYeIiEAYTbasAGQoiddmFiIRkRhIM0+Zgdm6rszBPWbeksLr5VBf0cydB0F0rQdIORQiBUT2cBioIUxNDrvwabV86kHkFDrgCkZLGyAqZAyarcr9Yuxs5qcbbFTWTj1AcAuOByaIjIzEwbOWoYQrWImqb7ikVp2z4CI9AE0DHAbd8RrtjOmiS7I1SzZUM1HTamz7jOGszWM90bah2IKXa7FR9GIWnhNihCXO+ep6DeyasRhrjGqbku7+Ph0T6ouvrGaF/vvapAX1sC/D2OHLYv0saM1Hzzdj4dJAhGrUw9qigvUrM0/ZB+1dVZP1ldZYFtv/bnD5qzExglqSov2LWyCudTEqP3u1p31uqLf2ffYG6CwLFR8C1Kh3v7DWeQKo1YxLtRB/aPnOGtj1j4uTZlPYVD3i2sfWAMAZ+qvDoc4RQA3MLqyQAJUqAACcI6RYN7qRwUJr2zrbDJe0Pf66+9Wx1FtyEdHyhv6h2gvAKgtQvz3KEIN1i6z7ZcnnwG4RmluJDLz8rwDAVvCrhmhBaRjUEQdUx41IhRTuRp1FALJS59OxOdZxhFK4BoCQ3OdVkh+InDEY0QqLvC9nKYXKsfLqW9WQtBvxvkpBw3NwfVlRZD+3fEupvs/r/f1cqbYI9TpDr1b8Z3cIlQrezark2hcCFJb5mqFRfW1eLNmoDDd42a8NyNe3uEfJ+vVQd1q1SHcKH5R0KAIsJb16bbctmKI3dmu0Hpal8VjMACUQ3RTb0q5iguyaCqMfz23iqmbk4hHRWi6E72YmNishQVaZKwDItA/UE0/TzqozIiKejU2Kk3cfhnAY92/u56RLSmtKgMbk+bqbks0eYkTECszorkAzMcvqDCwQvPc5Zw8GYGZ3V4lXEi75hcTM7h3O7sPp5sW/DSFQqHVDuUQhgLi3obH9kKp4DEAIRACSSp63SEZgQ1A1k2RmRO4r1Cxl+xdX43XyihOnBIrMvCyLY6YSbQzoQQ5gtt/txvP4/HJ6//69Ib394quHd28JaF4vy3LJ65LXhQLPaRVDY+aYMaOd8+M58/Q27t/x7i7wMA3j7v5NiDHnvN/fpZSmMSbJTBGQc7Z//7//n//v//CP/+Jf/9dff/Pw8dPLP/7Db0em88tTIDhM4/n5aQwR1nUXw/vvfziMQ0QLeXm4v/v0/v1yfHx7vz8+P7//+OfdOJHmoHGRWdYTyLyeF0Za1sswDB9/+nOMcb1oCOFumn56eaJdIAyqOecMQIf9PQw0DphVkqR9jEiYZFlTohhUR1G5gAwxrpfzfn9Il/O333z74dMnMI1MChBjJFBCAwxj4Ix0WReO0zDFkabBhvOHy3nJl6TZmAg5BuwI8pl5WdcQBsIdsjEgMydciSireBgkkBWDviqo5nUFVeQAyNiJejM3HBoAu0XT4aZa1lKRqhwNfc0762mIXbrWUMAKqTequyKgyNDYQNSySjYDVVRVNDU0zSIiltKaEqIRheZSEBFVyEqqmVhQk+VF11XyAjllMhGh4mpzwkmHvU6hI1Y9bJ6V3OJ/2sOLJCz0PQXi+8HYibgtgKfkUDGHEIA9a4KIyGsMN4TRy3lVZXdpEYWoAlhzTEXVz6/2U+9vQK5l1roqPzfmVUQMQBnRarx+LzP9zp6Kqcp5lwmF7KuX2FAP5/7A6gVvkeZNC7k+wrDVLvSgXDIGIzRCQlQCtxVWcOyU0k37BCACGQLuIhyiHsIaZTZdJOUaJF06ZQDFtriN8E1LbtHS7Sd1igEAfBG6j6hRSH0W1vvz2xBBWaLdK67f3g44A6wW0uvxtAqaO/TV9esqy+4zJuHt2y7IuR0rt3df98XMugPflxmYeWTHlVryepzNrHI0bhu8bPM+r6/7u4Hga5j7lyIs+nXe3tIPoH9bBNHPJGT3yNbUmmcbSw4SbUurxMAV66GZuckSEQGoMcp0U3yDSdobAYBccvb7yC8pFPNVX+pi4fqnbeu58x11i6S4AaFbdcXObtsgl+cYwOtKwO3v15CrtEDdFl8HpAyTghqgGaiZUjfshX/3OpfAh7i2o0TqF1iJHiRRv63KU4218x61EVUEAjd6goLzsYCpKdcXmYN+M9JuzcKG2KwH32UPX0XLbWNTa2SZuy63/mx/U9WScZuHTl+37QzBWqFzWwdNPpSKvP2QlX+0loAu6iL6uCAimYfvl4wIMzD0IB+ozD9g1eKxIebreVGoWxgBzGoBGkQRAU+qaGpSTeyrKjNAJ4rK83ETlzcVT3wXmBkaAboGbGS+ApqW7KmKRcNuFgsoOm5RMDrBZIAM1c3hFb03cQqkuCkAaE2X9Sq4/gBRVSNeV4mES2ATxbMC6Jf7h4dpnO4PtiS+nGGeFYWZiKO7O5ro8clkZmRC4GiGjGYmVJjP0TMvc3ZTOpAnMqqZ20FruU0uQUo5a+DoXIKKQIYxxnEcx3GE3kPViR5RccKfEMI8r+u6+rmec04pqWwZGq6KtLDjEIKpRw4rEgVmhyOG5TQiuoqLW9fVhRTWhMXIQfIqkoZhuN8fctbLuv7hn39/ntckGgIt8/lyOUla/aXzujKzIAIHGg7A03gnh4fxi7svd9NBOaqCt8UIKYTz+Xz/Zp/P6+P5eP/uzf/47/6n9x8ev/7m1wb8/HROq5DaGAkHvhvH//Tb3zLi8XzUtF5O67vDTtc5r+eJ8PL8Edbz/UDry6eo67jjdT2BRWANli7PH6cQlmUWADaJyE+np8MXX6xpBmFZ82EiSzMABI6maV2zRYS0KoikNE37y+WMMe6nPSEtaQbQ/TR+/PjT1199q+tyXJe377787T/8h7/5F//ydJ6X5cJDLMUbRUGyqqacUE00E00UCHK8zGld0iXJ3Zs3795MI+OS0+V8vqyiAz4/P9/dvwOAZVlSSgQ6DIOJMnP2AwYZmTAwIQZDJVyW2SQYMRATERC6S84luDobr5k47xFSCAFM+qpzRQhU17x1RzKhJ+MoGqApqBiIqEfCQq0t5WGHJiKgukp2/gtmFtWlrkzJyUBMsZFMuGBiGwxEg4LOeTmnyzHNlyB5nlf3/LqGAgbZC8j4slcDM2YgQkGSK5Jyy2pO4do62EMNRgwh5LJJPf7Y/QOGiKVKBqFqKVLRNlprdZ+G2BQPZg7mES+lJJXXAPF3QFVLYhyYOZupaujaVoSGItbIQcKAmPxsrcH6RbFR1eCKPVGtAd3ktstbquQnTd/JAF4h2KV3tTRhEfMdBCmRqE0Slg6SJ4N9PqmRnMvOMxNg+9dQLTCM0fZD2gUZ8MK2iCQ02RCBG28MsRR5r6O9/d3Dsmtg1k7AUuTH7WnFxleP8lryFuH2AC1XQ//YTJkOkNTa2gEEd3VD/drMXb9+kG3n4+1pWl5Rxs1dFFQVnrqDmqvcI8D8Ez8UOmt3SQXGigGxnIRWp6+VISpC3iGKhxODZ1N2p7C0bpcNWRBSiUxuA9UH/9Tu+HOuAG6PUF8vktfDfnPzBuTqu6hTWrr1Ap6dUt6ohlYcnVrtp+Upqs7p51qdlVR4rNjDtuVRw1watm9zUVHKbSNfz2zf8oLPSp0BnwKrtxh76JRRXUhQOCFLODjWX4EBmdkVzisRLgCuANyMWhnQv6Apmq8fbMHJBpZFiK2OnYe2W+08X/28PL/B45sXlJxhK4RkzsxZ3TF1vOq/XLYjAQJ75jFZ3a9QYq9RFUQbT7PC59eQP7qfFUekW5s3yVIVqFeaUpPy3WhvmlzLuPBbsdM9fAm0397sh3JPDWkHKFvZzVo1At8jP9z94gMjWCZbwMBw81zfBPPVF6FdVVIszSADT7tDJNjU3zZEn8ku79u/nQ2btbLpOs6sR1vkTw2L8vbA5xj923/241PkDmE7tMyVIAMDzbVgLQDUsDRvVbOoaePyAtUEKVkIEADUcuaFh2HYT8Ob/YT7u+lwXuclmzESAqpHQ9QuB6SilgESkTGbYRBJKIhIqgakWQrsJnSSk+Js9egCLOhKVVdRVc0oIrJK9vY7YmDmm8WMxViJOSWvBhBjnGdQ1RBCzjldzsuysJsj6tncWu7PzJufAYjYRM0AyZxjhIiSioh4BQD/o/grVAA1RDIFzZIhEUOM8fF4fH45rWrLku4f3qDpvMzz6ZjyqqprzmGISVSA424e776gvcQYFXCe54yyC8OuorHL5TJNk4hm08Ph8Ps//PTnHz4M+/shHATwP/7H3/76V7/58NOPd9M4H59PjOvxhZkH4uPpOMaQ5xnzcvz4QSNBXi3NAfV8fLzbDfthWk4zIcgiTJZTGmgCS3lZMWCeZYio6wVR87w8P81fvfvicjlK1oeHB2KgYJgWzItqDoiwniEns5RACHEXWGFdz+vb/f74+Gm32wngp4/vv3z35T/+x//zb//+70/vzxQDEaA6fb+KWF6XMA7rugZCWYx1Pc5LTPnpeDkv8hUFI3g5fXqZs9BANFwul6enJyLejSMAjDGGEIAMEZNkPwYIiYmN0EQJENQ0S0I1W4kCBUYKZsYc6xYjMze2KpiOw2CVO79JM/R8rUopY7VwrJoEPwHdxmZZaxYgI6lKL4WK91gtywrg3mlZ19WyEFEIpKoCopL88HaINg4sIiBZ07zO58v5ZZnPJuswBrfQAbEC3ZQcawu+IdT2eR/8w8y3hXPc1kIEJX0LHSk182rN0gFXAKz6mRvZTidsN/JQLL81MvN0CyfxVPXIn07Rwi4OCpyglQGlNgx7Yev98s65MNGObdNRRwFu+nkY0ItcvDkcC0wpgq47Jbd7WrijU/4HBEINqFTUAOOtuYCI1XDo8KV6MIaA+8EmnoOumE6QZ0iJxIsrAng9SxQCLuj99hiFCkD703mDWNXTYFaKojrnhaqSQY1OvUaW8PnL7yoJAFcftrNeKnTutBdzO25RKdv0YbUi9oP/WVjcX+0oR8SqEnQ/sa0XrUc9Dum7Cd1EA5TgfutyF9vsbec1YMsB6AccX4MZBAAg4n5SNoFAt/29adLnuvyZ61rC3H5ex3nbp1WmYbdOikYEdX7tczLhpoX176vtY6+0Giu7T51E4earrZ2vXvfZLpvVyOgrLkpod1vTiesV2ma4WQFtgACgRrZAVxhr00UKF7cjOW9zCSyxen4INX0XChc+VrtxFSLX44Lt6WW4CxD1QSk9QiwZpbVsB1YGNEBAFFPWYsRQ1dp2t1t8Bl5DweS9LHNS6mZk9X4RuGYAoF5c/pU5A7uowRZ51k+/uWtNu1h7uJoA7Zw7VPtf15eCWrE1mJNpoFozjAnXsEV/KrXX2DZzVQzVNvr4baUR2vjXrdHFDTlo7hc9qgE1pO5CYfu7H2qqccZloV4fMNWbUGvAFdmB/fIopui6eeFnLjP0RGfX0mv4cXsVuoNVEdhjZw3QTFFLWjpSkhURIwwKfJLzXqfF9hh3cT/tDvv1Mq9gXqfYpIY99AILxBEIGxk7tlYU8ZWbU3ZrHBM3QyN0jkurvk41MDMnISHHGe5bqHEarTRHQQZUqn0Fxh43hEDrmtd1Xdd1jCGEYBVJuEUQEZmIN465EvoPAERMfKXGO6tPkV85DcOgMZpZ5CAiyIGYc86Sc0DKy7osy+XDh8tleTifpmlQSXmZASCMEUVSype0ZkEWmIUzTsSfzsp3D3b/xTd3d2/GcZezSpL9PozjuOaMTJc1/ft//7/tDndn4eNl/nR8/G/+zX/7j//wWxN5+fQxXU6HcbjfTS/Hp7A7pMvpbnjz3Z++GwmOjx8OX70bA78cz6oJZZ3Py+Xxk5iGwJfzst/vmeh8eoljPC9nSGghxoDLfFIwzYKmy3wE09PL0xjBsg3DEJAhGFg+HO4/Pb2MISLqPB/FbNzvkfByWYYQA0JaFwD84osvn45PwzB8+vRhXRcMyIDB+Z4GYICw8Ol8XvLCCBntboz3D++GxGuWP3z3pynI3RSen46Lwe7Nfn93d3jz5v3792EY3z08TMMQQhiGSXMSET/kcl7BMtsATKKSJUWPMhfNqkQQCJmKEluMyoCGQSGbbdRWUM8zq8q8ljKW0GSClThRKXE8Ukpce8x9waYAds0PQSggWTTntTzW28/BV7KYeS0OUVUVzMApicGa5qfnx8fTy9PlfETQ4fDWsHg8VdUUSBgAmNQjppt8a3sHKrixirNdp3WQ3vLgbw57EcnisSiIiCklRBSwnDMgNwHa97Eco8Y3qPTmCO5E1bWZo0jgpE7l4ODMCAGQvAvg0I+sfAxVb2mO5eJ56DB6gT5azLd9oAXilmoMAJtlt+CMQgzRA6wGDd32z+SkZEakHjJWTP7lcN9ClcpZ48l8ZhwCjoOMwzLwjHqUdLQ0a1pVivzxyCUwAxJE7CvDXMPcvmGdD7NH9h49X/zPWA1SxbirZvSzKbDdi9oxffP5FVBoMP3mHqL+pIM+xOcv6AD2Cll2/0nNig91u5XNW5FYG5yCkLqlaBXi1UddK0JunaUNQ+LVzqKaQmBXyc3l+s8PZq9g9AKnYqJt1/RAv+EWADTJt8+sMVdWV7B3qWx87+/2hBISUQfEo9Q2rcnAGqV4HYEtg6P5wdrbXZuUmoDUOoX9vHfdLzjQf1tGYzMlX/XLe0G+cLGalK8zRmx7sl/BjcqgpqZYOXkQUbMZqvNtQ+EXw04VrlqjmQtlckyMCu4p8hFRK56KmlLsEVOKELBUBzAzpeaHq6uktMonSgwYoUXvb+qaaxcAAOo6gFfPAt/D1E6jMq/gcUIAYLjBa9tmaJtpMyv57ESuAGAnAfGVxtxNGVUzxNXE98K0yf1tIXb/ud0DgsBUi//6emQGM3SAyGhAGBCByLKAiZX6kOIMOPD5RsLWkZq6DADVdkNF8JSZRTNTBMIqiBDRQLdfCkIwM1RA9AgudelpWMJCXFUBALMtbKAlANQDZmuVlwDzReYOtjpRt+0HgJYmC2CCSLVmIbhfog5EsTeUiUOyIgp5Kz4AuqltGphF8qoGrIBjsvVi88nWFJQHpGkIu9FEMQmbivtGAD35RBGaOuZdQwQPC0ZET2t32x84asfQFnXxgUAxowIUT4Vz8AckI+RAMXLJEEA08HxdNAIiMvZIHmq0oc7QEuOo7nNQQYyeMuyrTyXhOFJJK2z8JBRjTOvK7Aa8aC53zFAtpYWEAMg5phwtmVnwSh3M0zDO85wBh8hDDAHw5XQ+vxzP5+PusA8h7PfT/ZvDOI4KtmaZOIQ48rhXHBjtdH6yOI6HeyRQ1WVZ4m7/5uF+GmJKiShMA/8//1//6/NxFpoul/Tx8agU//SH3w+Ex8vly4dDIrmcTy+PT5rT8+kE63z6OO8CsKaHfQiQ03xOl+e7wwSqeZ1V8m63T+v55fl5iHR3d/f06emr6SvTVbMCgyZQzZfLZRiGb7/88sOH9w8PD7Yb2eR0fgm2z067s66oS2QQWZin+4nnJaXzxzhOb/fT+5++e3j39fn4zMN4fjQwGOLEkk1WW2hVNWJlIjVQOZ1OPADoasJJVSNTCOsF/vz9j//V/+XfvH34Yj/iuq6UZZqm/e5ud9gbBOQQY0RmrYeNe2lUdSEEAB5ijBEQUXLAYGCrCVb5Q/XynVD+KIYoc2IfpEBUAD0hOWGU1Ughs7awUVIW0ZSySlIVleTRTapKaB5BX5nBAEBjIJOU13VNiy8qTXmZz55qUiNJSDWLCAgkO+Y1qaW8vJyfPl6OL+LRe8xgCu5IydmM0IgMwlQycJqcb61tH5IBAjJSZHL4r4X51A8z8w4QBQDzIgCKxSwyp1URVFVEPMqzhIB2iYb1RFDVUhjMSSdRq3HMIDCZGTtfEGyFVzsyAPTqsFYIeUpyhZmZZgCoocvVuONOv0LWB7mUAkQEL0iIrte1AKt2bPloYVN+OqxjZgEKlWKFyVUsVwYbQodEhmhEEBEJjQgJjUvkiFsPDRBRC4Jx1KVsEpinqDuWCDOki6aLpQVShqxezQbc8wvyFy3jnlx2g6H7nm7/aVhDGKAeW1UtLFVHr+OZy8niT7h6KeJV8pSZ+SLpAN8G6dq74AbyQp23Sk9eC6T6CV6tZSUV2G1zvlCLUeumtW768jpL5Y1UDmDXdbebCS1rNkU1I2RAI18L5HVmzKxwrlSOoGYzKk8ueYner5aV14/hddkoV/0qOGwz1QbE6UqLpbeQxAMQaiNqR7sp4QfXapa/aoyxWUyhon9VZWBfzO7Ag8bnZ1tNKh8NMijBcsVWqc1PcPOufj2ogqooIKIyR6yW7iuDu6+JK2jat/9W4Sm/6N4C0Hs14fZO35hEiBhAs4GheoUkKkuhVks3RY8YKvC55nSamlo2EAYjVGaSvHoeDwMCMIibkYKJWYn2geoY89A6RCJANkJ19QMZsVQaQ89YJXAK4LKOqxLpUU21xEktZmxOfpM8UV5lRhPUbFk0ZxAjJGbK5rywPmtcVRWQWjSgQ5poZuQqYulB8xAZhaGzkRB4oL0IEWGNqNPyQDeyZn8GIjBgCeESAzL2FDUAp9WDcvz4SlJXZqytrFymkNCTN1VALasbm8mPUnMgSqbZIyt7n1VbKLWN25IDQEIGtewRgFDDacSA3OmApuYgFgwUCJEMahFiQC7CqKRu+4S5ScpjZJ0XmQuJOACiIqhJDPFaESo0FCDqVnnsNARElOIkcn3PbUrMACmlwl6DAFZLyYNEdi2lihpzUWY5rc4ZQoSEsSgeCmQUiBDIRIWWHHix9Sk/v8fhzTDFt4d7gJXC8vGY00zAlm1FRURxohsCJgbENScKAzORNtMLpCXnLIRhGIhDCBQVVdQkO95AAmBiMFhzMjMMTByJEMBEBNmTbQFARZQoMLOIpDWF3T5Ens/CzAoyhigiAwdFWi9zXpOk1TSndY40DkNAFdM8DGEYgqrOyxKG4PzfIQzMcYWshmMYqnzENScEs7RCDDGMZJCXlabdGCIAMAc0UCQRG4YBAJ5Px4fdbhnO6/l0WtfLC6jq3Rdf8O5gYYzjuLs70LwiUxwmChPGEWJcbHk+fqDd8Obrr4GBAhMHBQxDfH5+vjuMz0/p//gP/3j/8BUMd8ty+ptfPnz35x/Onz58+OlHWS/3QR7f/0gqX95Nf/7DT9/86hc24eOHH3/5dv/7f/rusAt5ntFyCPnp6QdZl91+zLYm4TXbL3/xzePj4/n0cref/vl3//B3f/d3nz59enn6BACRcT2dYBj+fHzZH6aXjz/t9/v19HwY6PnD93d3h3dv33748Lye32Pg3d3d8fxyf3//xZvdb3/7+9/85q9lXb8czS4/0nkNdqfpTHGEPBsprzmvy9u3b0MIp+PREBlwvjzdUczzM++jgC3LZeSBpp3k3afn58vl7RcP78xABb755pvnJc/zTBSQcZUUY+AYgGiY9hpyHAdVdTpmJGJCMCGEvC6myERJdL6ckuT9gSmGZb6A54RgYDRmJsBAaARJMxHFOCDbus5JBBVDBADgqjB4FjgREY8IvvUNNZNJygtI0rT4QSDg6z6pKoBmYg8WymnNec05O5WcmSWREIIxr+uc0uK2FgLOy4qmy/nlh3/+7ccffogxDuOwiJqouAQVM8vEMQxeTKaUsUt5ATNmYCwhRqAC6BzTqmC6GAGgZCYaAjFRznnJnqIQs2jOORsoOPl3MjMCTquQH231kMqqABSdsdftNR5HwWCKIKCa1dTUCICAsgGBDTFYOXaQiIwwqbCQpkwMkTElb0lg5jUnZMIaVuQ2O2Y2NTICUBBF8CLCqqqB2PUKRCQMIYBHJBICcTPTqBlwsf64OtkKoRshMpPmFJAAIUtWQKZoZikl8KRePw+EaGAkY2I0db4DaoH+iGae8W2GxBSASEAAIBPofkg71oHSACnAbGnWJZmnDwkgoAoYIhC4FeoaS1p/FcFvZo31mcC2YB0v4euQPSUpZ2KxYRF4UUov8tWhMkcl2SvLlAPPsQK0TOZiPS6HGgEAljoSAFVZKnbn8gRuyM8jwlQM0RW2atxFt72TZz2Wk9HKucrMfvz6Id/GAJF0A7ibGlwCQZENr4aMA6OAB2JnVRFHGsWr4MOhXlTUDM3mObEnxngamQoiEoIVMhKr5rlyefrdVXom1kE1j7KHTfMBYAxm5hVN3dJo5gVmsAbUyZUlV7WNcP1QzSypWFXaXRPwUkcF8wBUd5DPXq2B2GLpvcUIYIiBqZTG8ts8BqxMR5l9rLC3gBgGUJW2Wqk0AkqJFUedDsEa7OmVhOqlchv/pnU7/uw6W9gO0RWGlm2L4MWdgk8bALLDMQNDAgUtiqMTghZLQw3PLxcBGArqFhRVInHaPJaQGndEeqRFKXDtVubqU/hMJAeBKlA1J6sBkl2TF9SF297GYAZMVihv2hCUkTIyV+m6PJ4GKNtmgLr82vi2v7fvr8O5yg+7jPtmTPrPXv1DzLbJLq66UvlqizCRGv/kkoEA0U3tJgCEVZ+pSgz1m+1m6MCuWI8AxONFDdDUqmTsXDfFC4HNBUag2sLDaguhuBEzbo5jQPQeuWKK3cwUSX3DrGdWTBcBCWqQTq06V+Rf6aBn93oSBAAgI7QYODdfCRhXC2ZJ7infGnCoDsHS8uZTMh8JA1GFRZbjcmLBp2EfiafANMU4jSnOiEwKpmiECqXwcl0RwDEyBzPPCWZbskj2+m9EFMNIISAiKHQVHjY/CQEaIZc6OmWtcokJLgK9LB5PGwhESMAUGRubB5YRtpSSSiJw2xuSa3m28Q+U4gatsAtRC0XrjhAMvlnUwITQvJDStq66tc3MkZjBAmMgiggGxszDNO7u3xwOuykSMsVhVUMjRuIwDjztxjCdhFLOl8sl53UXAsVBFd5/+vjtV18Ehv/h3/5P47g7vZyN5fx4DNOo55f7GC8sdw+H+eV90JlNdzgsx0+nD7jMJ8vzD0/fy/IMPB3nY2CQdQFNpqtkmC+nnNch7n/86c9vDncvLy8XzPf3+z//6Q+IOJ+fD4fD3eEwRAS1eZ7X8zGlNB+f9/v9X//13/5J0/l8env/baSHy3L+3R/+6V/+/b/eDXaY+E/f/f7X37xdXz5yHPYciYd337z5+HSaduHT+fFw/4WtR1ryuD+k4+MxyX6/J0Iz/frdm9PpQwS1NN/fvT2dTvPlMuj53W5vQMuaf//7Px6PLxZ2H95/miGGZCFGHsb7+/s4jcMwiGles3pBwGYG9gWHyFiinhFxDBEpUAiqus6zE0FWGODzDobBwAoiAWddZiroQeuNdQmpajFOZ9EEJpqT6oKWEJKlJWu2LDmvkleRrJZB7Xw+e8Q/MZhpzlnWJKIxxpTEj+Hlcs6SiIAMRs9yBpuPj5fjY14vERBDRGRFz2K2UmGNCEBDiCmpmaWUsmRmjkMkIi3ZsYaIAcn9dUSkkpyIGtQESoI+M4uoiIhUvoHqQPACYFBpY8qWAdxiFmuGQPEDk0qllENmQlRDAkkiiM7OtO2s/nwhr85WT0Du9iDUEFxm9M42M3CbzSqZsSIVJgTDBLxBh0rg4WxF0NmOmlVVA4HzHKEJQvAEMUZSVGIICEhO9GRYPKyKIOjYATZvOQCVMgNi6FWpI1LkPAUdKUdYGVZLSddkawIhZ7awze5PnvR9W62+O1N641dZ2Oj+gy1itvzbn4vlgWYG4KO9USDA5yysVy+9+trav1rOu1tg1/+q0t8ZGFUvAUFRRKAEslWjqq89qNNkPft93ZetBVdmftzeKF2Ej5Zz3Kwat217ypVbo8cY3Jhh0aBQfokZlB0AvY0c6zxI1Qo8WblEEHSjZ20YHdB7En/BMFDa6WHeAFaSEMwAgEtKdPkH0WvxYNmVNQilPUtNzTaFxEw9bqBYfrsh3fw7Je2eG1j67DKoJyyCodfsc9SGNYCqv9MnDysdf//tzVK5esuWL7mJi/KTz/6g5QB8vq0AWoayaE6KCKaeGFu8MB44ZEreUPzM0/xBRWmutZiIqnbVCTUH4lhjwZuL6uc6DJsrxKWYAZQ6U+z5bV7lFYHQrU3+KFTXerbpKzp0cT9cDTHVhmD112yt6mPRPJjcyjrfKCCgm93+7y29ezNUQFGOEIuuWUerzAa0cHh9Pad2nWpT99XPrkgAqM7E7WM19abp65XRv6jlJ5jrYdu3Zdl5pc+rYwmgi7VtS5muZ7lbtW6T6B7bkqJqt3w2C27toWcb2a7NZkbVnlAf2Uw2XXJ2Nz61LyXV9SLzSU530zDFQ9xPPEsaL5kWUUEzEA+E6toArdoftrPWPLYHKUQahoCBzTYXP4Bi5TvvT3dnAfcBrOAMzNRpAR2XxBhDCKjGzAGhhSxT4e2RlBIAhBCGYWBmrM7Z5i6ESvGJNSG4n6w2Ecws9bAMIRiUmqCquq7ZzDwsgpmR0AhztbkWngKmcRzv7u7uHu44r0TEYcoKYmAcw+5+PNyH3X3ILDyuWec13RlGQmLe7d4qwPMz/Pjjj5dzEuMQp6eP3z8+PjLzhw8/IMj749N+isv59HDY/+n99wOsbHNejsvpOadLJEvzC+QECISCDBQ4IDBYAMiynp5f9gPndJktPTw8vP/x+2ma3tzvAex0fDkej2SKiIfDYb+fQgg//fj9n3bD8fR8enn+7T+sIYT/5t/8m3m+fPjh+zcPD//+f/1f/u5f/esYRxvs+++/H8dpd3h4fHmO4/jy9P7h/u3z00/Gw7S747wYrOv5MpIkVRVY0zmyksjz46cYx2WeZb0EUuQw7Ka7hzfz88cvvvwa4+7T+bLoQqt8+4tfEAKDRUJCUxVGnKbBY+ZTSp5i6wxRmygD40CDG6dVNK08TEhErGhSqoowdoc9eT4XYokZypJtM5iVI9lxLkEGTZIvmtecZhQxXVWSrEtKKadFJYskr0CXc0JEUbcamJkhGaODIUNTUxXNKS2gOee8xiEQM+DxeDydTiKyG6ZxLBnMWph1kZn9THHjNAUsxQ+qac06cmfiYjBCD8VERQCR5FzzjIGIcs6iWUQUgZmJEID9FGg7XYs13sCdsAhAhU3EQFWzWmXw9G3lWQdWbJlE5I7KzoxShYuVgrubZOsIi5qgMDOAtCGcKpjaPf2mJiID6gIorHIcqb8QSmqS1SPXvBYBgMd/Fg86OerPhuj5JM4rpKgEJMREaC5aAjNiGQtT1JLyYQRIiEQch5BHxIEggJgkzUmzmCgqYkH/TW4iMF4dl20pmp9z1pa71joXVTerUfLdKHnYQncWOKcIlbOnO1wcHHyeM+VnL62157qp8bg7rtCzWbtuf9vud6K20tyfx0j/JVeFpx3Od5VAtmJ/JZWuEJEUl0X7OdaQM/fgYcFxZYm24cFr26iqVuhfe+0DXXrj+KSL71coJDZWFNQ+Jg1qkBUAOHEJ9SN8Ze8k2/JLi2fCSijOFZyoe8EfWyLyEbHE/1xZjjcdskUm98/x/rdBKOaAogm26b6C+68Tjvtn9lFtNzfgrQ3688sjtL/alDetCJqpHqBsNBNnUm/jYoYFaCJVCHplX78NKdMSHOJde934IptuW29IYPr5rpZfeSp32zxYptNPOS2wHLFUq756J3xO/27/5c2ya4Sqbf66xyF2/sTrvt1AqL7lLayoTpuzTHVv755GtTJLURFBnH3xL7zu/6erjt+VDLp9chehCJ9Zatv6vhqZ67b1n+B2yGF/f+3m1dvb4YqlIvfVS8tx2B+NdWB9Yd08jUrM4m1TffFUerXyRjE567KMAgEYAu0GGhgYLNXEoO6w8GOICg4oT3Z1xzXNQAXWJ1dLiKI50ipB2Nr4QBEjca8AdDlzHvQJzBxjCEhiKxkQb+i/xWV6MsA4jtM0ERGIV2ey9jqt6L/oEq9WeBsiqhwjIQSo8Vpt9EVL8EOrKGRmXphRC/kjYOAYo4moZTE0DsQDxjGMdzQepvuvhjAA7TBOOannVg4ciGhd4OOHx0DMlGRdPj2+/0//x//ndDp99dUXtJ6PTx/vd2N6+hBUfvrw3fmyvH379vS4kslyfJxGZjNJi6yLrCYpGYiIDENI84XQBMMQ8dPje2ZOOc9nYgaV9dPxUyCOMY4jT8Ooqst6ulwukYNI+sPv/ykt81/96pdE8E+/+0+Xy2na7z59+LQs8/n56f33f0ZkMiDidTnnnOI4zafL3eFe5uegJnkGhpenD4f7t6NpOj3FMN6/uX/8+DK/vMRhYDVLq6tA0xjNUojjOO11nYdhUAq86sP9m69/+StVNQBCzCnNiGSgRGgbC4rjWgNak6SUGIOamiHX4AEAZCQ0QK8f0tLjEIWUu53lpgoX2WBklt1Q6CmeZqbOz2PJNGte1+UiaQFJaMlyUsumGRGYkTmAgogcDofK0y9OMkjF/EQq4OSVcaDlQqfTy+Wy5HWJHEjteHpelpkYhjFEYt+/IoKoUMsAo5mIVlKcDaabWVpXAKhVOypSBK/CU7dAs+I71jGPdsVIjIFRLRuGwFaYFqs0U7WqjROR192rb99OekdNHjvU6pE51ubgBAJXunqThBW1bHuzl4Reohu6oGF7ZadsrWWKCFrCOZo68Qo6XGEUjxxFYGYnPcPib9RSeQGRC2eoqgIGl0jITMyuYhkiiiczqQmYCVgARjIGCChsGTVZzpqyKTgbqUoVua1Jbqv/vAegP3OvL7q57eZ4ujnIqt7braGCB6Q7iW7f209NWUF6e8/VmulQflNEq0YH9bSyrrVXXbqR2FgRTvdhi8WXPi7fCgWZW9nISgBCe2ZBOK1tTvkIBlYCXBS2gWrGgs+c461pZgqlWtxtpi9Agfhb8L2VcKZ+iBCoktOUPVU3O28o1Z+pverrexwMPTXUX7othpuVcLVyrsFMc5Jf33aLW/o/Wk9vcM7r57hnB6/fuP3qZ1DezQb/C1fwkoDef08nom7/WCHwrwgVXUmoRbkcG1uNbarkOtZaiejZ30WHQ/TcF1fLelp3AFKgjl1/owhougtSydDHTsdy/mk0AARC8oRPRmqF2a2L3NKSvEqwzXeppVsrw20zBEXn8zRUl6pN8yuDs1nkASoXbOeRwG2y+0G3Ysv/S5i4roDej+PP1Ot7fMyNmJypFxAKC293bR6E7bdX2wA69XjbMFf3X4U8bdvDYbT7PpxRvx5UiFclwKhYCgWvrzK519usfesEOy0bChFry8mzfK0sRq+OudkDXo1kP/5X/TKzEuRQ3guIKGJmJuIZI+jezIy8cLrYegGJzDwEGiNEhjWVZ6nb71G21joFYhk0aheHENxf6pESFhgNUYA90xFrFC90AQYIwFzs+23QCsVeCB4S4OycAMBIHt+kDCAqmkQSI8YYubKAE5EKeDhBSsnJHQPzMAwhhBrCoQVDVBuJqmLYamUYQM65BCREB1uqYECGDCHSMAbEqmZ0BldRQOSslEUwxGF3oPEOx4OEicY3u/0dDbsMFMLAUAJL86K/+iX9P/7d//6//M//85u7u3VevvvTH+bnpy/e3o92/PjDP/34w5+OkdLlsmM+n89vvvrm+cPldHx+93CvOS0CAcE0ByYwzboaiKl44CMTrOtliOH5+Xh3d5dSupwzgOakh/0ka7qcngBgZt7tdkx4d5gul/mLLx8ef/rw9Pw0DTyMIUR6evr0cnrOaqcXeffmzdOnD+uSwezbb789n89hnHZTUMj58nK5zMngcPdGTlkvy2JryqAQ9oc72MWAOh+f48O7d2/e7qfJdvj4cR6GODApWAKY7t6ktOSshGFZFjIgJAw4MIFkVA4hmOkyn1OSEAJxHIaJY1CA9Xw+nudhGNBk5J3vNTUjsgBGpqQEaqDiuyMbkSpTp9GVXVNcVWgRShib1d2QTTNYNkmSkuWkOZsmAnWhETlA4IAAqKpZVYDZzOkcFYvjLanaboyqEJCQLPIQKaf1ZJpOxzMAQJLj46PkNTKFQAYCZibZRI0QaZNd5MFVqiKiKbe9cDoeY4zE1FyULtBijM0oS4GJyNP4vLZvCMzMwzBQYFDLolgEtPvDKxmwH/CIXmhBDUs1ZQTwHGotyfoppTiwe/xyzuInMmEIxcO26QYbSNrscR2+LCFGvBUO60XoZ4ADNucqkIK4YDUzdi2mOHfcTGiAwNXqrJ4LhsilULJnIFitx1wIvcEyGKCWrGhHHa7doRoZMqB4WESx3KlClmHIERLJailBVvDQbcyFohtNraDP6nr6ues1pGsHUD3RunG4Oouvfu7r6BWU7MIvbke11fNyvEEASM7zVvLCtnA73N7Yfgj1iEJTX050DSg283pDI/V03qJATTcYXlPDCUvMAoDVpAxHGu1fK6csVAMxAJuaY26qRnQswUKlcnBdok68DkTkXa0Nu9E/WyM73OJ5C/Xcd7TmhjrYznTy+8AQa7Zqm8ert6iBARnBZjLHoub4RjcnnW/h/wQ1IMrnpBtPLNUVsHVnA/dW4Hod6VdA3PTWVlsf4kFBcGUXd5auUkqiDdeGw3rDdPu+/Xv1uX3mBugLgfWQr1/rVCuEE4B5iJVZjZLSBqDN7U4lGP0WdZU4LTV0BputAb7S/pL/DDtVwOvgWr8IrIOwPr4+p3qjjBYJXAy0fduqDt0Uzfq5tqFoKpdvyParPsW+AeJXT77VWaGzwdyshhsVEDt2eb9BtSR1NFuyiyurxbd7JP1frgiWt19rDjcPsWsdoH6lnYAr2/vnenfT01u9qFuCr7+qn1RykiI1toAit1tgyzb5mUf17d9eitudDVX3N/uBmjAlzmddj+uZ2Q6RaIo8sq1BknlONhFXnsFiDzP14FZgphDCGAwbClfLkkGAKq3nwF6KvrSkWdCxeh4dRnur/O8YYyBwOevVxTxL223/7sN1eCEizFsUlocc5HQ7Ba4PEJHjfsclWHPh/UMmtFpXSFRzduKRkqmPTGzsXjlEDN3VWNW8VSMPxIqRw3AYDm9purMwKU847HE8cNwx8TQdpmkKiKBKFNYVNGdZ1r/5+1/82//7f5fXyzIfv/v0h2kI77//7ouHe7b09n5Il/N0P6b5WQyCrk8fftjvxvO6HPb7y+UUGQFKRVvVjCrn89lMhCAlC4Qqi6QcUC+XCzNbTsTo6HddFo9ICSEsy/L0pDzQb/7m1/Px5acfPt69uUcGApS0hBCeXx6//uLb4/MP94c3jx8/JMkhzXk93+0P5/M8TdPL08s+Ylrlfv9mXY6QIQx7WU8//uEIAG/3e02zXC4pxsP9Q2AE0GE33b15y+N0N4TT8VkXCUo/vf9k8Idvv/2SmWVN67JIznf7QwgBmb1gNSCrO9iZkZljzCqEBQoBmGVRVKheHEJVYCjMMZBN2ai519rG8hQXMwP0CgAuiV3Ny2DivDS+rsCMiis2mBk1KhjN2WvhiXsAyvp339Q4jCJO6auMNAxxHGOMvK5LXtZ1WZbz0UyGMYZAqhlyVbmxcF06LYBmQYTAFEIwwBgjIno9Pm8eVgThFeqnaaqB0MU1J2LruiJiIEJgHuIUB/cApLrbGhQPSIoAXLx5zvfQAHrb40Sgql5eg1V95zqGxxoa5L9qsf6tVvFrueo7sezT60Sgq2P+c8aR5o7uZGN3HlWVAwsKQkOrNHWbDxZAkYwAAxV6HEIkAkYjBrwGygxYuFwACFFQAdUQhEwIJHIKskBeLSVNaqIkoFRCq9RzJYud+Can7ea66lS5NuqnmzG06/+svSautKqfGcNKDdPObgBssfgdUjQAwE2Lgwrx/b+33ADHCcXXDb2BzKBYhVg3pe8zvpp+Xuq/lYao/OG7mQ0MSpGyEsrhS96x/c0omXm+rJbKq51RsoU2QYVmt6N0+8lro2d5jvfzFjvZ7c/NwPMOwGO6sHoz6llWZ7CvCewZvaDYasiWvIhSULrqdFbMxJt6vLVHPQ2y8p13++uzi+pm+ZUzfQM2n8NdYoD22WLG14rrq3zUa+D6F65SwRTN8yYd3/co0M8LQ4/4AoXik1XXmzbw5EOIsKVRmkGX321YywkYGIEHO944U143t+EeVCu1ZhpxtKcUeTKNFfs9mjNdSDUUU8kPMXOu0YBozovQRt0Z+bmEntn2agAnGoCWXI+4uV3IrPDgNmxqVRjVGSIAoJ6HC6+muUlM66wR7q/vpxNLellZgr7RS7LvNhRohbOodmkLdi9X9Vy4div9Z61p17ofQN0YWFw+Jasb6vZwgxqUtiAAOoleeVQ3vQBghlS051tPq1dQrsrNlW6AiACt8kD73HEkAnhsGFZlqSXvo3V9FLdNIvYz0h8GbWZrw0rNh7YsVbMgz7oe1/NAOCBOvKNdCNNoS0rrYppBHSUwoToABwCsdJ9DIBuBiIIYUQBCyaYq4GACIQkQkWfdIRaQBrXqgsMYogIF0EjAAlGMkau10aFMDEFVPYRYVfO65HUx0UAUI1caQaPigvd0xq7Aqu9cbfhYU0rMTBzaoDm8c5CRszo7oWMpIiLCIUQDEckgEpACUiCOxFkK6aHzwhsichzDPuzv4/QA0wHiDuIexz0OhzDuiHjY7VxfQoQQ4fkR/u1//9//+pdf/4//7n+YXz6dXj5OI7+ZwtPjjxPnp5++e7g7/PT0+HC4M+TT+bJ/8zDu4/F0yclUVkmoeQYckCwwhhBUKYSQQmDmnFOWxMiSjBBABU1BIeUcApkqhwCaNZuI5BCA6HQ5o+S8Jsx6uL8jog8fnsYxcgzzPC8pff/jD6Z6Or0Mw2Boz08fv/jiix++f/z2q69NlvspyOVFVuVhDIa7uzujMOx3T08vIrIf7l7Ol/Pzo2gOge52k8pqZvu7O1E7XuZ5zllht7/75qvh/uGNikheEVE4aE6W1mmahmGYxj2GKApJsogGimGYdgfMsoBkdFo1Fc0l0VYR1EBMGYApGDmnbzkDqMj8klpl1e6lyIriDDBEjADIWUUBmTkgjcEIIYIKDYDgSE9Vk1o2YfCUu5xzuqgCIEVyRA5kHh8vOauqEWAMYYiRA87ndTmf8roEA0YCMxEhQ0YLzBQHpKAAnq0mqpHJTf3qzrqcL+dzWWBuVXb7LhCgW/0LnW6VPIpogdglQ3HWGSBAIMhZwdTUPC4OQN3qL4DI7G9RVdPs6kwTd8ycay1tEVHLSBYAiYvBiTx0pobe2RaL71MW/Jgu0rRK3h5wuLMeK9v9dspjTXBEqIdsdU1qOeFqDHCRnESkBOwZAtsrXOx6AQZPpTDvPoHjQk+tRiPUjr+ZKmWOv0UJjZEje/rvjHmWvEp2V52ZqQiWql8FYFcg0g79duh4wqwZgLmJppyNQJUFzyrQrBWTWlQ6VKxBBmYodHUwQo2M6ABcARZSjxTsz1KEQr7gd2L1A9SJ2PIUihGt1Hl1DxvXE6pklFUt7LU52U1gJfnVn1OsYgDoiHnDa+X3Up1yqqbQLP5+crVaXQWJeS1c2Fq+KTBI5rmWUPP9PGegtq54DqFY2Yu9tj0E6mle1psWrcaa37+h0/YrABNDz8BxTAbodvoKKdy+T63BVtapFWar6sQwM5XqrwMniSqdg1oYsbSizLY6a6JjHx9TQK7BUZUqvbwU24B5Bp/vLKvBP9vSKFZqA8KigGOPprD+r7g7umVW8OemEtbFBD9zhYo1sddgaiNc85MSHabbSi95Idh+67kxDkO1xslhXTLNKAtAFUjfUtDUnl8jvwa/Gr67uWrfkOpwu8HHHV7o+QYenobGSApIV3oHgPOblp5f8f/8ZS2qm86y1X0L3GjMdYK9d7dKW8uwqdfGngGor3R6JcYag+hS28k3wC1wdlUBzv5C4///vl4/8y+8oo5M031zCIOX3O1FXfujr5f5+tu2SsFIVFvmUPuciKSwkQDUkfd5cSzbVuNf7iAASAlVYnD1DxERV1yj5osup0SHON6HCUeCkWEIyS6gWlKKEZECMjEHyXVhEXk4HDOPZmtWMxRMeLWEMiB5Fl4dEMIKNRBLNQADj1nUaBFrqR2P3FXLZhZCTPNFNZiZSHLzv1usx3EYhqGF/vvsNAWgCYEW/IPXOurrOYUKWfyBIApEkZgDmvGiKkiBCDr7h6pKNsgmYisoYOA4hvEAYQCecDjwdKc80TDF3SEgMZMfKZHDOMAPf75cXo4fZbkcn+bT46++fffnP/1hPSeThSzt93x6+bQbh3W+GFJgWJbneZ4Ph4PlhRGOx+fdbrfmBauk94T1EumuFjmcz+f9fj+EkFLa7/cpJSkpqrnVV16WRRUWWYkIKVyWOUDIy5pSPhz2SXJOGQjM0Bh30/70cjSElNYQaVkuZvLh409fvH03X46Hw2EM4Xz8iGE8HA4fnj68izEyHJ9eOKcwDjRQAEjz/PDu7cvzOef8fDzeTYHBAocQaBiGh7jbHfa7fVTNgXgaoqqmZV3nGdTymnb7uzjtKIxAjHFwHrgRw7rOJppUcs4m6ixyIqJglgiIKHBTvLNpqOdfL0ZVS8VZcH5dj14zypIRVMCMjA0RCE3MmSTco5uTLwtFADBJAkYcpogCYGaiOUvKDEzkxaFQpHDwqGoIwUyyrFlWUhQJKa0oOlIExMAhBgaKudSNwt04+DrMOYskZjZVERnHsRfaRIRAamomWBMDigypoTjlZjUBaTHdWOR3NT26WcrDeIg9tUZEcs6Vecjq7i7I3k9k33rE7DFXfhsz27V9xMxa4IQWDsTPi1YAwMrQgjW0stzcwbgic2xzBagZtVqSnVe8PVn7JAQ0LjZjYCAmZEJG590uMUWqBqiILGDqbE0OPt2ohGoMGlEGtIlmzIulBVKCrAXkk4ETraLb/31EPMgY1M9zKv+WGHdpRasbPjHbcnB72FNOmBuDd1vn3pHNHa111qDDpI2GcMMnAFsKid9KlUyzyl5gZtFNJ+zrAxB5yGtJVr6Z3PLYayz4+nJPQuvgFUrp5Hk/JDenpa8Wc58EkFNo9uFP/kw3P9VWmXZupeuneRj4VRvgytfxWr2xm3/9NqLamGKwd+1S2r6EhvHKMvTNW2LbdNPfrlDT6yG6eq+AceXSbVU4rKsxdXXqbdip8jvBZ9/VTv9SPKRZq3XzBvwcjNFXIUb1sZ+/v7EAbS+u0r2UQnDaK7dqILmfyIN9sGwktwr5YaqGJTzK6ysBAQMUNiGsOcGqZpaNkIjBArKvdVce3dbeT/MWVW8ggMAlsdNLKAeAYksoc6tooF6QSUXAjIiBiq+nstZ3R5fri0iAVW/2z4u648qaQUsucdOO1V9tmx8BnLaJStIAYm04mGRExCuNXxGpVDOATf0CACQjwpI9BdrpGr0QQUSEUoZPTSWU/BwBJ0YmBgAv2NHC7MoyAg+pLtYFFbMGB52muWrJfufNoumWzBa9hVXN893uByTKxobUzs7aCyiqGXCba+xWbyF06MPDjLS5m4lLzA+WzBH/JdWG+9bywxiqK9xHrRGfmdurEGtI/aYw1IwrJSKsvBhEuFpimY9g8YTjjt9N0/CwX+fFAmgyyUAKI7LLtSTiJYAd9CLCOMVoKKJhtPNpzmtSE6aIZipaYg9MyJAQAxIzu4st55xUCHlsATwYiCgMcRgGk7SuaeAwjiOoLctiIoe7neac14RmkWmME4GN47AsS4xxv9+vl/l0OqnqMAyO+arsJjNb19UDkT0cKMbobDDDMOSchxjP53OMEQDO57M3KYQgYufTeXxz506zh8PdY8rL5TKGGIk1i6mFMBDRPK9K5/2e1OgwvQEK2Xgcdrw7TPfvFINiyGJxjNNumqbRZ1ASRGY0fX56XE7Huyl+9/t/QlvNEoG6gSmEMK8ZRBGRBpI1kenp+clDq5l5WZZxHLMpAQogGB4vMwHlnGOM67qOYQAxMUHD5bKg7zKBMYyWLa2yzIkAV0vGvKSkS8pJCdZIgIgv54tiibAFgCywLjkgizoPspkZMyPay8uTmc3zmWi4f/Pusurx5XE37fN6zqv88hdfp8sZUQntdHrK5+f9FCLjbhweHt5RjLshXk7H/X40wv3uQAR5XQ53+7ys5/Px4c2bgXCeZ0bdT3s1EZFxGjHGZABgw7gDSzFGWdM6LyEAMmiWeZ53ux2YAZdIbmBuh62IqLrnpMSxEIFIzRMp8kQBEhogECATDwiEkJG0+N+yYOGPI82kEkwWzQJI7u3NomiGRGDs4FYVGBEsILJK0lU1ZdTqGi1UmMCAFAKoRY7u7Mo5K9RSvjmDimk5kHNKALrbjYjIXPiynPmPqgdxWZZ1Xd3H5Q8kIkbuCVKoUvuLGNcjwrUgqzk8TfoRBsLAKBgc4wc/pJ2fokXcETNHrr4vVJN1FQ7+m3IKeESoP9/zE2xzJpMZ5Jx7hOEd9OoK20mkqjXuiBFUcl9z07wErioRhpqBoKqWk0YKhCGyCKSUQNRzmAHUszWQlJkGilwAohoYUiE2VjBUxSrGDUHMLBJOIdxPtuc1wAXSDLKYJFCByjULmL0aQ7OaQsnU9qCpEjZgiMjmR5iZAQb0aHCAkqkIgdjA1KSFKvgpEJitVj3wI4WQC6wvx7UfFgSAgOq5iD6aSIUfxgBKnaKOJq8e8RvMZY5mZqXkD90Aej+jvA4AFFxBAGCKokah2IPNClbp3QJuE+/CDhTxtiUNbt78Z1kwZqCOdVwfLkXxiq+pBTcYuBLgWSvseFvVkz/rQsXgxWt00zGoYjmoqMzrroaiddeTtx7x0tEZF3hlAACSHWEWLFFWNxTOAyzExNZOcygGaNdQil5YhrEhnE4PyaUuRJmZHtL4Xqsh54QGkrLnxINzIlWGZIASDoBIjazcsaJkUayFOItAKwW40APtazyGW/9dhdCummqZLwxVwwPofAWwLYnNbwC9AtDUmoax1DIWbRNMcwnovV46ZuCpHsxUqVu1vM4dSoUAxc2qhoRG7lt13PZfxJ51o9f2Ek2bQb0UAjMwIytnL5Y6U0DlIaSghS+o7Kcy2e3xbRz8/zmMbm/fYP3nr6KGNqIkxKJu0vXD27uK7G6xPO6erbN9PQIGhR9V3ZoDYFt+9pVOvP3br4/2LP/OzNq8byJDijt4Gwe7GvM2dK/H4dWu2P7dbr42Sn32k6ZLbKLhytrhxTvK1r0OsrwWf7BZ/OvNZmbYbxu76lTX601370wikjUloQVptnWxtPAQJo6HkaYBBAwUmYCQiJX8KCpGe285M1faOQiRYmTMiMRE5EqleLCZH8bMAUkApRpR2khilwyw+a9qW8GEmckgZUkppbSiZx0QaBYDcBDQDPweOMTMUFlHAWBdVzMbx9EqxFGDllHAxYpJMcZxHNd1TSlN0xSIA3FOGkIICKpKUOpBi4gZUAghjqp2PM8sBsY87rOBZtWgtuZhhH2ISJHCEOIYhgKARNXQ9lP483d/+PH7P77ZjfeHCRXxfn98XtR5FSWbgWbTnE0A0fKyemkUK8HlGsIATJd1AYCMSFoZAhCSGpuJiNedHWKsqwICcUqriAKYiNYViimrqomBH4BZAQGUTA2MwO2SDOb1uQDh8ObN5XL22ubzmiWdpmF89+5djOO8LCGOwECk3//5j+N0eLjfndfLfr9/efn08OU3PI7//I+/fXi4/8233wzDMMTx+eXxh+//tN/fvXv37jKvy3qJTN/iV/txQsD5dFyXy/k0vxCZ4f5wf3h4l0XCtMc4EFFWCcwcyFFmnhdJOUNWsGVZKDDHUNGnWZNCvhNE1LwGkBERFxjqqdqV595XOg+ogkhIAdEQFFSyrL6BxS0cHpTLyUTRxP3JiEAoQogEIhlEveiW76MQYuDBXyQpi4jV+HgviMPsQJkBLPsx4DHjr+ziWP0//rSW6IyIl8ulLl2vgrzhM786qYLOJ5tzVvVhAUSsQf9F1KuWAkBEBIBSwTdULaLJLJcAzS1QURM3qVicDDXuvKnunvlzJRHqX1Q5iOBnTJtqm0qDiICKSgDGtTBC7bKIAoLGIbo5xyvIEEPNADYCJDCPTizJAk5EhkolYAkM0UvMZtFsqgTCKJEggg2wRjxrOkNKklcTMS8oSZ5q4iJeVbfYiLpby9HuBrlyGvsnxU5X/+0GZztliuXo5lRqO6Add/9fwv7k6ZYluQ/EfIjIPNM33HvfvW9+NaJQqMLABidQhLrF5tCkjG1ir2Ta6B/QRr3StnfUpmUmmhYymSQzSYtu641kkpkkWrfYoiSCAAkCZAFFoFDzG+rdd+dvOENmhLtr4RGRec73PTCt7NV3z8mTGRkZw8/df/5zqzU6EdyvWLDgfOe1mYt3ftQ+x9kujGaGswEG4KOXAKy47Y628VNHL9hJawGmYMXp+ceAoZxQWnuPq97mHQVluoipms+pCfjNNvuZBmTjrflcaR1+dNlyr/mAnBoGxwN1+tUUMykga3rFRvUFQZkJClDTkwDIM1gM3WsMMxh4hI7MzI7SRcp896325I14B2hV8Dv9dvZ3XTfKeKOi1t2wZnWk+j9rtZDWPET0gMD8vjNUNR1332Z7180AEKvWWD1JfD2o6SitOsJp2isYgimgNWbUbCRVhrhhDV4Ub1rxXB8fsy6ePRUgIrraZavLXLQIiCah+PsOU5+QbjYSgZp7AKh0q8NFNSunIYB7waF4yi34q2p3qS7jSX+sfuWawgVvUh2bVZmUUKsOfVtEzKw4Dup7qiO+aPvA0YQHANdksOqAmDWqeA+otATA8+7LxDvuZPCx7+OvXho8flRHOJbLeBI6ugS0OwMM5jZAm/bVIi8DRrA6YgoqR6/FdvRyoT493DEqik++DiSo9n2tcw510ZzeNlSgD9BsA1QUAAjIZjrLCmizsYkcG84MJ1c5wCIA4kIoaEYAaVTjBDuj67DrOawC0XrB6wUIiKWCzZlLjEUmxSfXxSNAJFKBWHC/eMzFs+OpxLQtVljmNC9ET6TzZahEmJokCBwbMKpKxCKSJYmWBMc+dtCF3e3W128R0ZxxqhJgi8Ui2wRHzExVl8vlOI5lOZtZDh65cu6Ek2ScZuNDbhiGrg8YOGdBYgBIKZkhhw66CMwZSm7mYUykw2ivJQ5xLTwCHUS4f/DWY2bmLoYuYih+nSwiElIaHj64DJheP7u5efN81eM47EMgyTnlDGZgZEDm6irmfhESkZRExLISM8cYkQtaJUAi9DeekkhSUCTiwJ0ztnPOU84PAWHwWKiJZkkiAmaBiBRcphAUFKDQMRDELKAiGBBeXd+KjiIxEESm9dkFI+6H8TDIxcNHxOHnnz0NcXlxfhli//HPf3K2WX3x7Gq52ux31yH1ZEIIbz16sFmu9vvb29vd4yfvrDfLw+Fwe7198PCC6wzKOR+GA6Gtlj0A7HY7JiC0NB6SQQQkjqo6aOosYtnjKHSRAse+u7m6joFiCIEjUSjsC0CsCXYt7bt4VxnNvOwOGqoCKJC78N2gRfQUSSUwI9OEAGqgGcSQAaJPHMOkXlHDAgZDYAZFRXEMDIoErnkbQhdjbEJaqMaRPN+ZAAPXpHNDVAUUU1TFwqgHaYXtsUoQighO37ICK8CYHPSzgQGgiBGhE8iRCzLzIDgTMzMhZlO0wgoAAFWoQQUGo5w0Z/+AsXnUSsgUzQxVsRZ8DASBissKVQEnxoi7DNpURXT0j2bGbJURaqpqJQtOsWRJGhFU/CwnwBEAyPXHCBBJhMWyl3sEUDIkd6c7K0BBjVy2ydVCiJztZ4gex+bq1HQHqbuji3Kxl0szAwETp/4H04jSkUSTaLsgO8kDSjYRBUVCUzBgdPma0vMt5QvRtdPaJjZtEDgr/1QAXAGFCjUHsu4gjIBqGarURBHYKHwMbMZDhXMGAFW7W6sNUL61IkDu6zO2na0iCoTiH5nRRXTaM2cqI064QAAEK/U0Z9iDYHounlBK+/Ed/9289VNv+FAsyL02CaQwQPzN+ubbSnEdi7K49l8Dcu1eXEIiPiYbZD/a39uDlj1uyoqYpeeV8H39X4VM7qgtbIiawVwRNpoVwVKndTSBmDo0zD2HrQn+SbExjMyACSu+wFKcS+fd61dyA9F7w9dDxZrfODcACnqxNuaAANFKzLi+CKz7vJeors/rV/FxqAiIrk8Mxaqfaz2eGoQnxoCZhTlumH9Ru1sBkMBLrCkZeumTOYBDdEMCTAx9EZ+xoPwtlhQfKhJWglPjfET4O5w3tP38xIiZ35qgioF6UEHNwAvjOq1wwtl+vvj2jcWWh2rR08n1GyCupuZ8gGKRH75jf09UomnSQgV/zQM9b7+ZNNOittbx6F23QVHDbKOo8VVKahdO9wI4+e39R5m/rR/M17cp7fXPv0x9L3b3Q2zFDU5/4gk6dPKT9t8vv0v7tmRQVbbr6fnNhi4vDupEvi+VXmcFSr6k208OAzCxfJCBFHqOPUaExaIPYbOQMemQhQCYQt95eqN6CM8KnnbITkAZjJmIAXNjhRkiiCS1guzdBahqIQRL4nFzMxMVqgSDQrUqlp5TeEHMsowpFQJAjLFYDgAhUM7qDntUcxe+u9O6rpM0DsPg4L6MB6JG8W9ron/rup+qGmMXQhjHcRwzcwTi8TDmpDHGpKIIihSXK73dDTlR7FZnm/WDhwe1V9c3rNvV5mwhSKsQ1wAARNT3MaUUupmvod66W8DTp0+fv3z2ra99sL+8vH3zhWboY4dkouTURAQ2VMkGpl0XidBtHjATUYWUc45959SmnLOTGxGRTLvQYQ/N7epGjog4u4QYG7QqDBBVVQsAMQQi0jQqKAEpFGeemJpBNiURQDUTl4BVVSAGwmFMu8NhuVyH3Q4Az1bL3TBGhmHYqgyR1zf5EOPF7vbqZnv4yle//vDB5dWr18vFIqcDEZ2dnS2WnYgMfDg72yz6GIg54Aq6EQTBGHC/P3SBkMSTewNRCMSRGSjnkokITCCYk3jGCHWRY6QQSkRLTbSiv7K7FwI0YXO/TUtu2d0BCAOggguNo5hBVlUVpOhK/2ps0DQoElAAswrBlQhM1YiJo5k5Q7GRzpk5hC5gIGDgGLiLJc0W+tj5JCqvKYsCMXr9r6nW9XwFswITSgFs9y63ahhQ4YhHCZwL1EDMtNfUKn7MTMSiKllyziF0HCOapZSS0wmYEDgEagQhns2vujGWx8QaOhAzz39AdFunViCmsmMiolkTEcpENOfzeJuJyAvDtZdVvjINBFa8LYAIniPhQl8AoIBIhlRyMREMJEMoCzgze70zUiM0xGJLFGFxNDToOAATMwGRFge9kQFyQDCMBB1px2PAPcreLBMIkCCpe2TKxdxNcuwbthlumT1v+efdrQLu8ZqfwKETXNRMi2ldOs7oO/nQf/Rl50B1ls2+JdWGPiYvvq/r9963DV5ogP7ufe+0+W5XTA84A2AANk+QnP+wMBJcL6BYOGQg1SWNrQ3zmx5ffP55uXv78BiZnF5hNnlP8eEc/ddkXKu/mk+rEqgxAAKal5iymVXTuuXkD6vwnejonc5+RUeDcxqH955cvphyafx2UNPwYGrACV6ymrBXP7GTb+cdNf/Kj1petBiCPiWqPW2VQ2SeXAPu3qii7zhVZgWfnN7HJZxSgLJbcnjPoPMRVvqmGMp4kkLRJmR9OL/ynMc26y90CO4BAvOXVMQNwPz9e28e98XkXXZLoOSL+56mqIhUpaAQsXqgHXBTfaPTG5Jai+SE3uTLzfQWp+CRzgCuTWPkSLh/ntsxJUX4qjr9qMw7bS2cL39zkeG5/4CMEDCbApwWEJj189F8mKZE6c3pfzAbYTT7fHbdkoB1742gLcQ2C4uXvvTiOHjcnNYqAijkPziaYAYAAmZgPGt5AQGE82vZzAxARN/yoFVlLqMRk6VB4Paw6yF2HYfItOpxe7CQxABjF7pezCwlr5DLqqZmBNaIAUw5x0XsQApURcSqDaeIoREGbD5mAEREFJCJKDBH/4SqLIOfo6qElnPOOZNpSVoBB7KcUhrH8XA4MGDf946TENEBvX/l5H5EzPUIIUBNYgaAlFLXdao6juOCo8PiYRiWy0AxAGFWEVVRENMMts8jxtit1hp7JTYOGAiHHJHPzs4uHr7F63NebbZZbq7exOXq0ZMAyyXNKjT7Gv3sxfjgrQcXFxfOzP7oo486slfPfzEMW1Dm6gDRBF6+OTC7/05VEaDhvzSMBIiRTLOmbALMDASHYWdmXuQ1Cy0WixBD7PqUkrExIpKpuEssq2UyZQNCjMRMBMYpKyJU/hcyOHZR0WQZlsteNHsIQvN4c7Nl5ocPH97c3FzfvFku1uuzs5TS1ZtnAHR5th6Gw5MnT5LI2XpFyE8eP/rqV7+aUrp583qx7N+Y/fjHP16fr7/y1Y8uH10w83qz2d3c7vcpAuScmGDRL0JYXV/fpuEAeMurFXAHAydRQ2AkBSOiGDqmIJxsOGSV9dnGfdqzeUrNqVYnKTAz4yxPZ6YSUyaRIQIrgFlWKehZRBiDZ1chEmIAIqRkiDnvFUFLMhaJJBUx1RiZqSNTlTGNaRj2KQ0+GokCUSDAwOwk9SqNhSomIi6Ba8Vf7pYKzLwzaGrBnet1GxYRX2Vi7P2RHfyplQgYlBxH8hC+58EZAvneAagGVISARFp2oaFY9e4DI6FbUwLmllTb8twC9Vt3rlmEmsByym51IiJAEQUqK1V7T/UAqHKZdXHTmrBY96C2eGKFceVTLJl+xoEzePFyBQN0p6GHzdEM1J3ujGBm7M431ykALCu2709mZuZ1wKyx9K0szgiATBDQIkmHQ9AD6w5lUBMDteL/LrvZJObj7mJpC37lIR9ZAsfLe3neho3IwKDECtsJ81KSZkoOTqgwEWZ7exP88X/y5JYuu7AjGb8j4rSbTLH6uQfSqVY1E4DNfd7V6wcALYpetnwl9zpadVMW3IXt5hVBTQyZe/rkz+kxMwEtcvtmU0oBIoJC4bLTFF05Ae7+icqcwuqNI5963sOtE/1F04SsgMtM8CkB3hetqTyLDzigLLPbrAX80VysFs0HpjqqdZhXnkX9v5ZLr3rHV3b2XSvSxUPpBOTBxGyZIN0M63uQv8DsOgIRIHuOKOIc92rF2DhVBHVmaR29U6e1u7boE1ZnKxZLs0K1eWvD/H42s2wagPYOMzMGJANGmluUWvO7iepQL4ZhKR5Zwj3kgZmSFWFUK00AAFCpB1LsmCOrugEyxCOgdu9hVnhKX27um9bq0O2CzYjG6vuf30tKevKkDlQb47c8tQ5tZj427iFUW5+IZp/4vUo/1BnrzdD2Fhz6l5NpmirzqTgbAfNPjlt1bCO0r/xH7XmP0PAdexGry6KdfF+KsPuh5yZTGXh4x4OCxz6Yo8e5x2ViNe5mJ4OhnulL55Gw0ukMmb1fM5P70lCsetROPjQrDkA0HoH2mrZpWHFaxkXoI/cd9zkoUCiOYlBFcjN+KiGOnhqoxgFD4BACWEkUUsuNDYxVLFygJX4XcD/b4sn90xGBnRxmrtyfyH3MkqHOHb8FAqhqSinn7JMxMCNi3/clvCDiMud+pJT8FiklJ/M4KNzvBjzOG/aT+xUwx7BYJINBVQgOWQwhi4hpdlJwjP3Z5mxz/uCJbjC+fn3105/+dKewvHy0fPDW4uyRmXhagrcdqCIzs/Ozbrvf/dmPf/Th248DwKtXr/ZXrwNmwKw5gWpwv7uLCxi5XKOoMmBgNkIxGHM+HA4G0llHU3F5RKP9Yd91XddFkSmq7hESMxOVFg+ZlmAAT+wIxBAiGogpmpgoEBsqIhEoAYFqGgdwK04ETUMXA7mzttR9e/n8OTOD6aJbpMM2GS03a1UZxv2DywervmPTb37rly8vLpKkxWKhNvaLzkwMYRjGoetvttcyjJCH7c0NqTy4PN9sNjHwIQ23+xFubrv1frE5i8s1x27ZL3I2ACUCRgpdR5G79dIpp0wBq8yLK6SJTMJQzX+JgGqiqqCuZzLFfrHO5coY8TQScC66GxFI6MK5CuPYIuyIaqri2o8SY09esVMhaxrHcRyHnLNnVYMhAhOGqrQ4TRZNWXJym7kuudPq1OZ1WdWhfCKeeuA5wbW2EdTcBo8q0BFdu8DrkqpeImYZETFwR+jgSWfiEObhNQ8lITS6f2lhPW2+dt1dJ/1qRDTJ3Bw9I52UC2gGwGQDHDs4rSrDu0XBzIhEDE4D9BWmJKGaFfkLj7qhseMhNKqCooWPUQpfQuslMCraP+CalGjqldUIImugHGxAHUwOOan7+xW52jlSbEdt7f8yrD99fmf99/8yTDqMBqfnHEE3X8AbbCkfct2gj7dOKz65kxc2gZOy3d8Tc7YJvk+PUIhnio1/O//tvdc5vuBpCOKoc9rfePRtwVKnm2nFhyDF81uqvx3dDo6H65e1kI7qIRQDwMfFrBnzi8xp6gZV6Oc4x8Bq16GqEU+YdvZgClC1/723y3JmAFA4KbXTfKc7aXnxNM3CaPOntqP21we0MtpOB+fJW2ggCiBnwZp+016CWcsJwTlgKDBrwpan4O24hQYtCbhOS2f3CQCAqMdaAQ1B0UxBAEId2N5lNnuSNig909kA3WZHgKLvDNOTz5IhsKzYdjz0Z7N6Nv6gRCQAoND/vvwoF7eSvF952DPEitx6XNvFsYj+O8anIk9kMDMDbLKnvU8JwIuUHUVwWjtKbyFSNWn8SYk8VjB7QGrVlO3oq7rY1Yk6n04K06IwBQe4Jj9Mi1GplnDErZrN8juQ+ng5aD8p2frzM2enoQeI+E7IsspQA0DtY9+SEdo7xeLJmO+p9QL+FHVUzN5F0bGeJg/aTOV62t2r1CBCjQcBqPswYN69ZmZYDYC2E5T2SDLnmGEe87A1XoXVmhZnse9WCxyBRnHWBAKjKooBokfkW5+ZGbiWeYyqBpZTSiIq5uLaFW2IZBEj5hCYCQiICImK0IUDU8Kcs5cYg9mTppQoBKciWIEsef4q3XcLJWGAXJ0QABproqTe1srNOWfAqQ4RInqWcNd1bfHNpsOYugXFvjsc9jgCB0ySlXDz4OL5ze3N/vDg4sHb739w+e7bg+H2Zve97//x6xevk+LmwZP15VvrxTJ2UfKYxoPmhHgEmLLIy9e3X//mL/3yt7/z/NOfhTwMhwMRbdab2+uXBIBoTOpEZFJVpEAsCk09QhEsG6OZ5DxIQOj6jmJwsWND22xWi8XC0xhSEjMZR0kpLZdLVRHP3SRAdBFHRS0yZ5CTJ22i4JDEJ3ZWQQCiQmUhMDIMkRgtpcQUu7g4HA7XT589fHS5Hw6HwwEALi8v027Y7xJ3PXG8unlzfnb5xRfPYuivr970IX7jG9+4ubp+9eZV6Pjtt9+Oiy6ltFj1Dy4uA4a33norAEo+3L5+s7u+Sind3NwsFoucZD/IoNuFCveLuAQfJ1h8XZggmZmrpXehI2YKERE1qZdbQTIpq7qZmeokZO6mkXnlbEQibIFKdBE5dLK153GhVX32Mq+LYVXEPRGdqVlIVp5mICKgIpJEUtJx1DHlwc9vSxOUjA7WWqeisn2MGJhPfN4G4JJ0tXL5pCsA6Nr8Weoi71a0mQERg5c8L8rsRXGi+C7xRF8SwciQsholTwbwmTuFQVvizXzFLE58UJFkJkSFUT9zCGBbIefLFCITAZEi8jiOfr1mzHgAoRkYrd8A1LcVIuDiNUQCBQJUZHR9CzVj5/+DqZmYARphlZb3/rciMteQ4rRH+DJoqEqthiUCIhACEzJBJGUTsgPqQfPo0RFDLvLdaGYEYgAGZKYGlkEncFTo49buXLPxjuQRq59RbZZ2OcfT5c2VTzwHqZZEmK1Is9cFMOUG+Eeeoj3HDJMBUN5UiflMP9JS9sumi3tmSAn0zx+BW2PKS5yN7eM/sMEzz0KsjJeCJQDASqy1NbbuVlpTpxFbq8xczOwu/NLmwWztLw7vWT8UmZli2EwGQOFiNLwCgOoiMzhzYE4vqLak3qcgmfI/dFKhmQkCeFpSsQoqQaiAAB8b9dFnb1YMALzyYcOiJ6h6DhJqF+DUt/NBoo4tjn2ybeyBqwadAkgzw8od8GXKPNf/PnfAbNAAVGvfD6qG08nQDSWp16zUQ1ArtywmwZTiXZeb2VXmvvPWCEUXcCiiVK0GhS/qOK04aITIbSVuVX7vzC7xWOe8l9uIKb4cF5NCF5Hz5YhBTcGoZh1Bxfez1tZcovq+sDivWKBp9k+l1KWYAQYATOw/8FkC03aH4JlVRaPJoMTHiqVTzU41QKQasgCoEUOAVpGtNNqZJ96F5vXn4NikbjB6dtQhbUf9Br4ilmIFAT0g40tDeXxuaJgQrQ599ESwttZABfV3rHyrdjbc8c0YAKOXgEHnDJ5coTA7Z083Y8VRFetEqO+r3ovUBEr+glUDvjQHDIGqLLeColL5zCNPaObvy46uOX8cq1aEGogigAIqwQBGgNu03XG3CRH6EJcdoACQghkCRlZJ5AE8cjpcERtBhDmNGABUB8qQQQGJaktK5zMRBUSgwEi1jploSinGCCqlWisBIbniXh6GjiiGEGPMKaWUvCM9CdJxfMCJiIWetmF4UjoUZ9IfqtLOjzG6QMpU28jMzA7jQIFjjC5lGEKflZC6/WGIy837F289+cpXNheb25s3r7fbNIyhw81mEftNvzkH1f12B93GFIc0JBlNs8u2sVO/QYchv/v+k3feeefP/ugP31p3m36ZQZwPI1osoLZ/g4KYmCGCq9sSIxoDA+ZsSS2KEJHrqOZxAARFTpJt1P1wQIP1er1cLhHx9esr7w0XEgWAYRgaeBCAJNKZhhCQKSdgQtMZEkFCBAVT1cNBPfWCMDg+uzy/uL2+WSwWh8NhvVztt7cIsN/vz7o4ptR3fex4sVgsV71p/spXPtpvd4sHl+dn637ZXb15fX17bWTvvffO9Zurxw8fU/VgbDabzaIHEyLabrfdcmEBbMgAkHO+ubk5HA4msF72Z2dni9UKkUZJw3jIIrimrlKAcpp7wQlbHqWZmaiS5z5SpY83/g8AmAiYGQiZl7gmgIAoqkCg4mwWUADLWSSnrIpVCsVmohTq4pWS1TNo1VRAsosRoS8PVgpQIRGKiLNupPh3GYENGTSDWSW9OmhwCY6ApXnWMgHcQYM1216kKCxXb33R3ff1ePKLA3BVQVdVzSJmzJxVmY0wAJiqmJgzwcwqVWE25UUEiQKiFiIwuCgwkSFgJUZatZcwdpPQMwAgluwdJPCahABgJiUMCYpESFZcdWUPdpxGzBiQ1LJL5puZaoaisVup9x4vm+3SBaQiABhNVoQ7V0rVLqjLqesgNfaMEYYONUCOkIMJ4wiack4+rrxhSKXtUueTR1QKrHLSjGddWqkAUPT43RinKl8/fYIGAkoNczrzdGIuTN4H39AKxpg6+Yil3HY5xEIlhuNjtrN4P7hqiHshy5SpUwzbxdxvadVtVcebO9HIZjtI++9dPHCMDKdhAlB3Ui1mrkJRVZrD2JMnRVBALIPf01fBDf6S+0eKhi4qIw67nCNatwmwquzZNo6pUQ5BfS8v384wRkW50/Z0+mSVz24GxipSnBRamUI1Rb+OR/Nqvm6g6Il1gWgTw34GP2qCeJ2JAA2r+NPR0clQu3H+73aX6Z9W4seA6vTM2fDzYekJZhpCMKyiOFAajUUV02oaTznIwMJ8JE93DFSVbhHMU3KKZ6buXgCkULiz4uKLjSle3oQBgCTFAvERq8oKoFpZ97HmkdcXBy6X77qEhoEdjCO47AwQUWW7GVT92lLqTZs9WFM9QNz5Y2YCioYq7JR/rVR7BtdyYJ2NNkQELKpvDrWs2oJmBlgteJ9/bSS1v6unGRHd1AkEoZSPddNHzcyyoGdO+DzhYneqQnTBaQBfCMzEExbQRyPW3aVN1iIq4IPJX2/R+7fm6UcE8OxDQ6SZQ93lBnxzRc0Crd6eUZ2FRDProxFInQRZs1HEsG7S2Lqx/FXOrwqVrZlluIO0xACamQdEoWK2YgpiWXemDA2rvsPZ64PSOwaABKZmmcyrPBJUh54DQ0IgInX7wMTUEIHBqQ2marXqAgCAiSd4aLNyQVQMPGNRKAlkBWbEvd1eJVxzeLBaddyl60MeRQMjUxqFGcY0mpg7jkMgZiz8FqNIiF0ANUl5BFXNoMQdEYOZKKgRhS7yopNsRpjB2DCEyBhMPPyZew6MaKLLLjLYjdyoZCIyE6Iuj5LGHLBDpSzJTMkgEmc1QvREWAAAgTQM4zh62r+oMWEIYRgOAA6MIBAigCP7POTNcnNIIyKjESiG0InquNupjBcXF2Bye30TOfa8eH59vTl/fPHO167H/aeffhpePXv49sNFp5uzjsdI2vXdgjneXu04prO3Flkt9h0xhoDrPnbEqiqmRpw7FIX/4D/47/7uf/uP33381stf/Iw0bdbL/bgNPe2HsV8s1/1md7vNmPMwMvNhewtoIXDWDIhMPGazACKwH8dOFpRl2B00javNchAZ90MfYxLrY7zZ7sYsqrpcdKvVgqtRmlIaTYgwiTv2YDDL+12MgQhDxzkLcNHaEkMRA2ICRBAKkC2zIXrtWSLJ42qxHoZhtVg6BWuxWCyXy/1+D7E30Tdv3pyfn7/99ttPHr/T9/1+v2NUZgykb11eIggFfufxO13XBebxsE85WRrTMCDoYXf77Nmzs4sHbz1+e7VYDrinbsFdL0AicvPyVXx4KV04WGaKoYvGneSDGapCTkpEntReVjlVVSPXIVHLYxJEDsQu9NN3ZTSJuG4lIRgWrzOgASh5cQDIw2Eo2dWIw5gOh0FzIsYQerRkmgg4YMigCKQKknEcchp2wz6Ng47b8ebqZj+MGQ0jO5I3MkMbdGTzCIyaoRehRqScJQAiMRN5+TtVU0PgQBQ8ZRYRBYSJu0CI2HWde3ZVRVWIoBQMtgRHbHtQAREJTMoMWbIqEhBhCGQqw7jvuyUzimQBoYhEqCoEkZ2zKEJEMYQRcRxHUUWRpBYMAdHE1ISVzFM7mJmpoX8PIKiAuv4vFeeCao4czIUDVMHANCMgWmACz752Z0TJ7M5iQRVRmL19ZkKAHNgQVSHnrJY0Jyg4Sw1JDKyyeBEgdCGEgCo02xCacAgUnoF58SsDgEjAOLLKgmRFuuQh5MFE0CIHSAlA0TxVygyEPeRgBlZUm6BoyQOAkgUwZyE5lrESsC2MpJpFYOaubxEUKPlXvuP59+BVuopHdqYoMvfLlNtTe0wssNiNQ5wlZrg6DtXzzRQ8oFOIPd4gZKCWeuk7nCvDtg3PGVAldEAIjMFUAbiNQzMUUXfjNLd22zFtKuvb+LSOW6KVzjJ0QrepqaJR9cE5hBAzC4gAUP0+WgkzBgDsHDwDRnSlR7OJCo0lA65S7QCZWQAd6Ps7g6IjBapqYMREii06DVJ03lr/a4mQVN9/cfODKpqoARWTf5Yc0iKEU99gdWc7olHASrz3TB4toxuaB9yHtM4UnBoUryPhSLzbCEyNqJRPaQMKbSJlmAcI3I0BpapdyUHFElZzHhGIOibT6lp2botJ8rXYxz0Te80GBCWkBtPcWkDCQAxmAAqqhoyqRoLFGoDpVGvmwJfnic6OEmgCQ+VmM1NhjLk1Wa9eAtBqhT/Dk2E0m2ZVBHVmQDnMbRYqICCoai1SRmjm2k2EhYNo7keAmeFlAOSJO0SEqEDoMUko5sRsYler1IedhwjAp766EM+sf0pOEQCQqVEd1SVdyVWPkBDAahE6M5ulBVcjfhpAbrK2HrBq8zVTeDJFsHge3fL22TJzpQOAutgXGNdXY43IVB0kgIhsJVzoHVxWSecyNavp6I0cNe9EgMDMyHutvFKbLIdp6JT/Wh2p/lM4dvq3odDsFkf6XmAcpwwkbxQXcc2a+QPFWCrJyfWi9zG4jtsPZWioGBjpCHCwbq9hm7cLDsSdRkQLyOwCYC5zUftJzVA1u/oTkSFwUB2LkqFaK+OnBgxEBIQYkJmTZCREDlilPxCR618tlObZzqq6jKHvewYaNaOXIUYODJIO/rCuMc61pJBr+KSUWv8Wn6sZEYUwZU3ALCzg4KPxjCNxzmkcckqJmSUfrq9vF8uzDz/4alhtfvjxz77/gz95ef3iG9/+6oPNOxrS/rBHVn/A/X7gcN6FxYsXrz54+NCQNhfn5+fnZpbHFGPEgMN+6PvF6zdv/vpf/+tE9Nlnn6XdNg+3q0UYclImBchZt3lLyKtFvD4kInIVUSL0fcatXnHPFMfdPnXdol+tbIzDMMT1msyyqqoexhERoyoiemUAAvD0CV/EAxJEA2QTVRMFyCYsKM53xzpmoXjMFI0jE4opJjGAjBxCCMQ4DIOZkEVD9DACIS0XAbl7fXV1cfFos9kwxb7vQwjbm6tlDBfn5yAyDvu333rcLRdd6AnB8zdi11kgEznstyqwOb80IDHrAl9cXFC/jssVx+7y/OJ22fdMkUMXu9At3FMXuh4ImaK/8bZdIaID5WpXi5kBWuX0g2aZyLhYnKpTTpRXGFQBAJWMiK6BQ2gxRlXNRIximlSM3c+NbAIZRBUOh2HYH3bb3bC9zuMo4yiCu8OYRskKbJrUkuQA0BEKWEAKIQAYSJGpxupBrIxeQkRm9NkAdfFsWKrkDk8BD1FVD+3GWAQFiuMIMUSMMYJoQMIYWTXXfK1ILMyAWglLbd1WyRmqPH9NBJrAZdkEiQjRkLJKIX7MFls/ZxgGACCe+4ONmU2n6Fx5NHTNK0B0ZjkyuHdqqjILAAaCUE5DNGIEj5pKWdQR0SPzNb6uhGWLRBUoQe/jDQDAyEsfQHKmMRMoZAWKwXqUjoegI2hGUy+4cbTBKPh+ZFa2SCsJxs1PVTYBs0rz8E+qx71uczWwz0RW9jt3vjrlxAyK66pI3LTVDyfd1aNHm2+vLa+vbqx176j+e6zl3q3o0lADflgptBMinLaeqRfrey8uVYcFtQ3UQnAnGZ/TOa5mWiI4DdEZgJD7uDyoXjx7XILk4MwKIyLR1Pbk8pVjg6anox5Sp9raU718AEfOqDO+LlHpCs0F8WM9rB6t/+vftSusACt3YnvGUaFUT9C8/KoC9ylDxvufsOQgzbq9TMJZL9LM7X4/GNY5CaGNFpqe4mQIzf4uNH7nX6hOvtmpqQpAQAZYdWrd9IE69wHUTMFFzF3S9UuSQELpAiuJBarNY34aNrJK/mxfHQE+vDvcaPKnFrRdEu2bFT5FuswQRBGw1oV1++8E3VZ/8ET5g+Ip9qcmqmWHKmYuk8z72MBNBnRte//GYL5oHj1BRdJQ8/QJaq7IMZ6GWTvlbue0f84e3KcWulg5zMaKkQF48rknpnugsF5w1mOVTYQwe4STm3q83Du/Zra0/sCT0Tsbzz7l7gHE2AIPiHacOHXPUxtg8X7gPAHu5CeIKHLEQQRoxH5sn0C12eq3hTMG1l6zzS8LszFcx4+rYs88IvOpNf98rqrRPAUIBqB1WJuZSBptODBf282yj5EDLwMTIAYSBQqqCMjF1NHsM98TC6loBRJn4YDIWMTrAcAFi4iNaV6WyH8yt3uZmRmZ3S4ovFqzwi6ALFnGwNEF+jjEQcb2wxhC66tx3A/DwYG72xUN2VeQBCJTuNZBkgd2pXrzEFnyEPsOIagJUuwXq81mQ6H72U9/ePv6VQ/jRR9IhmF3HZZh0fV40cWITz97vVw+EgpX28ODR29fPHz84NFbm7PLEBeakpqYm+OAwzBcv7l+9+GDv/8P/pP/4//qH/3Kr3z9Fx//RIlXmzOAHCjnnLbbm0DMiyWgCATh4HV6kmlWUTBRBEAwEgg56QPuEQyQh+GAOSMzAPR9LykR0TiOJanAt1UiR6spJQFBNSOhyX9kvrsSu2sAFYhMs7rZb2OGQMCMDGCICjakA6iFEJAjMDk+PowDGpx1l4G7ZS+PLh+crTemOuzH7Xa7XC73t9tx1XUxBCQE0JS3uxsAWC6X4LVvxYk7ttys3z5/d7s7cL8M3PX9kvqVICPicrXq+clw2IkihI66zg2VLgYzAw6GBa4VNp3PuboqlsEgBi1zN4uC1GKm7CFhVTI0tYwzx5jkTESFSAnGzH2IaIoIQzrkcQzohRYkZc15TEn2u91+e7vfbg+3tyoJ8jiM+XAYh+yEIpBsGVXcOea7YwjgdV61zHFRkSlsa/OZ1Ua7H6oq4tLW1BwabU3QIukbGjSB6gb2+gM5Z83Ji98hohfb1tli6a7inHMT8/WGWTWw/S5QgbuCiVjggNVEabYWAPjMJZ4+afMUnFA0HUUNqdTUmgiHDhGUAEotttlBRAbkuQGAgATcdmFXA5qRe516VFx07cOyhoOAZV9bAIAACIUZOrZlzD0fMB9AkqmAZZO2W1jZC7AIphXmjP9PTrbXOVJs3Q3tDc2Ouh8dsYvNvNpD29ZL5K89xRHyqdyM+ecnf1hJg5/gYIWhR5kJpcHVsdv0KdpvW2vb7mazXbXy9KCyCqDuVBN4rbxwN5+odQzM8QAepatZKXcMHsjxN3oXB2JNnDzt+fYIxx+iuwbUoO6w9TpHrkwsztxK/QK26oqtU88XXe/kltN4RC6ad3hticxbVS5V+3be9nIOesUM8r6zWefAbJCbU43MeCascjJaTnqmvZeTz7VaaFZlNuaZQmYTNobZmPflwQeP/xAZ67su/7Xix0TwJGCrEErVQLSazjjvmnab1pXzRpwcsydB15Zsp9UeBwDwylgAU2Y9tr2lPtK91/+yAxE9LGZFvMcAGUHQuCXRHtmsx9q6U8tnN1WFxok/wZez5rWZCYowm3sIoEhQNEP9OUvsaFogar6pWqmkSLXj3BKENhcAphLi8xcxnzPHD1SkG1qrZ+dPjzxbMOF4Ibs/5WVaHQAQwO68ovnQbNN4Tvi5e806Dqd+rs/YbnVkAFgF5dNa7/DrPrvL/zQrSe3tK0Rs6QLTRcv95k2drikI4osNloDWaIe94Y3yMiy7brnsesKASmAEkPwpqNacgmp+uLCmz+cYY9d1fS9mUCT+ARCBGa2IiqSqC+I0VXBKDACEEJgxMLLv54oIHJDMkAFHERHpQk9EKsbMIYScWVVDCEwTi8C1PsvnFZEAHK1x7iXVqnbCzBGniaCqVERCKQuGbnUWN5vNhgCuXj+XYcc6rAMMwzDeXh/2t5vlZejizWC3h/Tyze2FbjAuliuO/frqZvetX3vXEHfDuAohLmKWLKIx9prk0aNHn33+2f/kP/1P//nv/H//5I/+4IP33867axlH0MyWu8D9Zg2iYLnrwigKyGLZ1ERUBBQFkUJYpJRMFMyY4zjswQQQh5QigKrGGDVnV01V1a6LxesfwrIvpbVSugWvOsbEaEXtBAEBYh8R0cOao5S0dDUQAVXwbAFmRiIQzSYuvTAkU7AYIwATYL9adXHVdasQYsDwwfsfPXnyxEQuzjZvXjz/7JNPN2frzWb18uXLfrV89PYTCuw52eNuOw57MyMMgIwUNufnSSznDEHQTFRMLaUUQwQMGUQM3U2uTgI7EgCdecIcEODk2am6ZLOdSQEDIaL7VetKziVkTWaWHL86D8dhiojknJfLmDkYR9VRREzRDPf7Ybvdb7c3+93teNjLIGgiY97tDimbZDPFIkBTnX+BGJHRc8IQGaHAaxOTEoimKqin2nzz1fdkxoyqBjhJy6IHvmiaif6J1eIAoqnjruXMkEoLjoXoekooIqZNRUqdYIDO168yoPPL5pyJ2UMZqhlQ3fCuJJ+p7MkMCsD8QczM87kIg5GhzVa8+dblXG1AgFadxsysZAZzMZncx4aIXvBARKwGggCYCcjzBKqLoowKp/3UtmGJLIAxQRdw1ekiah+GiFvRrYwpmIIvKUeOOZs5DWefc03G+FK08CUbWdvvpt2TKDQPT1G3n12BbKLFzq/WkBmcOuNs/kaO+P3+dSn75Sit7Gjtyy95CpwfR/e484An17kzqafPT0BFa/zsTGvrwPHVbAbc5u7aCT+cIMDyoXm+m+HsmvMdB2bjuV0HZ9ot6NOzqqnWtk0NmD+UzY67vVrAZ3nCqdeOndQVNjTUcQzE7/T80T/v3Hm66YlD2Y+TohDHmPNLbAmrQTBQMAKCAv2PHMfTEZzPqC21HZtAb2mhYzyAqnhwz+OV3m/w7HQeliwL/6OcU2xfJHRvBJRY4/x3NA+h3XNQ68TahvsoHKWEGxcLfub1L/np9+hAtmZrfcAZFC7cFPeE1EEyfQtGiCoA06hCRICaRee+fKyGb3EtnDxlNTmwDa+68M0g+Jetd/N3PF+YisAQ+ML9JT88Mvbu75iT424z7I6h6E3G6otqoT0AN3wMtI6zk+uUn54aAFBS0mx+/TsBz3Lm/MJti/UZhOXnRZJuOq308GQQIqILCWjhNfiDm0AeYLhVWsiuhyVyCBBNCEYFQeRgZkwMoFkVgHE+Sh2dMPZ9zCoAMB5yGZyAJc1QRE1DWGjzMYiAb12IzBxC8fyrKhbGTsBawcrvU6pZSXMdTmZlgy8VFZ18S04EajKF5sKjXqWYqaWHOopijklMDB9ePlSg8XDIh/1w2F2ue5Ju3Nt1HmTcgmQAPYzp9iCvbg+P3nnnsKXbm52u02HIf/u3fvuQBkgaADf9kglSSqLAHXPW/X7Xr1Zvdrv/3X/xX/wP/8H/4NOPf/z4ctNbxzoM25vb3Xa16BDscNhDiIA9EYkCiDKAAxWMQb2upRqYpjSIJEKPdTAAeJlbL6OGiF3XeV6p20hcU4H7vleuwXEXnCiyM4XZCeg1Z9VzWQwgEiXVQ1KBgYgWCw6ho0hNAEeBIoXAgRADdwC06PvFYrFYLJZ9v+wWu+3tOI4ffPDB61cvNpv1o8cPgWw/Dp9/+tnHn336l//Kb10+OI8UY+wxkISQc77ZbgEA4wI5ggqKUOg4dsgREcJiaZKzAWWlGDCwFSG3sjGjinNdq4e6xMc0S04JVACUFgvnMrkoPCP79HSSvToAZUYkYwSBYGSi4zCO4+hZ7WMaDoeDZ+3GGDWDpQNyEMPb3eH1m+ubm6vtdqv5EBAikymOSbNYFjD17iVE9vU5hEBIxb/oorqi6uo3NbWXqtgulKQFrbA7AyhRJCKpUkWOfUNs0+eIIsvMKoV7IiJGJSRCVGnQhZnBRAQJcs7mycTOk/aY4EwRwf+QagDEGAmRi8qBun638/faxVXVlb7c2QIVcNQVz9mbCgoIpZAitZzKsoCWinhV8BLa+uywyJ3LvjYELMJ+LU3qBAkhomdmOzfXnEGlhkyIjEwKYmwQWfqgizB2eItyY2lnWQwAi+Z5XfjRRfetSptb2dBacXeAWTOmfWH24RwI1gXYAKAkGs+SVmvKil/eQ+iqvnfeqW+FM5WV2pHl80Lor3yk2ZipVKK7bZ67oabDW1gcQFiRmXsP1VIbz+4eoqO9cOqiGjXy4NKczn26/SKCGQQkhWzVL94MgHqdKT0ACpHpfs/3XcOjdh14HYb5C2rnexXtRpkGI8CihWoVjbqF6nO0Kl0XRwbOXrHfmKpGUP1g9rwAXmUQjufg/BEqjm5bsSFOhQKPnvcYi8we+Y5F1JTEZnNuukp921hialRdLcXfMeHM6jUw8Y71xRAAiMj/wEYt82dHxFCdBGiiqE1G32qW9OmUxtP3VyfD7HmPjR4EMCz5+MXMmMzcyunxcU9WBfDn9l/5J9xzGHkKbGnhZDkTQGGwmdXFugL6o8eZjIfpIepwRChyNa0TcHZWe0PzN+qTSogIsEitUaGaVSkYRMVyEXSqls8r9AT0sq8gEVRbbNZU0FluxlFPHEdLZoZpudds1XNz80g1oh1z8AdV4divg9VTcfdl3F1z582bBzrba50mfGnY/WZYBRyTAQCFzGlmRxX7Gqa/zzqqP/Dk4Gq2edr7PXctFYvvs++x0FARkAogsqRAxDdyE8cOY4gcAgaqPyRmZCbjTBl04hhANYcAIITQ970pmqBK6WCrhe5VKfowN1DNal6fzlO/HFiYOplYBRG7rieEUtKVyKwUBQPQPnDDPc0GdFyLiM5ewFqCwGFuSwa4+/rcBQheMdSp1Ujnm/PN+TmFbrfbDsMQGSLT4fY2YL5YdTe7LhMqgiAdTFbnZ0+6By8+vdmn9M1f+s43vvMXLj/62jjmTz7/xVuPHjzcnBGBWzHoDJOcNEvsFk9fPLu9vvqf/6N/9H/43/5v/sl/9V9uLs7Ou7hcXw5ASTKjZoBIlLMAIqqaKteXHVT3MhIwEyXJ6bCPHQaA0RRdA54Ipiw3yzlnFUf8/vh+zmKxGA+DqpbY3szVlFICZ4sptFpMWEA1EhiIjeMIltwE60Pn5lOgEGPs+hUAGNI4ZFM6w7BYrN68ebNars82664LT58+ff+9t588eStJ3u+3h8MhhPArv/IrL1++7Ps+bDZIQXL24m7bw94ULx+uF+szIEJmDCHEGGMEzbHvLIeU0pClZw0xoutPe3dJNlHVVCsDRAVzDXfJeUyDZSnkS4BIRbMam2fd6p5cM1bMABgYwkF2yYelZAAY05hSev78ORGcr/ouBpWMKofDcHO7v93urm+3t7e3eRw6wtUyBgClqJpEzLJqwGwFwyJ4ES5/Ker5V2SoCqXeD9KRZ6RA/HJoSQolREyj+4DUMR7RVBxNRHIuqcDM7A+Yh4w4FRalwq8B8ToPdUKpKrp0r4Izb1XVnJwzW3DcqpdaiY+IcvHpT4seVSHwlIeGVv0BmbmSFT1PFACis4tFrODp2bNXwrUTYHymS0nBLZHwkh+HaO10YlA1drRft5uTNdw5P14Vm8CYSBGUUBiNIUfQnrYk1zZsIQ+oDvcQUae6BG2RP7pyYYBgof7j3Xh0/aHd55YqqiWTkDQVbdMyemy27mFZgyfyyXSp+Q54BI2oGTCn7fH035PeOkHAs210VvDVpvfe7LN5z6jqXXbDfFucQ7iTZjtDAQqzyLDkQeBESJ7FZKoq/2ls/07jYd7z82POlS+Dr3L6YYb66gVdP2qScbGmJqzY4l0Tddm8TPmp0BDW+lQAp12H1QOONc23ZA83aDg78+RoH1ohxOJJD3uL7tWK/7LDqHmQ4eQuJ+1vt7aSWcntZd19zHYUAwC0QHBVrbqzs/2svPJiwRzPouZX9qtTu6UCGAgaoCvwIWNJsZ9U3iv4M1VFKyUVcf58UMZfUQQq64vnwzJUlZ6meHkyfypgZ3APc5UT9TNqJa17oGcz1WrnMgCU8pTHwBLLC5pmiJmhGhIVzFznSV1ojH1hRyAkUzVXTZ11rJljinnLCiSlmiQNdbC3lkB9NNNiodb8rOnMho/vPO90JVfpAYNCSCr2NwMA1sUGoIR82g5XLw7VaV5fMUJLvK7tLFcqy+4MtZcfFk/D5GOoASmv6+0Gga/9AM2WKGJTp76Z2QNaa3v7p8tiHsmuFoVjQ2zcx2aDAZorQxgXt4MoghJkHHey5+E6Am/65YaLhWWIiIxVLMyrhRoCwFiFmwCImKnrgplpLiRlAAUlACNGIg7EqbZQVQ2RGbuucyoOgoqbE2DVlpBht5ecY4yqOaVBVUUQYwghSM7jOLqiMEiWcXD3Z2Be9D2Re/0VwBhJAAnQRLMlVRVx8WxRzQTBsmjEIoprulwuz86WGPB2e329ve1CXCy6tIPzzeLli6vd7jalAVaRu55WiwAd0/Jmd+iXi7/0V//qcv3uzz9/+vCr3/jBD34wWLq8OGNmMDApvFWV3AVKRK/evOnXaw306NHD/+wf/uf/4d/42//Lf/gPn/3i403P67jJ421SSBDGIXchRCRBBbZAYbQ8CgSTWPIPUwgWSSIy5CFQ1gyG5IWQOUbPrXQBygb+fBgRURcCCHpasG/J7EIKZp5O3TYjAkDGiGEU6EMMjMSKqCCKbIRmKoxwtlrGfr1YrFfLjSEhcAIh5nEcu+Xi4sGDzcX5+dmmC3z75vXN9ja8otiH1WoFkd9cffbyzeuvff2bTXEviRIFMdxtD4vVWmsZaYbMHEUEx4PWnYO5Ep09CcwUXFZGk2ZRzS6YzysGAQXVWfI3AIzDgACIPTMzKCEVf4YCIgEZEIoZVZdnztn7LYuYg0MRH3iHw8HSuFr0OR3GdNjd3F5f397cbLf7cT/kYXeQnJY7XnYRTQyJQlQTBZVsmcQoQCh82ULWmdKYfYWxxtKx6j5HNAAjAiJEjAUBzLKfaxeVZU2kmMSqaoqm6oSi7HKDBgAgRTDEMQiamUqaX4rdVCAzFTUp9dERiDCLElE0cxaf5Mw0bYGAOnOoIRGp5ZrHXBdSr1cBziFs2Kj0fyBSBa1pcb4qExOieKhhpn6nBuU/WLT/DREpIKEFRjM2JJzVqkeqcASL6oKvG2JKGERBbTRPhemj9Jw6SmTXlm4hDWgW/N4OKmYQ2H3YFegAoMM/MK+LhNXRAzY5ehGnDLGWf4hgzjuvqKjo88wK/B0x0d0pFhBRwCoQOtlJW6IIVNsJAMpkmrtT/XZY1Xig7i9tn5q2zuq5N3NkBFAY8I65yxD1DaT9qriFS2LHhCCoOIHFzKUyCnKbsFzrp7rJIiKoYS3qWikP3v8Adc+1Y7A7DYNjqkxrCR6xyk9/Uk9y5YZSNg4bdeTECWutpK5fbYbBEBEVEFSb318aYrSaawru0cMK9ikYeo40cFnqAaDUUBI8egoAcPEznNXBAIfKDZ9MGNJBhavnzoC7zvrn2IcLBnTHkGsIFuvRzm9hRAJE1xGqAUyoOlgnR2houC49JUtgPgGs/PdoYkytrIhqGoLTCKbjShdEUESLfFyQmlGjibZEi9oia0jPAKnm79dv55ZoaQyg220GnroOFYJXh3erjMDurZ+eYvbHXJx+3mXzbjl+GQjTsDYARKokQnDDwNOTpwQULLJN7iryqGrpA6vhl2qLzxfWYm2pTi5q/28j1bRGtr2vrpll0hIGRMxZ7xKszAzt7osu9kb7pIJxtckPASfXaZ+3wTrvt+bM8JeMNQm4eBTKDYt5MLUB2nbk0+l0WYFqS8xnRRuN85MBitYL8z3t9zZWu87aKCjEOgQSQBR3R/jmLsSDHgh4rcuESQkiA1ANkyNA1VPyZjg5B9HUpfRjCEiqkKMy6ChZPBiNSAwUCdG4GD6lP4mo48DMMRAqKCKoAREzd10nw7DN2SG+ZmkUQ0cJicjBjdf/cmVPqnUDmLkV4rXqKfEt3D2V7RMAFREME1/88YPz3Thc315riAAgOozZsibMGQhXq81K8y3x7eFAArxepNHee+/JV/7iL29v4Pd+758vzp+s18v/+z/5r3/rt/86AGjK1nEo+qxmpsPuEIiWy34w61abN7vh5nb/23/r7/6Vv/TX/tf/i//8j3//9yzvb64DWe5AxmGLDJGJkQg0ckc02G4gDusYxpxMdXW+XiwWJsOQxy7EDJxEVTWl5J3jNZIVQVV3u533Yd/3zok6u1ju9/vxMIoJAYkJARpaBFSP1qCgGjIxM1OMMXjaBmAGyzHierVcLnszE4OL80uOi5wMuRvHvN3vYuze//C9rls9fPTo7Ozs5csXL1++eO+dJ5cPH1xfvbq8PL+4uMgqwcLZ2dkoCoDb7U5yRrS+W56dr4dhf317M6T05voGb/fIYXP2YBUiIg4egCKKzDFydIBrAgBsoqYqCUQsJVMFzZ5cC6gqTQIfiZEoHvZ7ZqaqpXM816ZZrwBoggbjmNNYSiqrgoiAGAd+9533nj3/AlQUcBjS9fXN7vb2dne4vt2NY8pJd8O4u7neMqwWfWB8eHlupmgdahLTMWOOChZSEopAxHXoSlGrJGIOLX22pTxhFW+YsxOPxYJ4bja4gRFjAADJZmbzRNvysC5uSOXnxfGP2BbktjxWMr2ZmYO5lEvsjsUFuMWvzxxtyl0GaKQOdaPCVzltDBaqM92TFMzMtXrcmjCr2ywAIgbP7yUjLKVCDASoCDICIkhRZkcyAHUNAmdtuTXkPqHjbRPMTMEULIv0fSem6imOXcBlh6seFmFPeW95Zzm7q02brXiP27JddvavtpWfOrbrbnI6IOu+MJlM9UO0phNVwu8z7+md5tw71Nv1W/S7/peOUccEj+YgZLrdHU9Wu7gfxdCd1cElwJOT50cZpfUKDT/MnqKaPWRgKJomevqX+K4b3vDmzh9/hv6PzIA2fBlb5azysFrC6iUER0SVgGS1bVwxSQvmF+xXH7ycT8RgClOVDSoMt9Ok7UKZA0IvYWi1Wiy6AOgMU81fByL7CtPu2v7rJNL5mypddMdM8qMxL+ZdcW9vz7v9JIwJAM3V2B5zbmzMT/YmBSvKJFid/i3Le6KP+4oiUOSHcMoTsPJ1BRbuUbDZE1qpwNfYZlO+R327YCCE4Pnd4NT8Omha1rnOZFzRxYKoTDCodkbtFwZWEAV0Zxxw7VgzEi8zSb43oIG6IH9dTadBVIFn4cxhcYsXg6d2TjH4fRmtgWX1iAqCVdNwGr7ToQWDuw1YKmRAMd99LJmvRwDgxQ7NuYZK5L74ZmRDdbVMw6jMaiOzXPe24Gu6CtZU8WkwFTOmrKR28nkVp5uNNqt6zG0k1PoMbZtsfWdtRB75PKi586HmY5R+roePK5u9X68SME+aKV9l8VK1Pp5b+53qYuW9k49lX3bd64mz1CsiollBn1b/bpbdbcWbl41AEUAZxLLmARAyhH3eDWk3hgUqi2Ux7UIQk5xGM08PUQfcZpak4OzQxRAiIoPgXnaaMgC5D4+QmINLmbhkuWP0ruu6rmPGlBLVsB+AEREwZ7NhGJaLjpGyDjFy8PI0Zl2MA8E4HhC9LgH3fV+SBJhiDDnnlEZQGw8DB+z64Cyg2MXD4TCO42azAYC+74chpZQUoe/7ywfnZCB5vH71IgUOvFERpmimXdftDluOPYGNN9cWupG6l9vD2WL9lQ/ff3D21o++/8OPf/biX//Bn/1P/2f/2X/9j/8fw37HBIvAgRHVvKgWaGYXNEZl5rTfH0bjGDDDn/30k6+9++4/+B/9j//kT3/0wdsPf/M3f+P//U//mz/6/h9BWC87BsvLdRgOO4oLS0AdGhByIAqm2vXL9ebssMdh2HMMpgTETuBxZtQwDKvVynMuGwR08ZauWzx89NZut7t6ebUdtowRSWWQDFnNIDAZE6Nl6bouhJCTyjj0gS82m9jRMOw52Pl6vVovuq4L3WK326+WqzeHGzCRMT1+9BaEkCSvu+7psy82m/PQxZfPX6Rhe7FeieQ/+9EPf/7Jzx4/fnz28PKtt5+8/f4HkiSl9OLFi76P68Uy5WG1WmwuziW7iAtz7Jh5HMeosFyvuq47jIPmtOhCFzjnPI6jqnYhBtBsecyj5hEAmHxpaCWizVBDCMFrtqi6JRljjDEioooBlBxcAMw5l/RTSSmlcTigllQWNQNCEdvv9qjIFEDh5uaGzGLsr26+ePHi1X6/v9nejuNIYF3X5cNhK/vVMt5st2fr1ZjHnJUJkor2ZoRMwRSSpJkX3xBdWBfbVu3IW0QiT3gFoKipdl0nQ1KVOSnITMDDoxz7vlfVfR7MDJFVtXgSXXFUpiRdKeWN0PvKal1Fr39ShlatK8DMS1+FAJg5Z5UxHVRjjAGZkdDDYkDeeyEEySMTxdipagFtBoSUTdxgcPMDqqPXaUdea4RrRq5oDgwm6kntiJCzggoTIpBqVoDAWAhUapJHIlLNqIUcxZ78DerGszj13zRJdhfPKBmZKEZadLjubd3rMqaIA0lGRCMzQSREIFP3lE3lQQukNlMNVMvl1l2sopG6E1kVJqweQ5h56bXYfmWRL5sFTZcqKKD8dkJmM0R7BPjafnSCtJgjtAsVWSff/9x+PirFCAAm2ffBdgUfsa0AaH1GQy5l0FQVrUSW3JPY6nDTUZMmWqNv1QhMhC6Q1RB2eUCo5j0RgwukOlcZFCdMWXfEo6cmm7bvQpmYuQ6bsYHo1SGA0I4iFUQA4Nr9ZogUzAvegFfwYBWQ5p8qaXKKQGYNJ1R0QUaKUEWcZtYOBO7KvGPw9dzMamrmJKaHiERITOOY3S3b5KFsPur83bl9oub9XGA1ANScGjPjmalmxWdv7pgwMy6IpXgKnMJHVdTVzJ2uvt4W7lcbhK4WmA2IGKko+HpdUFNALsSBFgbwdtYIAKAV3jM2ZN+mgdXcAaPiDp0MmnrUF3zKmQbj6rOvJWYRCDCbUmHLTPYWQQnpAQAqtEJgZoahpX5TTSae3xfaLEJE96GbIZB5KZPJGvHyq42JAgRozEcDFO5M4z//mB55Ll2JzlVTKpErrZ5pBcBqTGv1MeDk5J6UVQq6Rt8pAMBLSM7GcR1I4EKNd1t112VhZgaK9xGfYHp8mCH7MsR9xAIUPtyUDlXtEDweM/Nrtg+rrf1lt56WV7PJRVeTff08AqiUpGOjqtiQX3pQWfznIVcpmfZ1xfdpJURF78E3IbNJctVtMgKYP4lqzozZKNth0H2CIVAP0YvRGpoBExqpqKiICFRfYOtPLRO2VOtFMiIgFzJB83C3ASABk2f+kloGKGLt7jnhwGggNoxjAgCuBRuICOtocZDnibwhBGfvuJfUKePOzWAkRHR5wYZ6fWFqi5d/KGCLxaLvexmHVy9eSB4E2BJQiGA4Jo0hrDaXT599cbvP2G1G01fXt++89+63v/OdaPqzn/7w86fPPv3s2S9962uLZfwXv/c7/95v/fU3L1998M7bjGSaS6F2FRUZ04FiCEx97BSMOCqoRv3i9c3Xvv2rv/aXf+v7/+YPvznaf/j3/pMH73/0sx/9wA7btL+NxKvLJ1evX/fny5tXrwwpJwUKZ2frxdn6kPM+SYY4HFIIHSJ6P7RnVFWfXlqPEELXdZvN5vnz511c9KslcLENEiUWyZR3u12MMe/Hh48e5Jw15YcPLoLx+fl5F/nR40cf//zHMTIhPrx88OLFi5CUMexut4w0DCMBjuP4+NGj2902ybgMqyQ5peHsfB0QHr/zRNJwc3MVQnh19UYZFys5v3jgG/zjx48PhwMijuP42eef94u4WK7X626xXHfdInRLpKAK43DIaez7iBzG/V54XCwWq+ViHEdNSSXJOEge0IDZC/KAeCUpNGZGr/Or4uZQCKFfLFarVYsgWY0Eas3Og9nmdxiTpoQAOas7zFarzbDbH/b73c3Nfnebx2F/2L5+/RoAdrvd7e3t1dXVeNiz6aLjs81KjAGq79wr55hJoQJTNqFZajsSkgHaEfmnLd01Ild2ilYPm2cxjbZrw2xXxrI6E3OZO2WN8RWpokOx4gwmIqfltHu1MyuCnfrN96OytlPjNB390A83uprQRWuni6xr4ewpgDujDAlaJVevUkGEhIwmSGYgNWfUHTpmJkjGgF4uQNVFXQ1AAxIwFNUCX8kQVTWbqoDXXCzzCEFUKCAzas+8jLqKueOR80FzRkkmvjhzQRwsIPPObI/euOMFQQGAkYEwlcpZ87cMM5wwf/VWEj5bwHy++x/tI9Z4/3B6zWnvuO+YiPuTYw5OW3VHbrtt8QDVA3rkAq9sgYrZ5o30P4pHecaSgBlloJ3vnVHxBkzIxJkIpmTHOywiAypODlCAIovkV75Tl3f64d3u4llMYdaH3uajps5/fu8Wf98rqGCTDdS01HVSME81RfUi0EBghkRkhEzIHiNgaKXciAHAd4RmTGJ1uN6djHejAeUns5HTvippu8eft2gAVc0YP22+4NzthNL/hQxmdYRgARB3whd+FCFw8tpy7u6dMbr0uGWI6E5+M6tPakXEDcpgtZZA40YemAEVNQk35UuegOuuGIAXlvUUAMeRaCBQcpyhDPqTZgCUFeqUhwdV4RVriicpIoC64ihR8KtYAXCl8HURybcyoBGg4vX5i7wHNHt3e6OQCMGxGoBnAQBU2TVARH+fBWJXROt/tlmKiEgG0t63f2yGSB4RKTWvKqeknQPQtCmwVFU+GS7/Lqtmqs8GiC1lgwBqabdC0fFS2ohE4orRU23mqtFQogS1i6xUBLCSUeR2znz5gDpHajpXvaJfp+5o5Wk9O+zokSYnzT0DvX5VblCedmJtee/oZPrbUWDSHU+lPw1qzgwCKKgVmo9lszHLYZDtQVeBgDqCDJIymDERMucsokktgwJzc/+QKnDx3TMxuCeHmTkEZC6dq+aJcSGE2HW+JPn7dQ89+zol6hCfqhxQQOKAziR20o5LWzJgpALuJafAhfuuWTyrVYseIsfOxgSShQBDYPKigsVGlXzIuR/JYLvdXl29Wqx6UrA0dDEAZM1Iy7UIYFhmlCEP1zn96odf+42/+Bd/8ezzN89+ESCCDsuef+PXv/tnf/rH42H3kx/9cLFefO2rH6Y8UAbXOSrvpb4sYohK6kUTqeO4uNoP3/6N3/yD7/3Rv/ze93/9V3/1O7/xFz/48Ksvnz394rNP8zC+fPFs8/ZH19fXZ+9sQuy/+OKLuOgfvPfO2Xpx9eo5qvah322vRCRyICRiMjPNklKSlLtl76DWoX+MkYi22+3t7e3FBYeuLyQfZme3Hw6H88uLvgsff/wxIl5cXESiD9//gBRurq4iYxp33/7WN3e7rVfdPDu72O52AHKzHRb98nA4XFw8ODtbq8nl5eU3v/nNs7OznPX6en95ttltb7549vkvf/Mb77/7zn7Y/eyTT1er1Wqz6WJcL1a73e7Bg8vdbvfi9Yvzy8vN+fnr169TztqSE5CWy9DFmJ3noBkROiZVGXZbLxCR0BQqiQUphkBEAnBICQMGKmpRbjfmnPu+5xBchDQbpOrwRgLVkk5Qis1UCwoANDKqRdUxHYZh2O4O12+unz97ub25Ouxvb6+v3rx68fr1K2CKMTISI6RhvxsPuF6fn6372BnCKFlUOgKwaqGBiThDTwEAqZRxASMngRbg6Gl+hISgyfz1+RxnLqpxNQIpgCriO6PbwOVW/vgAwBwREciLhrpzEcFJfuB+HHN/bUvcP9K/RkQ0JCPXYGIEgBqNzG0x06oFbmYAHotA1ZIAYNXaIaKcRVUNXUSlEB681hXUrYcYVQ3RkIAJQmBTLcx9laLaBKWGBSERo3l5NEMycBdei1wAVKZx7WFVEFNRy2qAoIwKAJFp1eG6z+sudbQPMqCOKgLZxafALTUFg1KpGTw07Crmk1qm7wuTL69t0laoUJNHqdVyKaC6eE8VETwu2/ZxuJPSWpzd/t51fsK0XX7ZoV5SwCtnl9sjgN0lApU9CCfMU75FAcBastO9UZMRW3Riju/p7qNZ+5vnseRTtc/NaqJgNTaKE71UsPQTvOopmok7+7k6whXQzKjlSh8fJzh1fl843p3nMLqCogkg1ccggNL/zZSb/7z1yXRZQCyOURc0K6akQdXSQSzIl4I71mrKORYmChbNXuQAnsKE6EFEv1fBk/NmOhCfq0L54SEryX75qeVmUKlZCg6e0NNogAnvsLuxgfraaSc9edLDil4Ec97nxREPzQCYHYoYrNYmtJklCrNLzx/15N7tK380XwjIC5c57i/xVJy31cyASFXrLAaolOtGm0LEu9o1dBxSKWO3ujlmc4MAVMCO1I0ACglt9rxmRVsGW+Tx33W0d4E15Rfdi2wACKZIoFjKtPkC5w0sAtjVZCohAqepUd2BWoqFmSloOHJXl7/n7Zy9MmxP8e98BACohRK/9BnheNy225nOIjKzS0xIu11EQW3iRJYBWq5Y6lDe/VV7/NPGqE0V5o/PbBNgWiOm8K/59MRqYdSxatUkkNlzlEBNvY5WoxWLfBeRx5MRCdQUcpb9Ie12tGWkPkRDM1UTDTEw8AiWRMw0VP3vqa/89l7QK7ARckAOqI6gXMIsOCnIAnEkJqIiru1eap9TamkYc86Bva6rIhlz8KTeaedosnH+YKrtnx6+REQRCTE0MRw/p2VNpJQAseu6w2F0o2IcBlNUAY5AgQgyYOCuIwoKQHGNQa63r77969/9jV/79U9/9tOX1y9Nd0mo6zlE++6v/vL//v/0f3727Gl/8WC9Xi+Xyxgjq9O6JGcVEep6J+incVRg8HqJADnn69vt43ff+Qt/5a/8/u/+sz/43vfefvzw0cPLV2+273z4tWF/+PTps269HHG3vji7ud390q/9ha4Li2U/7m6S2WEUS0myBcBGCGywJqUUI7dy9B45yTmntPf6AGk8AOJi0fV9b7ZQzSmlxaJb9P0HH7y/7PrlcpllzGlYdf3l+epwODy4OFss+gcPLp8+/cXt7Q4Arq9vTDmpLfolMazXy0dPHh+GgZiur14j4jgMaTwArJhpf3vzr37/X6DBBx99+PDi8my9IWJU+eKLLxzKXFxcnK3WIrLZbF68eCEi+/0+iyEic8w5r9dnPgY0KwUMIWagYRicxpPGg4iMOZlk5CCqWHpjtgS4DTBbkUTkkEYznIZTreztS5yrbYpIYOr7Pmcehj0y9WG92x6+eP7s+tWbl8+f77c36bDbb2+urq5ev37tt+r6sOx7Xa13KpJHySPiBkBFwEwwsKmJWJGcF0XTUr6tyl4ZiAOptkhOjH8il9mZowozASSiQmqoA6NsR251++HX90s1sg26IUFoZszONbK2i/s1zI72HahebTWtadkzN2FOxgYQ2/W9tXOroL4WKs9S3w6VJDSi4n0TREAwlx0iAmaMgU2yKk21AtAQTaSkOGMplopmgmrOG6CSHF/8OPOjUP9NFcy5TRACrRfhYqXrfljQjnVr6dZyQpHmQq6uOzMPtTaJnnsO9IA/us8koGS7c9xtWBmxdVObf1tcT+7cMQCcdgcAoKoj1Xp7voDfe0z7WrvvRKk92grvXqcBvkYBunu19tv5Vng8Vk8xNx5j5TZ6W9phQXwmc+YMwFSy6UtexIkZM++EozPnnXMvxLrnahVPNvjxZZ0wf1jzfZMITYADOSMOAACoSqQAkifbEXEtLUqARhR8mphlZzN6jYjGgPAbfllv3P90X4InT1aek//OH7PgvTvBwLL43BeUADSc/bpdCQBCdauWEY7NgqGphrbiBMvonvZ7vnaxLWZTbjIboN4DsSSelhYYQPUBo6pR8fRNSo2zGTItnYSAXLR1vySHs/4EEZHKHCYyUwFk1+dBcn0obVGL4l+sCBRn7+CIW/8lt4PiQkAAK6k2VvwuR6/EHd/lK/O6cvVGVYCyfVgztOa9WswGq/Pbpvcyt6kEANRya3nzl7Se/7LjaDpN724af/6Jirje1cnPzazFiaCGBbGkd0/mStmuap/MRtpsD64Vgs0mxhvMRtc02628uwZw643ITAixGRbzlbEMwzJobd42v89sDLi+e1YDVAQLZGSeM62I6tqIkG0ccLvlRYiBAhGAeTDcXIGqkFmZXMLT41FcggAMiEgBY8cKVUvR8QAGDhE5EDjCyAhKs2yJ1i1Nrj6w++GEiUJgMw0hzPmFJW+n0iSsqlt66KAhnibYYoYhBApVZCYlL1HU9+g/Wa3PJNswHpZ97DiM4xAiLBYbUei6jUE6JPorf/W3z94+//3f/b0D7h69c9mfLZ9+/ux89eSXv/OtrOOf/vAH3/m1X/32r/+lxWo5juNue1j3XQcoBmqoxGY2Sh7H0bIFAixFvWF/2N5eXxHC3/ybf+MP/+XvgMrTzz//wff/+MGDR5ptTIfv/PpvPHv2bDt8/v6jt7713Xeurq5CpNs3b54/fbq7uZHDAWTou6A5mVnO2YE+Nlw7Dp4GehiHwzi41FIXo6rmYTAziiGnQAghxOWif/L40X6/i0RvPbwcD/uf/fSHjx8/1nSwxeob3/z6crk0s+dPP7++fvPq6lpEtrc7MVAADl1W6fp+PxxevXrxnV/97pBkvx+Wi+7ttx6JyOH2dkjj2cX5s2c3w27/atG998FHu6ubm+3u9fWVZPjoo48kpXEcVfNnv/gEiC4fnC9WayJaLBZdtzDFLsZAYArpMCyXSyQ6HA6AvFqtRGS32+12Ox9oJpo1AyEyG2CMUYmwbilAiJ7SHNgIBYxcdYDJ2ZVohqboeoLujnZ8HIIBilrKBd7txzQc0ueff/7i6edXr1/ubq5MkubkNYNfvXy+Wq02m83mbLXsWHNaBA4ERKiWofLDESdXDlVrGmekNVCnAxlCwbL+ij2vBkv1jNQWOiOP207uMN+iymUVTVEViFxY0OamAjoWR8+OK2vIXbK41RzZRs81Myl8IUYsND5RzSLVvz75++/uSv7ZbA0352VTWX8VkU2UyfM8DVSI0GOBxMzFGWVYJapN1ZXcKh8VvLq5mgBCIGAqHhw1UXAXHLU+r0s0Y4i47PhshecrWfCW0g3krY4HVJn0iNBjq7n0OpTNFxA9Qu0+4GIi+H+p7eAwg4DHUORok8LmQSuhKof8ZCZoUKIOWHaA4vKp6nTtQt7vfrU5V6IdxVQwMvAccS74haiOginfrBwzDz1U3ECV69M+p/q/iuzAn77t0Ue83dr/ADW9cC6WiopER0Wnyk3E0aD30bRl6kQmKTjJndsgdTAe9XN9ulPSuB/sAR3Shg/aD70As5nTlU2qyr8BKM5QkedDeqX4WlbB2+YlrjwIWODtibUHYCCmiGRAQQGrnJTrskziFmJIxG4ASC19yMyNOvhlsPCkH056oO3cSGSNzHZ0RmNUlCsVr2fxxeAsYOL/9BSaWb25wiSnQj4vMcfyugNMnlpz3/8MOVUOWW0rTHbPZNzMh8LJs/mD1SFJpRxvTZm921/W8jCgqLWTlQwBMtBqvMypOK3UUXsBZe3OcnLlckLN4fBZc7Juwux5T17V3Xd552ENPTkVS+6H+eqiAgCMvqxW6v/sstN9sO0NNVpVOmPKWEdoFgJY1U/6EquydunR1/plFQDgXoZT+5mTv6exUDtzdrE2EtqOWz6fPx/OjJVjjwVArXIwg7MVzjspqPi02hhoo//u4jJ/RzbtrUWG13eL43NsPorNrEbKatqWGaCWcqJAAObKtUCkkFG8RJhmhD0euryNYdHhIhAiYY1JF+RtAM4CsLoh1OckRIwxqkJy6b48mrIAhj6EQMQho1oWLQWnzGrNc2+hC/60XUBV1XLkSFWKJKXkU8Y1/uv4wa7rnL48Byjug2z1BJC46zoKLCIpZVUVnbSbzGyxWO2247g/hFEWC5UxARCooeLhkC8vnzx456PVw7P/3+//03/70+/9pb/2a5D211fXDx9d3jy/vXj8nmr+u3/376weffAnP/7krXffubq5ub24XHRdEhURYAaDwzCMWcwgcui4M2JRI6Szhw8kDw8uzt96eP63/vbf/MPf++f7m2HZxWG3lXFYLLrDbv/mzZuzi803vvGNl29e/uLzT1eLuL2+2t6+jqhdRzZaxzRktFIo42juOOfHPOehVo3VLJpHImKkgP2wt/1+u+g6xPPxsL+5eiOrlUlerxaLQN/+5teHcX/Y7WPExSL89Kc/f/369Zs3bxAZkHaH4eLBIzVUAAU7uzhXhZubmzymt588vr66ffH06XX36uLiIh/2aTh8/3s/feftt999/JaKbq9vELkL8WJ9sdvtbm9vzs7Obq7fXDw4//rXv/7jn/34k08++c53v2tmq9VquVyaYeAuxm5IIytnUxIH7Q6YqV8tk1qZxFkAwBgzFLZEmyCqMh9709wjNyazaEZT1SJCAKrjOHr+yTAMlWAWDof9y5cvnz59+ub16+fPX7558fLli2evXz23NDKj5kREwHA4HIjgMmzON2eBdBmJEYEMRBENCFUsErV0bfZM7yrqUkzfKpNAM7kMqCL5bb1pk8jMGtnJCuCeUKZa0UL1aICqUqA6MY+U0FyKoC2MWN0Kdk9d3uKsme843oA2JtvPWyOtRDOoSMRNrqIjsQRH8IwGTABaaDtEhaEEws6rBVAVrWPAdw2vBlD1MwDQSJB5rptUyFEG4JphVmmqRITMFIIte1x0ueN9gB3oDYwD6EjmxT6aVF8hQgBirfI7LcuegarWdgrvPZdOjsietQVVAal0VFvD6+GouSgzzsauu3vBS/oUAZkKeWdyEdNF/hw3NoAnMtafTONtfn7bK61Uqpo2TKvchKbr7yhlPjbmd5wG0szL287EahjUQThhuRmvbAoX1B46xTxW3cFwfP35B/Oeseq2t2PQCODAtHGZ2w9d8vGeYqXtUsftbF163BsIYFTfrpsTfu5UD0rE0FMFyt0LCZBKRQ72Ea6SyX12UFRV2uybt2Ga2nfgbRuT88c/mvhzH/d942R+l5NBOP3ztCfL6S091cFUswCDL4eNbI9Y3OHzzvUdsUowek9pe4C5uOEcQt07JdpRMqIaE8hRL5rZkSjXyaXunTzzP7DYkaiaZj/xzgUzQ8YyJFxqDGslusmQKoTResF74DLOXMinz1XslOLSbm0rFptNQJNqHWDEBv39nwaAQFi79uigUoSybVfg2sAqp0vMrLElrcQrP33ZajX9oOVh11Tg9hRWV113SwG6MtLRUU+a/rbZGDUwEKs2wNRmF5c057zOFH509rdniTRPP9Rus7nhcvxkbUUzKM6s6hsrGz07Jay89Hu6pW45nliiCJ6mRk41w5K6QlAUsDRbPqRdoC7wIlD3gNfMCIBGqgrOFDcAOmq0O1HQzGIIAJ0YyjCMScQUAawis4IYZgSeSUgAwFEIAsQYu67DuoAW5CqjCkgSMws1ZU9VDZQDYfUehRBArdFdGMzUiKjrOjByqcdG4/ZCTsxs5unCABSZO1UQMQKUw3gIw3J9xhTe//CrvFz9X//x/+3HP/vh208un33y8aPH3zrIeHXzqu8e/vK3v3129mBI4z/7f/03f/Xf/1tAAYz6xXKxWugoWcE4pFEFXMmGIgbvU1d2vr158+DBGYI8f/b53/nbf+NH3/tX3/vdP/qlb3x9GLbPX79++PBh6EPA/PLqxZ/88b9+9ealWtaBQYZlVBoGkoOmfT4Ihh4peC5EW20qyQFV1SMnRCQiaTwEs67rDDWPYJINQYbDOB4uzy82qz6lg+QUNv2HH7w3HG4/+fTnm83m82efvfy3r1Th5cvX6/X66ur67PLyMI4ryUgBmPvV8vLhRQidqv7p9//41+jX3nvvg5998uk47Pc3iAZpHM/PziynVy9fnp+fj7v9i92AHN774CPPwb24uPj86Wcff/rz999//7333huG4dmzZ8ysCiklM+z7njBcXV2H2AOHvu8Xy6Uh7oYxhNAvV0gR0FRVUjYzT1TwbE5oxRBaqa9qMnnlV3fypyySE6hgBXAiyY1MInI5KQFj5u1u9/T58x/99Kcvnj4dbm6GQ0lfGYaD5pxzipHX/TrnvLu9RU3h4nx5vopdMBAEAkL3N6tIz8TMqgIUqBZGFck5J2eYlIlER2YzVs46VJ3oZiT7LKihs9yWGCwSe1OhAJ99VIrsFtIRVqeVqDSKndZs4ArCmgAo+Z4IABGAazjXGrFnjjuOLDGtFn5l0AB4METBUwrEhVyqU64YPHUnxJI97MXFqzq1iXr0tt7QFRk9EgtggESBm2OrtsqKooAr8aAzsJhi12HfwWoxdDySHUB3rAezEUxBDI1LqwHNyVsIUJ3xZQ2ntvM6UYeKRv4Uwj1ZwhGxFYKdY6b63qvzqJoeMN+qZt7+tmvf3ez+/M20NmNCES1p4aSdd5vX/jBPJGgnkwGq+6cblWjCFSU3Tg0MK8d7tvH5zPXru6VEzcyYI+NqIuFp26q4/d3eaM9y34fHZNcJ+LJVR6ZOP5+TMlCdwd7KQdo9t7j/LRiCUS147M12DRVS0yKxT2BmxFyAVxXnMgCcFLex59hgNGMsl9cJlN/TDDPQo+HRgDvVNMUWrrwL9Ot0ovmHX9bbEx6YOzF9PPskcDu8kkcAwNe6MMP6bFQTnJBMFSpdHktDFRCkSDtZe5jjROEGTxWAnMFBJaXTvAgSKAKZKhBPWdX+X4YjxAneZvCkjQY2Cc2dTNNv23hSVZoFm8q6VZdsq9yp9j4A1VxZs5Te8qJHvihge+XtiWYOlWoDzKrGQk0Xav0LKgbgVRKrxK1rLzj69wQsm64wc/C3PBKrvBYCM3IOVcW1ZicG4fzBS4dQi2QV+82mMCNWW3Can2Wd8+pd1AKgePKuiQIyCEhLADgJIMyXML+CIphlBDadLN364rxtasiopkhO8bcyCQHBc2NP3zhWu7lsjua8zVoygBDUwMTI7TydzTVCVXfQ0Cz13mrt0vmD1OGuZGUNVax1JNAAIGBVFFUbLe/zPuRtx3ETe+oIMzhUQESiAFLUhcEycnCqL5mRefZh6ETGEVWyqlEgwlIEyExADbCK7jGaomchuDCYqgawRddJjOYaHloq+6ZRPJmgTAonCNWSFHlMZubqoqDmWpAcENyjiMDMKqCqmouOUNN78frBqiDZAGO/2IDcguQuhO1+2O4Py7Pu69/8ZujX/+Sf/re7q1ePLzbXt68ePnnnxZurXa+P3/3K+w9++b33f+n/+Y9/58XrV3//7/9doe7zzz6JMX70lQ8u7UzlgGTLuHCbT0QwKyhqyjkrAGAMXdfttrc5j4sQRMa/83f/3nA4fP7JJ1cvXiDZ9dXzs7Mz0Pzk4vz21bPv/NLXf/CDH4y7q4iG6bC7edNBXnVdznkvOYTOyVHuQfTu2u12fd87M8p9vTH2fexQRg8EWx6JOkIax7Tdbm+vry4vLiTnZdf/4he/ePzorcNh99ajJ3/6Zz/4/PkLVEOOMfSv3tyoKgJ3i2VOGnvo+369XquIUu677q2PPri9erO/vIQ8bJabw2676OMihrjszteb7XZ7+eDRYr0yoBevrrf73Xq9NpBXL569/dajt956eHNzdfXq9YsXL4xwvV5v1us0kgqAyjjmzz77PGV76/HbFw8fjCkxx+VmbYDjkJz4oAZIzETEqKqasyIGIgqBDBIAqqIygLiABhYkXTQWicgsa+VxKxAwEQUOaMiKMO52wzBoyh0HVLu9un797HMd9wQQkBKRGHZdt9msmIAQc9J82KdlYF4vl0sjGwt5BLI7ZykQEYig6yYriTr89zBsoADER2sIFkegiAgRzDMBfO9o5h82RoUZM5uigTFzCM3NBDlnR95+fa/NB9CoGpMN0IDdHGO1fd9Xs6pWWT5nonzf6qqaSxYAEiHNRUthws1gzqkn3wY99VO8TfWx1BihsvybygQiIhkRcwHB6gV6iQCo7sTemJI+AFKzgRlAA1lkWRCsO910hyXvWXcoA6gQqFo2CMC1hI+JWa5K/FSD4ccIqerHIDYsZQDgMt+zBds35bu7Rts4jvw+5Rw35+538FGLCN9xR57gAz+lyWfPUYeZwUz3/Wg0zspCnSDdU4xYKjkIzLTvcGa9zHNX2n2xDJijLjUzBlRCEBUEVBO3PwmBAtgpyaL91vMUPW0OZ5/fB1W5YkKFUm4ZoSJg1aK4h0jOK0C0EgSYEgyx+TfvtqTcsUL2cgISEjY/qlmhCrWKTFNntjmIjU0IVhVLCDF0UUREANGIA6KJmEiigkbLf9uNylrhsqIwH3sITnovLmkn47QGnx7NVT99Uq8/zfGZAaBFuxFL4wlmpykazwoIAgAEMbCin+rGHzMaEDCHrNW/4y1w0QKqhZj98j76rGS1mxvN5iohjGRYmCNYeIU+OlUDEQKqZYSW4MKGwMgKpq5CZuDZGYAoooZcyxMaTDUo3ROAWDTpy1BHCrNhAdMzu0PGNw0u3l1Va2kHroJElUyWJAO2kQdHNnGJBVsdMwhgCOpLIIGSE6DMp1T2KTYZ/y1mojWy7KweNUPlEEDUNAN4eQqPupbSjccuBAMwDi0moPPIQWTnloEZFpVVd4a718YJdlpsCtWmo28GEJgVCpGp0qXasDMHBC5eU4LdOpkPzNSsFIFqsygQkZZ68v7ea1GPInAbDMhM0RAUECGL1pwNgBINUCzMb+8HLKWLoTwCMAUkATNNIhaIArPqtJmVpwYARtMEUH0PZY/0zkKAKhbhzhQDBKp1Ug1NfMciDyEqSC7TDsgOOrJsGWkBeLE4W0AfEuMBUAkRBYHIko6qGqoQCRuTqUn25EVGC+RKWRnU1DoyJ98bhxACE4GpEghY8mi+WzhEjCEsFoth3GtOHQcEHob9MIyHw37R9bFjQAuhlNTsQkhpBE8HBAUTLEIkQtRpFpFEsUPENCYAoMAue+KlsroY0zgyURfjMJiIrRZr0jzurx6+9/Yh207wyYdfNeU/+td/APs3D3v54uZ2vV7dGt/s8YOvf+3dr3z76lN++iLfJPrv/Pf+fRH5Z7/zO7ux/8rXvnFA2dN4vgEcs+jIIBENGURMQSkG1XQ4HGxMIYS0l+1u98X2RiV945vf/u3/6L//f/mv/svhxednXZfScLvVyGHVL8Y0fPpnP5Cba9KUTcBksViY5Os05Jy7rhvHgyM8ZgYwZlRVxgiKLitPwK6TnrMSQE7Zl6DDYTQzRupj99577129fp0OiQzONpc3t3sReXW9GxNvX+1WiyVHoz4YhOVqIQZvP3l3HMcQwsXZWU6pPztb9L2JHva7gPTsF5/FEBjy5dlyGIbN2erq6qpb9OuLS+j7fnPxzrvvP7i6ev78+c3NzcOHl7vd7s2rl6vV6q3HD5er1bC9vb29/dH3v29p/Oijj8YhLwKv++7hxfnN9rDqu8PtTYh9tyKP7XgaiJiZiVoWUQYkohi7IYkaioKaA3p2enmIfcoiNsQYkbGkngfOI2UZNBkQqqqIMnPkSAGXi/WiX+1ub7//o+998cUXPTNqCpBvDjfbm9vlcikK3WLZd7zoYgyQBslgAQEtG2QXdumIAcN2PAwqMcZEsM/jQjUQkmZBEJHsSS/UB+I+oKqaWkBsibllEw0MKl4BYLFYIJiL94MAMgYMipolg3kFdwQgVTFDjxeZGWI35il/ICc3KiiEEGMEUTMJCCF2WP0pLgXhAjGaU5LcLZZd19tgXi0kxohIOWcwY2Y0F+ASx3AhBA6MFMEQUMXhGAIymVKW0UxVABRrZLoAkWEYmLGPzAhgmp1lp1kDCQERBWYB8KCH1+9UMyrVEhwJEBK4oj54+h4TAAhSNkVkkWxZjEmXZMuQL/t83snDxS3rYHDQrAakiIpkqADEnKCqJCGaqmiC4gVz1WV0h6YpFNqhVrat+1MRJbuOPqq6zUVGJiLRq6CAOCpDLGqHOWdXNVBXhUIkQFHFmZhhPdjhZaiUIb9pywkGBNXiOmpYjauLHQCOMgmP2P/F8PDwzWQPFEshEKDmBFACyL4XmgExRY5lt541CaDQtEwzYoVNoKYK4iGZGXZwr7BmbwcZACIYmGJNWcHiUsO5pGmzKMx18HwL9uj9cXibsNTtQXNnrBGQX9910D2oDYDo7mU1NXfeewlgl6AQUAUKPvWwbvkl3BSjK9pTMXiq3q6oIlMzcVUFzACYkA2AodSwn0zF4M5yTx51GQM0xGQKhOiVlBDV1BiISSWVyEFNLvBIfSkEVl5lKS+FqDm7/5ca3iioyYwI1ctEYMmgNFWnCRNVVgpU3FNPaYMHgBC5JLwCU4nTitUEKSxMH3YXtYf8C0qeedNVgcGkuFJgGlxmR4ZXG8r122q2aoVYaCZQwNy0/DjlBqsIylyTp8zRie5vhBUyV3mg+5KQj4f+vJE2CwVMp3r54Ylq5JNW1SUrrAh3ehGJGOOpK8CN9MnsP2qRC31SkeIqIYJihNaKWEb195MlOvnW9ZeA7wABAABJREFUPe5CVlYWH7i1MKEyVkW7WewPK8GprQWtEyoh1OcM1ugKi7id4Ph7kpuQegkEkNli1G7XHhRRmaNIcp9Ca6qvEY26MxlqfimcWoVtoTSc0qF8uS8V7KDF7tr/1cvO/z5KDiZ197xZiVZBrfzVDPHp1R83svadWdlITc1KOps/ddNsRoBSyaQYAD6GGQENSMEGHUPe7zhGr5tDECgUfwKXqjrOya2shOYOUUSMTIk56YjmHthiwRIQh2bTF3IzmniLGQM6RigroI9szUmdvF4YLDYJmbvIzzAMWH2TWsrLExEpZvbwaN1o0dMYbJyTKMZxBAA1JNRxHNnS5cMnu70t1pff/OavX9/evn7+sekOdT9srzsOQkzd8qvf+e7FRxc//PnP5fnlt385fvT1ryHrH//RHwTWx48eigjGeBjzgkbOIhnASLMQoRF5trNYNgQmVtW+729ubvb7YbNZ7ZO895Wv/Uf/8X/8u/8k/OB7/2ZMhwfd5fbmCiUvAr949mzZRVFRzWaiaGqQAa0kmRT78O6wr2PbXWgKYMjstX6tboH+wxfPnnmgYHcwHJI7mBUs8MKSDaNiSggJjAiDb5hd1/V9Hzl0IXqxJyKSMR2yvHrx8oMPPtisVvvtdr1e98tF13VZ9dHb7/TLxc3N9oc/+fGTd945f3D54unnf/y9P8oyfutb3wKzTz755J133nnvnXffvHnz0Ucfvnr1+tnnT0MIL168ePDgAXM836z3++12u3/3gw8lZVSTlGnZ+zZDRKXoILS0RbCZTxGMgA0MsykFBrQx5+ZPznmMHBAxa2bk2C+C2TiONzdbRMzjICm9evH82dOnP/rBD0Rk2fc7ts16qVn2+/1yud5vbxbd+Wq1YkuQiYViR8tl7LoQIwOhJhRTUUcLqO5gJDIRQ6iSLe6sQnIKUNU39peSDbCku0zFR4kITP3Mwqxr+4hR1UJsBRYJET0ZoA0VIsJALffGKo0HALz0ki83hHjCdHZA0wZba5uZAZOpiy9PK617gj1YBzUZt/HypRIncIIM5p569tPRwVKQklZUNlxEJIJWvYfaIjXRNX2IlOxlQ1As9aIyGjenW2DtQl7GtAzDkgeSHVsWHQvEAfLKisUNaFYTppnApYOmZ4Xm5Z1Wfzd5pk2BGO3IvzvfJkqTpo9o/i+wojvod/RNDapCKACgFcESmG03xePK5AHz4uksGzyd5Bl+2dEWUvfi6uwBbZZIDZMUlbci11h1JWtUgF438YkaVH5S2zNdpN6lYInWeMSmN1rPn+O95hcuIffWpnn/tDswMwB7bvk8mag0092vRoA+OxCBCxfZ1FPty9pbvInTa6xDnWf3c+MHAK1U6q2YpFJUmshN/YmfgK4QUzLMfY+3AlRqD/g8crc+WvANt6GfyQCbUZ5cnMdnvBPb/LuSxGcTmwSruMK8++681vb62uflt2SAwd2XOJFWbILYJwGqJgNaFogyyACmGOUcWB8hrZPjFOfVvqjO3jIK6/CoF5nNwLpI3c95mv7ZyoYdt2fq+pJweQJYYd6DTbLMqoUzPX6bjSBmMGfRzZ7VZjWYa9tQy5Ix48X79CuNoZJyVBpVNieaJznBbLCedObxk5Ya9a3lsyc9WnDaQgD3HQ3rt3dtx19ZDXTAbCDOgL6T8rHsKt611U9w78KHgGKlvjaAEXmUrbCgyMyr/pUluNj4VrInZoOH3JaZibq2w305rc1mjaPV+rm9dI9sQJ0YbjNY6/MSUjl+F36T1iVWFj83HD0Sr6qWEu5xd8MhhhBoicQAgmiECMgC4msXhQhMTGzueNciFhhj7NSGnMDASedY+cTOSahg4oiwZB5FnQ0breW6GpvFU9tqCsFkKDrvpemaNwyBiFZqGQkgoEHkgAgeM3QWkP8KEftehsMYus32ECH0v/RLv2IhfPzxD3fXV+vVaj/s+vX5YEkhff2rXztbL3/wg397u5MncbM+Z3m2ff7FF8sVnW2efPFyfP70uQ1E6545MuVhFCN2UgAaYBFz9hSlnFIahiEwSsrr5cpEVeRb3/r2m88/ffns+aef/PzmdheQdoc9LfrlamWaXe/czDyzmwGVyNT3njqQAKBUY5XWY2aeg01EBdvV/QIRCwf6ZrtdLBah61JKKSWXh0+SRUdkcjbRcrlExOVy2XWdqnZd18VoqsvVSkVySsz8+vXrJ289vrq6+vjjjxeLxfn5OQBst9vVan2+2ex2u/1wuL6+/Y3f/Pd+9OOfapbnL54/ePTw008//dMf/OCrX/1q1vSzn//88ePHNzfb5fnm3fc/FJGu6168ev3JZ794cPno7Oyy7xcXF4/UDAlvb2/fevK2eGnMQnM3MDcyQcGYY6P6ABmCUUmbA3eED8NgktvgPKSDj2cnlYUQAqEx7m6325ub6zdXX3z+2fPnz1+8eHF9dfXwfHl+fvmLz35+eXkpYvv9fr1eLxYLZtZxSCmhSYz9YrHousCMQBwwHMZBXYKHSoOJWXMSMGSAIuqPwYjK8ktYpLRUVbUaAP6uJ5xbZ5Oqejk8/6oI42GRyarIeMo3nexnLp/7TGxzFgC8poTOKk81hj8jEaA/S/uqDDxCIPePqscWzIggtp9DZUy27VJrvduTRdJcnVjEL984S6pObJ4nIwZftZgKrOEikO0inWiASiQICjgCCJiqopIBWQDog6572/S67LTjQXPOlr1MgysqgCJCMU5m2J1cuqTNLQPfPb3Kr1dirNpMJzYUoZlXbSiXaKj3yDXdVvXqH22LPoJpaRFS6z1DRFc0rX5IbGAUS1qE75hQvwUzQyu5bfO34JTOOgB8P/JqOXd2fDQ1IWQzAzVw8YlT2COISMYF5gEUrR4wLBbi/OQ2ticwiie4YXYg2tEPS6q3zU+Y9335v3uB4jHgBoDsiYlKhAjYMt3d7dCO8hMikiPa/RwETzpd884pvrCaTt1+1Wbl1B6igOh6XHNnI9aEYB8q7f/81ZATG06ecsqpaI9dxN9rZQ9/wVNaSfHQlpxGhDL+UbGoXtUnLn95UGGC1PNPCAF1jvh8MEGxZMpI9q8mA8CmfO1pUNrR0GkrwhFWroOV5vdr06kuRs2EKq+kqB/cHSIN5OHsl0XxaqoBXCbM1LYjQ+XPP7Aa9PXv8jgMJaw1H7layYDl2an1w+lbh2JXwPwK/gAAZdOpv21NPPVV+LdlFarLehvWSKRZ7s6stoq1f09/m0uFtYBjXZXQP0RnslpNULC5QTnzi8/3ofnO5Fq585mKiM7imVsO5e7ILvoH1c+kCgjmbjuo9pgZVl8UoE3xxHlPtWueLEZ11JU9eBqHMyWl+cktnFLfmo9lE1EAw6JKRdVab1PiNLln/netdSCjwU52HfYdHwIFiMTZKaSubkpETBiQghECoJqN4yiSiCh0MUhoS56qoiogIWKgkojqE4RaqK5ILJZnFhHNub0yxx+ReWb/VIQHBQMRUZO4QcRmMjnEb2MAAGKM7qdkZv8bEYmMgxKFm22O3eZrH357tXn0x3/y+3m82WzC9esX77z/3g9+8vPB9C//9l/DDf/kxz+8ojehP3/87iOj4YvnH+c8Pnn78uOfvXz+9KB0cf365t3HD03VgIAymIUQzdSFGplZogyDjmNy7vXNzRWAjuO42+0QkRfx29/99avXb1KSp7/4jDreHQaT3EdPYTc3hvyJiAKReqGcNrpsimjl1odQl3gP2qopqk2bhJlVBhEzJ8luzxJTpP5wOKyWGzcA2iQKITguJ6JxHNfrtRtsfYh5TP/m3/ybr3zlKw8fPnz58mXO+fz8/PHbT3KWi4uLF69eL+L63Xff/dGPfmRAh8Mhxvjm+oqZ12fnQxophrOz86Ry8fDBm6ubJ2+tNuebEMIj7m5vdldXNy9fvhmzHg7jX/6tv7rql9x3v/jFLx48egjk7joTEQIlIkZyjxxVURqt/kgfjG0gWc1zRWQOxAHB0uFwSCkBQErpsNsP+/2rF89fvXjxs5/85NnTp5LH3c319urFVz98Z7XcpCSbzeb6+vry8rKPYRyHcbcbxn1HECMvlp2rdgIxUbCUsimYZQVx/zpN+0NAACYwClVxH6t1N490+RyhmeHnGTghBl8Y/TS399ocadOhvcq5y8znl1Rj0SfL3CSAmig8sVDqhIJ8KqjtS3QbflYFf8v5dQVAbOqmDmmSA32RZA5nHd+mnBlABTCAcRvnOWcgMphijPMFs+zg4AaDogEpKqKiCVhCzWYO67OKEWIfYd3b2SKvu9TzQDaIJDUBU6+w5MzKO6Hm9tQNEbYtqWToFb1278aphTVXqhxEJ6Vsjw4r6b8zBqiiQeXxVC2gWlTI3Zh0vNMe6ZXXbiwXd6UI9zPO9wtEl5ssLWvvt+EzuONu87qEJ+3HmjJe/jnf3O87EP8d8t93zj/a19qf931450bHR5lTFcpjY3/YlHbcFpDZrj1dzf/Z3FJQmEFHtlDtfzq52iQCWFIoJ3hzdJfqQWiXdR8PEWktEof1/wAA0IqySsOHNeO0OY9o7iquTI8pgnoMp+eLyQzwY3vk9kT3nO8Tv4QVpxs2M3X22+nrqRDY3R4hogaOzRwGHauyHFmBd6HVzL6sbb67prRegFJD1tE/lxeCVGMC1MSLijHv/6clr6UB/9qXADCLTE3trLaQN8WFhwHmRqxVk7P0A/o0r94jRN/gzKzUkvS5ZwCIqkLV5d9WVUQCNZh1vYF4eAvqOz55BU089U4v3X/Y0TH/Aue/8l3ECaz3XcXpV0fnFylYJDBsPKPpplhiBG22AaKBwpFBWFtupoUqQ1Agf1HWZOcyen6txweqLlDzsRdbmQia/CvN+4gAoFAfy45b2tV2/eIrmiqvNVv3aFhaQTZQnx3NfNtWOFpezcML2NQYfCSCkUNLs63sg3QL6wN2xIwhGJuOgmDMgUIo5ccN1NREx5wkjaHrAxQ3v2jBYRw8TYIauCRCtICm6Fu8qgKoons63XPZxpWn6sboVYQmISmAonPCk7qLqObCKQQwEE0ZzGLfxRjMnJsI7vcPgV1CARENhcAwhDHr13/lly4ePfnxT368295cnHXb2zdnm9UXL3dhsfqLv/rdweRf/Yvfvfz6k9XFBrrVOx++sx1ubm5fvPXo0W775nZ7dX2zOz/sb65u0eAw5khGgVVFBTkExMlQAVQkYzQD++yTn/f98sWzZ8z8/vvvm+T15uE7733lo1ev97thd/PaEDiG7fZmvYzVJnTvjM9jEpw43P6Ofcvx/mm+Xm1CLpIImsoAu4fYd5HDmBCzmGa1MWf/7YMHD2KMSGCkosKhc4WW1bJfLDoQHcZB06iOwwh/5Tu/fPGLs6urq/Rs+M53vhNj/Pjjj5HpW9/65f0wfPjhhze3u2EYxnG8uHzIzG+/8/gnP/kJIr793rvn5+exD+vl6jAOT548ub693e/HzeWDfrHAsPjwq1/7V7//B3/4+3/4zvsfbDabP/iDP/jN3/xLC0IPMpQtSrOT8RAJGQjoMAwRzEfRpA+LiEjjOLZO80IKIQRQyUnd/b9aLLuuG4f9zdXr7c3tqxfPr99cXb159er55+Nhj5DTePjpT3/6G7/26z/96U+Z4/vvf2g5iWStxbZWq+X5+fnZ2dlqvYwxqoHksrZ4um1yk6y4CSEwEbt6N1Gp9+K4vNnKU0EMM1OV+Zrr/+/joak/+a+yCNa4gU9PRIwxgmQ7dpE0+OLGwHx19asRM3Noa7dfVkzJwNQn6RSfRE/KNswIKSVJY2YKga3EVNEDM2jo0anIYZCU85hzJvDgjS/S7iVXSAZsAFqYt2piCpkguLIQoRkioJq7aAG8FiEgMpqBqiGLSSbIallNDQ1ITTEEW/V6thzX/bgIuwh7kAGSlHXzCHi1DQyaGeCrdMkrowa8fKo1dSAAaGmK5ntNCxqUW7hKwhz+asUbVUVupsLXlkRr/jItGQflVRaX3lHeNsyOaoRMHzj7CrHoarQre5Yuwuy/yIDItdZUu0QbRXCMaprGkV8c63mMBC3VYY5tji9479G+mh5hYpwfwbdm/syuP3c+IkBVlEJquzCUQrwOp8DAmro2VIKOVFIlkQfG9aTD538TkU95mBlFdTgV9OZ+5AZT4Dhs3v4LPtid9Yhk6FXvCX1Lrb1TZ5FRCHfduACFotFiL61L1chAyXNUsNweWySwqiMamJbYxRSHb5dqTzr/cPZHTWVG9cfB6rz2aTEfS5MK0Aw8Tl/PO2je9bMhcmq7zL9FRJlebUEXXtbBDeuTp8KZyVleZKU9nPbvdHectXw6vmx4H19K2+PgzNSpL8GKn/C4H04YO0cXt/Js4PVV6F7JfXMYWhtcCCpT3Bms/dNscjz7ongUbps1TFsCrh29OyyaSH4eFUadmZmWXOWK7xHgHp99faGFeoin/SxintHfosaIWDPDsT5gO+pExbI2zQxuLQ9v5hGA0hYqL6hdhTzwVtbT436dPX7pr9mm4iedjCUza/tEg8VlpShZ5Z72XlU7oJBi58t+G9+l9fXzjGJqOzlc5y3HLoSeO7QBMhoDRQwOKwHQUCWLShJJzTcJTMxc8vMMUXPgQGhEENkdE8QY0RS09KSWfPYq/ZkzFP4luMIPVrzSCD/ez8UxWdeB1gbGqfe8Am5K4j2rqgCSc4ZJ2wREIKt+81vfOj9f/eDH//bN1Yvzda8qXehfvrparR78vb/22//yT/7o//OvfufD77x/OByG5fJrX/1Q1Lb7mxAppX2WkVB2u1vTHKrJJiDEKCpZtOsWXeQxHQ6Hg6owUwhxUP3xj38skm9urojoa1/72ovnr8BMc3rvo6+pwm53ePrZz27fvNgN+xhDyhlM8Ghw+jQM8xHbMNzMOjpaLbHyrecTxx35JR+UWadMtbharRw6d10XiPu+N7OU0rJfEFEak4hst1tCZGaN8dWrV9/61reeP3/+ySefvH79+hvf+MZ3v/tQTD/55JO33333Jz/5SYgxxmXXdRcXFy9evLjdbr/xzW/GELa73es3b8zs4uLi4uGDIcl6faZ687Off9L3/dtvv705O//2d757fn6Zkvzpn/7p5uL8+vr60ePHu8NhuVwmUS0qgYCIxCUObiBzkrpbNT4ZfMzUJMXqpc7ZC8kNw2CieTwctrtxODx7+vlnn368vbnVPHaBBW0ZgyXe3t5+8slnb7315M2bNzFGZLp6c0M2Gshi0T14cPHw0eXZ+Vlc9Ig4jEnVk/M459FUF8gAZIrA4PXvQiBEMkWqNXTMQV1T16m8/4bO26ZQaTk0cfBmA6BZgy0Uxsxar9yoQVAoZLlNq+pfwlDyZSf+z8RLKt7raZXxayERhSJJ5BEAz8XnkgQ5gQP2THXJWap5A8JCXt0oRGrro8fToNq0xWmiReHYFzrzJM66vhFF/4kBGaiCZZEMqqpFiCQyrDo7W6RNd1jyocMDygCSwRdcc/e/wlST6gRytH/hUY5i3ZtmO/U0W604YKYPrDh4yiurm91Mc9JTFbHRgr2qu+M9M6o5soiIilp0VY4ddieNnx33ednuO3+CVTU0DI5FZ9/OQY6ZgXo6+2ySwtEqdO9x96vy8y9p271MXquezbv7KR61wRsGMBlUkyvZHwbv3GD+ScWEFY0Q4ywT1XuJap3vBj9mbjtP1kKcGQwn/21PZGZq5jpvM39muTVxSdxsv/X7uDLWyasxs6IjN0MjAGAgXlUQbCrdXQ372die246ziEe770kXTX/4/4otUZA8eueDtF+3pzOzAIRgoJXEAXUsaBHYZpgSVGsm6X2D4mRxnFo2O9HtkbICcPUj+IqMCK7z6KOCaC6AOnVHsU58njtHxBcsZ5JNnUIzicb2YqAZBhVPmlmx0nxZUpuyEMoJ4pAc3Q1Sr1fKRHiXm2KLOHgXGvkPvZheDTu0eVYYtGbAxzXbfFCZGVY/opk1RpfZNATNrPqwsT5AvQy119W8I0e2VltP56+xvi/v4/k1p/Crzf0NgCoe1qDaRWRFRKfEy2yyJ+sQwOA+Kijy12W4amFimLr/34EsgNfaao0v2m9WdFVRAameULen+VRsAasSbCmOnDo3poXDXw4DlvwfIhd8s7KltdjUrORk7biKF4tXCYDAhVBEBUI82OF25A66Vb9edB30hAdAA2ZmilymG6pm95saT8vB/5+xP/21JUnyxDAzc/eIONtd37v3vi0zX2ZWVlZ1dVfVVDd7CGkwQ1AafhMEEiQICOD/JUDUJ4kQ9EEAQQgkoCFHUnM0M83qme6eqqzKrNzevt31rLG4m+mDuXvEOfdlTwcSVfedEyfCV3NbfvYza23bdd57IKAE95dBWlgCMAz2CJE1kdZTHbQAYIyxlqy14H0P+xGSAEF5aUEZ4gMRkQAEZS0lD0GHAhEtAUrgrvUcRMQQgYKIQIwxQiZ4EZjsHx3eu3/61be/f/786eHhvkhZb4KRcn/v5KNPP3vz9s0Xv/1rVwgYIFucnT6aTe9+/c2Txx88LkvnQ2cMLVZzkK5rN+NRMb9ZHO45wcDoBQIRCPZkNc45g0IEXdPUzfre2dnF+eXedFYV5dMnT5wtHz16dHznUARubq6cxefg371amJK64A0oZpbNsM5rypWEFJHXzWBQhL0q/IiIEkSk94ANvLygwtNQRHGoomnIELmiWG02ij7RYsAhBN921toVL0ggeA8i69VqXFaOjCOjJR1ms9nh4aH65tuuLqvq+np+/tvLcjQ+v7j4/POfLZfLFy9efPDBB13XvH73trTOVSUYctYK4dt3F/7Vm8PDw9PT003rA3MQWa82k+n08ePHVVWdnJw8ef7s+fPnxrmz+/evrq6q8Sgu6gTa1AOmqioBYGUXGfjOIZ3xIQQSILQi0nWdMwYASle0dbNezm+67ubq+ubqcn51uby+evHsOXetEWbvg+8QYDKZPH3y7OjweDqZtW07G4+QoF7VjmQ0Gh0cHOzv748mI7Qx6bZTlg9nIRgG0fwYhBgrc8ZaQyKa1o2Cw7r30YCBQa7L8HxFECLjgxCJSUWCBwefPqnvPgyO5+GH2XgYKPeYd66J1BesDVbpxuyVN0IMZpmr1hZLAAa0up0phFiTO1atTlgmiVmWpAChwjr2QUIIEgwZRMIo1Qk4KN2ERrOHitrwdIiKiICwkFGyRlHwjzCIRDyGsKCSdxSWJ2U7K5uxXZemJmkBOwZBTa0T2fUlcc7OjFI3rig9TUgFLWIk1MBBphYKZRUqMQpKBvYIZ+IGEAAkyKeScotogiahEeFcfEoPocS5lza6UNJB8hSjtips63CQHHm4bSQgpgz0NKm5/xh9KB4RYw3axDaCiAwskJutTRQJrEHa1EodIEIAzcRLY9DrCYhKw37LEnifGZB2vcDgfNk2D8ygy8mFpw54iAw7mAcKgSUCvuKjWBBJSGs/SKRKYZB0yLJEJ5wgABkSASHBLHCieBZIkBHpI2Yi0asJSanM44yIssPzqoOuMhzBaB8j+XxMk9+ZKaS4fST1Kw1Qf48klpc0aHHfiaaMI0REhKgzfNuU0sGnhJ7P7Y81yBNSI/9KNyhybrK2BokgkfNiqteRJ7GHAOUjMD22D19mR0gUAe83dvvn7PQhK0yDHvZEy/EcHfhNcXisvtfjPXhXWnuSHMBboPB+N24D49IN2ckwTLvfMmD6/+0R/LDt1d4lAsJkhAlrWmuEXQJyFkw5l8AQ7owYRBaLYSi5jw+kIyxbXNvjAIOhFgKAoLRTfbZZTmKw0VRRVTDHELbFAqRJHEJX06tFRKy1DEPyhHj8KMQZevtEm00ExLhVhSe9ZuC5j6mH+k+Oiy4tSwgshsRzXPGSy4rpC/oEvqyh9Usivg4hFXcURiBd22oEkjp+iEAEWTo10UGFXZSpgmjSwtRsB06bpdcAAIBBDEkbunVoRlx35NkAOQCLIITW2MTVpWHEEIJLXg0Y7EFmzwwmBCeszIzMntkjitkV45iRykOkiuIXjDGS0haNMcn4FAAIIagBYK3N/m0A8N5H3SIpuN57DgHjA7SUODCCIUIqiMYff/KTV6+/f/rd74+ODwTqriPEsqgmZyenz588+bdf/s3B3tgYe31z8+HjRycnD7777llz4z/68MO2bZwlz+HOnaO370SgGzn77vWrsrjrbLAOTGEYLTN3nQ/srbXGgG8xhA5RPvvs0+V8AwDj8fjrr7+2ZCyZ/cPD84urTdOdPXi4mF8a7CalefPyiSjgW0dY06wEc2guu4fzWlIPsSTHcF5RGmNR9U76KJxoEKYLIbQtgxCRKVxRFM45TMmjXdsxsyUzmUyuLy6tOquJfNNihdbasiybtv2bv/mbn//855PJ5O3bt+v1Wn1UJycnr9+9XS7nXdd9880fPv3x54BmtVoUo+qP//iPRWQ+n9+9ezeE0Hbh4eFh27ZkTRA5OzvbbDYhhMM7x8ub+bvXb46Pj6d7k4f3H7x687pt27au1+sVEaHFLP2U6VsAqqpq2k6hZTapxSEEjKgS6bqOBLQ2Qtu2DTCzZx/GVQVVsV6uLrv25vpSQldYc3X+7vrqonC2Xq0BwDmHZI6Pj7/55pvPP/8cCer1ajKZ3Fy8dmNXlsVkMppMxq60YKhtWzDkQwu26KEt0SZhSB563ZUkQQQQDTMPFAgyxsgAVY+DxCG1InrNMkm24cnY/3D7n3pzgJDXibVWi6AlZSgOLEW1jxUxJYOAUjz+BqtRRIJ4QFZcRYwwJI441VZClKC68RERNfTnQ9t6ZuUPRRu8J+yd5XqCUGqYSmAkZGYihHT6A2wLbQAW8DGOwBGxBCCEPHLd2DVju65oY6QhkSAxkyrWwxRObuDhMEb9LJnfvOVAlSixt2HOgy4MrYrYlvzz1LXoLUr30JafXl3+gjGHWACypbR1jOyOQ24A3LqGCsmwJTv36Ncca7rtPhMzVGHXvMSdjFsdSUosN4O3J/rtW6/Pj8VbnULM3sD393HQJBLMds3uPYnGsLdW9EVh6P8elLtWbjro1RvULCMk20fIB/3FxPuZD75kueFOF4ZrTFeTARRCi8QIIcnzQSJNPJElqTJpRkBRDyL9MxEjaC32F/rp07eHwcmSjG253ardtg6sl+HHwydrm7Ordcfe2Z7QflXYoUhK3ykPpc1Tld5B8QOBjEwB0GILFLxEPqOdlkWfLRJR1KB0V8UFj4jIQRCRUdQ8FQADJm05IjREBGTyrlODiJRBVkNmQtybQ9EJN3w7oup5fWxXZ0MFX8L/MKGwcNaCRZSbV01v7Zc6jPuyedFFEcdGs5TSyCAipnxXtckw+QAiMy5v+5B66ZDjyAAwrFuhw5+tTEz2tEQk2dADEUAogrYlq+zRWwORGwfzFtK/DSgobwBrU78PKjflcIOBAHivd+po67wQIorPmlBvjAkKC4OQ2mtJpUcACB0nOZJ41BSgxcxJG9bNJsAsbIxhHxQnDxyn1Rij60GnKA9YPhElKG8/qmWGKMYYLSrBLBQPXcXD+MEkUqKnSMkIImkl6IAbNDk+jhqUEFA1yFuyPvhFvRzTZTl246IylTEETqsLCSBgF0LwngiMcQBBoUHMQXUUbprWB1sFVb7BWMlE9Rx0tSjGQD8UkfV6rSW6yrJUxLYOgkGDQFrDq60b7ZQxxnedwnu6rrNIRBS4C9yJSF1HXvymaQCAxXe+JVsQ2cDcNI11hTF2tdww2c9/+unl1c2T77/dn5arxeVkdhgIprPZg/sfvH356ve//duqlIABwYMrTx88uLx4N7+53KuOrBPryFmz7jo3Lp0z1tLi5nq53jz64AwNkhX2gajwgVlYYupCGUJYrxcAcHBwcHl+c3FxMalm907PQu3JFm/evAEAZphM905Ozi7fvTw4OJqU7vLdi3evX01GlTE2BG+t9YEB++OklwBxHvtqOPmC/nAi3Vv5HlcU6/WaUy7KZDIZz6bIYgmAYX9/zzl3vV4TiPcdwfT46GC1Wk5HYwCYjCtCcZZAUdnsf/Obv/3FL35RFHY+vz48PF6v1wBUluX1zXw8Hs/n8/n8uvP84YePnjx/9ubNq7P7DwBgujdzzs1vlpeXl0d3jkXEOYfGuLKs63q1Wty5ezSbjm+urm1hXr16dXNztd4sBYIxaAk39YaZnXOmLNmDZzHOKh9O0zTWWs1A3Ww2xhhrjVLBKuG9XiEEQ9B1YbWYl851Tb1Zra4uLrum3azWvmnv37tXOTu/vjJIrNwwAl3XzWazuq7LqkDEzaaeTqeFlTt37sxms6IoitJ1HNS3XVW0bltENM4CAYvUbTMuHQME4SBsyBowejKISMuCRGrTtm3bdZ1Qn9utYi3uvuC998xgrUUU7zuI5gEhYnK6cwgdc1B0XDatY4KKBJMqiOmu1KwJgFhauyiKLrF+IaTaUGSISIE91lDHIQSPiGAQEZ11IYTgW2ttWVgA9p6FfddsbFlYUwAzMMdQgoghimjiJD+ZWXywxoTQgQAZwPihAJFzhr0PSdfU1cvMaI2IoEFjLKEGb4kMgUUICBKJeRkEjcGxw71JmBZ1ZVaGN8iBxSplEBEjI1CQROE/KFiuZhYKGECWWNc8n4ND+AdGAuv+P5HAzIaSSpP0ENGirhJz8DRXP56zGJM3AMEzi/qxIsiTREDrE+jJhQAiSGSHrsL8/6KxVtOnTdJWbL8XHYzALJjYRaMqlmAkJq5Dn488XW8czRvFafYAs6RF9O9S7EOMbG8pwSAISgyv2e76IUU458AyQUhg43iQqUNOtbutzqvnJM9JTGtMuGKNrCIAgLFFFpgQ2QuzgI3Kj/YMDRChAuVw8Dodh8Csp3bfqS3QL2fcHQAYYzVEFsc5ar1CiGCUYL6vzKRKhzL99/oGYaynawyIRET3ABWOiNbYPLkAkUg0spJyn2inKGKrZ3EyYKy1TMzMUVvZLpCaFMjoTsoTxMD6IWJvxDMwChpjtNJBJJiK6QwmIhqwd3XrhKZqWQOzcqiMbl8C20nAw24PzWgZuOHTIu5V/+E9mCwhyK6XIaps4Nl9T9sERMRE6m4kGda/ev+VV1u+MRkMmjBxO7jBabHmRZIf1eP4McLDFHzaP0TU2QHqITaAIdLQkgYTkmAabLw8pMOlP9h1/J5pibe8B5elhAZJ789TjP1kCeVJGTb7h0aPI6ghesIMYpCtOR22JD6nh1dqrDaWOgQAHqyTzPWDMkgIksgLijggcEOkmDyw5WeQgc9bJHGIRpZt5QNOlKMMyRpEQkCwOTkYAIZJWTk/DCPSzPRrQNdROlkSfUQ/DiqYAggxB/EB/YbrdbciwKIgI9ZLING1wErTkVXJPCxZnBERsA8hgDGFsYV1lmjHYYMJqs4hAIC1FgGUWwYAEMWgIlx6d6YKzZ0BHPIWDEmB9LCMWz6wLexmuS6rUccyKkdX1/Of/skv3Lj83V9/MXbl/GY+nUzqdT07Pr7/8MGrFy8WNxeTsV21S8RgC/r8Jz8FwqdPvrbVqPU3aPxobC/PL5GKvcM7jX/6s5/9kff+zvGJCDEYQ9j4NbLXNAxm2NS1IQwhWGvZ2qbpFovF8fHx3t60bf2dO0dvzi+uXy8ODw+02UdHRz/72c/WNxfffvXFdLoXjprQdhFJ0nW+Y80gV4k/BLeoHt9D8gaXDkvcEdIPYxe8GmBkLQA450rrENHXGxSo67qwbn9/31obuo6IJPDe3h4JjMfjrm1PTk7atm3bdjqdjsfjL7/88p/9s3/26NGjuq6bphuNxy9fvj57cP/s7OzVm9e/+tUvL65vvOfrm8uzs5Mvv/zyxYsXs9msLMuiKERkPB6rTtk0tRGHQNYZH7qrq0uDREY6z5PJ6ONPPjq9c8zsCfHFi2dVVY3HYxFpmoaIrCViZyulyQXvveqVk8mkLEsR7jNi2y6LgrZt1svVdDzumrbZbNbL5Tdff7VezpdXV77r2Hd70+m4KJbL5Wq9aFpvjA0izLxcLn0oS4dFYSG4wnBZlkUZy/TmWeh804UgAGiMIXSEQhhYXOEKh0VZOEsSIPgQfGBmNEYntD+eBiz+JulVeUcYExUCFSzZQwkpryOzY+lmGar7hBEiBdsaW87XGp6SkineVRFMrhZrLSKqeU9EhDGxTAeBolovImISgCdy/saTlBGFDBAhGcCgWT36bA8igBoaNICiCotmFyX+e4bECKT6KiBwSlZkQCEMHasZwyBgDVaFov/9xLYVdAQhsOiOZWYSoVgTVDtOsBvkx6GneRgBGNyXJ0LPtrweBuRzmmkaPQX6QOodnZGwmxAg5qfqQ2IOGIICSOI4xHZijxvZkQPUQ7pTqEEnBVNhzcH9RJTPkaFChfjvYenJKhP2CtsWuBcAaECNnQ/ibAAgmlvHdN/+3Gw95rcatt27NFO5Alj+ZCvtMdkg2X8XvXJxB6V7tsZNlfVoGvVvV707PSfP4874bCVdiIQIpoqOxn6gJJ3wkO2PW+PMg55t9X0wAIQ9zWqeyiwodJ/ocEavcSIVzTIkzs722OY/BLcmfXhD/mcvyhB5oGUneI12fQhg6V8RzdmIwh/YUrgL2ulz7Ye/z6sl27s7a06Ds4AxnSk2EVK0MfYh2vnRnBQCY5R2Rj0i0QstAjHXu0eh5OlETIW3YqSCIa2wuOwYE/4vwbZVGWYRSND1gZGgY0cCKlUAINnTDJKgMzrYDBoP0iEnIR7kGEThrnZwGrqcScwSBnOpnQoqzaFv6K1ra+Xz4CO5/XUagV4vV6GpX/SfxBuyDyMLmsGZ5/tR1z7HOGvUtjn58LcbkW1OYGBkyHkXvb0XJ5hz4k700EgQLWuBEgvESOTxiJtDUPMBAABCiIU/8lu3ZYR6JrK9gX25ADBIrCzLubPpMQoKkv6377t0j3MkrU2DgIABggQC9Og3fj2HG7Jo3ZiZfNuKJwdEiqMQLlwBhhBBKIbyrbXOAREZpBBCaJpyPC6KoqycMRF9IckJTdY654io6xgRXbriDjVgrRUfEEDCcCWwYp6YGQIDs1B0VzBr5URdnYYAQauEk9ODpCxLH4Jzo6bpTk/vHRwcPH39HcimqZs7+6fruhk79/jDj1++eX5x8TI0m/29cvn2om46M9279+jh0+s3y+XbO+Pjul3PV69Fuvlyfnh0xgK2cKPJeDqavnz++u69+2DtYtmNyklbN166ENSTygUaADLkZrPy/PzcOTedTovSGWMkdPP59f7BndGo7OpNs954347HUwe8v39QWbM3Gb97/WazWVFRNE1DQJaAOaj5JIFJK6Aq3gBFEAKzqj8Y/Q9SFIVOgc4RJGsBEZVzCbUKtYBvOwBwZKqibNsWmKui0CTs0PlRURLRdDp98+bNbDq9uroajUbrzcYYg9YcHx8vFovFYuG9n0xGd07uHB/dffL8RWAhon/5L//lL//0Vw8/+PDi4mJd1z/+/Effffvk5upyNhlfXZwfHt8x1g7yy31RVBah67plvRyVVVE4QX94tDcaT50rluu1Ma4srCsMkkjojLWlc6JlU0XUzdY0jbO267qiKBCxaTpNOGFm33klpVLTqGmatl4f7h80TfP27dvpdHr+9vVqtVouFpvVkiCGwkbVZDyh5XKlrvS2bZHAoAUAItrbm+7tTyeTibVWEp6QmX0IgX1IHlNBCAwteM8UxCEaQAJiIYxZZwisbPc5Fo8IibZIqXOGGomxFgfof5XPzBESqaq26uhKFCu4ZZ9k4aCRAX3RjiWZfXtxnwIjoHOm6zqNwCASM4CwSCCyxQBFSUSWMKSDm4x6MYWDxxAzm0MIEJgE1EURQgAMhU3VizkqSZICyGTUnxZ5z4SQiDhlGKqsZ9ZURmYEj+K977QSXOVkVvCs7GaurdBb6fQXHQOzBMVfce92TfRb8eTVs2A4dqo2CYpIUC8bqEdcR5azoNcUXyUMBwRAFkI9cpFj3SkEVN4cRBt1AkmMFGBFQowxR21HVB0F9RohQOajAxicjzqJyMzqwc3GADOj3VWKjA4kkoh4GRiiKmUD7xwzir6jgY+fBzlveqbFODJEF2pumMQwRlSQorqb9DS9R13FdnvUVT9OJ33m0xvoy/EVtDtdkKr3AMjAeZp4lFKV3971SepwS/9FJUINYYjMw6oiI6rDRScIJJObi6ZwMCf2RdRaEQKZ+1+Ng6j3I1FcTLGA58BsSMQzgKmoLiTrN9/S/yNmbWYFnZnVvE3vTUMOEdWWFcLsZYxlRrWEg6SFBZFaTlLhwfxf//Ye2RNtLIjammS1DRGFREgiMdquRnSrDgBs29m3r6GlC8m21lH9ofsRESOfQD98yS4Zeov7nTB8gvydDcot/7tvGzwqq2fJW68NGIBeBkMh23D/nfbsCHoBERP3ZW+aSwTnSBraEP+Ou+s9jRw8d6dTPzjOP9BhjJMDOQ4wnF+dymzI9eNz+9p1VKSm3m75zvQNvwcAZsEBO1Z+SGIYxeGLNPcHM+ZJhKNcQ6VKkwiQ7c1iTmwAyZejW4qTCx8yNjSeK2m/a2Aw5XxHc1I/Sbs1ScPBMgbJmy3rEjAcBIwPDQG7OtRLwQLtqKyMQOs9MTNYK8ZzhyjWDkJhqtYbYx1aa1kx+sjFuFLwABGpMgGJOxxJrLUgkW1Q3Y/W2qijKPYprUneXvDZfZsPpOF06/OdtcxehJ21nWcEUzrX+dp7Lqvyw8cfX15eXJy/skbGkz32PCpmDz/+6PL83atn3xlixK4oiSz6jT8+OAjs3757OR0B+xvh8vW751Ozb42zZfXu4vonf/yzz3/647/4f/3PZCZnH3744MP7k9IRCprON22riQVlYYzhzgNQU3eFqz7//PPlctls6ul0Chw++OBh0/ng2+X8an5zgb6ZjcqiKKbTvYIIZ5P1qjbGOGNX6wUHIAOhbYOnWMgdABPRDSSiJEj6nN5AiT1GUyIkQdF0AI0xmq0uiEqoX1Tj/dlsuVyq+rharQrrdPyn0ykR7e/vr5ZLIqrrem9/n5lfv3j9k5/8RIElIYTvv//+4Oiw67qf/OTHq3V9vLnj7LO/+qu/ent+8Wd/9mciYTKZPH78+Isvvri5ubl79+6zJ09Hk/HJyYnOtA8tBXDOGYvC2HWNs2AMTKfjsqrqumXfFUUxnY6NcUQEhKqRCyJB6LpOMSra5q7rhjXm8orKLo163cxms+X8umk2FxcXX335OwNoydR1vVwuN4s5IhbWRl5b56rxuCxLAGi7xvt2va4LR1VVHR8fHxwcjMdjAPHcaf0dJbOSEIJIEI8gXqgT8IJN6x2K8yZW7BIkNETiOXCKfmkbcxGTnWWv25BSxCChuRI40/ae1KE87BOmB65NSdG8dFvIkDxIwQFMRTnyyhluUoVEsw/gNKsYc34/JTVAbzbGaFkJDSpGsyT3DjXXyIshQtQSYL2wEhEIhGhMru6iPhaV2ATKvhkYCETUyW5FJCCAIR45nFV+r2xnxcbBhrjmwMCqf2OM4vbuJBX7qK7WgfdwOHTp7/5M2BFNecTSEzDpUtQrSGbAkCMGhpRyEHF/aSoNQAAwEisAcO8wupWNOHzve/+5E626fTK+55PB38M1eftOEelLfA0/HKy94W8REbAvo7ozjDwoMDz89oe1qnw+9ndoWl4GMmzPi0gf2x8kRfTabP5r8NutrxARQ6rLgL3jOH5HPZVWb1ANN2NSlKMWHT3RWVUYXOl3w8HsCXwHemys4ooDl0GGZ+8Mpt6Q03WG45ZPfBr8lgAFwecayNvdee8xPRyTwVf9KT+cTL3BwvsuTNO4tey0WYklICtqUa7JewpV5G+Hpov0jLxJY4JEPSaCZLEHz9GwP/n5vSMXIwReRHa7m+6EWyq8QGBGAI4YHGaFRkIWQIMlGDU8nX7pX4DZGsa8qlFSAE4pmFgizS9KossX0GqEcivDbDh6iJjZe27Nze0x/vdf6fmDg6r/PAcDpI+Kba1aTMOAw5xaHtSgTTp0Ms2Hg73TetnKUxn0mkBAePBrVIs42gDMmigSvzQxjgYhCDKopgKgyUbqhhm4VbQU2lY4JS6NdMjhcJn0IqM/vzEXowHoF3PeH5xixtC7Sij6izAAYkBupAGGUtYjWDtLYokNQwAW9iEgARrikMvBAETNm4qi8E0T2laU20SrIA07Q1QUBXgmIvax8BCH5IVSwnLcKi10+1jC5Lsa7nqJHJg2aoFiVCwmDSYYY1of7t+/X9ft5eWVQ7CF5U2QYD7++PF8Pn/+4vtxSSwBUJquK6rRyNLpw/vn56+l2xhoQlNTaS+vLj787OOr61aw2Dua/OTTf4BO/vKv/rUzex/++NOzh6fec+sbJGYIaMBaY5xVuzGwmKIYEQXvVRtk9gA8GRUsoVmvmnoNgQtjxYfry6t3b86PDqYoZjweW0cGlK04gIgHEEsZwq7yWkRUVcrSTxeMliQLELS8kpLLk/qOWBAxcCBriqJQlkaDBMwobAmBAwoRSOlMVdim3dAGqqqqRgVLJcgAvLc/Xa9qEfnd73776aefOufu3z/7oz/6o3/2P/2PP/ujP1k39Y8++/zVmzcfffTRP/izP/3//MX//PLly5/97Kfz+fX+bPbjH31ycXFRN+u7d4+dcwaBQZgDBy+GTGkIgYOEENZ1QKSiKNpm1XZdWbrS2fl8botyPB5bazz75XJNRLaovHRogjFGC7gqw40IU0wHF+8VOs9d19V1jYgWqXTFs2fP2rbd399/8u13bbNpmkatLGutcYpr9w7x+PCwKAqWQDWuVovlejmbjk7v3FHt31obgiciFI4OePFaCAI5rloG6ZgZTRDwQRrV8EMwPESl9p4sli05nCMDkfmH+5JhcUdIv/6H4NVoKFJvSOuSGVoXEaHHkN+lWzVv53y2IqJzzqcCCNZagRC88npZA4aIElK/Y0EWYfbiO+tcaQ2yXbP3PtjIDYJkwBhkQaWR6LrOmmjaka5wQdG6BAQABlGIgDnLf2HlttboIDMjAqG1rLU1pDRh6sKea2euGZuV5RqCFmcwCiU3KEhAkQCkl0UgUXAOD3ERzQaMFWEH2aUsvUmQOHC2fUZCgLzLVqLzAgEFJMNNh9aI9GoiIpLSQcY11cOVw/YpkCUn9ySqvXJGROxjpaDseZGBI5IGPkAGFon6Q/Jb7Zo68eFKtGpI5RKnGUq2iuSu6WWwV3zllsXS6+K39DdElL6oXu8cFBGNNtw63knJSEVTKxEhWQXJTzdUexAAcp1VAEgRF0mqXbK5lA+QepMgz9TtBg93N6Xa37Ev+kz9rYZrgYYDAkPnHarOgNFxpja8nud9UEHnnbK3FyCRt6q2rGsVIs+eZPe/aobMgDHDUUcsGXRRxcQBoOu9BsB7LkINi8Xk1YTNib8aKGQGGLIBsKN9prfvDm6++T0Ka8o337IZ+q0ymCEATHji9EHsIRHtKuvpPTuP7Zv9vuWLA0/ne0dJU2dQk3wUTj58zuC3eSfmyUuv0M0c8ohmcab/GrZXhwsREqCQ8/dbG3unawDvMQB+oLLh7WWRPPrDcVMtNoObByYBxzV5e5x3Gja8gZkpvpeHy2P461tPSzZVFpQCABoZ7Lm5dFjU+s2EcZozwIrcISCBoMdSXOBbTiOVwMmINyIC0ZM1FH8mhn3VgEOBWP1R0WIEEAAo3aC/omTPqpjK8gsTrnTLj4UAAAYNMEoIHQCspV52i8qVhXXGxZPbY0DAIEIQVOkmitKADBRF0XhvjBE0zjkNFEhyK2YVX7QcmPf6OTLyoApptNkyBjkVNKWk0EPSUYxRPUAdk3ni+rKmIIRoNpt6f/9wdTO/d/9RMRp/9eXXRUmVKYV93XQff/zhajN/+eppYZji22m98VSUhwez0WT0zasnthBpPRjDLKv5snDj2fTIu/FPf/zzNy+vFvPfT2fVsyfPb5bX63pVgDUUmIMYKEyReWZCxyhIaIORdy9fC7Ax5mZ+NS4rgXCwN36zmo/L4mhvsrq5evLN129ePmvX6zuHB02zrqpxVVVtvS7Lktlz8KFF65yOWNu2dV1n+LUOTg4CICIQKgZD4dcoStaOWSNkZgR0xmoEHAlDaNfrtc6FArS0I9ZaDQs0TXNwcLBYLKppiYimcD/96U8/+ODht99+W9f15eXlcrn+2c9+tr+3v6o3/+Jf/Isf/fgzrcD1T//pP12tFu/evt7b21OkTV3Xf/j9l3/+5/+hTmrnm+ADIJMBRPDet21dFIV68UUYkVCoHDlmPxqNmGMBryDcdR0iMpA4MRR/0ratBkAAIIRWR6bruq5tVTtv29YZu1gsgm9Xi8XL5y8Q4MGDB//ub/+63mzatpVBroU1xaiadF1HRMZSVRXel+vlddvWxuB4UiWKbtC3aPmz9XpVMwcAJmHAINx6LkRgVDJIGzxAdHHHbCVCAoTkemBmTSjK3v288pUwP3+VD1GdWT8o9WVShThE9Am+qBJpRyTm+/Pbs/AfHu3aDK3c16P/DSGwD4EoFl+jtG2NiRQEupB0oGzwOq3ZSRlfIQAsQVprytj45FIVAOFGhNTfmYMDnFAxkvw+jGCgwwRbQmdpXPKs6CZuXVHtoLHoA1BAxbIGEU/Jq3n7mOD09vcfgrHx0uvoWUuBJH7zb4zmdQGAcuoPfi7x6M1HNpAgk1BMDxMSCJHhDY1m3kJUsN/jLoHt03BHOdMBDBJ27tmqU7DjCU6fZHVt5zjeUr1Eot7yPhCE2o2x4zD4Frd6AdtvHL7iB9Q8yefOcBwkxoOi+rQ1OAO9YvtdCACcPOL9W27P6UBLlEG4Znve+ylI7mYkIuEYGdAYpp6VgqlYmHoNtQvba2Ywp/q/BJCj//1wZYRLHrpho2LpLeyd4xGKlrl60wkbSSZueeWGnr5+C2//Pbg4cefsfnXrzjhk0W0DW9moiJjZJnc1y614Yn7SdljnB1+pPCu34lYQ7TPDgJGWSwhga+EK945qGCxEEdmmqYWkkqrUZtlWalE/UsyoYvqUe2uoqqo86lWfWEMhvVE1AB3CLQkF/ebfMSQULcmgTr/Bu94n8iT3ArbG8Adsvq1hHPis33/De2hV01jqu2LC6LB5sq2yQ17rAMxew7g7G5e3BV/8VZyNJAWiyUQi0YUVvRcYYbhBQjKkAQAEgRQPB5jkjPrTEIEU76THtm7YtG+H/qEcyVXxoT68Pp9sIKe2AgIYjx+Gfu/FAed0EiGYgTEYLTwF8jAGEUYMHrAOm3nAQso9nFa2lAASIs5PRC0PAA36p0G21hZFERiAbFmWqkCoeWStVf0PEQOzb1tRzpB0AuWJYyXEDsAhmltaSEjTQJlZUjoKRR8gkDHWkqTUxKCMJYzGECIG74uimEwmp6enL968XS6Xe7Q3Lar56ub+w/uBut998+8ODmZct9CCI9cxAjm0eHhyfLO4buobVxbWFp1g04l1o+urzd7eCU72bFF+9fWXf/aLf/jw0d3RaHQzf7dcXXxw+kHwXd16COwB1Lzp2hA6NoiX8+vRqJxOp4H95fm7ulnv78/u3Dl69uRp12wKZwtnLut6tVg65+59+CGhLBarUVU6Z9brNRgy1qEHgIh5GS4GIlLgexrMkNcFEQGCVkJ2xlprlVPFICr5UkiUdr7rwEppXei6qqo2m41vW9XhQgiTyWQ0Gi0WC+fccrk8PDxUB3lVFZeX50dHB59//vlqtbq+vrbWHh4eGnI/evTw+yfPfv3rX//xz37RdR3UNTMfHh5aaw72Z13XHe4f7O/vv3v35uDgYDKZEIFzRgSBuanXbds29VogGGMCd22LRVERaaSM9/ZmTdPVbee9J2uqqhIRzyzMNqnFbds65yIORyKUReHyWTFdr9fiu8JZEfniiy8W86s/+vwnZVkul0sRGY8m09mMmVerlZBRck8koEDGoHOuqqqytKPRqKoqa5WRkn3Hm02zXm3qut60TYfiNS8Q0HNgxgDimQOA90hkHTpAQBIJnLDgAP1ZFk01ZvYh5hIYY7RYj4DJayBjwBCRjEpMynEhfZofJPgOK5JiOrMkJzBq0H9QXyytNBGJYE0ksY689z60JIRoECGbB5QeaIzRKgOBOxZjiawjF4yI65omy2HMqkpUXAAJ1CmPiBCUztxoWd6MfPMcaQA0KylwYGZBCKqWSRCD4ByObRgXzdisK9kUih8CE8AKCoQgQbQ+GyMBs7D6c5JUVq0oOc+UGlvRQQKQ8DsklPXPpFvqiWXyrky5CiZKZ4i0b+rhEaGINI8/ZCKiyJARsD/GtF4v9BnFkGIO2zHSgaI2cMpA4iwKW8puPNkTEKXXYSBgUtwg8fhJrOQAMJA5wyRXSd7PvLoipkUdaiAIUS4p72o87wb2yVBLCH1EInX4ll88AnAHSNrBOIAketdeAR0oC8noRYDc6/5FW6rCe5yQiBr8R0207JOJh/fkRyEyplI/cc9STJtQFzMRiaBgnKmYaBsR0Xrup8xvokQb2I/JMPChkY6kt+h6o6w/UKxjgHkMh1vRDNRpo2uYbs2CMbn4VB4o/b/8zzyhqam9eNHeScrUjksOdTsDAFgNtEkyXFAPs16V2dUlOamKw2hXXso7lyLWUwxMd6amqiQQbWwoAAABsxAiQ6yEpcayVgyO5DCDxIrUNmEByttmuGQg2dCY2XwEiAQDBxblbQFkYQEJgkoENEhlRlSICA7mL9FBQh5H2NoGyBAAwKAwRDtFZQiLpwBiAEKCet2yl/IYapjz9njGMc0//IFbtq8Ir4pzOiDTAYAY+RBKYJj3TWIUajG3IevuUYNmzPRsRicvdZFBDKCWHWFIGjRL2l0AIAxalBFlEIZBhCCCrNxnoDl/uoiTEIlR8myhA6Rk7rzuAwxMTS1QKiIIrIefgBCSqJ89hvi11bGaswp/QmQUVQIinbjWWMEoW3kwSluxIx38WMeAMUisV1azF24KWJnCUWEsEwXAhFIVHRBEMASKQhEEA845HwSNK6yjAelkdKCy2kvcek8cnInkFRmMDhIksIB682IWihoAQAYQu64hiu6Q7DIhoqIwIQQSJZtL2o91vm6ns/1V3Xz4+JOu664vzquCfLPyMPrg0SMg+fqr3ztHl+ev7xwfb9aNIADYopx64r2Do2/On5gCrBMoytWyBkP7ewcXV/NPf/QJjadfffX1eDYVhJ//6pf/3X/7P1zfvFuvbtq2FQ7WFo3vQtuCEYPWGhM67kKY7e+tFnPr7M3F9c38an86ubm8uDg/f/vq9XQ8cZYu3r6dX13ePTl2eIwiy/n1arUaVQeIqNmW1lKMaxNm60g13aIommYz0NsgC6i2bfXAMUhW2VRYQgiN92StNQYB1I+r3taiKkLny9FoXddN02guR1EUm81mNBrNZrPr6+uDgwNmNs4tVquu6/b391+8eHF1dbVarT750aejsnr1+vWjR4++++6bx48/OTs7++a77x7vf3L+9s1yvRD21pq9vb2jo6P5fF6v1tZS3axcQdaSKy0zt23dbNqu64S7+eXy4OgIWBiCMYbIoKGyLJbLpS2L8WQUmJmTuA5Sdx1VFSBZZ0LbFcaGEByZpmmhiHQ6q3rTdR2ydF1LBrqmNVRcXFxMxqP1zdWXv/3N48cfvp7NmLksS1cWbdsiGufcZDILoQFU5tmusDQeFceH0zt3D8qysNYSCgN74U1dL5t107bWWmbxyArhCgKiqBZjg4byGAUFBDj4EEJpS0hedrVVZEBfIQNgjwBjIOcQIG2iwVnrrGVmDVHq58oZikZx+SYT8uYciWwAwMCBR6Z/OAxz6lSOYawi3DSNMcbZ0hg79NZF7SElKgxbqPT/EgKzFoA3YhGBGEiQLZElQgFgAQKDyMTi2ZHJvDdWHQ3MwgrIkU7YAzMwBFFHCwMFi+xQHLUltQ47A0Gxy8wxA5eFIQTIrDwq5BPioQd1Y68mx+GOGGCTtZPdY3PrkNoBcyd1jQgp6Z0CqTgDIgoY0qBywmUxMAkwkjMmol9k+5RV+gkAyNCaNHG9bzS5C7PykL6KNl4+OHQdqoYQfcnQKxs7HczKH6RREmaRIECKQYGk7aTeZ/omZVhXEFdfyRIHD4+W7UCN1jeGoYd+oKKIiFCkXiSJ5EuS1M3kp1MNLQ1h5mBJaqSkOCrEkxY04jLUQzB5+rUNGYQJ2c2aDCpIm3EwdAn9EkFByBztiNjXXGobTcoE7CMbOoBkIOuo8avhpEiPthIRVcH7NueGaq8BhDkGIQEYY4qJiDgbz3FAxlh/WoFPlOyCPBq99Bj2F3FIff6eK0mfMIzJWECDCJAYdiVitgAMiYgwSFK7MbWAMauLvbeZTA9lSUMsABCQIjwa0QCmoAhhtJgDAFDmykdBQ6gLCCThmFBLOBoyisbQwtwikgrLKcQKtXRNbJhqMIr9ALaGYpt9h6JcFgFZAFmCT30QAAJETVmKlXRBIDAa1aUgsD45mpd5WpUzy4MQaYgxCXBUxn1GrXscuYZVh1YvwW13u46eqqTDGUQA8EPRkDYCoMqCHCSBXC7MCwtrDgIjg8QCixS89IabUp0kMA4AZNdF0qyFuY8jK1ifQwchIeq0ObFiscZgCaIXB1DdTKJCQ4lWdMka3YTacowFgiEo0lSAVf/XcjYqNwlViBkXvUHaJGbWlDRMBLwAcRBQNfckhAAgiVxAAYOKqYonBAL1sCMOKAhxASMJCErvgkG1BCKxExEmxRoy9VhcnyAgBoWYOQC2hALhKqwgkC3taOyMEAawwYgXdgDGegIQJkMBhTsma0yAwjrBhDMh8kEQjdZNNmUhgdfrtTN2Mhlt1itIQqHzjUEqna2DDyH41htjUKDrWgIsC8vM3nfW2qbZVEVRVYVWLLJF6b3X8qMEDBx827aeXVGhs+V0f+X9ncOD0Wz2+9/8Brmx3Hrf3Xv8aLVZz68XpXVBwI1n63rlitKYcrmoGaq9oz3f8OXNJZ2gd60g2emkbWVZL9r25peHB09fvjl/8/bOnTPCYnJ42IpsVot7p6evX10e3zlEDqUtIXKiBmZGEgR5e/HWEZaj0Xq97OpN62haVVw35IMFkK6rrKlKM6rGr188P7l7XG9g72B6dHz89Nn3RVGYYFi8MTiaTsuyuLm86rpu/+BotVoVpb26uhpPZ5vNBoWrqlosFiI8nY7W63VRFG3buqLomhYFUGC6N+uCJzTG2a7tbOGW68XR0dHVVR0EN61UVbVYLUeTcbOpiYh9GO+PiqKo69o48+DBg6ubm8lsNl8u9g72D/f3N5sNEkxnk+V6+frdm08ffzwalfP5ddd1zuCyWc3G1evnT0/uPzi7d9cWTq2I5y+fHhzM/vZv/+0HHz5s21FTL0tr7t+/v2rW0PqRMfPzc+vMdFRx2+2P91ofQidUueV6PZntiQXPnWd1i0bgk0EyIvV8vrd34L0PwYe28Rw4dCGI950eL1q/bLVaMgcCPn/39uHJGQq0q40V/P77J+vF/Kc//em33369t3/ova+bbjSeziZTYQxBAFhLO6/bzcnRwccfnR0dTseTgiEElrptl/WmldAGX4cWg2Xl9yAhIrIYhGqBedMeFMUYjSXrCNq2bn1rrfUcVLBzuoQi3yWzZ5BCM8uZWcREERkkJtabTMoZOjWGVRYQABhD1ibjEIxBIwIhMAA5VzKDCCozkhcGAGedcQ6S5gcD2zsrZAYNsACjBGDRAhpYFMZa0kxiRCGkbKYGZt8xgrfWWlsAeOM41OsQAlJwBlrvSbwaarFKGKEl9VqSCDpbIEaRSwLo2QbDQC3wKnQ1cKfIE+ZSYUBG3HQGe+NuUnal8QZ0GUDoNNHNC2uIwUUmQvVbQI9HFvWUInOsJolCmFgrtGsDXzREpCX2JyYLAUY7rYC+XlDk55Z0nMU3EsdjCVEDoXoogAQQQAOERJqMRvFcAoglAgEGLHMwpEVERhCiyFmUPMIA6iVM/u9+ZlOIQrOzejWOQSPnu7W9wJDoyS7CEpV1RAQWIo51ZEX1FZNPuiCS6rdRYrxXpkhR91zf/uSQ1WMrw0QzbSiA4iUw4mkRBYGFBFLZHgTAWFw9eQdR0jwHdeYp9llAknqE6jRECKwZJtijurNihHk0Ibn7MJlzKbwDAESJ/IfIUvR1EiqcVzeaMUadZXqs5zhGLiZKBnqtIgbDGVJuhpowkow0jVRpyD4p/bEQs7aQMSU1YqJMJMMgrIksBg2lXH/K8bxs3gMiWmNwGOeJ+kzKN9RGJg1NIrScoucZe9kisSUxsIZp+9gwbJ/ELSYgOXEk/U9ccF7psBLTptwCn+UlGxd0qoSFhCyAEWMdnz9c5Trj1M836qTrZo1AvLh/Ii5To9WMQj3J/SCyFv83AERol7AnYWDhoEzVrBsfAdICYBFANpzaQKTglKEpH3rLcpBFJCKESh7GygtKoOo+IAKqSGE1M9JAp4WyNW7wd10IyvQ2dDxDepp+ovtPLWOCXpNXVRxF06SU5SCtp7gG8jPj5kdExBgJFQDARJSp5WaYwaAFiYXHJZv7EiveKWo/aFSAUUQsAXLk8YtoIM0Ki8FZinPQUwVLjvqJ1qR8n4GL+TSRfKoMVlfsivZXEwNocDvF+O+gYA4ARx9BLPig/g9ATVNBBiQABBQCifUBYs5Aij5J3wYlvkMgVlEIwZhuI91SNkRYOecKAy2GIByC/tQaEkPSBUYgIVcYAWJWlLmGvNFzIBYAikx/RICxIphoagGDDx4RPUjofK5mRRTTgpk1+IMiQVN9cftqU2QgSAAQYxCtIWvqui6r8em9+y9evUQUYV8YPj48vJlfbuqma1tk4cCCYqwRwsZ3LBgCl668uLwiok4aAWCxbMvQivf+wQeHy+ZqsbwA8V3TPn/+/Kc/vvMnf/Kz/+BP/+yL3/z25Oje2dlZ4A3pwYwIIXDnffAhBGuJg1/Vm+l03KxG1xeXNJ2Fph5V1ZvXLytXVKWbjMZvXj0nxLatiWg2my1X89ls9vb1KxHZ399vmmYyrlarZQA5unsHWfb39wGA95mZR6NRvV5paeS6rtu2nc1mzaYmwKooDdJoNCKisixFRIumQWJr0TB0EEbGtusQALpOj/+yLBFR3941rXOuLMu6ro+PjwHg8vLy/v37db25ur4+Pj4GQ3XXfvjxR92m/uqrr7783Rf7hwfTcXU5v/n1X/6rn//ylw8ePKqq6uzs5N27d4vlzcnp0a9//Zf/8B/++aMHZ+v18vLi7Xg8rrt6flMXRPOrG0tmVI1HZWkstIGbpmGgrusYQeHjImLEERGRI0IteETAloCRRDSBPVTVeL5YGGPL8chai0TWmKury/lyuV6vf//7L7q2adabxc38aP/g9YuXH3300f0Hj9ZNTUjTqUVRxk8ODIBsCTxw5dzB4XRvOppNRqNRCQCN71oOXfAtBw8eCNknXzKjZw+ElqxDDICBxbOEEAwiIBuLaFGCgAy0/+REUOYcAK0uZ0VkSP0JSVfLxXq954GEyQkzyAEBErAHRFJNUK2MHhU+oJw5kB/CiUkpqR0qZXvArZ59NjpS+pwBSFHZpEBoojBpwFGhzwgaYGWDKMagsEGjCZtqtaIAK2wng1CyppNawiAM4oFFmKKCbbmyYeRg5EJp2RkhRlbCNfWCaO2hEN3rELWg/tQSYfAaIIaI5e2FNkAkaUt86pCGi1UxHeoeQ6mb/qnfKqBAI+EhI0wQEcGgSXBntmIowyBZWJ1CkJz6ejSr8UiD16VE1ThHiIMQ/fCATq2K5zENbsD+qIqR7aErXz8fOP6GvRYtwItp8AZ9z+9iIIRIeqMkd2rNBATYBpxkx/yw2TsKXj6XcxAhvlfLX0ryyeuYI6CW4InMvRgnFaISGSuspUy7jFDi7XpTeX7fp20q8aXRGmSDeQfIEKDh+McYAhEAR5VArTG9IS2yHkAbd5nuiuEs6Jt2Wpi4ZWTw23QRqo9UKGFMIoQFQTOJSYbZoxhtceijGwOtZiABtqYpKzIZ/Cwi26upF2sxrcpERTA+anf646dbr5dI55sc3UOdO/0qmkhZ0MTf0kC0pFRsREyFHmTbMCBAhWpnGafe19yuBKjJyy+KCmFWOnOIyi9EHm/2mmaFwpjUcYyIRE1F8kIIsY6dBihj3nDu5tY6jLWiooEevQYIOY8gSSbWmzA6hlNDt/38CWQVjxbYueJq1CB1yF5/HD5uIB3UDBis3eij6idXf67IL93VIix+8MKIjYv6vUgMAG0TFku0yN9jhsWJYz3nevGS7YwoWyVZHrt97ocZUyk7GQjE3JdB33G4XXux20vFKCWDMIAQJP9HPDeBdU+yOu8hSjDZepA+I5VA6OclyUURSZWk094FNQACd+A3slmDLZwpjKWCAgtzQM3gddbagoh8q3EqsNaKIDMYZ8kaRTEJcwgdInDnFYoNEjT9yznHoVNNR1NYfGTIAWMMaSw1hrBIRCR0LoEW8thKKkUEHDgIkVEaa02dvHv3DgBfnL+rjBERW7jRaPTu6rptA4GxljoGsugK51NUl4jKsjh/8a48MMEAI7IEkaBG0IOHR1/8/n9xbn8yLYuiGI/GN/N3v/rTP/He//N//s//q//DfwXS4UBSxZUUWFnBi6IAlmo8IqL1en1yfHxycvbtt19vlisoQ+EMIoYQ9vf2ELmqKvY++LZeb4xxAOBceXl52RH6EIyxInBzfXN6etJ1HYJh31Vl6duGiEajUdd1XdccHBxYMt7z3t5+XdeK7NfR01qzzhkFb3RdpxA1QBJmpf4sikKBIm3d1OvNZDK5vLwsfDmbzZ49eyYIHzx81ABeXV2FEJrgJ5PJZDwWkVevXt05ODw5ORlVYyJ6+vTZo8cfubK4vLw8OrpDRHW9rooy+Pazzz4THySEzWpdFsXiZn59deHIdF0gwPGk0lTdm5sbMIUpSiJ1VzNj5KkUkeQpEEmYdZ8yQQEESGGUgNYYZ9u2WSyWRASBlzfzm/nVy+cvFhfnv/jpH71986Yq3OXVxfHJ6fMXrz797EeL9QaAZrOJQbteriIsBzwZ9t7PJuO7d+/u7e1NJhMi1KbWdV3Xddd1AKAMVJIXA8TKh+o60yBzCMEDKHIdY2VcyCA3iF4e8rLrUtHuBxngdJPzVwa0ueoSkkS3he8j1ssiD2MSMA29/pDCESqbsmEg6cJbhJJZ4iGigGTDnhORaEpNUM7QnrAldhzQyICWVCO58dnq0tKsxjjzDOC7KJ6RBVkoiDGFOGPGJY5LHBXgTPT+igCgjdUxVRNSL6YfDm++EvQxD356CGaBmwdqS93JT8vyChE59HYUpCfL+xTxOICAqWqrkFDCaas/S6uExUSR+EIUiLXUIGKl4qipJ6lPch1qRHGmksGmTYDkXYr1LrXyWkI95Ytxd3Bg8BRAEeBcfqt/j0R0OkYMbVbbBmPIvRaVvr01SrcO40QgqBrI0BDVl/dWYxoKVUc5/ypqXJRn+T1XnqA8gMOvslLRf5JKrg4Ug62jH0ChJIixgCYCAInCsfR79SmLQPbwSnSMp5FPTxvQyA5YyPUyaeEO25CHTl++ZZNATyKUC4fl9qSfKwi5FwHDAeG0yLMPN6//geSJ4y7bze2l1VCjwi1Vu18CYbActvWtH7wwO5gHL/o7bg459yXejVptLVvJlAmeohs5jd3AqZBeobJMTV/9PiCH5PsJKVVmYHFGzw2QYCJllRSOHHIpDNwMyHmUor0dmxFEw2CYhxGj0pvFreQo2Y7r4t9/aSd7AyBr/3FUACBbSqnZkupngXpiMiDQ5LyoNHoZhRbbFr1lfcHwnbRgSS/dJV4YDBQOpgaiHRhtji2zoTesBtbm7WEZ3jq8E3oZ0bfkhwY2jWL6NpZOEdDInki02VXok6gBj31JYAJRRBGlvJrt50fywV5QCgiDdNzVDAswhZjSOGOJrGAAZOUY6OH7krx9SiqvKiMZA+xJYkqT79rON85YYQ7eW2NcUQTfaqSLRbqua9s2hBBDHwPS8ZjqFzpKqZCS6oKFECxRYW3oAKAzxgDZTtB7v7+/f3R4+O033+mMqZJxc3MTQvC+qwrjjGu50aqioesQLSGXhdX6XNV+aYxhtSQJjTGPPnx4vXrzh2/+7cePf35y55Or80XbBOnaP/+zP/2//V//H47MuCoXy5vJZJKnUhuvlc5GxWi9Xm1WS/b1wcHBuHD709nlu3eFsfcfnBmk0LWbzfrg4AAkNJuNM8Y5Zw22bTsajU5OTt69e7dabaRwo1FlyHnfee9DYO9DURShUzbGAlGMMVVVEYG1trAlM4/HY7WUIjFRIl8qCqcGgMYNiEhR5s45CVwVBfsQOr9uViGEO3fuFEXh265erwGgrZv5fG4Qq6pqmma+mBPhuqlFZG9vj1jKsnz16tXB0eF0On358uXh4eHDh/e6ruk6u1qtRuNSJGxW9U9++nmzWT9//vRgfzaZTDarBRXFnTtHm9UajTWuHE0mdcvOuaKqAqA1Rd21gBx1GiKK+SCEiJoNrB30zESGrGHGdVPrygwhcOebpg0hTCeTv/h//4+vnj0tjR398lenp6e/++1vPv7oIyG5mS+bpmOG9WozcqOismQNMSg6MUAAgIP9/bOTu3t7e0VhdZl1Xdd2Tdu2nW9y/TVO4oiQNJ9V5ZUnDAwexGj+YhYCCJCAN1nJztm9AJDzmJlZaIvxs/887U39dZY51iJIKhqdXpR/HsVR4v3MQIssyIb6Yg5B9BD/7bR+vY3SscipVrFe+XX5J+kTAYkRCRA15pMhZNKxDgAArNAJgyIQEBjBsB4VaAxR4WDkwqjkkRNLnqDl0EGsHgBb50I6NXJnsRfLenkO6YiMgYLhUKSH7Og379Eldh6L2WwYsoKm4l+SupqOPEkyPDKIAEAyA+JvQ0qFuv1egASIHWCDcKAC7hxAtxu/dfjlD7fu3Dkhs8s1KQHb7Yk3bEUMbn2b7pesTKRPMPsHhx7e3eHdaj8R8ZbRsJ3TMviVROIKGdog753QnX/mp73v0B/+amubxJJz/crRf5ASmkI0CRhTJEVvTBMXIQMpbpObxLem6wdNTf0Zqwt4awtD//egjzAwZlKzt5J8BoPzHtUIABJdTdTNdlaOfmUzDmy43xBRQhzQPMp51UvKGxbInuxe75MBVgmzan5b9UoooiTE4uwIkAjG0RhQhuUHDrJASEQTJgAgu8Aj4IjZYxLZKHEzs4QQOpCAEmXAzpxpQqryzqP0ywLSioFItKSv5IHJpT+HVMqBtUmoX4ni2RFR462qlTPE7Q3bszg0ebeymvInyXOgQQeQFP4baP/DH+LAMx2xOkRa2zDuGV0bEnMZdEZIzQBhYdYavelk0ABHxGRJbElfLncYHFfnU2/3R3MMBhnkA1tC0nTE8UFF/StCsZf+/T39WlItALJ0oJgZNdzzWQxlCaIO/zhnAiBaDyxlF2E/v0iIYgQiIkgG+7afmi3TVViENXmOBjtZKM5Xx37j1ws0Dh0QFs5aJmJxgGTNFtRJUBUJImucBZNzm4IxxgC2oWMfkCwgsvY9cK+shAAAmupalhUqfDONNyIag2AtEYXQhRCcKQwScxCRnFcDQMaVQOg7AcGz07vNevXuzeu9vWnovEH0nrtug64QxSMaMkkEt21b2VKEx5Nqvrhsmo3pyKJp2AOR53BwdHh6euf/+//7Z+j8xdWzO3fOJtO9r37//T/+X/2vN/Wibpaf/fjx9c1lNTozxih1u9GCGpYELADMV3MROT4+Xs4vN8GDodV6DQDVqCAQArxYL4qiqEp3/ua1QNisVuPx+GY+L8vSObe/v//mzZv9/f1pNUKUrm6ahu/eOd1sNpvN5uBgnwA732hGz6ZZV0W5tz9FMMvluigqRKMRGyKSwATofRCMFRuMJWZ21pVluV6ukWOWEMf4TGjbtqqq8/Pzu3fvvnz9qr44Pzg6Oj4+fv78+YePHtV1TUR7e3tPnz69e3Z6eLhPBG/fvr53795kOq7rzd27Jzer5XQ6vrq62j86rJv13ePDtq33j47fvH717/7mryfjajqdvnz29P79+2Vhz8/fGoKzuyd16+f1ppKJtTZSFbEYcqgMiLlSqWZwGTDGWHI+hI5DEFDAGlnTBU9ELNKtO0emKou3r169e/3GWvrTX/z8//7Fb99eXf/+97//8Y9//Prlqy7I/nQ2nuz7jqtyfH21WG42RAaB0JKzFsRwaCeT0dnZycnJyXRcWiMA4H2XN52maAdmMo6Z1VlBRAYNIvggm7qtyqIxYACdIWMMEllru7ZTpURTU3t1OXnlMdnGkCp06T7aUaObpskmRPpd+hZZNNTZqxGgRJ2snwro6c4csqDO51r+32FYIGGKwBitcBIlJSIZ7R0iMwT13COzeAQjIgrnN8awUKo+DyLBGJdtD80jIgNIVtEiJBFIzAQsCIm90zA5AUYgZ3FcyrSQWckj0znZgG8ZPAQGAcAQAiGCKAELZKUfMCRdaCgqb2u+ybGKKiwHp97gaENNJkjMRpC0+uTbUl8hAgB7ldvZ9RY5BiHz3EcEQH47JDNAm6iJB2wiuY7eYPINSYFjgP64ExFECwP7Ifd3a8HEDxEAOI7PUM2m/mzMiQzQ6w3a3ZjIAIhoETPAIABsQYPyn/1PB29KT6S0bJGjFYTRcMSIJVKDlgfmov7BAjmrXn+oLSdMFZrTwGqDsa8Kvd2E9zns+tMWe1LIFIt4/6WFtFLEjQQTACo6pnVIMK7xXqdQWJF2hEXDZb2h0huf2S+QGrjTkJwmmnqkpY4FIJUHHiwywEGGSdwUCeufjadoylIcedXSIc24xqA0HxS3gicDK2vwgU26UR7fLTUrlTbq7e8gvYGHAzsMb5kmqmcMy+69x7z9+12IyIlCMstHSW4b5XtMFs6WXUggFM8wAdDlmVvP+Wn9MGWVMj6qR/9namQREQh54oerFLHXp1G0ysA2MWc07CJeBAdO8UHLs2PivVfe/sOtEp+XlkQiMRQaxNjUw0FRdxeKcMwEz0gtSWYbaoybJI08ZJU/WQsigfohG3Cm9U8jSaj9/LNe3RdQF4kk30NeUVH+DM3IdP3da4gSkGx31N7nfhARYyNTRcwtiyJWw5NBIHLkIYqg5h9HoSeMSBFAn4dg+52YPUlZmY99NiSAAaSTsOFm6TdgaWTKqigLNggW1QEfBygeeMaVxhWFK6lPGBJCDD5EeA8EEkBjLFLQoSCyKc1I1Znoh07lAHKUE60FgBAEETUTQEQIkEMQ7unGAY1zUo2mVVV99YdvqsL5tkNia4xvO2stIxqtd8WeCNAgA2iVKGvtZFI+ffHSWEAEIosYDLnluv30H3z08u3Tq/m709N7q+X5i5df3z386cNH9z78+KN/+2//6uzecWiYiMpiFA9ZFm0PIrIgAMxms8vLyxWvveeyHIkP9XLVcdjf33/z+oVBCqE7nO29e/dmvrhWjnxm1izeO3fufPfdd1VVlWW5P5ky8/XFZV3Xx8d3r64uOEAIbK2t69omM6koitFodHO9aJqmqsaSXLxaxRZRRqORMrI75zK+XAJbpI67rusKa7umBYDCOnWrz+fz09PT9XIFhKvFYlxV46pazheL1fL09PSDDz94/vyZEoZ2Xffzn//8m2++mUxmStRSbzYLYw6Pj8R3i83KN/XN/Lp0xcnJnY8ff4goJOD39+vN5t69e/P5/JtvvplUo4OjO5sQGt81de3DylUjW1YcwAujAe994ztmtuDLstQkS4MWFKlMiIgdBwiyrjdEVLlivV6FriOmxfXVF7/57fX5uz/91c//i//0P/s//5/+69/8zd/+k3/8jyeTSVVVxpblqGqaphqPxuOxPkdAfNMyM4GE4I9Pjh88uLe3PysNdL5u29Z3XWg79iFqqAOEqwiQoJa88RyQ2SN44QAUEBiECHEgOTmWsZPeABiWBovBsT4Elz+H9+Hy89HAzESxegAzyyDBN0uwEAKmDcWpyECWS5zqSeUNnqWfChQcVBLIzcgWghU7PFBEhJMClD/BrSh6Lm4dEAyR4mAw4Y5BPTaCEEAgsAQGAnIWRwVPy27q/KTwpWmAW+EOtM5WHGUWiZTXyQOIImTMsHk73RwK0DhufdnQ3SufEUMhn3wwW2OOOKRro6GLSnkH86EjkflDM3GHnn5dDJp8KSlC3r9pGEGCwWmezrItX+yt06lfY8PzLnc0f7VztN0+5oav/js+ee8ThifjTsN+yGDYeYsAsbAgEuVcst662+kRAGi9uZ32DG/eaUnSC3BI96djzBGbAMk1CRDTnf8emkNaNAJBbx84vhkgsuXmqYatikNRZRrqYzDQh7eHCHeUuzzdqbMDRjK5nQ/aa0c7aufgve9fgcx++KCswNnbj+j1suGbB+GVbM4MncyR8CU2M6/7jNzZijAMmmuSv1uJo3q6FtheBASGgJg1WzT0kxpSZCdyPGHmCMp5WAgcIdzACKxkcclAz62KDQIAyNX+BvfEWQGtJK/K4nBv9OIgqrNqAGDiiNV+BQbEnDekkk8kphvlB6LyH8N29fEEM0/v0cFJn/QV9WgwsDHpJoKOpC/vICL9VAMkU1UozapwLuwBAEqWrEcgAgsIiDqzaLBP4swRQCwhGUkwJeFKRYl+sh0RDcut+HgU1sPtE3NI4ikSX0MigFrmY3ufYH9RrgW2Lcf6iERsbYwfAaIYQkTiEGLFNHVqQJI86ijInqTYHvVIyHBHqLUACIgmuoBEABSwiSyB0ASURrq5X3nh4ISMMxYAkY3UviFGhsj/wAjWGlcWpnAptBVIGJi7ttHEX2Y2ZHCAbEZrOdjAAklvGIxM3IsGgYi60CEiAZIxzpmu68QHRAzBK0MrAAkQAhXOHR4eXF+cL+bX46rqusYYa4jEGEQUhKIojDBIZywCkaBUVdXUwRbOjYq6WVajwlUuAAC5LpiDg+NiZL79N787ONhj9mD47cXzmyv5T/43/3nbds+fP//48QfLm9VoNAoBtRiBwq6idhVCYFZOeuCAxvimW6xXlXOjaj9sVtba0PnJZNK27WKxCCGwD4Vzq+WSyO7tHSCaq6ubk5OT8Xg8qcaBu/ViWVVVVVXT6XQyHq9WC9+1IGKtHY1GBgWAfdO2dV3aclKNFRjtu1C5wotW+DIhBA7BGlO6Ahxo7duiKCQwARRFsW5XGVezXq9Ho1Fd17PZrAu+7bonT5589tlnT757evfkZLlc1nX9ySefXN5cP3369NGjR19//TUzL2+uXVVOZ/dulovf/f6Lx598fHp6erC/74wlhOdPn3Tt+t7J6du3r60x985OfdPOxuNPHz8W7y8vLxjh7tmDdet912zqmlzhENfrdRv8dG8CAKTbHCNppveewLCI9y0VVkg0vdNz5+uOXeHbpl5v2lUzv7xYXl+9e/Xyv/4//qv/9H//v/sv//P/4n/47//7y4ur2d6+Mca5smm6INjUXVWORWLgTYFqhUUiunPn6PTsrnOGIITQ1fW6rjdtV4fQ6dlmjCFCHwQRjU2BaGZkDiFg6dCQEAaRAELMiMLM1pCy8IgIoJCJqbIK1dSwWGRETLDGqEnnKngAAKBGstaKVvmWST8xqfKSBZqI8sBmPS+LjkFAOwpYRGTmXCxsqB/oVw5QrXqvzGws6uRGRIMkZMKtsox9k0SsMQZBRDQ9gBlivzjWs2Bg9akRo3L/s6jKSyIByUDpZFq1e6WfuaYkb2HD3AYOhALK4NxrG5JzwJImqKyRucdJ1ekp8LMCB8nmUScRDhSgobTP8WQRiXWMoxsrxp81SRYRUBOdo3csDWmO5OuZHtRgpBTTHr4IpYcA7KhMjAktGlvLASAWeNGjBJSxUOdiO5ohIKJqCdCw+3pKRd1WBwJUp7jlq+0VXDVf+4NIdRUV+0lRZogpsAnpnBIh8g+VyCSej7El2XO/rTGmzxEAIyNTBBjn929prIOrT0S5tTV23pI+18O277s6gCihrDFbcQoT5zh0WROLZkSk9oNsRQYQEkq0nvr2LY8zAPd4GeB8C6DkuF7ui1o2aZ33fn1IRs6gg9mVvL2qk1nCSQujSJ0zsEtRRARTzSsAGIC041yqZnN79NUY6TUWdRDq3zvYxPx3JLDMusNA2drpYXwm9F8NH/hDqyH/fPh8/d+suwzvIeXo2WpqAIBkcLNAEAkiIebKcKxOJYPkLX1aRj9DkssJ9jqQOAPuXgVIpGv4d1THk5OJh4P53gsGvoF+et53Y9KY3zNc6U8DAEkRJYjgH11hmDA/iGBUHVeG0OSoTkM6tEGjdEA9JPqPooG0nZomvR4Pt7b0rX5hPlxlW85uT32fLbe10t6Dvutf/e/9qheaeW2zmijYkyOp6yWWpYNb7SQtiDvYRARCIIRg4rALaamg4ZCCICMwc8DACK10a1+vw2Ylm41pPXmwEIg9hy60AMpQTCwIZNBYsnEj6CGXQecIjCyo2BgJaoRTCmrmdZjnMS9sXefpw5iDqEvXDBnHAURQU42n48mb169LQxy6qiwKa5V0vO5aEHGWDIHuO2YWRkMu8uVD13QbNGwcdcGzYL3pHn/0yYuXTwPX48nI+xYwsLTjcXl27+6TJ98v1svLm7fHJ3fevD1vat91MdwBGaKhMjo56RmwGk/KalyOxovl6uLiQoHps9ns+uZmNBrdu3fv6OioKAodlocPH56fnz98+LBt273JNIRwdXlzfX1dVWPv/WKxYq3JalyETQPrAxUEonaCiChZu7VFWZbT6VSnpq5rACiKcjablWVpkQqr9X/deDyOkKGUcTGbzUIIZ2dnbduenZwCwPn5+f379+u6/vbbb9+9e3d4eDidTtu2/e6bbzabjbX27du386vr50+fnd49/unnP0bhd2/evnz+7M2bN6FrH33wAIJfrRaT8cha07Zt27bffvvt9fX1Bx98YK198vTpy9evruc3ZI2rSutcYR0AWGudsRrlmEwm4/FYy89hUnmV216nQG+eTCbr1aJr2sqa6/N3X37x24vXLwrCk6PD/+a/+b9cnV/8k3/yT25ubkajiXOldWUQHI0mq9UmBKnrWkvYOudEQuFM6ezx0eHRwb4zqm5xQhxInvR8qWVrjKEsTwACswfxwkFYafwyyRUM3Px5FSlYK+4sYzR6M3zR0EkxzAAeDgURtW2r63PHJTw0HoZSrk/S7U+WmHJAgxrD+cr7dOjUz6JpOCz52+ERrO3UtBmMZb/Vt826WwPEpGoFlRhW0jbRpF42yJZCaduJ20zdemLXDmqSDqWNahCIBBhk4uKAtiELovccJT8gq4fCf9jBnf7mHw4/z9MnKUkpXQZuHVLDUZSI5zEKgNx6heTgTG8cgnrcts5ivRcjN076DFOdSkLTr9t05cDO7Wsoq4dd+/cO4HC9bbky/x5wjPe2IQ/pzgwiIqAhV2i8d+eG9zUGdxqZbx6+a3u/bwfEtpdEfuTWTwZnxO1eDEcyPp/y+kldi/QzSceDkAtlIIrArnaXd+jtDr63zVnxvj3pAABpdez85IcmOm+u/Pb8qPfOhY1WEScHso4gkg+Jaz8kEJUxILEygL7ApIAFc5+HnudcH0ypwlFsLsSEbXQDtgRUhmBERKdUC4IxWRJETUpliRJgQkR0AKAVaqJmIoMFJKIwXGHmyNsTs1cJ0XceIUdFWXsLoICEaCjDYFKBeo6FbHnnAyDJ7hgLBgBDIGHLcwCBA4uxve0+tMo6FiLoJ1HAoIJKo1Ud2y8xhokmLlpIB0a0ekFiws0WqE4ADJEVEQ598Nd3fCu7ICLmeZA9lnqhK0m/ijZxPvMgOXt0IhA13ClaSF1VZ+VOZomo2OHriEiQELahbwPsvqS9pksxNkyHQOL45HiK4l3jTv7h7QdRxBAARioTgRxtCUpNhhhd6cpbmoSCsFdfR67kEo9LAdCYYxp3BCSyDD6wRgyQwMRbWJjQhyAkZAsmqENLvi5gM3LVhtsuBOPBsHUABlHLMzEAJryvnuII0HZt19aE4FzBzCGAtc77VpWhtmnatg1dF0JQsLskZ+RoNGqbJoSuKFxd1wYJAbsQQgiFtc6Y1iIHHhVlXdejauIKWK9rV5YfnJ69ePGSUh0cYY9kyqLsiIypVUcpDALYum0EhVylMgkMrDbLYmRwr1i1G6CRMN05vnt4ePzlr79AkhA6VxZ+HQDgT37xx5eXb1+9fvLog3vXl2+O9s/uHBzpjqvrtrBWAhtrjbVt2xpjRqPRqt4wQGFMEBhPZ81qs1zXi/lNaDY/+vTT1WKuSlizWc/brizcarW6e3QsPogPgdmiqevm66++unPnjpbievHihff++OigaTaj0agoXbNetU1dWOcMhRAO9vaRrKpti8Vib29PRCzS/Or67N7J+fm5qybXN5dKDDqdzl49f+GtPzo4WK1WAHBwcICIbd0Q0WQy+frrr3/5y19quvB8Pr93enZ+fo5CxtrZbFbX9d27d5++eH7n6KiqqvPzt5ZOHj66f3l5uVzOEc8ODvdubm44wPNnT0bV5P7ZyXQ6LYuia9uj/X0RIQPXTcvM7y4vTk9Pp/v7djJdLBblZGZNtbe3J0A3NzdI9vDoyPuWAG1RAEBTh7quRdoQwrgaubIQka5pu9CKpYqqZrOqitIZEuZXT5+9ev5sfzL5ZrWq16txVR1Uk//nf/ff/sf/2//k888//9f/y68tOVeNTNt5z6Ut1+uls4YAmmYDwPuz8XJxced4dnCwt96snAmFo2azYu99aLuu0XINRWEDhK4LsXoSoSAEDwiAZC0KWhcYmCAI+hAKIuXL9t6LoEEABGYWFqBo8YooWbbKsRQVRASAlCMRBUjXdcYWOQs52ijMeqdkClH1uCfzWJLiHsnxAIqiQMSyLGNN7gEHl2xnCsYMDe8VQpMRffpDEbFlocaYMcZr/UARay0BtW2dxJeSbgESjUbxpUTknAkhMrsxExojQsxa1oUosA+haZvGd4yAleP9sp255Rhq5wME9mrciHgtDpWkMWgiHaI6X6N7KCCiyT4FkIACACGwahQZPYXGGmPYdwAwrEUkMU5iRDKgN+pFktiZQKteooGUGRBPFiGJacqk0fAQhMiYfAMEISTjSEBiqL9HgknMKFBQcWYHwnhsS1QTo3ZBRCIY+ebjyRDbIEGhp7DFPUUiQmbXW5zrSUMqxpwPMgMpo1SQWbRaEaV08HzYcaoSBgAuqS4iUSniGD5Sj17/bVx7ZCFlIfAATsNhgFaKRVYH4bNb5odOTVYqso+JBhj6nWWf1Yzh06IqkrQiiIoHEKEIqfEq3I8bplq/kD9BBABXWtHSgRB0DAnRgBHmBLVARA0cIUBMSMwuYHWxiURsOWHiONHsAZEQgqplmCSDhhxEhMBkYEzWXlIfe1ai6P7XvpAgIiX+YuX51ZuyuNB0i+xUipBg5SbmDFrRNvSeCLut5OkrI2Aj/yCvUV3xsH3ltZL/dzBVW1f+JK+DnXvS3t56dSxSgn310/7n731+DK4lUlUEEU0hCJHldye7Mq1IULcuCAAhJuA79n2EwUod/nMwjwC8tYJ1u8dT6tag/dA13AZ917Z8Ff1D0j0EAAMSMUz/zFaBzh2hFsRmSTdj6vXgd4P+SvLc6JbUZd03rB8NfB+eb3fQdtZJwpYkCOatoRgKsvwH/cDqktuNeN8D82NRrZT4ocnER9pprRAZE51uX6LVdg0KbAWL9awSQQQGQxYBAFgwVQUDFiGxZJm8NkDEBzHIbcnNmloiOyYDANIFEjTk9BRhiMcLERmiAIAsHILqDQbQWmUXYdJ2s6i/duhvwy2fR5zZEILvOmWulEEVGAHmANZZa+3NYtl03b0HD9frtbL9ELCeN8l1CoYcERJ4AgWcAYOEIC0HY1xRlY1vG98QjUazybV0my48vnf/5cuXbduW42q5WFlXjUcHBvfO7p189fsvn736w0P40JZFYCnHo/F0EoI3iMDSBW/RFEVRuaINngGMMePx2Dnn23a5XNZtFwT2Do4+vHfy3XffzW+uTVE++cOTpl4/uHfatN1qtfoP/4M/f/bsWVmW7969Oz09WywWH3zwwXqzPDg4WK0WInL37vFqtWqa5uTuHUR8sVpyACpIM3SJwnQ06bqurmvl72fmtm2V+SeEYIvi7PT+mzdvrKPpdDoejxW8cXh4eHNzMx1PtFzAcrk8PDx0zr1+/fpHP/rR77/6cjqd3r9///z8vG1bBzCdTtVZWFWVMXR4uP/40cOXL192XXd4eFi37Xw+Vwl2fvF2NCoLQ+v1sipdCN6Aff78+f7BTESm01k5Hl1fX787v9jf3zdVNZ5NV+vauFEF4L0fjUZI9vzN28nexHsfWaeorKqq67iu6zVLBQJESGLA+M6vuqUF2CwW85ur63cXb569+P7LPyyubqZVOS3szdXVw/v3V5vmX/2rf3V4dPyrP/vzf/Ev/mUbuCpHdV3rG31ovW/H49HN9QK5Ae72ppO92aiw0LV1Vzer1aKu67prfdcMPffWCosRESXr7ImkEXwInYGABIaEhJm7jr2AMS6wZL3ZGGOdM8YEP4wAx8Q8EfHeQ+LhgYFvUr1CaeUPgmbGYnbRDfyXqsEntSZm2jjnINEW6SsSpkiGzuC8SUMIMiD8Gcqx4ZVKBahqQsYYpognkBRkAJNA7SiIFOuDEglq3RtGFgNGTwgREUJxRgrD05KnZTtxqxJqE4ywiCo90VjKh1Mv4DM7dsKnAuweqcO/bx2vSbxL/3c+dHb+N+kAg6ABAGSWPwBhjOTgg/gP9VlqqMVcIXDGpwzOmn7U4xGNPUGIYs0QewVGkuKvopb6jmB2Agps+Wt92KKSk+wu3G6B/sEAZjvqnpfo1gD+wAk2vDjh3oYvGo75zjVU3JPbFIgo3GpD/mp4lKcfvodPaac7+Z9xI0gkk5U4W72bEoARrYgotQ8M1sywMcO/KZoc2TBgRImFArboGVkL5eXVpN6EnAuQtZpeOXvfJQIcAHGr17xF+rLV/dy7+Nikd1EPJuxhPzs6m6i6kX5Ow0elHBhE7OtXD395O0KX22cADaDFnuID0vCD9FEx2FU1EAcCq/+hIGqxKqAhQn04ECR9rQoEE/EVsvXonZ/sLL7cqT4IG90PJKyZsvElKjKBUN1CO4J1MJH9iOlTc+ZCjL+QYAoVMoIQKnlYAGGEAOgF9L88bBBh/charZ1Rsj9ZvyKCPk1N0mADCAljDzvR+yUCVLQFaUJMnoX3jFXsOeT/9CKJLnARidVaBkp8xsD04xNTr4ftj09CNHo/xurPQ2gNAdDt2Ry2E4VQIsxm67maohUfnj/L4ELs80qG4dhbroUUzxlAenROMf6XWmIGSwIFUYD6lZlsKtEMBDBKAiQSn2LAkBgUoPiVBGYv3HJYh24ZVjW0nfHBSCD2KIyA1pAxEocnTiJ0ITRdCKG0rjAGMfsp4zrPSkPyo1CmQ1DVXxKbStd1XdchYmGtQZTAofPKUGmtVWQ2Io7Hk9Fk/PbtW+879i0CO0uFM4YAErTAkYnUHHF4qQvctSKE1XgkyEzCRmzpOoFqPNk/3H/+/DmRISKWFgmaDj/46EemMK9ef9/y1bJ+u1ysX7+6nC8Wm81K9eCu6zbL1Wa9CsFba6yNgVJbFEQmeBYBY91ktm9cMV9vXr5+ezNfPH/5IoB8+OGHbdvO5/Of/8kvDg4OLy+vus5X1WhcjaqinFSjerU+OjpyzhXWHR4cAEtVlJfvzsWHwjlDhCyTahK6Lq4BCc7SdDIaj8qqdNPpdDKZVOV4s26441FZWqLCFKNiVJYjRFyv10oM2vpOiyu5smCQ47t3luvVYrWcTCbGmPV6/emnn2qysnPu5uamruvRaISIIYT5fD6djlG4aTau0LSNZjQqP3r08IOHD1bL+XQyDm07Kp0huHvn6PLi+uL86u3FRV03h0fH66Z9dX7ug0yme7P9fSVX7bqOiMbj8d7eHgAYYwxS6LzO/mQyOTg4KCpnDBqLEgKCNPXm+vzcIkzKgjebZ9988/z7787fvH717KkR5rY5mE67pp6Oq73J9HdffhVC+OzzH09ne5tNY4yZTCbBe982hNA2G0PMoSlKOjk93j+YIor37Wo9b7tN2226rs0OsOx9z4i1rBDo5VEYJAgrCsindF8iIgNIQkpqZK0z1hn7HrETWHwYnoND+Ioub33CkLl/IBgRB0Cdtm2Z2RijADD9XD+BpDCZ5N0fYooygEE7rltVUUak2YnR6Qcm/W3J6H96qaWRaYWzyEVE9VNTxqKYKH4DRGx+EBRGBmQkdi5MS94fddOiq7Cx3EjnQSLIFpiEKTEPCjKQpt9Bdqjmt2d/sWjUJajbNDpfo4wSluBvKw9/x0UU5fDw7BYyQiafDv3nUUSjiOg2HBzjAIaEdh+e4DqWKE46oUUYnKqEgEbd6ZCaDYSCBGQEDZAVRCCKHBuoHEaR61yngsgkFj6Mrh+MmoP2bnDWqGcQ0+lpUqoGDtft8DQcXkKYUvi23HP6qNhmQEDKLQR1rCJFaBMQJyJzHWEdx+Gp2k9NPHc4sm322j//3f/lXwFA4MjjPtxrekYL9YsEkAfpnYgCcbOkD3QF6q4xKAYlVXPClPKrazUgB0xeXRTVUyEmA8ZHcTzDdT33ScV5tcfsRxKICzHpEAAQtZqk/+yscxtZBRBCrvJhMBYIFwg993ha1T2/nwyuvIoisVsauh4TOVBqNbTRP3fYGRzYJYMe7hqgWXJBzKDcdeLuLJHBD83Abo+kjSqLbj+BiDhsL98ecKg/DCpR1S5RUz2/S5e6mukUVzBiohXTHTxgD+iVfl3SQ5rVXgSke24PUf5XHmcYGOf5OfL3s9q3n9kPJiRYi4oDGhAqg0ACCCk/E/WuiPc9MPZicJ5h+iPH5jD1RWJ0qB+unbkeDpTIe1bCdi+2PBCpbdtLcSdiCD1zZrq/7xq9RwBuvTGL6/yi7U8AABjJxg2vPc0cVxgrf2NO6dNYHgfFg0WrLnIKGUQOAfR+BNDUaEAPvuZuDbUDU6E1RBasGEBDmk2sYXEiks53TdvWNbLY0oagfSRk8V3HzHagTGAyb5RDExFFYk6n956AstORkt+RU9JnVaJ46SgYV+ztHwYvdV0TgA9MhI7QGgpBQICIiqKQ0Cm7Yq6bAUJeggAa50ITRpNRY6AJXqy5/+DBYrHYbFbTWdk0q8lkQlQuF/DZj372u999cTF/OZpQgLXwniA1vmlDp/F37rxaL13bAqIfKApd8F7YFQUicvBcL4wrbVE+e/bs7OSkfPDgm9///pOPP6rKxaef/ej7777XzAFNCQjBv3l7yezL0llLk+mortfOmdnewXdffzMalaenp69fv65Xy/Pzc2aejMrlcp5NsvV6zcyHR0eaIVDX9XQ6XS7Wk/GsKO10srcxq5urzWa10jyB+Xw+Ho83m83JyYkEds6dnJzUdX10dNR13atXr/7RP/pHNzcLH8K6boP4joNmsq5Wq7cvX3z22WeTyaSu67IsRdljQFzpFjfXe3uzrmtO7t37/vvvZ5OpZj6cn58jog+y3NR3T85m+3tBsGmaqhp579erBsnWdc2C0+lUqwSFEJbLZd00AOC9tG1bFFbPTma2SKGp55cXFUFBpl4tlxcXq6sLh+yb1eIaQ9tNJpPCFsaYO4dHgvjqzVsG/ODxR0++fXJzcT4djzcEPnSIRV1viISlO9wb3zu74xzWm0XbrZtmJdAhCmBclZxIGhBNyL4qloj3Vf4FJAbohDvPLUlhyVhrIqwvEvVk1S0M3K44gNjKIJlS3w3J62+dgx5x27sPhpJ/+M+u69RUUOVDEv5BgT0KxRnKLhwYD1lfR0QfAhHp/dF5PXga7vxQVUbnSIrOO2+tiCHCFO5WZC9ogJgI9Qhk5iAMQJ2AAHfAnqBB8GMns4ontimhNiGIZw4KZ8LkHs2tJYp1r3ZkaBLR7z90RAQwgTNTr3cEtQrn2Md40vUAoUxike+MnxutHKxxGBRM6X+y8/Coumc1Zut8Jz0xNfyiZmcQEY0GQ0oc77ujLqD88zwG8W8zLB2j9wwjP7sHXNK++rESjVZgvpkHvFK3r/fqDHrFpPNMiro7JrssNzs36DXwkQH0qAocaEe9z16Pd+gVob4XcGvZ5PYPqwa9V8HoWyUAwEiZhTzbBgi72ohANEl3QCXZX6we0OxSjxqyRIaYYaJwessPDNfW7KQo0o5u+UP//LuvrFkN/jno3dCbPxgxq3l+26wraWa2G5FTr7MNIMlxrUOEyZmNED3qCQAYySm3G4rRKYkYHbcEKQSAGAlY9F7K7dla/UCAGbAVPwZIjPiY5KJm66aoR9QU0QDEZAREhXQTaD0+3Fr0yamsLMI5Zz/i/9IY6MSTCBOiQEhodSFCEdC6MZiK1Q3FBEJ2/+c547zQcWC4D3ZR/wCVJXnl5b2Ujf6E9sG8vQf39Isvk4HSYITTG6NAB9DK7u/dogSphGT6Q6DPrEiVcUSscTAwsfpO4Naq6x/Oup56ZKTeyakbSf4i4qCS+GA9pO5sPzb9Hd0sWUoBKM8XEiGJKvThVqRysLs0SMxpAaSnCKWXsy5/EEAh1D0hKEEXhMoj0on2wjU2lq31IFKOoAQLQBggBBajTkFrECD4wN5rdSpEMEQiYkCChOz+T1NACH3CXxCQADIgQMxHGiKSOqd0RgQQseu6qqrIFkxUluVyuSyKYrNaGhSDRsuteh84IBlrre1Cl/ZdNhERBMkZz2GxWblx4QtZh67c3zu8e/fb331VVibIGoldMdqs8dHDj/f3D549/5+M9W5snAvj6fjunbuN3yzW1wezgn0LAOPxuHBO4cIhBOsiBjqEQGSdg/W6XiyXk2p8s1hezhc/+slPQ1O/evHs0UePOx8eP3784sWrly9fFkWh/iHv/fn5eVsvP/nk8WJxMxqXbm5ubm40bRcR5/P52empMWiM2Ww2Zyend07uvn57np30qvcboqosF/N5WRTOlSJIZNvGLxaro6ODm6trsrYLYf/w8PXbt0C0qet1Xd87PX369OnZ/XuTyeSrr74qigINXVxdnt279+bNm5ury72D2Xq9vr6+RpG2rff29s7Pz48OD6azibHm3bu3s/29pmnq9aprNgT8+uVzbptms47z6PnewwfrTV13frp/UI2ny+XSFk5YNptN3QRjikk5IrJd287nc81ZUq2zqqqiKLzn1WoRYIQkhbEgQtY5hNDUN+fvLt+8u7p4t5nfrG5uHJIzZjWfTyeT9XK1f1iORiO0phyPbVF88823APTRRx99uVoul8vCus66rq2tkc16YcDfuXt6dLwfuF2tb3zYdL4J6vT2gSUQkSODJFrpou065mgdK1g04qKtQSIhDoMIe0wkk0jsjVoQgH0IAY1FAgMGUs5SlDMc+bVgwNGJyb+bz7IovvTpnE5GygSCQoQC7EMnkZgEnSvKsmyajgebJUsY771mIQ/NAAAI4gFZIChloe5u0OR+VZ6REDVUjIIaZEASl8KDhiKdDJMxWRvBmEUGJOADsBcvHoAYyCM3KL50PKt4VnWV2SC33hMGh0IBSLbdPcgAwgnYCYkdehiHHQrSH9BvMhPLwGDQx/XOKK0PQ8M7kwGwFcuV/tWGCJgZxGiJX2N7WtLoHgbGBPHaOuFQMKZwKZY9pCPnNo5Fm8QAQGiV3x8gGUixPygAhH3wSg/IWLUglVpSYAsARCIK6tskyXpJaG0EDdeo2pSHKKm88Z/D8lLxWaRnKCobXjraIm1SRF9QdPKpy1BiqqGkc1kbAiyozCMwaAOydpxV+wdIVQsAkSQwpuR9xN7kjmYy72h3MW8hUxXqIoIftm1IezygOVGdT/eyQM+XFVsBA6NEdQMtioGY0DpA0RQASP7mdMWqVrFxCVwEyWjpV7tGbwQAosM+Yc21Dmn/UMIEzUofxTEZ6N5xcwxGJPnph6rawODRrql6ALc2IW5nGQ8HlwdDk7/K++f235hE4fDheSx2PkdEoB4omT/MGMqcMr/zuvyv3ChtbBLHGb+uUcncl7jWYoCCUCIExaQlNRRAfeNV49puwHu6v/PbWyMH21/dcoRs/5EftdOe7c8p2U7J5AWDWx4RAGXPjN2M9+Sc250n5ytHVIeh1Vud2AICDW9+zwAO/tjpxa1ObV23fzIctJ1Juf3e2+OWQ1XDzhKRsbH9w28pDV0a7UTyLdvjM0iIT1Fdq7YQCSEjBMXXGlJjmTVYAD6EBro1b5a+3vi6lc4DCzJLzESnxNrBzChQWLJksv9e32iMsWQ4pSRmiAJi7/kbjIwoSICIFFmBiPpPY0zWfYlob+8AgF6/fQdAUTUxYJBQQKk5mTmaQCzZkmOQwBCEjTGbtrm8uQRCKi1Ys394sGmaq6ursnBNfV0VEDoOnn7xsz999/aibhbjKRob0LKx3IbNxcW7q6sLRKRtNsCiKJRL3qeLUwHXANB0/vsnTz96/LErqyBwcnKGZO7ff/j24nI+nx8cHDHzaDT6+OOPN5tNURRlWT54eO/1m5dqSzAH6xR8X9R1vVzOEXE8Huudm9X6aP8AALouVgYYjUZ7e3vKArS/v09E0+lURADo/PxckRiz2Ww0Gil9UNd1k8lkPp8fHBxMp9PlclmW5fX1tYgcHR0tFgtjXDme6E9ev36jeuHNzc3Z2RkRLZfLpmm0DjEBVoU7Ptwfj8cvXjx79+7db37zm7IslSSqKIqLi0tE8/EnPzo6umOcI2uDgNIKIaJzTjmLptMph7DZbJS3VJFdZVkqBEjXQ9DgS702COOymF9ePP/+u1dPnl6fny+vr0JTH86mhoCEq8KFzkvgvb29uq7ruj6+e+fJkyc3Nzc/+clPnHPL1dwZrFfL0LVd11RVee/e6WRSSuiYO/Gdpv8yB5RAiXQIESFw13VZ0lKPy9OFgYIKzidIxbx0bSjmTel6sp2cyXxw6NtKaywjfzJaJqN08uaS5H8125c+JG0Q1C6kUhuc+axisC5tUoX65GLAsePKL5t2+lD07fwxFJI6g1qPIjepD9GrViWCKAZQAgNzx6EJXDOvuWtIfGFoOoK9MkzLpoQWPUuwzCMmYoknJQtwREcwQJB8/jL3yQ9bZOS3pXFqz9b4b32bcBfpcxrelqXcbZE+eCHt3L/zdx7G4dvzY7NJ1h+gehykNOW/zwW3br09LHlCf0idSL80w3/uHH/D9mvfbzdRPxmyVOH28thpZFZy4L16y/YRv9Ps2zOrGRc/NESwfazfHodbY/Kepw3vzM3eHpb+acMB3H5MD2y5rQW992nvvYZPHKpVO53l7WtHzxzuqZ2fwA8ojTudyk+LScBGeQwGrs2t9+lnmukyLHPNks3PbKkhYsRIsTAKGgPJ5Iu++aHpIiiCglGB2hmmYUt0nfCgVfpnEMkG5ZB/IE4aIQJlyLwIm7joAFGRXYm/JVnjuXEMAJAlBw3MU028UEN1xwYVjtTvg9Wm/bi1NqT/KcQb+10qAVJcdXANZ24wXDlxOT4qfZUMSclKP0li1ZE814hIMYtcR1R/A3Hd9FEIxFjkXCAICLGa7MOlr3/HyAMiwsDioi2YrHosCACGQdL3djb/M66K2H6dKRPd6zlgujvMQ1cd9I9Qo0+phAAiwHLwBkiVDUSUWDNnhCePCGyVllQfQ8Q5Ku8DQ+IU1iwTiksNUrEUde5w5LcWkBACI5OABbQiDmyFnScmEiRD1ujxLywS2ABSUYD3TVvrGa+gHUQkRN+xKg2IGKQbnMFbIOZeojkjwN6zQUoqDSpkedO0tqDZbPb23cXNzY092HfGAXuDZDQFQiRIB8Fp5/TJBqkLrPpW03oqgoi0bYtiGQtbFntHxy/fvDXGdd3GFj7IOvjR0cGD2ezgL//qL5eby6kzFguiZiMLs76yctAF6ZrWIQJy4M57VF0qgMwXy/l8jiZm8vgQBM1sNpOmvnt67/Tu8ZvXr4ywbxspi9Fo9M033zx+9LB0xYunz85O7965c+cPv/9yNp7I2ALIYjGvqrLrWgDY39+vqqKqKmvM4vqmMLZuN865V6/edF13/+G9tl5v6rYoCmttWRbT6fTdu3eE1tkymVLWWrteb7xnZi6Kouu68Xi8d7B/fn4+m83evn272mxm+/s3Nzfnl5ci0jRNURSqpLZte3h4OJmNb5aLyWRcFcV8fr1er/f39+rNZj6fl6PCGEz+YiKUk7vHl5eXpauuLi8PDo83m83p/uHNavX9s6fX6/XJ2YP5YrVYr+49uL/e1EBo0DRNs17VADQaTcqytGJCCCzSdZ207LsOyXVdG9Aze2RRahgEpiDPvv3+7ctX1+fnN1fXoWlXQQ72pmE6bja1M8Xh4WELAADOuc1mMxrPRuPpkydPjv/kj+/fO+3qedusBULTdIbw4HDv7t07gNx1jbEYPBuLWoiTiDBAJ9i1ETbjg0cDKERAIQXwURkjEBjEB/ESvIRgiCEGyiRRTWgZkehhZSGiVGFjKDfM7bOTmSHFTtOxG2/IVkRWFHIWvirfZVkCkTa/6zpmzDZV3DjGSOYRSqIeExyldAUAAPVyTnu0423Jv0JNDRIsiqJ1jtkSeB3MnHY8PE2QEQKyoEf2wEIIzuK4oNlIRqYrqCXvRUjAMoB4QAnYu9gZIBbBQQzJEUkAWoITNVf7fWqSsi/q2ZPGELJlNVRlspje/VxHaYukv39T0KaoI16BmreaoYmBKiiNcgMKMjMgIwIiGWPUYQsRQUQJDrT1usT9r7FPYASK1Wq1NIQBpTgECIIiEfgQl5a2cyuognnGMXUW1PAQhU2ktONb3kDYDpgAZK8/AIDR0kRDr3BKb9N/SY+A6N+rKYWspH/vswGwhzEzQEy6w4gIg1SmdugU5/RVj7hTbSr9NzSEcOd1CTRCqXeIW2tA14w+h2CwNURkSCauH7KuwbTj+29jXEXyt4n1p/957lT+5fCTwXPMsDazajI+DFT8HxhPlJT3uSMZYsoHB6UvS76JmPAou4/SMdMm2IGkyLKjn2xIVp0wEiEycoL27ihbaVEiDGAkym/J2d7S+lu3phDScieIgnMbzC0AEDigZoGqrppGeRiDyzfnJqlST6CFehgZwBlBxoEtoTNJ2A+VoB4mype0BdTbugboowS+AWYmk1mu1HkTxVbSFAEFebAqRLfSLfYaidp6rJxioq2vz9GG0+ATSJttO+TCghr7GKT7YJqWuDso1pJI1t6WgYGIAJHDSxsZ4yk9bWj2r/QCK7mpeiinnmHBcwAhwAACEADNe61mTJ71pIinJar/awiZ4zSpVKJ++NK9O86ALeNbCM2W0WkGLyJUodobL4PlLZjmPS+8rUbq3SICwMASIKhcRxEAYmQSQoQgXkdT12w8JREghBY7AwaFEBuDtaMRmsKRs9ZaRT9ICMJCaMkCyKaOcUzVKgxRNGgyXy3FpEnmwD6EEHJWeMavW+OUS864mH+mOV5N0xhjq6pEDhfnb50ha6lrG4ugRk3MBktBiriR0TADAUtg6drQNW1HSHtiKAD6wGTsdDy6vHgzG7vVan14Z+/yalG60YN7j66uzp88/aoaAxkmoNCSlIgsZenqZnVzc3MwnaAx1hRkDCCFwKt6c3OzmM+Xs9lsPJkEGxaLReDOGmPGFV+bTduMxmMCeXdzfTCd1HVtjLm+mk/G4+vr63v37r19+7YNfrGYf/jh2eJmbpAu3p2r8r23t2ctbTab05OTi7dvptPparW6e/eulh67ubomosLYZr3piGYnk0k1erGp18t5ADk4OFiuVyJMhHt7eyGEIOy9V/R/UUQqSe/95eUlM08mk7aurbWr1QoR67o+2D/67rtvHj68f3b/9Obmumuaer20BpfLRVEc7e/vL5fLb7/99ujo6Ojo6OLiIkwnD+49vHt8cn5+/vTp0+VifXbvwWg8ZcTpdArGXl/fWFOSKybV6N2bt2TNbLofAmzW69Fo4pxToP/8crlYLb33ZVmOqgkXrq7n8/m89ZuydKOqKq3brJdGeDm//vJ3v3/78mW3qUFCad3NzdW4stPpuG3boqqa1p88fNiG4L0/2ZsuVhtrBJz5y7/817/4+R998tmnf/vXvy7LUoTbtpmOR6PKtvWq3iwssYRAIIUzwQuiBGHsgvfBey+EzhReGABIgAWBWRAQCYkEwaM0wUMIVoJHh8ZQcn4bgwPzWBiErDHGoLEAkWGawCAJJwmWtRNV6I0rEVFN7hAk+/vrusak/euvdFfOZrNsDwhzLN0tEgIbozBRDwBqMTJzDizgllOcrbURMxB9UVEVUAIuVS57tUMIDRlrLZLrCuOs8caIWAQiil4/CSgK1NF6kSgIQMyAguINmNLw2Mm4aCuoTWiAGcQiAouEAI70OB6A2bMQ3vJBRjVwm2Y69Qt2PgSA4c/fczQk/9TW50JIuHMeSQqhiGYm9DqZ0rgNTqiUvsqZZCm5ybD31wIAgBgBDwCIRiQgGhGPYACDSvT4Kz1lBWBnHEDtpNT97Ng2hGniiECGxkVsuZ41yXOMmB+O2zDpreMbe+oLVvecgCCo2YwS6VMRYxwtrrekafRNFmUO7N3wg8lKB+tQeRCSpJsRmaHGnGYhVnQd6hvbCvB7PpGBnaDYdUGwqCW5UA+vPPu4BW+J57VAADECQRgBGZS8VoyuB9jRULfaoM2GDDBBhTaxsFaoBYmopugZF1G9F0UtIK3MLYMBRFAGrl5vU3BYtjVEYkSdc9IpMqS8I4ipj6mB26CbrKVjClECgAzaYJM+JH0D1GLT4ojKXwYkgt4zCRFEJxtC7xBlloib3JopFhGLpFnifbLkwPqJAk5iap8QWbQImAJbJCDJ9lWkGkOCXYsE4bh80yokAI42IQqIcAiKAUIREgBEVkfQoDiBukNAQu9LBtJBRcIuBEreCK3fpMNL2iGWtB9SPgcRqE0vEuvGReBUFGqiVAH9IjWqAIIIB0AEtR+igSmAgEgEiIFRRCxh3t3R6BAEgcAMsQ56drQLsQCIQTJWYwmEiFpvUNF+pPEThQ0KCCBoMlDQkYlaKbNXL5wgM7PVAgDgRTTXfhi7iEq/+v6DoABFhlKAoJxIABwL6QEnEF6Kq1IcE4GIzI96uiCC7gNhYmHQmn3IsB1AEAFkJTdQsRKJurXagvpmlJ6HBUDE6INQGTGyFNX8dV1InM5aiHYSEEa0n01rnlkd/tGw8yhiFIkrTkQEmBEoLRelCkjeDVYvi0oB7gKjXVK3Aa4NdmiC2EOiGZrR2DljEEUQbeGIsK2btm0rVxhjkFMZUYgaknNk0LZt60NnDRnErus2m421RIi+64ioKArfBQBCY0PnkSwaFxgEyNhC5YVxNBqV796+GlcGGHy7Kayrm8Za2wYmIbQOQsO+MyjWUr32wMFa6wiD7zrxJfhxSevNYhMCWUeFO3vw4N2LZw7qjufTfbdZA4eDcnr44Ycf/PZ3/86YlcHO0qiivVFxOinPptUhiLx79ezedO9ob997z0SBwRl6+vLNdDxxpnj88KPr6+vl9U1VVRzCaDze25/eXLx79NGHod384cXTty+ezwpXFnvvXr2ejsbnlxcvXrz46JNPH3zw4V//1a+n0717JydPvvvD3rT6/LPPv/jiCxQEkeVy2XXdwcHBeDJZTabj8fT1q1dN05zcufvkyRPnzN3Tk9AtrSUJ8PDe/WdPv18ubsrCKVOqsBf2HOjOnWMAPjo6urm5YpAnz56enZ09e/asaZr79+/7tlXT4nq1/vijx3/4wx8mo7G1drY3rkbu3fnrfzD5+WJ+/dlnn7Zt++TpdySyWCwePHhwdu/e9fxqtVr94csvDw4OutVmNppWVTWb7v/yF7/68ss/fPPNd//kP/qPLm9unHP3Tk5n0/3z88vDw6P1eo2A1fhotRIRmUwP3r55s1yu7x4fcVUd7h+UhZ3P5y9evvjkk0+a1ebq8rL1XdvWzRpXSHvT2evnL67OLw3SuKqaprFEXduumnY8nSzWq7uT8f7hoS2no9k+Ixlj9sZ2eX21t7+/uHpnjRHT/frf/OU/+OXPf/T5j//6r/8NAD+6f/rx40eOwqQsKBSr5aVDIGcD+w03Wlku+ACA1lpg6qCPeiOCUu4KgKCAMZ0ERiCEDq0X8gImiLUIhIVxxhgtoidApnACFEQkdABgkJw1KraCMBujZKDOGWNiJg5ICD4wA4o4rb4tQUJIyDH23mOIuXM0QLGqlLREwNx2HYigsAF0hgyRNeQjPz0r65tIYJYcqdOkIaO5VWiixx1ByHAiEyBr9UVdCILUCZAxRVmWZdmsSRiLsrCAehI7cgaMFy8AjNSidIhemFGYBCobphCm1BS+NugJWYgZ2+ANgLGWE8V0yOQv6uGQvqRt1ikkOoa2dBS9NFUjlutJSMWd26JyxgIA1qoXvwfexIxYNNIjYCE/Jyv6yqQCiMgpGRBUgIvqBJj0a/3bGEO7qG4U4XRwB4C+crMkmU4givckzX9jEYlFpnKt1l4bRgMADEECgxBHJyki9VDSSNPPquxF73501Sb4eNLHEIC8KCsAiSh6wuhBGXm8MdlL6heXVOweSMcnQwYgKTzxRYhDCzPqXarRqCETKxQB9EmMiKmYkh7HEmnyc9GG+MwMakkfxTkcYgd0Jyr1CyPEN6MuP5M0LAQgjNWHwo46j+rq5RAr/uq6ZY7cAYh9sTZVuCGIJNVKAIDVWayu+MAB0xYUFn026v1qKCAQIqOyhis/KVNadkm/FxNzPRK/Z6/H6yhoPgkCQEBOfk8JwQNwAMqUGzrTACCBARk1F5dZWKGGaSYBgINkFqCdAZIcwRFd1tn6BIgpHrs7sy98kNOk1D7mCP5RN7ZIz8OTW5IfQgICQgIJRCxp1/XWodpDAsOACLJA8stm+15ElX7Jftq47iXWku7N+WzF6rtiTBgjv2S21KVvdoRCYbQ/WSAVQImJPgPLWG9MI6ZsCdl7PIgXYfJ59PIxWdWUZUIWs/3EKf1VevzgW9R2ag4MJqM1acZpWkRrmwtGmFOMVyT7ViWyleD7J+/4XSAnu/QNS5b9LioRSCm0VI5pgly/yWE7Ix62r6iIR0EUK3AAgFI5Dd+bjEtRfkk13rLBGTNuCNWGiCOlJi327vwUFohUP+rYGqZ8xRamedaPMDlt4iAnt4zE4EoEbEX4EwzjJ0AC6qT0IK0ElhbDxrGtoBwXlZCoccjIyuCGiM45hf0AAMdSQYCGMOhpx2m/SHI2tyLGRHYLPQ0EhAgtR6OYAogQaoaCFiLxoWXxhsAaFPYCZIwJIG1gA6hv8aHxoUVEtAYZ2rbtukBElpBDK8ABgwfxBIDknJufXwB3YDrvofPTqpjeP3tMRO8unpYjnu2NEB14g+CAyXuPGKyT9XqJiEC4qjdlOUKG1nPTemuL6+t5s25G01EIPB6PjbWdb2xRHR/sf/nF3y4WK2PM6enpZrO+uLhAa+7cubNe10jUtu10f8+g3NzcFMYCy/z6ejoet23bNXVou1Hp/GQyGVfLwsViCxwM0sFs6r1v1+v98fTq6mo0GhmQN89f7u1N67qd7U2aeu2burBWJFiD8+V8tVqcnZ198803yvV5sLevwnPv6Giz2Xz46IO/+Iu/OD09PT09FREJYT6/Pj4+HI+rq6uLo6OD169f//SPPt/UKxIhIi0PfHx8rMV937x6zVR8/93T2WwWQKqqOr13tnd48PTF83v37r948eKbb78/ODgIHazm8+vra7BFC8XewZ2mXjtL987uLBYLCd3520vv/cHBwfHB/qsXT9+8eB5A2rb1vvOhXa/X6/X67tHxi6fPvv7qD7/65a9EZDyezK+vLFnz/2fsz5olSZY0MUwXM3eP5Sy5Z9Z66269zEyjZ4YQPOEBAIVC/iAKhf+LgjeIEISQADgAMZie7r5zu7turVlZeTLzrLG4m5kqH9TM3CLOyZpxSTkZ4eGLLWpqun7a8zRNw9B571+8/Iz6E+QeiWOMU4qSkkxjCqMmXA4eBv/f/rf/j//z/+X/9K/+1V//u7/53z/59MWLZ48XvUoKCHG1GAhTCvvdbkRQAiEL92FkIAFkxAQpgRKapcF821ZbihSUgIRAARNSUHAiKERmADrkMNM0GYtwSMbWzdcdYhSdJXhElFIKszK2vCsZ5ykphnXbKpxQa7CNyUAZyjOvxGzLEcvmLXtH8STnovJZtJmVAYsqrN6GGcIl34towVeiCkxdNwzDIJOKiJB3WCIWIYGYI55EJakCMrKoJ+mddD56GhlGkH0UU2ss1i8mUaoyIBVR0fbE7N/ErGjkeCAovu928D/G6rEI4vP5knbVCCSVsVPeK+vJdr9uttSZOWef+YGHv311MZtV2yhZAqZtbVVHMCsYoJQUW626DzZyBZSsaABoizHNhxIQ5623wj3nPTebPaEpI5V36kOff6bGUnoIEe1Rqjl53Z4IAIqEABazXFA+KcsFJkbrHANdBnwWbJpJmaepbHeHUqUSZpyM/BPVMqyNgEelwIUWr8jRo1pRcO6rydwZydckA667MJW0UoA5oswkcwAoM1XFBwunktb5ZqZtkKRQIU4PZIB8/yyCQI4gAYBsw5asOSilGqtcqKdOnknI9bm5+xZ0jXMgkGYHoA3O3Bc1xM0S1KSqRmMix4urNhsAnBLe/xmLIbQI3AYUku99wEECkDlIs2Iz2UkRksqLSudnAwFptr1iucaoLlVFcm6LSddzB4plVkqdOjUfg4pC0Smx+isQTN4xdwyhIqLkJmkV42gWARERQVSgFKUzUxNiLXhRG2eRTgoKVnasqvd1nZa+aI0cKeuqOBBmzliYGjdnCBFFUjvCANW5R0fncxdwVrOKkDrPUgmot5x0UlUUJSLgDHunmksh1oWtqmpG8xzbd1y5MIMW5CCxA1qZt8mmnYfVAgRrXkEdl3JUY3+Fo8pTXoR7gFI2LtuQZstZ6appp/NwlM9QuWrp5nHc1wHwwAGsstS+ZLpQA8LPY6Yqtse0GR3lXbONBwBUgZEByLb7GOMepz1OOx1xQczM5IlIMQMYJ0TvvYhkD5rVCGRmZmWG42whSCmBNr5nFUR0SM652gyzzdQQZGuqobBY1IQhmteiwlUOMoHGd52NcFKJEghcUhFG6nhCWJyswPHZk0cB0na/AyZFHgOyLob+yW9+8/u3F6/H8XJ9yqJJokAcxUfBKerWu75bOnASwqgIAMrMd9vNfhoXi8Xlh8tpmgjw6fo0xigo+2ncbiZMmKZ0c7l5/+7q9199npLcXG/eXrz//e9///bNz33vl8slEdzeXhOohn3X4TSNqDrudsxMqHdXl7BekqT93S2DXn24WHietlsaBlBZr5YhjNO4n8b9i+fPwjReXb5fLfvO88vnz374/keHsOw7RegIIYbry6tfffmFdxzDRAidYxHZbzeeX37944/r5fLVq5fffvOnly9f3t7enp2fq+r29u7Pfvebr7/++tNPP/3+++/3m+16sXz//v2LFy+8d99+++1vfvvVycnJbrf7/PPP/+7f//2ZnHeLRT8Mby/evfzkFbN7/+Hy7m7zq6++SgI3NzeL4eTnn3/eTePjJ081bafpyjnyPrnObW7Dbnv97OmTDx8+/PzmR+ecI7y5vtrtdpeXl6uTNbNeX13d3t6eLlZ/+MMf/t2//d9/89Vv9vv98+fPd3cbQuw6P+1H8v12Fx6h1a8dRUFEkmZcGlSYxrHr3M3thxfPH/8P/6//7r/4z//1v/6X/+yTF2enZ0tI22nap5QMtdN8bcwoiozqiJJQQmWEZMtZs3O9FO3TGr03mxUAkkoQxYTsHDNKTFori5fy2EgEXNiBcXURKCE9kDchqEJ5NVhY+u/MhRpOQodJfpUNtkkCda2llDQlIkrNRgAlLB4IjXtlhmi1hhsOqc1b0LL5QZNGBGUkHYZFXO01hTAxsVgJPwCiBAlSilHB+J46At/xwsPgtevEsZBGnZKGBMkREZIBsps9EEqvVQuUJGkV7zIjLNXrKw+srOMeV5xF8HLGzCVmL6ojjEdX2gi0KOx49Dk1LnuoOz6iNlI15GxvMP2gPIGyZKeHu1iWXAso0LyPzy89kvmwmlNVtcmKViqqxaEYkBERD8TumcwUEUlAjrLfzCqPaCggBFaHvigmbePLmTngNY9ks4LKT02sTtOSFqvwAeEQBZpZaCe9lYPzIFd3TdNNw+fJ2IiNLRhLAH3dz2aSA7BZyCUlyorDUhaXDnUPOCSVue1lnlsybSfooSO/pXlIIyPltNmsSNXRqAN+9BZrU47opQO6qlSUJRCd78r32jbZoNUfqopgdD4LjkcU0AzDHOJ8tGgPON2MKlDkiyZ/GUs9r5zg0iQxz08DqOePBrU+7ehoXpdUk6iVbrG8q6SqB5H6lU2oVkMvIlYYxNpZMKdgqpFe9RlGh6ld5zNBQzp83REXO+qR9Zju/wTt+v8IO2vH+T4d5xuZMhDG4YHFH12/HtzVvK7+enAN5PqXR72zz3WzvN/UdgqOntxOOuJcdaWC2NjRfq6Nb39tr2/70l7fHnI8qgd59O1hqe0fm83yPD56/tGM3P/84ECpqokzVsxIQNn3rvPsHTQQn/UhdWlYTzvnO+8Z0OpS23RUkJ8jymkHxx51JP0TkQGS2AhXuBIo6Cjz2KmSd2MMUwzkHXm3T+Mu7oUQOwcO+tMl9+7pq2cfri4jKLFH6Ah7pvWL558h4o8/fus7IA7bzW0II2BCmhS2inticY67rtvuN+iw690Ux3HcOUchRXS8WK8UYbfbB0nTFPfbcej63Wb/7u27u+s7CTL4xYf3V1NMp+ePnj17fnl9Rd6dnp8Qwe31B5WJSVRFIT15dHb14Z1HWHedxnD34UPYbK4v3q0837579+rZ44700clycOggLbzb3V6tB7/qu59//MGjjps7ktgR7jc3rElTXPX9uN90zj06OVn2w+effCohni5Wjvh0feKILy4uXrx48fd/93ed90TkvX/9+vWj89PO+/1+n0L88OGDZ3d6errbbN+/fx9CuL29PTk5sYoBNhG3t5tf/+a3/TAg0fv37xer5e3t7Wq1evTo0Waz+fbbb9fr9d/8zd/8+Pr78/Pz3d1mCiNiePfzdxLupt0V6f6LT59/uHj99qfv0rhljXG/Y5W3r78HidN+e/Ph/dvXP/7wzZ/urq5TCBc/v/Xsb6+vw5QA6PGz5+uTs5OT0/XpqeP+5m774erqp9c/v3379vryahxHEEEFJup6P037MG1PVssUtwzhf/1f/t+//82nX335AiGpBJWoMcRpnHb7FCZH7LCufUQsm1yK2Kymlp3YYlTDvEcUhAiaBHIdHMkGHUYiQEjieeYbroEFrnxSda4fDA1/blfTERusrCmDrJeFhsXeaYp3yQbOSKMAuaIflHyDupna2qwfKopRyxihqPEiQgCO2BNbvTDvve8Gch2QV2JlB86j77Bz4L0Qi2qUJJCUGbsFdOvolyN1AVwEyuiEOHcTmLQp5tiOwP2TAIByjHbyILO9vzvcOwxX7ThHQn6xQDI2O0V5Bd//idCV0BS4h6HXNnJme/mCuXLYnErb8vnayPsjc39MjsbnqCNHN7ZD9wtXtu05+mDH0bsebOf9Rx19vn+mPuc+ps3s3bpPLQ/1pX0jANTaXu2NR7sbFNt/Hasqn9wfgQY0z6TVXBDPXnM0AnqgfR8oOQ+OWLUX3J/6o6/3CeDe+GD70/2n3b/36Ml2xuUAkuK2A4WDga6aImpGP/1Yzw6nZx767A95YOys7HiemqIlEyIBPnj9UVcNKFhVUQVVcmw1mWRtce25R6b74Jx7kWZRFnOZXCpGpDJM5uvLwVjZgo8ClmQgxQaAoJDMzi25BnhdsQ+MUm1+/VWPvVpgFhRy3CjG1qxc3LcZ51k7pzZbP8fQ14OrgoIZgyBbU8AW+aFGVPP0y3aCZt9SVUS2VYyAQqhanmyry3QeJUTMUf5YTOF6MHdlwSAUG3iCmX6wbMBEltSVvRz5JVmtIpjja4AIG3g3LE66eWVS9glkrcxGoxISZWqqAy7FjFRSVyBHslknyvjbhmg2w+xzaPtchlYNN7YO1fFnbSgjqSIAEyIQESRSxaTqOk+uU8LqjCIiRxRCNKhyACAGBvTsnHOSQsraf7XZCJKSthadYuO0UFciKI6IeexEGVRSIhWU5AlJhUFREqTiBgNASQyaGAQ0qjAoERiIcVAZ0zhqwGGhwKvH58r08+VF1OioU+lBuvNHz58/f/n6x+/2+xvQUVQBpO+cd6B4N0ZGUqfLJBhSeHvx5lX3+cnJ2dX1nSKsT0/u7u6G5ZBScr1XAogpjOO03467/fbmtjs9YeT18uTrr78ZHC0X65Nfn4SU9vs9ETlPr3/63ne4HHh3t91vdy+ePolhRAk9AzKuh/79xdspRpHoV73st05T73DZu5Nlf3t9OwzDwvH5+Vnc3b15/XoxrDDFcXP3/u3PN5cfTs/O9tu7hacPVzcnZ6dPzk7TNJ6frK+urqZxB5qYoPMMmh6dP3n3hsN+d36yXi+G508ev379+le/+tXzZ08ufn57uj7ZbbaLflgMw9WHSwB4fP7o7/72b588eQKCFz+/+/LLL7/99tvtZjcsV8Ny8dkXn3949z6p7nbb9WLRvfrk+9c/vru40CTffP1PJycnf/0v/+pud7ccHCqnsP3HP35ze33zl3/5z17/+O1338ZPP/l8mqIqhBD2u83Q9RrCDz/+sNncfv/993/2Z3/x+rsfQPX3v/0toXvy5Nkf//AfvvrqK8sEEJFxtw0hOL8IYQRE733XdYgcUlJVz84xesZpf4tp9BR+/2e/2ty9/fPf/OX2dgOoDKoIKkklqSoxYEQEtVAGBLBi4PO2a0lMhdDNK5DXrKKgJsCoEhG9qbiaVJVRFTGppBi6flDV7IrWGuPBAKkVPkSkAqlBs2rr9oQIlrBElPmV+RViChmb38z2s9ADFYHRQoyYues6kuLQa4QVSzUQyR5Fawg1AKj5lQVFkJm9lbixNwsTOfI9iigzckZCAPIqktByKmIiEvTC3Uj9DngnOqYYU4oMgMKgagHFAEhmnD0wHeZNJJs4oY6nZZrZoD0o7TWcFpui9e2+VveIhzbXw0fVXZXKJmHTO7/a2oOiytpUdUUAAEYEC6Gu78qyQUmjvC/k1fEvHTkYE5uv/OI5WKDRiNBin0lFSpXfnIdZSOu44yogKqUC5kylRBlc8+PjcxAq3PZFVQETlmDjdqc46nGdX2yEUZg9Fdq2tso5813Iqhm8Q+eZqp1tITgAcgg3aoOYlK34lmeQfURoOZO1j7aC6qu1uAJEEjRT06xxGxmDXwFVowFlqxibGzSH7RHNOaild9o8ubWEzrIxtgnR2ReEqgc4P5oD5o+nj5RUE4oiYCqrrJkbAlCCB+J+5rblFUEA4ObWHY5ROQlQEG6gEZEOr0EoGcrtmN4/jKFaHovcGwgRcTmML7tJLCjKZKo6yllgsltQSKoUWOPsRVWr6la7DQCIllhfGEQpJ2V3NSMl7YuwpIeAUuOzywpis+ix0P2hnlp4YW14O0JHq0KLTnk4r41aRQfYoHXiiZoFMxuqLRxqVsBU87Ise+XBNlbbUNtT+4Wznk2IisqI92msDqUSHRt77vH8A1JhakOJEB4iJFWLY0Q1gb6I8bakITv75ifbIBT8orrG7z0Z5TBU6Tg6s3b0KNwyv+XwjGachARAJdEM2/HU4gKcH6IPXANoxd4t7Y8s+AcRJYmqEigjC0KMU0sD2dwoEVJGGiEAIKohCnVGiHLFePNp1WAeVa3xqarqijGMmWv9USyO1MouzGlAgOM4EhGq7KcphYBMkHQz7teaTtaDRnjy/NnF1bspRWVAYMLlNOmvfvWr6+v3AttxukGSOEUCjwgid7sxadpGQeeegfaI+Mc//nE3hn/1r/4PADrut4zknNtPu/cX705Wa0a922+m/U6m8R/+/t+frk+enp989smL2w9v375+/fL5s77vYxgBYLFYEEHv/fXl+/P1EiFK3N9ev//L3/76p++/XXZd2u/Hu9vzrh9vbxZ9B6I4hZPOX/70hj1ZydueMe63y8571P32riPwpCxx6Ibd1WUPyhK3m7vd3eL63c+eJCZFkGmMu/3mJ+S4321CYgYI6erdxePzR6v14uLte3n6+NWLl9//8O3jv/6rn37Eze3t00ePLt+/997/PO7PVmsl/P677x49Or/6cHl6enp+fv4//X/+x08//XQcx8vLy8v37/7yn/3Ffrv75JNPPLuLt2//8Y//MCwXL1++fPLXf/WHP/xhe3P9w3ffksN/9zd/Ont0OgyDRL26fP/dt9+E/W4cw/uLi+12610/jiMk+fH7b0PSH77/No7juNm+fPrs63/6hhSHfikCn376+X/4+39crc6Y96q6Xi9DCBJi13XrFYqIc56cG8eQQpAQGRAl3d3eLHoQ2b94fvov/vKr0+Vw9eGHxeAhqaA4sqhqTFHiFOuORkTMyIZFoyCWzmWhtjnfysQCAcEkElQDaEDskCKoWN1fVALMVj5RBAuoM1TprDSTkgLEGLkU0zAxPSWtBpEjVtMwgZnTGXfiAmpZPWyadYCMzpFXUFlfzrFVOWgf69lptnVZNavZyZkFneIfqQ3Isj+RKgMmZE+ucyKMOddVSQ0PO/NSx0QuOD+C24jfRNyRCPOkI3ZCThGhWByyyeB+f+FQcPyF842QV7oJfOhbnvlrTu60wNFcDql1FBDiQfnhI/6Ms2o3c7l7e1iW/8gMGCW+oj3mLtyr4wtYjV4AoC0uebMBHtAPNPuRajVvZaPV0aDB0eaFIGmGeal3EVHxbP+SMHb05OOWwAMX1MvkofO1/XAwBVXin3fnRq2dhcmK0VTvvScuICsaUipYip4lEyKppqb8TgJL0W5i82pfTCQ4kpCb1socTY1CSKh25phijyblwYE6vrJYLe7fUh3pR4KSZqjVTEnlGpMatIiW2KSUaHM+C/3t8+xPXQuu7X/bAqhB9hkQU7Op7x5JfUwOxBmQvkx//sWC36WKQahZcROErLvmOP8iMT+UMNMexKapYFlhOR07d7oYF46WStUmscZsPZQRAQA1HVaPhem5fXS4YGaa01l7bgL1EA7WJzWqbW6mKqSUgUDRcpfFADTNQAHQJnAgAyhqXbrYiNFZG843aUN8RdVELNF1ViMTWwIy7kq5L2I3gGYkUW6JB6AqOZYMULEXcvDlETjnfNvBqrCL1Mww9YEG8oYIQEiYIzIpD0+O9pNCSzM3nP2xbeY35GifnAellT+V0Z9prtiQDvK2jEoRc0ZyTb6BXJeCbcFgS8dlTTdfjCo0U4QAGk6WCIACASIyeed77jy7zjqCpGqGzBBrISFVZQuTQA0hTtMUxlFiBAAEQVRzclfBnZkdckopQVLVGEIdGc5AZCQqxXOCzGzg9IZUiFYNyiINihXEUo0pl/5QkaiEgoIOlZQ6vzo78cvu4psPrvPACOA0DS9fvQCIr3/+4xefP4nhuus5igLiftyq3hIPKGcUzlIUj71j/+7du2mMv/7y17vtftqPINr1i7ub68vL96BB05jGETQt+sFhDPvbq/eve8e9h7OTpWPd7zZx2ns+6Ts3ON7vNuu+R8Vpe+tEp92mIwi7rYzbQEhx1HGH4/jyxbPb29tO09PT1e3tbd8t4n7TOQeeAwCIYAhe9cnJidHL6WJxu92crVdIuGAOm7sedXd9c7vbPTo/vbx4i6R738s07nVar5evf/zu97//7dv37xyJI7i5/CACn3/yCkLY396q6tR1u+1mJNoxP3/+fJz2dyI3l1fPnz9///bizY+vmfn7b75l5o750xcvrt+/+/TVJ29++P7JkydXb9/iNP3697/bbDZ+4X73619fXLxLQ4/qPn356dXt1et3P2nUoV+8//nDu3cfnOv2+zePHz1Vhe1298MPP9ze3r58+bJ3/u7q6uXzF2cnpx/ev08hXl/eEHXPn336+RdfKXA/rEIIXb/uB4zTGEJYDN00TWbPizFO+zGMk6Rw+eHds6dr1P3js/5f/OVvHp8NQ6chbOLYEYJzlNRWA4l5homcaGJlAK8oykoZUzrlFZYK17dFpiopJMEkOwBmdo4IIahA1J4dOaeAkjLGTrL8GMkiIyKjouIMxwlFcDmKYdCSIlwjUlJKUWc3nf1lzCE9beUvRNSULB2ychVVDSF477NwXXQGK3lhW1xKUlmpNkUD2HQMQCnwCyklIgQgy+RCH733IJE0MSpqBAFQARBDOxHiiDgK3wW8SvGWKSoIKnXAMTlDiYOkGcnaaq8fcPLMCdg8jQd21uYCOJRaCt/NUDbZQlzZamuznHl32Qcxb1CEiCrZ6Db/xfYJeWNTADWfNjgtpjkEw1Q32QfNDKyzy/TY6v/LYl/t7LHxXAkL9H95kB5cXwfgEFqjEVIbzz+RpakocgakM0LNnhPKowo5zVfrUAMclJzNr7DGoqoCWvnqNn1llnx+ue9IeROHEqNfE6O1yaDIy+chmyBBmakiqNhcEjmAVioAE9qSCIDmKIxcpSeL+1rk/rqXQRMFdPRqVQAQykiYeb9FRJNX6Z7mcyiuU7UwltC45kpDy4K5ZlxJqZ71ikbON9LPJzOQjSIiSi5ABKpKRb6aYV4lQTavgxnBjW6xiP5Q5GIbmQMFoOVrlZGCCUgwi4xH6/lo5qChD1Ul4oNJzWC5x4MIpXWzdl1GQbNe+DFddvY8INThO25debhZW2t/qaY3pAQW/FKoM3M1NMRMK+AOljiPWFhbzo4u0DG17wftm/Oy527XSyqBlmzyopBUNglsxahLvcbZSd2+CIt0X1ptrySECm52cCRLgNOH0Xsgh3drI47Pl91/79HsC0IFtq3Lo67D9siN0eOs/8zQmZLMSlquEcHG6HNVs7ZViOicIXgaOkLxHx203IB3ajr/zFiLnjj/hfazAb/JnH5+NBTtmFiPHyTaB1hnaa2gesXC9QiACNlx13VD7zrvHJMzCDRVjSmGOGqxGopGUmJm0JSmEMYxhJBiJMoUYDHH4zi2Ufv2qJRynRzKWOJa1TYs4heUmkHFQumOUgXAnHjOhzgxsXMkkTdhFJVh1QvCKNPq7HSMYbvd0sp1zu92EYL+xZ//s7//w78RuN3t0XcgIp49AIS4TzoOnpBAUZKKJ0wKi2F1e7v505++RYUnT54g4O725s1PP6iqI41xe3a6jLtd5+TJ2er25ub9u5/SuH90OoQdPzpZvLu4ePns+ddf/9Pd1WVcL77+8bvTRZfGvYzj7dU7L5Km7fPz0zff/ulxv3h0erZid75arrx/d3edBu9V14uB2WCnFWJ4cnZ6c3PnURBBRBaLHgAoTWl31w/LGKdl5+O0P1ksNrtt3O9PFoufwpQ0eYRpuxXAkSBNI4psbq47RmZ3c3n51Ve/FpGffvhxvVi+efMmTWG9XqvCl59+ttttN1c3PbkQwrs3P7968ZIc31xdP3nyaLfbffHlZ2/evBmG4efvvweQf3rz+uzs7GTwr7/+x/PHTzfj+8+/+NX1+3c37y/8YtmvT8e9rPrT1+/fnH32HBF32/jkyZn3/v37q2+++ebzzz+/vLx++/YNIj569OjipzePzs5uLm82d3vnuqTw4f315eX10ycvN/vd47Pz7XY77lOGAACSmFKcQAmZJU4xTiFOKex6T3e3V88eL7766qtnj1erBSHsHep+t1kvl33vA6ZxPyYQZuw6FxMqqiXIEyFKMiwAIgRAEVIwoXs2uFgevSYl0BHBAzmEoGDxRSYMpZRUkZhTTAoqZkuYRSXo+oWx+tbf1Ygvmfizm7Gauo7y3xARMcY4xaCqVn+g6hLG1SqHlIIgJCKGyy4iMcYcpEeQAfcKn89Jja1HQvNJEdFcdQgBiRjYJXKewogiqJaVjQb1DAYDGtMOcJPkWqdLhVtGScQqg2NQdiJKisBCmqvZNCVwoeH2eGgivX/UTeGXd5OP/ZSFucPU1ypo3n9Obd6RqNOGcJRRzem8qqgF7v1BBaA81t6Vv7e9qwPSvuLoAgAT0JMKGgoTwGzAsistmqtpYdOvg4h2LmKJlrI/pVkf2aqO+oJZnzzYqZtmHLS82TdbQ97BgEMz0dBkr1HJN3MPymsApSTffG9pEgGACbyimvODLVwWlICAsITjzrKNNknAZXwO8vKb7hAAgBTM1mKBp4cUHp2R9RUOSbRyhqYLCEClbcdz0SoATauKt6pJNy0JqQyQ8m/NKB2IW40CwEjlK7Qvd0TO4hrrlAAAM6e2MllGrjVUHzFcelPfiUgLDi5AFquswa0mi5ZtBaXsqyq6gvSvimrwBpbEpK3ghFXlytRZmmQqSg6T0trOmUfnhQ0WtINWcprAzNZZZ0aEbKnNJfqYqE68GHyvKOWguixbq2qyfpaYI1W1TPy6GOo03D8QgZkQ0UBRpQi40CwS8z9SpifbWggtwC2vOARES1mgbNEHtET/wpMJCalEzFojZWZ/VOz9UCkio+yLqrEkM5s564tk/TXNy16ZkHJBZGxpmigrwYXh2v0GaaezewILebBRQtGe24PdvK3K7JDNw5BV9Ixvlt3TRETkcMb01DJg1lEVSWbdyXY4yhNX3ckAINFwlBVmWAmDG5qxqmpiw/FO07IDyiMJAFkoMdJtdz6mrJZoYqSYknMenNeoUVK38Kfrk9P1iSf2zDHkFMZxt4vT5LsOUAhQ1SkIM2pEE9zjNIEk5g5U+84xcwgBEZ1zuRnF8TUMQ5gmm24DWkbEcRy991YGYQp759xi2e92277vY5x8x87TOInzHhHGcXTOScJ9GPu+D7s9M/bejxI8ehQBwt24f/mb3/7td39UJATej7verz//8vdvfn59efX6/Im7ufvZeQl76hbDfrxBip5RNRGxdz15XC5WRG69Pv/007P/7X/93xjw//hf/zfbze04jmncP3v+xDsYd3cjp45x3N5p2p6s/eb2+u763YvnT0n2737+IU6h9893Nx9O+m5z+f7Nd9/Jo7PPXj65HbdfPH/1Nr2++3B5ulw9OzvVcbeX6dHjZ2dDd31x8fT0VMf9yWKx2e8QdQyT8/5stYKUzpdL0cSISuRV+8Ww2+3WiwEQvXcCyIMfQwqEj07W25trVu0cd0Qni2G3HZ2ks2GxdAwxegQQefr40bTd/vTTT6th0XWd7sflan1z8e7VZ5860Zt3HzSE6w/vuq6bYrh13vdd3O4uY/xw+fbqzevFYjF1bvQdM6cp/PDm7er0xHuf+s3bt2/jbvzqs0//x//5f+qXZ7evP0yCi8WC+IT9+vLycrOVFy9Pfnrz5sPl++vb3fp64/uF7xff//jTv/6XLx+dP/Fu8f7d1TTFk/UTx713i80ueDfc3G47vyDySeI0Bmb2RCFMqLAbt74bYgxh3G7v+OxshRAXA5+s+y8/f/nq1UkcbzyLJjldDTGO2zEiQtd1qjyOu5QSMwuIpZ0gKTM741hWzgcxAbJDEBXJEdoWYEOgEXASHVU7oEkjA7IKqpAp85ohMBGZTPBqUOa0EeVN065L3nuvipYfDwAm1tuWz4je+7oR2HoMIUhK3ntGilMIKQKAd05ELDRVUwRCYjcLXpIAgRE8U4xxs9n0ix6Lsq0ldcealFLKIlIBSkArx4tOgSQpELJ3vu8hjjJOqMkBqqrEqKrMLDFBt7rdjFdpersbL8JOVgOqZxBw4EV4EE+EPNtrUnZSlwZjsfonS6OiussoJi2GMyhjWzYMKsVgj6QoNRCbzHKtlk8O+zEEvHk3zPeKIlbM5/lFRUjNpkZCtRB8VUVFal3pxdhhe0K2tYqIoOE5YjGotRJO3pgODGFthh4qzMpE7WCO5jIDK4IxZBMiFHNKohW2S1IK2pQeETkrA1yMm6Y3ZgRMyZ4QE4VM4bQ9KFcXy2+pwmJGUhREZLSOkEDF70csNaohiyizxNLK0AqKdKTUHahANRDOHoiSWslzpu0qyBVKEBGoziZlAOBS38xEScEst2gjRRg6kxUBQoQ2eaNSbRWLETGjWlNVgdSAa+tcVy86CDxsl1YqQ0RmM1S1SwtvQWit/iCABrtbAIah6M+qmgVmMDh+g+0mRA3jhIiKLWbJPFyHNj6qKUPaxLPZxa4OR6XLOqntLB7dhvCAPtReczAgBabN1oHi8QXWYkTUJJZzYYFYoCC5QFet+AGVcKsO8KBiKykXBiH2AKBU4oByfneO/8yZFoCmiohAqRCGlFMmsy1X8mpt9G/j2rkJVs7pfrxgvpoIs2itRcQvs9X8rXRr2SCKrSPvIyPcLpJ7w85E3JzXohTlJJv7051FVZntB83ihaO3FM37qElYORyW1V9fhIdHvoPwUC8t72o6iOWB5UyGhEM8SP8tKXqm4ltYExWzkLEAwIwVS5YXOw9N08FKYFhsgfZqyrV4DPBu7lHdQo5mgYhbM9C9GawzazlMjMSkioZHSDTw0Pt+cL3VBpaYwJCpQCzenxhS0uIvSqosIpqSplIIQKx+XX6jwYZWu4UZFytfy2g/nKUHG4FqgKygJbmekSnsuZv5+mm/7733Oe0CHJIjJSBBGIblfhzHKQKAiErQk/OTrqO3F29249Wn61fTfkoSVTlMW8KImAzTiKlD58kndMEvhsfPnzvFb7/+02cvP/m7f/+33vv12frVixfD4N5/uLh4+9NnL1+cLoewGwlkMfS3V2OK482Hd7dX76bddnt9O2joNAwO4n67BOgk7q6uz4fV9uby2ekZ7scxCU1T77qeSMPEoGTFJgEYtDPyI/IZph0A1CladQUHgCkN7BMoMiVgVTUwmugduF6madH5YehQUs/cn6xVU3d6ksZx1XdPz89ubze3lx+879dd13sXptEhhf1u8N10d7ftF5c//3xycuIVvWLneifgonLSgejE9ayKu32aKPoAzhHggORiCuO0Y4eS3v74w8l6efP+8uaHt48++U3EPjAxDbuNvH1z7Xj5+sd3T5++3GzGzd3P0xgWw1qVnevClFars+fPXn3//Y+gjl3/6MkL7wbnh65b9d0W0JeqeoJIKkliQo2aYpi2MexEI2LyDhFS59yrT56dnvaaJkeKEoiw+O61hSJwrovJsG48awJEMZFL0UDzs4SHiIgJBFBSzP4Aw2VLSBEgElm5p4QUJZHkulAQRRQt6hvRWaUbMXTdNMsiNaqnchtbVnaBiYw1zKAyN/v1wUBk20nxEDLIKoHUR9nFzrlk5gZR4HxltGwEyMUQK3Opr44injwgAxFAEjTpAZmRnIOYVCWmlKImoAA4AWyEbie62od3t+OHCTCol9QDDT0SamQkllw8SaXdyit/KzIWwuE+VQv13N/9VQ9gQuYN0WyD8wY3bwctL223MEf+6Hx9ZrsNlTNS97i2I83fI/tuqRtVvzZW2+Z2nZtUoau1xV/W+sw6VnCYPXg0FAfbZbmxRdBGZGzhsJsbDx97PA6H+92BHKigBQ1n7pdRZjpobX44EiRNdZoe7EjbHaNHeOg42kbzirDg10ZMxRL8ghndRBS5sgIo8kxtzDwghyfnD22AdBMgUOg2t5/I4g+w0Q7mlh9NVn14NqI2Z45Eo3ZSytE2kgtK4UMrqOQ8zHdSnVDKO37zehO5XZl4PCyBBFYWXEtgiqqiBc9Azr48IseSVHG8jCkXsGi6nadwroWW15AoAhDnUT9SL6xCgx6yj9I8LI+1mwgsN0yJiIBUbOWqmjURcuEqo3BTigHJ1ClOpT4FgJ0sbsB8SlqhUBSASmoL/PJB1YdYXGmVAkoVMUBVUxWg6SkVTIB2SWMZO2su5uC3+V2giGpmbVvzAmBRM2b7KARTRhHq2gaAUvqtADgUW4UiiMFTFmom4lY+rpNigrJm3Jz8FwGoZOpAMcjD4VxjteiU/ipZ4FXJfEAoSVogeGjdJ0BRRHMEG0aGommPYie1rmKAEnRVKbBdyrZgrO9N6gAWF0/2cwGQ5oSE/NBqZbKSIoggKiqQc/zB0g4yulGbFIKIVpocydRRBnTMCzcs/cIhUVIxtO5o+LbZJJNSAkmISIhcnIYhBImh+F4KWRAxcBRNCiqijLnXIv0wTNOkMWlKwFmaFxFiMMUAEb33iCgiwzBAiSnSJlJIU3LEve/YuWkaU0qAIiIxJRb57IvP/3jx4+1m258sd3G/7JefvHpxdfX+4t13qnGxGLZ3tyi4HNwkI9AIAAAOoSNeEJHCPsJmF/fr80cU5fZ2030x/OMf/kPf989ePFudrk7O1tu7zd3N7VuAn8adhrgYnMr0/uLt5uby7l3YXl1hiPHuOlyvewlhu18Sb0H8FAF2i76fYlp0fRj3DnCJNDB7xDTue3aqSIBAwIqdpZU479jFpFbjxkS4vEhVDM0MEbkIjojYOb9cr6YYlp1fLxcxTJhi3y/2+9H7nlWenZ15VZim5dAxkUpaObcZx8erFaIul6sQRgqBY3QpLZk7w3ZMySHSNLneD4gaImhUIg0CHMh1nXO90i7F8XbTsdtsdu9+ulgPq3/80z8kfnL+7FPHixcvXrz+8c37dzdPnj199+5t1y/PHz17dH273QVmRvLLfnF3tzt79BS5/+6HN12/9P0JUs9uIO7XJ+fb3UTsAACBPTIqoOyTCEKUOMVJxnGvMqkE4kScTs9Ov/js1clqlaZrzwhJHDsBQVRCFbGofM3xAinZMmTygMqA5tH0oAXuWmsxWik4OKgoChGBVUalTrVTSeQYcIyRBRiQEFJKYIHymb1iVT+KxXRmj3akDIE1y6P3RSgo+6amBFwzFBsE0gytdiCrgSQo8MR1cTEzioSUQggePBroZ5pdE7UxStmTaaKJiEQFMv+qguGionOSWBKKoICLCBO4EWgr001Il3t5dxuurvY3Y+RJFrhi1+870BQZBUnZg6ACqIBysQQ3sgtAgUtoBWtQtN2zjkMrQB9cebgXIHDewnL4BwBm0Ihis6H8+Cp+3UdPQQAwRPnSQlUAjFAkkuZopnKO7G2xIjAD1lDdJZtO1VfMI6BNnoTt+9KCjpQCqapa6lCUgrZFUjoKVaqvs/R3zGmUZBvhTFSApRQAQgl4/gVRpd0A1SqEITeT2xC2tIpQ/WBXShGwj6XB9kM95rqrjf9HGuOaXUZgEFg27GlusElfVMobI5aScGoLp+0XlgM+Qm8WeU85dx4RUIu1oR5Wy7T6rOBQdr/fzYK8SJacWKEmLdP1QDZGLiSnKAIqUPgPlsxZwcaJYTU3sofBMjQblbUUG51ncNbYEUUR4cgDcIxGcvC16WpLgrMB5l7/Dyj1ntG6skgbRc4Uo4xm+7ecUSAoJYSrBjObo3POPkDJgshSNTEzogKVsr6Q1ORV5ILzJAQslgOg2NRCSgBUMy2YWMlirWrHBQgglZmrZb0KB6o5y9o09jB1DESkxSuAhkDLVKFFgTfjeaD5HA4k3p+v9rwNFZoZuAzUTCj3JqusXsRZfMnNrI8lIiku2/sTrQdkjVDz4WopxyIuH7EEJSTA8le1LeZVGv4L3ITQtpncW1VAkoY+Z5n/wDh132hxbDgpvO0Q9eJ+A9ojJ7ofjoNtY2WmDhYFoRMpkQZApNShX7hh1Q09dSyoSTVm0EAkVQY1RHMR55wr9U1RNYUJyk5WBVNmliCWU2hzyMygWrlkDR0GAMP84RJnPI6jOQEMb6TGChqEOZbqp8vlcjl0qCoxJgmIGEUE4fT8rFsu3ry7UHYhqQp+8cWXAPD24nvl8XS9JsXt7RYAnMc0JZEkSKiOsEPEpNOYbmgcXHq05qfe+ecvXzrnPny4Gnw3TdOwXDx6en56frJenW1347s3F6Ty6sXTztNus0tT2t/deYWh7/phcdb7zbi/u/zwyedf7IkWoGt2uB9XQGG39xLPzgZZr21VyhSWy2XQkYhMBvFIAtBTB4BEGtHgjMmCQAAggaZoLMN2LQVGxzw4xwgk6hE8kmp0gA60I/aEDvB8vYrjRJKenJ2jws3NzbLvIMWT5QoketdvNTqRJ+t17/qT044062A9d4qjC9IlUEEiHnzn2QEAIzt0PTg/+O0UuOsenz+5+nD96sUn//TdxXa718vr6+vbZ09fvX377vT0/HR99tNPP79/f/3q1YuXLz59e/EzM52dnIvEq5u7r371ZyLIbnF2er5YnhD3Xb8kXrBf9IuTOE5WZp2IoVCmqmiSGPaSJtUY4k5hvT4ZPvvs1dn5Cil5RkIUAOdcSEiEwKiKcyA7kFWcMo+jClKuhAeOyLAfBEkEBRtzDVlkOyTASVRFXAidpt6WoWhSWbguG+INEgc1c4/CHi0P/ihiuHLF1tNuP9Uc35Yhp5SoQfmQwzIaRwpDfoKb1XsisoAiCGGaJkT0FarczN4WqAkzKoQJQSAaYwR2wKSkioBKzA59P447ARIgYS/kEvST6hZ273ebi9v04Wa83YT9GDwwO/JOPSGIdB7JARACI4AoWDpyyzXLti7yAG/MidsH4vJ9wWD+XD3+eSRnLkoNik7lolhF8OZRdWCrrFJfbWcOmfys19V4+qNOYDVdPfTr0ZlD1Wg+igEoh8g2s0bt9bULjbB0oHOWpkp7fSY/PSh0AAo5AfPBbeuXk3oPR/K4v1WFI2vD/NORaFFP1vGnBjWoXnRAA/V0AfwpprZG2Kj6FRFmOJMD+eeIxqD5GQ7pMNsYSw5T0+s2a/tgEPDe0KlqzmGQeWZN+m7p7WgOmtnUQmNccCwh55ypShYvqU66NpHk+IAAP/+Fw/UFFQa0vNVEk7mMeW2kZgDGvCosBqu8Ho6O/O6m8lw+bzJzG29nsFHWIXu+xdopSJGc1FBSCgvO4U0IVCL6AZgsAA7IsA8gV22wQBrIRuAc3ENVdbXUAwBAEChimYHvmglWVZE5w79rMuEe0QGIEpNittTksTgeBzCJOTe72qrbrN+cD5BpsSm4dlzZb447ammI1EL/G4Xb1gHWund5nM23lXNlIGfN13k3M5JlcUjRvyDXdDyY00xVRCSKZIu5xRJAzAvH1J4i4s8trlhdJU23qDLlGcbnqTBxooJuV5Ziq8Hk5Zr/KagVBGiUBVAVREVkhQTaoKjOD6hoEnNPpbmohBvZ92TDgJgDpZAAqaTuFWOkqiqIhTA0Y8j1FTkdQw8UNlAAEgLviFWVBBlp4bv1sOzRO4VQCgMBgJoHAABR0SoBAaQUa9Eu75xItGgoVU0pEPVV5rA3EhEwW33fEAKkrB5UuJK4C13nHVGMEVWHrtvtdnGaMj2oggiqOuak6hyzIwHoLJ1AGSWKKjl+9flnP717t52CPx22aX/2+Mnq5NHXf/rjFDbLlVsOXZg0JXUE07gTjUjM6JA7IlIYo2z2o8bJDaefR5Yg+NXvf3vxzeu72607deM2MPU/v/mQBPdjTCH57tQjXN+EZ49PF/35Qv1mFzqcFqoTUZ8UiW5F1gSP+q5nGgBWjlPXfbi5Grxbswt9P44jIkYSJlTnbAZFxJFP2emRkoLpSFaSholVFUHZYTQZiPKWbELkNE5sAcgSl513oES0Oln3vhvHcRgG9Z4WC5gmVHi8Wp30vTeNTDGGuGCW/X7BbEFEkLJevVqtBsvFcpEYOueXw6IiV5LzjnruO+dEvCfvxymN+/j8+Ysf3t1N4/bR+eNxt7m5+vDyk89OT09/95vfX1xcbO92jjwqnq7Pz5anby/e3Ozu+sX6brP75POvpiBT0G7huuF0CkmUfLcYx4AJEICRVGNKChJRgmpSFSRFiDHtAMNnn7387e9+xYwhhHXXxSnkHDOTCUoZLDDHsO1HZB5FACQCJassiaQCpOarbbdD28LRPLQRFVRGhYAY0GIApQNAJudYSlxyLfme12yBhaiBy/Pqzi+CykWLWF8F38z47SdRVkhICpir55rklKLx3oPUQG28avahHinHH1vE+Cx5MDNgtXYpZtRRUFU2Z7DFLoKSErBH9oopAE3QR7+OuNgrjH735u727e202cb9GDWIbKZREuqIOADivmfwhGw+QguIMemkbgCzUNtIEfNwaObr94TIsrPMG0UVtRVKvIBJGwZB1kQ/1w0x79+zYGdbKZhCAmXYHxDcpZVUVBMaJJCq6EHpNzMwleenxl5nQT6EAKVOqG0Yja26jEHtv6IF6Fpsqp2jOmbzQ+YnmLSQc9/EKjFr9usj4hyhBoyzTxLro6pcCEdHk5U+y44w6xj23kr5VQGregg08u4vHPXhZTfP42KCBOSBzYOfd1+TJaxwQm45AyhVGFbMFgQou5ot8drN+/19YATyyUZpMaHfRCHz8zRTc0hCdCj/zVA/UOQHgAPStzWCiDbeIgmAyLJB7GKaRzvzNFREZGBECzgkOcgBqIpHFVaxnZ16jW1Ydta1Y6GNdZNK0P2sT+j8iDpMWq3F/7Gpb9lBHT48pm97JVT1f1407ehmYRTQgiaqYNpOgLlPFLITANlyUzJwDCKAADLm1N4qEhGiqtmvjIURCRgTsdYbYAKpAhChCoKQgkJCAL2XA1C6lpuNGatetdikD6fnobwLJWi8LnWOjq4/XNjYrOF50IoMrfZUbXj0vMPkNX8cjtbmDGBRMqwb7by07WwbVj8QWOhOdm00yQ3ZjdMCOxeH9swvKjuzryUFuVyNYCaPQgNgnjqbYlBQSAXeKa8cNoUE54e0ba49qz1qr9G2JTmu62CDoZIM3zapUO/BTIExscxDLYcRSKlD17m+Z++BUAWTZbkxoORsFhSXHAE652SawjjFadIk3jkmCiF3IKUkErGoZzVHsE5NZv1NB4nId3z14QZAa/qXGbnHcez7vtYVxhwTqb3rxaIjiFznKY1TjFOMbr3sVqvr9z/x0I1Jnr14df747Jtvv7+8uukWDKBhSimp954gxbj33itmKyhgFN1J1CQSaDlpSIz7afz8iy++/+Of9vspDIkwuS5N+9QtxqurK8f89PFjiOnnH78/W96EPQzYnyzOfdy5ac/oOMQV8fP1Cnf7k847RdnvT89Od2FaEjvksNthFA9EzhnUGhU8RymIK0SUkqJGpqzVzuKalhAFG0wCZFLDrEjSdwOIsoBzjL5LKQ3sCZAVBudTStj1EBOzO12tUQGS6BSYmSQth+Vuu+2IO9U+w6pB1w0L1/nlOoTASYmgd33fdVmsBEamfrUG50+Gfi9xE9KTxy/+7b//29XjJ47uTlb9v/hnf359t+m929xeT7unz549uby8BICuG0hJoz56/CjGSOgV3GY7nZ49vttO4xh3+7jZjkSOyC0Wq3G3VxCSxKySUIhiTKCREZDUqwYSRD05Wb14cfby5Ytx+yFOkbk3gUsECMSgeAxtloiQNClEiCTKZpcRAFAyWIEsHmuOS9cCZykJAAXQIQEqIKkh/RMlgKBqgOIJVOYcfZV8I9UI1RrxX5lhNbaZmtEuH1UtG8qsJxzdlZtrziWRakGvBGa/puZ2KGyfmbUVbQvniTEOw4BUZcfMcwiReyRkJFICYAQhUkJm3y2mAClpxMVEq8mdjsJ7t9nIT5uIu1ElEapKiEEm1Z3vBJ1zw4AdkgN0SKw1gKG2s2YfMhxwSyiCbeGHcP8oF9PBttDUOpjPFatzHormdoQCeFjFU5kNq/Pt5S9DhcyHclmq1yMZ7HztYHbvt7t2me42WKjpUWOrzn4pC16FeXLbffMjZkRt5BM8bO2hha4cNBs0D7SIj2xweUqOnozFcnxEt/XJ+Wt5WIlbPt76tUHdaTfQ9oFHtxx0sxlwarLw8XAWGACQgCrS+DHCYW3M/XcdTWg500i/hctYg1pZqL1Xm0jsunwfpPZfOOozrReVe5iUQgWDW1Wrhlavz/bBAy3XiCfL7VCiGOxdToEAsBbIq8yrXdgZyxxzaBcAmPyRF6fk5N65B/fi/qnMIiKiZiTNGlld7AUHrKESrjGONiYs35WLeiEUTdpMQFiQULGoLSY0GsrLvDiBsWToWOugosgr5ZA5NP2Ga85oXd1EDkFJBTShwUiIIjjBUAzPZTAOWFX24qiCuSlSirOLWU33AURAvs/1bEpKxJHdkDVIMsGW76ULly0K6jgbeWWRLolaCgQi5iIqOX6zrq8DEldDaUpViz0UcAERpZjlW+0AEQFmcL2s1B0oDzSfp2zSpwO9xTw5gFb3FwAA2Ew8VUMwwCEUboI1M41kVF0FQDR1BjRrHPnFCjU/4fAQbNzZAlCDbilblFSrfmsrDRAzMRWCmyuJmHOpVHSe5yj/x1afCxDAOzf0/cJ1nXPm7UJRAmQkcWzuFYxCRIwZuWKapooSyMwpmVEnpRQMSgXkIEmxiine+5RSKfEJiMhIjhgAxnFcLBaIaOnCWbchCiFQAWszv4F3HXsfY0zKgBJi3E+jEj5++uTD5eV+Gp3vdXCPnz2/3d5evH/fDx1zGqet63JcHjMidIRe1BmRi+4CBNEFAXuM+zSqw9v99nyxePHy5cUPP+/3AYDBhW656IYTciMQpeS3t/vtVn/66ZKlW6xW56ePaHcLm8spyYKpdwyLRY9EXacxpKQQpk511Q8AGnZ7VkBiBATnChMxeLTk2IOiy+n1zN5nW3uyScSEysxJJQPXAqlqSBJD6hwzYd91IgKSHCEqSooxSOccI+7Hses6ROycA0njNKUwMRGoOKZl1+k0AQCqpmliIGLuEeN26wCRGPvBOee4sygR5xyTV+KT80fY9wGQ4hRgT4whqiqenZ0y63Zz/fqHH9bLPqq8/vHbxdU6TWPvlp546Pr9dienJy+evTg/fxKDeDcg90/XToXfX96OIa1WyzGkjr3tWBIDgKQYJcQYI0IG4hAFRO2H7tnzJ5988hRQnHMgLqXE5C15tLUsZkVL1aD6GXPcJRaPHxGauzczp3KkkrGHZOs/T2ACBcSYEhQLUEwpMTH7bBnK1dzN6GA2yFlMKZtULeKrqtBqhs2KPgLiAI2pyqrVkwCFu87BTiVdOE6TqAhgXVw2m1bZw9ZylVTyjYjMJGLodVpXMZCqJkRHbL5RjwjkPLikwsor8WeRT3eT3qYY/TpoN8kWBFgMdDSKg/1mj32/XzIMkTxT5zykBFEbwErUZh/P+05GT4eyg7cbFN4TKG3WZusWFXfw/SNb3A+kHxtbLE45e/59ibqWXVEEVWEoO1+ryVjFzyZgQ1GhQClUSmgErwMKuS9cajWV5hdkeX++AAibvuBhk1TnQhN1kAGyJQ/Zak2YWedA1M5ylBIV296DB96Txefzrf5T5eNj22W+GEqiHZZt9WOvK32Zh9Qei9kNOAvBOQIDbFucZ5YaEV9r2AxiCRg4+PXo1dCsPnhII7K2tTLM0dMeGC6lIm0fkZP5xLJ80jTlQJU9erhF8hLOiFsmAD00TbYGZ/8kNFRUVDgAqLDvc66vK6L8vdfDcTfKSB2EhWDRjeY+wYEWa1yQj3xspex5uUYyxKNWJH5RYG2C+7UhGszC5T0RM7OYTByS/Ycw44RaXYJWVcmNIObcwaRECkqcSwaAgAISAgoarpBoSUKV7F+whBNQhahCaFERUKTBrEoBQqndbHqiADAeJe9Ds/jRasHm8y1czIE625Juu6nYQ4oeYZbj0pSqSaslg5cxFE2ZkR0sUSWElCxepcmcbbNoC//FGZsZi4ugQj/VgTfTZUsPePglvxorks/Bj/WvCe5YrA6oIJBQchMQDAdwNkpYEBpyWR6i9TEKACAW6WakUmeEAcX+3mMGhjSiqogzXaF5LSk7hefWlrgyKZGMUDQfu1JRet/FGFXQoVvwaj2crvvVwg0YDa4wKVo4GwEoK0SJOQGslBlCROdoH6T0IwE4i9UhgCix0lK7kVDBYhMR0yBSSjGw934c9zEmAB1DUAQg7FxnCmTujkgIYYoBPPfYhTBNACKyj2lU8OvFk08++f726vXdez0ZPvns1d3+5ptvv37y6DRMW8BIqH3fM+O03/nlwIxhCuAYFSmJaELYAURwS3EC3AktPty9xWF48vnn3R//Kd5tNUUdx65fuEQ9DsR8dTddvL2SiXx3+viRf3G2fnW+Gj+82V50mzFR2q+GfgPXj87O7q40Avih32+2y0Xv2anqFEPX9VElpNgiUhMyAlnfiT1JIuKuH0x9klyXDVGFmZ0IMpFzqhpSREgppZ47StANnaqGEDrfsacQQu+8qsYxoMB6WE7TJFGChmkcVWS5Wk7TBACSksX9kyEVEhCwQ3e7vfXeO+d61/d93/uOgJ3rfNez6yLqYnnardcfbm4QZblcv7u9Pn/yeEzTajkou3cXb96//WkxrHzXb2+vBud6B9PuVsLu/HS93e83m83Lly+fvTj/h6+/P3vyPEVl7/tuAQC3t5txf7W5SbpcjvsrBJn2e0aNYQy7W9ZAIOiQlFQUUIaenzw+OVkN2831enAkHMJ+6J1oAAVgQoklzk1FUSSJKBBKmi1ahgcJyew8rVEW1bKDiYuVPG/kIiKKkXEStMJ/HswhRo5Ik6q5iclwNB0AqOQwpErq7cK3Ey3rhoYht7sklHCmVKD6qkHUVEcT8S3rxi7Iz8e8KmOM3pda4CIGx4zkiEiRUEFEGMAhRQItlYYVNGAEAULvVEkdkoBjFR2VIyyiW6buceie7nR5LePVOCY6HdXvA3JMIAFJEBSEwi65vUxT5Ili1BiFSUFFQIFy1M09weRoz69n5DC3rex0SoBm/lcVyPUa7h2qikBW8EgFVZUggY0YIiabjoOqT/VDuz9CMXU9eHxMLpSck2jXzPufZmB62/FIayRYuaZSTyGYgzdjjgWCBBahYRsfm7m23pUNLoKqEVqYUSIi4kK39sDyorwEbPRBMBfQIQUlC4s9kiLm7isgU4NeOpO0SJMgMd87u7keHM/DLh/b3Y/+Hl1cxtPEFZuFeXJrUr7lQdf+5OTpJuaZGn7eNgMRLUOiSpj3u2AarliurVr90KM+GplhbWSrvlKpHY2lkEEuYX7/RblAeJG9saGiBFboD1GhQHzmrsMB0FYRo5xmoHDD4VVEzgnXiI5AQZIZSDjbQZGdAzHxxbBXKY8skipwqZVQCieqaqo4g4g1SM46xoqQVAGBkDVDlaAoUqlpBaRIBKqSEmJFU84DaaCEmmJLCmiWb0lMbGZsRIxoPlxFS6YBKBRZrMuEGUs4i/1F3UcArDNRUCxLKrhiBggCTYBoJKYSAUQ1mWsDiBSVwNCJg2arTA72tLdrTArA7Cp/xyTkWBGsAmyBBkUAKCs501O1liPNhfOooFJkiVPBUG+zoUJUVdg5m1StwAxo9RNEzehQAuZRzDPgjM5SdoiLUbzFp6B1VothWxWRa6C/aRRZ6DdiIGejb5ksqmr5asf8D0Cz7a0+FomImSFFqPaEZotJKVSeSCXrWgyrsSx/sgmWnMmHefCaQC1EAMlDVzlPDh606FYgstpjAJKrcAIgpAzkRAAEbLVvqWxIuUMW+cFulh6QEC28AGFOMzDnjy1miapgVaaUB78+Xz0+Gc467TSJiERIiQQIUAmipCjjbuqc05D20zaFiIiSAqEOQ7fbbTwjd8M4jhKDI6dJJCUiJQSyTJuUzLgIKTJoAlFNISgzk+MQAgF3rhv65XbcJAGPNMVEHYeU2Ps4BTWgZBEl3O12iOide/v+3enZOXR9CtPTzz6/2G+//fAzPl4++fx5pP37d697l2S87lBTigvnYrh79/PNyWKNIglH8iBOFIJEgTQ5TtxhkM327nozyN3Q7fjJFXbDY//k15//0//v/4vp7qx7ka4udXmyUJoUAf3NXmTSndDnv/vzU++/+vyT/fs3/7ANn/3m0YfvvlbSVy+/nLa3Jydn2ztUmYApCfTLFQDgOCqhNwJmCiEQgvfeMGimGBFJgYblql8skljSBfeLTlVjlBBGIgaIoIhZiSVEdMyd65lZohLRwg0EpKIMnFOUBDrXj9uRmQ3iXbwgYkrinCdASND3CwYc93vnvHPOuz4kHZZrIzxmRgVK6Nk59UyLYX3ilyvwfjeFmBDBp7Tv+/7y+kMk+OyLX4vAN9984xHH7S1M+7PFkuPmZH16c7sZx80YIjsXIr778P7py0+HxUpEuq7fb+9Yk6fxdJk2mzuNk5P9ePcDI4CmKUYAiXHL7PZTYAHFuB+3Tx+f/PO//N3Jqktp6zmO486ROI8x7ZWAAFOMAKBICioJkooiKKEmSSmpEgE6RAFhFSScRARSDtRWRUGCGtiZgbewYjSp7oKB5XNCjWbdEdUkrECKoDDFREzKqAohhd75GEK27gMD5CAWEUBkZmJmK3xoUhiK2i7vHEPRExBRJE7T1HWddy6EEZS6rlNFVUwmJhAZXEsN+ldVhVQIAZnROZ9aNQTFPJxEmFLAlHkgIhMQKiUQYEHj0VGAhRwn51LC5HpcLkkfa/9yck8ut3Qx3XyI0yashvWL28urNO14QCBIQSFA3ItsA2yUV76PECdwSMjgiKW4QnMkLeR9Nys5OOdUoGHMg4okRFTTdoABmYgASAooHSIJIGQh19IOLW02BxMwmMRMWhzDoECKaqCnWcgT1VxbuBWztHip7ZsFDLQaAlQJoT2jxcOBiGaJLkUPVFWR6+ZNCiWGK1eoNdGwUE42ayKiA1bVhKSShfQcOgikILlntkGQEygaESGoM8nQpB0EAkVTh0tAAc77pSqgApEDJyKKgMRZfFS0QLYcLW0bfKP8xCDMTDlDxmIuRFU8oaomPEA3ARBiazMgorQqYWMixhyRkiXXmhOPJc3G6IeZsawg61RKCXOAVmslRADAnPeYYRigVHTVJGgdqzBcggDA5OvkZmxRBRNuaz0Ei50DSSJCTCqSpQSyTA8xqDC73MQEEQUlIgPXISKaDdi22SvZeimaQRY7U6lEJSklSSJmhM1pUZl+VNX6Ayoi7BABDWfBYntVrT7DcbSbACJSNKRO0iwwqqqo01mBMHmmfmk+zqFBovqAYg1HFtw615UEaVYKj7RwVQUsyaCEpmiYQlKsGFrJQpukKABQBFYqpdGqVRjLE7BSVqW9oyB9RFSaiVOzSZkwG4eKAq9Fmy8R5IQuF1yHZGnTgKLKSIJq+MIxs4zcMxSqGkcxmDReKmh4TR5z4LxudA6YP7imMeLiIfOahygP8hw4VITsB+arXp8KzaEF1pufziwFjRkcEaMcEIOqAs0YW1JYFABYZTIoVHFEL3QPrzcbw5oY3DbFohh4FEBqDhoBALq8H9hztAyI5Sc95EzO92YdQOo4Y7EW1PhdAosGQ7znicMMHFhUTdskMrlwjhLK5Ek2wlgZugUI2W/WU2KvvneLZbfuqNOkaAmKWBRyVVKQBKigMcUQwjipCmqywU0p2NqJMcZpFBEGhQayAw+PomLNlFNP5pglc9qxIyKTp7z3qBBjFBF0TKohhDhOKSUVuN3tN5KefvZq/ezpP/zwD7TuX3356dTJ92++C7tNxwCSwERaVE2iCCROVYlAUKMEAGJV1AQyYWLQmBR3+5RouN5Dt1hKkPNXn548Ok/v3+1ur0+Gk+31FQ5LxG4cp9VqtXrydLFaP37yopcErusXZ7/787+Klxdyt+3Sbn/1HhIDyclqHeMEuo0SHHcAgCxMBIRISQlVset7VY2SmHy3GJxzCTTGOE0xxmDV0yKzOTa97wWFiBQARcF2EiIi8uQduxy/kY2nQMCeWGukuAUgJpSkIEAMxOSICRjFwkUSkwdFJu+9Z/aVXBmVkUgZkgqSAyI3+H51N43L1endZr9e9uv+7Nu3P44xbMf948ePv/nmu97xOI4eoe9cxximXZz8NG4sQtByPRaL4fXrH64u35+cnncnqjLd3Wzu7q4IBFTidh+7gLJjRwoS0p5ACMNuv7caXimN5+cnf/4XX/36q0+XC5/inWoCiKoCuRaXlXwxi53ZHQCyudVsImTbIgGRCjODyBzwq0DAROqElFlzXReLiCUACwuhBBAAmdApKGhSjWJKB4IIAXbswDkgEgDWzry12ciCzqwhAFakbN5lRUSKTUkVDf0W8Xgn1iJAllh/YaO3dnMsipwxhjbwA0CYXVubCREBiZkT5G2QNBuoVVEJoooDArA8aVJBZRJE4AV3j5lfJXq6x0ebgLcI19PVNg6CS79YT+N1TDtWIHICqEISQYLEKYVRfU/JkStwloWtzK6YnFYBaTZd5U7cz3Nr0sEKPwRTt7RkgBr0ojrIFX2oOloAslZAqGWWM/du/8JDh2Y0h8OT2VhzcKZ8RGQL8YRCpDgDBxWY9tKFVMYhY7nMIk1O1K7Fy+YU0pp8UuJR+XAfLzaq7LQ+4uJ1JE2dnDdBrSa4WeSwUA5q2nw8Dsd7RNkU2vFsPt93+Bw/7f756qhpu9kerUiAiM7xLDdagJzWnXNuZN3MzFotoAyQfjFR9UBbuacNtut3vqiOBmKNcy/yAxaz4sFLTRczdVAU65KxNxZtigxLINOGKqIJ3slgpbMMpdSWXJrnEaVddEadQVLWYYGSZvjGzNGaUTZBx5aueX6M+woCFhygWSQtd1kQ5DxGJrnawJSAcIQDWsmkXAX64rfBmhiQRcmZULKBuWwH9gKqoKh22/w3B38WleD+fJeXWbBT1kDKZGmpsoF5fCprVgFAA1UAs9plSH3MaMRktiRgZ+o0ViioTBiYbRLZ8mtPyGg95R8UxDQo3Z0bNp9pwgHrIABUk8hMuHZjAoWClARZuToeE5kHuA6qtu+lBpAYsraVL6+ooAAA5FRLkSQLbDXLxCFQQL2cuU18yYcWhMrcr4O7rG3Z1zSTVimVeMRuNJWqbUfn1YI2rNesebEdMKzquCMiapzX9efaUyx3FerPNrCsCODc8jKGOGta9gLMw9VTd7Jcna7WVrorNnG9hGrROtYpkWQYPhXWP4OoAwBAjDFGUQVFjTECcW2/iaRavIntSesFMQcQAFFI7BCImNHygEXEe5/FFEBCBoSEstvtEXEMEV04ff6YTpdX25t+0T35/EWQ+O7txbjZdB4ZIMZAnqEkJykcRqPlfd6kOlZ0yg6Ubu62p5v95dUdgn800KNnr159/uWfLt7f7Xd9P4S7qyVjt+Te6bNHZx27OI2Xl5dfPHvaO+9Wq+kD7Lc7733Y3XVd15+e7ne3IilG8d5jRN8PAJC00jlaKLIhNDMiMfm+s2QAFE2gzB6lTQNFIupcx+StRJvlkNiv5tcyP1g1UxHRrKlasHYV+2IiJEZmZAYGVIAcws7EDp0nb9YssoxlACbq1JMSkmf2TB6Zh2EpIs+fP9/st5NGEbm+vv7Vb36NiB8+vOvMLZlSSklA9/s9kgshmGs4Sez7ru+6777703a7Q9k5eBxCGHfbcbtdDv0wdHe3t6uhl2gVJlKagqIykrioMKnqYum//NWnv//97548Pd3trwGgFjLKa6HY4QBABUW0xLITgDKzgAKBKCoSg6pKQsAGJAcgIeZsAcmPzHIzAaqiEkYBAmAFJgqgDmESRQ0dMSows2OvxFFUAYiBhKxhRAQW6m3B/JiN1fYeYkAzY0uUlKBWeyxryqr0Wk+ZfQ0Bqh8KO9I6JnW3rbukeZW1HBkh2YLxCpee2ZImiQkQgCw1klTMVMxAyF3vl4/UP76Op1Na7Vl3OOykm9Qr9P3iHKa7dBdDnDpHOfgzpjBC2MVpUN+xZ8dMktI9Y5I0/WptUpbU0WIM5p+aD/PWXs5oPa/ZN9smfzZDh8dgRFUygMOf2qOy8SMJ774kWpuKVak4TAa9d3mOt2634PnhpaMPvuj+IQU27vgdpkkiASKZ3AWMQBYfYFukJrE4n2xOuNep2v62qeV8E6xVyjjcb/Y8d4c5gb9w1Dfef5rqnPrdUIJ541vxY76xXUd57eQU1VkPzMqhQ4CcSkn3Jrquu7rKDKgSc7FNzOrb3Da+r0Xalv7L3a+7vxQBqe4gJggYaAmgYIltV5r7ezhfc3uMYRZL+GxWMHZE+Y02R0pWdXwe5fbR96bqYKAbcEOt/LEyoHu61D2pK2vD0LCt0oaZHVBzVyNXYeNPeGBJzNvBvfP2/PxhDqWxBWmzXptX5dG5jzYAWdovZgALqVEVFQVUTFnsQyAERZLi1xXb5jMoBaKWZDU9Vo3at2O2v7YmoocWWMuJcv8PuWH9a+lK7VzX8dGSrT9vMU06DjxE1AdF1NtHHT6/tkrhgILneZ9zZOeTcPiQ5tfKmGxHOG7XA/T2wMAeb7ftOB8xRDtalLR6b25tQ721swgWK0n3R64h4Fl5Q8y+Go+86Banq/XJar1wA+xz/JvlTjCAKKhITJNJbTFOVsEXEZBURAu95SNnFlrsyj1SwabwSg44qPMyEWGOoiDHWAB/TMdQLZIZABBakmJSFEIh1d5tZbwL8uqLV1Pvvnv99d20Xa0H0Zhi6L0XSFhMUKpqiBt5iRMBEgMQK4IP5BW88oDQjRHQLW428eXTF+f92eKf//Xm4uLi6+/89m594sgFlf3J0Hu/DCFqCG/f/Pyv/+LPl4vOO/rm5kZFFovltLs7PX3agbz5YdqHCYCGoZ+mSXLpWWfTTUTsvXMuqfR9bwqP5TyICCI7AHFigV5QdEUbxq7rokhIUUT2sifAzvVUDhFDic1TY7iw5hmwSMCsiQGYs76WkfTkgSBh8t573xsZdl3nfYcIIuLZDdgTOXYLXiyAaBrj8uzkdnO3Wq2CpO12CiEsusXTp08vLi7GcaQOuq6bxnGaJuMAu92ulDAj0bheLMft5vbyQz/4cXt5o5PVlOgYOiZPKDF07BhxmiZVMcQI1eQ72o/bzrtPP/vkN7/98uR0MY67/X676NDyqcyLqoomnOjMfPRgsTAxgSZFxYhKVigkYys/wIKYKIlkoKzCc0QkKBBRQO0IE2IEmLKigY6AybF3oiopJgEiJuKZdZStVERqDow0scVEBow8A4a2S6yy1kIAKSUlkiMZCLPCkLQoRfVFNipaawUA1xvbQatjKCAYlbzDDK1DAgjoEZ1fDtKfiD+NfLLZd7ciWxpif5JwmaQnvx5Wj3f7bRyjF2RiTZKCyAgyYhohTBg7dA4F9Aha3nh/5j+zPI9wT0UByFFVD+zWhS033nkqG7TF1LWcvFp/sAXt+dheefSK+6LOEdtvjza3u5rD6oy3Jrm5C3V24KBVdY9uZ/8od7zZlQ6WQzPaB9tNPd80A6s7wvasXxiQtiX5w+G1+tDQtFu5QGq+zne112DThSxnPLDFY3tX+6Lmwyy1wkf6ZeNZdzciMjt2LKh3v3C0q7s92So5pZFl3rXAx+OxotU2siz549fZh0xUAKLChzc21H4sudVvtXlHXKV+KOwI0CDtD5bQ4RI9eLTFwecweqvdTfMSzbfYGcsXsPRLe36J9iuq0YEg9dDMIVaLKQBA1Mbv2QipM38oC+xgNI9nLqPdSzXLl1Dv4itQAFAEUSn1BRFM8CoGq3ZiLfjTYPQVFVXmxAIoETeQA/KQJEcRWsdRZqzarLKWZmiuFDsbsktOEWbEQUDEHGGcIwW1mLcxR7VhTopXLehDqqpqHgC+B5JluUDcBL0U7fRARaz8q2WvOg9eGW37qRRCf5AcZ8bVdPXo4jbiqxCpZLm/8TnOjG/2pTRkkFvUnp97X6/ELLVYxKDVITrw15s8NC9UaNuf97q5d5q1GkQoFR4q8s+swEAmjvwkFUWljv16sTxfn6yHhVdnlQcpcy8ASRIzsI/GqBJtvnLwpyZETEa3RS6xWxMoF2siNXArddfBcj0UKdY5J5IA1KrfmoXYcqkt5aDrOkw0hmBj1fnhdrvhvttDen19cX7+6uTJ6R6nH9+8TnFc9R4kjfutc46Zo8kxSkKpILsAoMVYmh8GFFQUosKIPmivwML96vx5nFKiATt88dlXf/FXf333/vLi4oJ6XsZhd71drk5XbtF73ifc3t4MXe+IUognyzUTpFuOMei03e13IuB9z4hk8ZQKjp1jBIAEidANy6XZ+21YQghjHFMQVUXOgg5RVWPy0EkC75z3iEwppTEGIrdYMBMzeSaHIFoylIzeqkNGYirWa2TyZAHVgABWudbqdeDQLZidiDhy6+Xad0NMUwjBO+956FxPfknDkJwfFVLSxbC6uboeThZrUvfeff7553/605+W6/PFYrG5uT0/P/femyvJe7/bjsNyYXUhCHG56C8uLgjTatHHca+Tkh9SjAQUJ9XoHdJiGHrfbabRYNRUNcQdSKBOnr16+qvffvr8xaMk+zHsvHe5jG2aBX5CzKVVyxZromyJd8hu8WyrsTS2HJB5LJPYnmLEr0iQRWcRVUQOqIQaEDumBBAtilZiB8yAvvINFVQCUpGUCoJCK+5DsQgkk+klWhU/mQP8ZtZsTCUDbTGpSkrmpjvEPUbEooTb9tZKXCJWhabsfYcV4meOVhmpQYcnBM6DikoAqOi4O53cYuqW0Z/tk7/SzbVw6NbSn044OFgNw6O0uBnDZCUMQBQjiP0LnALGAMnPKBPG6NBy86q/Kw9UgbyZ93oEwI9I/3RYQYhUoUbiAhxuIsUQiYgIdI8Qjl768K/VVtU+uVjcH1AG5qfd++lYej4UVVtT2iyvYQkEAoBinrv/WObj6FW7hSrUL2D+iwyAOcqDCEkz52gKZNUnzEL2YbOPO2t26Jz4dmwma3N/qwns6CF1o7T/2r3+6EPele5VGi73thJd7q1q3pIKLn77qI9OPWJF4j+QGyv1NkoUQMH6A4AmGLtE/iqoQpMXXUnxeDylQFDl22ezbMkMYbIQX0hzcL6UBjdCF1bdKaOPtYyi4CEBIhTZoHaHeK655UqTTRSog1CFvEapBDDPZqXXdl5VDrSTBymgJfSjnzIfb+JeAGp6aqvONiSiCqIPRrBhsUDX6XyYBdzzC+KDdoWHTQKoYlBTCbTmYlsqcPF+ihZ5EUtFboUMRoeVlz3QNp1dOapYQPMfHLQHjpaIqaD91DFsR/LeclWDCLjfZSwsvH2pIFCrBDYXW1I40kEjbUuoT2uXvVmrjziFqmo8rlxYLjie98KqHhyS423yQU5dpsMYLtf0JsRcJKW9BZtDZ8/JzBmxBC5DGeSDxXSwMZSQGyBVYaRl15+vzk6GdYfeoD9NEXHKSSWklEKI4xSnUeJUU72q8x0RE3NKqSoGWDazSgPtCLSD0MYFIalzToCMZLVRFZxzmoQsQTrSPob9NJESCEbAQAoLNzw5pZP+Jmwvri9v9tvF6TKEcbfbDn2PRPv93ns/bx4lDbt6fxFy0o0qCfaKS+X19k7BLbr1mqf0/mqz9osB6bNf/3p7ffk///f/3c+Xr7EXIkphpFG8GzbjJNPi6v2HR5+82Id4enq63e8cOiF3e7fd394wu867ERBQHp+db3Z73/uURCSFEFOKRMzM3nfTNE5TiDGogiMGS2nxmPEQZJaBsKSwC4LHDjGRbkFp6JcOnSk/qiqpoe3U1HvibCdmZkyC6BgdltxxsHQxFERi9swwDIthsWJmHRUcOeccdcQdu851PfleS1LcMCwlBBA9Pzln5p9++vk3vzsdhuHdz2+HYei8pwbdFWxbUl0sFylMt9dXnWeS4Bj6nofe34QRQCVq0phiBBAAEU2gEuMU0xR1Pyzws89f/fa3v37x8hFxGsctaBy6IcWck1bIz5ZJqeeTd6xcvUlAJSVFUgUDWJuZgCqImpDDpfo3A6Ka1JlH1Mz2AgBMEZEBJwCf4yRAAKYYldVLmlIkBYacKJ9CjDEm0bqIsLHQ1z24XTWVRbRrzXIDDerHZj/GqKqWK3K0QrWEBEhT7NOuZ59zG0Qk+9wsS9KX9MfSQkQ0GwUAaNTECcVAEEjBKXaCQ6Rl4PXo+C6Nt5HH5J1bK68jbgSnfnEu+61OO1WlpJAUAkJAjSATpqAp1dRKqNysHYHCJ4+NTZltHrFlxRJ+PJ/PzBag5GpmYxbhA7snIkpG0ZnbA1kT++heqYdfj/6256EJNXmYkeYItgOdrf6o7ZMPm10ph+hg9NpB+5gYU/eawzO16YZpW5NrD6IJZpqpNx6+otqJKtkfXnNsYG4/t5Rw/8ntT0cf2guq36z2FA8inx/Ql9r3UgMvDtnadWzgxkPd78GZhXsNe+CazMGojWU9OloPTw2QPlwsWGzXiIiiNea4pEQhQo4cSSqKeOQNOx6SspQOnC2Iprpo5hrUDGjxTBjyjwLUDPoHMigRs3ha1OgmbEdJDTUL87+y5vP1luwPmpOAAUiKoVs1Z/oAQI4abHMMTNnIOgfWWcyaJQrmMslHsrUCZHzfnEqQPQx5ZAFAcg1ha8OsTcKcAwAmTUtezgJQgW/sP6ozjKCaM08KSCSiWjFazI4U1Hm+YWYdZkexQr91obZc4PifysH5SgQ5SctGI4tYUGdT8Zh9IKLBYdhrQas2k9lTTXeDnNSQAT0rbeUxxLlKQ16xSAhtWseBAgAwb7H1IMop6zUQsc5jJvMWoR/mqcvznX0tUF5efipiesuIM+4tAkJdaQfhgPZ8Kly+ckzI9Y7NmmWXMWR6JyMig3i24DnJLAkRUfL+PHePnevALfrl2XK99D0mSaEAWRCSUgohhWiW2hQjiTKhIxQAiUlJAcAi9WOMMYSUzByZvecH21Vz0MFc5F9Jib0jFZWkFkEhyRngATOxY2abUWaWBNv9dtEtXN/FAU5envHzk3fTzdvN1Q7HbtFrGuO084h955PKlIALIoT1TtXi42ziCACRhJASOoAl+HPiR9SfJxrAd9dXH2gcTxfcufHZYvmb3//u4s03f/zD325218uuv93s02ZC6MYgz/7sz1bLBSNKTJokTtPg3KjY9wsM0ZFI2BMREyxWQ5RL9pZuhWKR/VFDnIhcmKYpJEBl8swMSshAngzDEVHMHmE0w84BkOG1913XdfukvF6fQhJmz1behXPeiIjYOs1R3V0TgmVKnQF0ICIiMRhwCpLz3bBYLFarleu7GKNB4Di/YBqAnTAJMXadR3LObTa3Tx6fv333c5BIRFdXVycnJ5553O263o3TznlSlBAjIDrvQhiTJO/9erW8vb609OI0TcTgEDtHpMDMRJxSGlMIYZzCTmRSlCltieFkOXz65dPf/u7Lly+fsYMp3IlGwpQkpBRNuwAAzIm/oGoQAkBAIkKAUqyOdY2LiCiISMxBaLYMgQhzMWaXkUIYIHt0QUsAuiqTqAYVVugUHeA+iU9JY2KkMYlKcJDtFJKCJKixOOY9tkeOMaJFMKEys/NUMogOjnkpETO5aMghgoBYsotzTkjumojEqKom2Qvo7BcSSSk5p6gikkQEhUQEOYkoowewXE9g8Ra2ZxuuiAQNBEpCqALKkhQSRvaj8l3A2wm2yY+pGyOJejecpng7hV3nl35YhTSJBCSQJBAoTZACxFHTAiWVvQKgODlr2sM8AuVoAn0R6+4w7wVFW9OcVWh+V3s4VeYtAAqWi6WW+HxkxxOEogM0YrA95gFxsVxwT6R78MDKQrU0KNuDrWAw5V2zIVfIrYaqANTXzZrKPBQHms9xL9q2maXEYJGQEFEsSB4ppxlWmQHANl5ExAb05WB2jl0W9SLb3Q7akKWsnI2hreJXb8fDMOCjx7bjcEQndWNtpVUAIJUhtTEAAQAASURBVIuPkKxiWeYlzqjjAoi5rGdRwxAQrExHBXSpL80JGoiIIFrTRcG4RDqI9YUCi3Lof1DVki1mw2TUKyCAR/guuYVwVCw5i4zQSLDQEGEOFNQHys8BoaZGEMlCCCrlOdGZPmf5SopntcozJQegbVQTl9zcb82FKonWOSvN+ojKc1gkuaWPhh0cUPzRB7NwsPNHizM7vw7NAJWNwD0StA/JwBkyS5mZkQ1NmxJvd0mrICrlmRBUTVXrwxIvg3pglijyr4kFNstacGaOuUzpWs2dKvakIh0eUeTRFODho2qbM8HpPCZV4J1n4UgByBycoHlqxY85YuoC0ObZKKGtSCJq11v+gIczddSFwy0zL/uiAFQGfX/cmg23SOeHiU1HLOYXOfw8ephjUQBKJBIRUVvs5iP2mDJKFt8uR5pzWdsIxT7RZtRYZufCdat+OVCnSSWC0VCtWAYiKcQUY0rJO3Zs3gmJKWpURAXwZkGMMRomzxHl3O/y0dccOilARAkAVQBArPg85xgh55wFxwOR9x4IpxgePXm8kXDy/Mw/O/36+qeLcOfO+rhLTkJMcbnoEXG72fLQrdfrcdyDKkAqy46lhMWCqGICAAVSYMVBaK3uDLrTq7s0hvSPf3r95ISXbuLhjvtpQP317393eXORxl2UuLvbuqUjWLy/vPn0v/qvfv2rL15//U+by8vx+sYRswIILIYVTFPYbfbb/bDoYwjXV7cpJUWwkmdEZIBuKQnApIpd19WBVVUUSlMSrEB1lYCTJpjSFGOk5aLvusWw8i6enZ1tbjbMbBEyOY48JVUdhsGyuisAaEpJYvJ9b3E4ksxU7Dw7Iur7BSIOw3D2+NFyuUxRU9wSuiTC5FzXA7IgJyQCAtPY2G9ut53zXdd//+7HlNLZ2RkA7Pf709PT/X5f6VlEuq7bbDai4ly/XC7fv3/f912Kk41GCCGEEGPkrifEKQkxRp1inJQSUgIMi+Xi2ctHv/7Npy9ennU97MctqTgGEAnjiCAikWypIkJSUQWBEjiOVua3GliQCwSnQJGTY4zR9EcCdEiKmmNdGCRlG0ZdqiabRsxpcElgQmUUNSapGgFjUpBJQB0zgYoAsW/XdbN+qWUvddX4UhUOD6PsTNCvP2HxEZn0nz1CFnSYFQYyG79dpqrmc5gj+qrnAVDQVCXBbI6RxvGoKpAkCCgrkXaoAqApqQBMkW7HcLOjUUjBg7ggvutP03i9H689DtStcHcrYWRSEtWkEEVH1F41Zg2lmGUI4EBoq2uh2e3nbeiYbWYYxzmzq1x8sDdpBnVsznyEFdu9vyzNHx3aHFAqOh8dBzkATV9SmvWHtoZS9RjAofU96fwcONiwHhCE4GHW/Z/UNckVMPOoYWOBawWJdt+EQ2pvCVLscY1B9j/xOOzLfL6Gm860ca9tbauSHCsw1qO8rGC+uH1vtXPWnn6s8e3t9urqOzy64Egczb8CAwJWaJrDMWibnS8vf2oHRWYMEkRMB8SQBU0bEgDQJonuY0clrSoEiUbVZGzEYX7c7GcxeZbJARRkG6MA1URAVMfOTOFgYKUW7nK4XCm7RLKvD0uSyswgyvLQylWhWN9rtCU2ARglEStHdQIAGvJ9riE2J+Jk7pO1rpkfQRaXtVioRUuqpKE4oGpKuQhL5WHWJBuLbKszH4Yl/maJ7gBtwNAi8gxQ9goRoKHbqipAIiIDcgGoxu8i7mcQohk6BsCqvZSRLINhhJUQQBW0wgCrgoqIL1n/IgKiRATkiEhiwhk6qxWXE4DNcpbsIRdknbdSc79KMg+IIKJkC2UOadeZsKmknOfu3c+qsc8ZF6VwBNvt8mWo2hTcMdI3XyQdFEdMIgpsChnW6tYlO6vdeLCuCsFSRSHTRiGyKJVky8Kz9jcWjlYTM3Uld7T4xOYc2ZmFsUXTZw9MVgDA4qkUQHS1PDk7Oe/JUVKHSEQhJgRlZlIAkXG3DeMOEdbLIYyjqqIKgljdBlRJgLtpstJR4zgyOu/9uA/DMIQ4AsBqtTLJg4imaWJmhzCOo42/977ruv1+b4JgDGNKKYkwczcsVCSE4HtmzwoQphBSDJLY08njU7fqVt3ijsKbdz/d0l49bsOOPSqpU9QYALEfvCJM01hGw9wn5lRLRndGBkwI5FGGxAvBs4QnARdvrjaD79ENm+3mmhPfvd/p1aenixefvvrP+b/4t//Lv5FpAoYxjtfvL0/Onvzuq6/+h//+/xnvbn2Y5O722XJARO89TOJ9L9O0WKwIBdGlmEghhUiAYNjZgJbxWXMAUggCYEOnqlECJGBiZxXEpskxD4vlfjcSO9U0jXHowfs+hLS52aSQDOOaiEyDIgUR2e/3jtl3zt4VQmDixWoxjRHJMWPOH0ZnFG8AoP1iicDTGC0LhJwjQvYLdt0kEkQxJicJCHvi09NTjWG62YYpphDHcUSI445QhcgNw7Ddbk9OTvbThA7HOE5p6vv+xYtnb968nqZ9j32M06TRe7/Z79kPwJREgCBp3O5vb7fXSmE/3i0W3aNnJ1988dmTZ+snT89EQxgTSIgxqKOOTVbHIiUzKKBjQpQwpbzXWlkQJnMIkIhikmQFPRhQRBwBdV1IKjLZWvbEmpQRRJQd5Y1bQbHYEYCSavFboYAmBQZOCM6TKAZJoGrESJTZORFoW3SJDRLUzjiTD8wFRGzYVWjp8oi1DiQQc0hREVznFUFBkckUBhPujW/PGoAqESWVEAIAeO8BYL/fM+fEmxijKhj+LBCmlAyGiKmE/agiovNOVTFBUk0pYNq7NDjGGBMqBZEoup9kux0BCLiHoNsghAO41X5/vfTDsFzdXd6QIiFqiNNe+/USFSWmFEGFkM1UbxuHha3WHKd6KOayP420l6EqD/BbIGt8aiKreV2yHyibQU0+eSDJUkuIqQWxmhWcy9bZXGjeNlCEVrirgh0cxkzXredI5isxAgoA5rFJTVBf3n10jtlotjCUZDa5bAYqW5UUesEDY119r1Jxr2R7Q4v4V0Y4I0DYrsnMIimlBESOWWEOVP+PHoiYJCf15gA6Zsibcg7Vu3/Lg2e01QzbmbBkccgyXz2f4RC0IOQDaNn0AaBG4asawKkioiYp2anV9EicszdNrrbBYyygF9pUriAlQci592Bg2qia64gYsruUd6paCj5IzlVDRAYtr5krUbQEQ/WN5UzBky0m1wQqObWTAEANSQwzVWQSMFknZRNVM8iaDcdQwxlmejNLuUmnXP1pIu7+hH10Fm0K5SB8Lfcjd9MQwep6tpYAlHppLdm1oV0F8RkaBnHsQNHGLts+pxhUHtDG5rY1T2jP53RSyabNLDWXSwwYviFfwhzpgQCWImxsKTuTcl9MEbUCfir5YnOXSSmHLubTQQAtQIrU/AXNRe5sNI7F5cpHPna0PW2HpT1ZNe/DATn4fHQvEWnmzVnjUVXIVo05esdAaPMTZtdaOajEwh8aio6OclKIspW8uXKOa0c86IiCyEcM8x87jsb2wc8PHlpUr0ohUHR8KqnPYAHbRQ3E+Q+WpPPK7k3XA+4cWTmhmMCrY9YoYYxd7xQwiVk91RET5H1FJIY4FpVJQaEYR2cUkRqy3NoOAcDyBKqCZVJItUeCgDihhqUiIjtHWaFF2wfQcU99QI1hf3F3pSsfvYucoCNy4pxTNDM+c+4pCeUGECqiKoq5W1AJCIE0ahPc5TrmU6HTvazvJh7HOA3TJABxur65AXkntFnq2NPqy1//Zrlc/uHf/827i+vLNz99+uLL//v/9f/27Mnztz9+1w3DdHW53W4ccZwmRPTs2Hfou6BRJCIqATN7gGRg6pXVIJOqmqXWgk+0hGSw8845Imc5VcMw2Lasqqzs2BNhCGG/203T5JyjonRjYVuWDGoQQ57zK0IIaFIIUNd1ve+cc6Q2YoiIjjvTE25vbxEJmYjIcYdERG5KaRLtF6vTZ89oOUwxTvu9AsTtjojMqbTf7wnc6foEAEzKHIbh9Pw8imz3O5mmbuiHfpimaRx3CoF5QHKbzSiqBDwOE3uXJIzTtN9vI4Rxugu6X5/0n3z67PHj85efPDs5HYimJJPxOiSQEJMKee8dp8QW6WhJdKQgaLSXZme7OgAhQElKkP1vOEtL2RSU8f5ArZwCIkZRIKrhmXm+IDGyYg4JEAQBigqC4J1XgKiJAZUoqx5YqXCmf8iCkVSRy07awpFCGNDw6sN9uhEoS2ASHDLnKglhk48IjbmUEJkZIBfTtNw8JwRsNk4QESRGxKQCoETIQEpJUwSJ7HJoWYoakoYkMUaJCZICdxp9wh6pU+qTOmLHnQeNFnTBQpBArQKDmJeYioRmgUdauJqUfUHbAayD0BqCD/c1bK7Nw183o5bftscBH847oEJBgPnY8Uu208Pj/jQd/p0lkHb/teCu/AseNe9A4Tnq+9Eryqvx+LAKFXPwD86e93vNVj3O1vtP6XJ7HM7a8Vwglpg9u70xk9VJv//ABz9/7BVVmoMyFq1qoYfCEjRiYduAuqCO/lZN435j9PAAABGVeULrLdga02sL7wtUVX44OHM4AILSVK6quCxgPr8SdDc/VVocqI8dKG0iQVUAFEBLPC4ioqU0Zytu7h8hoqQ0F23NYj0c2v5LzANWhR3NKJyFtPwCQhOOW7EJUUI8Gv3C+4puVzQ2uysBqGY/SUnBscl4QKKtzS26kU1CspBMranntv0UxAStATZ5UmG29Gv9XGT3TEiN6AyAYAjemU9AiXtG5BafByAb/isvwGwgqeL1jB5zb0W1imYNjDpMMMCZXgpIcF7SlQ/lcNwSp66l87ZRmfWg2EZQRJjcUYxLEdIPtkxVtcuwpIkccvxjBlG+5laVVZSa95gnpypy+d2Vsuf2tFng2p5n6w1UDdU2cgNpNTzHovsdvrYOdUKkggslAADkALF4lwCUoGxFxp4sHBmg4CPl4H7LtyFS8K5DJE3Agh6cAwyqIcWBe0VNU4oxEgB3HSpoCp2jMElKSSSi5sirJAFECEDUIDXIVnNVAKAIE9M0mW5gXq86XKqaUkopsbOYQgSBBOJcrgMw7faIGCRNcZo0CaQxjDf7u8kr0QCepCf01msLXWDKHAYVQUnZ4opyhrMiKQgici6koSkbQRSBBnQnIiebfXe3x90+jHE7xQDT/m5/jenS++lK9gPB6enp6aOnLz7/crtLf9z88Z//Z3/1X/83/9m/+zd/6p179vj0Jk3jh3eWvSBIzjnyXrtOJUrSlCQienKkhJZ4iqJcyJIJAVPUlEQQigWOkwozMzqRiEqOGQAM3YXZG0xojGmaQkoCgN73VcvyxIgYIYokVCUAJRQBAl4OnVHY+aO18947JyLjbrI6a0SEIDEmSCKszGQJE6DqXJeSKFA3LIaTlRDc3d3dbXcniwGJnHM9c9wFk6SHYWBm7/0Ug4iA5TYQ7qZxvVguT9YO4W57O4a9aJrCXkSQKAGmFG+3m2HodvstoqIXDJPr0tNn6/NHJ198+cl6vViuBsREKNOUoohzhKIxRULnvUdkRBYV0Ao1gUC5AqZq9X0jAIHaEkEnGFUUolnK6lZdwhVRBRkYFHNQBqvmijaiCiACDJQ470ZKQiS59AYnBUoSVFjFK6a864sWmUEQCYnQCUCMgW3cS/K95hLxUJlb9U8SkWXjY8P64HCTOhK2WhmxZl7OixcAiZKqqqUMKHtlQKIOEQv6BBBzFFNF2GrFSxyVCF3qmAMSoOnf2SIOgOA72HtQB7RQ6qP4jjs/rHS6ZbbyN4wAKFqSDyuy5MektxKBiYLoapLA0WXtITlXLWcCZNxyi/zP27IVUSpgK5TbTsfxM9kqCQBNZnBjrNGDM0cfHjwJBzsL2c5m+2wTh0vV9lI7eCQFEue8S/vTXAYPjqRFWGFFBz7UQwQVKgIlEECuxFRQqB543tHxETk7fy7kqgA5m06LMFbvtTB4auoGPCiKtqcz8TzUEmrkljqAAFAmG+Zhal6TPbfNGbnneWj9NhWHACDnz9yH79RS5ltVi/FBVdUq0okkI8HcEswyRg7pz68WLSErlRK0GE+rpenjkrtkaj2Q32oKTRYwar0AQ8zChyZALVukuKMAwN1/m/3WFhYpxAFgFdAfIFBBYphns9xiobz19fei2OEhTQtbpaachMNbylo6kAiPHmKNwAbjvL7axNec2apq2EwoSgil/peJSwfkkmuFqeQaYEpW6VD12I5Qhc55AFURLIWAkbIaBweaZRaIirj5QMr1wYAcv/Lgp5ZB1AVw1MKPnDyIRGzozATWmYJFzTL6C808FOjrAw+p8/6HpnkAD7+gxhE9YKKAe3T/0UOpxkQesQnL92hZth210mS+ShWLTd+0chs+yWpzKioPImLJPMKqBkPjB8jzTrnoesducB4ERYCZgamUl1fnHCNpkpCCcy4GJAILJwMApAyF6pwTBO+9JqgyRNmuFBHNhGzmRssqbnUAyx+I0QL8JKUECSKzYzL/bIwxpDjGcQzTLoXNfreXEU4HWRINAF6Bcm5ruxag0cKK2UDqAlfNhUyRGHNCNiJ5wMU+Lm62tJdujBzDNKXIMoEGTJPoeDvuHq/XP7+9Ik+/+t1fvHjx5fZO3Wr5T//04eLtz49O1qtFr6vFjfMS43IYxHuKwQLmPDuLok4pWhKLiJACWOFnVUVwzhmESwJlYiookI4d5Ii1kiSK6JzzphjY/hGCqjpi51zXdXUXdzSX+UwhVm9M53zf9xYUF0JIImGaJKZpipDEETuiabdXVatc69gREQKSkohMQYbl+tHjp8PZ2SZMEtMwDAAw7UcMIVICgP24FYmqOo4jAjASMk7TdLu5202jqgKToowx7ccdOPTgkyYF3Yzbvhv84JxH39HN3cY5Hhbu0ZOzTz59slr3ZyfLk5OlSJz2dwCpH8hgalNihll80QplU/VSJhVOYiAN5mPlGnlYKZMRQ/nKhALokIjArHECwgbAS2wu1wQHxSWiCBFYuoASKBuaqA+qRXxRSoKiHgE0IYnFuFbGYHOUY29KeImqEhg0EBoBmJ6s1VNxaJura2GyBZbX5uyakwILWEfJMkPmnzSXJhIAVWXvIOtCZCnCNYjFhhdQAUViihMB7WGlqioEqYQcEAMSIQ+CHsArdIJDQi/kfT+MYa9WhVdAAmpSFQExTAQGtaw2K41LgAZvWoN4y18qqBOFUSMylPr0dZCbHYHbWqrtXpZNfocpB1UhLMPcbAStrH9P77rP5z+2hbRBPqWRWM+3zyzXm36YZ7Pe8sAOnn+aU/7aBxYLFbb9bX9VVW3KI8As7eQIlfLTA5J97cURif7SQDR31S+1ifVE5W/tu9rb9dDZNTfjI3IFI7WOFIA5tRoPhS6YbXUMM9lobY91bj4DJXf4I0kCrVxUn3a/mbPo8tBAPfjYtuXtmXJnGc+sgSqARUdRTSjNzgPK0g8SHr20SCX2OKxT44r1lJoXPdBuMMFCsRRfyayvdMkq1ihUURixLmx7fpWE2oGoWAGajeOKjg9mqFK6bQyzMTiP41GsHhSX32w/OiTu0h+xXFWFZJzDhkQhWc1Ie7ZIBvfBrK3aQ4vuWFT84nTT+sCsWmRTxtxfBKh5KmbsJwsQB7L4fQQyHVRSabCZR4kUUpWeFMoKr4rN3NOSCWtTggkRXLssW/diO8stTk7G0MsKT9VGMqUCq0rrPpWPrdf863/qccwFLETqoN61aX1GrtK64AEAUFO7wNTWgY286ejU/goIWmcvbyD2xUTSg/VggD7JwgqqBI+mFxasNbWvCDT7XqqGUJijmQ2bJdpwYVWISbjnhV903KUQVbVbDEBoeY1EhM4xaMgsS0ASIzniMU6SrPh8DuUPmpxzCTVKIsxIIyZZ2iGlwqjldGoJP6gRemkSZEpRQ0iqljcCiAgpbscUJSWVpLIPeyBdnKy2K5VBxUlCABBnOZ0ZY4il6SlB3hUQURBbNQAUHSIY0gd6xV6gn1K3n7qQOqEujZNqkjQSThrGXbrx3O93gX2ihNSdPP/ixb/+L//LPuh/+Mc/nno+O1ntNnfMfHK6Src37LnrOkvyRCTvewKeLEgEZUqTGQXQrNOggOA8AQqwXzjnvRfQcRzTJOcnp/v9FEIwHcyGzoKCJJttJKXE7BHRkSd0JR4dVcxK7Bxj53qbiBijCGSvTEoQSg44ACmZ9M9I5LuUkoGPQhRyxEyIpEjD0C2XS/JuimFMsev7xWKR9ru73R5T2G/v/LqbpgkRYgzbnWgSQHKdDzLu91sAGJaLze4uaCDAECZ2jlARsevcKHukFCWATAvG1al//Oj0/Hz97MmjJ0/PnSPQEMM2xuic6weOITAgAmpMwNx53zlf8kYhqwFZULGCYNn8QWapgqwo1Bg2EYEkKEoqaqI5CWrGESYlIshqm2SoZsjV1lQVNCpBjcuGBLZdWhlHdMyqCikZFg+q9I6cI2CWsgtojvifJRsxhqARBZXYTEgpi65qccO2+qqwoqoISKApJWKuHI+ZoVmYrckQZvY+L5x6Y2sVrgNL4hy7OaBIs8gVpkndNHYhcgoqQpBIS3g5C3qAHrAX6lQ7IafcAXqVlEQgQBdFI2gUTQjiH5Rlj6U9lGrRt/lFRLDswUPVCJFVj4RRmi0+czJGYzRp/e2z4HtwvraxShr1633p35509MyanXGvrw/Li3aISHWxt8JxuT5vDA8+uZUIj87Xz8XLBGj1horAoSIlFsVIXOHAJ9GOxgN6xSxDF3mgjslRO20jhjLClTihofb7XThqwP3P/xHN40BnK2l5ClBiyKt4eHSLZlfg/Yc83Kr6wdaQMSMVc/ho8woT8tqdvX0UZtN8mdCCdQGIUAMi8vcqhti+aEm3CKAFcj1bTOa7EghYXAYCKBJyVR4AMoAHVIkle+QAAJDU6UOaGTw0Yaqaw/tQW00IciSPVAkZS5XflqpaQa2V8+4fVTp5sDGHS1dqeKWqtnqecb3sXnlgLWU5L+fRzoIilMIzoKqoOa8zM9x8JwLAQUHdo1HKR84YMQsLSgPg2hyFEmz6DnSwdohUs9AJWLTVo5SGY94HR76w9mgfW0fmY4c1W3Nsf15d9QkFh+94qR+2HA6m/6HjqLNFAP144+fYuOOhaK/8BTID4xyaw9XqAGszrwcMIoffUTtclVAtFYgKuA+apJwbcaAAFBjchnE0NCkiiM6z671nzOiuvusURUCTKjqkhJbXlUA5pRzuDzkjsKrE1nGaE+hRRFJU7w/sr01AP9TzdRJjjCSUYtSYLFVmmiYRcQgSIamIRkNKJMf9ejGt47QA4RTLCiJEAEb7ZNyZEKvyqQSGu45EQJhR7YwPKiGh6yL3CX2SPsEwRlZgQ82XNEXZjuMNTVt/try93T1+9hl1/fdvPzx9BH/+L/46Xt/EGJdnq3G3vbz4+cz1Zyen23FExK7rNEVBEiTyxEiokCQmjV4ZRRNkJqtgluGcvt91nes8Ijrn+j6uVieqdwDAzMyWi4kWVxNCUAQmHyl6YmCyKcBi5dVG3XKcq7oyZ8Rg88D0fW+kwYAEzIiaJMRp8D0CApBH9uyYmJAUKYmePjk/OT0fk9ze3iTvmHkfJk/kve87tx/vYozb7R0AdL2TqKoqkjrqnXPAxN6BSNhF2esw9CFNogQgQ9d3gz/BlWiUGE5Oh+fPH62WL549f3y6Hrxn7yilGMaUYiQREiShpAIEVIDzq6haV6WASkEqaQnPyh2oqjlGqntE55q4ioa7qqZPYkJgJGByCFOKBOoEBJSJKpib84yIoKAqSQk0w5o4AAcaCD2jKopiTIKSOiriVbPkTYtut7P8EyRmp4r3cwBaWOqWgRA5g2hquU3tIzbFB/JzCtDcHApCRLZ0SrBQbaSmROTzZaqAwEikMMYoIcQYJ0oJJRAJIzChY0IH1AF3IL1ql9Ar9grMrrcyYKhA4AmEZoHG4kV5FggO9n1tmR9kF/cxPyySA1e+3XywG0llnoWPbVsfEygP7EIPCXxH8kY9c/Siw9zFbCA7llWOr5csUbTSC8zbTCvw3N+sjhpQefvRJt507eDJAICoNTD9ft/z8x+SzZonN/2t3WzE1rYN80/48Gi3fTlseXPxvZUCAKiz+2t+lxFZK/LOg1g1gYPFpaoG6I33XmGC1oMD/stiUtOqvDzbaa2txaKi4WwYuzduVSXOYIxauUKdl1qpBdokclBEknJ7fohkCa3ozEWns/Q98xWSFVlsLfHl6rrC7SAixQKtcgz7g4dfjRbvhbIUvDAtg11/wIyCdEAK2e54b6wbRllXICKigjS6x9HcAGXIlzy+WYpUgBoIVMR067z5VzKhZD1ulhOz9bgiKaHmgnQVLBLFwN6pJXSxgUqIKMV1WClMcxHiLCBWjp/9Elxm84jBNYNjcGPZrZFH24QqOaI2gIMYrXtPsgU/j+1BUwmtvFBllPmmjJatqtqCWDUbwPycSqk1NOX+gmxvOToq09QjQb8i6+flNONZ1V/t5WXN5k1IRK2aIOfxT017CAyFvCa3IVhYmKpys4AFc0ILKZjvJleMbmSCogAQzPkStkaxc0OLDWKwL1oSdgFARMI0TSGAaghhmiZAy2ARMF0mJpORTBCpIpfFqpkHoLX0G9AN8xyRUo8kIIZFrGqmSo0pTNNEhlISI6iQsifwDA5x4dQnQau3oohAgEmVgBEQ2PbzOllkmOhWC42UwBC+CRMqIBAhcheJpwlDIFGv4EAIJBFhSuM03S2TrIbeO7ffjttdcoSbzRa5Ozl7PHSeg9zdXu8FSCFO06rvaL3W3dYhJcvaZEZQwgzUCAZ7UaCuHFl0LUqp+GucXUDZu67r7LyBAvXOK2tKSWKeJnLsvY8pMQVkZvKqSkQdz1NQV4GJv845kGwA9t6LiEXOOGZPnpGcJbDGhCKOuGfXOZ9rS4nu4uSc6/s+TBOp6xYL7gcRCbtdzYc0FS7GKCL/f8r+tEmWJckOxM5RNfeIyMy7vKXrdXV1ozEyM+CQ/MT//wMoXIYiQ8GAMgDYALpR1VX1trtlZribqSo/qJm7R+atHtDlSb68kR7utqod3Y6GhYhYS54nV0AEa6tlzsICqG6qerm7e3P/8PDmcqp6OuvD/fl3v/vt2zd3p7POKq1ey0RYJVtoSMBdYK0uoVOPqlQWBqy6hc3znKlN0aVLB/S28QdELg5GhBvcgRAE4A0RAmrGr28W5XAS7ln61yGUEEGgQD3cY1vTCbXdo8eADjUA4BII9wjoNJEFrfkSZuYUsLm7SBERLQiwJ8p3R/Ce5gtg5NjdKADNd9kLdDEo468vRGvORS6LLfF33JM5fCIizA0rIiKpR3mtAAYtT5hZUKdpEor5EmG5x2nR3JpZbW2JVl0bwpVUgWjRs+kZNgcLZXbXZlSdGO4u4UQvzuKbaWMkJ+Sx+RXDU4qfYwjA4XOS3KiKj59jWHeTcSXS7DiM0f04uT1iXjx8+6t1X/0maF/e9uIgu2UNAoYHgMmO+Co6dDvgXjyK/X0vQfywIjpGoMD+p8NhSjJ8XwYvBo2k97w8AtgYhwDEMXeunz6JlL4+RHGQ+jd/PcRf9V8ObYgBoLaD46jeH2s3vR7Pl7BhXFnU75gXsb890GHZwXbJV7P5+p/0AGCI2D0A3cmfGC/7NYDdzSCkvb8/NtlccDQ+3owKdnqiHeNt7Y8M++j8mDjGyGxjMX5sRmeSshkYsa+06M3ZG+HdPX8MLsAAwQP8j072sLEycOqGw3rnj8kc6AhbIiJTOCN3QI4+PWtSOGOUBTm0oA+QR6/lLjkb3eJ2IFU8NDj/kZEnrwAqPILJFDFAZvTNf9CM+y9dBdr3qqLTRIIesXOobjGX0omokWt/W7gxFICMg0IQ8NcKe58/SGYfxWiJDFbKGP0hlFn4deiCg1EBm+Z6lCYvkPHh2pZFYn0jJOCCUTXjVjc9zvX2iMPvxx5l2GdkcJkPD0UEIERG1/Y/bm3pJhy3ccIma9serCNDX3qpimwtOXwiUAIZmJ3xuZ3lYG8ut6UtIQFrG/o/9OU28mf7NMQSzR82fRdMvYKy4FA5xZl+kJeORQ6b7tbyMWW9mPNtU7e+j+HrenL+ztNcTpN6s4Z6khndViFhTnN4mLdaV2ttItybtxV9ZHZxuS+27erlAnafwNaY1lpG9h9aHgkgctoDDnoSlzfz1c3WtcxThK1wPwnvZ5+0nVnZGi2oVAhUVLzHQaRq8uKYDxcDQ7CbA1MRSOBNSrC0OK9tulYxV8QEB6xSDb5GXS+zfP/+zV2Unz9++vf/6//b5/O3f/PD93/9Q3X+9q9+4J/+9OHXz9/c3//uN799+ulnd5RSFne4kyECEdIsJZoE3YOdABSk+KAvWNynaTqfz1St1q7rUmtVFhHDiM9OJarWer0+mZu7FxRVLYPrXVXpMYlO0ynCsoZulj7Owm1jyUVEiOipTEjzRwgCXj09JkqepsmbwSPMwzygoJByOpVw1mpZpMmqU5zwd/cPn5b16fNHqtzd3//www+X82x1vT4tl8t9RNRal7XJfKJoRIiyLYsZGev9w8Nv//qH7755P816upTTWea5fPftu7U+nWcWhTK5OF2FkctMECrTVJyotgp6zdqkG9J5ykD1vtm3JYoOJb17T3OVOCVUGK0TSogkd6hEhOpUzejqCKU7Mn0LElAKBBoBCWyvOzj3upyXCIMjFgtzp8ikUynqUt2BWoOQkIiY0DW9lNWHLYYsvOQRra1mAcgWso+BHXPrSYIt9I64N4tJAIvOK9eBXSoAu6liswTJEfRERIxhNDO6u7JIGUYorK3qVCbQDBZBuipBQ6vW1hZWw6+Gq1vajgsUZWY7O2dwMimFYkE60MJakxpwCQ93r+aK061As8Ge3c9VpCEkJTRH/hOAToyxn9S3zxkCMwR7bfAOZY7H4ouLBwt9t0IfEj071fLx/leB4/nha+6gPtdZcJO79EzT1VGiHjwAAqvOobLsUaUJg1LjJAf8SwOJ8+asT/MuqYk6joeIHMrMkyrH0duf8IKkY/dXkBphpG5Ya9yAwxjefAV4iUO2E2cbzOPAbuP2ejAxFIbXT76BBLeRFnlCHP0A4Tuc+PoTANyi/71hAEYiqXS0BiAPvKz6lGT3XT9KuXQMBjt27NhIdw9S0xqYqaJOQyTKEzDpsrq9GcArFZRkBEQRsVc727xJxzePLw5ZsUeIj/v2vOk9HCgXfElDynBImXDYZPxQ85mRgY6d8wCCEaYXMUo1ZiGX2C3oQ9uWtAkIk9a3t9J6idQOqSOtPnQ3I0MkgR4DrgdQmLAETkQOpuOgZeIwN1J6Y2OztEm64NugsN3kVD9uE2alyIrU5kSat+10AmV4YVQ0FZiRWwlEWAaSUjqPSXiLoGcKivu2jLj5PQza8/U53BjeH2BjKYThhqc/R0wwhiNjN5WSLDNCBcTRvRuqe9JtxqFmHWXvzqOuIWFbecLwMaQ5byRCWlJqI0AFYREOQUAT4Q2+/6TCtSF0dOTfCAgHBRSC2gE7SI4aySjhAeRoUZLQRuneIH3C9p8DoMfuHyCCYW4GyCgqnMcn0j2ddwc2K5RHKuSOxpBDpriQdEjQRBguCANS36GI+KhtEfQkZhcRjyajCqMgjWQZd7xTQHfDUbiKigxy6/DDqeilnABnOOCGiCKqk9UmHrxWWCsUFwBeEDRbnx7Pp9nMHp+evNnpdModnSEoOQ7VTSZp1kCUeVrWVkqhFBVM83y9XrUUKqMxQ7cNtqwL6PNJr9cFcBUpIo5mUUzpynUNWxYybIIp/b6sb6frCYvUhoxvzyF2Z05/TtrBBJglNSZAIJjRYO4hJsVVo885i8Vc7WH1NyazsJwxZVpqe/oktb67v//+bo7nD49P13/3//h/6un9D//Dv3l+d//py/Xtm9q8TNPpb//1f3c/XdTicv/Ov3xO5cLgEiZqp7Oiii1rZhSf57OKrLE2MweKCIBmXljuLw8BPD49u7uophM5nQCJ3Vs0ANOkWi7rut7fXz58+HC+O7W2lklaq5PcR6DIJBBzD3NSipRUGyQNQwGAU9HubmiZsUoCqtOkGubW1pNOSoFCoQlLRIoUefvwRoCPn77UCD3dzSioKCy1tuvTlaI6T5+fPqvKuWiEn+fi3qZ5Xg3UIpwpaK0Z2vtv7i8nffu73/31b374/ttvTtOJysvDRdTnWS8nvbtc6nqtyyJAUaIHeRcvMDMPa3GdOOk8TapLrWToJA6jwj0s3MOLlq1+YqHknlWBu6cSRbJX+S2lAeY1mimhRYPSqhdJfm6YpK2dDhbL4FcGoWATF6hK9GA/QugR7tYCOYbRwqulcf/SqMbpdJ7gHyWqhExaqIjohQqqdbY6VVWKwL1FuBlgYQIFhFR3r6uZ2WmahJRuMwkKRaFKaxrMHLpodYRLhUFUyiTSLScZRGTmyHNWENZdQwg29/uHS/FiZt6qhes80W21WlGlUnmhgQyP1sLIqbQaj89Vly/t+Xm5CzlDKnUKcS2XVlZMZ9y9xfqxVoH7LOruGiaEtSczpYqUqXmIey9vb55mwKRWElLStxchFIYmHM80TgIIo2vKyjZ8uSICaj8nHUoFJPOd+7cEBHUc7huakc6z5xsWG3AKQDf+RzqlD7UIaDVtvpv1MMv3bCEcL2wlnZPomCBGAVDmaZwp0S07Hk4D5KhyHEzHQECgCTzcEZ5MaMhaDikg89ynSPeFlB4UFjAw48c03ewe/aBXAUlnOFzS7OI+iJUypHwza+Y55oA3r0BWNfIYKcXohuDYbEpA0jMMPQQ6ApOH5+RQ8aBbgDvNr4lIr5NjW62LDYR3xNjRVIRyU313pBPRmRqVnes2daPoSai9T6Kp+mX4iiNDLnKpMBFkBnUiYi9slcNIEO5hA36RWVoPlgCYHi7oeRU5iLYrFbaZ8rvaEhoJ/Sh7ZCsRHmkRj8xEFJLim4l5ZLzIJO42khgzcDFT54zc8wG2lkIIeEYh74MmMWqHpW2b3pnBCsly9DDyYHLe5nB7QSDSToY06BG7fwjuMEKT6HCwce1KWEQ4GkPd17509CsERDmbZDfSf61oRRIsjj2GTsjXNcJtUW869KEXEfEicLzv114w8qgbdVdaeNxAFpDUrt5kXI0wEw2OjYxhGE8mhHyy+w64uTcA6CSre1rJGP/donxowAiT7TunB1MBICQ6e6cAkFGmIOfzMLxdizDrhdDyD/vzu9+ilxEBNpN5QjhFGuT7twmhgMGs10J3D1EM4ov8mRumo+FUs2KM9VACj0H/sStySQ4/LC65yW+SlbG1cOhWkM4DuI2MHuz7rwLShl9YjtJ5f9ox4jCCiIYQP0D6g6gbQwhM5LB43eygw8FDQnry8K6j94SEEHAahbpyNFgrItjco0ZEKcXXdX16DOsiV0VM9gu3roBtFclUNtHp3rk+Sco0bbXY8o1uFuG97kUXWTSYoAcLNTdIRClxV+pFriesJwb0ULIYMWZvi188rmonnBUCMc2ZdYbTSRRJQhUNTs47w8U4O0WCuK6IL4j1/lQeTiXq45cPv/zn//XfPn769f13py8ffraf7t/99m9+890PrfkPv/3du3BZjasB0ppLdZIerftnSZGg6Hk6aaD5s4CTFm5bV1hE4NaW1YlC0XlKe5JOZUulYIBCBSlB5/39vbvPpYS5gM1cwHAnNROmMjRaRkGfUubDwovcwgyEeSmTlJO7RwuPKOQ8X9q6iEgRFRF6GMwyzmypMZ/LqZDKUgj15kavy9XdPz9+ni/85ddf/2//9/+r1VWoRXV1AzDNqqGUoOB0mjnpX//mm++/e/vm7eXd/cM0TVly4+48y8TzLKJuzTwqIyAhY94BT9JJM3F3VWasigZ9I3BMuTFKUkSnAQUAO3hct50VYUGCIQqQAsmYNITLTmIMENHLubgwIqgAVMMpkJBoKYojCLOAhyejgKPBM/Q/roEZalCUaebJbDUX9wiDtTpLy3zurNGjouRIp/G+y0QkLXb5+XakRljYCMUUKSQF5XJOMZfoXtmdDDjQ/mQBmRQZR9vzOJuosiUmBTxCjC6i0KAhEK2z+JMeTvdgRaa8tLou9blW+IQAi1ILyonlEvUMmYNnlxNRWl2UQQWjgiKlsOgRJwBBiW68gXMkcef5iMjY2A4bNmjAIWBLKRmfu8lJgBxUCnhpWb/FPV3upv1sF8QjqW+/PxcNBzQ4ntq3MvwvXjkBQUh0GvhEx8lpkKa9joYJRWmoNxHUx/AR9wAk/doZChnQUtCzPSPi9fkS2KMKGF3LyqTPQUVyBNaDGv4AJGK3B3dz8uarOf7sk/RVosUNIr4YG5LE1+/fpjwOkfcvTgQ5dHZjzEBXYYb5/TAaXUk7fOuIicfW06DR9+oIx3sikObV3gwA7rs5Hb2QwAHo3ng8Xj0tdYCUchB2w/34meG+jnCwh9gwHS5+sw6POO04dOPynsCQe4Qb2N7Kl/mOrQ4LJu1xL6amvIAvHDFncQRYva8ExEasVKTSLB2dBRAw2R/Ts1s3AM0RTxYvXVRIQNvZ94XRa4LehP6UozoxnBwxKv/FocD1YB6Eb/JyA0Pu2iuw9kAy3LrbetnaPnhx3Dzbbd0kk09InAgyhgreLQc+2ta9A5uL5yDIpMujF7Hvzi6pD97JiEg3NMtRhcg4Udl1sQzTSRhJHc67YWE+pPvQifRwbTYS7Dcex2SbUYylFInXD+K1z+/gBt4F0MuQD26LZ/s8f3+R3DP+hCGG4jgaN22+3YQ3jz38FZBXnZLDPtn6n9zJvaBJ/uxiqPMA7S/VtCemkOjZqy+GbQe7JGWoVduHGcO3CeQ0SkiwsMxlmrWoaLNwd7rTvdra1sW85XuWZYEbKFt5KQwIglF8OiJ06xeQoSYtmrgUSioAGb4yTVOiGTih2iJa6yGqQUYaP1oorFQviCWiFpe74g8nu6hNcHFuUdljRIc9KbfCKMpNJrV+rvLhCM67kkYQhLqU4OyYAiXAAKtViIFx0vK2nHT9+OGnP//6X/7T58fPIVGjaVseJpmmKV9ymlSrh7Uwi6FYTtPJl4myYLMkuYdbhAFd5xdoM/OUSORlvqvWVmuZrXtdrq21U5z62vMsl5bRJoRToB4oOgMyz2cbZ7mKIi3WBHUnMJgH+5lvnNERGXUl0m1uNnjgALTWJi1SJlUFJEgtRU8zBwGlI2FXSFEtWmZd/apr4cQ17E8//vjm+zdrW9Ma4N6KqmgArZTp3fv7v/7td9//1dtv3r+ZJp60kMoQVU7TNJ3LXNDsmnm9W0b3CP+ViDAHCTPLxkiZSzBzXZqFSIlDLcKR+plnNiw25oqUJ9ZlLEKEwQK6McyspUYYgMJzmUqIRWTJUvFucNe09iNzTugOMoQRJkHPSi8ZeUVExGoNEBXGNLk/1Dax1bquxZpHnItrIQFlmaQ4pZk3c0DAtK9GwMwiM4gSp6druZtCO0ZOr2Vsoi/N04lAthxfd3c3kb7HI90XgPaTjanDvgbEJGedwtfw1UylTCG06NxXFrGEXd2eVqvN4CJhBU4lilJLlAvsLnCOOFHmxT6fCdJbNIeKgpBmNsuwk+7UzF8H09nCwYC1S8Vjmw9G0BGIO46VF4gzTy4dmmNET9cbyK1TgGDYd4aDOoAepLxVevkXrhdHPzYD3LHV+VePrz7qNV4clpH9nAJiIO9Oi+TD9g+AEqPmJhjQHjlyeH5kYPOWeHjAEmkilJ7/3Rt7YFZ9fR2+uzP/3HSHG+jcOwgg9T2OqjjZiAN8SmOlR2TuPl59nTwoPGEdQeX9LwD36/aMrdHbvGOzDja7ntatjSPOqTOvD7LG6ErZzVBsltmI7an5PPPYguq30d4sOLklcxL3cHqPOFIXbu2SgdBwq5rehkils0EjwrxiAI5tITo2jto4zh1TlQ5uvUs5DUSWqbvZWscpuR2LvcX92WQAmsEm0YOZc39jWPiOJEfjZ+Yd7k05zm7nEz0s4tdb6PiniLBNIen7PABgJEId+xVASPoKxz9vH8WhfeJm7QZu78TNJYwuTQCk+tJdbESiTPcmQ/mPiD0ii0S8XNOHAb/5Z9doe25Yn+BtkR3BMXaJKUODfznaQ9vuzYzN3jbmaIMawIj1P47klvM0Bj8i4hC5O0byVY9kyOzD00gOHuWjA5EgHQHvCSsZDZmCSfSlvO0LQ15+iOPIvL5/++dYt6OpjHCGgN6jJHMZ9AjXVJU3bTN036hfcTIcr11ajQG62fABBlREVYuoIAQUJl+J11prXdxb1gGWUmxpx46MU1aihw3slb+2HefuZi0j0vNm0c4gtHVtFAM2c4nwDFlQRAHR3NaFHqHhlxL3pd3pdYoqcOW2ujfzWNoSNkH2QtT0eU4SoD4cHhmHT2HMHifj1FAiFIDDcBLR+eTk09Pjrz+vP//p84dfAXf4UpeH0/Tw9q0Wkny4u//88dOlJENKFXihbLgzguYRrWkzsxphDNs8MonAzDOEiVZbFgAhKSKTqGjXpgBkAdpjLsy6rgBKKSqqJ621UkVYpmk+OhVjED6ylG0lMBDeqclOpxMsMsQoE8IRbrVN06TjIHGSGXQ+zXo6k9o8LEzS8A64kMHF23Q3t1i+PD0mkdHzupRSHKDVJiw6X+7mb757//Du/K//9d+eL0q0iJhKmbUIpoyBEZEIa6221uhZD9BzcyZqjQhQu/tEJLcMVSTy/OtTv3kAtgOsU0bFcKrsf0JSQeS5RTL91xrRWhjAjMV0wMVoEaFFm4uISxKlDsOrjzj7JMbv/lHmySUiEhA3VHjQG6YoF+gssjCkxjPdqhuMSsI9YB3RUSPogNc1W+7eqQK29PqIyBrMOeMWQYu6PgG7vprhZFs9gXRub4sEh3PBzBDIggMiYmY5VOkkCRg5qcAjzJp5hWuoGAJuFKtWTVBDmsN6jnVza5nFwWlGu6DdQe4h98AZWmo18fV0CplEVNOHo6oHRsLtAPmLcm8T7OP+fvmOQeRYjGkDHl994ItTyYcEPwr7rx6veAV7cCuavvq5RJ+7xHAKumxY5QgSdqhIPZ4pLx/74sNxDtoG8bcdwK9i7g4ebk/UW3Tx33h9tTHZtf11B7UtvqZwbj9f9HW7LQaI3j88mO2OUjHxQAoL+Rdnsx83PQbkJv8+I4W6z9G73tMzOEeBp5etvX187DOZs9wd8v1Paa87dHS7k0d2ygOeHJHnNx15MQ4v2nIY4Z3fz/zFgO8zdbTdb39NETF+38Y+ivuuZB/1idE+Agh/yYn+4gW5mRHHtnbrcsZww2Xr5NAsj5mau/1v68wGatJ0YkcsjuNgJcLDHvYDhHSvqG8OqY50e3JGfpZ69rCivNwsaSd4AWG3Dva8rt0mLMrI4pGbMSA13a21I36rQyTpa0FeLoV8XJohR8ZqIEbpRebGf7lWbmTe/qszu5JBp0xki+5m6MoYO+MeCPbilkEOB5ZF94S8zoviyMjJ6bIO/bvtam9S9IFIu2ffSbcRYi+631s4xjxuQPxLvZxHJS0RMLZ8Vo4gq/xqjmrO746bt7rFPch0wIVuK0p7X8+UIDINoofwC0IinU1kV6w6FfDLefnKRPf+dpGacyJgoWjPWYnNAOZW3ZuIuKO1pu6lFDRlGjJGlGfKPXPb0FV+XXs9ppp582bWBCwsIaWUdV0BZ+zRV1lOSHXy1qBaSpmC6vB6RTVj9bPE/WRvpuXMpYRPYCFayMH4sQkjEUmDXF+AZFYmkoxizo7nHicFMBhicpkq5moXs5N5iWA5FaPE+rx8+fXp15/ax591WS7n008ffprOl/v3D2++fTufputSI3h//+Cffr67eyBjeV7cI23uZtaaea3eGswUKEXcQqCrufd6aj2628w80Na1zLOqWrgE5mnKbEotJ5LD4AXNJHiJWmsppZQQEXcDRFlUVdLSjyEib2wfaUpgHnxCJLVn2sW5G45IkbkUxogSoVSL1VppTZyW3kNR6gRg8cqluTcjKkOn8tOHX+sIrzczmQrgZst5mr/97s3f/f1vf/PDt5f70zSztcXNTtNpmiaa9jLy4m4W5hIIMjzMauqSLwABE5N1TjMZQsvSHxKUkWzV92aEiSgG1VWqaoPBytlj6AlAVDQ1jXCJyLwtZyZ0dUYFZQpN9wxkY2SMYqf3Avq5EyCQrK8ERRTCIDxoVJ9KREw6KVVAWx9Xax51Enq05g4p4BwiiEJYRBThOMScIoqi6PlpLQ2QTGElCrRmQoYyiy2kBCO8VRMEVdM+KexRIkOqJPtd+vSjlGJum9MAh7NS0cLdfYpoFghYhNEsJExQW1SHOxEsETnKohJaUE7QB+gb8D7kDqWs6yqxXE7T6TLLpFKknKeN9SUGWiWPECIFoW522u1UjYjbEyzvEJFC6jhNBJXbChlGLwCd+tDH2ZJvFIqHBcAeFZO+o5tXdHmPG+LL4y86wniGfe2lGZHkRlog24G6g0VglJDsuOI2omODzpt83l5NdhttJkyC3RCXLG295WSq1Nl+99xh3p8Uo5DiKwPcMbrhNXi4RX17Z4/IcnQ/bXBJ6MLjo7ipHN2n58Coztstkz2jAHmujgZthsj8fPt5e8U4H0AeT38SvaBYDGVpb9IIjQDjyA3og38mthhwCNKqf+hUT8wkPEa0CEeW9hbrcIvCo7PgyO3w9/eq6AHb7q19ETywLY9NwTnevH8rAT+2n131PKzzbVxvFIZ8MsndA7D15DjfMRb1WLXYjnaMEcpopmOJn82qTXK4uQ/w/Su6zjYcr0Hmy9UZr+5IsbKZ1aPvHhxv3md05IxHxKYAdG6GgwZ/3KgvnrA9JxefRGoUgRCBdeLLDnTZI04pgES0lNw3mtKhncdh7y08kGfFMK0f5MhXRiaiu8L7nMrhniEkXg7xUTYdt9CRXnP/3+4/wSs9ntzUuZst2n/nrm7nLspmcrDo3GRJ5TPlxapFSuRNC9+E1LZWt7kbN4xFsnl4vuYQAI5KbifkiBhhltKVvU4jAGQU2H7ovlokORpHl+LxGsfhIb8CoFOcRaSITqpI6k8Lelhr7l5EQ8Id3sy9CZCm+hiGf47Ls3Zv7M3L25KGBT1AedShUrW6bsdXpHrQWmSYU9aoTjYfDzOraFc2v9zJm1O7K3UmJqFCFJb5GNu6HbthM49zJHthRIvnbbvszqMcxaR4XBruqp+qncJLUCkRUf36pT1/lnXRukSt4e10Or379tt333yjkzxfr+Xx6cOnx9//1z/9D3M5zyez+thWbzV7l+AyqAgKVNQQDDSzBnhSQBSw86+RBLxZOYsDtZnDpCgCrbVpPuee2tRgkhCqapmnag0q3mopZZqmu7u7tTWL0MPBL/viBw9XFnertSq7hTgMMFct81ltuebdpRRPwoRSynQ6nc5eiqUDPQARJaiY9WR69/HPv7693C1tCWCaprmWBogWCxeR8+V0f395uL+8eXMP8WmSUs6ttaJT0VnnaVK6t2bLagulJ/t42EFSWfrtR/E+IZIuM9w9kzt9bMxNPuy72DzYwc1w1IT0cEMVePcyJzNYHrQqLf1cDifTC0CHmSeVk0e6aImEIUQLAtR+eGZiahasKFBRnUqZCBUpjuJUiIgUAcMj3Ks/NgsPhFVWk3KeiqpKxvxOwyK+M/AeTFoKDssLU+hpZoObYdTx6DkArJvwv9nCB7SRSdIYSo9HI5TIMFREWDgYoYIWYeFmDjZicaiWiLBmcV1bM4OGQkkzulFZJpQZegd9QLlHObcaIU2nON3JdC4ykUXn01SKiiZXiSCS+gBkHG2xx5+vTljpVpWuQO62f3TpLePcuzkx8UqMj9Onj87xIS9u3qU008UbvDlfXl7H725cybzB/TEmZ4i4ze86iCC/8tDbJjFzfXcZHllN8rhBXgxOMB1Qgdtx2H8e7j38+hVz24snv2jpX2g+v362jStX+9cetX/vRvQdoiGGwnNj4MNtSLkfqHWPT745/bFTfQPJRDm0kU0EdZ6ozSWwj8M2WjzgruNmTFg13riP/ItBHovzBuPd3PDKHsqDJv8Cw8Rt0Oy+woFRlO2FgXgj4ey4f8uGLS9mN3aVl/FqesdwWNLRBxo73Ee2x/sIjglwEclcacOevZm9ynClTCS6hX30GJkCfd6SCBLAkWwLwXSkkvlmH+nSpPSabSNZAFtYUY5g501PbZvjCSN1sj8lm5kaYYbEAHsa7j5VuRJyRzJDgXdU6hlUEO6EwFxiz3YFAd0XYs5FxvqPFfZyu0q2/8gWeggJzNwzAHDGgfU/v94p16NblgmmUS65aUHKZlbnLhO7X0gkImyLntr9TXlOZ7ZkJh/IvgRj81p0YhgP61n80YmwvA/DYbXuycnxemP0Re8j92WoNH0MQ+Ac7d+i/CEH7Z+9eraz57Rs16C5ym8gIkGDSDJHmJsg+az6qtixe/6X9ACHYU9vA1+kf90qljHUYyEFWjhNpRRRMbRm3ty8IlyVUFoNRGSQT20rb3MNN/IKeMAjooGaAcPZaLN1miYAZr14LQVJEG5mREqWqHXDFmAEmoe31Ro8WrR1os1F3pz47hxn5eScevLLHtexrQEmB4Nt9dE2N6hCRUk374WlFRCEOwWi4NRwarjUuLQ4gydS13pFvaJdi69n2hR+XZb6dL27u4Pw0+MX4pfipyc7n+Tny7P9m//Lv3H3db16bdpt7iYiMk2sJRU4uHmrz4+fHx8f37x7B0DTixW7QSjrLUREa206zXOZSFq4QyK5CnOtMDm8MJ+nMs/XtU7zvNZ2Ol9I6jRZNYCR3GjJzH0sDrgtuwiW/YhlD46BjztbawqaqplBqVrmy+X+3bvQyVjMayIhgqJazgXwyaf7h4fH6+Pnz59F5Hpd3UPK5CYefr7Mb9++PZ2nDO+53J/LPMGbyDRpKWUWFlX6Ur1Vs4qeCERQpEyMYATMEXCJEajTmck2kLTv8QMr2jD2u0eLXps3M+ScpGZKS6Z0oSfiJNx0WNb99cy5c7oNlswIBsM8/QA93idoGTieAWYKOhvBCFWqFlBFio6EVFcaNECRQp05ZWAn0Uqle6uMEPNAndhr6cgg+U7VQklFeBgiNP2i3bQC7ZhP3Jt7A9wsC/klgkTArHMydE683Ofp9pGunAJ00IUSHgYjBeZkeGfnpqoE1LxZW1WrxLU1GJ4NS2ur2R0MHbOHGzx9TygnTPfQO5QHzKeoPL09P1xw/83p9FCms04n0Uk0fQASEUZQNFQ5Aj1j0L4cjFZHa5Jww0wH+k7pxN7BcJRX6DNNQiPIlhn8jlupG/0/CURkQlE/1/y4p1LkZinC7QlH+Psadh9jsjleM6x9HK8+xDMhj+SXHvuUhcZhOI00bFM3kEQi0hCe/zk6AXofw9xUIDB8819B6rc8/f8t10v0P45EHszeO5yVPcgeuSt73HMPG8hU6b3XeUTfKg7k4DREZ8iJiBw3Dv1mDC0Y24B1spm4fX5fUt0Omx7KXE2IaMHBVOlDzh5hPhBB6XTq4bYDs/Ea6ytz/9ZxhWxoM9UJZrz+Qd/kRgq4YbzMQxhoyvb5TT/ZHrQ49AcmH1HuF99aCLhQzA30zMToOK3n2XUT4abXZIXbTjgQB01oa+u+IHaEerNKxkaKLfyGfb7HaMKsegxCm269OECxTS6M13mMdJ2vXscN2cfRD6DwoOv3A+agOeUn2i1MwMgi57A2RWS+t2wMPCSttrHaM4alN1gp6VYCe5kNIIbPUcYgRQb0imhGf3I0Zpv+7dXHNXH8/NjZm0nZr115AADIkdGIoXi533aVdLNF3fQ3uq62r7lXemoXvIedw01h/QsmhFQPsvTD9rStSyPq96VXdN8nZK/AgD6sr1fFTWNuO4shIo+/v2jni2vMn4ysocCwAOV+Gy0kXi3ZYwO25X1zRB39WkdxQCqpqiWHy6w1C7ciMpdyrVzrtdZlLqLKqzu8B4gfRNhNQdCIIJPzXgBH7ZVoO/+PdPtKRJg3ie5S2NiBihRFATzM6lqrmBcsJ9bLNL2d5TJxhkqEhMPNWg++6mIb0csTdi61HDo51ANSwCFgswQz2/hJccyOc/U7i3vDKaCEYFnQrmirrIvWVWwtiPM8N8Tz87I+h9os0xecr8/fxtKEUsyi1kpymrQusCwf64NwOwIera3X69OXTx/fvXs3koAZSOsgtOg3b9+xaK01IoooM/INIZOGsC9rh3Rwxvl0muf5ui6ny/m6LgCWZXleli0Doc9UUuZnhZ7t6NgGTjBNk9XWWlOdCotSwlu9NoQEvLUWWJxVyun88OZ8Pv/84bHMJxE9F4UWD5hZWwMSpZR/83/4H/5f/8v//OHTx2k6PT093T3cP6++WKPgfL57++793eWBUiCi86mUkizvp9NFwGVZl2Wpy7Kuz+u6CBoRgCcercsSEeiWfsA7W2Ac+M1wkGN9xQ7TaR6TERFWKaIsTP8FQgRFUvJQEXmmuregMzyTYTzEsmqEGMigF2GPITF3hrvRM5YVESBZIE5kvQpDEEIt4aRq5ih7YiyBIWpAUGQ6Q0gtYie35mVFreEGONuqFO1Gln7AKVlECEoEKRApFBunaf4gIcJcNRHqh4oB6cSLiOQdIuneqrUJ0ySTsIxMn36Z1Qi4o2tP24BnBsLa6AtZ6RUuiz+1sm4prYA0hzUPjFQrFciMcoFOKFO5m9/c33/7cLq/R7mf5kuZLlOZRUREg4Q72am2E6OTjJTnR2OZblnAZEDJjLmSUmaE5LuHh5wU4cGIcxStcYhv7H/IikH/YobrUfDePDB2WHY8d44C/KuHxdaAOPQxxoUxD/wK1Hn5HACUiGGpTInNneupG2eP35LEn1uIVG/EX+w7O/r6ClHPv3D9C33HGLTxkYdHunG2TEvcGjEzmWd80vdBjPanNI7I+ggvy7+SdNsjODBOTxzm68UIRwQTJnskeYyMGlavLwBAkmdwyKf+2Nvk4EGjFxEyKG2HCscNLL4ersPvowtZKylEslrA65G/Vd44GEJFho6Bvft04OUTRvs3HMuRsOoAyzY1sYdqxGEbENgspl0q7k8fCzJdvkEEjAEbkfEeVJ3QSWkSiO5cnHEY130zx3GgN10KKdWiyxVgr6qxj8Jgz7XoYdM++JWE6P40MIu9EoCOZ24GVKQ7IrLxeyjLRp9E5mggHL7XqCQlhuluKEFJhwoicy578GYyBsoGgqMFAM2jLfcvdyHCjd4o4OYRrqWAaQTp4+O39AsyKGGQGMY9EwTh3aVApap2++5wsKKHmXKElNxoUwA22rsYhSojyf0tQ+ET+udqyMYIgFEMIiFO94mnxTrhTqKoQ9GcG1/QQWIOxEDvSsI+NVv4gYgUDIv45nzvay+/0Mtc5AMBSGFERDu4WjZuluHtTcQ8OR0tpydPCxWRzQvK5B4d4h7o9oXkqchBy7S5mwOGu+KUXyzQ03RGyLq2qcFra3UFQoHW1uX5Cean0yms1lrnebJqT09Pp9NJRFprqhrhra2llGnS67XW2vMO5/ksgru7c2uNwKSsdfHGaZqAMG8AQli9rm1N47xXh4d4mLUW5jDTaPcqbx54pr+beVYtUQCRCFIp7oPLxQx09iK/zNh3ZuGtYU+KCCCj2AsQ4QKQPtiWdXK5ND9XnIE7a7o+XWEOawwr0VgXba2u108fP7rwWg3zHTBP999fLK4V54f333z/1//x3/3Pf//DDzYt7kuEBUzhQJymMp3OtTWzNmn57rvv3r99B1FbFoq4e7VWSpnmqVojmWH9absTUET1NLnoc1216N10joCFZ/TUWS+Py/X88Mbdpcxmdv/mXepUqpqJnrnsCZR5ttquz8v5fJ5P59We3tzfPz4++7p6RpVQrLbnugI4n6bT6WS1hdWpnJpbqMyXc4teZsvdixQz96erzBPUvzw+nR7O8/38xz/+MUGAiMzTOVwhGsbz+XT38F51yoBzaxROwrmksyhPASmira4r3YokQZYXUUZXA1prET5NEyT3YKhqN4eHzNO5uSV5ESPqsmwaqoAIc4tkNc3CBykNlZGcmq01RXiHj55hRtZtWgZ0Nr0UgEUkHf3S8xycFEMYMZEWcPeMeko3SRZjcZClkJpzFFSQbish1d3dGnAqlzKf4RcNV1tQV78+1/UZthZKnjOhpWRRuMwfYohwnmdHhHUS8VR3vJmINFtra9M0qaq7mbVpmlprGRGkqmTUupAspTDQ1hWI81mFrGs1WOZKqKojal1KKefzWVVqXadJw+gI1ZDwqAuikicRaR5ZDZrUgEBUtBgqyUBAiLlgUZxOp/nh3fzNw3w9z0/l4qfLVO6m6YxSmFIWGbnEoHgnaUhzQ2KJ7WB6hbxTS0iyl1TOwhMIx0buvMUFHXFaKXNK/kSKEFFl0LOQtw4Nc0v5C6e7b9bW7COBXm+t+8Z3qNoV9RcueFI3l8XxFRGqaZvnpsmz12CpHdRuUZHdg9GQZUmHNcrp7o1SMCiC3J1Z0wYI5CuQcXIqml5zdwfysBunYv+ukXTq6GwCbZdc73nW9p452PnueibbwTIuh7CWoaWQ7CE6vqH2cU3989zclkiC6X8e4LJjyujYa1MkmKnz20k96nb1YUuMKQRGPa/MdvCRUiMSw9R7sJ/u5tHokHNnaAn2gsAY6TWB7lIKdLbJPnrca8ISSpFDtcKBQHrRkkJSixyWLDrA3jQat/5pNk7Co+WUcINATNtxhjHaAFL7/8Zu8l2P6i53hnWb4DZxieswyOjHokDZJm/bgNuIxyuNs+/SQwsY2FzY6A+I29LW4r6Bnv1RqopBCdGXWsCTb/D22gDTpl1tciTiplDAtlsjYovV22447uWbTr3+qL+CAER7kfNtJsfMbasaGAkt6QFImAmyM/B4Zz88DuMGbV/IxGN3Xvx+7M5oCYCORhNb9PEJUvobRV/a6WMjHhmDGbdK89b3F63a13L/7i4EedvUr16bLrE/YXwjhh4/RNiLxmyqMDJ6iAw32xpzbPPNHB2A9XHlRODwVwKmoDFjBJAOkJHKQ3aLdYhIaKGje3S7aiavV+xxPI8jltJky34+KtP7ekA36gFIEBARIlQgVEspjOpIAv8G987if/BldfXscDiNZvSslRcT2lrCG3P3HsjnniID9Lo0AgFvUdsEeTPLt2e7R5uiXFRPIjB1KKQhlFmPsrM4diWNvVsY7p39rOonHwbe2yZLG+DQ6lP1qdrJbHLrWi/c1Zv6KrZEW2Ee5rXm6VAgJZxrjceGxyb/n//vf/l+vpfpIvr8/PxhJs/zvF6fxIM98ps9bBmeNphSSo/EPTCJEZhEyzSVKI4QkbW1WOvVl9XtdDrNkvksotM0RVQzzxNEOJ1mdVfVgims1w3NXCAkC5NIIy4P9xHhQlAflxVS4J2WVGVShdHhIQGrXkTWlsBr5jTnanm6Pt/fv318vn758kVKuXu4v5xPz96uAaX8+vPPT/UxtZr5dLZWXYQol/u78925TGfqSXQ25/Ni710Rhei252S46UAHEhAYiayRm52AiHT/71h8AFQKNvfssLyhx7sHA5TktczRDiWdnbg214MKSc76whoIMgo1CT0gKGn5dqNSghY+EiYtKT6lq539XMs4obRtGZxZXCi3kACdgz40vOMB0lnapEIFTRCME9aFQMDa9TmsteZTOVt4CMsE0ZIFJVIPkIyL9+Ejzogg2BZV4tEyBiDzdLZwPs9YhEDNEhaZh1NXUpo14bxtc8jNwSdSLDqk0SKEgkWMpucV8xpaQyIyY8etU6EyMlqxkKZxmiVOJz2/ffPmrny8TH4+Yz5dykV5apycnrDG91nucGRnn9tCYiK2aPXNLpMWEsXBMbvJ88ik7UNq01Fa7nKVBNB8N4R99UrJg8NxEIO5a2/eC0Qb+z+PJ8ixMUP2ft3ML6OQy5YVEOM4w+F0SGSVDx1n5FdYOF+8GmlODYnbE/zFOBwwHm8DUf93rv18Pz781WjcfiWlpYAuMQrPHrHBTgwBcKuo82r8X8GJm7EaxrqX37oNoxirccvcG+ZtwKzXkN1evX3hdoQ33N85ebMtL4aIB2yTsawxJnj7BDvO8f3mzRoegZ6+Hezuk9i21dbIsUC2f3ZoehjanUD26G127zwhWZa7m15fKwDZ1ejQf9+026CP++PQJj+4+zcFK0cnLc0+bLC6Dx8l4/APw5R5Wb6pSccN38utwbZt/HoQe4Z5GJEDuAcv9bfEnghL0rlFcYRI51vIY2FbgtFRRz5HxhbuZ9koAjZYpUBkoDsQGaWeMV6BUYmQ6JHm0avovShNDvTy71/jQt2u0TOiK5HISlybvOjnGZC1VwJdjCJASBaazGT63qZIu9RQv1NPyHZye+loTxZCCNl24xY8RnZMZX3hDrs+yVCKw7qY48HbExGd946vtl93gb3YYxKpMfdlIH3eSGSSLJI0PF/THanb+OcM9uDhHj4s3WEx/h6Bwboi6YoOBBSyay1MFZBDZLyYox5XukuqHvWbndz33QbJk+dDJE0IzR3WmlWPKFOxtQIhCm+Ee621tVYQzaootUhrLWPL0xaadYT7zz7EzRECDXOwF58kGe5ulkcwMns4GgJFCsjmq6oa2srml2n+9izf38mZ0BZnoUICMzLUu1tkSQ62WkVmozBL5vXzWvqEIkIEJdBrWEWvECc9sYOl+bTEaWnT0tQdMIeFmGlbaSts8bZaq2ZmzVDmohoUA1bDKlOdTv/hP//+3d99tzpQpgylVEZ4Q5iYwV0RTg22BOVayjxPuRqLiruv1khO0+QR0zQlcidZ3J18+/ZhaZVSRKS5ATidzmWeMobKHYaY2FNCJ9FPHz7eny+ny0OOxbqu67rW5pe7BwZqrU/PizvOp3m51lOZNLmmM1spxznczOYyAWJm8zRzKo5wt9baw2m+gKorAIRdn55rGDx++vOfqzQ9levzstQ2nS9c9NosdL48vC0zV+dqZizNpbYAZ8pJyzmjeNybYTWzhFvRg3M3SZ/mSc09PA6MVDgTlnnkmWMOOty9jQrrgcyxTVuXgBBlJ04AOtd7cJoiIrxF9NwtiJIBM1IlHCKIzjTEYARUAi2USjpdrEWaEcRh5plqlSZDBkSyzFVnrOlAET4VdOHjDJWQyaeJhDGIk5YZ3Q/IWJ7D6CwtvLY2QYJKdYWwl8vNrWa+mcxVgyill45xN8DdrXkboYZwtxESA/eYpgnhbt5qgNpdqSYGkFORQhGWfnqAbB4iVAE9dZjJ9LzKmyfcf/G75ybWItmSAgEKoEBmSzsmFS+zXi7T/d03D2c5n7VeZk6ns5xoU4QYRdJ/ArbEH7iFmBwhf2O2U8fAMKDcWGd6UC2Y7McYTuXj08Z6CpBbtNOG33qGQCIBRMiwqMp+1qUfuFP6cjMV3+oVB3tErxTJGz2Em+Mi38t+bpBID9h2G4bfuz8wWbX7X3d1qDB50nwElfQbOgHugbFqa9j4bceXxzOI5IiP2JkGD2foV+D7C8gR0d++44ptHgekfvWclFRp3uhLi0SEI41r0Wm4eDgROiz3YUDeUEdHUP25JJOLb3AnGjBqQGV2hA227gQv7sOtk5xRff4DsGgw5GmUb0gN1Fpn08K+qLLju4qbua89PxDsay23T+qtYX2+DrMxJh+gY6Os7IPtjE5RwB36A1nza6OYP2CMCNsAVJ8OOkG3kYeL/eQHhqtrKJi9Y/SvlOM9roavrY/XYDQAhFmS2jnC97a6R+u5SAMp9R7XDuC2DJ4eQ/QXArOVuza57VLsCs2t4j4YFV6s+zgkKQKd6f22s7mZufHVDH761PN2xTc/T6JP3dx7TLUhbf897yj3YETuxt3afXzvq31709Ptc+7AkYev33xyzHwdW3cTUoete7DE3FybVDkC9OEgu23k0SLSH5hOnRd1A/avkKmobCLA3XFQoF8KpNdPQB+8m9yV2OeXN+nEXxm62+UlqS4iHbPDPNKTBiHSQ8EBCAnxrnMD4GbP5lecAK/HsN86xiGGerlpXCCS+sUJyzj+NP0RAJZWpTV3N6+1rvW6RFtddHN3Zrhw9ACt5pSIdAUYIO7NTN2dGukKTxSSws69Sc7LMLZVN7TmRFVvglDEVPB2bm+mdl9wgcBRGIidaJfMsDPLojMCRjiil85Gr466JdjE5vFAntkWkADLjgbEODUvq5Vq4j3P39Wr+iqxwqu159ZW90Zkjag04yNKsTJbOX/6Yj9+fvrmXTuR58sFjx+X5VnDNBxhydi7RcV6xKwqpXhr7j5N3T5SSmGnWu+2OhEppUgpD2/fPtc1TZjX6zV1ABGZpmlZlnVtJE9lauicFd+8fTdNUxK5pjia51lV53muFpfz5fPzjypyvnvT/Mv7d+/ap49sPRacIYWioopMjU3WEAEZzjLN5TQ/LVdKKacZ5vBY1qel1YziWtv66fOv//j73z+t9X4q12YN5DSf7u4p9lzrdfW34DSfp9N9uCIKolAQUd291mVZn8NW8TYydnY6DRFVjaB2ST5snO4tQzii01b2K/1LAmSIvwgEwR4jFxLizEBNz+XTzeEjQndsZNlSz9MPMJMtkNypcIQQ7uxg2umA0IPDS0bPbD+QEIhkcraPqHWPOJUJgDvcERSqQBgiSRsqAs3yX6qYzzSPiLYsba0THFQIi1AZra5bHK2NvWowsgdA1lo3x51Zi4isoZYrsEdceIswwI9sOT1VYGwoVQ2OojHdh5B5RA0WjnPD+TO/+SLff1jvP6+ymECiVw/tuh0QDSTFWFi0zJeTzqVM81TOpUB1DvFU1lW1m7Cy1lDHPSP6PyVMFzMCSBp0KELqrSdQU/NHR/+5vgQHvJGDc0AXr4QtINSeSbmdpAeT/GtokdK8nyzHg/iYD4lN1N/i4PH74RROhWFoJtzN3Zs/J4+PYzLx/sVuBE5g/XUPwLGzNx25tUMfB23DfBhD8BpvHMy2OD4kbm/rp9jBm/G6ZfmMHbcCQw8Z8Ve3n284lUdNzLtpOHbDNLY3Hg/xw+TefBjjuzH4Hh35X4/n6d4f78FmWyj5hruO8/ViqHc0Nb7HbtUaJASHQYuIBP24mZRtBACkLTk70rl68lvxtTH+y9cN78tmuscwrg9buQM9zq6zAGX13w3G7SspGWkcwyBOMv2muaoUAD2cMPPOp8p9IwOEx8YaRNiOI3vm9xi7rs+Rh9HZOHyc0Ayy88PQZ7yaxzDH38A7bwZ0K9LWKRKd1i8iIwz3BR6+/flYMHlsjJzIbtcMYFjfOzqMsK7JjKUMbNbfg43Xk5dqNKYj5kzUPuLpAYjjBifFpgd3RJsAGhk5x2GQEEFEVjyzKQvDgDIqtb/mvdmGAGM7bQIxJzQb4C83Av7y9hiP28YOncVjy0NXMufiNijl8JzbBx+l2zZQW4OPMitFsMSIyxqDP6T9ZlHoaUavfKJEZEwpOYR/TtV4bwYLHMWojI4yddJBdTMSBjA4kw9HyL70dgsLSFr4sq5rmXWs5STvN6+tra211ABQWyIEEu6t1gWAWU1ADC3J2g66m5tXa2JmgjMzNyacEaqkQFVraxEWUpJvxdyDBmHMWGl+Enlz5+9O6z1dG7QUJn1QN7oGEJSNjVo6EWE3jWSZ+3EaQ5IdHpEnfQTTQJrGlAQu6MmTalHM1U3CgQi1WqxJVPE1sHisHivCNO3HrbkZAw3xxerPz8/fz+efPz01UX9e30zFw+t6vVPKmqvNI7pcFinTFMn9HxHNTbLSrcj2Ya43j92h//T5Uws/X+6n0wkxPV2b1fUaJtTn5+eION9dVAo8LEDLeB5hwEbCwNqczS2YBERv3r4nyWl+/8MP96fTly9PlJoeNhUtoirIQOTUHE6nk6m26jqVMp0Wt9pae15U5N3D/UVOa6vLsrRoTnfEm2/e/82/+ld//unPvz4+fvfDD1Hu9HQSjdau5qBO57s3l7v762pSXGfPMhNmtdpa7YrWFJXhZFav7FtPQFAyhqxQGNFC0H1zjpHaR7gwEKYZ9BMJ/dPynMbT5IwdojUjCpims42yeT/gM+2nH8lpUEgTnDvpISHRo73cKQ4JcYdJFtzNCsG0zYRChkCzRHdIZNg9aRZmPTBehaLi0YJEmTKehzLJqTLMaqM8ejyvcCK8tbnELGxtlUjdQZzu4S0wxdRa1Qw9CmMaIxgOpxt9S/UD3TLOOxetiJYioJgFMuC7aCQrBWMkWYUUdSBaRJhZIIqXy7N890F+80d7/8f18uuiVwOngDvYIpUWD7BCItA55+WkMss8n86zT4qICazp37iJ3APYWWN8M9OQqdZJJlcQ6ZHVRBIccvJWsLOrCqn5jGQA53ZCsBdFYscDIMhu7Q/vGj2HApBS9oWUTw1zA1jH83c7NTQHfFBibLu+C/oD/8/4fED/cW72+lTcjbj9zl7ct8OyAR/HbkozInHA7jFGuWTAIsR3axe3IIuBrA7XERp1xp2DxWoD0Mdt1Z/5tYsShz+9eheMcTy7u2VeciyxI4PtFB7RYgmUNwaVA6g7QIksB3nMyZTo05MQvw/H0GdGf7LAOjcFgFsqcDdLpSGIGSloI3Stz0+vx5NW+pcG192DsX/MERyQOk/OjA8YGVvbhnEs4wwdSJqTTnZyuPkGTL1UeOjgnky83bxpVjFC3YZuvOFhlptNcqtCbd/eumo5F4ewp0i2ae9u2Z4tFiOKhsk/2jsQh9XWY+9exdarSiLoDbUn7A6J48UesBmZTPPiIbhd1jeoa6RK3C7Tg1aHjYcoMEK8NzQTMTgKjhH8ERjVo0YDumm5F5HdsfTL9nTEszfkpXK/vWXbDRlKsv0xhk3l8PUh1LZYtKHJkHy1Z7e35IC+jCbs45bPPQL0Gy05iVqJ7pYLHnJwN9FmCFHpgo3JtHJT8WOfhVuj+qaa4muIf5w+2WXmqB5H7+VKuNmBnfuzO4qjM9ZTRKSHUUXEIJfIyso5bZ3noO+C7WwYr+M2prfXvpVvwwfZhUS06lVqQ5OYgjCz8CikR7TWzJpZNbNorQZBuPu6rrXWTMSsdXH3bn/JjHZ6RJjV1to0TT0XwTvhWlcgDwHazay1Jgqo8KSu5neTfHfn99qmiGKlqDi6WyhT04gARUWij5GEWLhEBEMinIfAx737iC6U9y3N7XQSDS8exb2Y091hRjO0Be0Kv7pdW1vca4QLHOHRLFo1a97qh8enf/711//+m/NTXV2m1lCtSUQi2h4FFACYdamyqGpQ3bN0JM0sazKLiPW6H/3KTN+WEUJm69ou9a61tq4LqFI0As9PT/f393fzqVWv5vRotX748OHh4eE0XzCsgOu6ttYceD9PH379dH5zf3//ZlmW77///sff/96sTZ7VmaQgyWLcw1XkNM06ldPptESEhYgY4vzmQS2+tFbXxewsCm+11XWNBbO21srp/N33v3msy8fr8+pxmoohVLVMJ0M0D2ph1nQQJVSEQnOwTNpU7FCSRpLl77jyx4E5KkkfAOKwTx9CurMmZUhWLUt23bSFMLTnAstxwWxbxn0XtrcH6naOqIgM8dTjsBXRKlrmSDncIRnFuREZEMzSxaKkumiAIapwwOAo9CKuQu+pdAHOFiQnzlDYzOBp0vnU6mJ1faptbW3WzjutI3syEHSnV2trTa3A9w2iyfh7gGUboBlsHkyZT3KcWn1NArDwWisZakoFs1ZbiMipysMXefeLv/+np+kP1/Jh1aXXmloDDRCBBiNCIY2pITOoAoUUZZnIiFCL7pvc8MQRYXPA2RewOwihZEgmAFKGPHxxJu2xyxgJhOgKGrdlcHjXtja4ocl9zfSx3WTOoUl092PVoIMa8DWtYQMVr0xh++skRg7vwUJ0PFKz74MYdEdft/ckXLuB4JFZpFnpoods+l+C+7zBiC/DKm7PnZujfDvQbwHofqXPuceX41XLX5vhUxlLHvWjH74rAHuW2piGvRfjzpe49LZVey9iTPEGJDwiebfM3RNWp5lJOo3MNhSJSiX2TbeN5GFMbi5yMOpsVsJDZt8Rgr78Vof+2GL9JW0eGbkEw/7qr0zZtunGCO9ty1j/8aKdzZJfm0oAhYOp9IUYPS6sfVlwNCVVXHck586+WHss2thxnQdXIiu1y/ZJ5ocMfa2/BhhV1vbR6uMZ1mPs9zG1FoAfFhD6GwFskZz75OUo2BF/H0di6G8Re88HT2AMcq6sABDbYs0RyUgN2bXbm4Huqk5W2721NwBQ3kRhba1Nr3jwZjPHLW1o/xMJIFkjvcuTUdtgbNf8Sk8YDVHVaEbZK/kxSzVxe0ufae6W7IOF/uCmiOgpXqn6+SHNdO9U7rXou9RfGvf3ATn6XvK9GyfXi710K+BeDOAeV0OS1H0n5IDKYVX0ihaHeSERImmzF40Iwkj2skKHqjFDmxjyi5RIaraD4rH98heulIvbQ1prK9tqbZWmLon4CReitbW11cyERIZRIyBSrYV5a6vqyb3j0gQKgJMQBMNTiW1rJToIi2SvNDGzLFnv7ubebLVoRU86T7jXaUZ9O7d7XS5sEloIt7S7uqgRNQM8o0f/S2zkGXT3XqBply/7xuPI7SF7ovzYtQQEIQ5xSJc0STlRr1GXaIv5ar6aPzevHk0h1rzxWqdntCXMFm/XZihzs+vnL89vy7wuXlpTeF2vsVy1NTZDp52Gq6hqqz2vupRiCBWR8rJ2IwYmU7JMuiyLffnsdW2BZlZKISbVCe5zmSYtnz78/Pj4WMrc1mq1rdelLs3cpUyqOs+n0+lMKa36fL6Iqug0zTTH45fnyULddRB7ReZuhEewlALSzFoWfQOaWZl4d3+Bt8df27quAUtqoDdv3vzhlx//t//471fFNdb7929/d5r+8fd/mN7w+XqVclblstbrUs3hwXk6z9O5zFOZCJiwlIppVl6FkY5J2zy0pPQUqA5csC19FYV3KthJISIqRShz6WdBEvmLZEm45AgePvSDbrzX6o7woDCtSxEZedppTPqqi6GQ67494SIOItJlSnfCojkAQ9J8QcACaoikwuWiNUgqaOoRbETGy9hUSvYvGOA5yaOFPhfTk54e7qKu69Pj9fGRtUIizK2Zh4d33dLTYWLWNq3gqACQmVlFiTAkwVcppZtMs4hHxlRSRVi9J99l1F+rNbMLNLIuBSgKPVe5+9Du/rjO//hJ/1ynR1xcT0K6NXAl5+6DyeB4odMNlnQuLbxZiBChEE2/n4jIsOj2g2SHhSRxQ1Bze/W6NON8+ep1xNBHqZ6x3kcAOqK/gZH0OayeHAcUPLKFPUSNyU10+64ht4FbhCBDnu+fp6qJYc8aUcqbQ2Bbvf0MvbGfNQz8cFQAtpGIjef+FZRkNy0rRqbZlqmI0erxu+xgMXNLfSi75CgadRP8ExED1GK0J/AqsPar6Jbd9DaObAEi0KMYYmzPoV3w5mkH5MMXH/Jwm0emmvRA7u3nCBHs05LqtIj4RtYTEUi1XTEIMXAw2KEHzGzeACT8GLmQOcNfs54iujO8/yvtxdtoYExKPnPctP0hNWCVLXVqH8xXY47bFdIdBQfWpuMT0iTd8fbBQBwHFSsrnnSVwqNTSu6H9e2x16lKo6frxeHFjIgEEUOvipTMago9cgf1jOxoWydHZVBGOA3B9M65QqHJzAJvnUUxbfLp8PCIjTTz2M4jcMRYSR2IyWEpBykYFJYjgagHIEo2bGkNwbEGe0SRkGZWKElmOWJbkdaszTbR05hCtkQFbJuEyEAq7ivi6EDYTAP7Ihg7JBNes8Rs9mvnKvF9V0R3Qo19lV/fuNi2HbJJPVCyJvz2Rs06a9Gnvo0dJkEw51QQ3VwqZK9L0/2fY8q7+TxXnlsww8G7+CFA4W2Ob/qNZNOQPTbqnE3SqZRuaB4dzFA0gp3yd1u0PczdN1ByXN4ks7HdFhgUaEgP1u/Z+GSigADWbko6Tkou7EzE2WOB8grJpAFJ17CPanjMWJhcFx6QJCSLGubeIpxh0SpabakACNZWW2v0UIeCLaK5M8Jq88FjGxFhxrCIwkwrYjqYM5fUbF1YJtFpc1iJh3sTSGstnE6vDDsJH0767rLMFnfid9N6QlWPgiLigww1mPE/aZENfaX7DSPgHrc9jlECMHigB2sLephbCs8cXO21fCLSU2RhvhZ7lnbVtoSv7u4Z4sCwoK0NV8MCOHVWvT/H2zfXX68///rxNz+8kSvNmzSrz1dcn2lVHfSgh/tWwdTcXVWlKFujSBFd6pplpugSYXCniipLEYikOBKyIGnzHK2KKFpFeKvr518/fPny5c3Du1TMIqxQJEEv1QPmnM7z1fF3//q/+/Of//zx8ek0zR8/fr67e/DlqiMd3RNtaO49cUStjeRqbpF0mf786TPfhNtqbXGaiCidiE+fP//69IXn89tv3z7++M/X5+v7t988Pa2U8rwurZUylVrXul5JqqpOk5RCmZGxLkCibBGBs1fxGoVn2WdWuxkoALgEwkOLeEdryGCqHOesRpfYMYPBQQokuZzSNZgDm67aUfhmBHAG0rk6CAfDRbpt0uFEay36gdW3mwDhXlTp7lALhAIwCW2BeZq8k7h5EAIHTTIxQCimVVt4pDHdIqSMEHYpIiJSJi0qcLvKnVz4TmHr0+N0/hx1nRTXL599uVozCOhhREPmPCe3OUQkGLDdvLpvariHSYJ470jGW5MQ0axaBmvVIkkww8HV3KEuUlwJhRbXt7V8/0m+/7E9/PMy/XjFF4qp6JTfN3CSaYqaCVzh7ACUEXANL1GLodkkqqKiogViyswByPTdXqwt4GQBXKnEIADtAtAZAliihSFZN6g0SCOGGdXZS2caYpfbx8NRhnXMk90Og2jDR6wyKZH5JMzDp59HCg9V3QzMW+YB2UneNlC2f86R+Hl0RHPEySYmi9FRulKcPQKenaKB6Pkt/bTbtBsS5r3728O3k/TV5Ye41q9fR1wkt7cdkKLjkJMQEcPECwDsbvCthdwkeYKP7YEkIwwS7Dm1e8O3J0iyxWAjLzJSg85g8oAAGZt/A363Xkj/MiLapgNsb+mW6KxOgrSLR3UbOCkVzn4ou7XNOLd3Z4AVyXXVWzTwRMpgCvPEQu/P1wzryNq7hIHaV0snNNlT4F5G5HtaSDflyofcwjASMuFzr6/Wg5h6K3MZFBEHj+7EiKCE+8bJnqC1ZwyWpOzMUzdGLVdEj9nstwHoJ3MkEzwi4wdw/C+bauYARAUQh8Hdd/LdTMYq7LFxfelGQnpkJpdJkiwyeoUcz2TuNARGKgBBMIS0DNjfsWP3dcRWShqAdqoABGgJBEfmUsJ0shdOjICn8WOD/NSttC2QZPyGQFElHJ7xZ9qVqHC36GoiPbwnBcNikgmj7B+RoeUv6I1vpMywLu8bgFARiJToJuZhb+uQ0jGsEdkvRzBMR/bh9vCIaK29tsj0mkeixFAfoLmX4SCkUECxPvvoSkxRA80dAVITwrWk1UtlULjL6CQxjvRjUjJ+Ha01V5oMa0yWwiQ03CbRCEseKVFG9/NGML316fPtvZNd100o6SI5aBDodoCQKqNJrTUMz0xSP2ZcS0aiwT0DghDIQBXN5Noh9vs7u/LRKyUD0v8LUIq7ExKZGePILEd3T3oceqqCWwBMVL+29QmctXm9PjWvVHVl8yDVr1d4mxxf6lKB03TOcGYlBc4wJbRM3qxZY04joQhrVYlJBeJmNQhO4uGtrt5aBNzWprSJfiLvz+2bs7+Zn0+tzoACM2dV72EBYIYXkz7yUAHJoFgkaWkE4ZZlZt28p3ISCIvkiBQIGtcIoqkCKAyi0gBXuWizyZbia7QaIDgBK8Xoz9KeprZyacuytAqI9swWPZW77/T0vfOeHj89fviHx8u/ub//+ecfP/jjg1xnMtama2NbJm9RWdcGnefzRXTxMEWU0xQRzVtRihJhgqjrKoXCmIu05tWqkO5NdL57uG9tXdcrAC2qAsBtfbo/l/Xps6+L1Xo5ndyqqr65v6u1RiEMQDmd71Hjs9Uy313efefz5d0Pf3P9/X9tzWZR8QgUR72/e6i1LsuzzLNHqBZRNUqjX6bp8frlN7/5zTRPFF9t0VWWjz/en6dYr3VpUZsUCeEff/31Q6sXs8/Vfvnpg1R8e//+w+Py5u5eCVuu33z//tv37xB2//bN3cNbKQopoQXmdeX63NbFCkAVYTEDJNJFZm0tZSKZWSvu7h4iWkTNnEyyqBBKMv0fvAddHRyWxmGoGiKwR4kBgI9EWE9vqjvMbCrFwt1DIkQzCzeSBL2IRESGU+cXEW7NtZshI9LFR2rCA6p2fxlJBCxT0j0YjDJNlgQSqmWeVSaRXrhKiGnSUpRQlDlZRM1Xkcvl/FbcBH56Vz/88lOxVpTXp2eak3x8/nSiiIaHe23KmMsk9GZVEJ78E2R4uLUKAetUTgEwoEF60A3hJXRZn0hwPnnIGsrTfdG71QN6Np1XebPK+8/4/sf1/v/7pP/4iGeRyuZSGQt4Ac9gCaNw8ah5enhbACgLK+N6itMZqoSRgLgCzBrpEezoqpv+0E0PRSIldoY7WGKv7JRQsgTYMDh2IJx4YAA9AvDNUkSMcHy01iuLOzMaM/nTpLVGFe3s6ekWWbv3EJkWRt1MYI6QbgXL00Gk96hHzKYtME/PkVC6MXtiS3aCu7tQRGUzEOX7MkDOEGDS1zvHIZXgBsOU3kFbmGh/byAaHBAVSYurwxOnIZ00hHc8Nho8zCuJLTfLZYxdkK5C4RFsdH4hbKlrKN5Den3T3HarZuLX7gnpyCU3K4aRf/iEjBt68UjrcUd8GKZveLo104OMzrkUBssQfG7vSEx7MJAOo1CQbM2DCE+yq+62rWbWRxL9zI5Iq2b3uTk3+yQEwkGXFB0Os1OvoYg6ws2jZ/8THtYd092VNLrevQs5Rs1MQZlKIX3QtYvuQ5Vgbq21T4aWEbYSWWRQOkxO7Xqz0DM6xV/yHUdkipV3q38AHo0ZPCqsZuiujB4bnG8vpI5xjQ44M1glWgf4R4wYPRSHSTHu3MYr7TVklgTUYfpL3cQZaRvP6IuMrJe0epJ0JNWUpUkZAfT0HEv9VqJrqI7NgwDv0v3rClgMszc6fMtF3u3l6EpY+gFzujOEJq3mu164JZlhKP2KPX1Abt8VKa33Fvn29mO5rpH8PsLO+47ZyWTySceO7P3ylLIAwB5GRQCvSAX6RG4P2Xr0YpQ2ZXucuaOnjhyU1JsxsiCkFwbC6LL0GKCDoULRQzswthKGkpk8+AKBBB2kqxQp9LZGzgcQTNK6/IJt5vQYj+iv6xFaZIxwssCwsHcnMIbikYprKg/Yd1j6RTFSdtBnNecSQ6r1xQOSpZTdHHD4SkT0lKxD/TjmkZUoOW1Ou8WGekyz8q7jO7zauqCuvGqVui4uKHNpiBYuDnfXlgYGkhCgtl4Noy6rns/TNJF8vj5VawAmmSBhguamlAiPFg1wQUBCGPQazc2aN59KzCVOU7wp9nau93ItNM2IKJKREijI5E7qZ3ZW3oGkN+z1OiSJrqfdhDoACHqAioLMJBL3XM7W6FbCii3iDVbhAm9EJZcSlbVaa17dOph0lLnMd1O5mJd6NSz1qbVfKb8IvyevVh/gAlpwXeulubiHQURMWM3ELdDSSBGZHypZn8rDTEQQ7t4QISITwgCPqLVK0Ulnkkk8EIOOCaCqBMxqJSlKqIY3t0qZip5IgUGkXM6n+XSPabo2u7t/+Pa7H9TMHq/T+/nT89Ie6/W6tFYzmpUeCYl61Ampql++fMGXL9NpXiyrRzR9c386nR6fniqkQX/69OGff/7xQ9R3l1JbM9jz83OYT3NZ16oi33z/zb/6299+8/03l4c35/NZTpOwgOFuVuu6rlZrq2vRDToIsuRLIKjhTM8ge+VZDbhbbMEtB/aenlq9baJtHwW7XX/b45t9Tw5ye/ySPt6sxrjZaxjCEtG2h8cQGeltRoR3i5g70oBESsokUhwgETSkWTu6dTqoouIgtZRSOMoOpvRTpaoKi5QiLKKAX3yutJVhAhRlzBdhXMp8fX5sy7osi3+asX6ssdIj0ALhAXG4UxDmnU2SVJfigbW1t6dzJvg4RJ0NMkehlGB1JcqdnB4oD66Xyrur6ceYKu6f4+Hj+vBru/9jnX7/hD9dbZlPqyjEQ31EQ2e9Zc9ja3ODMyhR2NQ5m7hpqEaRojKDIdDI4l+ZC0imwV6RkUeCzhvLFNgyAGqf7iE/kx16g0QdsPYC4uOE3SLzIwb678sGY52QJCRyGoOex9igLekpyt1HIF9jjBsNGoXAMOz9/Z/DPL3RCZKO2MqcHWy6DIpk+cseAiDBLYuM9GFdOjzQIoF36iNBBQ8Grb71ju1MN/iLz+Nrgbhbv/IcP0CaQzCPD4d//7r0eIVbkMCkYR0XDxcOyTnHXzDY9rDP1Y7NIrWrzqr+Mr1n63gQtBgPtejupohuPacBPUDQ3REWPgpopYcN2A2m2AeN++/bSuvLZPy0LWEO4ZCOrWR4wHdI2Zu6FQBVBmJzFRgO6/l4bW9PbL9thIJjWktfXRFwNwwUHKmZDBzJQxZEROSiGmN+Y/4H0APQh8aQEClHlDFysjsu7TA5Iy/THnoAu9F1dOZke6R/qsP+gHuMiBx3xyTiPkhApKse0RX/G2A6Xm7Ytvp+ZTxKR8sc5v99ofVxfJlJhtvdgrEKJLpmud+sXcMOd7qQ3VKeSbfJztG9UXHMjt+fHCMGAoD27b4DaA/nHrN/AISI186/0fg+kX7YlhtwP9yd8Pfrufyxhc1twVFdmHmi3lyP+fTeHgDd0ZY2+NFHAodoq/4cP7hlRpAVMAiS+xpN1TE3Zx+CQxd6SGsnOtzHc5Nioy89c+Pl1jpuAnSH3xYyNHCBHMdQcLseNs8a9i2Kcdt2T/ZaxrAN8/8YxX3ibuZxf+bhIXBhbf5s9UkqK6/12UtROYW5u4dZuDtsJ/EEw3yaJovkrkyfTDRgMQsGZYKUtdammMkpKNbjGIwKSpNoExZvTUNPlPvC+8K3Z7w52Qwyktxnn5LDte0msgOI7lHMPZlR/UIE6MrkUo54lfN3GAG4dDRhRBB1ElMsEld4IK7RnmgLrFld29JqzeqGKeC8RaObhYNCFtfpnx+v38z3fz2ffrwuZf38bn0W4Xy5k+viy1LD2yRRJEhEEUjGiOeqdAtPI084Vd27d5+qqnQLuAHOLNZKEUYbhkPrFkpHmDcTala0shqtehQKC0KseohMp8nNrPq6tn/4h397meYT+d3D2/XT8/l8rnVRihQEjEYhlFJURJg1Uy6XU3UDOZ1P9cnquk6itpoVe1qXtZSfn778x//6n3788JNfpo8///jhwy+2XtdTOZ9Op9O5PT0FUYpe7u+/+fbb6fJQ5ik5sCQFL1fGEr4waoSJBMDUiNKSl3Hg4XQJHbSPZhbsWCf3VAa3sMdnHnNpNoG7GYj3jdO/221sdkyCEpHBJBZAmvLDw6TXBaNhx//5agt3erQ0z/XmydD1yR6Q2LMDERsAChLQoGhysUrpaz7tAqKTikgS3kALGUpFRCGcjMvpxDKfpvlyuXiLtqzPz8+Pn35tn3+y9dFbAwKZqVirRLhVa21dM+dHyqkEJLxeAYN5CNxVTtM0++nS5nm6/75SOd/5/HaJh2c7fVnLL6v+4Uus07vK+89++tTOv5j82vDEACcIIQWS2k7AvQvqDBDvuE8kkhdMHWjwIgxRqoANMJbOhdCHiEybUMYSaPd6x+bk2Yhrujh1dENPB7h5iBxc1jgkgB0g5AhZyfsTIcn++QjEHWd9ErtJYps8yraFtD14YNgdfmzyfft8S2Efullv4XjaoJYZ8j2ibSEt7NG5+7ErfCEJ83nJXwuXbfGyJywcdIAxXAkbYhuB2+c50LcpDiWi8vahkzMCMqxeMUB5Io29xM8LQX2rh7z4Kw61rnrkyYGV53BbtspxPElH1/Kg3g90DgMpDwTlEZv9MW/xEZSzRW/1M4g927v7iqMrQv9CR7Znbq09jl7/Z+KOVw85UvqDYTDJbM/ka8K+Ho7j2b1AB4LAHXofRuzwCWKkAHQS4YM45dAE3LfQ432O8iqdympM+YBHQ6e5VebS99orMR+qW/eeJH/RcP9wxNFnWUc9TGFW6u61nW+TY7Z4of29h5b7SwXAkpj5xWju7X9p3v56HTzugfs3NwPdhbfBVgAi+5N70EnKTQkJBQXeLbK7RwlI4xT7eXNA3gepdrsWI271+D54EsRwCn3tpNy6n8/fDG/H53bAdlh827zj8DnSbZ+KWYRzW5DjUdxtwCS9W+4oIhbH5N1dmG5rXUIizMGCyKNIOne8bVNws/ZeYuVxxzaSua9f6EzjGvJ6H7E+jzfmkz2j4Hgdj5/cZS9u+BcE4usVOFbRnrSNcVYFIaQhHOaCxmhucKEH0nJcV2tNwt1bhqq7kCp6miTier3WcAVra9ETQhLCRFal4jyh9Uoz1W1xgyhUbCqtmBN8M/PNiQ+zP0zriStbDyFKR9CrHsXtJ4ex6lMvKAEE7ThoL7Y8u8RzIslAKeESJFqRNul6LnWWxcLcn8WeJBZFg7u1CAug87FHBeq1rlfUTA6RtckT5LNOn+4efn6y96bvMYUWn6Yy39m6rv4MBEoQgirsvJCt61c9KDyEBZ0wNnexDl76jDNJfumIoCYyVjEzhLj1GHbRoqqkQkRKKWUWkXBN6lQ0XJ+WH/7mrnl8//1v/vEf/tP/6X/8H6N5Na+PV6wWgiJs7lYbi4Ayn+cgIRDF3fnu8/NTCyfj/nyZWRj+dL1ebYlJn+h//PLLP/zp91db7vViy5XWLnenKPHh+dMbneZTOZ+LE83tdLk73d85sLYq0lwgsSCaRiWMaEn6wOT56Ym/AgC2c/wPZZs84DAZ19gIu0d0Xz+HHMvt3D2Cp7FzN+Mre4bn8KZusEyzivMwpm0P6QJKI1oH+2DWzwMk7Z0E07lIwEUZw2ydp7cICSoRIsKSXVPV0gPcmoRkRbQe9U4F6eVU7iadz+XuTqgRPLV2//xoT7+265e2VkrAo61LXdYIU7LW+vz8/Pz8TPJ8PlMn2HO0z1GvVjU4l/Pb6fJQzg9lmufLvZs2ubvy7pfr6edFfvpsf/hs//Dr0mblNLVyuuJ0lfmqCgG0peSDO7AiRKIwzZkZ4SkCqAQYIiYpnpzSrm0FEZgmoRYRh8qLczVkYKLoYm0M/o0kzBDygfJiE4UDjeSS8FH16fB8vjzvduGTs9RPnJ7pCzCdlC9k9JYb9lqIbRb3fZW+uudlqw73/8VDZJwgf+G7WVNuRyPbij2e+H1n4f+/6y+1djTYj60amwtjAF/voBHFcoPFTQ5oanwFJNNi/b/bqu2Zmyx5OQsqI2yk4xP2LNGuf25VPMZXbvSNbe0deUJfgOPjsOBWBOXMpluB3Fl6/+UR3o/+r7/i5TI+wonYdaHttpeSM7+a9/itPXdfdXHYU4dxLtz8ZwFkwnwM8NqDgmJoGEF3AmGRgZh7umsqBcJIfxgpHhg+zbEDO3Vmvrwbkbd/jsvTQXtYQCP4RICj+6Zrb5FqCYkhFI42A990WextALCrkv2hN+SMW8rdeJX0Y4Ej+nwsK00QGePUChcfMeojtDFj2nLXJBVOV1FHawFED0VLzJTPj/6W/XQk+8L127Ccw1hle7tPd8TMvLoiIkOV8+s3QpC+9f2onXAMXhxhYI76yCQ+3Nm3ynGZ5noSURHRHtjnpNBdhCEyAqqSF7tngx3dFKIkaUnAon/ZfXs7ILER+Gc9XwDY8qRxwOS5DgM3ztauze49Hvkexw029ieHH0A6+r3V044HwyYc81/HqYFk6mHSUbnXta7Xtqzr4zOer1gWIZrXaNZUtKBORYuY2TUMYSWkV6kD1KHN3Z1rmwLTpNe6SNFVsCCevRltOp3lPAPi4ryb8WaqZ42L1DnW1uYRmBZMfDYw2vHU9P3w7to4cgEgQ2OjhwIPKTO0HSe2uPHsfroKc88zmrDOZT2X5cwnDzb7VOJxwiJhYe7VrBEmQeL5CZxxLnK58P5BH97J/Tu9f3d5+O4q5UfKgzz/9w/fnrnWD8vTdbm/zHUp5hCJIk5jNFnXxhJ9uXRCZRehqhpCdYSJQgBXpeoEwMy8tdwGkK7VixRrYdFEEIRORaSEU+XEaZrKiRSVeZ4u18C1tcvp/vrl+fz24bv3d7+++anMk858/iRUyRpkSlGQoudSCNp1jSIoKohpUq18fLp+/BgPp/sCWnNGfHz8wvf3H+r1U6zf/t1vlx//fL0+RQThpcw++bo2+/Lx/dtv3n37zf2bS5lPDoEKBe7m7g0r65NdP7TlM+xZkA6oTlPDDsR7JLR7L/fLAz7b9giHDrCJnZsldFz/B+8juoETdjA2jc9DRIImwqFJ93SUXjeNW/GBjgURrgghDBEKCgVK0ilm1oN2U/dLPQaiiEjCdSECRQUi3WdAbJE/eWp0MaYuVCpJ8R5EIdCTFpX57OViVEAw63x6I2++seXJzVRFAmu91mV1b6d5jrBlWa7XqzvmeS6lMNb6+POyPC9rhJxPd9/cP7wr08U4LS7PC76008c6/bmWPzzbH77UP3x8/tOCCCkgZYoyNU65qrtX3A3mcC9UASXEkmBDFBHs5oEccYEUhLhLtQgjzzqdpig14KKSJ6sDXfPqUGXM1gGKjVkOdEF6O/uRfAldrg5Av4OkoGwmiVtrj2NM4fHYQvfExsisHTFOQnTGZ3TME5CI9DWzC7x9ycktotgkedq6O6DkCIQYmElE/GB1SmTgQ0mWcXzgxjAnWZ80vSVH9Onj2AHJbZG+vGKMxljIt6xE0eHJloSdhsLD7AybNkmRCeQW2rDp8DcDf8BK7Lr9Dj1fzu/2S0/t4AC1YzzZ08kTmmyyIvNeB9p6MfXj1QO5bXZAEdl8Av37HQcCQ5PM7/rInXiB44/jv/Vo78joXc7FNiNbiFSKiiBAT6ctgFFfef9uL/chCbqOkQgb6D/qALtysqtKh9be/p5JFj4W/w2eKV/r7eHFXa2gh3n6U60bu2Bx+FZYhiQNBaDPZf/dOWjs+oOHUi8jmDky6J/grqx8RY1+1TfEIUjjxShsk/EvPOf4wKPiNWY7Udj2ee6X/ZnHrwA9w2ELWxwgGWOn9y/GQZzdtnyAfuDFxj6co/L6ry/6vj0/BhHeUQBtvxzShna8TglJH3+OIZO2YKvs0gHz1i5VjTF6m2Xuq23L9vQMqi6EJDxz1GNPReqFBLZhyISCHUzwsO7lYIR4HfV4bEk3PR6j//tfHZuFKXb8MV71F5+5jdvrG7aHZ9O+OiZfvRjpAZMcdg9AGC3qdXn88mX58kWfnqQ2CJu3dV1VIPOpCa7RluVaW2VTR/KdeEQ0s2VZcrIFdPcvbdHpFHOpwWsgJsGdlvvJIa6Bc7Gz1Bk+hYk3cY3Mabxp/39jd4baqGSWJsLNuTHAFkkZrn/PGKqQCA9fRa4z17up3smTRaB9lPaR9uT1yeraVoOTLMLgw8Pp/t3929+Vb/6uvv9hffMO53uZ7uoav6CGtOun598WvpvtHnI6TZ+fn0w8CDEv1YRiDo+Mw20kVcQj1CJykXtQOx+AhfdiHKS3FuEQFS0i4jB3bx6EBj081QkJKkI8IkQhEiL0IlKmabYWtdVZpuuXx+/+6vt/+sMf3r9/vyz1N99/91//w3/8+9/81frp89Onjx42aVFyUl3W53BRiFn1WVtd3tzf6ax0yuJtWVdrMWGFf/zy+T9//PFjtG9++8OHdan1l7f3d+b149NHnedyPs04ne9O77/95u37N2U+PS9XrafL/Z2IWLsu16U9fbbnT75+VrsWenPLLA1VHUItYpfY/R+HU4pH0N/PE/cXOUubgHW3V27aZBbaT3TyqKITW8R2SkhBFsTARtF4kB5ZE5SkhoPiBCEqVJRRhBUAMq01EKCnzu8IUdWi1Nxi6bVUzcJukUnPripkSNYClDwuilGMotNZ5rsos0M9GKKlnCWqnB4mhKoKY3KvdYU7SRHcB1pr6VkVEaGx/m1drk+rgfN0vp8ubw3T1VgXfGH76TH+tMjvH+2fH8uPV/5YWxSBalMRJZSIjDVygJlTimYak5C9nkfCGDRQJaA+yp8v1aU5vRXzSoQEJ5cIbYKACmAiBWwJeMK6GO2nw8glSwFLSDLDE5qeZXBbBoeI49uf2xURvt//1WtTFwfTBnutd7LXzNmPvG3xHZ6PVxKv48OvWbJfAwxyxHHvJ/9LkzBJkf08Gn/1Q0t4XOpxsDrlXuOIxT/2YDznXzqFb5vxF3uBoXjt6HykPvvtzfuD/FCC7fCM219ejtWLRv6lPzkR4T1Lm0DvfqYBhh7uzOFKVkA5BjjkM2WYWY8D3ZWBm5iUI3B68eE2I18fN+JQOfQr1zabRyQZ8forCdxfjokfqqpnDnpfbq+SQbc/xT6Pu8QuHDVo98eRQHizYfxHBNwRwXAkNUHcKu7YIgQ65k7LByOyaokM/p+eJZlJOD0VnAEwScF6cQAZuZK9YalbBHADILIPKh045jlwnB6kqjHGbUDxOLRk624ctP3upM5kNE8UlquFu2jgcFIk9gQAiGTcC7qg6ey5cpy+AJD1ELoGPCJU2VXnwy7hpjIdFAA9cKQdLjtqL7gRK8dFvM31C2qg7QLh7qoTtgwswHp1rN7VPvfRj/cMPdtw84anXyzcrQ0RER7opZw7nmeniEE42OPkMs8kwH7qZ+wbDjkAdpCxPAQajZb4Nm6979w06RjQJLb9gNTTdh/Pi9Z/JcFj69GNKL0d7ePN2/03yt5RQ4i0UNrq6xwCBT3c6np9bsvVa5VmFK5Wn9dlEti0WKCt7Wm5hhusLg0KqqCGt7ZWt1lL8i+a8nkOuWO5m0wKvPmEeilxERdp4jKLFa90IlwyPRAxgnwzkbmrSrlVbsLYdu9rJAFjBlQEAIEWukd4bMHfmW0SI/4wIsMPOg1MgNEEy6zrXbk+lKnFGv4p1k+on2kr3U7lVO7flSLzpbz97o3r2af36/nuWXRpWJ+WkM9vmi8zr/f6y5f1r0p9mO1/Wtdv59OH+uRnlRV6Xb3WuVyKPiiLS0trs0pBuJkPmZC9yboQA32QwYCAmaoncI+WlY+niWKimqZTKRNV6THPU61GTKpFoHAKMJdpeXz67fd/V4J380mEP/zVb9ybToVTOT3cLeuzLddlWQtQMK3X5XK5MBCt1afnp+X5N7/964dy8bUtj9f16XFVLMIn2n/55ad//PlPfn/5DDTHm3ff/J//p/9j9frv/v2/XdjM7PLm/u37b777/jeXh0vQpcyAtNZOp5Mj4Ku1q9Vn2EKvKmGBcE+KjOi2JSPJcdpxtw720iforF8v9o5iWPePEhub2Nx3nOYeT5ElvXpUpEUtYvfmj+fAt6PUs8S9AmiJepXJESiq4T0pywkdJYBsm1whhAGBMMIFUKWoiJboST4QhjKEabgOZTKbBSUooAhFHQqoQYqoi4JCnYgC5l/nkpEL8KyRNUfy+FcnJWmIPMwMyfnJorVprc2NenKdFpcvIZ8EP0f7r9frP31c/vBp/eXRvxhdCsQgTbFO8ezWLAgKC9E6gvEgPCgS0elaIwxk14HgGs7mbs2xrrFQqk6TOCqAQBE4g5qo2pM0QgFocoIdZ307CKP/1xMtbi5KDJmcctsBjJQM2VZFciBscOkgYG+SUMffSZENkKnugIfpcucreX5MM/PudYgIdhrCl8BuM2wd13OKuV2fkUASXEcPV8kQgvC2nTY9l7CDi0xyzUiBYXsjE031ushfB9V/8XLPx3agEt26DHY6+F29ydi4YbNNb0Mf22Td2ke437QHGw/GyR1VHg7ZDHMfb+HuFO53dFpHyyfiGPsXQXDjEtomtyuZe+ThmBEMJSBBc6qgkB42uLcbARCK6JRTt8dzf9N+0OshEGV0K20fh9Z6R4IcajBSuzgmXo6NgB2Y4bB62QMlbBvJwzz6Bv1xABvstQuC7DUfxnrm1shj2FJ58eXtHe4ZywJ0H02yH7LHwlKjE/omHO2WO1IzinfkVRUpCcqzeq0CiHSuRwe8nXghCXshfd6xU6QkFE8z9Dbo20/VCcfYg8MSyEnewOhID3q5dce6/IqZM5OhYl9q/S9xYNA/tAfoM8lR6DtHIhFQv/Xw/KG6kJI5dwfg/rIlHW3ghl3n5qav6JQv7zl8K5NrXwnKXRPd/ukbyXG+BhjWEY5IpBvNOFfm8eHHdbX9PlA9lRFh7HlILiK8XZAi3WZz4JO9nakR8clbC83xtgNr274eVHVUztt7N5h3x8gcqJk42L6OQ/QvX6+n4Ph5jLeOVjkyhgFxDSuEFjE43Jv6KkZxUTPK2tpztNU4raoygV7DIEBYXVYy7u/vn8QXNGWcJp2mSURMY5nm8vaM+4snAb14zOozg2wMKTDxFq5J7NH5sLYN9boLRwVVQJi10a+NhL2TuJKJnbeZfTHA2zX4YeDK9aTXu3J9Vl24hn9peJqwCu00T3zzZsa78/358nD6fP30+en5l8Wv84xvv8cZCIUFmq3Bejlf5ze/3sWvfPzy+ZfT85fLm4uJ82lpnx7XWssdyv25TLODnmBeJCzPIyIkeWN6xY9u3UAEVCdQs8pki9bcHJGe8qkUNxjIaYEIp0mDl7sHPj1rmadyUldSC1HOas/Ptqxffvnw0x/++bu/+v6Xn3+8v7//3e9++/jTT28mvbx5aMJrbXSbT0Xi5N4K5ure6vLpw5fLZaoej1++XGz68vjY7uefPj9/PsXPT58/1XW2U1tqkC0wP7x5dzn91edP1ZePnz+Zxfn+7v1335/vTk5///6tFPn8+CnCzJ5bqx4N0eDO8LBQsnps+WY+6k9J7/ROgQWAVG8B8QQEN5L59to+yRLCr/8qw5OwpRGDebOQbdvUMSxTGSI4hFhKRSqoZW9hYDcSGSJRjiAACRnnCBWUCDYPQRRBUpOqivkgS/HIJaJahIYO/UVVvBveVXQqRT3MTFSCGkBAKJySNcnMHF6KMOAsolNrLc1PwTCyUL3cNV5CwWlFXcx9DXkyefTy5yf/w2P7p0/xT5/qnz4u1xWOCSqUmRIKhrewSJIAkam5JY2pk0I0EWY1D0Y/loMaLt7oVcPUGmo1WygmJxrRBOGrzCFKlGByNJNBN4aqIHJk9nCITXJ23PMa/b86mo9y8ghU+hrjLn92VLBz7B8gBC0E8JCRg5c3pxHqq0suX3m7nvcFfFhywEgn2IJyOzyIXlnpxWOZAS2HHKrjAt5elJSY9JtBeLGJ/lvwf9z0Yt8j/UNnnuQAMIgmt2sLtd1Gu29A7mBsPD8igq+OxUScY55eGgKOEmP06AaTbGsmOn3SiLAgMCo6ZA0iEUl4vdV2S9GQI+bczKZMEQ4MT0JH8H6ET9vM7ottNCkFXTZpw9/H1uadzl1L6ij8ZmhuDLkyaoHvd5JAVDeJown/dmBHrMe2KlIgx4jm2F7Y1+fhW9ngko1IL8H25WyD+1Br+qjlAZ6WGwEoVEqM7FcJ9iIXIKECsgzuBRw8AKl+2BHWjiEWBFUPpQ2GBokQKaJD+8z8K8C9UUfiZmYP9ljPfadtaWf5SQvf5MbAc7nsXsXJOQ0mkvaeF1g/lDlhZI+BZ+ZFREh6gfvROCagpZ0M3fQuyewbkQrSULVAkcGlbdvGSu+FJz8J9+u4KLPc3RbVgw3serKu98W97TcZtWa2p/XfC7f9FjasFJS6GkmqHDSfsXW0JIT1nopO9PUh4XB379zDKiKAQyV3Bg8LERGd2XK8HkAC9Exz3xqfq7IrA7l1sWUF7QaYffGEiagOlgYAol3zt84pjk5Pd9hfJV/d11U/xcJdVSNLK6RFuFsgApHeRmH0n6kBb0ecu/fIv697+gBkUnUsUT+HEN5QToVUiEPenssEe76itWutz+QqEzymolnMVu/OAAxhqtXM5mjvT+alAmvRUorO6kWanOrE5QRTmpQGhwTVWdQjKpqAZVIyaCYQ9yx9vGs+mxOG6e0Z8lOyhAvUESNsI9c2OPyYnTU8ObAhHm4eR5MvAIlC0nxRLRWLcCl4nCLu1S0eJZ7vT5h58TCza3uuv/z405f/+vjx1z9jvsf97/BXE6Y7zucoM1TcDdP0ZfHL3dt/luf/snz+e/Bv7t9KPEetD/dvHj8+XqBs/rx+UrmH093m+ZR7O5MvLVxVnajNSZT5ZBEwy2T3kKDoUquFzXd3ZZ6q2bt37378+afL/Rkhy9ru7u6txbt335AaJut1nVXfvHnTmj89XsNdI54/fvr09Pjtu4dYll8fP739+79/9/79//Zf/tPDN9+8ff/uT4+fq9v95WL9auv6LFMBcTlNRfDhw8fl+dldP1+fzt/9VdHLv/13/8v93/7uu7n84z//9Ju/fvvdt9/9+suH3//46zffvP/hb/7+px//9MNv/vbx86f7h4dPnz9Pp/L+229JtNbev323rI/NWl2v6/KEZRWrDU0JaimTbofNttFGLcSjfp6HcYbeDbkRIL2UMgTRceZzzVAGOUpnus2DahRwdHf3BkBY0Ck4p9gvB7Ja2Qj1Uc2srIkK0RBHhHXm0DQrACN9eOgEQyQyy106mVIdEaZRqIrAVERZ8jwQYSmqR405hbyqgAEJJeFTxhsxejg3THUCBYKiU48np0vRWjdKBXV3ZzhYg2W+s4bwcHGhw2Op+HS1n5/iz1/89x/qnz6250YI1VqQOr8BNYBmSDKQYHFwOp1rpjNSPJl8GFARbwwEI2wx83M08ebtCW3VcAl68+pVwk1Uhe3qRTxUQ6lSotBQzZr3qsmyY8OjoOuHVRBJ0AIec7q426QHRTi2gzYlqrcGIHHFRqgQEVqILPmS+ZADPbNz3JtH1LDI1EFA9KbOd0RI53reRfTg6MN+OtmegLAZkkhuTxu7oXd8oCBEkuBGaPLpbj3erW+aB9HWKJJSlJ2cmgYmy1YCHdJFZI9iBQCaWRktOXRumGkODx9m+8zotQ2c9JN625mdnWYn9kgD4vAiRGRNDVXRRKvHUFukefJYDjVfR8K9a+/dheLmiegTHPuINuizob0418249dS0BK/5cQxkP01TC29tzOaIucrJc4x8EkQn6kyclo0eKD9uU/42q0d+MSNLeuopula3GVhbeDfyirTwSYYGg3S4eYcOZEjESDFJ/RhmCEuaXh+VW7GPOMYLdwUxecjyZrfsS2DUfzjuwnxIibEXj+gfkQkym/7CiEgmu6TDBFLESoZI5o7tBhEqehi6OCM2isseB8/ImjA960KHAuARAiQvRlrUkqQADDgs6xIKEKyEkj0D3ByjEOeQuQdcdfw9O3+EyOPqxGGHTZIkdyKAxU0FPR6UvNx426MkefFkiKPjkkGPaNqdVLdwc3vmtjPHxt21z/75oS/bFyOCemN7235mwbgXgwBkquWuJuEgpPY7868eGbaxt3woAMItZOMw4H3H5++7pjHeHi/uJzLzJSSd7eEMBTOUEPsI3s4px1swPABHkf3654uL+3T3/x8+fGlVOopC3mr52yu2D18suV7444a0LnWb0if41vzjKivx5IaAIWaRAirBN7PNgbNGWNQ1noV1gkflJJ7lbSSEBnOfHLbOk8XUECYQkVZIFZd4BjBRClzoCENAMuauJfNmAOJtgnKQHMZ/w3gex2eLuex7HAA0CFg/Pw60bzdXRPTSHl03DESNeKY/T46pmbZna0/r+vHx48cvf/55+fXJrq3WCl9xmlDOmO4w3WO6j3KBFqgssNoC57uryx8tPt+9e4rnf/r9f/i7S5kaixQpk9fGAldv8VxQ3j68b24ReF4WBN/cPXy5Pru7TKUUqdbWdc1E2Pl8utbVltZsPd/dz5dZJ7EIuz5f1wWQtZrZ+ubtu7u7u8fHZ6p8+fgcIWU+Q/T5urZa3WOeZ3ePZZnd69PjdCqzyJeff4r7y93d+bo+f/71l6enx3V9/mV9fnc5n05TXNs0T4/Pz+J89/23b+4fSP7xj8s8nTTqky///o+//9OXX84/6/vvf3f65fOnT19+88PfPi2+tHhqpi2I6eefP37zzZv33337zTffzPMsqXLXen1+1OICE69szaIVhFJF9vjsTZKM5e3Rg/s3np/dNHX8Z34rDyTsxs4uuiWOu3LfYsf9tX+FWd1vz6g7WubIl85JxqjA1J/dfbARkZjPIArE8EEVcmlbDizYz2dI1vMDMxMVCWFpImUUvBNlcuAhmMXFQAYJoRGkp1mpZ4TCR57lqO65HcfSTSiRkOzaGqgi6uTa7KnGhyf76ZF/+rX96Vf/8MWXNkUj1sXQpJzA4pw65MkASEgknfpO+NwJixDuXhEtf9eIQp/Ez4qp+hQWCAPDwYZY3dR0ZRTBJCwRIlAXinfTQK+ACGxJ2q8v76Q9h9KwY+J9q6lyIyKOq2J8+EIgozt1s+akEj7CRCOiE03KIewHwwi1ncuvz5dtHb5YmbjxVNycQc4sbnrzFdlbiNePuj19gG7qHsf95pg6fCu3wrZg8oPd3Os3DVDdVYWIQCdQzi7s3Ul1GLcmwjhEqrw4BTagPJKAtk/G0XnwGLwYxv/d69Bgk7E8EsZh+zn8G9vIbHoUyex1jCgJSD+R0wgbIzntdb+O4/zV6/WqOJ7mOMxR/jzizx589hfedWzYXxqTg4F++/zYi0Pbbs7u3dhdhCVNy+O/dKqkPbiHROfIEVB4DZKSWg26+ZPYxpGE0MnB3uXoptCupQECYmgF7OE9QoARdLBkPflOupdrOZg1XwWM5AFKjNErfEcEKCISIiFyHLOtRgPQl2Dhbi04umC2WHyhCItQOkN8HG1U2Ib1ZmN0uCPCEp7VYJOyGtvfh7tKkaQVORi7rNlxZM9Fy3xiv1kTvRfjn0km0PFZ7Jku+dNei8/b1cODf21bx+LCnpiBcX4GzSllEz1Z6iUiBNjKe5DMTIE0+vQMD8mB0v353HvUF1hXP1Jt9K7+hgqGMQ/eg8tvQUDOxDZi27Tvfz1cI+9exl7YHtWHJEcUt+J+O06O2zLf+eoeDN3nRjfbmiEiIorhEB8HRr91m/ooWMMiokZ7RjtBJlEVnqYZ04S7ooyopV7F2wSPp7UpGEKqBOl0c69wFyZpl2cmIt2zdpUUlDycUlqDAkfAnGNeYXSPSQVAw8t8uBvD1WE5JdZP1gWnbjpAH5oIkV7fcfOVMzlmc7XmBBgcEoHCKQDQBW2SOpEzcWZdnr+sz58eP/78+fNHXxqD06zGe6dDLzi9w/ktT284n32aMWmbAmEoU7h/blzefru8LT/+6ffffnl6eHa/i1C5wlXoBRWril6Xp+fn5/fffFdcP3/5Ms+zR6urKQLUUso0narZuq6Pj48ylWmazKuImNl1WS4Pl/v7+0+fvmgppcy11ndvv2mtLc9XbxSeVEpCyhDVwojFo52KtrZOYcvnJ/XTNM+//vPvr5fTNGm19vz0+XzSO71fHh/d6+Pjo4i4o0zy3W++f/P+3T/98+9rayj6y9PHepn+4aff/4c//Gee518+fSznd7/73e9++7t//e67v/r58//6hz//6drqf/ev/9Xv/vq3/+k//8dUHafzaZpKa+v/j7A/aZZlSdLEsE/VzD3iDPe+OYeqrqquRlUDJIgWtoBCAiJccMlfzQUXJBcUCgkICKIbjazKOfO9O55zIsLdTfXjQs3MLeLc7A55eTJuhIe7DWo666dOilhWbpcXW5/NzgpTFUXoS7XwsDE9A6pvHykF0mx0tBviRTuFNAKKQ7IrBFJNiEjID85T3WldqDe1D9Jc/p21NrAUVFBs2XkCxDuKHVBDhWzxzybr2DOwxxJMgUSJGQGR6OStSNAUYq52CQBqRXBWSHS+bWHSuKWqRncwSG3xGgcdNPikLBZR6x4JN3cWmtOKmVUZTyHpeXUuKc1AWdf1UtbPZ/9w8p8+8fc/Xd590tMJXiaYYXMRTnMySaYKsnaVldoFK4r6ItmnzjvkkRXAqjbgpiwzOCvuZp09082cJYLC7tjgC5nVJ6SkTJY8eWZuEDTYRS0g7qTuCG+NHNiK6+obG9widb+kpUsDCLFWLT04RDw60DdutLOoEFAi8BpTCv96+JUFjLIykQj0NIfXKwdT9eACAMoYvJVd9feBL3bYn0A3cel+VUjHsguPbMs4r3+lbc/up4/lATWqjwZlQENwR0uKaIkaGkHUFYTAxVUZMsBoxDk022pTNFWNVNtWLKE9Lb/R86DnX6lFARESXYq7iGRfnOphb+erT7eqlvsVcSK98wGG+TT61Lop2a37uv7oCtV+SSjcmjUrybbmQV1hDXuMuytOofW1SELHQ2pPf2W3jErU9Tc9dhHnmloHGCQdP/lP34f04IWjajeo+Lf3GZFdmgEQhyuesmub8dpDXdLym9FgNENBd/fdjNOs9BaViyIBawsfhmo4OtDQ/dRACX2fAtWmlGrV+CiiqTFdBWFMjtA/Q2usLmZJGqhuWmPBzFCDC2gwcQmy9WgvsKMsNeVMm2V85WHaFyJ8zRH86lojoq546O0K7PyrX9P+qVm0GGusTkTGS1jr10Jv7snocdQbts/oaQ6QhPElfaB4RYvDYRuYV/CP68vib8fN6GTXSSfya6NAtsoxqY6C2iakcz1Wjn713GokVDNp/ApASvr6YpEAHqp5NQNA2O4IuXlJO15d0Pa59EWXMQHsC2r9X7jt9bHsKx/v9yjZ8FAMOCRyzS92U/fWR3X16keagAs2uJEruIhOcIXMhKhJLWNyg5olFfEtNBoRgQuMYi6FVBUGyIlU7mGkwURrv1bCpPoeqaTRUsMDiAYCvW/Ca9Lq/2yqVY1vEBVa/Wqm3Qpiaj2Rx27Z9UoBRBIo7jRKykqANIElbpMkg08oE7bFVpYiLIAT4g4HkSboEdMjpq8w38v8oFP2SXmo2cpwLjJ9SHc/PR5+/nf/+Ol/+feKM7eCKVkWE4Jubpp4Oj8vy+L2dk76+PDgbkIc72ajnJfzVjznRXMWkZzz6XKZDwcA67raasu6SpbpML99+/Z8uQD68vT8oby/XC40PdwfRQ6qufZTTyqqYpuX7Xg8TpK1rKWs05rEyvb8aXuWw+HwzTdfHd88Ptwdyun8fluS4Hy6PD4+Xpbz/cPD41eP3/zs+3//6//w44ePOk+LsCh+PH0+2VaQHPL+47t/+a9+mKbpcDj8/K9+7lPybf0P/+Hfz//4j//tf/t/+Pj84f5hTpMeDpOKb8tL8VVTOb98dD+JLTlbkixGFNCLDHZ1P90YPsTuQbwi+1GAoaXh7WTfxLOmXTu8UlD6Dwekh8bAb61xNo++DFUKo3ztbKezx1rcUbXVdqXYpMkDnI8JqhRNPcWvoVxGglx1dHWmL65MoAfcqCZFhYkl67kRwOgllHtJgETZsbub05wFbkaGRuMQsVXzhc7N1tO6fbrY+7P96XP5/Yftz++Xp+VoJVWUS0k1MTW0eYb5TwSbEAiSMooXAAUsKoi6v5ZwS/REz7BJcJ/TxCSciulGLWJixEY1leKyJc5Qp5CKxFpIcHXGB9wYorXUQygSMDpEEr0KnNilQHmQ3kOoU0vn8NdctCmsTfVk9cS1bb26Xqr7kq3itn35JXHT1dBB97r69lpS1BvyOuX9eqiDr+hLXwUVsdl+V8bJLo+ivP6qcqDma1QLPF3ftsOk3srBmELoVmwtw66F4cj8vZ0bfunbm5NbMamvFvPVlbfaS1tPGXTi/c31DnC4In6EbjQGusxw6oM+yohWJOND/+KWjaPC9T1vpvb6fX/doPSMs5Yv2QCNjK/EbgRa/yPjZPN39JuXmomwM+o4I3m10oZWNQUG/Fl1yWqYydGwtnX3YqO5eN9UOhCSiOsTQoE0WHRqu1gq9L1qZTq1m4NacMawHkRr0bFEk8Jd+kC8hrNa/8JaeR5HBi2LFGTV3/sKhj0VfhgCzaOQdk1tzCJSBgUP6jgNwBRFZpEkTYTmo6oBZ0q0ZqgiCiWLqmoFHAagERdh69DWt6oZUrWQJYyJSp3eOSAbTsCVm7lvvHcd/daEuCURDCrs+F7MpTY7rgcpdEGEDYBW2iWgVv0Tg2kEIEFH7V+k6ulj4y1KdQQSjOxJkWjvHsr9eCwHFtCP9zXbRXMKxqqPbHR4s3tb2uqh0wBaK7tgBJ1F9/MogzUy3vmLf/ur2wzV/v7SlfsbjzJEUlgAiheIEOey1eyISEsWlwwRrCk8lO1BMJoDEfQ07XJXPA5adHMjGfkMUvt4wt2RohGFOMRJkCl8SkNF+w0vtsou68mrUNn7MgeKRWc6YzV5w38I710lVAXEkQkptgE0mOpCX8UF7lrW7FxKsXIhDWJwMQegSEdMd5jfYH5EfpDpgGlCVCKmjG1RCjT/+un8/07Tv/353959eppQ/PLumMBJ3F02F8JYpqyHw+PlcjL6z3/51+flsmyW52k6HN/42+eXl2XZXHw6HB4eHvIyT/OsCWnK92/uCbj4ebmY2enlZZ6OKnJ6fjmfz1+/+TaLrptP91my2FZKKTSne1IFy6TcynqvmLyUdbsjl5fTtl6mt/dznmbI8+nl5emTPt5P94ci/vb7r7/5/rvfv/vjn54/fr48y6TTm+Ml6z//+Y/peHf/+Oa373+Su4ec/ad3f87H+3x/LGXZlpef//DD8W42P2vGX//tL8+Xp3U7LWrHLCq+bs+nz58Em8iWZKstjFXJZPBwBbZmiKlLcRcgqSZ1dyPNmJJOmkZPP0a2E5HcaygF1rIjqYZu5QAUqYgW0Vtj+MmewYx2CuKbnFPYIWYGWKv1BxqYWyVH1GzlmhzSNcXQrlRAFU21NACRhk7RWuzoYKRja3JNrgIw6DlSfNiYUsgVFSg1OuhEdNylbB4h5X5E3BUu7uLuZu7e2qSrlAI9l7JeNvm88qcz//DJfvXj+dc/Le+fsYX7azMUgybLSnHIBoS4MKgAogoBaITXPn01N9sNgFVlAwJRYRLMKgfRA3VCErcsKhEsJM0lW0oGNagRBrhp+Fa7Ot0Wt703ML3mkyTJIpLY2VnlyUIW1dZFFdEsmtjxw65ezXWEG341hsOjMmCowfSoSopftadWmdIJq1Fjv4lguKSmsMvwUSd7uRIWNU1IlUOr0FHzq4qVILrMRujNao6xAmiNqypeRiT5uEMlR2DQzLpM7qONAZTAgxcNhazPaNuKiIR/PTo8hRgalaEmxQiItWbe/c41F2QQEDeK7KiiNCviCiiqHsAxaeqq/nWfe5uVsh3XYDM1F2A0osLWrIU+NSvI3YOiOFxff9vgDcbB3xDq+KGwhiv3JJpeQsnq9a9uyqhhbjrSl8yDq0/6TQQgjPCWGFujGcPK7MMbgWWjZuOVuXq1O3ncQlZA0fGinlgGBkwfq1e8nZT6V5rxREbuW6Otigqm9b327dNYbm8qWFRSRh0xorw4WgYDYI1KKsOFLHENFDUJpQGC1QwTeIpPAvW5LlNck7vuGFk/Y/3ADZCFtKhIsPFBNjRLjvvqiUjto4adelRVCJEkYXupeARfx5u82pth+/dPIuW0cy2OVwDh7xk/iqLknKQ/bjyB3d8/RjxeHdFAoSQIpMhZjRPYDmGs9nDY+ix6RGXf66vstP5S1HYRAgioUFemSF18HUDAcEpEahRQroyBL5/bL9ynRmni/ZevGZhyE8K9iuhafRnX4fUTX182jmH/isibswJkSrjtq5Rrxn+U2ogiEVBsTguAbxrDp5dVhYUmZKmJP0AT81KLp10j4hbYykCIQBOAjIZXUWooIn3j+IXVvppFFDEPS7dfEENQyVS6tzVsNBdbKaHMSSaE4u6FoHtxbvQkVlA22mbLZb0sbqtIkglgRjq4TMgPOr/B9IjpXnRm9Ah3YJqkrJNS5sNvn06XDfmbo93fpe3h6/Ofk5UaMt6QJZkXA+7nx23bnl9Ob88vy7IdHx/MmKd00Jxy3jZbymbu27b5Vi5ml9N5s+Je8mF+OT9f1lU1L+fLhHw3H3xxTPMEvZzOh/tvQDVzB3NK1dFM+rZu2wZbDqpaNinrLHEe8PLT+2fy/u5QlrPAl+UiCZrl259/9zf/8u8+nD//+P7d87YY/bzq70+X//7Xv/ruh+/nw+Fn3//w54+fn18+zw8PHz69W8r23XffpV/+8HJ6+vnPfvn9D9/qkYVLzkkVl8vzabtMauKLLS+HO6hsAhdGfwTllHNWp3VlVYciOe9Yve6BwY/g/e2agQzC3+/dlz/e54tHQ+S2GKhR4+0R7yTaQ6wj0d5+UrU1kgxVY/ReiShUWLtXhCgXpxEJzdYNcZE0gHwowknFIWDU5ViS3C1bUJkkGjAFngNdCAcFSWhsCQ/hE7FQRtw7ezQlJ6F7Om/pZdF35/zbD5d/frf+4f2ylqPkKNEoUGDKyOIBahoSVBTC6MMoEDMHM1rrnVZGZYETGXJLRJJoTukgacY0M4uy0MXnwuJ0kwyDFNLgm2ugDF1rdTdbA2BP+kdjbOGHby136tZLBxK4ZTjBakZ9qd08fojqaoky34ixRzJtPL/ZkArQ91qUKzEwkBkH5fUvyZQ4ETWy0y5mJZRBQ0CLOPS537iBqN36GG/uLUUZLd2o8U7tGW6DDP/Sa3dy1St1GFVHzWKLHmiEcdoN2SVRHefYCaDnBI7ooPu+3Ohg41f7suzKVVu9HmWoJzdk7u5ndLb93Nfyy69WEbTfrSK790ykljSoV6PapX/nJ6NcGyfIa+LhK1pC5Xt75OFG6WJzT/d/vmabIx/7C88df7sfivag+nl/5ZynYcTsKk5xOunVzNC6UqGQmUjLwGrEFkVMGlNAtdPbQaQIFKztxGuJFbXWZDAay0gv5SRQgbc1VxMwsmqoFGEUGYsLNIloQkXmFZdGGhKJzUEjIlIjm6Gy7ucj1+7C2je1KyT9feAcRQyxNRBJo/BITYmPIpxRT4qTTwFR4asRGlXbevIqTb/ud/tX/7ySCITt0BIUxQDa2z2y7EVGKhlSRmq7oUUMDK6zrc4U9rMHAvBiklQD9r/Cd0oD1kVUfmP0kbTK93CQxa3cXQLUdljDYY7Vk6CxHTtQaWsR0Ep19lkMFvz+YEBuO0JesZtxQerGa4if4UD6K14vDpGWDFWNrHGpdvkyrrbsWk6NS4igFWFDWiY+6igSTUQcahJ+jWppVzDgRjopiuyKiXuqaQXhbgyXpBYz87JbUFpXVygamY0MlE8YnIIkYqgduKNm0UXEOeerVdiXTgc5FlGEBqwmIhXwN6RBpC+HqySWqyJYVL9OU73ilKogkD2yw5x0kFZYNhb3stLctrKVBdtKU7rACxR4822e79L8wOnedGJKiIMsB1AnnJPAVBZJv72U/+eHkx7nbw7fHD7803JelDar6pqSyIZl883o9/f3pax//vGP22rf6PegXmzb1rLYNuWDTtnBUgopMN4fjp+en07PL3ldX87Pb7/+CtT7w/FyWs4vz6dPp8PhMKc8Hx7y8X4LMEjVPE8oMCvJHLTPnz7cZ1W6l0sWcS8TmYDl+amU4sv88HD3y5/97LwuL+fn//q/+d8/n5//p1/9h3/642+KUaZ0mI7vbf3v/+l/eX85+8dP33zzzc++/a5QP66rTvr1t1/96te/uTtO//bf/pvf/ebXLpvOJnnT6TgdpxnTRcqn56e1XObk7hffXDJyYuDDaHWdUEr3ikooDXGuvTM1ERlqEFUbLso1Xl4tjL2WgkCtFB89I+H1T+kqUIldWdlhQ0cBGeUlYVkIm2NMUKFn2kElAzeo1VzdOAJERLXW+UJIF6nA2c3DgWgOplEAIEwqSrjBxSukWhXwEV7LFPFITAq5YkwpTiTCqxcraZTiMNICzgaSzGieHduyPi353Xn63U/2qx/XP3725zKrTGomtDTRZkUORpVRNNw4iH73okQihS3aGVF5EYuoLiJfI44qISKJopDECu+VUNscCFWQua2eKBM8g5un4pbIaB8ItFj+bTrQl19hGAxctDkWQ8h4A6th2+3Octu/edshXqpKjRsgh0YAX66x7LI+vBId6Sxk93iHmxtiN01DlN4iKPQ3N74tqSpNEipZVfy4Te9Q22WHcFdGm2Ec8XZpZQKptlrd9Qu59daJNOlFAA1Kq6qnquE7gTeTRqRvzbhm3kVorYtrOxJ36yqsjGbPqLgA1FaDUYdH0htIev+w3sY7TcWkhnGM68nBYzV+CCBqdJrSEw+7nVZ74v6rv3Tn2EZe11R0va7dx5tasjNGeZWxPFw5OC9226mv6miIyjgYXKGtoL3ZrYjWb3g3F3PnmDsKUPXPBWfvNuoVZjybstZeCbW1BMUlzIjQ6QlGmks7hV3dqY0WEaqMIGrLWiuN9iCpioJWvE7WcyWpBgqSJobh6crWgaKiO6LVtGizAVDsaoFi/frbeEVtcRyDMc8VuyYnJL2F6DQQnYzmNUsbwx0RruKGuhNKT7+gwVPGbkk/MyA7Vcd9SHbPjNYs2/3bWuAyBNYFIqq04uIJiUqhurhQXUyvQoT7jkfoXGo8D5EZZiRpyoqeC6lSue6dJmkCcacQSijuffBeTFrUUIOzq3S2Hm4IgQEJoKgSmQ6K7Uq2SKfm62OZpLkDoq809hQgQJAAR1Qr3LJv6aexxaoqJUuvbSDpQ7zDqwFwWxlyJQP6+44CxJZg0ChqP7r7CZfWiF5MRVolnVBg5qwZB4Coi7f0BkaOUYvUeUdS7+QXKw4KhGJs/kdHQKcBDktTRqDjtcGTFkkPsa4ApVL6bRJ2c+Uzospodq+2+8eehaAKWPQ46AKom1CNCSImyagmUXwspFih0tzOpSxr8XV7KuupLCs2i8NDFVhCmjAfMd9jfmA+MGVoMy/TBC8kixe3DfOMkv/p6f3f/dV3L49fX376w8v55Wh2hDqLF2xuh7tjKS6EkrKtLOX9H/4AzfePb2Q6RPIDvGhl6AD07vGRKmnKULlcLl8/vHn//v3Pf/jZR/tw+bzRTTWbI813GyF5mlOmlVLKdj4n2+4OB3o5vzzdf/WV2bZdlvv7u21ZHCaFc06HKV/Ws/Hw7bffP7hNz/Nvf/2bz+en3//05+fTWR+OC7mW8//wm396d3l+/P4roSDpn3780y//xV9/o+n3P7372c+/fvP27unjp/Pp47/6+79Os7xsZ7CwvHz++JLBWTFPKGbmK2nL+TwfNB/nKSdxkNH1BSlFWkr4dqr3o0eJASRNDvHYenOdJw5tB/urBR73IyNRi5mCWqVmGTaMMJVEsY7afSM+rwXe7teohJoUpLJqMxgzUprs07RHKirfE4EkVygCXVpUsocyGjpwcNhU4wBSWZh6DXGJ1vC2K71OBZAAzBdxMcKjUnRSdXcvpLuoQBGxPwMNFDIhl8iENX86+bsX/+Oz//bd9vt3L08ngR5IKWUT4XSYJaNwAwmZUABWIGuhkhJdGEGiMds4nIjmvRo+85Rckm/Z18Sz6qnYIr5B3EQLzOHuUfWpzMSqnAxLwiRI4RFSauh5nTYUHk68kRIqzAXgIqnr2e2vaICZs+ZvhJhC5Uj14r5nZFOedxkaYrXjQ0rNXd25XNU9rz4ZCAzNzYTq45Gqkwyk65ETKxjH30QGw5E9wMxXwVI1Aaldj1QyRERybHyha9Rr1Dx+D8zTK97OvfsVUMFHR+2iq8i7LBij9FWjrUvlNf2jhuZqPSejGVfIj0REOrTXRqnVKq7NpwgPdLvxcAGRwPGlZAdpSSHDa9fCBl912w41Zy/dbl/CQjYBaLvTXurN/00yuoCHU7L3UxKRltAoIuJbEeHNaEfVtxFCNT4DknhUsoe1DYP2ivX1Hex/RybWPrT6fUWyhVCcHvEYXqVFyc3Y2LOagejASIrDrUGCBh30h2YOnrmIu3uPhVIjhYYizU0Z5ZpGRlrVaMEkATqGVosbREa3IMzNeoJcanES0MBGs0gAK6QUtgRESBpQdS9zT1kBMboTmhNEjE4LZ28oKtXgVglwMZiZu0EQsLhuG5IrgJ6E0NZrTgGAHxhGFYwfxmgcU3kBVRB1xMwph9FiJLziMidJRuvgGALvuHjVlqDkNImIBwCjqlVs+AQg2LI4AwmBqChVjEBtcJUkxa1Yca/gp6HZaU71SAHNhHN3z5oQieWgRxqIJpUASzJQKW7tfAHYrEJ3q2jobiI6VQB+AC6qDHpKWTUbodAkEq5cEQkLu6DW16MmyUE0AcxpGoh1rzlzBE5sItW9uBFQyZmFkRsmIvTadlRVvYUyWQ3uZmqooDWSi4PnNXTYQquCoD1p3H2QNwHaR5C5eS5BJtnlBNnQ82LgEA18pMhSNe++7GCjCWGpKlmNgWD/1jLPgEh8awIqibtbNbEFKmbFSYeTTjdrAXGnOZzVDpTAGAG8OMMvwR6UYFjXmggkafaGlKq7V0oVQjVyyeBWRGRKCm4MdgwptddBbtwNVbYBCNgvzTBlAF7VkoOK5EzXASo+1dwS8xRtZHUq0NVr0gngCiM56cHX1dZPEF2xXPhhsdO6XVCYqZPIUsxFMM2Y7ku+L3mWwxHHKSqaAIUXgJySJHUr2Ar0mI7fvcf8Pz49Hb/9l98f79d/99+9PH1MQrrBpsuLvf3q/vT502TLvabjpKX4w+Ob6e7x49PLm7dfXdbVlvXh4Y6hs8Gfnj5JnvJ0/PD5493dw+9+89uynM4f32VV38qynB+/+UHvH86S8vGQ82E5v6zrovTkmEQnlefL6e3bN+4lJ83Hw7KtOk+QNB8Pl/XsAk7p4/nFfvrpzf3DJPPv/vn357IYmQ7HD+uZj4fffHinP3/7v/nP/+7tt9/+7te/++GHH+6eHr/65hvk9Pabh1nXb3/+Nv/1tw8PefPzlO5m0/X588MxHXle1vPztmXwMLsVWjEVpaeyUgpTSlknoToLWRAdjwmHB+JNrYttVmjWBEUp61qs2Br4V2kAJgcwdTOVUWWgldV7qPsKaeZkNAKpfoAUiWlh1KpKK1Cpmj0atAurzdoTfwG2vl29LCdIN0FTMlCoe8DNa61TQ3YPrVxTyioZKu6WUp6yqmjUTKY8pZQoDg3vlIoQ3ODqUNWpJlNJzVMREdJ0opVVOCcmLS4Gh69uzOqbr8XMLBJ71Giui/Hdi//2E3/149Nvf1w+PxWUCUlYCCRO8xY5RE6gAA4XaELNQK3exGAnrQAoN0SwUJ0uYKbdT8Qb6FfZH+0ll08zilNW06IwNcDFnQ4WpdMNahrNaDIEd8mx5TuFuJlLNYUkz9msBL+r/AnhYoqMKSJlSEMug0LF6KxxeNSc5spvqmboXrmciGRVmu+Os+pCZy/G9QCZ6146ImtS7qwezW1pNjqYdh2OYFhIsufcQgSRPola3bw7DXXvZaEMh5cAgIajLegPzUFKsZZlrVF6I9GOiZpSiG80dEsQgZpaXZGq4Qt1jwhvZrN1taWFiAh6kkTD2AinnptFamkID2k51ZBM8eJowZJuSHQ3bX0bnZlKuLdaSBqCiPn3ZRnV35BykTgRotma7zYUa9aiSW1sQ4SQht4bPlWL3smiFLS+a00pVYFFhnGCICEBsAZVFEsYxjsAurlDcgqQuhDf5hYynrWlCdkcbqG75qnSQDhk2YxG3x24IzHE8nVvXTXS3K8bp4Zq5EFNutkWrpAcamlcKTX74tpyqJqch9cSEZYUgUpVh+JERHjPIZK7IO93CTWEbBYlW4VeC1PGBjdbeAg3SL15TQWhQm4L4XfjpK6Ut4tJMio2qtoGuQrbtYLUuEudFCCa2PS42EhR1tp/QJKqZgRsc+izVhweSQixONFWoz6FXZGMcEbABODmJS2UE8XwdFGq09Fifm2yV5Zft73aYnUKGNcnAUUkBX4ZxxUQope57DdrSmTdvhqdGJ8LpOqzFwgCxC5BKMhCRK11hz+K7XZRUhKEzchwMhATaB7pH+LGpIpJIA2oIQFQyUM0gH3kBJA04Kx1DGNVqy3WPLTGRBGIV3TXwecH5JqCjH3iItGCrjkNq1FUsy9bpCMc1H3Bdj/TlQ0tlSBZOfWoW8Sv0O9XKwCHLRj3cp/g9XsM3oubATh8g0Cd8RQB6QwWGYlYQo3SV4grwFqpzZ23Cji8786SKJfpjop+KgN1NzgloIzOXlRCQvNCbsewSSlxiPTOcn1GJN0LMEPiTNT7I3hIQ/YHQ62rPiF3CGAOq14ZhRRR2GZgSpgTc3EKzX118XVdy+bh8/Eo5NOMPGO6x3TE4Q7zhKRIytAf6VAWJGXNuYhTcOL8z2uyZ8z3P/zD3/9Xy6//f8sff/NW832a3ezp44eU/etv3ti2np4+vX3z3V9/9/1v//CTmnz48/s0p7v72c6neZ7hkGne1u1yubycNmN5fPPm+FaXZ9mWyyFNp21h4SHdFUsHmQWJ5JSyzBnrRrq42fns64JigLkoPJwIEiUQqqpJE7Can06XbTNVXLb14tua4Fkp2e/zcfrm/u7w8Oabr776Kk3p8fHxeLr/+uuv58ORpNEPM+c5aTIFtu3Msvl2WcoKX7wUeAmQCFWfskqUULhYOI1zOJGThgGvpTGcnQWFmdjT6CmSVaX6mK/YIL70is9zMwwUEohAlB5ACACrxgHqfeJ8m/TKrlHDePXQ7tnbczD6xa0qGNSW9x+ntz8oKrwAhKmMyPuXKjSSSBLVFsXVcALViEF4HwMIE4RT6Q4XTaJRk5NQ2wIp3MuyLtt6Xi+bFVpNzimWni7+YZl++uDvPlxOL5SA3CwbXKCCBEGwXzJ8k6EjaOX+hDkd3kp13BAJXq7BYCAETYBEOSgesj+mcp+JSwHgiKwkE3oilbKuRgfc1V3FJyUyVTg9phRnnUoKRNzZADOq57LTQc/A/SJhkDSpAaj4AEDr9hqMd/eCjzpDu3vUAcb13jw5zZ+2i87/xIsCQN0pqCnkldI06pcSaTeVCQBq+TKivbiz4ZujqtLdo6/CyN/dc/prIW7VjV7DkddRsSnn/gq0h0OdW33ilexL/UuRaMS0Rzua2G8KUGTq1J8m0sLBjNY8uEqc+PEQkWs3fKX9j7P40vr3G7K+wkOnrfQf3fATCUxPehz/WrADkJ1Q+i633Nv41e5Nr5mMpu7su8jmJRgjEm1tnYTZNi5s8zyETYgbanRBviWQq2jk+LlodfsJkrcUGQCDfK/3Gn/L6CkrLSRSm+6wxW2ULc830un2FKD+ul507t3VJAFerFSWr41dArv7oE494qPxoUp1/beSAGnJ4n2+VaXSpnVpX2TsxKrRIbJvgFRLqxYwSfXfXsXIRnxfl9reqzYkJgP3PFVbvmqVUAmAZ430/UYuqOZUNUCb97qZ/WMwpEvEuCIM1THiLdWyJdmdEUBEymopWAqIukp2e9JIV5Vjfl30VnoICdXyoETUd6upnZZ6r9q6If5BiQyrL7Bg4qqXO6tHvroWtCFL9RG2+Y/6bjeZbi2iuhrtEwRtVK6VAFfNYRjuhIokmnRPzeLQCahSYXRgkbrou3HI6kCQ/YmNUXayqdntHp3zviyTxp+j6vfe/YbxCoZtMIEo8qvfYtz6fsPgMk3/B53RYDkGkkSa170iNTQ0qPhhDd4BkCvDuybXhoykfGGbw1DQ6y9Ccaz1F23z2LBFq+oABGMUgHTR60zQyP2nVqyvyCl0imcwVPKwaQluE2mkqcMTASI5D4I7oaBQDMm2skkhIGqU8MUgJeiEecLhkKdZp8lT60YsKuaAULJLaNSWYbPaYtOvPl9+/cSS7pY3f/W3v8Tjxfnjn7y8HI6TJFl1e7bTlJCmCW5//M3vnj+f3/7wC5ay2fbyfDpMmnVaXk5v3s6Pejzc6VKcekirb+v23eO3L/55ng9PUg6q9/Mbk+P9dFfK5utF4AfHtqzYtgT3bUvmMEvqk4t5Q9Rwt2WlkBs0pVlwXi7n5yc9TAvsydaTbz5n3s3pOB+Tb2Cxy2Wd7+9noKREoBDlcDycLxdhyWpWSkrJCkEqyuVyTizYwU+gqpJz1JqHUKyVVJG1VwH7YWZOmrtmTTmFXA3RVFkNJ0TcGTubQrcYBlWgHb0EIKe5AVzUfj3hWuscVUQoVzcEEIkTge5SkygiwhydSa4cSdWZB8BYmsCsZyL8kGysaTdxwmPaZJIwXEvaa5wG5g+RXHyHwqrny51ShBPdORwzYVW6Iu4X7uvidt6Wl+XyfHo5Lxfb3Iux0Iq++1Q+LflPH/nTh3Le7nR6Q4gvG3QGFMyCA0i6w2fAkVKsuEZDFRdYYP3EZhMRzK/MuYJuR6HArDxkPebp0Y+F562YFZoX37s/qqo6neallLS5bhQjau1OkJUFyPOgYFzZZvzS+861gskFT4mrqp8eKUitmxNxhXa1tTKwKwW03aKzN3q364Bd7WvFAZUMAgd2eNEh2i5ic9NDwTBEI8kg9NSmcYs0vigOVqR/tHwg6bUK8a+r3uj7SPoAe4bSMLBGraqqrImau77U/vLm7AxPsa5ISB8wEIK4P7cpuIJhI/tBbk/cfZc1kXVQIfrfYUb7q8mO/Yuul/bd7IniXd7tuvn+/d59KHzZPso9rVEvRs47GOn2smPe1PKntiO7mj3Kfb4uTx/0zxudPnTR4SBcXb+vQBv2zSOqzyKcpK2s+WY9a2ZEYG1LH2QNy1SgzLpiBJDbFf3uteg+fhXeH2cPHwha67he4gdU7b/XUog0FaZNWCT8QNr+huvchRqWSYyvBtOuoBj2NwGkGVPtcD18TUF/4SUiCk3TYTdGI5iBkG66a68DoXxRAxyO0O52Cj/PrgCj+pakbsPemZKDXf7qHMYne1+ReEp/4m4K9MEO1Maxx0p98H796ymgUVj4ZqQV9r0eUqXmwZFWP7y6RtGZ3BVBA0D35QP7d32xRwYnHRgEiOAV9t7PV7VT9cXUXd1pgHMd7WPV1lbi1dRek1CMqu/seE0/uMOHVydwfAV76ldePesVXdUhc2/ZfcUovBVg4LaArF1mw81b5xsA15XKrQDrVYlzEw/9hgDdQl/CONOrha/jbP/WIHSrsjHa+lbbIRhuAgQ0IIFOgQdKCi2ui1oeQ05yKJzd7sUO9KTAxJRxOR4e/cEunsTctgIa9IA0IWWkrDlJ0h7fUCElEp2nQGVBElVL4OVcfvrpSezuYbv//OFP/8an/+aX/5Ahy4cft+Vzfjur5qfny+Pj48M3j+fPF7dVFR///Kfp/qgCnfPxeHx6fvZtfTl9NqR8/wj6IR+tbEnV3VPK7q6SBVZKSUeFeRau25JAlM2Xk9imStiW6NF7FTTQaIWA+0aHpuSbuZb57jipntzKZi8o68wlyapFNSUWh51Op43FWL766qttu0DKVs5rWcyOJLfi04bN1nk+lrLO81GwZViKdJtoyg5HQKi1sxzRJ3dveOm9i9YO0tVJsdW61Pc5zzc+MGnAAGydgEdCkkinrqwMjS9Vht9o7BXhtjuT2myA4Bh7Y3vilm+MfF6klTxVzHX2Qhfbb35lwPTqpmYApMqPocQ+tWhv63R9xSVEJDGBogBdjHRKEd+KLdv6dL48n54+fv709PllXZZtKb7YtsnHT9unbfrplM6X5OkrYEriHi00w0JxGgDTaFzQKq1rXpN7uP8jheCaZbE15SXULcEUW9YyK3PidD9NhdwMRVYPCFEAzHMqYiZKFUERUuniYmtJc4Bm7IKVcsXnmz4VnDacGX5V6ctI4IqfWNtigOJeoiS0d4aKX0R/iVek5e2JbetFRCQhslv+Quhh2CkMJNqFqdTEZpBKRC746OBP+8+rLzP8w+xu8xtaruuEOqJOLV3OvpZH0uyH6pEhW3bZ7fil9mXf5f6NXGu1p4pAphIAGuoAaxKRtmzV2qBTKkxgrVlhNcNCG6pOoZu9+IJOPE7kejVGhbsvf39GYA8075je/DbeNAZSk/6ratHLB1r1btNelOyKLMaNHqX8rg61WqY+tT7Bm+n0afqr6Tf95LbqYLzb+In0ECt5o87UDaiP1ub4YyjbYFNQm2YCILeUR6djBwmvEcv2xECApAB7A4IIJTTve2XZjYAVAUwitSEUqg+l/UX7T5ReFRQShF+vW+iZu3O9f9vXvZahyZ6ll1opJ0liaAJCaAqo82r2CIYj3f0HrLmArGIsGdg7YkGq5xbNR9DspUi3FGm2RHzZBFl1fUYSWQcrxaBOdcFZOZ376BrvL/OtuWsFiJRGJZhS6iNHd+PUQuuoo2te8HicaDcEtZaB1NEMi33F7DCc5pG+gyPsl7VDe3PUpdlLqElocgMZNmy7gIBF3UVz+ElsmLYJhobZDfMYL/fGX42tV9+AoNftDktN1JhdL51hK0q+/nU119DwyFNdwmoV44YBAfAKYycAKLXDsYjIIOFaJ0i2uwt6m9Vua7ChkDuiVmQ3n3qu5KD69z0cPGHV/iQrsxsXfjxwVKlBXw0/AdW9Jj/UPh5iUuu7CdSySkqcUq1J/4Ck6kqAAAkRSotTWPuBZpACutJgiSKuQlEqPBccUn5jRVHuZDuK6wQeVe6mC79aD/lwnl5sLcuynNYNOuP4AJ2hyaTXrBdAHQq16pBwBQTZCRr59HTCknj37TvMf3j/h3/+/Hn7m8f/+u//1S/elss//yQvy+PD14ppXQ8i88m3Uzn98OaNFj9M8ud37+++/bpsSzpmyLZhYUrzfJeMTKv5djxO5+Wc79Llsk6Ph9lhYncPk3GbxNQXIcQ39ZV2cReWhba6b7EXZuYMA8AFONwdJE9L2UhHgk9ylu3Ddnr84du7h8OyPL34mg35MB15kEOmIh8mg9/NeZ7nYmtKllKCGLC6X8rmxdakBG3OlRtF3CuKmiODHWCEeCKEFvgNER1FUkGKNhDFSfMpGpxqT6QWjS4MTf+/1Z+aEB25hNQO9CIp0sPo9CghIHb2Ig20+4rygxlSI9FFVFteazTTVZIyBPeDUbNb2nHGPLS6muC3ayesnL+fnSvmpmEQhLSqQdc4RtEDx9013Wr/MZEk4qoCdcCERrkU+7ycPz8/ffr8+U8//fTx3fvT83m9bOW8loJ1xVOZnvyB+ihzxirQ40EPmpKlTClGoaWKThKsDK1Syj3KC2MEdRyB09HEQURyslvGlv2S/AJcwDJNIpIOqq7UAmeRktiiyNLA6MXdN6CIeoIraZFfyq7I1/9VxwF3mdVdEs1R242uXidKSPVnJNY+NOgypbH0nTCqyBp4IHfBJDe4JjsvHD5rOdu4+dyrf7OphiowJczR/B2NQkPuSJUDLQlT4PG33jMyEdLVMgxkNnLsLlijC4e4gmGuhzTTCmVRKRBo+POIrO0a/dmRD9tMW+pai0lJQ20gSWj7IaolMw4StXUA4bVMAVfnuh2v20kBHRZxdxPEwrH2kJEo02RNdGJ/dnXbk9XskT1Ngm3341vHsNEqDDwsRhO8AJFHXxPsTlSS/cSzqXm35kpwKg6aRPymtd+5tnIj4t37ArXH8NqZotVZVquW92e178P0QCMqqY5zVtcx0VH4bxhsGypFJEz43NX8/elAy29RtKSS9mPRlPccx/1KWAUZgdT2fZU0msbGduzr39CuyZqr1OYZfpcbxffGFLt6pVYTvm/MYDUOI2/V36XmbGlN0Gwvtgmzu7qEggCy7uG5VyO5saej5LcfWvahjU+R3RHS4wPs7KjeWfebx/UdNlu+5MkeN3hwsDu4+yFk8CvYlQdu1Pv3T71W9lQ9uyP99dW+Odh1ilfrj2FzAIYWMmxWm+XA19q3ETHYHW8hK/P1BPu7VNe3i4UOmfoqSNcXAS0V/ebpZAvRdv7bFIVYobZSIR7k5p7DRsjNoxujwMi8xtVDexCap19EFNLT98cbjjhrEB9iKY49u/HLRTg3S3FtFF1921+vVhGNc0VaRYrMfGhqQk8BkQoiHGer64MikohiMFfAs8pEmYnj6vNmR/jjsihKyjZng4odJ/O7t0pXzTndbcuaLhcuW0kHO77xaYJmVPZaanKq1MK5SAiCKKAb6O72+SW//Rld//zxBfnNS3r6v77IZ6T/7f1Xf/Uv/zN5f7LTdu+JZyvradsu93fHDy9PdwStfPX2/h/+9T/8f3/zq5zl66+/WsuGPEG5+na+XC6XE/0Ozpy1+CZ5yodM9ZRxuZwvz5+4XTIkCUQ29624gYU0l5rE6zDmMH1925YHfUiHvJzL83q6iJ+1nKVM3zzo13c26eokksx6/3jn4uk4IylhmqAq0yzJp8MhRWQvic0KlZKSTGopUqToAeIrIq4BfxWcX4WRPtcLhCoZyE0TAI/k5p3XAf0adIfFlTBr13R6a/diShWnz4au2x1HSESsm8xXr2DRPfNHRXsNG6udHC6QBsh2EwEgGaXMMpzK4eCE3zYcaybUoZIvgK2UGo0PBBCH18pHAVCR9rnru/W5IqJIweIpvrqdtuX55fzp5fn9p4/v3r179+d3L0+n7bRsS/HNHbpwXqcVB2RLhVtKd3l6UEWBbFFZwAQSqYajlSqkFToNZhWWT2qlQJuRd11ZiYSSuU5YExb1FbgQruCkgsNUkrin0IhKKS4CoYs7JqUlFxRLzOrNRyUpMjudkpLG+u8MZ2Q19V8NNKaZBH2dCUMt7q0uOwxOQwlHeKveo/fb72seaAeNmKGvHDc3Ymj8kM1Te0W0LZsXY/CHGsOsqr80t3J4P5v2NyhwFZQzTNDxXIiMT9wPETmeKUEgaVynV6GnJ/Q3X7Cc+z81wCkGP6G4dSM+wu9JBDVDYQ8ys8Y9YtZVxrUw8LUMvXm9Fs3tJ3JzTczXDT7cFs2z2Wq2dy94vPE6YKAnfoQMSlrbVkZjprZENyvWZeI49M6UMBBGn2a8KirjIM3rwHbHOm/u1u/gnamSqtWWYLW0v7yMr5Y0fhNpXdpLluMGMsSpMqIl6L5JaM+u04l7ot4SLZNbhuQuI3t+QtRf1Iwvtt82t3n9D8CQoiDDm8iTkRotZPWt9K+rMQbvRciVpNn0nt2bWmt1Qis0t/pNXUZt4YoWzI2x0kZuIgCFcqULNqNVrhiH6h6DA1wrnmtY015906qQauoFH3F3KAiTJhdqiikpKZHUlpsNAAMWQbVyW7I/yQB0i8ntCj1gfe1bA6/q6Cm73lnnE9XwVWeTJpPQyjlqiCBM3r4dIzHWA3Mt6dEMmMqDqi4YA/F+1FviUS05FpHI8Q7uRhWotvETqgxPYfy7HnYBGAaGhpVfAyFDCw8Q0nzzgLI2u9JaLFQrLsjaxC9a8bQjqsSXdPq6qGF4XGnbDHdpUzRaFNJkzxy7Eici4u5J2LoxhEZUK1Xcfe+UKvvDWJFJ41XjaeYODF3upSVSW/skftuELtsOYzBdSFpgANT0nIgGBq5UjFh7n+DorU4Vd09INeuQIYdVq7B0Smy7hxssWn8WTpS3xd+W8nBZ70o5ms9cMUUlui3q22GacX90PgCqcsmTybxwtQ3qhzeXfIdpggQSRLQ9JlDdPWoG0KnwDDlYMeBwd7iz59Pp0wfcHey7v/p3yX77/re/ksP/8fu/+/uDf/3+PT799FZ8PsjHz9u2iQEu+eVyyYnvPv1J7fNf//xfzPcPP318Oq3r8+dnSsqa7qacBGtZT2W9nFbjti2Gsi3Pz5fLy+nTjwpLxKSSQLMLSpkyHGa6Rcq8iQGUlAuMKk+XZynppaxP5bLNWu6mLaX5uzfrxOdyKsrjw0OadLo7JlvuHh80Jc1ymGaa56xZ8zwH9JbT/XiY3Ms0TQAmleKGamdCRVWSsnaF6wq3sGMfA1IRcimQFE1cCARqYWCvVo9NVH6KanMVMbTzkC9pOEQ1CbeVRkX7q06l1i3hEC3NxcPGL9qV8UE0FK/qiABhBohUmHOhU2pCQ4SWK3MI/C8GC6kqweuwXs2gq+5VI6OfqCBpILcIlGKiGl1rcZPX3mN77aB5qe4Gkht9tXI6nz+dnj9+/vTh08f37z9++PDh/HLhal4E5mabzQeliqu4H9J90hW+oKyidxQTcUoGBKo6Ja05M4A7SkEPLEdwTii1MWVr8kNP0Il+0G3WbZJVZRMaxFTSIeUsatlKKRCa2TwlY0mULXbXIMWlZBShkcUBqQVQdRyD0bWLPPQ6pb42oTXIGKVhK9Rru+2D/IlPnTGFBLpQCRNqQ0yIIuvqoo9yDbTEIzRzoykVO5uNl4GQpl8EBTV2iebaDwnCWrF2KymkcthU5Xr7ULzVGLTptZTpqu6IiFnXwrsXqdtRqVnsqGFPIGoII0TTJlaNqIGYr0h7HKeIRuZFcO8QhFWENtK9npyShb3fy6COxxsfipWblIfsEKepP58YVef9JlUvb+XXBNrxVIpEQ7e2I80lT0LTQCRCsqIC9huotDh2PMxEuq+qBotCCegzGnX9vW/uuJTXOv313+HbVz+ptmRjkmEAxNEcqfEaRKhrINg/qUkUjczCjQsmCCJiFEBlEQEYd3HPjw849mYA7IewwX9ETXD/XAOSll0TahMecqD7azwYteBGryvY22VVCa8lpBwMjxgWAimiav8Dv/bacW23mXYOcn2w41t9lb8ev3XobjUPgx//tpsDoNmGZuQ0ISpA4Nlot4nbz1mjJuxMMB5RLQQhhp2+Gv/NksZKtpjlPkez0vvRjLUN0zTtemeYRLX1yRXgUghybVx3AAsK95LuE+wL8hcMgDbmceX3BRy5yb6qIkhZ3KRBqQKIMMv1zPsBY6Qy9xXr+3uzX9L8GHr9xJuF5XDs4/ACu/ohLVfnZvxffA01yzv7GNcqVgheehrT+PTR83Tljh3Cm5E81kfbZyTKVg8t/AsM6y8Ne+Rl/eYUNMhX7B8ySg/h1eVfS5Ta+QIiz5kGQe3ogoBMnIu82fDtwp+92MOy3W+XWQzJLCkohWbkllSn4+Hg5kiUOc0uy4ZpXQCbHxyzpQTQ4NVxLQHDHvlvJmqCTGaYwgTHh6fz5SCb3M1kcZ9Od9+86Pr/+HB6Xsr/6Rff/+/+/hf+519lO33/oItf3n9+me/un9dtOk75kH7959+v50/zn6ef/c3fbrYeDoeU5+9+9vPDfPf58/PT09NF5OVyyTmXpQhxd5zFtwxP4lnKtqxGP6iWcuFWUj4YtuIrAArWUiI9uZT17nj8eHo5w9bsl6R6n9PXR1E7aXFKgad5yneTu6djvk9vkk7zPJPMk5Z164Q0pSyq27Ycctq2MqlYKRBkRegWvT/OmHLZVa524mLHd4JRrS1WvMmFTioi4qKyF+hX4VcJuz0iegqwvW5uhSYLh9RTjl9hP7nalZJqvlePSRIBpUWtrbB32EVqmeVfEFIACBNPXn1msTkCRNqzkwFY1JMOo7mhVjMCzl6k2HKOhRXmmU1LcXNCXVnIzbmW7bQtL6fTp0+fPn369PT09PJyXi9rchXPULFtSzJlKWYvMBxmUTHzxbgxbaIzNEPQAH2pofkSNIM5WFAPRUAIEOH0q6lBhFOUE7YZNsty0JK0CJk0pZSQZkgy3zZFgalQ82SmXmie3IoVogg26OKcKw+QzJaWItz7sDWuG6y4grNcMR7xig4ZyyhNiW01hDWVtHNxNJnSKp3CWmue3+ZDvRJkV6UoIK9CNK+Z4f6+m5wd8azxxk6lAdTNZjO33ne3YdhO7YH+1z+8khSvXsHgRoOqYry8ijzvcqRCJ16p1OPj2q9uzKo4UBUVozULi8Qx1LgBxjfjc6vvErz99ouTuhnzoKHUu6mqNyIgYZW4yd0HXX/r4ZywNfon7EIWoReZ6lUJhoSbDF9e7Vu2cz3+/r530+prOyqfQA1gvb7DeHG/nqRIb/F2VSfwl1jWMB4Zoo4OIJrmopJHza3I4x29wS+klMo2WDkNLCalVAyVS7NbzqBItAWJhoKCcL4oURX0tosCNO9ybb5AD1ev7PnZDVdGArNMPMQPG9emarRfCQdpkau0k541Efo4zVxEKqy77YJEVdNA7jXErNKrC8QNkJxzY937UQGavwQVDCK6MpmFZ8vHMx5BRpe9eqYdKtPWVMFZ9i3fZWS3ByiBxC4CuKboj6Jek1xFRIzRQVNcEDjyKqqadcqBTUOyuVQUgNuQvVOBLwPSJ1zBYvVxmjRFp/tYKWspANhV6spXKyam7tHbRuLdqrw6SP1MhhoxpMFdK+6tR4+HbRlgTDUDwbtXPmBeUtJwk0NrmyKDu9fOCNHftg6wkgGAqkdHLCvVxsPeJDYZRFsR91teKrq60VL6RFAzAlsjiJbTjPA5hYe01uJH9whripCQXgpzSu5eSul3iE655h5OvUY8vCLIZrJi97KE2VnlQiwqSZeoxvbek1yHQnaXaoo7qIIAQUdkRQciRxCKUSRZ3VjU6hIBBcXIQPqUzmsEtci3UGORpUFkJMHsfFj5/YW/+Ow/+7Dcn14O2NLB/MhL8meV9Y1o1kRRZ9J0mA/ZObkvKeOY5zlnm+4TH19ElrJ4udALt40GWIYkrJaOimJc7TgdF1e/nDErlMvphKngUh4evn15v+D89jL9438oLz/9z7/7w18d/8//6h+Wn/5pPX/MD8e34LKt89f3SzFOzJJ++d3fpmn6//yP/+60rncPjw/3b86/+4OZ/dVf/Yuf/eLnh+nw04/vf/vb3z+/XKb5sC0v0wGT+HFigmLlti0msLLatiW1CLesZUPS6TBfbLlczgYrjlMuLyzLDL+f+CjpwHR/vFzOj4+PM7C55eMhT9PFXadZJd8/vlHI6fSc0pRS7gxYRI4RFkiJ7lOKUihkFXcXemCJ01EVbiJMfMC9Eaq7JZWUUnC8IG/VqCDYdfQgYABRCe2tpXxIWVTJUv+/CbE4bC4Ns7p+FXzDRVQZwqhxexFNeRo5f7+Tme3KB6Ay1TMHklpDrztjpwcg5o5dc2VCo3ki40HB5fpJrCug4U5MgDoKNAkpUIgSUXo4TrY+xd0IV00UFLfLsn1+evrw4cPlvH788PndTx+2ZUmYWBGMk+ZMQU6S5+yZwEVtS+m4OtSSybNLRj7KfIhNoZn75g56gRtYIBrzU0lJYNFSpmKre57mCX6A3GWfudj65H7BVFQPOc1pmqFC6pTSirJw2dat+KbAnGYBaSbFEyc1s7MlFUkJRQCLHHetbsORgcUiE6CzjKIBkHA4ag0dVz6LChjSe/R2nwwUuieIcf9LH8gDUQwtAFKa0OJIPXkAABVObyXUURSjAIpXFMQYi4Fdp/TwEDUQFKeHt4WdA7vUqpBd9iVGmCRSlKFpaEhXBQMUwDTVbO2eFxrdcmuO3uAbCot020xaVYq0fJiqGQskGs9ZU5ZUPYRmz/UI7a4XOVRydaC6ky087qVpgHGyQKmNL7tBQqGw9cCJYsOwsWoPxcDvAkTEK9pTYm382iWsxHNZC39rJ9tY7ZDraH3o2aI0hHdHQM8wcHej7fdvplvTxAB0ZE90MSsi6BUTgqjncRb6DaI/+kb4Fb1Vku7rP2bByfDVmFepRCEDEi1ULvddaleVA7eQLZJaq/Lu/W/JJlKTomvZc/hlczygzYEitXZKpKDW/l7ZiNVLNCQFMXwcWnvDVsdgaAxaezr241u9KtWH5CJCrdA5VIlePB4af7PGmqEWVBWa1B5+yrkDGbGzFmCHeuy7MvKboKSmeqFvwys/tLhb956Ou1jL44ceAkFgo6c2Lq4pT1XrHGklbhiOq71LTs1w1N16Zo0DfCkzNbghqm7fMImbaI0EqvqIOsfhh/VVtcSK2ZAkml+G30tD4Y4jy4quWVV9RQD2Q/oSiUg7MCK7hbp7F5KOJbb7OL3Y9aTiMIgM1tRr/I8KZlpXGwBH0MC6npJUQ/9mBxDvW82W89gfPVZKXH2u4s3Zw0b66Csf3az/Qt5/HU9dlSsK6dfcTP/m6V+09Pvn7ee7IOwPff2TfY/afAcuP7r898Tr4UPGEa952DfBAaho4PxExXBNAReBcwU8cH4FqmmCqHByP5by5mX96uP6+P78+Hx+OF0mXf3eVyHuAIqbFqP5RjMpBWaka0rTdFAlC4REhk9whzm9mBkNJjBBmkBQQPFEn3xlyRczSELgwolAcoqurDgiPzzz4ZyW/8vv/7So/VePj//F/fRoPE4Ptp14nATMx+NBMD98fczp5fe/27ycP777+OlTcJXn588P9/dWuG3b6bRYuWyX87a8zNNxmqbl/HlKLOtGKylPqkAmpZg71JndxQ1cfF1ldZVLuWyZdjfLw1yOaZsFkycUHhRJJ02KnOYZSQGRNE1pCifUNB1S7dzsKWskPSrCqZqkxsFrz8WRv0FuKfA1PY/iLf6Zowj4FcW17qSRS7CfjuaB249Lp7ogt5tz0R7a2czOjdv7YCztWLEDEY75k5FrE8lqQbEtGhCKV3TQ8RpkFxcmdWlJSqEyiDiQRTyaYTUlQSVJbepElRzxfK/Nla4ilk1W9UCEmrk5zOyyrZfL5Xw+Pz09Xc5nmsEhoiIJmqJwTXKCTpKSZIEaWXxzuEmelIUaHrIs0rIAaIxELzeQ0RUGTjhdCj0Wvep/ZibiOfEu+5tJ7yMita1FJwWzSNIkmuYpTWma5/z8/CzFt0IQRijFVzCLC6jUDZo1egB6kpvAbWMa/zFK6/wHzbESaZM2uE5k+K3ZjsYTDQ7CtXiby9VeweKqlIriAVRl62YYVdG88uYOzl3dpfOeiIyal8PQQwVAh7AcJVQ0Pksiu/geKX+QpFVHjOGNWsGNwIqan+5U7VMZ5dcofUYJUj/f90IazQoqQJBH34PIlgHQqvuSED0xpN64Agz+hQ0YFhnD8vbrQ4OKpzuUw5gRpsHYk0HGuSA6qrR2120yt0MJd4KPKTP/yaEOWoeMXGgc23hx/7DnmNywuPr3+npl1f7alfsYqrb2mq4bYzQOTsHKEiPumuC7cznXNPWmYtc8wKroyzVRQURSaJuuTmedRgCHBP5C64muQG3KpHsulTRfZa1VBgCha2D8R0IEoBKYHdFEJTziVJW0Z8oFRoWjoetEtQBaal9f9z002Ba3pdaM5B46LYGaslkV5cherT7OMf6SuhrUfgGtHU+0+l3QGJag6t9at1B2I6xv/+75DnUa6P0rvNU4tKLdpuN1L0LYOnRS61wqO6tb0X0bVeqE1SipRqJCJd3tlojPIIlGciGhiaBoEmHNTYyms5LCdBil8r7DV/bSfja6DEdj5XVwrVMNm6QFRJXuVUsb2GtTfCVkfEOGJkkU95RSlHiEdFaRlFItpangzaGOe+W2TUkNqukd28lqg1VHZKCQspIvgChR8MiVrJ81E6lnB9VGXe3oA+3sRc596qd9EGbeKBMircatskVH09iq5c2Rg7ARyG4skRXXLBCHes50V6EcNVkabS2A3fETepXVNIzEnmMW1QvNNOOVlaIjRjBAIloZ9TC/UrLIBD6Yfb1sX50uX3043X+4HM7rzC1hXWdboIvqpmK0spn76tvG5bKahTspTSklGEop2zJNhwOKcTPf6MWtsAhUkQjRAhEyCydbuV4WFlJgDptBmVC4FdgZokc5XF7OePz+fUn/t4+nf//u0//qjv/68Yd//MWcz++FL1pWzElkenI9F//lv/q7y+npd7/73bq+iFNEfnz3659+glKj3biITppQ1P1l25RGh9K2bVvoK+DbtvjFU0qSZaNvdHcxuifocdoS+DDr2zt5ONgkRYopKDimY5pyChsiTytcU8rTdMhH34qZzYdpnuZtvbhBkIJqVBQIt6EmCGGqanSoUoSiDpFBTeerRGaR6NotAFQyJPTLXofTwXabGO4C4vom7jVKhmrGxwmuzaK1hiFD44h4nAOo2dLxXwoLU8javlpEGtpvIARG3kk9EME8NE3Ni7UXJKhQzAhSaNGGm3AXZyC2NaHsUVWjrCAKKjXi320nAaLeVQChipC1CqJx+2AL3ticSHKQgkLfSlmW5XxeTqfLy9Npu2xwJGTVLFDRSdOUcGRKyEdNUxIxL2Xb1m2zyD5VVyRIEpnr4nOFG63U2hhBNFgzs6qKuoAR2lOIhvDN4CHzbsIR1CJuvm2byCQo86xzSMNZU1YFz6suy7IW2KZiSmLFdlDBJNiAWWnhhXFldOptQm7IJRvkw64cB9ft4mPHKRKBG1G7qbdmWxG89sp4JHQMl0Hx6rhzXU55/SpcdWB0VhShtapW9GyfKkxbML9tqISupuhygW0mu+ERvlTvuhFb61URkahZDwdrdRrqYAYrm0ZR5UXoxLdZpfuLpOqANRdqpIIUFYkYLLAX8d4ARQBdSO3/buMJWXPj6ERbq+7Fi8LTSu0E06tRhvYog/hrzIZAOPKr+8DgXZEQkVrE02wSkYirRz6I3+bHE4JAN5LIBVJAVAwk2LwA6KtN8mruIoEG9tp+6U/h1RTYtzXe9PHUXwXPARF9r1oFcnxbjUMPCKCqQcQcIPW3lTkPsDQj+LvUfJOK3sSujLFzJqoKWXPuc7P22uiqv7nrE4I9wzveRCNiaIK7VNRAItX8TsCcVS0CKDCLoasIFCIe6DsMPTgowCXahYgwpV2TBGqGogAp5UpyaIhwWuljrMfd1ZoaYLo1zoL3NzUIw8Nu0tbbnVRvIgBxgCMWM6ZkABCh0JpLmL2AqSqIr1/iXYHrK9xIUMfL5MsoVPveMak0Jaz1HIszxYph2n7OFrPuyWqRxdRJl2F8aIIIRUXFIVOuWUBN/YwB1AKMvg772AYFgtzPybi7w6FAqllGdHcvpc10N47H16t1GK8JBwlVY0H02s00GNRt6b/o8v/i49g8Lv2DcdYhDLo9BMDdI6Tbf36zCLGY3dukCWQtyu5PH1Wxm1mj2YH122GRu3NKXh0BNvO1jkd22rsaW8sFvxn/jQNl/C0iy3WX6zFfh3iIVRDGBGZgph/Wcn/avjmtX79c7k/n+2XJLBnmyf2YcJ/lXuVgSMV8LWUJOwD12CEJvLgnegIEZfN18gIr7pu6mSWQcIcKPKRLIgnfEg20shQYxOeEXLYVLEhCTzpNVF149xMm3t+v2+f/+3/3P/ybv3r7r3/2+Lfffn23nZ4up2m5fII/JPzw/Zt5Vnn/HqpwS4LlcmKxt/dv13WlWQpcBEcxSppW1yQZylXKZkWUTNzEVUFwYbmUzSlMmucpH9PDD9+UY/a7qRwkJcwyB/j2IWXVpJpUc6mWe0qavVZ1sqUbp4DoFgmcSkhFcWXzlSuQ3L1zOdVbkXbN4m7pxM27qJNeShTXeCQoZGiJkrYIuvcbVjphp6Lkvo0kB4zeg/0wVhHIaBMWJ0j7yKvLvNV2AmjFVwoVbZmTADqO1vUp25/u7kanhxIw1VBiFNkLxGxzS+6kEEiarITQ7L4DtBjwPn4Jie5kNIRyuKE417Wcz+fT88v55XQ5nWwr4dhqXEohqtNRdJacqYBvvq3b5bRtKMIy3/NQAkcYISndxYv5ikh1V/ZiOxFBVzGocAhI9ZRSpiTZsq/KVcSSQlLazLkaWGItNYGSSB6PM6RITWkwgwFuThTnSsvO7CIIKAFrXURHQuLApkbCQxNnN99ipMM60z0yUMFFIoW25VwACLddc8BheEpIhDQ8fc9kQ1Og62Do0b9kpM9O/Dc56J0zY7/FFRmE6Sgi2gpz6/iGlOa+IN2tievX9WEJx3yl23Ew2A/Ofvl4DKX6JQXRdPrVNVXVbi6c0GHZNMYQ3IRfpaTsltPVmbp5DXOUVws7XiMkNYfyfmWAdQneX9j3t+b4kRQhtGq84j39J7CTQk2/gaGvNHAjPcen9E9uvhqTecbNCm7Z7owgHZK9/xLJceZXkaib5epax1V8Y3ibpAH+qKOIqPRYlFSLLld3Yz2VYRKFzK6VAyEw9lt7KAweiUkUOqtdRgEjhy9q8UUdULX99wHAGqk8SaNMCk5VCqFIgpqU3c+/1LznnS+3pXFAVGur7b7QTo9mFTnnOL9dial/mwQa2RAHtaYqUkAo0i3VZ8+srolJ9SZVtw7bKSBRsNdZXmmWN8TdnithrAPNKwADlM6hJnjU4UbPQhzHUL7DV0EVEajXTYLBRGoH2Uo0gKoQzgr/A2ok0AsDbtKbXSkKVQYIj6TK0VCDNV1J7O9HQn993OuCt+qrmPC4SjvTlwq9JA205vqCQTsZUMcIRMot6W4iqPiFEdIPmCa5QvaNFfSGG9r57Khe2+BsiMFGPDF2ZJfuDX+pv0c4FB028m5pHoWW/UAyWjJUr49IrXkYSb2NOeIk+4EU9iBguF5aVUv1fnUrMfikAtU1z8FgGDmedQdDw8mqa1YfmMaDEHTYrIlhDUnC6CpOIFD3WmEwMz2J3INH97yUx8+Xt5+Xty+XqawTL8B2ye53vn49423WxyQHEW5YaREMnFKGSgVhLBY+AiRstmTMqSzFVrFCs3pSuEFytLei6Ca4iDNLNiubSUnJVaCrb1Aiy1I2memXs1ISpnNJuL/7g/zxn//n9/9QHv9LO/7N3fFvDl99f799Or3/fHn6028+vrk7nHW2Cdv5pF5Amebjx8vZi8Fc4LYVeJnzNN3dX5BJCrGirNtFBJqTs2zmSbVk8JDmx/v57jgfD/n+Pn39KAmLEupJoblqJ7POcFKSCcwITXM+5Dyt5yUpkiQzKyUY6nVWsWqcAmgkLVePAaihYtaE22izzDExL6jotfkdOaZQFZh3YRJMMaXE6udjQ5Ajmu+/c6R+t4DxbxHUyp8AJCSBOLrDRaQnQihUJTh/VA/U8mPsSUHxIJXA2UjshTsQi5igJLT2RlUVgADc7KrPhkiDEKoxCUPUfvUGotXzWtXwq7W6NcIrrzBwc1uW5eXl5dPHp6enp9Pz8/Jy9mVTI6kAPTGpMGed7kUzM4Cybcu6vNh68iImgnSBbwoTAeFOcRZsK7zAPaLsLlH040lgbA17pQZfFQq4qs/KBGNZIIvDVZN7posb3N0sYKAoIk4ToSYkl5kHEdlES8pmZ9tKubhmpAQkcbrBpqlmeO9MRxygqKIpQ6G3aQVACZ5ZXbUkGUDSld8IALiKiDeAs77G9W+wX6+SJGwpEtUdICIaVZIVeyp2tyYyhHhpNm/dOPEhK6MpHkA4TKwSft3xClZ3LQ6vtfb9YwCvffFXqt6gaIZ+d31b7ToSb7xaXUsWMIq82loRZEXr6vZGLJzXBCb0THo0I6f2B+yisjoc2FwPLVVHulvzumng9fS1mXC3s/a6LJE+0eRj5HB4DaMJZVwWRuOPKmqZogS8qvuRUCwcavNcRg07OkVc7UiDtd8V9P6KEfb32O26vaJ11wVrKcsXdn+/w5espJ2HQOg92Sx28zYFqNADdVe6kzZiX+HfCZ2+krVi6ANQHyDKBBFJ7lYbR0GlwiMOZ7BaKkYGpkKl20iiq/kQJARMu6ZVtVIRiqeUAJekogqlJAXJpHSnSEotV7yuHaKlCIBWpIqm01r3Q9dVbtazNIO1fztuFa4PVWodBGV4oYnPru+I1D5fLYE1scaddmV9PBVdLSavNr7r9DIYx/0CshY3j/PCFekMR38cZ1Pamt8oHkGV3cOhklQ1sih6KVu9s0rUhXto1ILI+2mEJYmImo2ofaakhgZzZQNI89yMi99Ge7sj1xvBEA9SwzouDehgv7kKvlRk027LZkKz/7DZgVrDwU0jl0ZDf4EjX736IbmeVMRqZJzjOPFes9XXpzlipdNi/aqqDLdB8JEARlvrhpKvBxsZmfjiBa9nGkvUKWQgWl7PbP85h3F225ICarT6SnRqk9oAzaiqTiUm8AB5dJ+KPz6Xh8/r3XkRWyCXDUuZKW9mfxTei91BMqyoT+IizkTXTAklZzO4ekkoAiUt+6LY1DYxU7dwSoKltjdzNU0LZBNBgnqBm2oi3ZLaRsgER63JBx/u7oqtH59e8OZn8i/+1/z9r391nj/8u4+/PNh//t3hH37x8Hj8+s2bRzw/l8NU8oP6hstpW06w4uR2WbZlLZezWJFDUs9Ccr1wmst2yaouZZUNSedJoDI/PObjYT5Mepzv3jxOdweoYs4rUIRRKKgS9ZuIM+JwRvM0yjRN83wUkcWfc5oFcJqZpCSSJY6LRhMcFRAqCgEp7lAFvTk2ApYeUHEM3UK6IMdgmo5Mj60xJ/Zo3kCwLQ13D3a94qs3VDkeHDRVT/SKjKs/IMjPxXuJD5A78lm7pD53D8oHZIp8EZ9EpMbFUkrsxaBt8YPTxozDADCz5O7urRQhk7WspM+r8zfsOiVUEuBmPF8unz8/f/r06fnz5/PLyZYVxZQqokwZ6ZAOx3S4h06URClbWbftZdtevJxJFSixgAtkJRb37K60DbbACyT2N+doQRXJTOZV35TKDKNoWLJnRVJXFi+byypCcoKIMZDi3YtDExPUXcCUZPIEQ4n0J/ecE5icpkY4xLkjyb5KCRtX/ouf78s+/PNqs9pvrzymlQWg089OOVX+stUleId95ODxvX2iuF+liO4MM8zBllhxxbrZvERNglTRX4vcBvNA5MsobX9pHf6CIPiCLOvSqg1BvvgtwvkL1KpN2U9oLQKu+RZJhGC0ZdDmURbnXnbfVqDty7Xm0+bSXHjN8NhnJIKGedpX26v361Z77stys1/jNJWB9lmiaXc7xV6Nod0MYB/GOFQfLLOrZ/0FwXozmHhZpBReb7EMUdP6k1c/fK2iVAfKoHQBAKWlxwQHi08T4GA0ek/RF66vYW4rfjUBEYmQhECBjjZTl0zJSOgVJ8zdtn2tXesGCQDTZsX1WGxg2aiSbhRRZ7VBxAkFpECgSlhCukF7bM7j0L93hV4EyoERXEXigq+1TxCc3Dt9Yqf+qkbL8Oqr0dZUm2gAGzbRDTlG+Xt4jn1gOoKru1URzi5B932vCy2AQKv6PR7XUKpcBDUPrKmG9THXrqbKrfZ4FLWi8+2IAZBKOQpNmqxKOxGk6MSA6kgRD+B3SdCktcNMgwEZApcigquUqn3uwUKqWy6GzatDvu9I48WsnAjjjkgoEPWR3vZWQjHViv9DgtoMrZ2/4PYEYjztQgRcyLDuu0ho/2S/LYDGF+PVIVNUtZT9fbtJTDOhV8k0YhtYysAla5VueOuvD/z+2jMCW0wz+kpaW3/p7OJGOLGaL/spiFeEgRte8hWXCa6FzphuRiRUd/byhsjMdQfDYpyAmTyUNZ+XfLLp08VPZ/OL8qXgdJmnw1eH46PbnUuGqzPRoUQuEC4EAXenR9NhTyDcEovC1DexVWztiaIoltVywcVTSQcIoDOSlq0gm2XHWizNWBLsTkH3VabMJC+nJxz1/ofvpunAlw13398nPV22X336+Os///T/+nP+m7/77t/+l3//7c9wWVf1MiknbnY5z+DL+eXN8Z6n5+35ydZ1Ehf6eno+P396mNJ2eZY8He/mg2Kapru7AzPu3jxOd5OrbErktNIvtjmW6XAnIpOplOIsShek2FSqICeIQpjmw6TTspzhAWgD94Kkva2116z45ivRij1PCpFYe5NHJ20VEbgSWwUnG63Q8MPprsNlUYJb2QBYzyvSbuVKxG8j57Cz1U7wnfa4n3eyB8qB6H6t6gEBGKqGRKBAUNunVmNeAWHNGN5pvlW+hHd5zwmMW4UeFjykOrIqUw/HUIpYN4DIwKZZVDWGfGn4b+aO4sgVOAu96QFrQIMdx6abAhAYWNzWtZxOp48fP3549+7Th4/Pn598WWkB2aXQSadJ5ynN0+bcuG7rpWxPtr2YvYCLIPKAT+TZ/eR2pghd4AbfUKoBgFxLksVZCLrBCFXolTNFCIGJx9A2wAL8wQ0OmpqqOQNTSCPjJIm6sMDExc1dmErgZCjcvLgUaEppks234Aa7hJWd9zbFZQyf3LK78C1dpdPU7m9BCYO8rOw25FcFP9mFSLUPGCwKQCgGMQRrWhpJdL02Iuop5AsrtpVI0sQSFbFfyEYeB0+y9agIeI2KWWTmuWYTjA6gSsMkGY3MGz0P54W7Wt+iXuMY2IhN9tjvoH93A8ZLH6PIjgRwE5Eg2ZbttZJ6dVk9Qi2RoVbI3ehKw/tX6ntdN239f1yAGpZEI4yqzAE7/Mv4BJJNxRIAygTAYV1tZx1HbxVAu7rBWKvZoU535Z6sMatxQcaJXM8oTopQ9vhjH0Mw4vYRY0pXRB5q0JBQ2DW9pi8J0WJrTSFuEr7+q5636nkhgNz4spOBxxlHJdSVVMMtDvPmK+2dfNhc3+6BAlFHycqZ67h9NwRFolyLgeHYkn5cAJq4ExrlvV7dM6pMIAOJP5Gi9LALQslGw7NXaj8GVc0djYdulyq0hxObvBERUUrUbIkgNQSi2IWW2KqqrcIMYOQZ7VkrVRNMbOCrlQ11kXbNDiREsob0xL5VohRP7sVdAG+6srY1sdC3Oq3EMfFGWOGY7WTDplvvpOliOjZzuMrdp6hOGT3HTmX8NkgoBkDSKrrx/qoGFaqaOcw3tVkgVaDVbrUbomOr0+ijJ45kqe2cro6Q1PwzuTlgjWFJsxJJhyNKzHM7zNIzHUMix14FWooM1nOk7kQ2dS+ordW7NZdGhOi7PVzDRvMCAJHwppFMVSmKZEoSp2m/pm+oSIOjqNjXu7AcTNbO2W9WAKMxE51NIyrbUoyqCrUTZBDC5CzRwL6Sc5j9FcCuGYo1+MdA37p5LoBanyUO0lWiJytIsAKtmMOZi9+ftvvPl7cvy93Li61Pq1ycz2ecXqaHuwd/cy8y45KwCYpH0bFCiQm6GYM7as70g5k5S6bP2DaezS/FFnEjpeauuUJ6Yp6CCk2EQRNSg4ASiEgyYZ55ecFdxjxBebospfj9m6/PHz6czhc7rTodofbyfPnxtx+Xx4//+Ivvp1Le3L25n/RO3HH69qtH2dbPZcvf/HD0grLMCXeTZlDW81ReTp/eJeH98RDpEzmrwy7b6nfZRKI1skMk5ywyHyYRwUbQSpFICk8pGSGSUsrBSrIorSyXU4LQrFjpOTakS2pqBNn2G4IECeCWKvWuznLbUlZvXNvlFFWxOyxemK/LsgR1B758Z0JUayGvVklFkdqcsg5DmvFvZiklZ2nu+SFRoZ7960qtFkNIqMW5FCSmoUxTBgZCJSLULCIQFTg0SwAaRm1Y5bykipgHB5BaT6SRNaWBPBGIN6A2KEB3wt0TWQsSa5ICCXfUqFU9zQBNAFDLtq5LOS3r59P67un846eX95+fn15epHgiBEll0hx+OBdbVbLbum7nbTnDVnpJLADUN7EFfqZdYCdSYIQZfAUcmEini2sKAAdsG8yqJi0KUVeo4qA+c0O5mJwL1+jnV50XBIQe0Z7iIhTysq0pJW1Q60mRkQRpXYskSlFubuICV1XNmkI9EHH2asu6vyKSAzq5+xvhLa1FZXeJ1CH196NCpgOy+ZdecQSiFkVDoxwBfKTKN41k5qaGRhVNcvHoeobW/9S9aJoG/7E38zHINbeEhCv9pB+H+GdA0EoDGtm593XUop9BqdjwsWjVyKznQrxmdUnV77s2GkKftIr2fa0e9PO1H65qKMswAKl9tGrqaE+F6ts16qyR2BMntBXK72wD9WDKPjtU+N1em9zmJFWKOQnbQzzxtQ4tuyIYoTUja9fLR6bR1m2c11Bf5zUvYNdhWpoxhnmz5w67B9poPN1IYQCy1NwAHz4HwKi9DLOBw3iAmkAV3IJOVDczrl+dVtnMYLImYLlo0qZQ1u2r3RtUtRlz8dwaB8i1ZhJWEZJrVzlNSKR47bAsAmdk1pJwMtoHEklUZfIKolS3ruZY17r4CF2LhB8agMBJBORoqAeCeBsmgTRlw2nR+VShCoEVcxFXpNrII6VquRoIuOhu/gZeb/C64DhJk4uXYo2dkTSnE0xxGIUekIVIkgLRGSQ1pVQdTRr5+k7UxgI0AVKUlhUj4w7VD19PGBxETrUVZTNhQ68U96Jp94EBUEVKqWwhPAKZvuJKRIlK9Ks3d1EkVTIgNQLQT9smCwHRKvmLxZ1zlDQQkJQQvoRGKyIiUHcPf0+kYKrWwHdOGYHxEc40EEQSybk2WBBVTTELd1I1N30j7D/GeiYkGms3b3EgE8aAEqnlKKg+ZZXMXMoa+Ubd1FQVCb0tfArR8KNpxin3unbRWk0g7XgyGq43XmFRDmnuzhK1ldJiE8ZIkYo8zn4K1ETDXVEfWCkH3go2XICkBAwsVjQli2YX8CYLYjkc0tKZItpSQ1cJiFJojy6mAOjIOXXnvTfnaEyNtaXGUNkASmpYE+hGj0RPAYiQag5IjVEFnBbQ6VB7xoXUrOjIEdq9Dj54jwQtUAN4MdKphSKQGUy0BKiaCzxpMeEmxxf/6sf1F+/OD+8/EhfKanx6j0/vk52Pd8dsl+QpTaZqppvDXNQ5bbY5NoiqJnfZCr1szkSalUsGH/I542R22coCU+IAlc1F6ElpywmhyBWHK/I9jEhHrAUgk22xhIcDbIVMcEeWUsxs02M2I+6z2wLPeC7PK353fHpz/61v2798+P7p+eWr4+HNw8Mn83k+ytE2bvQNni/cXsQz7HCcpi0ffvgO3C6+TRL+4uImkjImEWjUNKumg3Mt9pim87pspYiIqlqhJEma3TGndEzTPM822fl8vpRySEoz2wzCnFJP7yNJ9w0AZNKcU5YEurh7UgWUQncXZ4AGq0qxQgYhRINwEU2qWsoatBfxoWrvAXOe1nU1K5pIodOqzwQQRmgOqcLkI+yb0JsJRtm7av3QGJa3xFGN7O2sEwGnQRkeoBqt1Wx0GsFoV6YKgQNeMYpFpFXRNIeoiiK5ilCsyX636JmeUiKSCT1abyjEiUK4B827kCluBQHUkdxZiucMybrSRCTD6UwQiGwOMxrhovkwq2YvW4LDfdtKYd5cPl/8Tx/WP3xa/vS0fnrZziuPinVZyHQ86MN8IAlbZd2Kb2Ur21YIiwIC24wk06Z5lbLKduZ6RoIXwgy8QBVZkGZXBZKbqFM9IBJN3OlAzsgHiN/b+atc7nXhdn7Zzpuvk7houTvO81GPh5yTROrZnPI0p0/r5oRbKaUofJ6zGs9lm5CtuGwJWRISaNjcuKaDsmcBRBhfmsrg2tLHGTp2lU9OB52tsRpJMtdqzope1AsnkyqbAVHNMHEAaVCUIw+cwQ/dYOiYKgj3K1vSAwYuFypM65wQ5KQqhHmAdIDNWYNmeRav4J4QCey8CgYaKEaBp6cpZGGcmtSIFmhDhgjtyqncFXsjoDV9uSIkIKl2T2CLXjUxXESdvY7LodVMbZVCaKVTYO0/M3CR0KbqAjlpoEltKivsmRWsVTThFQtgnpTyADq0m1trKRoIj1V1aNUCKiLaBuqK6GukxXoj7+YspwNMImAo1h6J8mE2XlVAVeVox1EdxlO9c9Pc+FJLRY4QfP0kCiSb6A1rr2X1RC8Er82oA8MTgIhXqDFJKXkpqI6MhvQUFggkfgwQIgETRMJLqScBiNKmah9qp0kxorVkS61iU7plJso4I424I4MlgQQ8G4xKrfBTCkTmhNU2SBA6NJJoSZApcP1b8A7j4bguKIwTEEQj3XsaIJntV6g9Stn8Q5GIQq1BqNquS8N956AqvPiQftCKhmsgKDYYDQd3tPy6itY/D3YQPvi6yNLw5Jo/W0PSNN82QqmiY7hzdEpzISDUIf29Ok1Gm7553ZVqAAEAAElEQVQb8f3nOixPbFysnDfNtTmxqtc8NDnt1EPVJKk2r0KNADkR2aj9uaj+DA6PvSpOqt+2VODxeMgQxOizkMFdcPPV+NBYzxHooGqlIgEzSgpFjJtQ2FL19lVqxlo8UVVroGPIP45Cw3bzYeDodrWnltgAiSM5GP3dSog4RQ3Csg2BHPzoCOMnTpOg71Bc6kMoAABrA/n6iVe9AWiR2p7egyYYQkiEgyu4Rl/tmxWOT0qFlht3YfRtxOxQYy7XHhhQA2+q2uU1x7Na6oLE8Jju26t978eF3lfemSS7GNULDCgk4ME9oA4X3ygnz0/b3eft8bQ8lPOlnE98OuHlGetTlnUqm1rJelTSipf1sm3GwEMXBc29sNi2WiluZqABPB6mzQguazmlclJb6jJLYiAdWtG6JgooLbBJ479meYnAYr8ShAjnBGmUlBRzxjzBRSxxXbHY+3enP/74XOx0vDvPXta1rH58PE4H1XmarIiLT9Ps1M2XRFJ0urs/r09+LvDtfs4Pk4pMMExIoSZPMpEETVTvD2mekpXkKAKhZKpRQqZi1jlr8mKX8/lyPqtKnuetFLBGSxpJxH9DRgojOgORAGG+2koZSO5KEYkfJ2Xt+x5tkHaOIr0ssTrEnS5MuR7b5vgcCFibo7RTrDkEUEaE+Bo9rP9lmwakNvuLQ+TuClA1aYrG9O3A1am4IIfNpcxUpyXyppeOAqSIO6N62QgymXQnVzS1jrY3HiYGNaypAGCChF1RjeSaKmvmssmWkaIKAercip+37dPZ//Tu9If3L3/6eHn3XF4Wt4ICp8FJLwXLek8qkzhYFvoW6HHRXk9bQJi2ybbYeoY+M0E85JRXxyrrf+6EG8yEJlJYW3ZkkAK743bvS9aVvASZOTTRtm1RhU1TynPKU4LCbVvW+/vH4rZeztu20YqIaJaH493zYsLJHL4RCUk1JWGOCqGKV0GgDy90FIkcUaL51L25WNiMTo5kIB0MmVSChJUQv5Wj9cRLK1vjf6xCVv2ah+2sbGDqPvikHS3tJ5p4drJFhfiMvIDB68yKShTwzQH9EI94FcEobUbS8xJ2vorKn7/AdbF/W8/IniICcsegSwjxpD2q3jVpchdSzaUOsEJit2dJ1X47vmcLB/uYwVtV1cZC0aQ2vZk+qHWk7WjvsrspaCJC6M1kY6cjO+NaGxFx+t7DbygTcErW8R7SdB595VmvS1IMXY+tal6152KyNfnCIyCCGhCoJ6u69smWIhi02274JaHJq+vrytRsZpGqxY25QLfTAWoRLBIlsPEbiHw/XDX5UBoeZx9GypGcUXNAw3SWipnOyFcjwagdb8qKU2v7gDaK9rqaYSRIJK1+GK26FKreE178HeQnLJVwJDfA1jg1rMCUcA/cNDJKGUg0r79IO2AxvQa/yL5ArP71OIQeA0DNv+ivocC3GQBSnT2BMMOmnQ8I7q+2dtzsWoe7d+64UperhSqVKbAmw3WUDL/ZfTZgexcptS0ca+8BaKqMs2ZdIEy+nVxCqf0C6Usn9OvXOFqRivlTw717WwaB7Cc/yJ7DE6PWOK6mUXrmEOoApaUIt1HvZ6YdVO9rhcp0qpkWt7lB2/3S7ICwP9mLdgdyrdUUu5elDfA2F58ewZWdotoqEaA0O+fmLPTjg14tMKxBwDHFVnk98M3z2m7XsjT2T+L/la93s49NmhnZBxnoy1EAWpMaB00RVdCG6Yi+vGmXQlLTrvdl4VD/QAGyQreW7kwWxSW4tWleMZ1sel716Wznl2V9SdhWnl7w8oTLM2w9zjanlFjEKkaNF9I9Bp0EjgTCfTMvcEptYJmSJmM4m01QwJK9OL02JHESXps7h4Awhzm8dkRCVLy3MCmZm+FtZAI15aNkL9OKsiTJZTZczqfny7ufPl6WT4/z/O39nakfpjznXOyi06O7iE6SkiLDAFudvplnzflw9NWWbRXK3WGeDsdt29wMEE1ZALok1Xmeqx/T4mCINH/SPB+naRLBuq5lXYSuSDQb4Yk7DQNoeh7GvZOmHdedHSi21+AC6FBfaPxBo5nuAIjexLxKL3wPPuDQbo6gstT9XAycsFsSzQkCGc5RM1H38YelxlIkpcYtxR2Sap5PXYP26Nqvg7sbRFqVIQAk7dd2fyiAwhK5E6OvpC9sBKoBJ4wwdxda6N1ECr01+oVmFIonU0E2RxEtRZ4X+bj4Hz9dfvfj029/fPrxw+V5QeFRkpVtgSZ3P29uoYtPktXdi3uJkKJwU7rCocgg6ZutXE+Ue0wZyIAiZSDXKKAv8ALSaQKj1vA8HDQCnMXuJhzEs2wZnsRzgAchkWLGbbWcfZpygoJu5kFSKaXD4eBFSylmJsCUpk1ZDLYasFFEUtJETI0kRaSC9kfKsQKh9DS/y77i3umh0VDjvZ02Oj2HNrYnF9VwMscrxaU1x6xKWoUzH7g6qiZPsuVLVHFwo7YGK04ttD6+OvUOjqFqrtSf13hzE9ZgBee4OrlNpANthIFdq2gpyrvPsiqckcXEFhXWfrziMr0yHup69lH1Q9EdulE5GRdYQ2/v+tVgR3StozqSAAAmLT4cX3ltkBzxir2+tGX8yY30RDVj3AWg7rU02FeywxX0Za+VIa7V9EVN84s1HbfKRw1hrE4ZRHzU/+zsAs1MkJs9r0OKvr3YFU6yYhbvl73W6ivpeVc/mq+EfRf2346KWezvuM7SNK74/91WjW9RF3HPlxj+VpWupmlI9X+rahQADMZie1RzSV4x9KQi0JQCGB8JEp0oJVWtWBk2QFO7ISIS7Q5T6jok6jWIFP7umkWcq8GUvFGUv/h+P1zD2IcCzV0c9ozw/fNhcTu59/8bv9r3qb34JSOhX0ZWyqh6MKSJtMqE4s4Bz9FHmFNyMopxvZWzRy90F8F1rasMyEUAwpGRwtJqn4sIG6TSzobGAuvrV4+NjMsab3oB9LgCaLCANeWtXuFfjMfF3b6EFkL28FxjN20Z2TsNS83fYbTSEghq80IRJMAlmhdeSZAraokDP74MdlNl1a/U1vCrcnx3RK5OeuWBaFz4Zn1es4OR9l4TT7vVPobxHjvnuvpQRDQSsKVmvjoFuhucVVoMOr1yqMyI3ZHmneof13+6JNJFWC0Nq74DSQ4x5BV3L3b3vObTWdaTl9NFzhecTjh/wuUp63KXcNCcaL4sTCqqKRQpMXMjzZ2wyJo1qW1DJhWUUgSYVOaJWdaJq3kRFGIylQC+o1cU8ySRqBmJHVHxrRJ1+cFLw6ZFTeeGJ0kqOiMdsTlh6fDoaaKdPz+dX54//3G6m3/x3YnbPGczs7JsxGHS42FyEFJSuoMkbty4Tpp1hqJsl3JZC2mz5ZQCZrcap5KmpCoi21aqTt9CokmS5vTm8dGBbdu2bcs5T9NkZtu2BSl2A6DvWhNLuw0gIqi5zlekV8W82Ug5qhopRW6BFLqf6MidS2kCwpgq7pCoxU3o8fR9PH+BC4pIFMa4SbMU9gG438YhJc42mYb796fECoSbNmI9EW+sXVqvJQKAmhH+6hWbEWkkPqgdFfWltv7tV7tEurMkD4ghp7vDXAWkKZSEe1qJlwXvnv3dafv9+8tv37388cP584LND5Lf5DS7vCQQpZTlfFlWhYtLxpYy3K0FUR00oQOakhdY8sXswrJAZlFQZ+gBOrWiiwKu8O4wlyjAUALFhHZQO+Yy4Zx8Vd8SmLJkyQqkaZKk3pMTk6ScVWFAuMMPx5klnc/nbdu8FD2khCQucBQyCVMSJEZWYHgEscfkw1UpCMiSGpUnILu611Q9DIxxNFOrkaDhdxzUytHBsftkd01pZPid/lVkvOg/IrtBuHv3KI/ULhJe83T7kzbyPZmizcvNu2wdfzLy+S8OqZ/2PosvDvgv/fY6F6CvQ6glHaaTHdsKtC/ezd1buV1P4Y9vdRTW7o7aQHPQpsbVHlXw9rWLA+rcO+fUz1+5/8jqkTSz/SsnXy1j/abxjdQKPodrRMJz1qQeawLCVXASo6pzTXzXd+M+8EFM94v5yjC4kf59YXmtn8Riqio74khVzcIYM8CjYbNQnbXVUtaavOUkBQqKClWkMlwB6dpAvC18QRHcjSoTwFREtIJON44ZD4ZUJoPWVKjWNET2ZkKS5v5vF6iqJLSkDIhEhkh1xLPfR6pHB6DvoKeORlI2VNOPtQERta3j1F2b+cKrehEC1aHXltRu2m17d8L9jx+5NphXYa/qsiAAaUKLJCrA6JVhIyI5+hI4JXLi6n0gkftFjWBCAgA1sFVgRkpdy1gP1eb6VXtLd06yfwGAEJfe43b3OFQNtKnjzcmBKLZG0yZ3/83AFHYjYPhtXcmd6JsTevi2iIhos+QZ7EJrlIhXLBUARThA5w9mLhS9M+XAwob2bamNJ7aocitwSNm6KttqNTdti6U5VmVPSJM273Hx0e1774oXgS9QplQPTl/J9sSbjKz67Z7eEWSctMLv1jJotABUZ1LVOFO0xu5jgmyIijqDTpvtAEQSqAhEEsXori2b2zitnF784bk8nNaHyzKXC+WybZ8/8/kDXj5he875PHPKBmyODHKiihvoLgpBEbgZo+pXuImoSGpIpUlUJEnCJrZwfU7bWUvZ5msVLcxLuooBtZk52LAKvHqthKj5kOKBLVNMgJTy0Sb4tszzQeZ7s1mwihwuiy9FLy+nnPNyf0jqy7vPX7+9h965i6Qpz1NOM0Rmpa1PtroiH473sLWs5/P56auvvpKcBclgEeIDsa4FQBLFNCHyfd1znqfDPE3Ttm00EzKrpJQ2+mol5xSvQWxcCch21qKhb99fc/eeclOhrFWj3LAxBQUobDgHqLsvIlARZwqw99rFj0lVocGHO5QCAPhtae94FrRpVGgoag3wINL30WDEqpRzgAJHZW7RdrcauoIoZiEEgTfRAmJR2l55QlVIoiamnnXfmz3Vcs+obKCHSu91yFHPEzllcKmY1EKqhXuadKMXE24x9U1w8fns6ePZ//zZfvf+/Lv359+/X9+94LwdIGCeiFUwKdzkhGLYyrJtCU6YiiqYCAHhJmIJYc1aYkm05Kv4Sl9Fk8skeoROIi5w981pYIEAkgFljedTUJLLIa1JnlSfBIvgolKSIGVJyHk6aEqae8U2RFLOmiaxc1nXBUJxijCLep7djIi8WHEDxF0TVTAVCLMkKFvJoIeXoUGtV6KKdLKGl+IVsxWhE3RVcSgjDvjaAYQ8Ni5ovDVaqmw69hNUaWk5QQp1o7tyNmCm9RDcwEt2UR5WeseQkSYWIeLizX8cRmNXiPebYNdOg7RqQfvAXK2Nv0YqYh+qoXstwnjtMtNquMbp293YHMzp0SQeXyQRzXDIagY0vj/oEjGBbs5ptwEACHqSYV+6QG0SEns9gkhfbXdvNWy7Sdb1rKj4GdYtArhXV0o3aayOhNfwd33ibBkKXRRHeem+NdFHdd81RmoUB852o/vdaiB1Fg70esKgqMF8vbrDlTqEpmDcjBw3Oxjj00j5Z9+Wrp6Od1PkKG3Pu+4SnuZIGE5xfvrpquaOtBSrpqSGn0Z7V4VhFUVBU0Ba9Lj2/62RBU1QVcGV9h/ZuXs9QBtu6JzNXL4mpsFN1LeBzQT/wqrt2vQe67lZxNdLf/Ne5D+G1zteNn7YHz8yjjbB3f9U/1kJng1cu023hghC3xGXekHSFCWtjvhLoSrCQ3PrymZDcenoDW2tXJN206CfClwnFdys2+BuHFx09Z7SZlefOx4VUfZKmHqQRrbCQUgP/oB+/5EtSLN6bSuvToWCNYIqkejNZgVAAstjMHt8+OEXjDqKt7YYV/s7jn/3BsXRfrViI1X0r8bZdWrpn/R7SjMAAHBIi7q5bbtem2SJyJuoZBdIzaBCA2ro+ZfS8xUBGCQlleseLhj40c2TQ3dqOUgghR78IhkOi929lMfPy+PL5X69THYmz5t9/ojTZyzP8Jc5b5meoMmReIC5FVvLQlrKThQHSXEDaaImpEoislBTVoAGYznb9pm4k8sTt69YMmuVmkIU5g5XVv9+RhX19Zg0ucIwhCLHUxJksrIK0jzfKbRQqxZsm2g+Hq1QF5M/f3xZzN++uf/mqwe/nAu0uN5P8LvDdDgcppymlKzQV3oFCqYrNE8TTpc1TwFXhfkgqknci1kOMx8hF6lVN9Jt26xmAArJcHRN05Sm3CMAjTDY+aEMTqwW4UzYM+jigur+32/SxbCzq98jg61eC5lIUTNDEUG0H+xP3CmnLXK/Q/2nMlAGBojnbjDjRveqv203vT2kTXcHQ14FYDlEknvND9lPTfW95O7mHO8jEBetpyGEf6xVmD0BAdnMLXePxng1T9iFhVaKlwIIKKXgpWyfjc+F7078w8f11z8+//HT+adnO9sBmpEmUN1TSsl9cSlIE4oaF3enFnIW8YpxFtiQIohgI019S77BV7JIOM7y7JoVRl/BAt8Qg4/mBoTDk7sCdwlHXA7pPPM0qU9SDikdZk2ZItSUUkp5mpKmSiGgKKEawCButR+wqsJ9KyVqREhWmzqJJNrkom5JJSFciCLh5xf2+KpE7VON8NzwtysJMnzSzshVS4cr1hRoLfvPHbAk8ygvOHKBVxoFSbnmt7eDu6bEWiRGAoZqA+zUjF25j7NFkll2xberOsNDbhXN6lFtpntfravDUjUWEQGbBnqjhGD4EM1V3/U6gjXvKLSyVg8jg/bY3AS3eg6AVmx285T9fRv88O0wPHIc7V8kBl6/6gr0/AU2o+5GqWtFE6Mo/tJODZkmV1ke0uyBLw/sZp3H2sXOwMYLpJkunS/i1WsYSRVbcQ/pgEVXgyFQS6sleqFXjUcBZCHjPwW0udJJScp45xY5AqRU0EMlIk+t1cgTgKQ8LGKk6bioVGjm4OtKNI292wW7/iMChEVLRq8BUmrGeUSdAZAayGVB1t3vWXO4ewqaShQyxnEaO5Dvy1hXrRoVMlwzWM+KKp5USTH3CqEV7QDD3xxeVK/i0F/lSLAbS829MZCpApGPUb392hwA9Ahy1JKM4PVKSKD7RAqHuzDA+isRBFwRSAVdVCAF3vy8QySkTVei3DpSJWP6tWoDkICsGZKCNMoxqj3m4lkULUQTEcN4X7130v8LUmkqI7tPZdcppVYCUKM3hBhJOHsGWEsnEAmRXHMcx+nIeLf+aNz6+OubKj5b4zzELZuklxoBa1ikraSJvKKQ6HrYGOteA7CTmEhLY90t+6DrgfzahX0KNQ213aWOb/fox3Wq2VoS5vDcVnPiQGSVqIIimjyWrCbcsqafiqe9pmXgOKykG1pbnzsDQeM6JzKWFr5Cc9yUrqAqM3mv+tbs61P5+uX8+PxysOdkzxf7/IzPH1E+wU6TXA5aZvUJOUmGG6kOoYvT3IxY1s3LdjAz2kYWlQR1DR0ddN/cVwIJOW+nsjyX0wvnI3TylCpv4Aan0TKFNYU9VtoAMRjCZUiLtetcBhQKNR0wKzcrXhRSmLAUUi/P65uX8v5pOZXy/vn5aXl7dzg8nZcPx+dvHg/fffUGqvo4f3W8N3vK6SCTQ2BroSPnaUrTsizbaiI+z7NKzcxMKUmFlQuS2AsPA36eVrRCMDEr0mGSlENx94CtEcRhiQorUN3gtZY7QP8VcLpEB8kOt9URtAb6VMBUNXztBAJatbllNcAFWRLdayGwVW0e6FBwlTNUEasUhLs9YHggOe9HoNrPClJr5Yk4qb1aMDqZoBk8Lub0jPAssQFIA1JZ364o7jKyKwKQCgJIdgCGOFOuqqFAUcU9YIiZQtnNCZokJanLHhjXLgaY+Wa+lW0rJtlcL5u9P28/vixP2/Luufzh8+V370/vTva0CHHEJMAMJPEZ/uIbXWbojDTBLs4NIGGhMFvDGqYIGSYKEs280LeI9fl8YM5EjuZ87l7dtJwAjbJ3kko/wI/KB13vZZ1lm8Vn5ZRlmqaUCUDTJCKkmJnDSTM4EPUI4V93ukEcNPMiLgKVQriQMIcrqbBMZEp2TSpAq3hic9g6opY2Fr9pfiH1THYGNapo2k4EuobXleDGnIQ2qoCdVVrEpkatTiL6VIli0PmCajr2ZWjGAaumI8V2siIblgsA7sn6ney8ReODv5LkUG9Qw6u+q9StY13ko0SnpqBpuZlXOyNDAqp0Hw8q4wf7KeipevVstJdj74Q9eiJdIOKpnWWyaZ9tT/q9ApY1Zt+ySavXT7rbvofemmSsinKrymCz8aIGitznOyr9GF7eMZEQ7X6jFW3oHq2YEEpSgdofHdCUdt0MY0PDoTEtusfTJKKLbSJ9SGPQNTgqWv4zgp4lal9EBqKRWpESNwkirzcMYq46DWoOSFWGgjLblZU7t/260mnHJaIiOgHvRFP5posEpGPkA1AIN1EloJkVzZPNGiY9nFRxH2/rVNEJk7aa0VATKy1KWAitJ9TVKIGxBT2AnvnjzW0/qnpXevawAQMr3++fU69oHNJSr5V+NA0SzePeFNyrpwx3rpOuBeSd6Yz+resJ7ltecYcqekDVt5omiGGOMliiIfBKA8NJ3ScN1HritoxRtXE9ZrkegAgqus747bDKV59c7Qu/gBp0e/OekYbdq0eybbG7e7yPR6lWzKdxtQfCuF78gQH1xekvrTPyiKig9nlJaHmZhCRI2LOdJPgFh/fto29G1d939tkWCJKucXlfxez23wZrGMpRmrfgy2tL0mPnhjqqnXprEVhdJIFoUlRvfu0+0FQc0impGhhDVVOohoicv5vB97zGcfAiYrYCxSVDVDkLVeVAvE3yPfHdtn21rPfrZbYT/fOFnz/h9An+pHjJ+Zx8SziqzIkzvCBNQTyEumxbKZdtWxeUUuCLYEtpAjTJQQEv7izulyTpOG0m22U9refPfPgaGa3wmnDCjMHYavZXOHQJdyKFzxEkGP7IpkCKgA0VmeKRFUkwzXByMU9HPT4yyafLC5/Wt5bW09NBcfr2jVMIhc7TPD9M98Uu9JSR8nxUBcti5o+Pb5fl7O7TNE3TBCJSxiGRjuVQSUhImlJSzZJ0XddSSkoponlSm4QkSToeh9gXbfhxe/6Kqkqi2Hjkw83BhmE/MsP4CqjpzuOpp8DISZIKkLKUEhVvACadmr+o3iQGViocnnQm6e4gen+JgSErSQ3YZa+uSHfP7dGT1CJgq5lLHfsvnFpxl0i5jhqhEAGBf1XPvpkFxH+j/J0jRbJg9YM0geJGFXhGVpUUBkBmynSpiSNuYoSbGVdLRD4X/Xjmjx/L7z+Vzwvev2x/+nj6sNjni3sR6ATNSAKjCpKwlALJSBmqMNAKFO5JJXeW4CKCTBCas2iBJxYRpyLnzGnawkdWeW0obtEKYwrYzSSc1A8od1ru0zbJZUJReBK2U6OE5ZzD5jQ3gTstCaM0QyeFSJS+xKJlTZIIg1BlE7DBriVwoqwqs2pWClWUYsIrfo5wMg4um/btlSN2/+pLzuz+Sf1crm7V3zgNTHz1q5v3I6NzL43/aa1eECfb3xZxJRMoOUstuagthHW3z6uw7iOrhjmkiScaKiyetlnGyG/nMo620WcQ9tVcnFRoT4YZ5eaoQ8cpGHXqpi6Hg9hj/DdyrG5NLeDY7+lStUOSreioDyD2lV1j7kyFXfwPm6iA0Yfi7OEpfqXp1bE762ius54GQbbzt66o9Hk37+EVIyWJvURT1L3N9yp+OL4JA+CGbuO9u6PxwD74PgY29/rNSyJxlQ1+5i8oFc0ZCImT7KyZJS69ScluAEg/go6wDkRRagZVoPEzibIYIkkI6tWoVoCBE+/iOZZMEEKLFb5PIwnPrAjR/NhdvIpoGEPhzuAVioVWyWStGLHuU63cj7WzYdrpZjkCiVZqLbxHjmzbhopX3QAZIYPCCsDokejZH03nvp0DoViELOK3vYSSDKdLHPiyI11VIFeDka6sqESiWSEt65QAcs4kzSycbGmgb5IpBfCPa8AIClWktbOMeH0gBIXZkAEY6R7uPdTWZiLdfMw5RTqBNHjNKr+rqrSfsVZooh5sFE3NgoGYNNAMVUUULhDWBjtgxIZbMoBCIFpK6XpsTC9QtD3g9gpJimjWRPEOlZCQm/ukuuDT0CK6URcBzwNFRWC/RmOcYAoUiCsm2PYuOEOvNgvdYtd8BAEdWxk6rDk690Me+hREUkrafLgVS1RgTdLF2KyChSoAJK1qfmcKg+Ll0aWMqIiulcNXKy4KyTFcXz0ekhwW24rqjKAkcQgR8cHOQVQkKYiA3oklruUWWvNP9qIq0KlwTQVJRSZSxSeVo/Le+RX4vS1frac32ynbSe15wdMnfH4HLioXX58Fy8PxcDdBfc3TQ85KQXEWN4MVlmLm4FI2mCtMlUK3rWx+oV2mJCqWVJIXXl7K+g7+qNMbXC6YH3PO5qA394l5oYlzSgLBum4gkDMsEF285p8HWlKccFWQxS2p5LtjOb2wbJjmYts830/Huz9/epbDm3M5kenD03ma79Yiz5eXp+eXp5cT/rP54atv3j8tcpADDppgBNcteZrzcVa628PDmzjsZb2UUpLE2ZfmqlCR5HRAKViXBUDOc2xuSinsQIfUPjWDOAkWFyJ2SilrilBufFsKo4oxpRRKXpz3oX5O3aEq05SjD0Cc/pSkgqFRkkaTeUzTJFbWdQUlZ5VaWgZtmUMNGDEyl0ofoXeSHiLjItLQTuqMqoWgIozwgRQHjaqq01yZtjGlBFTHoojUypZAMIynh/O0eglENVbPQUna2zx5yopSCBdNkpCSiazA4ltZ11UJyJSTEKqioDpEkJVGI93+/4T9WZvkSo4lCB5AhFS1zfcbW2ZGZldPv83//y0zDz1fdVVlxXYXd7dFVUkBzjwAIqSaeVTxu2HhpkblIgvWgwOhtObPJ/++rs9t+scz/ufP61+/nn59Wp7P9tJwat5QUWZIhSgqta22hNYoIjWR8hrNB0LogCpFSnM0M9dQC8XdKU0F01T1cOQ0LcA818fzmW0tALREmxKwAgeQEL+d9aHwBu2htofJymWlX8x9dQHhtMNhmuf5fH4ZclXgjSYkYVpFkrkMtdYoA1cVW1e6i0uRelSYOBc7fb+UKlJh6iTLUWotSM2+4aF7LFzYi3GDEixqR8CemQYC2RlrpWaByR5nD+zyA3tTZ9MRUMIcG+4iUEcJodzbEcwfmf0K6RldjISdFpGES1Qi0AExW10gUiTcG+89cTsX3BZX74V1BamdAWyNZl0EwUspXXe7QLirU0sZH9EdDZWUhFZmRiZnOjpwNA6/DnhxZ3CLSLMtxLB6Ixnw7rBBPSsti0gUFUXHqyAIFIAQ84hc95bAiRVK3ezWNgmw2/IIFdPdmJg+EZHoz6MCIpsGdJESdSJp1quoQKOHn7t7BwZrQtDDBBKAKlUIYQZHAobeUSplxGN74BLMeYZKiWqjGC5J87WImLu7h5xMrybezj1zJtuaCp3dz1RI0kmRSqiWlH47l++tQ5AqIJaFMDjjhgiNPG2Y/hm1AjoQZ7AAARDvvDtEKj6KDtofAkJ4Z9rMSaJAHRa0ZCMu2Kc3I2fDIEpN5oHziWLrmL4cI6VnQ96+SxNpGZU0m/U53vxHy/d1dDZ/3VzK4S9ecaiH2lOFdEzLmKSR9eM1Snu8F7pB7Nj2T4qYN0wF8Wu2WE2iz81ZZ48Ec8sGbDsWu/vmHCbGi5JgBvYMl4vq3rjcbt1RwvsherUDx5Pk1zc/Wd6e83a0334ue782P+7uJSD9dccgxVoez+mdn8tHv+vrp30VB4rtLbl0ByA+7fvo5SyiTKBpAOMiopNkQez5BGCz+3l9l3Ff6TGq/SPtx2ErDIgR+DEP8RjS3TK7HsPdFET6eZMo43bYZRLyYQYFpEBQmKzJzC3QB2U/pCIpVt9GetIO2G+QEV9RD6J+9xm4KfpO8Q782Nr7drnn5ejPzpcVpzOWE/yseql+Mj+LLbbQTWs5zrXUqg5xFYU0Eyeb29IsnjpYn0VdJUpAC9zML85To5FtKhPqd708yeWFyyoyAQUeDVAcaJASVVAIrnQJnGPk5INaVLqaZzR6QQC9qKKKeQId6wVSrXeCERHKBJnB9vf//PuHzx/rxHU5N85/+fnr48v5T1/u8Hm+r3Jfb6ZaQOGqjavQ7u5uJxURsbZSiohRxCHLZbXOeCFiAoUoHda8e/VaIi2QkbRtOl7vdGcm3LYupKmJVWsI5E347OTqbuoluHRwhUsGAxDoIpkyKrmomMX6uWgZleUFmtlw9TIQ+R3tyLHS97cOEyS4y4IqPuozpJZXoizulSxGdN1CS6JSzb270uhBkm3lI7U+e37M3Z1ZrcZQ3vEkzaXR6dJWp1q0LBKtqhNEjGyGdbHzxX57bD8/t18v0/e1/O0Jf/lq//jank68NF+dLlMQl0IKCJiT0WQh6ps1elnE+8KJWkiJgBZERKpJUHcoAvjBVpKZFCKythNtBd2cMAErdEad4ILCu7k+3MjHudwrb8Vv4ZVUU4VQ4bDLsiztUl50mjJkpkLAS8pVrKsVFxTJ2IaaWVuWJYBCYcu7ORHY2YILMRNFA4LEGpWBQcC1zb53fdgX817pyE7vp8lLdqrE6xAsezJcZFNA+xPQEXTjw7iHv1n/woyrDAxNx2jG4mV4LkAUmTASp9RASlvHjRQ6urKNldexLiIM+xnSiUejsUD8Gvm30EqvduUPgsRvXhMYxbn//Lubgh5f6Zbr1ckcV9LMoCKCvp1AfgxasjqFgy2v7y8/+rB7WmPeXz3e+EfGC/JKPdr3JqcRymqo/qu57vbSboTGn2T/swvMPQ6WoKiWfmUlCA2K3rXb8ere9vf9wVTl8+dVxlBLf8J/cr7I9rJbVpbue57lV0PXHZj4F7ijAfU082kBm3c6txYx0TuNALVEXlWj5FQHrsz35BBZZBAQhaim6+TvgTvVRJF170AksNQd0yEYmgMIGt0CgNFQQ14tjDFz8mqq0LGzQyNKNPa5XlvS/aph+khPgMZ1PDcfEHgySVqj5A9OfvHov7BZRTmXAdXaPV9/ZAGgPiz7fn2Q9KobLCfYOSIg59hGTfc5ENmaVkAiXBCOXJYLA9kKTaESHTOBLliHmyYOo7AkNCtS6lX6GcH3H7wZMcVpK+fQxdX2pq2PmkEGv84w44HwLm3nRaR7nl5VVILtJ0VERFmArIvY9zDS3A+RmiWYSygOy8hDmBkRS9LAVw78ad6aCJjQkCkxsFkp4ds66Ssnou0xy1dmN0n31o2wEDfW61W8X7kvDKjIDqcpHXXQ+RAkKnQD8gsg6Wt1VO3SkqqCRNAybkefFMlJycm6lv89Y8BtU4ZvGzdIlGc0Qfdw9WMeMzTCvIOITCqHSR+KfqQ/rHZ/fp6XU7Un4nnl4zOevuHyDct3X39d+F3aC8WEZSoyz/PhcAjfVX3gRMU96PYm0mAa5P2uEWBygKT5ugBeRSZdYS/18lVP3326B1TL5F4hQDDiKwl1tySJib6NNBIK991K3srT8h5eVOo8NTOsFxBmAgIhGFHh0UPALws/3H7gdP6ff/31v/3n//jw4d23r+94fv+H9zf68eF+ntncFVXbNEuZirN5W9vqy+puUBWHLKsxH8NLKWWeQhRkCEOhNRJLIbU9pbs5EH9KAGa0dgzWU6oAijCyIr6sWquqZDGxFvi+FKS/e9eFPVEuxZGBdHenuzC7+BWdnKu7QyeRHg70jB8VLaJKeOJtYe7OSPNarFZGeA7D0AjoZjaE3Ti1uvWvIzoTFVEeERCPAjeGGzBMiLE9c1lvjIRJDx97V6R4ZLxVQXEHBKWKaAVVzMykkTCyeSkqotADoUZZzE/L+u2Ff/m+/PW7/eX75dFvfzvpPx757VzOi7kr3KEOValKEO6wxuC98qQTRamQIlLEJaCwvWAdIsUFgDZyCi1AVzRwpbWAVl5enkCgORzwAlWgKAthDzfzp4f5y139cmfvpttqj3LxxScsS2sr3I1OGFZXeF0SAtAjd5H+JUkzsHCqRUv0e3FIvJsLIVSJHGYA4V+o2i0+dRSoBFiGkrZvIOODPA3hReTpaWfuOf2G99aV/jAmw17vWzdmdpiLQESMXwFC0MUbtyqCTTqGCeCgA4qoiA/rXyPH60QRZYCm2BmFMbhHIQkZCuNrNMYSIAYAYK89EkSLCRDhOYdrEbrAeowvbaFoftxLnAOL8rpiVQI6P0LA5HBY9hkT9mEa+4tk45Y/gUogAbvrLtJ5k7o6y/wFU3kUUFyciK41uXg7/wTGTkRWbEZItO4heQMoNfovbTxdwYyAHKq9F0NGu2sac3NLt1Glx5eZgTAWqdn78nWsdrfeQkX2PAoAVSGt55coLCJedGK2iPZNewYwMGuwfdwgfi+iWalAFvSSu23uICKJ6Wc32pBg3l3V+g8OSeQnAIk2dr1+i8gKjV0b3X7L/ERGlblrApZG1Xn2zlVKQil1TGSaud7jaIEUBwCNSIwi4tSS5uSr+M2VzcfeqAvbChvTlmf1n9uZr0Zk91ffnzD+nRwC9A76l6tLhfLj7sOtmJ4jWiY7kOvu4rtn2F02F9FIxl3V2FwdI8Q1ul1IH6Z/Nuv97lRiNMTuS38zNF/Z1iKyb4SxyctXx5txHm80LsjezOLVn9DFCrqP1H2+Hz5/ZkiGVBrfwvVlhyh/9foxfgFe6uMRfdvTB+gbNCI0PvgKXj3PNlBlVGX1kdl5qrtw/O6E16vixyvh1VdEXvcewuZcXakleTML+6M7RV2JZrem0BfWo0J9cnIjjckN59lfXZAB3BomVC9fIbFCROfCG9U7lbtmx3aZz4u+vGB5aXxq8nLSp2/2/CtefsHyFctX8Fl1PdT5ZpoP0/EwzQoR0OCILC+bu9NVpOikVBRUMGAccHp4AwIvEHdMSnAVezkv3+T8Xed7KaVMN16O7gUQSIVERyQXJKd6BGG6ObFv9R34A+8gcHeoakWdURtaA0vEAVVmV0dx+DrfHs/PL0+mx0lfTgu/ff/b6fz88t1Oz8+//+ScvjwcDl5nTrXOLPJ8Pltr6+VlvVysnbVgLnWawKA6jfVdainFDeu6xJxqBl6jBjqxjuEeaOcUTnx89Ha/JswmoxWTBG5eAPdLLBLvhTH7VUpudVxdAuXvgZ4BRaOETBWsZqu7ZzAsbRRSRWp8O3qFklSRBlV3SARZe5QKXSXFIVspwpUR3yN5mQH25GUv6Q6TSaUWeqebK7uhEBEdONLd+IAM/IIYOhuoSCnFkhOC9GINKGqWHQyao1k5WX1cpr88Xv6fX9b//G35H7+ez4Vn3J58slJYJ7QFbMgYtokUkTCaV/em4YKJQgq0iM7KKhIbNoJPEdDRaATTTaGmNPjq67qWtWH1yxlaYAoTlIpSRKTCDpN8eTj8608Pv/swfbmT+0OTS11e8Izz+UmeXx7Xy0XooBeawFtbVdib9BQpGdYpog40ullDLXVSVZ3nefWVQb4RESiIe/OmfmoNAKyoYoJUIrBNLpHzcMlox4AHx/Rez1euird6Crsz9z9/TBW/+7lTH8McwO6yICkKeqCV2H9GjsMRxNdh7cRfRUiTLILNXUQpkkkDy6x3FHArwjKT+B87QCg1kYHEDp+514ZxEW5gkvGt3QmplE3SadqZybvxfPthnNmhPiKJPg/HK3utjq8E58ReXwwt5hayc3/9jF1Kfx7ZU0pc1dFuc7R/qf0C2Ou+/WlAbBclvVe47dIXG9ykCIqqdoCWvJJ+r2oMRCRSOgYGdxnZ4soiEoIqqGv3zyMibm280dVq7O9IcuMk2Z9A7lTSkHubPUAS0cJQ3nxxGwoyPNz+SaVusxVOQpB5iQpckgJ6M7XRAzPKzL2LOujd56MB6DQ4UkU8c5FpWyhFRYtmElO6Rxbsivlr5BJ7UmPEgF/Pbr58Flmi66U99Fs6NzwAkRJRtB4vzIoWppVZgLJTHtjOAXpNWCF6LUG/6T8TK7F8R3H9HpB9/TqRXckMzOZDXwu7sT/7R7v4ccQ5sl3l4K+IxSEaVHhhdm8e07WB3qVTXF9V82mTvQk9kI9esrwLGIQC77+NuyPQkp1mNK8GMUm6zP4WPq7FbkjuxzP8+25jxrSOaiEJeDEYnqSJiO7c42RyvJ4aIOsVAJSQX692o6aBsP/2XsTs0w4Ar/q8ZCPmsCZVel+7/eVFWIpa8gLt+huIQ4pe5U9w/cWuFa/pVi3ak4NIxqpw9kYl6PXLvblmgPc2Cu4uiFKQ7MrUOlDNxiRp5Aa3+if1Nmm5gRzcD+a1NVnPvCy+LlxPL/Z08W/f+fgVT7/g/A3rN5QFvk5Fbw7ToR5v6qFKpVkpIt7czFpjW72ZUKtUI6koZYKrhPoUB73ZWuiqOgGkuDXFo3DS089eJ1EC7xT0wAIJlerUaJhHRzI99khbploiZpOp/j6O7tEGvtbajjdYWlEYmogWAdRcGojl+QLj4y9/fZz13eePT6r+7ecn9//74ueTXUz+/OXDTw/13eFG13VZLnY52XpeLy9tPSvaPE88hqypcXOlqlRoNbPLaiKiBSLwqCdh0tO31vYq/y3S79VhZkPA7hX/K5EbChKIrjEiJQqnRkdS75nA7b4g3QspcBHVkLSpt7MYw6WXJgsngKXkCe70QegY0a+opOo7i2QweIijFGUUUCXTYjjbCB2NBCQndQgA31h0ExbcXQIdeaweKPWOHWCztrYEIncnRFTFXS1SR82E5pWr6XnRr8/6j2/4bz/b//23l//56/mXk1htMrtrca1Uh06AKlbSaCuVhcwSMzaq5ChpQZnFJsFRSguK9A476GpCVUjAxa362tqlLS+LnN0rrMXLA5ot9bjMop/uj//2+fBf/vjup/fTu1veTrRFz09yU+Tp+w1/m56fvtvlbO3S2qLeKoxCiinVwSpVywRIKjaS8NYaRKcogouqQ1pUjUvI7hZsoM4KTrCJMkMNWqWb0LIDMHRLqwdPYw92/GjIotTUY/V2zrqtsy+2gHEu5sAapF+9s6T3WJSEkL1iKAmuf3GQ/Sf7FzmUvyTKQEgbHWhSY6WLq0OwZli3w14BIU12XXQQCUoyfOO+NdO1zeI0jy5Me4pS6a816vvSs5Fe/rVXtcNuuTIzAGb0XbswIUF3lsx6IA14CRRkLkdGZ63uxuXFXUZbB4a3o3uD4dol27ES7R2DfHnftaORsR7G38dXHCL0JoOpSRwqCePcZiXw5wItktbBzm4JU0EjVn6lP1P6sac6KKPkJK4KOKjdMdwPbJ72avzR9/XGl/NPjhHiweYGgFG7svMS2T00dF8IkNDgegUByijgKCIEYp9011GKdIRAuq2ZSUgEpUC2spLecCoCiQyerSqa6KlsVQYR5aihiUhV0b45czJl5wDIMHmx/dXtyj14pcNeq7GITOF6V3fvM9Jz4ytDib65OAEMQ026jfzKq4svqip7PgdpGV49FdBPSxDZJt36Gsp5HdUhEnvruhxk/zrbrzveqO29rsdHO8nmuNH+Iq9+jYNX8ZKrdTr+9Kpm4NU58U3fiYP9i+x/HX7gKMNFMt+8vnKf3q0OhExETECVUmdQBiFaOsXpq5BXUma/DLYIxD9fFdi/Rl/BV+mmMYavHnv7l7DniBFj+Gro+tW20aEEqH3/SDuZ+6OxffXh/q9DaeB6tee/d1/Kc65vQUrRW/C2tfmyorV1bW1dbFnt9PJyejxfvn5bv33zp284P6I9QU7wF9ilzsebOk+1TmWe61xElQ43thVudBenuBStRlO4oCgi4ORKh7ioF0iVOaGIwsZV2xPOv7BOXoKPskAJKQFXhQePgMMciI4oVy5f/5dmCsWIACcYXURF53k2V4V7awSsESZYHK3h3ERAmXA6P317mW4Plw+f0ZbHp/bfeYJ8U9fD9PH2cPOy0s6PvDT31RvpUlHES/VSpZqtmgSUxUVb86WtRsC8Qj0atjiQaNpOfqdBFqRjDey2T/+EyeZRqqDHyXtC8ioFGnR4IiI9xDVWcpjCItXMJCi18hxVZRWFExmAKCIU0B3JIi8jKgJ0iHQ8npmH5I/ICLqF1JFO8aYkg5UYCUrB1jWcqUjHvlARgkKVHqXbh9kSyny1l8NMEXW4m5uZGdytD4sGGtYJl+I+CGb9peHbS/vHd/vvvyz/9Zfl//mt/f27eb2FVzFkJh0KBRRizT06Uq8UFxrEAt0HqEsFZ+hEmSA1kvnqJuoM7GFwGyjgLgGp8hVtMZxXnMEDzHUqmTk2B7xU3N8e/+1393/+w7v/+MPDp4d6O3Eubbn4S2URlbm6apkPl9Pj8vTYxLC4RF1BSmx1CkRLKTRKRdECodCihTR3AeMISZLmHgRVYCMWYqU0wUpfHZMw23EHsBDUBFtq1JxcydgfmK3oYlGv1cf+zE0IX3++/+2VAsXrM71blmFC29ZNDwEzCc8znsoBmK25X1ygRcSFgS8tIU/F6TtbYjT82n4SgAVh415XvAki7/6UDvC22V+P2I8cgFfj1jdAXrMveyFbn4XXYcqkoOzxINl06OvL/mjwd4/Xzda9Dvrha7764t4KcksjTXV4dxSpvpH+hc1QVKugDKjPXkePfwcLWbhYV6uuOyeRz5TIBkNVlVx7VVXvZuf/FOVxLY72L3Xl+bx9cVUdJZWaRvIPBraPzG6gQnD3v4WXGMa+k6y1ukny/xcBteyjhK6kmCBB9j3xMIBZ8RyQoBahiFRNrhWNIvlRZd8h1uE3YODbRagcS8/hohKNcrxztGkWuV4ZVeMBQkxLdzGHfnk7u/th3Q06cb2wrq6vuzeNgYk2RbrfzFfbSkR0o9Yek7RtV+n+FdmzOdknOGo3gysjnn90Lk1PofPmxq3CkSsQF1ThYB7I3UyylNpHxkcculcddCtcRYoqZOS/9q+2VXxsFRQBnHi9kSTfohcDdLTiK6EjkhmVsvdtxldGmQuFMO3tDXcTVCS7I+wSL9fuHPDaiCfpvRsZdkc+fBr9EeDZWStXR0CGMgk7LiujurGTnIqmvx1hvHiz7kQjlpEjtEuQ+bKfE3JkYK97TuvaCRw54t277Je37pycDfDQH3hbP3t3VhDE8KFc0b/L/tYcYlHowkocbJ3OCy+X9bTWZX05X+x8enl6XJ++XU7fvuN0mvwFOFHOzouvF1G/uzm8e3i4v7m/mW9upxstWNzdVrAJWQQuVRRQYQVMxLPwxo3UJuA0leqIJEBwGK/eZH2Ry28oM6aJ0yw6owpk7sApAynJHeFINUC4c9etVggmi7wBDlXQYe6KUmrvAEuYk2BzrESzaZrR1nr3sK5T+/790rS+v2t1RgXr/HzRv30730yPYnZbG1afRRWzVlVMBY4K18ko0ee8aFGtZjxfLq21sN1HZC8Axd4hAKo6TVMpJWiaRypyrGp6FGkFY32gesSsabew7ZpZIQl8UoLmDwCjU3Y/TciszYhzNKg8PCH48bzu3hqErr1rfbJP9DWNaIAgKWAskDc9Kbup5KpDNvZ1uAVNWuQPCDNPI1kT7TYUZc9XQxA0IOjSOPPYvoXucjRIWov3jbi2GNmaeVsp2oSry7eL/v2x/edvp//26+W/f11/PtdGgR4htcpe5wDMdg1gA2Di4itoGr6BVKUA5m2GVHNtQC0ADclxjoLiTgF19N1gM1soK22FNTTXUswUyljAd7e3//rHT//lz1/+/NP9v3y5fX9XD4X05VxdVZuJi5pDapmmci6wZ8dUbXmK2HdwsIo76TAVigc1VVFVavekikqt5aDSmgQNuojUWr2RQscKJ8y9EY1i4iBC40NEeoP7MDRJuCBXiVw1Jo9caIgujo+QkJpUEa/R8Agi8xSPG/4ZezsszZNY50Oc0tleFa3ugz7hH2LHweLs5CUQsXBJmfFDRqWLiY/4YN4puDJFCjqPreys2x/o4i7DtyrEwLtT98inoXBjrb8p8xkXjBHp+wFRwNaNFmov6rS0J2KECZHuWmTPAyIBlL0+IZtODV3Dbm5t6P+hqf+JBo82I7kHx3nBcAju45UADFH50+MI+6EQEagkh14nD9xXE/VTZZudLqPGoJIMX67b1o0cxH0lGqdEPQZjMOLZ8tuxyBw9oj9GZHfxH8wRrlyyfrWeygSxg8/ludgNZv8JADVXd0Lxc4wEwg0RLWmnR6ftSI8XBSkGCpXFkc07dJeEko0Vh5pR23glJom2pmn+KtS52ww7OzDML2i6WYCKCkQ1yG7ExZX6qoHA9QtHlcLIEsoebsE+zd2q/IFDNmYFVyGi/KKD5q5vTo7Te9VUt2iB/vIYRZmMXpgwEXXPJlzmrfO2i4jqkHNIU37/jpuikrxBrNrgJhPZ9kApMqAd3f8Q6UCfITFV9drGHBrUk05bOjFRrI+Yz93S1N08kpRtp6EgaE0QXAck0StJxuBn8Wz/cL/39v/epnuzTgHEi++lvHCH9CUZuRaLXgEyXpBFigTWAJ7rtbthr9aD7BZDX+HbOe4b37lkyzAQppi76+VBaChwiMAGLcnwLPNFX4khvGFPSKPQCSmSjBUp5WNTi8DcIcnZRahkQxE3onRJnABJ7cZl53kYeyTGWEZ3+gDWs4A36/mwLHU54bTYuqyniz0+PT8/tqfHy/J8sdM6u9fqPttqZmZa5O5w8/H9h0+fPj4cbg6HwzRNEOdyYjOSRVBVWUgpLKJFvLhbc3OyORvdRbxgIttqLqRARUVb02Wd9RntkXYHu6df4MdYlAw+TZgAhIFlCMukAxp2hkRBudIMHQLizRiZh10kTkWo1csESLNWy3w+n7VMh0+/u7z81v7+Kz5++PD+08081cLHl/N//esvzy9Pv393vJv14919FZu0FW3qq2iDaIu+SKKlHkqdlrael8WsFdFp1r7Lkt8zUP7QorWWMmktImK2usM9AAkuUpGsmuGr625bCeGlTKSZJRQqXsvFVWoQPYSTLSgWYDABmOISIkp1dTamUlWuvkqyhmfrVzO6N6GWQpFqYW0LSzSAHfa9KjNY3pfhbsepKrSIyLoaSbeQdZEWhySFsfdAQOygKhIkFn3vRxmbCDKAIkpAXKh0F6pQHXQUFxMURXMCNHeYO1TN5LTybGIQV1+B76fl6wV//Xb5H7+d//O3y89PbbGCMsOi69ZI7Tvc4Y3WCixCprCFbhCwRO9qFxXxoqJONkJXr0VhZnAqWIsoBU7rbMyEB+0+VvgCN2ihzigClalIUfnp3fxf/vjhX3+6+8Onw8eH8nBbJoGZENaMd3d3Bq7ramvzdfXl0mYXrSuAdrF2kQgHmMnaqF50jsxIJTFp1SLqbIB4LXWitFKWZVkFtYpqPZ8vFDqLOLCCi+kCmQQzGPCMmJE0xejuCXAUgAnfokiJSJmoOIOkGGREmiBJRoUO9oUAUTyaWLAeBtp6Qv84zBcztVt60QVsr3TYy3dTi3o0l9cMvwGvNUK/pgAWTaiC82dY/zsPh1mmFYmoq75UwxiNENLWiKk7sQnDHsoS2fy59ynA1n7B8y03xWrsBb57nPYutLorb+2pRQmHSa51cn5xi4GH69ifLMmrdvY0M9T1OhuAgEttHt1wDISbxzVU5IhzDY8FidRihKuSZASivV3sjysKdk+FAaGVDChosK7t50WSbWzdD1c3EJTGN3r76hY63iw/+bEhqlubdglNHpZSh4JnuG6sB4zRQe6vlIm9tajslnUBYA4RULPEkc6kpqIKNF2cInSGuz6w1wKJxAJJ0kom9RjdLFRVNPFHgc0QYFQUOSHiHXHOSaMsI9OCIqRsOWgDBCpSpCMMCWVmjftMcEv3pCkXtcfJrCLSUS49nxPd9cI8iihL3X0y4m1cLWY36v9ysoTKV0meHhxHNIQK3C6dISZgwqxA7Cus9OiaZZyu1OiBk+wEaUBHDD7XyfazO4MuAEyk0JtIyUK9zpQmAnhTKSKd8WXv/bH7KSTNqCIlwPYbNZV25ykeQ0QQsLCMF3boDg2hSjFo54VO0FSEEDMDragGPR8AMAqt+hJ3y2kusYscbhItTXpcZAQsSQoYYBFB2D0wd8JqdlAAEImoXNBa4s1HeVAezaNdRYiaEcxAJBCH6Ex1JBIxAA3rqtcMiYjW0h09RnxItQhEaNLnQgQe9awGLRUAPfgCCBEpUyxSJHazkyxDBTALjmwBQIuOqcqAx6cMQPdUO9ccmP8TkWiCEzSOGdzNZd7MnS32n2Kiq1u4e1E6uoQ4Vy1FZvrUTH25WU63dp7Xl3V9uTw/PT49Ls9P5+VELOuNTtEnRwETrkLRejcfvnx8+PDw4Tgf7h6Od8cDirfWVrdSyqylGVVkmmRp7byuUquZNVuar8Yl5NFUa2sNzqIiWkjYuk6UD/M06/rYHlf58GQvWM8yfWCjTtXFMSko1s6gwp12BlGkLMsFItOUnY9yYZllUIwOoghovrTL7eF44QkCOM2gWuRww7URywrUhxsVcza5FfIBbX3+7Vceqx2mRdkaSj3WQ0U53Pnh5kYrLr4+qpZSzLmcV1PKfDt7qc/r6o0O9ajPcj8cDqrCtiYtRBRmU7UeCC7NRMSdvpqoWDMtYW2krDPSvB1vJifdDCoikzFR2hr+am9a1HxV1aLFWClatKo4BWK5narWsNdI0uBsCgFEq2Y/CRWVkZFwZqmClSKllCJUCJnMrLl3VGpVqsDQWhMUqHgQAYkooVqLTqHkIs+hyjpL0TKV2tpC9ugBzIxaUvkGfYVIlIMPEjNQoKZwFm8F6qUuIm1dABFpCp+VZF3M1xUX59PZvp7teS1rURZdVP7y7H/7fvn7r4/fntvLKmtYeA5ME0pVmdCE3mAOb7AV6wna1MXZsv+sFJSJWoSr+EVgQFMAcAN9tVqUtYrSKHQXUOHSXFSbGa35DBEKF7Kh3DSdoYLlzNPjH//46f/9b7/79y+3//p5/vJ++nAvU2mkiJTj4RasqqrCYpyhk9TS9GTFoC4WBYFa2tTZsZQEzeki7iJmbqqzQqvCHGBRm2bM82SmrbVm682tOgwoNOCshHVUnRrcCwHxCBoHzF7SCHKg1yUJoc0y29NxpDFwVVTcm2B0KKFoB3dlMzjpjITo4WQbCb9hhafZsJWkhxwws1W42dXQAC5129HDPCh0eOitDPh13iQGVRdcM9gy2rzEFWqt7IgR0lWjgY1KZNB4la6XKEINWFxsDGdHPWRcAAKhGHtpaQgLa73GJZNdoaFC9HuC7AYk2ZLzMOLrYadCuvukFlVhdCG77c30xMBMCY136sHcHWIRO2s+fDRxcxENDWZgAkNQnAR018eJZdDSiEjvOhsUWMzwvAlBFg5zBV4yqVHSSYqm6dg499K2FiCzHzocRe2ZfHJQJycLUP4q7gx4pPpVMYOUWt2bu4dnK930rKJhRoYp4DQNvsxSm3vGRuCBjUygP0smusBoei4YjaGw8xoUwLquMbxj1YYzVK17Y9KN92zv3JgcPQKJIrnwE7XSgbAwKAphZoI1Havd7oh6u11kh4HqiWFNG3LUYYfRGN0M+hFUdVmRl23lB8IEgiKlkpHIlwTbo0A6CQZVdqgbIdwsVOAw+t2p2hOL1wXHY4X2Dzf/b5/mG95hxLGQfvkYgQ6J65sjfIQsxAkjbecTpmlbBHBhQI8D8aDQ5B7K+XLdeCN3Xq93QcZsWdcHoNeMd5/Vg7zQrzD9w6DvX8uZ4/iZ8d+sdEH8qtEAJRSDyOZXXh87Zxp9vQDMYUgBcT0FkS5JiTi2U99RQ96ICMTzioEMhno06qNkDYB0G27ML3qgg/HQ2p88B7xzHYiQ0FEU04eg21Nd6DgAlEy2uEdOdosE9BEdCylHov8OuAW8VgB6ZgCZ1HDYuyh5aE/hAbHNwo4PB9636jmm6cegQmBWg1EVYdCWyJYYvaRrkjNSRhRIK0hFyysJVAtR3eradDlXu+jynctpfX4+nR5fTs/n5eXip5Wrzcn8HrElVbE6aS3Tu+Ptw/H25jgfjtM8FZ0F5u6t1kIUdYiiECtciUKeTufWGtlEWKqE+9Maq0TTVUaxrBStkBstUNejyt3h9ubwMlWbcDJ3b6BDGDBqFGoRGHxtVBM4UaLhbMeLR580JGoICAAD2c4rKC7TRI/YMAFBneAArWWY3cmC1gCsp6dvL02naT5Mh6mu5rXON4e7i8+UqejkrS1myialTNNR0VxmNy4LaO4uYKFgy6SpiGhwKqgqNVrJOMx6wM1g6K2QI3LHzOyJt9ZUo4I2oECKTmfBaDQkoemjeV+pqoLiEctnesUhi0lIUahSRbw4LQgg2PuubBsgZH9ClwQwpbo4JYE3m/DpSivkVfxl5MrNrNSS1lxoZ5UhKMZFwpRKFUP1bOwbwJncO42+A3I6QHGawqkkNAmL1Mzb6i8XPi/6svC3M3555m/n9dlWk3op9ms7/uN5/fbUnk9rM3UrQEXRLDOPzuxOpTlduQKmbi7Re04AhSq0EOKUYh5GNmgOFgBUOkF1bNp2yEtqaRA3MzalOZxTBQhrqvxwc/jp3c3nh/nzXf18N7+/rceDSLTZElTVUspxPritfrmBua2+ni/L5eLuUha4B+dfJPvCLA1MR5i6mh19gjVVJcuZXEUKFFApcOnhiLCGSTG3RjRhbQzCmRB0aVQ3ZOgXw/oHwH4rqESsJBUSnRSnjPNtE/5h0nZzN7x2bpFv7nSKREg0+/uGBjek4YsNm+Ap0jruP9xIEwhQhGgR9NnrU4hEtWVyU3ctl2Tfueb74jd3FWGJGoB8jAy+JYVZPHtH6VwzxQlJA0kaPdpqKkGRCgkd19zh9N6Fz8nYhrHrusbvC2ynu6OabrP3SV4RYrz+ivRo9E67B49tEs/kpVy2b20/wEQDFPqWZIh446t7xU/tdeg9Y22D/zjAC+KdhyzxL8Bre++1KcIrS+n1HXPlKKWv8r2100XfBtl4ZRyFORSPK+lCDXtpu8t2X4k3Sv798GzIKDG5nqntJ9DDpvEkdT/QErfeV75fp1TS8krneLCPRR45WrVHZi3vDFhXIRFMSto5CFQqu3clUKYCCuwaoZUiFO1w0oSng5pV82OZj9hAgJMkjPgKovdxVe0WUrxmjtcYTWoCQYZ+ys/TAkI31MaqGL8kzVN6lrKb1v226c4D0TnxxzwGqIcJt8hHijK+3AaS3C6hyXrcXfrycI5X63tLcwwQj8++gzD47vcrj6TK2O/SbeRwB0MEal9g/RUhEulyJo9W98c7nrY/sAQ+N1CZzHB5d5dfr9Gx6nbrvH/YGQy2o7dySwkuiXJJU4NbLGfcIjYnesCj9FTpdlKySneTJqqagHDhembm6tG6UOaw+IeM92597U2ZN7v+9cEMnHgQCF2PDzMBnY9sfXjCsGcf+XAoUkrmd3K8XSCN1AysYYx2Ot9OiSZQIlmxQoVHalcIRyJ+4ZF888k5WZtOJ5xf1E6+fH1ZX+z58eXl6eV8XtpiXBF9hgsq6eKgGEGUcpjnd/d3d3c3dzc3t4f5cJgn1dV8K/2UQGqnSTdqUfYrJ3hvUKo7hdBStFZBdFZVvbn/8P7Dw6dPl7vPv5WH31D+Lm1ZDQsgChpag4jUIjS3ADOmexnsFznaIqki3SkCGmFwt8tF5jKXyoJlMdgKEdUStcEZzvHAewAQqQcu7rA2zby0dX08aL091CNs0lufnUtzb6XYJFpZtc6ErMtyWdwjqipSqEY0Y7TscEGQVE4qqhBt7h5gZac5F4yG4q6EQgpEFUrYuq7R6XME1a7EU9cWDLCCUyeNpUDu1p8IImRFrbW6k82suVsLQTXqrLX3G0Y6xlGfQJJB/8CdcO4Dr700efTvhIhYJC5q5tCYUWOniyM6bhbJfJpDiQQ0Sk1/JTYsKG6gCByuAIsz8KxhnjorEMx5zfViPFt5bvx2wq/P9rdv7R9P6z+eLt8vzaT64d0Zy9PFzydvJoweXmXUF7q5eVSfc4U1+hqLYzS5D0SyaMRZsxsx3DMOwSvjQ3ccasxaDoYUcrgopyILDcsJ4Lu7459+//7P//LlX/7w6fdfPrx7d3t7W6YqwWvp1GkCyYvawQ/rDc1svbTz4fBS6+UCFBVTJuImm71SlfvY1U6ITbVuXAukKqlFbdU6aoro4u4OE3W60cylUVW8N1gNB2JYQikTCIQ78Ta8FFkS9mGJhCP42ooN72D0pt0ZlGnID3vw2n7adge1AyMjCoQugSkidFGNpH4ypbi2UVevUjkk8sbf0tVNYBZURsgImxU49gRFJKBR3J6zx8kzmjQq1iiRDE+rMFP28Tbdg6RbSLeEtCBq5SEJ9B332E3xeJ4rPS670GrYTlE4m6m32KI5hX1SdLxX3DtUdVp+46XDtkvQ1NC5IqMtST+GI1SKRr0RgEgFoNu0Q1GOpiL5BI7hpPXrlN07aujn3Stfrf+woMasvSKflV3+ZNik8A1JtS2w1+Mc77v7MCQyhjE+/ItgngpLZm8w5SBul1ZBcF+Mqe3Dl9MWL8Pr0HU3KHvQdPNsowhy8xYkqxgJeG+4DkoBnMJEioTNHpnm8OdLsI92M1mFXRNT8n3jfrFKbO9gbe5vrDaN/dmbL4BkifZPVzb49g4ie8r2K/d3nDa+92PR8ObkLFXpMxRcWv2LCrhoesB9mpUM57TbP7sV0FObQ/+GauwFnVQmDD7GQ323bvYPKcziuav5IktRRc9LMDKWDiDsg/4Sr990HGmOI53R2LvdqTBQ93OxH8AfPiS6H483S7n/dHSLWPYm+BsyzTGVrzZk1lPuxqHb17KrJNAtR8OOJ9wd44H12mRXVR9Tswmp0Ij/G35GRD+crMIpSB81UuMynDhm7ARMtmaRZGHbEYz2EdvYkKiv3CxBiRXFKMdD1OqbsErPbzI7jMavlU3NZ2v1cqrnR7480c7r8m1pL8vl6bScTrZ4MJoUirupr2QwwWmhzbXcHKebQ7m9me9vjzfHeSoCuHtzb84CUetidKU1MzNWFRcG2z3dYNnx9NLWKjofDvM8F60hQWqdbr/89O7zH7/87nd+/9Ov0/v/vGAtL3/77QQVSMEajboLBEpVlCHP9+skuxG5IYFAIjS6wQ0gV1qPSBJAFGWKukjYcJtTq+VQ7y4Aik7z0b2ty+nX78/HSUt7Z+3yMnOW9eZQbqYKhYmiNWuyXnA+kwHKEl9Nj3Nx+IxSJwfK6jQ3cVSBmbu7WRMh6dyogQmJJktCsAWCCwjOxE19dnUoXZu9paYdW2aMVQhwrYVkYO/YYBx4I9vLGa1jccbOkk41big/uBfC/+pbniBQSKHC2ISd7yhVo2f9YtG6Y7kQkejYlD0eRQBq8DXCJLCn+UidaNRdRNzYmi/O0yKnZXo8+9eT/Prsf/3V/vPX8y+P628v7fvavKAeFtNqVg3TVAuh7vAULU530uBWhHSDL7QLvDmyGwCkAB5BsRAT4fQqEN3rernzZooJA2BUsooKFHEVqFAVRdx9aZT7m/rHn+7/j3/78u//8un3n9+/f3d7nOpUtIiasGgp0YoIdJnMbJ7bMk91nso8lWlWLRChqEMF6j1LHLgUMjP0KSDcIZBS0FEiqVliLWlWP4SiYGs0l5VlktIEBjMqQMn+d9x6AgeSW3em7dAdacNwF1HvyzMEHbOwmICAbuEyvrLyt4NReNZtvlxZYRP3OsOgYpAIqmxWYJ7XQxWDBnBTsntXpEev++4wSEKrRvxKhMibboaye9J421VMJMt7uu267aA0mdBfmWPAdv7kcOkJYaYTh8vNHurC//IY23w/IJvi7pwmGLtVtytv2pEccX1KNu9AUnMW2RXa7d5d9q+z18gk+wSV3O54bbXvv7IfNOzW2A/ffRuc6xP2snF/C/7or9z8uOtxA6JzmOysqX4XBjAHytReSNfk1USwJ2CBzS4cj1oz058ZqFzxGH5PcAcQAdgfvaq6MZt+JKiile7QXoXTZyVrd6V77GFYSkEJHaPY7H8BCK2jV1e2lM97lK5EBVJiCKNwpUujUBExblrLqGYsyPQ3A0GqUkZlt4oOU6wvrwyyp/EqV0ktjjiEXH24Wz1vGkZc+WjYjTDSSQ7JnhKFZC+oI/a88pJBKdk6K4QmIIIAO2cyBilYAICplI3Fr79L73/LiIbno0b6ThISRpHw50e0IMxqwY6YAEF0GdozfWuEeO00CmHy5UBlJBHIUrL0FnabxLuMe70tRTqZUC7u1p2+/dSERsSu9qm7K1fbW2IQug2QQYu036BJr5RwoOFMIjOegf8Za6aXEAURAZkNg1Rq8HXL7sBed/fc/diNMa+ZYg49GKdmc5W9UA8RHheUPptvV+P+0HDLAHjvVxmv120jMm0RFaFSJUbA6VgBZ6SQKUE4TivtUi8nvTzh5ZHPT81ebP31O8/rclpsWeCBJ6RQxV2bUBTuwXExl3J/nG6O0/3tfHs3z4cCurXV2mJmUiqUErkKBq+CArauq62L2Up3JagKiKouy1qmeToc62EWKUXkeDxON7c//fEPn7784cvnT/X+09f5/nBaX2R9Pj89nc7AQbwSBSiKImApMC4IXIEM5yrWaY/RRobcAynk0Arz5hZgXddCb+4tpCzI5JmPLa16WY0+QbWZihTXw8vKv/32eHu8ca7nWT7e6vH+rt7OKs1gy0IhLhc9X2CrWWuKdjiqsd7Wg0JCMK5EIB8I4dY1ORZ+mAVMia0JkDBzWptKoYz4ephrO6OqS7BNY5lv5J3djOhbCkDAPUyKehFrKLkgi0Ms6KIleYd3LOBOaha9tHjOjN2gdz/0XKdijEyIqVbR6t6kjEBhbicE4QoDeZKuT+xeUUYWpPQ8dQk5aw5JymqP7hYOdxdrl4udVruseLzIt5P943v7+3f79Ql//Xr529f2tNaTT2cLuMhUoKBKLZASZT/uFuV59BWthQstdHiDr5kOFSTQNglNr7ksYkGqgtp8DXhNl2oJHRYooEHRqPAKNlu4vMx1eri9+cOXh//Xv3z6P/7l47/89PDxod7OOletLEoRqSigiJlV6CyTu6+zzXM7HA7H4/FwOCyH+XyZ4As8CviECtVSOkOEpvAkSSccthYBXLE1pCvIfpRVlBrVvQ4qGtHAJqi6mouh6RVShBSFWjfYr63LTvzaDcd+CqWrwlyoudZS4URLaaQRIXsoDgAk7UZaWhAwEZRpj6HHnmLFB5fDthd2Si3NfWeKZRHXtukOH95L/CPTj+KgW7RcxsYww3DmvXN89Lt0ZG+iIxRbiXDwOAavvUeRJUl4L68Hr2LUYxQk1H3mUvYG7tvTu3AQZMcyyjaeGNz/2wcRE4gJ9auBHTHDiMS7RJRZKRBq1/iiwz3oV44W5B1LG9cEu/gFhbsXJWXPnR+/doMwB2u8UdpVqfnClNzeLmvRdwb9yFSPY3ff/437FMcOljwSzsNxiBV7lQ0Y/875Snap3AgucEFNDCic1EHWRCYEaMR0NyuVGN7Y2HO5KqA7AI7Qy94yGWeO/8+4ZSRqpZdPq7DH+aVX4rowQXbDtYqXVPFuHWvGchJn4r0+RLrpF7MQf43PR08FZXGuV6+5e+D9h28ty93kCXpE/O3JfUqufYCeDhvWdj9ie7P/UijRPrr0Qvju1GUYA+5tnC6y0Qmv65qWG4C900J9OzvKHxDI5HMO7CwGm8++OcvVsXmlOS6Jnty2ZfIV2ujJIkL2DiyvNga5DcXbgd3PQj5V/3xkAEgbMfhXr5YEbTtx9sM3GoPWvS/pE2H9c5c3GYD9jUh6J5pQKeyGztslB7yWCMy3oATepntgA/TZ0wL4QTHA1abbchpvhE4miMcIyhWhJ9LB6eR1DDuMSvXcd9FMBXNby/kFlydcHnl+9PP31U/r+v2EZeHqxb1ARIo4SBMGZrFFiUgpejOXu8N0f3e4vzseD3VSibYBZo1ktMvp8hSJpyJtXUCqCEqBbTL99va2Hub5eKy1Csp8PHz8+Pnd+/e/++Ofvnz+3fv7D+X29n468KAv7ebl6fn/+8tvWBvXCXospdK4pm7XLX4xho4NDtARXF9mwQQKslRYa4EyKVUA31hDzEFqFm0LiooKzSEVlNWklEmLuPjLun67LBHPmY/TBz02zM0Wt4v4AeTL2p5OXM6trZcifudVpjpTKbO5N9CMJIqjmDjEGtySkztZ84koKqOL70ZVVWu3/oPmv09//Dv0YhnpK3dHlou/2psJHQzuYLhCVYr6Sggj6enu5sFrFCpG00SBZNNY79y4+X9K2nDdRRn1w55NwVwRgsXI7XmCTrqZV9WWFW4cjIGmEHFHdrmJHGdKYQc8giNqTjM2h636/Yynkz9d+Mvz8o9H+8tvy1++rr8+4ftZH5dp1Yl6QCUILGJ1Uoo3uBnE3VfQUeBmsBW+hOUodLjBTYWERDRPa2LagWiXkK2vRIIPqGRiggSSZMbH5t6LaLdgAZJ2vp3vPt0f/ssfP/2f//rl3//w4Q+f7z69P94dyrHWaNALROmUQ2hiVaXWUietVee5zofDdDxM53maZ6A1rvAQ44qStUpkACNCdnmjK7iuBngBtXi0pAhTzBcHegIGBWxkERBOdy1NWB1OlNT+AoQcUMp1yx8My2Sohu4AyN5iAXL2g/YlvK1UxtECEKNIrwQ5WIa58l5ZDBOm9qD1TEGaddthhV/lAboMWPtS76K5qwlew0cZGQBo92QAabQSXBjRBQK9xiDqQbCphh8fvcY2olmadQI2uhlzZKXjTCanTLpF/4sr/7ODLhxx4n6IDIf1dbA8x8HBzaXq9884r0YBXBb4JjKlQBxUp6PHyoEI1/oA7aT+zHmRXAbuMhJT1ypYVYkfICHHr/8LA35v0mxWyhulr6oR+nxz5ddQOpJQMab5Oq4JdM5QakgOqqkLdXf3vi/23/rB9YEacV9G0J0ZiMDINm0WhIpKlNDvI5G5ipGW0rb3RGLTRHoAEEo0ipbEwZecsTgZ0RhMGFQ9/RLFt6rceCJaZ24DIlOXQ0xPWSYQkWLukjHtjIWHeFJmE6ndK4RPuUd67eaGHXWzWyfhVnSjvHveMdbX+7GPKpLZNzqf9Yfvc5MvEUncqKZOyH0KLEWQVLptrNnd1L5aRn1Zi4zIfU6YvFrrgh4OHjNGAB7JehVkrC6v1WdLNgRMKJ9uJqbRyXRyMp04RJmUKOEgoOIReUjpGRHLGIXAAQ/fqRcoY9wxODkh0SLCo7sHOd59rG2S+8xs/1QYdWD90bfV2ycv0wCAoGzfT//Fsgxip2N6DcyA3XemhTHgCVscQnCLFe0eOF/BvUFl16BjSJYxU2GYhqpA13l9SfTN0s1XCesKw7W4Uhh7jWVXJm9y1MX+Jenh9buhrfC1+CLLk7x84/LsyzMv39vyeGlPJzmvxSjOAonyFR+Fs1yZbapKVTlW3hzr/e3hOGsRc2vmq7MB0AJ3d3FzNHpzNzN3h7OWEtaPma0CF5RSS6339+/rPB2Px1rrNB3uHx5+97vfff78+eOHD58+/1TnoxymShrL5f3h8nL39PX271/X9bKAE+CNQBicfTPsxidgQsjkHkGzqOgFwHWFGWBwZVNag3sg+7Dfmzm2UsuxSeLdBaAUYjHFt5d10uPxOF9kflrU0MRdIbUe1+Xy7dm+/nZ5fnps6+nmoO95M90c7zg11Mty8XaBUyHiFIUXmIl7UCB0dKE7IJRCwpoHTAjCJq5qpRTpGBsn3a1qytvcgFSjaxItZE55j3A1SoFYeq0KLVIqtBmaSoGUcB/dyR5932D4QDJuKaNzNlU6rDGzDUPWiZAKd4etzazWGU1RNlRnjKuCQmMvU4id0+gwUFnAFhUjSDmmFKe7ibmRXE3WxRbj44W/PuLXx/Ufj+e//Xb6x6P9/Myfn/zFjovPhgNkglRUwL3DmQj34BYBF7CRhK1wDyb+wO0E2wpHmVZIozA02WCGsR+lSIxh1iiHuaMpa1ARO1WhogSdpr5KWW/U//j5/s9/+vR//fmnf//D+z98uvn84fDudpqrFmiAxT1S80JRF48iE6pqrbXM0zzP0zyXeSpTbaaQYlzpHrlcFk46Qu9pRKpknh0IXJcCliAEamuuqiWY4qQBlXBNzzqQ+U3pLcvJQEZcEFlkR+1SOmQLEbbFMH1ENyO2I5OGuHMQKuKpu2PlbuEVSn5dNNOqEhnpUPGp1HilTLfqLwwJvdMNJMPYDo1MMDg/0w5W7PUdqO4uwkzad7g5SS0gk8ezB1MKEvWRzi2HoZLKMywKbnpaNEuAI6oVWZhYiztcu4yshUbkG4JynXnZXr//NkaFgFrv1ITAu48aUbGEsfXq5biOBSyWma/rbluEQYtosEeWqDtBGvrCnlPqEiltuR3CwrrMkE6XElWX0rWwYBMssjkqeShGNaaPQrs8N7fh6O0VmeHePsGtibuGB5J+BzsAp5IthOewRJ0KQDv+YgyyO6GSla8akkrBgFl4EB/THWii4oO9OiDBu2r1CIVojvk2c1V7Q66xhdhzAuFJMHNI+d7R/jkN37RajJR9RHwsI09/oZ+ZWB+gKHtgXnYHNGhu0i7ZrP+ekR/+EAAKaBIBrFFX2tnuPVrJDCqBMaMiZdhu6X2KyEYGerXMC0oUVOxMK4xgEoZRde3R/tDf2ruDfTTjC7r7kEA0lXB4L2vN0+IqKFXgxr7q928Rtxn3CtFQd9j97lldeQJXBnc/xrZWJ3UXpRhf2YzFbRx0ANOvQ/sSkUjoCOvuXunq/L2XMobx1cocU7Y9/9XtuL3djwrUXr3+2O9v1okMNBeA5A3IMYht1gvzQG50YNjGPzZwL/7aUhNd+uyeZL8gPWVuWi0OEfcGaMfsGDpACKl8k0uur5EthPTqleOlQkYju8UxMod0MphJd4fHD4EJAmzQjOtF2hmXR1seefnuy5P7ydrzZX08r88vRzjce+k8AWQr3zLBjWaiUJFaUCeZJ50nEaW35mxmK6LjoBRucrWrNhUw0ANE5JrJUsrxeDwcjzd3t9NhPh6P8/F4e7h9+PD+8+9++vz588PN7fv3D60KRKTZ++r/elNfbqeXP3wW//aXl2dzAw0CRA+uxboA7lVZgSoXilDgToMbbA1N5eZgi1pFX1e0BSKQCkR4lhsvBknK2ggz1FKmGcJmZ4GUUp8v6/39LaYb08PTKufWKvwwz2hyWvjz4+Ufvz5+//ad6/nh/uBa3n3Q5vNiZb2c1osrfCoVBopNVd1NAFWtErSDLmnT0I2ttcDViEhzq65GKUG/EEh1T4scSGrfwM4G64STmhz7zp0Y9C4XcgMVlVKJBg1ID4yEexQVCtWD5UwCcBi2UPgJ2dPAouZEXwvn2GutmVkTKejk0JpWAwciJJveqwbBF93WJsGrEMSjAqSH5N7cVhNzaca2+nldT6v+cqp//4a//rr+58/Pf/n18bdnPLZ6Xiccb1BvITMc0XQ0Ma7rElz8qkI42gV2gbfkB2b/GSY0ehO62NEehl1QYxq8IbeqQouLarD9C3ZdKvpWdUepIggblmhTxd2M//LHT//xL1/+448ff/fx5t1Nua0+qYm7lhIF0yAjGSJ0hauoKudS1rlM61QP8zSXMtW4i4FmZm5CUNQNOqnCnC5KZ3QWccKPZSYhzn28M4giMxgtW3xNKIWTU9y9OIqbaieiyf4wmkPUY/k7gFAveSSBgLf1RbhDrYgIelILAczJvwUvnHS7XrqIlsS67uTQhsLnXmgDG8z6lfb3oEns5nioi01BYLd9+q8efP/BAtkv3wX6tYDOy22h2vjQJftgkKTjKqwjVCglyTOrcR127fbkO80boYy3R/9K7sjYaJsPcPWV/GvIcY4jIxNhTW2GQboNWkVEtHYK1IgMKA2yC3vtbKqSoKb0ENLr8CC0GFE5QYeP9MrEnXIUKK8skM0i8mtM3lhXe23+emquLZn+Xjr+ID3KKaOR6//u4DA40s8gw/0VijlLlvYFUXLPGEFELKuw4irbBaOFe3qH+7UrpbhZvmKYvNARnM88ZZaKioyqKenFhSIEipTVFopo6ba/Mmo5SAsAflzP4z7uBFVLt58iIi4KBQP9gOC7fWNkazeAc1Vl/2cOMFyPXItsUfru6ohIa01VJ51AjLJXLQqHUq9SNjuR0HvSuW4opu5Q5gkexBe7oDCNvVkDoB1R3zdUSsVoM7n3BhGr3JqQSN9KB1/KOCnUHiBkEcDMBEVft7vb2aNXa4ulJnB4s2Jf+f7DBC+SAfWeQEyW5kTuRtRZ+6uBVEC1qLuN2GESf0s0+uU2Wf2I/tOt04bH1KpqcL+4jAzscB5G+IJ7LNmwbaNbUqiqyMfFO24uLtCTPjJcmnwLimrhaNaVZekSGyzhu2Fld8hKnafx9TC4VVWkJqj/KhNFSPY/MluRD6gYmeL9FMDogV4dwf5UeO62C2vFa2z+kmMkRpwiFFcPvZl1+STd3C0F3jxXCtRgBl/FFqwnWZ708h3tSdZHv3w7tedLOy9lXapQzKVPQkyZkRTC1qweNq8V83y8PR6KWBEHmzncW4T5CXXRaZ7baqs1czfSLOjGZZrnVVYUPbKui1FwvLn78OnjzfGuHubj8Xhzd/vh3ftPXz5//Pjx7ub23bsPeqi16upWzR8qoODHd80m9cpF/vLLyUww36ECywJ4mQodHiW/seimCW2tIiK+goSgFDRDWxJuJ0B0eMksM2kWooakW+yh4tBMvam6M8v7wNUoqv/jrz+v6/ry4W7i+vH+9nefPj6vtnA9N/3//e23//x//jrXAlvPzT58/Mxyf/HJT+3l++pLq0UOFWvlzYzzsgitVnWuKixiMkDO7u5ubp5QVT/IYWmm1WutAgmac9ViQCkTVI1uRtGiQdpiUKVHk7Ye+3D3CACpVo+BMxqlTNXnycxg1KkWyGLNL6uYK1WqTFqoIs5GD7UghOkIAQqpZt5a01LCdmK0ng3LklgvrVR1KgRGQqTpqqVM0xQkHCFYYlOQIqaqFWTzRnMtmfuF6Hnl4rI4L0s7re3lsvz25H99PPzjiX/7xf/+Fb+ejy/URQ+YjsAMFgTKjxAutKiTIczoraWOWoAVYlELBXYOlGyVKpFbU1UqIW6xilzA8JqKQqUWtcnLRC+qFcgeQ9FNB4SKsmjXfFh9ES0fHuZ//9c//McfPv/Hn778y5f379/Nd3flcFBhEyqxCqaihSLEakk9p1XK2lxV51IvxaZpOhwOdbQwDmOoR9xE1G2NrLtHUT44qWjh5XIRYfjdg9feKa25VFaBFq8q0zSh2HJZUCBFS5OyiihUIR4EaiDC/BqFudFSrTt5ZBTCptlggYzIfScSSGONBohBny4R489kS1gIYdkP/ejmnkTio81Aj9ERMQLxYvFn0yKprXba0rMrkUuHKkhG/TP5rf2WESOCqFsglGJzQUSKFiDJjDw7nYuqZuGIhRUbDP0CIKju3Dyj5vE+qc8kuIHpZrbS3L0JoFpaG3agXOkO6TZ9/7WUCQC5AIjiagBAiah2mDPa+ykRZqATSnG30ZpPOqLHW0SqA/WwFTRLloyraonK72TDMsmxCru5T04YNf1hIzUkGZTokcEQ1PH3sFmHiU/SmrtQZBRMSthjYVRJlGnm/QbGO1vDyE7fxfNEADoMg+BEiAFsyyoiqjVyfYmo7B4Lu8EOgDQQe2QKDUHTp1oz8NwTEZEEUChK9K2C94LJZNSJYejkLt2g6SxAb+zpKz7UJLsMft+O7MjdEHmxHanIlU0jQGDYdrxaec6u9Ha4U2Hu481BZuXC9brEGJrdh2nC7TFV40bSzf39lcc543MdVW5h/b+Kpvbzx+c50CmGYG/PfvXF3VNFc5z+x8ARai+XKLERSIqG02qBx0Vytmj6sqCIpq8vAuguI14yCzOo+bvO3k/9qwWwzUjfI/mO19F3gKrT9vUkhwuP9u2VBSE8B9HKbqjCER0X3zaSvq216FN25Zdd+dx7J3e8y37Kxp/2jtD+gd09nNn4LIG7WS4W2qL/pETfifEMvm2Qq2cI2ZrPQJEtFrAtpB68wvWE9OTG9UyJSEfx7qYys6LbG+1VUv/NA/ogkN6K3IYo7M6oQgPzLt7YFmkX2qlcvsvyxPNXsxcsj0t7vtjpgvUsZpo56uvHjry3t64FIcr4T1XCWGYwbAi1iog6qvUtScLdo11JKcXdSq3qvqyr1nK4Ob7/+OHh/fu7u4ebm5vb+7u7u7v7+/uPHz++f//+5uZmqgeZ4gkawVnL+0mU9fJefMXjh/Oy2q8nN1yAGZPi9BLd2iRssmDwZEvWW6FCTDyo2TNkK0AHLADeC7K3AJWomgjGCmSyYXhrsBYApGYN7fLz1+8AHo7T7W09W5Vavz6df/367S+/Pv12tkN1rkYpL16eFkwnV29P35d2Pk8iNwceD9XvCtmEPtMNZSqwaGkLo7iqGtfwwN3R6FjVgTL55IygQxCFOgPDwsF6JRRAVzft0OFXak92IS5TgcFCbwqae+lwl+aiwUTbQPVegRx9BjiVEhmkuIdrzwZHBUiGG7ad7u4R3eqNlkjSzMaOy6uraLxR67cza4zFh+ZAnU9NV8qp8fvL8nS6fH+5/PbCv37Xb6fy20v51g7PrKtW4IA6gxWqgIGufhFf6RfSECQz3gKnhsgXBfUWepgnmp710qWI2ygll04CSjexGbDzaF8gRYdAli79YxwU4ko4asE066eHm99/eXh/p+9u5G7GXLyIFHaZAfQoie+mGEkTqyilTBl11QDxm9npdLLLqYoruAJtdVSt6ihF4y2EIqgSqMh4fI+YWhwRb4zwlwbtPemkXIRKqkCjL6gq6KVnhsQTRejCXm28LbwRJON1+WnKnwG41964JSqA02PiFl1K/cseV+0npN6LalUgoBUiGXYkAjqrV/pRRAqkXYfPhoDvQbFN8sf6za/3nQVk47CMLIiT0oNWQIeVvrXfMFRGdjFI60hVAjPWNRXghPjWWuvqUbNU981lc5t3jTNGD44tuAkgSnRyHUvB1qygB7V6sSveqLbIgQhKj9hGGDpRD5uB88YSG5cKaz4xDNHyLFqwbsRo/U03rYf9M+yuuR/nIdsRb5duDUeiY9ew6JVtWXc5kG43buO5E6QiakORvBkcIDsARSGT9vJJNtuopQCIVBGqmP3YLK0b3iDjoImZs+aqSlHPBQhFtFkncg40iR1FIN75a6/iyi4eydcMc0edUHqq2oO2aUvtx7a/9VVNdz9NIKXb81eH7LDduvcWuP3UXkC+zU0ngt3rbPRzSAqvbcTceYnKDxUJDscdwu5pvRnuJAsMy2b7pOPpsS30yBNHRb8MGkZa7CIgnK9IjwokmoIE+DE8h3xGyTvWayFBQ89FjgcSQRC2IuUTe4829LpxDz+Q3L4XM97bGTL3eeKUrg1QBxQB/SdHYBsp2iEZx9gUFLvtHra2dcEBBnNJIi98N1mkjRkc4gBXJ2zuFimyg66xz28OFSNX4H0Fxs8Y90wionMEZWovDLs+GBpww74mu1PaRc81fxwypBWPkYijoeDZHYB80k6HnAMrY78MsbiJrYFmYV7ON8mxSZgwrfLyIXkzUuWwpa5nb8+6POHyzdcnv/y28Mz2fPHTBeu5eBO0otLChIiZAH3rahk2kJeqk5ZJdS6lTrnUHYRAikpRlVpkYouG46k/+jpUs1VVCaVonab7dx8+fv7p4f27+7t3d3d3797f397e3t7e3t/f39/fzzdHulBczEoAnavUQymlCCY2PJ0vZ2/nry+Pzyc01zq7GQRI4qwoYBhNmvKQ4XhK9EsnMrboYMtmOHmG5hrQESKJ1qcUOs2wrsjeiAbD0/OllOepvHu8GL6+1Em/vpz/5z9+++X7CSyXBjS9eD01fboIHpsvy7dfX9bzaS7l9kbub/1pacBlKrg5zPeoM2RWFDGwodQCGsxglrY0VmtSSjOu5iW2nkiEG4NBMXnri+RvEvxzMv4TiKq4OYCr3RSrV2tUl4TscGYJchHhjv4+oxNunARwITuMOEYxNYX5TrM6hOJm7mJOlIKiqmrBMR/VmoEjRqoXJQodvhqV7uayNHm8+PPii8hLwwX1ZeUvj/7bk31/ad+e/ecnP7fpvPDcqlMR5ogGOKQVunqjncRWtXOC6N1SfoqArbeDCJDJ3r7QgTmJAZJsUqWIejbfwBse5fgSOECFp97ogTVRreHVQ0TdZuXDbfny/ubL+5tPD/P9TZknnTIfK90UVpc1lAcZpZvJmSgipZRSylzqNE3TNB2Px+UyTxFNcksAIRympKN36STpzkbWoiR6WB6U5jR3c5diwkpAoFWKCn3SujTHpYeqpKiwiCgKVNqw03qtHZOmM/HpIcBK4qtARt++cYRW3ZRotOTQUGb51t4dLclKAHTbRMbttyHq6jWMAUPX2YkWTv1MZkFlv1h4EYwQcpFrgzUeTzUYnx3s1RXiACIOFudY4Kqis5VUjPB2v2/sPnCYaqmaA9VP0uhGouOf6NAy9beK5+6OSiqzMZIDMR/sIxvwKUz2dGzQQ+8APJpVWahX6T2PMm6um/nuOY9hJYrv24olXi8HYRji/R95q36pEVymBKwEQJYiZCAmPhmDM95rmIW7NRMxu0jjbjCZEH5KIS0ykt26yHoREEHP1/UsAIQjPRAQIkIt7j6pev+0L5lolfLaNRrX6ROO0EDxb/csjB3dYEVUIS3som2Z5F3q7n1e34NjYe0+2Z3kSBbnnshKfJWIFNKij2SOme68q5656xRXm2slIo4tXbLfPBpd5/tp42k3itPhwGwPn+81VowynZD9OZud2lfl9mtYTD9yT/f/3mY3Q8VXHmoui7fewP673AzE9OuIzl2Q/hfpZFGBYmKPZ4hMZMuyJwVdAp0lKoIiouhFz/tnpkbv9hzMHRFqlb6uvEvjBHrFCen8DKdB+6rIYqO3ozQ4UQBEA9cRw9h9nrz4+4fpc7rN1H4qr/++N+63eb8a/zdkCdz53/vp0CEp0iEM0HLG+3t8f9yi7PsKjytvHsjV4ukQ0oTgv9pfzARl6LqA8AUaXjhgr1mdFsk3MtFzXfSLBKpqQLw257Kv9rC5+MrL0ugYnQxjmsaKizvWxdsL2pNenuT83devbX2x5XHB0nhZxRYlRVj6iO3HYVj/IuLeRFlwqLUc5jpPZSo1W5gn1BtaqursUJozSewhRQvRCZw1UG91nm9v799//PD+44cPHz483L+/vb19eHd3c3NzPB5vbm7mea6iC5pETzAprgEp9AK+P0y/v5V//3R8wcNF+V/t6fJ84tKgDoAeBKTSTS8VN+bKZwrSJIbqSpLIoY752E3stmKThj+aLJB0BrY0qhJLAdhMGuvTy/r0+Gsp8rg8/vr1GS6Yb+AEVOa7cysvTZdnW55O375duLap4LS2UwP5WHQ5zvP7h2JSbx2XYkqbhBCfpLrJuiZRlRuIJjqt5mW14lBhgYz2d448UxkWHvU6Q7vJYZKDS6TrwsgAS8vOmIEAdxCWQtLMwnuOAKSTWK1vDQeyGhOWgto6BVBcnZS2OrCKiE5zrbXUKqIM60QLgNWCYAIRL5lgSqzGlbKwPK385cV/e15/e7l8W+TU9GmVr8/L42V5Wfh8xvOFJnSPHaG9vmAFgi7U4IvYBe3ivHQ0f7D3qIjQfWxOiAzHMpDohFzZl53pGZDc76n/kZUAVHNqDnbXg9EEM2I9GjHsplinYjczH+7r7U09VtVeOxtEeyRdTLjfsyokaOLBI8giWied5/nmcDzf3LjfYX33Ira+mNtatcylzEVrTp/HjDrN6HqYCkQKAhaJzlZn5pE6k6lGC2qNvWmtrU64CCEsEEBx0JZjB0AjpbKTolfqpkcvhkO1SaE3Gl+6XqLE9h0xvqhD9Y7OQja3DNud0SaLqZ17bEgBU4nGZ9wfENcqQ2GMUDd2niBHJkfGE8YDZ9LD2USK09LAgo2nlU3FvHEANs3JvVg27ygWpvMDELDeJ0vT9GcfCvhe7e4Hdvf82689M7BTt7sAfxypc7k9m/RAofQA67h49Dv7wY13x3i28ai7ezVA6FlGIlkiI7wm2n31guNSIdV+eDuJwDeGX9PhxN02GI98tSR28OA9Af3eErh6174q3trn+5PDDJchEwIf6B5Va1AZBgeud00dTQrH3YarkjlXIGrSYxZqeGzRDVRylYiAiTVSlAyQhYQzDxOz7x8geEFER/QxXz4fK0vaY3yRAk6AToa+e/qQaME7EdXTIqNqNmBLCrA7j57bzkkJnkdmpnIs0NTd6Uz1mch+4Nvy4vXxdj6CkWNU1m8nDV0wzNlgYUIWcoxZkG1S0N1xieJ3jzgcGd0w8yXpIFTFgaiYiVmLody5X3mDUgq2xdf/qkzTM0nbJDstdKhMChcN/lEB0NyBdPw9+1giorkARrXVVvu/S41djVh6g1209cN82w996t+KgkC2EKAEbe5O/rzah+NSqfveCJbRahoDyyjDGfYfbcWMq8VUo89sXFh7FURHYGmOx4+3cxfYfduPM69UXS6qkQjeRHw0bIV4z+aNr3S/Oq4cHmaAtWS8gyZRe/zmANUX2skv39vlEct3nL/Z+r2107qeLtoW2AI3hZOWrE5vdkdWAcRqNwcwT9Nxmg91mqtO06S1BPBSVVGUIu5oxqV5a/ldFTWzKLRYzWutDw8PHz98/vD504dPXz58+PD58+d5nm+P8+FwuDnM8zyHTVliSTgcxSANTmlUV9j90f/1Q23THStA+1t7fjydGwFjkoll8U9ApFyIHXyNvVGDpG5hfgwJ/3or0E+ZkrMRFHwFpHhnXiLQVpQZSodczNfn83I+TUW+P387nS7QCgB0PczT8cHk8NLUl8vj99PzUwN0KnxsNl+MbLXw4QZWipV6NhZfxZa7Y2mQo2sztoWkRvmNCqR4WU1E1LyqFNVirLVG5NWMJMVZCkUgyEhezgtVUYJClMnmFVjVYH8TKKSSXC39AhilN0imGQkrgBQVwg2r++gtIiLugV/IKUjd6amqHVzW1iKH3pZ5OtbDodRZFIC6gSxOId0goChslkZ6Q129LJRvF/z8In9/lL/8evnHkz2e/MX0eeVqxTgt6fn3yg1vyfhkUIZZQbEFvjhX0LLKpVuiITqzolRk26aSdr/Q6cHaTgQaPSXSKy8rWECUWtriKq7CUqSIWPqbJB0FKqJFSC/SKtpcWtEmmvBueqEUaHY5gVqPNnWezSEukj4FRfQwzTeH+XkqbZrtMNlSda0uViBVeZhKUZZSRCrNTUAjncFI4i4CraKlVI0Wwm1ld4Cz8lgqRGYR2mJGo4u7mFWIKzAFRWQ6KiUKaTrjUI/teixRDC0XmdUOj9pFFAsR1ZCaaL3w0173c93SBaSH6E5zxTcUSqi32OF5Y+9p7fFUEp3AtEuHbP6Vsj3uHuUuETSOvmIZZbgKR+LVuohFlVBbB4DIv20AoSGvNKVZt3zUFQiuraCvK9ZCRWXJmSdw5seVqbwmveiPE1aaWIey7P20bhYPtAWT8C1N/80CHD93xlySE+9PeHvr6w/GUbK9WtYUbWfsrD7ufg2QGEdkMN6m37qPPNLN2kPlk+Kzeyv5AiKv7vXK/okPo43BPxvtfH52e9gTeRF6ZyTGOtdWurZO751542F67J+bnV9/cLO+1vlGErn7rnl1VqGk3Q8JY0KBgfgPC7Kv4atb6H5l989zsN6OgfM168GPnNFX14nf9h9uI/9mGoZ5NMZRkgXohzfJ9jTjItu7vHlOvHEAxiGZNevD1T/sDz9A4gxTA+KSDlIkiVUlSqIBcRcgSVaLiEALhGqZ0h13zAd+g30f48RO/nk9VDszOs6DAOp5Yt+vuxvF/wMjHXnl3+821Q8wfNdPdf3JVUDi9VCPb+139au7dOFy5Vj/ULi8erAUoB3x/cMzdxvtannQB+g/xzV+7nbBlemf8R6S7pEvRsKQ+pqIBdsj/f1dSG6rsT/lDgKUD3nduaZXEksYdQRdAuWOU21Ptn7n8miXr1y/e3tutixYFmEDm0ZU29Qo7uH4dad3EyYAXAFVPczTzXw4zPNUdSp1nmcpWoowG2ZpW21tPK9taW2xEGFlA92UquqHm5v3nz5+/vLTh08f33/88P7Dh3fv3tVaD1OZpmmaaq2VMJgfi9DY6AGoEKcry4z18jLP5WMpPh2gBQZd6D8/fWsrXACnTiViRcHI7jSG1bKbepEOBWQ2ms+tPOK+YR7slqk43BwsCNZxh7s6XVRUKX5Z2+Pzi63NzstUcTqfhSJauTbINE/zNN9IvXl6Wc+n89dvp5eXZdKiqrRzEaOvh4rne5rQILcTxCnN17U0L8sMa9LW2KsTpJUCNdd1IVlKmatOwY8ToR/CHWZBbdBEqIUECjatGdKg7PXCbkPlchQJBDhJdzhdOrdI8Nm5UyE+Guio9px8iMckz+5A8k0oNbYWpALemvsMVFcpsdOqkc29mbS1uYM0FXdwdazQBf606D9e9JdT+flF//F4+fbSLl7WCBXVChJlypgAXUiiwZ0WDxwYvhU0h5EGiS7RACBGkWA9VAnIUBlD0/ejoOcPM/wf7DoRIAI5souCws5u3mFQQlJZbDOwIkLhwtVNrb1YOycPKQwsAiGKJx0KozJBRtyNoqS4CKEQZRgaMqnMdTrOh/UkAKuWensQU6xGbyXrZbSU6P8AN3FvbCsImphZAbSgBp3j8eCgqOuktaqqFi1V1VFpMDcu2sQk6L5VoaVX4XH0t0nxDchuvb099jJ/+zAo5IEIbO2j8uMgwx6P2nGJwgH07yB75hIUpgsm5hZwkP3dh8EX63WvswYMfSiIVJ9JHBnyflwsdwaTMzDRMdIdSxkm6X7fDR3RK1/ZvVMZXbeyKinsRo2Qq23WdizFfxoC77qm67hrrTjk/6sRfmVz5ye7gkDpQIAcw7AsWaQHWzYFtw9rbv8eXw37Ssgo9nFS3cxppXSBff0km6LfBZq5Td/rSsIrBMqbY/8u8etwGMY5nQ90O//tk3Q1nUvw1X3z5J22FYmkx6hT3Gy5zQIUwc4BCLPSXt+4h8xHWILkSE4xdLOEsyuAMIpL0vEB0Hsxcmdt7HbmEPP5QJIOcvSUUQZ6bL94wr/omHsG8ODKIEsoX0ZwrxbHWLLB+jWMUZHoPNfBJ8FJlIwuMtJhuSuCUbVnSzbLnunR77d0/EV6IyomK0WKeBLofNtAlkEMIGQiyvu6klADsdm0kMm51HEbLED2zENhJ35R3Qhh8q27xTuGxTcPIVw3Yhc2iW8lvS1zeNhnFAFTUakdGs1hv441CwDRRX2bSBkDFH9N3R9TWXbbLJVv5GHkjX8ovSoieX7SagD6M+/PzG2cVdZEj/crt72ROZlrj63v562CS0TevmOe2S3g8V7s6EP0vdD9r73cictm5mTk/vry6AuWmrmvXIHeIw4biX2wIIgIZJfo3DJzGCGE/gjBERnlnUpDa21ZGs7C53n9ztNXP3+39cnt2dvZS6OCgKl42Bau4lZcUMjRkFsJ9+QuFYHWepynh9u72+PNYZoP03w4HOb5mOWUAIDmbK0ti2XgeVOSLKVIUZ3m22l6//7j5y9fPn356cPHjx8/fry/v6/zNNdpnkqtVVWC4RpmVSVg7BEFUhHSXWm16cz7Fj1Kb4rX1WB19r8+Pr80Xxa4OST6wSaM27mt4ViNEA3QxxYIvEKuBtvj2EqijLAn3CEQeAkL2Vmm6lGm1trj8wuWFWu7FFSwRDLWRWsRKUvD2vy8rC8vp29P58tlrTWgrlDCF5lVziscNLObCphJW093OF/K7XGyZt6aKqZaRSF6bq2txrkuc504V0z0Iq4RLpZma2sNQCkuwjpRPeN2BVJK6at/y2hjp9j6EhPz7K0LjwhLUc0CDzd4cQeau6oKkmheJEIeSL0bQCkmMaubG5ujrVxbs+YEL/py1norOlEOohNRm8tl8ct5OS/enI26QJvphc2EZyvfT/b1ZN/OeFllJRjU7wJFlEWru9MXsAkavKGtMBenqEKiv43FV+BQl+TgQ3TsJai9M5FHVJjRKQLYFNQu/CfAqA1KBSSF2qWWVmEho4xbNGI9UkpRQ/Sm8PivCIqSWIFsAwJWoPY0ZqjpKGLJ2jMRiLQIZIb2Gz0+D4dpmefDNHMqkIoMSECUGjqXpYh4N7lKrQg/qQXwQgpERedDNTMXL0VrqaWUUqaqE8W9ubsrFrqfVzNtrs5ZfdPvIQNTG2IMUTy/RpqoxU7D0Hddeqfk70J3s9E2af86GjX+PvwECemKnS6gB/Er3ffRPw16GwunYAMGS5xV3oS3giebg+Mfw9Id3x3/BkykhnWweUH9kmTY99zbRY1Rla/KTraethwBSAlnIjRgCHCB+LBnuiZ65WDEJ7mEySwIDgsh+DozC0ZF5M7S7kFfkwBA9QhZx7IkpO7Mg/2L7G2G4fJsunv7VpghWeAqnXxzN+PxgLt5USWpHcASpg2AxHvmigufuezWxpWf8+rD/ULq1nW6BCEeR0WTdB9+vKDvrtY/1PGyW6xk5H96m2fpWf1t7fbsc1gMYb2EBftPMwDjQUm6Z6vFyO+MyqOwPsNiQ3QOyu7efeaEWjLu7r0qNOFAlp0McO2v0a/stsGIINdPOFwoGV3R+zFsfaRUztr+soVmo27Bo9d1puF25ZhX4+66DxIwbT/Zsb5cFS1It1NFpAANvd1BJDFEuhGh3crH+G8z8vJeCI+dBFCSwUA7H7xEaCJkQcowBmkU+qaEc+egS7fCI8TJYCDqroKIAEWVnRl7G8+9WNymhhSYW2JUXAIA2MGV/nouQkj35a29fmgb874EsldcbifptJVp/QctQQ+M7R5MOaqEh0Dc7r4XXlerJWHbOs4f7BBRUbff3gIhXAGHli4TgkQjxjVkSp6KLfWxzWiskkxpBXAiRk+ERoJRwgF1RH/NEsWwyHZzOa0Agt3T2YGpjLnGyNuOtdqdqPFyvW5bBHCKCoGiYgIpsOLG9aLLSfyF/G29fPPzt8v5xfzZ26VxXYSrigksjFvCncWjHj6sHB8PsB1T0Zubm9vb2+PxWOepzodpPmotqCVYhd2dXN2xritZIqxIcyMdqFrnw2G6ub1/9/Dp45f3798/vHv3/v37d+/e3RyPpcg81+N8qBqLzeGFANfgTMyUqftK0tl00lKqaqkik1aBvtgdxNfTi7B9X1asK/WQnpcI2EAD2R3/wM8KJDk+PfZZlmdowpUlSxfy3Kjj3K1e9NCXmycBWBGsjigkXS0ifd4sUAattfPLy3NV93Y6X86XlStXgKowL6WauJtj8fLSiGVSYzv5ev64lhez+0ux5jRGGUa0VzkudlxtrjxMentTb5xTxVykuijYzH11wJuYFjGLRg0CoIp6QUmWhywbBRAcSY0OC+83CYXCwiMpTi0hiAq8EeIrAZhRshYx42QR/hOVEv0jHCLiYt5Ls08LVq+Xi58Xrm1tblQjDjpTi4tIczlf7Om0nE/rqeHJyoW6rL66ui6G+tL4cjHXemp0URVRb+5nSolqVLqxLeDqdGXztcFWSiVUVCWL2A3m0TYN6WB3sZbLP7dEso/HouoolCGNJCDw/fwwYaOdJSgiNXpHA3AHHVaCp40iXkDAi2qR6fZ4vL+7eXh31zVrBPZNIBq4BWVEtjcKHe2wLoiqFnFRQCJuakUwTeVwnHwpl6WxnStQq2TLMwnZJ2bNbTVbb+bYO9atQUDCjDbSJNhignFIUKsSUqdSUalswuIrm0gTNSlSPANkYe0255Xi6KCD3cuknA1WVtkk7l5BUEgPNC26AurSPuw/RfSiDk2Lca0h3IJ4T0iRol2wd+Au4eJR/JCwGokCX7pE8eXmL2g/ggdZgPzJrAQD0gyiC0CqwntOuTNKZxXEDuDR39fD4zPapDVRssmmpCLuYLDt0cUl8hiecgzeq+C2sQ3QSo4VbIvRdps1dTe3o397VI1af6n0AACDSvAhEEoKsw9CnxIYKGGzCAMxdWX77ZW7o5di57NJ2EGq9KLqmpbbfrmkW164Ww+5MXIMoagQpHAOQ1R3qB6nhFWTlL/hKho8WZdJ9uAdRCTq3OJ2ozFLGN5CwCNenMsK3ePM0Y9YyaskwBgKIvusiIsX6pVdJCJJ3hNFwOyAp0hCtSRZDhiMx6yFD0ZQtACl4+3EkxKuMWhdNQoZPaI3GRWJQmgNVvXYM5y05ABhBCAoQHMfJqnT6QhAi6o6oNcMtTGr0nOE6atF9LFj1FI+aegOiq/M9oROMCgbQITqSkRccq/CPLvt4dpwZDc9w9bzncHs5lHHb7k9uv8ohUiQdIREwg1bm1+/kISR5kHSmFxPBCAM3oLM05H0zK7U3e7z7WJgRHhS9cRDZvf3bDUIeGdS6C6z7KNRcV0fi4+bC50Z0CwNsOaqiAan0dMO4h6cYFJrERF3NxsQahmeW/iEOVkOkqrb4ja3Qa7n5lFc3p9hxD9ClrkCSNKzGDGRTmkymP3jczpzvWcqObjAN+Ge+yFLsYMERogoRQekeFDXRIROyTbyN0UEDtLjhP1IavfOYzUG7UoPQmgRwNIxS7orymhwkYEfYlCXmnM0H5Rew6fZkyVc91iCUkARmUjauoiIag36BUIkImc0kSom3tQu8+UJL4+Vzy6/vNj3y+XxeTktakG/1ciW2SuZIhqrnYyq2QUAezUJJB7MSpHbu5vbuxupxRQ6HcvxFoejzjNzcm09L8ulkX5zuPXLsrit5isBrdN0uDne1Zubm4eHh4+fPn7+9OHDh/d397e3d/M0FdH7w7EoimhVCVfCaeYmqu5u7q23Vi0qVao5KiZXLO5Fzh+P8n/dtUPDLO//P//tF5zWl5Pb2cCCKHCUBbyAzUWVIm7SREQspkgi2hWCRXwE5MJBokBrKAR4QRKmSUMz6Z6qObxBBFVAxXrJXg5FWxQK0+1ywlRMyrevy7pezIyNoHIxlGSMhjZTu8C+N1xelgLCG01fpH3nfHNubHTjYcJxxiTqrby/n2/Ok4odZv/wTu5d58Ja2rFKEbZ1actaILVIKeLejjeH1VZnuzkcTQ3Cw2FyJ1A7hUMw1IuRvKwipaBoVdjl0lYzKmTlkiKPCmhbLDzZ03pBwVYepyilKNCsuUS/XjHH+bK+vLycVrvg9uXil2VaG0+rP53a4s1LaXypE1HFWZpzbdPj4/LL8/l7KxepTnFRgUMLoQ4ll2gvbm1xbwIXo4iJn9XdbIWtaOYywlMLexcOIRllAR6lqEWjUWkCBoxsQXsdxQnMuE7isxNxCYWUTpEXuoQQg5kZhQU8sp292aGAVDR4rUXEfdFamrWpqogU593t7e8///73v//9x3fv398/VFWxpmWlryqVAjfvIFxxCWQFmdw+LFVp7o5plrWxqE8HPH9f2nKydYFZ5ENUxc1KUTNrjSIylypKgSp1XddaREXM7OI+TUVqVPz6NJeIXkeJTxHx0hyYDtpqubSLu5cyC6e2tOXR5K4e5tlgzVaIQ6VqYafplIDBEs7m9OhZJqPPBVhQJAJTYVwGsUCSGqrZqpFSSpcgDEvvsfAgDwOjXEfgaD1qHqeiQKIILi3e7rsqBNQWyz1MCKdIcila8z4DYZnBzGFL0QOkiGas1+iqFYgeLQUeTYRKYQGx2DrVm0BlO3tlJgRAa62UIlLCmMtaTYr5kkZzcplCXSlYs84+LMUYYQJgW7vLGq44GfrOfWjLbqVH8N9VpJTi7t6MnhUwNUPJngFNCWNfLBCkPfEedg4ETi1aRau7R0liOHRRUC4UoyGbDmwByo2GVSXRJcO+ZdCPeTjVFDe3NFTD8lFVqqmN6AMGUqwXN9NXM5YdeqKtYQP4CLNHbVUREiY0i67s7hHqs4yNKXJtjfYdambBpaaqJXrYQhVinVVMhCqa9GYqjAZ8abZndFC62Imm1wxr3BLP4r2jVzdKJR2A/P4u1J28sF0a9VFidLaMj0eqWwZePN3ugPFs8LGMwfbK67JD/vguuu9gKWWwT2boTKuIrNmwbJ/liUqszSTdH7l8RVUyxOKAOEMy93j//mfpz4DusxeHlu3pdO9FdQ9wlK5yd5JkAZgkK1AyPANZIuBwgaq4d7W9C5ZHvGKs6XicPrvoIOQdRET610m6B+MKQIfQUVShHjshT+sucTzuftBEXpdDbe/b8wr7QXC4UMm28RL0pSDBpowMkqP7GiN4E5mQ3Wu+vilJ9E4rOQJX514He7j9HgGH8ZzcvcWYzM11zrhQnLNdD+irPKoHewgII6Au6UOKRClVZG99RECQoWjZ365PhLoHoQoFGoC3oHjJOLIK+iKIHJL3BipANhdm/GmXxAuREo/nMOR21uG+xSAUCOHCco1mL7aCF/qC9iLtmet3Xx+X8ni2lwsvq6yrILlrnE0lwmPdwCVBJ7wqHHBHCypGUOiIPrUA4KqY5kM5zlIOhK7NRCGENTIaD1oEtTMmpKJSpmm+OdzeHW5v7z58vH94f3P/cHNzNx0P8zxPpU5TKckokrZ3rB8Rcc+EvfRUWDDclKmqFAfm6mIsYjzQHqqVsp7v6nL5+dfzb9/tcr4kxScMiCSAsUW6v6rWFlX40tdjOpWDmaCkRvYe6GIyulOEUhC9G0cRsZtYIVtny02XOMWNwN1tccuGXhbApDRsAIUBBrbmelnEfALdzMTtQr2gHVdwXeE8zDysrYK82Gn147yA6zzpc5NPDYe53B7krFQ2b24rq7JqEXUzO7amioKytlaKTLOKgvRmLUr/QxRZozWDtSLOUJ9KqrS2mhENGYSQTa6SpKgwe3Xmr0KItIY12heQ7ri0cjrV06W+tOnpwtNlvaz+dGrfXtppXVxMp1uZFilCRLWFnC718TI9u5gWSIGIau0MWY7gxs32Di2kewFVDHSyOW0PKpREEYZvZgkSgwZxs3fwbMomIDGVHIJG0nAxMiq7ogQfXRzREdl1GbEuQSRIUVyAorXOWsW9FfWiojCB3N/e/+mPv/+3f/u333/56ebm5uZwO9dJC4QrAYT5GBFUAVC0P5kHCFs6gFdYikxTORwm83k+1JOqhC1lDgsEVvNJRwDR2xJZO1X1thgLSKdXihlMSLJME6VHNVxoMDNZV4p4ERSICS0YNEotmJzeRIVUakAGInMiNYc25LpSqeTARqcJUQgg8Vo9+AJsjVcpUigujkHZLEBQwaVaZwlGSklTddg1QmovJ4j0s3ZzMZCZoGQcJ27Vg1wuIlqnoW+GdhCUUJnuFEEP8DGIVkUk0jTYKEFT2Q0xPvRdtG4AJP0gZN961doDmN33yP6PAzIkXQOSNEBHz4QURJp2db/j7km4NWllP/K08WjsujVjyDv9mGQvRQDRKlJA7VFvQbpRRZwQFJaAeg+WQgZMWpLELOI9Mh4vh9jppLiKItgL+tOGRKA19gBrf0UHoKwCRIBt1ExAREFn2nBEGP1RzOMgysjndT9pFOD2RutZ+tAHRwFIVEi5gL4VFfXT9iMmss2j9DQFgKTdE6MPI0z3F0EGPaWTBw/YU+CnCfTUBoABdxnrAvtDBkm27G9zdb9gAunftVELOswwgQQFhuy/hWEg9sKoHjIdNxdRbs+GhDb08MDOv3CQbqNYbUxtugeJSJJYdgL0FFUfu868nndxJ149CMaU5JbH2CSxb0Z2LnZmJgO69yYlPCkRZPFx7O3OLyObmdE99RwukiJKtiH7sFW4cnu43bN2YtadYfqm1ge7uR5uj4zihFDQdEQ7HHr1zQHAMLgFFsHyNLX3UKvtLj1j4+i1gPF59kPo1n+s8m07b2W13Ncn7GVizlek3nrGaeyZtLvSg1LEvsuhi2hBljv3622o+p4qkf5Uw28ZC0F227/3VN+Jy64etocR5VhIueReI9Cw3YgQMQY8OoEFMEgE3/vDMFaio4WN0p/RchRcyVq82CJ2gr/QXpb2vV2+n9r3E78987K2dfWkI43Sw1gKnllkjsAORGX3gjF6EJFaq6pOWqK36DzPImJmq1mdikJaa97SnTBrRBEpUqSK1sPN7d3dw7t3N7d37z9/vrt/9+7dw93t3c0xqgjmWjU6LwKetkgHV2YxAbu2Sb0OFXXSnSJShA7cHOef6lxvipjcovz343cvT//47YVrgxlU4IpGYeNqWFaTVeoBDBRVJElD5cRq2HUP8JwC6ZwCEeiVtGZEVWzjOGeaoSD2hLkiAOm+utEd2Zs+42mRzgTSKwVpMJoEWDyStODlfF7ML+KcL7VUUbdi9rxaUXi7zFWelvXUcHc73R1qURa6tYXNBJgLVeHGquvN7WEuSl/nKne3tbEoRQuCcbgUBdBaa4tZO9cC1Rp72dTPsNPlcmkGCrSoatGJKoAqlU0KlCpOaWQzrlRzmsznZstqi8MhSyuni75c/B9P62nh0nw1nC7l5VIupoSWSikUbRQvBaUUs7J6cZhyhZiKEl7SxcqEPeBwBxqsIXqTqY4KkL7vfUQBEk5D78w/RN3W/5UACs9/+1BUY6sb0TtgeQEzy82s8IKQqi5srAvMTXVBYaT16lRKiA6De1E9Ho8/ffn05z//+T/+7c9/+P3v390/3N7fTdMRVDck60sXT9davMe8e0BQVUuZ5tnbsTnt7vbhfHo6Pc06VSmTu5mZueF0GeZBI0VkrlOtykQQhFGYpTQAKk2DsTRiBs62uLtH2+PEK1tmNCvq5KsZoQ44glhU6GTAJwLMKkoJg6vb5xGo6syMih7QDOvNEPXZGQ0ZTs9oKIM3RyjWHkcQoISNxaEZMYRtXEQjWfTaWAL2SO6rW/QQZBB9kkF/WBI1p6nXwwr3HnRzdyT131WZqWoF1GP/cyxBdnsgLLlwwLWPm6TVxV72+qOl8vbJMbyUofYIAt6R0vFWYyRzTFTYbcsRa5Mert2conzWKyvfEpaxnZOXDTlPIByAYf1eTyU7OimeXMM2DHJDYXDG7VR3hI/bq8WAbjDodQ1qvp34wObGhwkBCh6kqyHhpqEyiSL9LRgdnfsWs90DIJQZkYZrKgAn4AETk33wcVec1kEphmBoGw8tu9pkxBP3WOMwyADbW/nD/9i//MAqbcOxH5r8Rxc36doh7DtP5qLdtBEiEhtYuti17vpWHaszADIRduf1vQDgDYHKmILYNqYaXYtj/WV0CrYnlYxIcMBytF9vQBt3V94JBQIIbizJ+svE+CEy0NeGeKZ0XLBVqWP/CmnyR96yx90Bj+IMjicP2sEmrylrrjzI/Ty+lVRv567/7CDmeCRPsZLLRUSI1b1Klk9YiqTQCK9vsVtavp+1/GT3mCEAc3P+SEyP1Uu8/uvVJ8RQdR3ht41z9184+jCEMu7HHpe4v2b3Sd4M7PUbbce+WmbsI9/SZldDlLP2g/dtZDgAKkLv9n2REVyIqEDw3gqIBoi7qiKjxqpe1qX4SdoT1sfWntbT91P7/rI+X7hc1EiyANHDXgWecN54gJ1HBKMH1fS26sIirLXO8zzP8+FwmKeqqqStKykuoBO2rNYMCf/TmMJSikyH483d3d3Du4f3dw/v3r37eHt3vL+5PRym4zRPU61Vw7sAIBASvdOtM5nm4zkiHpfahaSbubkk76lPRR9KqUq+Pxzl/fE4mxYU/Prt3F5C6NUqwUzZnA0SVnsBKslM8yUtX3Ayxx0BocNVtIi4EFK6tUBE7TWoUlxsW0h7YxFIfeOaMc8IOSMriWKSoU4TSJhaEXEPt0KhQilGWnMzIX1lkyZua6WcmkGarUtVvrhcUB+W43Ge5ioVtOZtaaQfKuZpsoWC9rAeDjN8sam092s9zm2eShEUQSlaC0RkXbFeuKxrnUSE7pFPLS+tfF/08enUXM1XKUV1hVYptbJUK0VUtDTIsvrL0p4vy7nxZbVz42mx1cUgi/uy2sXwvPjiQhQRbT5RblABKQ0KmQABdXUNVB1EizSFEzEhAaIb/Z5j5Llh+kGycMcJmFPTd5/39gdp3+/CV1cb9Y3BtJ/YkDgMMyfT8+HKb4pUQsmrQNRRBCKlqBYRRusGpz/cv//9l89/+tOf/uUPf/zpy5cP7z+9e/dhmg67+N32GClRhG+ECkIFqmqBuE+lTLVMx7vbu9P9evfAdublsvpKFxLLeS01tXPKXvPWZC4VQigKRJVJ+Z/Mkml7QtydZtYC+mCFKuYUKgK30KQWkQaLIGORhLDSJQN/ETd0SEQuZTcDQ7HuTclN8ktP4gyBkCdkUrd7A5tZz+uh0gyQ0+KqyDqEsidTCebivZm0Wauvj13WeoTAYGTGCoUUoaB0jeqkJmT/ulYtVGdIQDMLXEKCWHbm+6ZWuq/26oEcLBvUPgOO+7Dm2+WcEuraqhER2LaD9iqy//uHHkVUj28zSDKQt1uQfjene6uRV+rYAablsFOvQyNHqxOBwFbUvN1uPUSv39dGb59G6dzlTKL63ZVDdJhtjAj9wf6Zk7nNYCADo3qjv1W0ftpZFAgM0X48ucmUNJlEAhEkPd4tnpmM0Qjs1ZoQEXdJ3rPdw/XTxgjGzAWuKGRV96vzIdIv8a7r0P2zNGcGpKRfUaJ1bcAYEp8ugsDPSaACQNUBuWMYoJ00JNEyVxa+b7A8dMWbrxUTB2CjAIoxioej9nr8fLq4DLPIS6IqfD+1RldVGa2BMoI77qWB/BZEU/YSOKa4ne8HmZGVAzcSJwARVZReljEW5a6sEPvAf5QwyG7BhcuYJu2ee2sXrRwX3O5bRJmxnGjX0ndAUr5keDgmK+thu1eK3v9B9n51LvFQnQLIKJPHFueglN3rC0CPKGrUmSZb9YYU6nuPfVDRUWyCMUfZVyhSh6pEoG2Eu/IpiThB/lPoThUVhvbpr9B9kk3k7RhgADqlCEnfBVHGPzTosHvAn8NlHiHAyD+IsjudV4YFtb9ugsQlP8nSQgYDjQBIFcWYSREIKC4owkoTW0t7KnZSf+T6bTl9fbk8PreXZy5rYe2uoSObw1JT+wac1hEw/xSkXS6l2eGqUmsppczzfDweD4dDrTVHTFA041jRHxGh5kRIaJ1Ep+l4e3t7f3t3f3f/4e7h4f729nBzOBwO89z5PmstpezXahe7CSsHsj+F5LBHzUSWX2sRI12hwoNAluWnmdOneb6dMEmdpJavP7OtLxZtu6K1kReBNAjAA2EiSkbc0pU5OKE+yVj/FhKvlGIAaMGTDve+VQeYUxRqvXYJ0Cw+ThMzAz/95HhfA3v1vTe4A85K04pgj1FRrQ1k0PBnt2YY62K8OIBqrRHtJMtZLg8Xub3BPJVJxU0vF7D5YeLhIO1MuL9b7eYodnFBe39eDpPeHacqKIpa7FCLiizLuizeTLUqieaqpco0X5b6dCk/P9np0k5rcxJSXRaIzVpu9FALtMBRLwsfT+vX5+X5sr6svlIulNWFqC4Kqcw91M1kVQSdSIyLKqKTNN2tAS5chZegYQ24jgs4MHJkFt24e4Kpsq6/9/aKOUm5FyNPDiEhGJt0v0/35s4ul+5p1iEw1lkuE8I6y81DdapCqJNJE6m1HoSAL0A4uia0WsrN3f0ffvryb//6r3/6059+/9MfPn/4/O7u3c3NbdyuhcWMHxwiUijhx4eh5j18rqBKLTqVMtU6Hw43t3cPtp7W07OtJ2sloic02EZKKKS15vUgLj2ipjKVMpUarJ6lRI5IHQK2ZnRyNVozRoUzRSC2upkXlWi/NgDHLjDwUCe1qHGki1CcyYA3TKh4Ox0yIXc/NCrLo+przziSgKJr6zzmdXzSW51sRmTWdEvKVnR3oofnho04xiefjEwuUA1+p6xaJXPqr1UJSXp0TWPAbgHIBFxF+EiGmdUsei/CHSJUVYcyld52MoCwYYbB9nZ5JLmtRIqeBYKAWo1z+uB5h6ruLp430nG1V9dPzNsAOxFZfSGEhLRNC8NdNigxhq2aWpiJEOiPHcW8jB0aNsHVyth8A/QsQRZVw2xo4nHsQwCSmQ3phi5+aNCTtDy2m2reKesqIxT55qsOMGl/nSMySUaCmezx5k68jw78vkYZyPZuMbmh+wyjaEFq5/yKllgyfClsIBMZ06mq1iunc5J6TtH33naqMbDo3hnCj5JH4/z9wPVH3oY1kXOatONpSSpp0XqcOQT9G6VsVE3ScRUZY/3BZEV8ogoKBq1ZLKMogQ/GKCJ4ipArTyWilxkkYIcG9tFPINqYBUXSHkh3AzQKjlN9hK1P4XY+AUvqYg5HK8zlMa9xARUIYb1mQEkLkTHGeLe8+jj/aDZezcKbr+PVZCX9S7gaIiLxEGo9M57zmDOY35IB05Iw/fe/hhGL7EMqvjOAX0/e1QJ78/xj9UqvM97fRbYNvEXIxmmSRrmS+TNvdcUXQew2zn5whsoR2TBL+zFMHMjuw+4ncD8+8d0uu/ZSNd6LSE9RRygR3frf9U/pfH/bQxaw2Kp+UZ61vYi/6Pq4Lt9t/b7Y80WXVc2BhtAphNIj6KXJKOTYdUaLx+tBNAzglmqZa43Y/83Nze3hOE1TLQUajYtIM7YU09ZoFINQSymlzDeH29vbu/vb+3d3dw93dw/H4zwfpsNhOszzVOs8TaWUqhFjMG7donoRYF+Tm4jpQ5xsXSSErg6D+Hqjaz3oQef5CMqdoInbZPb387czzRMKZRGgoFt3/zoWPAQBSXjWGjncG9xdqVZRNOHWjAxMnL412I3nFNXhZ4L/f8r+bEmSJEkSBBGJWUQPM/MjIjIyq2q7AfZh/v+bZmBmu6srM+Pww8xUmAn3gYhZRM08e2EVAjzU1VVFWPigEwmJw08Xkz6wI3lxsG+KIGHzITWjisABoypaa0jmAABwIxMSrYZCucoZvn1r1LO/qJ03W0pfa3X37VWtaVn65bX7zSh97f3hZujmzX///nxZy+NViwX1JNdiZib32+Zbowh3NJdMZVFDuW2X//zz9esrvj/7zdW8uyh6NV+4VSt1XVgWV3m56dsLvt8M9dzIHi2MVMCCEpPZUlFLOywqUMtioSELDwOD2tRfHU0O0WCVVlkAmntL447FCryncRClATZM+jf6681hJwm/l6o8rivfCocZY5AbWBJHYiDE6FcFwIQFatBJepVEbUD3vvmtu/l5KU+X899+/eXf/vbX//jbv/31L7/++ssvHz98Pp3OUI2e1iPIAkfGk/MjISntsRvKFtXbkqmYKcidalnW9Xw+n/v1cfv21W/Pt95VN+rkvYX3HuI99m/vW7GCXlhYSLPg9OeyVDOUUgGIATd2eSfRe+sNbvRCuTV1R1vWCsoKLQgkw/VKKmRl0D/YFAyOXmnTBj2+3sjS98sn7eYGmWwz+ddhu2PH/CQWAAHXCSK+7BPvw5gG0q64r3JJEysVIYAwwHIks7HUTq2eQ957tjJ3OkvnoUfS1BAaZrQOAP1s6W37l4+gr3cTlvMgYqapsyjlMIdvrIISvtuP/vWNlvzha8zSvmTzOml/WyJGpqp9s4IaH47nCSL17gpATp/km0NyHpwuwL0l6PqdszyZEWMVBguniEXqUd0Opeser0nxeXwQHdw/pqGWzIbzJ3Y/q/N2uZRuUdkQDJaKvNCYkLtc5cGYGaiTMP1tVrRWIiv4pv8nUcpMeQrUwTkKgBHzkEHqgXu2AsAYYJaST0cCZjBxHwRjddNGiEgk31j/7rsjMYzcgZ4MtyTIsoAwSqTJhC5g8id7RGhsBFbtkJ7937+mF0EWssAJYRxFqjsTmwkwdnUBgrg3Hk5h2HOX8pDiYMyC3SLaQJZbohYZOZLjnlQ8vAEjTRGDCVfBR+0RgGEvvntGz8rvEfgHYm47Z5EoMPJKJEe0/u2l1LOgLZ5+jjD55OJ4cHdNeHg/NoAjYySe2du46YB1YZA4GYIKHFIfNdQWddvDKM90QaD54r/k8vd3TrUMEn1gB8ehMpRxDgf4cpjsCukYmaQs06cEMLCtmE4573fvvMIwOgdQQ4Lk2MWfI8C+NskUOLzJ/Xb5YSLHdG+FTIzIOPGaXiKiRkU+65gQaQ8KcJO5iqm4V3/F9q20Z/Wv7t/89ufr7Y8X/7bZa7dGkLe2xRMGpbm8mxQbRgmM9uRBcYe7jO4uDwZ8whix/4eHh8fL9Xq5nM/nejpZKWIF0H3rt9Z7j6ic9607UBZjRV2X8+V8fThfHy8Pj+frw+V6PZ9Pp3U5reuy1FrqUK6aTz2CLinrbcQgGSOeG9LdADFCWaykw5tvS6UBxTpr9cdi7WFpeiBq6//4/fn3fsNtU2hBJ+AogiWvXuwA5yD+HxEmDd9x17MZ8zP0MrTUbpSMRsI8miQpJN5JsWx5EWogkieT4SDFJ9HVk10w9glTpAFR6SoSLLDi6t8btlc9325mVksn2Zq35vbSTguLSFe5bdcNp8L24t6fH06npxtrNpLwUllrLYSDz9+Li72ruTc4uKlW2vrby+XL9/L8smyAi8GFxgLXjRRfe600E2i9rP0EWenyjLZEyy14UPDGsiqw+BoVFN6LrAhU99blbSxIS5pe85m+j9gLhpLOGH9IiZEKJaL6bOZX480sQ53Hn2O95p97hEsHeYhgCPAs/gVG96u8ukUMSipUgSpYyOeiVtCorXgv3s9L/fnp+peff/rv/+0//va3v/3tb3/9/NOvT48fL+dH1sXFYsVJS0ZPZ5eZMSlZ0piKbJBFp1iDBHePKt/umeKYPJWB5dvWc29bbwXNihWTR92q0YLzRr2rDoTq/hLUCRplrJ1YQKBT1nyT2FvvBvgkzTZuquEPgOzRQc6jx4U6ig8r04qjC3bs454W86RlTjtitNyVMMgk5XvosGZOEhz8bPOoQcmxE8uaS38wnROHO/FFAH9QWRfMURlQj4+miaVAEDBzpAMxlVHeMKt2/kplGmPgj9OA1lAVHVldGSlhd+9R+6esmJp6fw9bHJIYWVbHQ7jxMOY3sigmqlrwLmRKa/d8LGJq9zORTXbLuFRihiVZco+mBRG3M7Ps6rsfw2MI7U51JiiADgXehRp70MiAiTJLlid5Ky3CuHr7dD7Dpq7Dfi7B++nuAXtAQiR6tgqJMXvPPaioZgF9GMaxeYUtmyRqTG1WWprV/VkAMtMsQeLoWddjd/iVcYXsOhJ/T975ArBMi5asESdOAtlB2auDo3Z0XzjXx/ezEQ8xQ7t5//HDjJz/69dxw+EgLOb1d9/j8DmH6R+9sKUeTBzDc9t9zWLGBK4xULQTHDKHADBS8WSQUBVaiYRAbFoNgmekyxWI6th/I05PRrM6cpBPMQWNM5l9AWN0zwUCA9KnfPHQ9+mOU2kxx5FjOhTDWh18wLOOPAy+KIc62MnD8dit/3jio2j7gcv45iWpBwsT90/S/K/h8h1WcxipR7NmvHcGjf79Abv3t2dKM7IHXa5pzUzB+n6ER/vqzeruInz0zZ7dBrofCYQOu04zcRFCw6dfKxHvxPqknZ0i0sySBOb9ywiF0gltNGB5FnhWH32mBmfV0UmYYyUNSXITewQQ1NMcvzcrhwrJs168SlXb0l5w+472zbc/WvvSbn98b19e9PKytMQgqnfagO+mCj1gKA+lz2NLRI+msLFKodVq61qD/v90Oq3LstQFxVzWJd/atm3qXmslA3YIFoORVkqtdT0vp3VdzstpXZZ1WZZlraVYKaWYkQrmH0sfxI/W/1jo0dMvqXhy9shA2QlQNXZYdxkLoMV09u1jcb+SP50WPNnWThW+vfyJBnd4RX8n2KaLNm6Q7ljHBACmqCWtFMFVDD1hJnAc2bSGNgvrXGGZmDGg6Uh84ExLgQpuvb6PAR0uqEBAiZrtUSwe4jDxRQ4DSgl4lDfdoBs6AEOJVGrvJvnzthWQgsFfvF9Pp5fv2+319fHMFywmdzX1VkpZVy1rNdq3b+iO3r0JrffunYvqqby29ZvrFdZprDXqQFkgaxHU3zIwTdJQhk0T3DjFjAY0STUgCa6uBu9CpwtyBneew72r9e6bgTTzWRyIAjR3AhXJ177rhWEaA9nggffcE5iRVBxk5m7izHgKdlpPcvDDKnOlRmPvNsyssEKdAbZLuUPJ5Aa5nN5O1s5owraQ14oPl9NfP3/6j3//699++fnffv3rX3799eHx0/n8aMtKW1kqCm3qTafoCkabiCmOjON8ikAEuHprrXd1R2ttltPEC4AZCgiXqxt8KVXZCTLQhk6TSYSTlpg1A4DWWtyEpZstKAy2Or0O3HyQKIKlFJbCramiOM2NAjx4P4e7bQRpJRockIiYZGSMhw6SjiH2o7xKS+vw+TQ/PAtp+jBDE8U6VhJKCOn00wOGGqQYSXA3Z5WH/fDG+Hijs/yQ+/VZa5fc+aH+lJFmGOFRJDBUz+6CHj+5D8RnVODNqH6sOo+68e4Kdz185pTGhef03hls4/3dMI51jCQHEChn8C56qCDH7LxLuU+V/8PrC92CnU8TyCQrcE+EKu8zEiOUTmQm40eguTuAWJ+wZ3r0AGp+7LgcDoAJQLa2HKs/7Lb9alG0AcBo05yIZzyE4DkNjDHg2TIZb9Y0ddBbuyis1qwJrpGzI8ftHQDn7W0aj8rqPvSoppD2nU0geMSP5D6kUsrYvh4wMxQjg+GUgcAOChHTOI4Hw2XuoMAKZ5PRw4arhfHDtKSzVMDHkwZfbNyqcoR5sLdNjaRbljGNlwHm7hBMRTJlr9gxj8OrmpbWjPu4w4yJsArsYqGxtNZG2XA8gQmkEyUB37Gs82AYTdGEMnzpsSLhx96LlWib5aSF+MwjaoC64PmTcXSBjCWGg5jXYU4F74uBpgAtNQrUmcGwMCOiS7eHlA82sTz5XU7S514EAeOgslRGQDlnUcNFUaC6MKF7h1XZKQXSBZ05tplui6NgI5LmBKlDLzcLvxyCmwOwskrqwV8U9dPTRhBmuXY06DpUd40HkQSF23iQQbvUu8tH0xCpmMluiABFWUh+h7NEq85QLEaqZDzgYGRg7sXASdKTySEVR8SjzYDsaMHM05E3OVHdzV/oN/Pv3L5p+/P28vt3/3bbvn73221xWcBrHdUKsywyWrmKZDHrvXOcxCRYjuxqvg8mR5RSaq2B+79cLpfLZVkWhsDs/vryAqiU4go7A5JYSnBfnJfFrPbuZjWdh3UNzh8zIwNMXGIR0ugfwwjJO+veRsI2RDAohGMTlmTv3lt3sdYqloiVFfVr7TgT3U7lejacC1bo7388//O3L9+/fYeZLSfvhskE2j0kH9qGUlRK7qgSBgT7vTOYxgcJo7ctJchRGccJiGShu4OFVkpp3TC4sDoGVygRUIRhcSrzBhJ6o4JKQj3C5MGrTUOpGd6KOGMhQG0tlVrQSIfcQfBOh4oStvbSNnWIyz9fblsJNKm21krRleu5VGP95u12a9u2gXRo626+VfXXrXehV+9yUKzMLLsLLDDBBh1ONNNh9MTp8O6tSSiFpSyttUjMqm8ITdUdfQsraXbhVqld6nuPmSSuRYhuK+hCqREq7a4wUeWbBFJWyjGrSDK6I0/r4XhCY9jcE1MjCKqs/06JQjQ4mlcrZhVE80HzYFrWur18V7tdql1Xq2qnBZePV3u59O/f2qa12IeH9W9/+fzf/1+//ttf//Jv//Fvn3/+6fOHz/X04FaFyrqCu3kAiO6SxWEJpiaFhM4sBwHcbm0+EQn33m7b88tzu72Gmva2te219wa4FazFvHf1znDHJUlGqxYYvrIUK6Tc220rhaDfbg2wWquV4r0FRKuUUrxah3vvTSIqmUXOLnVWWem6bRuXsixrcXDvCGOqMEa9iwB4h9CTNr6U3ZzymSuO9fdouZJZ7XuDdS7o0FoDnDNYRiRp9AQgBtgzVSkHSaAhGf/m/gkDN4lH84hbRsHNqEFmqgMuK9LjKeWGxm+tFWTWKPVeQpLlCU4wBFmtu1jMjN5Jkh5cTFNlWQaks0MWokoqOELNkL3VwzJEUlIH0wEZZJuhyLc8hjv/zxTIx+OzH5zkAo5Pss4wppsHlTqrzBnZy8i9Z19nuWf8aB60kPOF5r7Jm0RN/E+Gh1ySISyHDiCZ1BJRE/mHA9vhwbaJOPrwgyYB3W6whNxN4y2m212CmaWDxMnnEysuSmU2h5ZCLQLJBjfnc+yWRBDlDENSgDpHTUtM+MhEcSfeHQbSQKbV40YnCRtMpYcPNZ0wDS9Tu42uxCeFk30Hj95bqI3Fm5sgnHI/ED4O13Q3+Y6TPjulHbYOADcV0Rl5jQxOHitiRwVpOCmaQexR8DGONHOqbMZKI/4absAwKZLLfCxT/DSB0QCQaG8hWokAGiw8DNQjrCujA/Esh/KpEdWI8N6RpvOA5JvTm6otWzpMy8IxyKeDC9J9pq33kcdQDzs7SxfCtZsO21wajGMcxFZjtCkA3yzu4XGUuz0/kWgFb/OA4xlndExzG8/XHMPxr/NwTmDf4fv5xpDdJPIn0OFqIult8yj5mN0nHIgGiczw+34WolnpnGQkayd31/cHL45AIBOIxegCASOyNySiQivZ32LJM85E3eUw9mvOSQAi8BYYsFm5r5BpDg78WIFsseKbbS/cvgMv6M9oX7x9be3bja+v7FtRzzx5BOMlWeRvZ4/jsRnevbq8yVvvksHMBvnPsiylWrj8sWCUvOXq9d57ayGXSjGW4sZsjLLdqvtkEAoAcfxXR1QfIH6UZuFd1G1ILQ3lf9hI8/skjTWaG4Je6Iv1x7WZUD6fSn+8VvvPp5f/e7X//I1fn7feN1idbC3j6BkM6BuosKdhHC3NQ+6PjAAAJtkrrcod6MESpr3NTQRs8j+ZQQVWoW0EHUwo2aCOw7+BHYApYZWohP/fe4cMRhRHlzcQGD3R50ShxBWUPEIcBStkFBI30MSek8ovt24md28NpL+wnXwj2+vt1m9bk5sFKWGnaBtk9DzQAkY7cc62KwFzNkDwht4yzipXb0CPYlwI7AbJe9AihTjrGq06lcHntNAGnDmjM5PUG0lDmQ7YQHjvr+H530uuuy/EdLvuaQA4AmRK1mcdfwMSS+luDYAzWJJgAn172Qx4PC8/PdRfLvWBXrUt2rh98Ff0vp3W5enp6S8///Lvf/vbr7/+9Zeffr48fljX1eqicmJdyarUMho6LmWgRkxx5F73AK2ViPJE94MsqYGr3W635+8vLy+3l++320tvN++v8I3RsBRZM5clSUQppRhK5sMhZa6ylCLhdrsJtiwZwW7uEXYc3YfUIQqFlNM39RfHwqWYSm0ydYHFqZDafQ9v0YxQZZFk3DX13ur0zan3gWU4athpeMQ1c36Qyv7o1zGPXpG6JvtinJLI4t5LoXn3MYb9X4/WzrvtlRt3arGp0IOJ6mCwZpAto4VjWkLwgR6B1DupOLbqm5nJL6DzLhCeui9oSS0thLyU4IXR1gZzGo/1pfMWnC/sf5uzMWb7X87YoQbDDzPXR9KG7i3Daqnx+3y0cePoKKxxtOMLiiqOUcryv3uNAfuUNMPlO1huh601JyT0upijjy8cEQSm/YccmZ/xc5+tv0RlnkTAsGeOmS4my39aEvcjz1vUDOkfxpp/G9nraWNxtLXU0KMaTDJSSg5DDQVIAN5zb0yha6NxBjL5nkJH+x5KOZ16aBzgOW5GOl8YFremVCaBSd0fB08k+zSo4iTsWzbubocK/XGXaYiHUh3Mp2MNZlhXY3Q2qgAZjWNDG+f3sS+kxiRHWw4mCCEbOGFktJQxyzxfUbwSA5hvAAzmwdAs/dBT1gd+xgOSNGoMRw16Bm/3O4V0iLBBh+KbkzF+/pnO97Sp4ws+eTfe7rD3L3KU0wjBu5vO12HT7zSjJLLmJCcC6e+OAxPaR+NPaY+/jGEExLb53Fljp0U3LDNm8kTJrkKLrH+y3R94EyJCMHy8cSEh99vIaWTMNOthsnHevApZIvIfRpUP90DAgPqlYKQIjk7VmId2nofDkY51HEipsTyBygtLrkiVqGrsL9q+s32Tnr190+33l9cv37bvX+vWuW3MeIn5uI9hoGbnPBykydSUXemGRbQjrPYZuR9cPZDUewPQnQExbs3lMKOVWorFITWzzbu1mxkvl9PlcjmdTqfTaalaii2lmEXKKDOkkJRtaO+2X74PLgif8i07i4f87kMqR2SEYkfrUkMvtV+BU7Gr8YGPf3m4/uefr4/nejqX//sff/72x1e0DVJgpHcezyTyjxxOHro0+BJys2eAkJE/62bwADVqlk4BSOjZVAJmLCYPQZjI60A9AEQpWdVFDPk5CMXiXMstdoZkVPeGAlqhF/gxBV8A7FFMhrMaQbKIpEtkV3g/emmbWc3WZeS2ba9O0Olq3kCFKyTJlTW/Q5wo96wZw/+JbjgGyk3o3tR6BK8k0ZEkGm4y0DdK6t37huQ67KCjNyjzzLCSRzaV5I+cdU7BcWD6ivSAsjfIIc7CbLUzSYT3w/mvX0M6HW4K1FUgepCWFtIImW+F/uHMXx7K3z7Yvz2WTyc/yfttof3F20fAT6fTw8PDp08//fTLrx8/ff7w8XM5XWA1aL+CsKzJS/bTAACzSLZzWEtkBzNhzXCmzeDIYhJE/IoOeGvb6+vr6/OXl+/ft9fnvr3KN2gjWqHiMHJsWtIj7j/PoAGUfGuhwm5bv21allbq0hxb672hjwwmIvno6huXpfZ+w83tletSUAubN9EqGsKNTMqzsbuyXw9JoEhRFYaS0NnotD6wWIcYL4AkPQ99OiT7vno5R3lZsWt6y+lI7NYOEv5e3qNlBn8/bCACdkv48B0pTjQmkjj+IS4+x+beGGml5MTLrELyPXCYqDGuDqsFU+ekHjdEOmLIeGUI2A/3miZs/t8Ojg2ZzsdAkCcXQpypuBbNhrLUWB8zK6MSMp8GkGW1wDxSw4hHZPQ4LpzfH05d3w2akYoGBHb3xLBNyy9kgIb3kEHMaX8y9AX25sRzWcc4d6Mx74XRXdf3tlQMk3nHWYQ9E98eX8iZs+hZZ6bhAHgSxGUA9zD5uUTDOrQh52NRhzmc+Zk7EPI0SYnMBtQRPU2yBASr7twEONYyu6Qy7RRpLEwu1HuzTzMWiSzI5eh1+l5Jjz09Mx3C4RAePRtL+sW4R48Tm4AN+sF8RJwkP1x/iBiSKQpGEG4OOc5kfnMC/eYKaA82kzuITXNnjBhAoDuSkhEhTWNpo9NGzC0OfuG7qbur2T9mmYHBYJYhfKFHP0tQoQKnCzS97ONGnAt6mBnfDev8ZDfv5vC4T30e3Ckgjq9heOH4Qxz3DpAIIpmVwPwN/NLBjDvI5+HpH+6V+/Jdub04ZdO8CN7MsyS4fAhoOxzxrDCJK7hAzWzuwe5WQOHSqCjlsDo/9n9i2ye5Swh3G9Z/jjzwVMilFyKMNGTMYWLzZZENTBNdPfqLeopvQZVGYJEXuXnj9h3+Uvoz8J365v3L6/bnt+3LN9s2qpt3RAdCkqwsmuwH726dcxiYn56Wf+SfZYZlWc7xWtel1FNdwteKTKyLzeWu1ls8htVSrMjogtNvTSqsJ7tcLg8PD+fLuix1WUutKsVK4eBPxdg2ba7+cekxlPTcV2/Gf5QwpDEKmMemArUWgF5vbb2Ux/V0PS218nSt9VyM/uX3r6056WYma6MpQqTsO9w8o1ABExr8HSOcMQIFIAwprMOVZVJYuusg+hA1eSiykvFdRTK+JA2iMRsJI3KYuSLq7gYGMZfo0VNAHb6RLGQUFga8IPJfLkW3OACwCjiM6Fs4Et1REtCiOAo+KyRFNDVtMd6g1XN6bE758Fen6SzBoyEFJYe70C2+LFnrvfchAfPYIqOdvdDhTd7knUGFRjq9K4I3kbGKegCH3MWUNhZqw2DI2j+EFstmOgOe68fjfC8w0+jczwXDBze8wyhjyJP7l2XeOroIS5AKtJb2l4/nv3yo//65/vqgvzzw56ufUXpbnKWBZvV0Op3P1/P18fHpw+XhsawnWHVaIqgkBElOxggLTQFIG9KyH9XcWLYcphlKoQsB4zGzYoB6u71ut+/b7Rnbq2mrJiNVU12MKyjjxGmq0SLWpg6gbS6id73eXl9vW13Por1uXYpodh6NbPvjqiyu4r3hVaq+gliA6kEG0mnBRBqF7ZDoXXvZxX7GhybdzaiUFZorn9GEeP9DzlSJZjVjxm7uW6RHJps2o6WYIeKAHJ7EUSIlmve9jMKudO7V/XCVMY7LODuxwWepABS7luOoJDkyR+KC5F1S4mhNHKflqDp3ovA9Khc9ZHa/ZRpLYD8Si7+7OKYhdWfP3iUHjtPy9jqmQYMei+Xj/e5rYE8IC3QfiWbdO1oKOPu4bOxcEmZlLsG/yuofzrsUxI/QbubdP8vhJ2NlMeyijA6G3Q+MdU8DwUxS3yKohOE4YUokOTMuKNOsfZn3zS6dWeVsY8McRyWpxgS5EEGioCoZ84gRPux68xrGISLPvc/I6JIYz0sgokW4M2TjTiQgTyJ2jHTVmAnmHzQ4omOfYBT3MEzcUGTWd+TM7loogn2eHX5jOOlDM7ZtkmZq+pH7m4PcdxBpzY/lPGzf3ThUtLsYiPoQZZSEHkVu8dPwbDZtZCnBizP2726kdjdjYBYnOIZMio+D40Wp06ToVM9OKJBISudS2Sfu7XacEsePu3akRFs8h6IbtYY3dvDo9o0w3seDzX+ORZ02WbzpCYL3XCvIDZJKQB71XnyMssUxcnNTZFRS0wCwMUmR+0v/UHZkV4jh7KIllke9hzfoM3cvpRQfbodGlumNatknMwFXh4MzrjQTCCSPRUXKXoMUImNwrDFkBhgydmxjg2DP6AFR12ksgjIkqsgAh3/fxUoE11Dp3fpGbaV/hW6F37t/29qfrX19xteXdbuxe/GA98S6OotAwvdu6sPgzm0Qof5h+Lu7tsEZErj/AP1H+L9mE63YXfe+ZVkWK7FDunxzNen7y3Z6erpcTk9PDw8Pl9PptNRarSymWmZlY+7woFJxD114DzUMwuyDOB5KK4hQXMFsRUS02PtGILgd6FFkLEO32hfzk6PUWur5crFzxZX4v6Bv328v2633Te0VLlgFBBrYKbpnoheIsgxBsmFykhzwAsZ7hZzScA80i3pdzu5ZMwkyFD0UEK/g+59YneDIcozCmrBTLJhBaUjRMtgG+jZSmMZSLMV+HOS4Zrf4VRfo8AhmdLijD/LNKOyRkC0OCAA9e2x5ISwKRSl1WFj4o/qZ4Q0zqGYVSahQgfK04M2CJjlAmaHu6A1+Y+/s3agSkGJvlKBkv4GsKbiqvDCaBSRkKghOsnOGIlvodFEd7kH94SMnnhETHqRIytbx4LHTuPsAxzP97r2lre2CiX1bgHPBp+v64XL+5cP6H79c/+Mvl58f9PnUP110Lt3dv3txW4ot63pe1tN6viynS13OKCvrCbZYKTIGf5Jik1OSF4x6FGbKZCivpMYIZFe2ZDar1QJj3bfitfi6fKulUFRH27y9GBvVSvRaUJnHOQ5koQyjwHCcVcBacysVcnfcWmN/EdmFYrWPCFQtpZQCz6QinKVRW8f3LsdyNqD0IBFMdj9S4bZZdrifQRoIoQXyk2IMEn0CmfiIYPCbIFYs6sR/TgVoFpbSIeSENC7fmFd3wdesPUlzmaQY0b1gDmVYbhIYjumP/A8N3XqXi00WV2RcOegJZZCRPasSQoVEQZxneTR3YZiKM92/ePqxdfus1MPRTkkBPiB1u0G/WBT0a34cI4+awMmIOkU0GXb8XRiRCUvOZxwRTABo3oehlO0/sI8uZsQjCiwISVSnN2Rd40mmvt7fhDXmYXUcllP7mgK4w4wclwbACNjtvZIGfJ9TdTIJVbM6haObZiSxPCOSRtItCF9HLDj37Ly7IZvHRqlgiD0YKHkHaOESEEPazkWJ6av3z7A/1bTYmP51TpP3yO9IPw5pHK82JjVjWEwgwTAmdgsgxiTJibuYxL+87JzKSmQLHI5eLUwBIGkw4t3HaeYnYCDGIAAtpUFeeaT2xjWnCMh0/2BmDV9/jG0/ESN1EHkoExMDoBE3EuC+mQFHD+p+hPs03n0jni6WpseDSz3g7oqWQwlH/kH4arwPlpg+8Cp7pGR+bQg5+qCOzrUbVSKSLINc+b9dUObJv6/HIN886ThRd8ry+J0fzgwPGM25b3mvcXXw4GNppigfJuCY2DilDKBbkAOkDRY/jvfj0Xpm5SywVaDBrGCPlCt6uR8t0fdPoWQM3v+qCBq9Iw4a22yfOu55leGUagSc0EeuwNODkcmtd26b+nfx9axvuH15vf35vX156d9ebOuriKRDCo3mMO9sNUIuGtUyY9HDjs92u8iO531Ob8GyLOfLer1eL5fL+Xw6n09J8pO1NOEV0dGJpZRitCbv3pv3zfUq33x7WtePHz9++vTper2uaxQNkuZH7Sgpu86N7X3UOhqb4KDt7tyYuaXFoEVwt0YXgnbRiqlAG3orFeqtmR5qB0upa+mPq1TBv//x7bc///j27Vt7ab1v8AIY6hLRvzRVJbBSMZ/jKM0DlYtuYBmYveoiBnOs7nbyVDYBuDagYxR7AlXsQVEqo2nUq8SZDYUgZKwyGgW4RqN7Bh0aNSr9CaADhfNwpx/LoClXOAAu1DLqHJS3C7Bq7+gOCZ0ojmSTEgqAEpBt9Q5CJavWfCAeE8PWO7zDgyYr1HVo92gTgtn7ITKKeZBdhjyDJGvMlRUDjWbRpJziyOGPQEY4AIA3yc0DdzRn/v715lBzhH3eHF6M9Tt6DkBSFYiQF+hSdS34fK3/9tPlr5/OTxf87efLf/z69PFil+rX2gvcoZWL22JlXZZTWU51OVk9WV26A6VYWYjicFe3pOel0jo3cNfjdp9WylMQIClDxNdhrCrLWr3VvpbTwrXWpRaie9+6NmhjKYuVICMMyUBn7yylkBh+/VAxTBECK6I3V++3yFxFx6AYSeQczMjeexeFkhzrXlzkggo1T/6MNJ8jGEpXED29FblTJuAo85Wgi5nSP07Jm9WOM9t77MyAlJSxnQk4WY2JXRk3DyvAj/WsY0C5FscPp978V6+xTFNlB23LKFzE1IYdUnCJ2rSgx73eyMn8MGv58rr5+Z25SaaKYU47f6i14wz++CnmzM/xh/Gjd+bZ8Xnvr4/7K0wbdZh8B0aKkf/MXsjTQXP3Er1k1d15PNnunlb0/Xr5weh680TjQe70zv3zjoLv7tFfYuDgcxvErCpqme6fvdZoM5/7NUQiM9M0LJdj8HAAg8L/DGdzjvPNZgNQ3buSRiLi8lOC78Uxd69gX8npcDMTe8i2uP++Kh6Y10GlQg3f8WhSQ1L0C8SRrAXA3ldv2GTcrbL7x1Ac/YimxdTEQg6/P+LywITVU4AN23dq4qGTRx4gbdkkQfTuDmX19Pja9B3HtCGKFC0UR2BJY50whErmEMPDc7fkJkpolg38iZRwursdvz+6z+049lyPwz5yAkJgQMfPphwOPzPdhsNUEsl3G6vg8z4T3uf5+zk7EYQNo2RAWUZRwf14jys+KiKCOG2/5pCI+3kugaVIqqBBC5JlT7FpdzF0lAsk4aHPYwnSndvFTUxrLEMoYyajVEBoYktrsBQN3aUxyXs1c3buBEf7Rg7XiyGFJ3lr/BsQgfWx8zJOqTi4c/6HTPkBSHTuPW3hkkU3mmgp6shGeAzqFm/eX/n64nop/GrbH+3ly237+uzfvtntZt0LKhtCMBmt04Hm8E2oWKZEi2EMiOVUEwGbt8ogFkdZ7HK5DOv/fLmcL+fTLAAwMysFZDBSOABjc2/xgr+2/tr7+Xr9+PHjz798/vDx8Xo5n5b1VJdqQ9gxPNIQb13HstoxcVHGaADg4WcO8R8Kz5VtcTkWhc7uaEKDB+F9rWYeBWWFjR1oVfWqUrGcntYVH225PPz+9cNv5z/++PL3+tuXL19ut623xkD1WOy3OAgBiuhRsiIP9vH9KI3ZJCIzJIdX2GYEoq0ehd2cOjyvDTEbTVNDIgb1MB3smZGM+K5KpjsAuahj6DotePWemSuGaO/DNxwkNgO4ZNlgAxWGQ1gUyR1iQYgdREmFRrgHs4KR6hbehyKGQzdzqjPyHnB2gmIQg/ZoMwDA1DKma2x2ctawrZ0Ci0KoZGtYI4uSXzzh4kGzSRiFbKI9crfR0yKYKRXEyoHZC8lzlMHMyckkzGHrIc8s9ozfPL+73x5BIvaXrdCvC386158f+NcPp3//ufzlc/35w/rx4+nzx/XhtFYbkGvptFQZwYVlsbpwWVFOorEYWRwgUXL7d6GQS7hu7t6504Xz4AxnwHx2Zh9SLoy8UspSbTNblnI6L6fTUqt1dO8b1WSg2VKLnE1uxp5MaR7MNnkjdWbA21xBv16MuLWbq7NYbzfWUiOX7a3ISqlLqWjy5nJgc6nT4Jtj81aKdXqh5VaWuWghHQwDv6XI5jLrUA9PPwY2gkc5Effn8Q0KhGSTkGnVPn44LsUwkYdShiMdrbck7WMP7PW4+xV4+DCd9ciBR/IQUgRk8hOXMnYw99XobhlkFRxkOdM9PczDbtDPB4xpILMkSrmTPf3XYaragfY9baFIIMfjxzQah83oVu4czjhWlhnPO19ivPH5yfgcJGGCabRZmo9zV8wd1PZIAR/60acFnb+Kor8BxUHOUIzcCrNIbA4pupzhYPmk43VoGDctJo04V+qahL1QZmRJoGx+n2MbCLgrBQ5VW0qqDxt+ym72TxtmJx5gQmEsMIXvd13MwtyBiBoAKCjCAnuaeysrARxd3T0opdNG9jRwCEnZZTcNwQ4WodsQIcWMKgi7lkPUMPmGFSifEJaWw7B7b8/uBp7/d3qJvcK5XYBAv+Se9vc7m4rKG4xGymFkZwotssHRg2T+cvIlRaLGe5civDHXYd8lTsA93U3OLl1GKqrjA+ce2rqkOZXm9RQSQWBBEt6P8xOPOd8Pf6NDDnYhwD9hZ7gUjUjl3mdWdOz+/agEuIsMM4AAeAjjxfwcHILd25mfvZWYwz5hCRfyAJ7PlhmhH7J+H3TJlBRSO7Rxv6BlhdG8yxi57m+dtv2b/a4BkZzneT5vLHIWvmSbq6wSjB2j6dJx3iUjmMeLW4w/pyXEQgiWuNZItce5ZBgY6jrg+jUwRnsYxWYWK5Zh9ItgIAaYjSlc953/BuJDpdI71ODdfLN+q3qVvq/tz63/uW1fXv1ls+b0Dpe0abAHyTyAtT3RItorZKYRw/DsM9vosELQYeq1Flvq6XpZz6e1lrWWZVnWdWV2vTXAIsLXuopbrda8t9Zut1tXc7D3vm3b58ePHz59evr4+XJ9XNfTshYjMprouK/Mxr43f/TiiH3ybpdKQWuGThTSFbV9WVEAOArD5FTDyF8HQEKo0OlKs7Wsp6dT+edZv1/tsd7+k6///PPla7sFFshgHn3toMCSyKNhrakHOLtTTgVtcJuRJ85ep1xokIQSZPgHnIHCKzUknX9EvwEMrgUOitIoQmcZvM6p40MFjxrixGuklPcGxE8cXsAeIQN0paIsLChOsBgFUqMSp0tE755RNzfKRyc2M6o71OGCmUSTujoi9xZoHHR4gwSWKMgFlD+JVyYEurQk6J1J40MSg0ANDHhK2J2S6N6z6DD9nrAknDEGIBFSILyPwpyDoaZREYE3/uZox5Z3nBMZQQ1l+4Wo/M4iVRhYpacTr8ZPD8u///zwt0+nXz7Uv3xaPj+uHx+X02m5rLaupdYTrBqXkVYJEowiq7ITUIBSlsXdCTMLrFboE4MpeocCzt2KeBu+zQfk0CveukgWCgXqwRho5bTU81pPS7lFHe04KmGELF4y7mZd7jltSRhDM6tWpd63Fv0jjRHfyXNRaRnvBIBkEDZ5g7Yt0K2giw3aUBdFYulO/AGLLR17c52RKfbZO4uDsCPEKg/VGoepiJZMPnw5Dr4Nt8jTJs339A98WAOj4n/M8I8zLdIOHAICvYeM3tpxewW9z1GxSWLi4DPxCQCZc+7RlnSmkQknK+WwMh5FiNQXS6R8bYhxEcksA2YLVTP1lm4FnQO+PY1pcDLC9VAFlkQvMTmZXWHZXaAwiUenzKj02JXfG6Pizftxsniwgt7+6/zkyCT47lc9KTP2tYs5LxyO4oB2SBH3fXde9ku/G8a8o3YblSxhg1nkWSUdqUEGucsgFUgHwyKuwuimNdruwJhB89nbcd4XiEggSR0wCLnEYRkTk2ioMvtYkRaHJHCYfSllGHOiBYnK5NIy+Qho0+CkGXoLKxkJRx5TIIUHqiwvIGU09taC9ivlpEQEirUceEg1o9RWGFD+CA4h+43OA3aAW3gWcg1zJRLa4YYzIMHpQY59Gr3ubNgVsTZGmpW4fVgFYGE1mgkWDbAA8xlETw1nsDSaMUETjigGyCXLBrEigrDeEHZ/htn7EBwSRPXeEV0w4hmT/jh6n6OBAhrUXI1KUEpS+Uav23AkNLT+KEN0eVMWmGZkTdEIKYeUCt1JoPduk1UmTxEQhHzRoXt/gQS9TwarwUGkrExNZaO51cdWQe/JZUTu0ZRA5EepaY80jCRtBy3rQg94ayibkYtg/EGyZeFUCnJjcZCuYgXI8F867Qf342hohmflvaWjIpcp6wwjqCgZLbcpR4qDN6KQJiuQZa/SKYvUPXEATHiud7NCluhPEeQMrlZrHVtMoaEUlSklL6KMGaTLCHfK1KEb+XquL2f9ie23DX+84OsLn296ae7Zg7NLNRrmIXeOyU44CVIUcMJEdJd7tFVvSBgGXXIrroJSRFO1clrKuizLsqzltJQahDFKkqllWYqV3jvkp6VujXI1771vW3t9ed2wrp8+f74+fnx4+nx9+LycrnU51Vqj4VMxGAVHApR7pD2sBRvP2H+Bb0P0d8i47wwMJjw0ghnGIGCW5N7dG+lGCFXuDZDYSqF3N1uiQrWylsqbbw9d/9H9Lz/x6/Xyj8f21+vn//Vh+T//s/yf//O//vz2srVFTtmCrKZEby2JJ2jUJnd6M8hi+RRNK6uxkuwkaLSlA6LDwiIX1FEM3iKpUM3caxxuRJ9J9YzcG41FVgXPD0ebFEb7X2NbigZbW5DaZnoiMUAR0RihLxJcw3an917o7AG+JguKGeDOTCXWokh8x2zTomeyy7NcAQ1y7x29QVLbRqoiJL/Do2dnZKiHkRQ1EE1CRSG2G23egvFQJHVsMCR173CnIJFWrBQx8oqNCSfqUUliIw3OSI+g0ApJj22hSHjkMQ4NGPzoOcLl5O7qm+Rmg1c9v1zNVrPSmuu2ycrDgv/35+Wvj+dff/7w86fL56f604fzp8fleuZpjVRZQHGsLFUsgBmX7G5N0ipJsoiFLKWUiLnG4jE4Md2LmY150A5NrruUmxMFmKKLH0r0qo+YV+unda21ukPOZTmtZX3lVov1vm29kKH9VWhWrXgprNmVsncfMGhSp6UAuN02easAa7l1dfdq1retu5Z1LSxwubuBp2JF1Rd/6b3Ji8y61RtRRAOKv8KDAj0AaeFp71Z3hCEVRPKB2jUaO7x3F9m9R2w3JTrp0SQW4rDPfDZIItBblFODkmf8Zag914C5p0VJ+ODFH+curLQJq4axjNLNVK+yMBhnKDa0sKfdwqlMxeimPv2KGWiK+hgP96cX1sGGa2V0TFSXUFgs4gjJjCSPDgLyhDdFa4FQnZAmeTMSA9IBUU54QOs2v0UfKwBdDsgqDcwTnK9ItBvI0F3T6p0vDPvtPgeTHntUFCSjTKTqDoiVaEMfjPZCLFaWgwoyg5UEcTDIfpIOISr5wodB9PPqULFiUZJuhO+dCsJu7moplIY5CRaYidp6tF9QbLCoTwvUQnba4sEVtAOJiAWtU5bYASgWC5gsC2HpSWO5iw0LyiPqUywoYgggu0aMdIFGxJkUjbVnxi7h7LEnYUgYRpBBjOi3u2ZSIwwOc2WtKkewhkkCNbi/GKy+81SkFgsr1g8SyAQUdVfoivnlYeIDg46FMlD0UfLsuReTw22Xa+McHj5MU2/fWpEKmt5GpC5cHsmacR2bObsIp7lPY6McagBw9OoA9LFikVWYD5uBAgnJ2pMh7ElliCgelKIlQOzyRDcl5MsVcAU52M0U7XJABAggawNckb0R3MKHTARQlqoAEEsEpiPrkM84Vhkwl+gcdKh9+ADMYc74x+hVEZtytkfw4XJIwqCOzQjyvjQOYCZ54rADvvU2RyLtqzlRm6OYQVnXN26kcbb2oB3CVdlZtbSH3Pcdckz7HnoLDLIgm9kMU9r6ewApIvUslejh9/S+kQ6r9IiaJ/favO/opkJGSvfAcsBRQ+eoffTUC9feEfhrX+L2TrfEa8b4ewc7fDN/sds337747Xdtf/by5VUvz7xtdJmMBkMVmiuOsCNwQIF5cI8a9mCPd/cmp3dJ3Vuoma7QewXFzCqrWPIVNKDnZTWz7fUWH2qw6FIuFm+bu+ByNXeHaVmWy+Xh6eOnh8cP6/myrufEBEdhaE7OXeop33NfaWUKK75+95M7NRP2eFI6dip8Oqbzi9YkoxOzfC064Zi7l4K1tMsZveux2onLysvjieuiy1L+n79/+fLiLxtf2621DlVwoUVsIDyRcMC3DifKcNRjdhWwsDhImW1BxLmZiDuLgr90twPt5SiwnmXBuacK3VVqNIqAKHmAjDDjIxHmP8jSOYsYVHoYCV/iNlJPRdH2RA6yI5kWU8hmXMOi1w5GhGAEsAVvngWwntSoMqjkv2bUXzHvnt1kk/MFTIUeEbLwRZ1BnbjT8Mdyhx05VzzCoHkGg1EJ7vKiQZekIQ6iW6ZVsMhkHILMs3IamdHKkHziT9wVLbBZjFKEN0Wz2jzU+bZAp0v58HD95aH+Hz8tf/t0+tsvnz5/vj5dluvVzitLtL01FqtmVsoCq2QlFx8OyXz5aDA5pdBYvDQBMgDmKf1+gAs4LnlYgTIg+NSdY2IWK4sVuXvrZraUIu9JZBIKpbuTgfUwBpi0+0ELS63WdSm0ZXklsbnY11JR8Np6JQ00spZi1QD021Y9M+EeYTRH7UT30krpMmW2i4H3vY/D3n+w6+go3R5E0ttEas1xTqk+/N7cJ6RKKaP3ThzQ8CvM1Y4WzphMjEnH8RY6xP4B7KY/A/YTXwsX4Afg+GBmC9v3AC0O8MRArgImBlwIdMKzLb13Ahi90VMSRCwnfsU0rQeYWpMRKTDoYZ4P1pnYcgHXySowjORGRsAzMjqOScwjgL3y6f+PV8nA9N20HP2Hgf5PygBTGeuelaKJKE8WrIR/cHh7GYNnumupnYFZjz6X77gq90Yfhi1+2AnoyphBslaNUd1rpfz2+H+gGofw1IAC5gLOZx+l1RaoIxqQpIpzAGYZG1EcmMK4ch2338eaMOjRXGlXlp4LrQFeSKGDztHDOSJtibWA411NS9rMo+HL0VKXB8c/AM6mpgcLfvi4caTmv06khjQafmIeuYQ76VCZsNey2u4AZJe/dLf3uAGgzBxYwupyuek9AsmxEwoA+czg74CE9LcwqhHCeMV89jwRw84cCB96c0fow5H26fEFhD3gM/APunzTgP6H/5L4G5vh/3AosedEB5J7bq8cQQ4uptXShkamKmZjBo6EInaJuVvn5NS4e4Bkzn/8HmELD1tlTIGNzwe1e9sPRbrPGYuZaIaQlGXiG8fsvgERxt6M8GvNFq1Hn2y8ZhI397qknTrNRxEwNOALKSLscI66B+2xmcks45IWCGYaR70bEAHHuRmG5BkPlWHrO/3BjAzBme0PRqo6Rk96dQe6oS2+re3Vtu/99dvL67fen7fbyze+3ry1A79b3J1jfnOypAzteJZ6Kt41dABby1SaU4TVYrbUWuvlXC+n9eHycDqdlmWJxMXtdoM0HAC1lsBr7xu80zEbtdS6Xh6ePnz+9Msvv3z69NPDw8PpdKrVSpjpNo9MDltvyn8Pn4/pmpIm3OgUa5Nv6o3yOGzvkQGDQLN5gINzDCJZKmksBZfFUB/KaXl6enq6Pnx+ePp0/e2/fv/+9z++/fH1+Y/t1tqLWIPrHaqSdQLoiSqxLAqAenNUIKGYEmFFIHpXizhl7OLsMcbstDTIP4xCtHcFiWIgWAwiahlJj+gpzFIs2n/RpKQNRZjdIwDggEXIIKQONb8QrAZjcyb4SEgcZWRQLWLIgdQYfe9y16J1lO4evESD6agHnS5ciJ5ajHDpUBspScyyY2oucZUkBfmBjc3bppwHKYxyySN4TMmpxgz7JE6SKEGb6IBKg6Eg4REWNFtK/EPAW0Qmn68cejVEU1I2D7CYQfJ6Qr/Bt1Px66LP1/Lvv6x//Xz5P/72+ZdPp19//unDh/NlCdN/w2DTIhfUChbSaBVR0jBSwWO/B+JicJZPSfsvTP00Kd58+SB2yEGDn8WUHXDfblZQl0hIYKmFzbYmM4bS7L337UYStQZEVhGTi9y+gs/W4W5lKYaF9L4ZZCylFOcWa2ySSSWzD1tR8pSUgGlCFNgFl3VZVykMjpvjQ93Vdd69RsYbGGbursLmhE11hnsTxYzJ938wNOPLtkO/7mzD+Meh2ecaYRj9ONyX4B6xGjb0XYHs0KnT+MlnHuvoIRDiyseX1AcQw+Y5mirpaHxyf91tmDlujuO92xXjFu60zG5ImvnYEbyeT30Xq8EPXBxgXP/us5xLhRAatkjI9oTbeATH8s6RHIwUp/aLYHTvwuGpQ5iN4qbd2ssWgT2+E/s5rThOPop3xcGDTG8ECcbyjRrUCHBgGNbTATAAA6MhM0OUMs2M3r4quwTYt/2IFWFoQ/3oIMxNxdkJmLvFJqgB5qPD69zlEftszY8f5i+OgYdRER3+1lTSh9uXqZZjCo7iLDoFYtxC6MgSew5Jh+PdY7YlDR7FNBGOl52j03S2AKCLBlHsEGjLPnFk9sEhvN/RVx3vfvzruAFpnJRjcaNRMP1ujwBSDy99lPJkEj7DS6Fr0ptwAPJuJYxWt4x5d6EJ3dXcGwEKndnTIXFQw2EbQBVNDzbvMEvhdNdJ7s3uOUiJuY3entx30uruQw1MpAaucX4e7Aox956hO9w7ykzhNx4AIBTbCbOamZlbu3vNg5FLiQyt26HucZraY+ONhc5WrHkeDmGHTEHET8qhucx49ix+Ik2x54d1lKJhf0WVqtRhxQKMPel448Ht0FhnPhTBSLN6Sl8RBSh0qlW/VX+u/Zntu7bvm7803Lp6RO6DMNrZ3bPlr4+2oIdbSN23FKtdwegYrC63tkXFi9VSi3G1elqXpZzPp8eH6/V8PS1rzZb16r0vZTcLBoOWNxelauiGBjbjcjo9ffz4+adfPn3++enp6XK5LMsScDgw+F/vzt1RiGNspz0IdO/hzUWZO+SNZg2/z0bqJq8fevbQsXu/nZmry0RygZ5QzotdytPjsn6+XP/H33//n9f173+u//Xnlz++f3/uL7f+ClyiUIqg0AK8zlp6a+NBfJiwkOT9laTLR9FhHh8bBkAWs0SEIpNDHAWdI0jJYD/s6oHnSSNm9I8fRsNwk6A+NoOPAEREc5j17m7RT2A4ACXpnDUOjlGgKAw2jsz2mrIGoG9AiZ5ImdPwxN+4J3PolLQk3XvK5UjHc8RI3734bofsZ/moNbMOSdm3ZcS5gawRRjQkpwNNoXsNFKPNbMtQa8m+lxNdr+icVYL6FDKggsStA3hY6qcrf3m0Xz8u/+2Xy6+fH/7bf3z8+Hj69OF6OS/VnOjsCi5Oh+SW0aVRlL1bJ9Nyfffsbyy4o7r8wR6+/+RN39b5nd67t27Qaa1tPfkrRXmxySLt0a4BKKOhb0Apeu+999Z7KUutJu+1Mm3vYoUIetLL5ULS3Ztv3rcqGKuEoLk0qCY1L2uYX93NWR2ejTbGhhiFB9j1DhkO6jv9xWFGj3l46wDcbxtMBTEvRM5jWA8U+3cTfLzgu89tuKxD2dk+8l3EjXW8v28cDMzvH2VafpF3EfYY7PH6Q8/sDz6/PPTgcQx5M2CEbPYOuwnNmL9lKPghgktWFlNAGeSMHSo/tKOO03Tvow7Eym5RTGn/xjCLQXIekWkf7nMYkXu/W3dwWibDRAXJqE5RRCr97VDfLO7blTrOyTt7ewSap7k78y0EwKK9Lvx4qO9vh33d7yZhAtJSsuUm239Yo/5M3gd9RITBPKtPNL69Z9N87NJwxoFBsDgHRsDu2+u+PXxziLEp+FYwedBavK3wgaTZsyU3mzqHlT+ONBgJfWRCbLBu5vgkiZBHg4CSlTSxuICg4gTlFN3cFZUhGMZiZlisYsaJmTEFcF9RzN0JCSMXcUC+a/ozmFl/pW9vimBzXDycMRpAlzexMyxJd8BdN7AHMBauTLL7QAwPCxczcyLBWUrp1CS7NwxOEsMI/8+9tW+s45v4Uffk2DIz7smowFXv0etdGU+e/sQt5FnzLMzCjLVGLTNniCL9gbBpDu5fZgRm0z7GAyQOalw1JJShZPU1hq8cfRDDto/V212C8McSOh4mSYle6plQD90ikVK3qUhECFFoVKx2RJVnQTQei8exXQTkA3KUaAXNIoDZW9yIYgOjOTuJ0Wjeo//5Jji8oBb2KtV+s/592b7y9U9uX3372vz5hs1rnBm4EuXSOUrWKB9ujEOA05OYTHCqy103793R0G59EyBrSzmXirLWurIWM+Nal/O6RvjfzAq4LEvAMHrP9kNxYNVbJQV0OIllWU7nh6cPnz58+vnhw9P5eq3rko2I1OlupfTDWcY0k9988kZoMMG3x5RQbNORBnJA8I5ZAj7r0Udxi1KC73ehKbI8cjf5UsTeLlYeaFcuv1xPn0/1l6fzP799/x+/X/7zn7/9/cvvv397/XZ76c3gFoziaA11aR4tmwilyFZgsdxpSYEYSBs5DOSoaIQoM48zGrLvwP2QTr8EQvF5EhMY1KMSIlGUxsPs5H5QFPhkpC3zkDkR6kzCyBBvjswlILkenaj07uYmObrDKJqitVwGMWWDEC1QQxTVmc5A3CzRvIHDRi/ASBvmSe1g9h7IVMFc34MVG6CDSJZQkfzVXNAIZO469QBWBugodoy5Kq22GrcJMHJkTKA01CVlCx2xFCs0uF+X8svT8u8/nf7tc/3rp/U/fr58+nj95fPpej0/PNal0GBwkdXdwEKXyH5PfBv65agu36jOd4bmbhkcjQ+8+9rx+0frM/5qVO/N1c1YCw1ejOVUts0NgmTMXBxdAVYrVqqZfHvtbdu2UlSqF7NFXqxqpARd7L2vJci1idbgvbdAnaqjADCGL0UKpcvNywZvLM1LYS10Ayzg/ZjQlPm82I3yXbX1SePzLxyAoyThCCWYmUYx5IHmKA5PxmiOUmI32t45AIzTipBQlkn2waN4H/zaA14AojYo7f/ZF2gfvQCwZG59+gDcG0elZUKO7oc7+2Lm9uejHwed1sngTlSYwi4OzwdhWamPo1jmNWhKY4eAY4Zyws70aZjN2p0UQZpTF3ftfRtzHmsUuJQJ1Q5pMCxribSAzg/PJ55NZpQMPmPKnSP9MgN5gz5pj5cPh+84KcoFROYPDxtmzltajYFxjdnP5KNG88RZZDJtbpKzifd8vHFxPwSk3hxVDIzJURjupgaJoSQkVZ/1qGmKZYfNiATsdlvmA/0wmENy/d7teP/m/esHByzBRTn/+3xTZCKaDt2Z8tBOtyTChBlBP3gO90doOosRm7JQIApN5JERdwYpjeiWZJCSEpZitHGqAwobYi//P+qX57QIXYCQFbE+/jXxiVSyjkAj/Scg+LAjKOvqkbyOqqTedSM6Gb2fXOpCMzQnhZagmgQI+dzNllwySKM8PvfhH+yCMqpUZ05q+sCpLycl/FxxjXaDu2o5bLjjNpAUwdn415kKyO8ccB3H/eNtLqUNQUqSPRuxp/8wWWtHPGanmYofl+F6hbMSwzscocNRmY8zUHNxNJC+U/d5VkHQo56x/2jDx6kRy1TgU34cLNECGERalOW5BuOtjFGjHMCnwG6EJ5JTSibGlIWirFDFe/Fb6a9r+87bF2xf1b52f258bdi6vAFd6gjyGaIQZoTvDCdjiREI4A4Pe693b73d1Lv7TZ0FVitXlBPLicu5rLU+nR+u58v5fF5LNSuRaqm1qnvvPdu12r7QxVsA22spy3p+/Pjp6ePnD58+Pzx+OJ8vp2UtUZ3cEVaId/2Q8GfusePG61AZinTfXXMhYnWHcIvTd7wO3gUgxgqOHWlGsvtmTki0vkBcbBGEuvL8dC0/v1w+fzj99LH+f/7O//mPP/6v//H1patHvzASXQgy0iz8CqyMMsetbEwhdSR1JgxFgEbGzNmHAR2mDGOzp60TdCWK2hqj1RA2SKmALoJBFzC2pBXAxaE0I7Q3vdF98zrCPRARnZVIoAS1L4xwJ8PlTW5hN2MPyRO1g6CxwHs2shx4/kO0aV8LCQeVEef0qEHmN98Yxzws2LT2DpeNx9F4Rjizp0KAQlEt+6b5UDoonSAt9mEahiM+gVDzvVFWndXKIl/JDx/ODyf8+vH0H395+LefTn/9XH/9dPnw8Xw+l9O5nk91sUJBrTc1qJeyZr00TKxk0YhkzdnJvPRR246nPfx5MEQONvEb/btf4fB+GHoCUGs1Ej2iAjFCrssK9TQpuGiA6OKUDeUdfX+btJnZaV1777UsUdtQordY2KMmKzyx9E3eu6vJUW2BsZjIULYyFzbB5BvL5lZIC5wb7hl3xlMc98z9E3uoIZvewv79MRW7yhm247CDh4ESS5H7ZWyu3T45gGDvxzWt/ywV51Bvc5mOqva4QLx/HR8zzZL4roXRcJwUpwVZ4V04483Sv98SUpQUIn9M9+6KmFB2XcjrY+yZ8DuiKpPZaS/fa+wuG7bc8Rnfb8u78ad1F+UDMys+OQADbWXDMvO5gLswj9hBuEYZ39w9xsOdIpS4j0rS1D27ifIvBnrspzSncsIrppraddmoTZymgUbuCP9iD8yr3Wu0YWceTF93D/Bt+BdHetAaTFijXTenguNBDuv+NQeR/HYRvLWQNftGL6BNnEQcocOw4BzB1rCBYsf7cXDKXAxmkGa4RrsU5BBz475jobiv65j0sWw8NM8OUFaQUUJZD0Ao+lICNFMGtsZPABq7kiNsasrwXIZ29YSsp7kfNqPm6o64WiLaolLHU7lG6MuRFJ8KH1ddYIMa0YRINAtshEuNZsA2UqGZ5zJaT9rNIbGGlpQs+fKAgPJEQNgD+Dt07j7nqQ/jw0PpzxGXdngNwqh9P4ykoRjZfIgshMwKwRaCcpgwCDclPZbYM/t5iE2xbwhMfTaAQIdTMZL84RvGIeFA6MXVrd+l1AAgOdKUfRYVm4LqvQepcBrtzNYhEUXJOIgFTZANsrP8n8ig7kEa+sqpDrRfQiziANuoPMvMXKAWo5mcpcWHbCsV8TcUyNBrey23r+hf+foHXn739q3re9eLc+t0976pN0R/qNhC49iUIw4QiH5MaupA7948aABcUDeHqZyX0/Vyuqyny3K6LOdLfaiXnz98vNbzuq5LqQFeSqYCprNrZt6yAKsaXJ3oAEqtp4fr08dPHz//9PTh0+US6P9aIhaKoH0sujcEMVcZ+8jnE0m60/kpuwTILCIrEftXuNlKd75PU2bK36yEC+uwK8RooJupoDgHzU1erFh1seCCUut60vXy9Onj8tPT6aenh9L/nz++96/fnzepCS+RuOsbMlZAAG4F+2mAgvwhjiiFgPgF6xoxWmtFSS2L0Q9g6OMsyWLvF4UxH0ctDZj0ybBveIRlFuAJjBxaHsaU5xyiDYAle/jBzrYoH9YEvGKIjsFTxAlajasMwmgldGnQSWuyfKYqGbrY9rN/t+5zY7w1veC0vec3yej7xpn3j/QUGV9TKSBH9BkoEgPfUiFpkocmE2soLS/0c+HDwse1PCx2qvz543Jd8POn099+vvzy6fTxcfnwcHk4n0qwYiUZAMxKKQZ0YiFD5pgOj4YQPLAZMbE0+wS4oRJZvIlDuGEGNefMmBAW0P0hyjcZ/ovshlm0UlmWZV3rS4EZT7U6boU6r6OM0Gmq27YBcPeSTjUlEgawtdbR3NVdyyIzW0UzM0ZHL/fmZlYKy1K3flMP4KSbFRhLxmMdcKe27rXLN++FvQpOz25Cu9F8LMQ8mi7ZPXdYn5hzddgnlg3CFAojFFBYbD4QILPtsGZWM03/grAvAfrAb9ydRwMwm8MMyyQPGvcmMzHgg/1nY5TMSkezjE7umhARF7A4wrh/KcIcMLKkAznn4RiPI3mIhtDkPiwkKbx3RVE7VXAoSzMbBV1pEGZM/+ghpHBIlR7jmv8d96QdhjTWJURJEkdEB5gRHw71mH8yYSgHny0cvDjKUXJllHo5yJD4s+8ZP+wON0flg2Xl9BvRouEJSTK8VVJpzUaPgtzGqZIygWBlEmaGfnz39HG3Mu/7RvSlMLv//DjGsJtT0Lkg1eFGTOhEeFeT3vXNnrjD1s+xSlOhvo3gEndPcBzK0ZfIO0WvxjnWMHSCCOlwcd37auMiGpftkmrdA8zHG+1wneNIjhJzN9nIYvCyo0XiZ9lJwDnoK+PoewoCz7S2dsN5OCRxu8g8pk5VOqkC3OSysG9ilzSCtODwaUCHezUXghjHwQa5Zd+aW6SxXDYhT+6uPrA1eSBnn7HwXYhkT0h5h1EL8X69juuSLycGBdDYBoOhbu85s29HSTYizZrm8r3Inho7QvA27I+504iSRkYkH4K3K9cH8lkNAmZtsdAVtK2mw347PtpR9IOe2WFFCSwAINqVO3cG3AAG4xAHmk8xHPRk44r5muF7n/5GulvhR6a/WcKoQaRyFAZqEAKHH+OWbA8Q0JpKYSKatHgv/dXad96+6PkPf/299efGm3C70RvRpvVvCUwSIIh2WIhcW3d3D+qS7uiurkxWlwJUWx+Wy9Nyvp7XdVlPfHhYnk7r08N18aXWWmsFrLU2DuZe6t57b62ZwZYSs0aqlrqer9eHp+vj08PDQ621lFJphCjv3hBgJJT3x3/usaOwyqc4lG1ksEBvZeKRESt+d6wTmHNyfD+2YlrBhYZCL1aioS28sJ0gmVB4Wk+fPpw+XevjqazAP37/9o/fv3x73b689N/0+vy6CUgovBdIXjCgqBz4n/hvsM2pIzOibm7Jh+5EKYU1ja6IkNluBTGqGFEPnD/EJDczHOJhFmDCtNpDrQb/aoo18yio9ZLMulNsxtUYO5mhoCfQdphf4S3PCZ6uRbdAzqRBdDiVpRzFy1EZvdVw92/e75N50zh4QPaoufuCkRYsv0VAkvcboNj9cBkiaSynEBlZyY1aqMvCj9fy6+P156fzx+t6XbiaTmv56cPpLz+dPzydr2s91VLAtdRqlREVyeZmpoLWmlCCFCqzQwLQrdTJYnbvGHDXy2ki7up3t+T+RaD3zfwUmFMymlm39Adqrefz+XVZb0vBeekv1m63pdTARqIAXnvv7tmaOYSUpGD0771vbbvdbqkgzChLsn+DmbXee9uilUEtlFkpxTvMUMrCqNIUAHSD946u0lU3b4thBbgL2zd/gj6bfk4TIncj8cM5iQ9Ts9BJ9t6zrmFw849/1SiVfr/H9r+OD2fUdkI7dgTOXNM3Rs5uzx12e/4ER8fjbuTDznmbT5unZ2guHudk7pw4ajOlAyQJVrYegoQeHYcUJriUePL5YIfwPxRSMoKyd8ftXx3VH72ieAyupug6NRc6ay0jHTHLKe8i7rkABWTxJKIIavkhmu7NxWRBAiEN9qEIaWl+82iI352ye0G074F3z3qYijtg3n31RX60Y/oHBEiSdhtDR2jQvOnUhswgNfK9VEummDOoTgSiIYn81ZMo3luPU30w+/fHk7RtWymllGiSpelBlGXl4TcHIRXjOvqg++MfrMBhrCeePkpy90UtqW5wnIsjvOSw4/dh+CTnIQLTIw+krJtE9jJaQ7lHNjzmvRz1xwho5V8RZhQ8OOsHMW3GEcPiARApl0DPBqQDdCNHYXjM+EYB7BLAxuSaFijvN5vbJRYsKD5jXiV1xwAuQ5j+FMI9FYZxbojEyzAGDIWFLVrIpeA4yqxc9OGXMdJNt9aMIcRLsSjvHudnvKaC5yimwaE8BQiFkejDwx0BwONpsqd6OIoEIBfTUC5JSSYhAswOScYKRihCJAuRBFxtwy4Y6Ep6zRCjowtUIpGh7FoZvExCPy+LUsElt0Bs+Kh7w2zpkAYlBdNAHOf67DIrBsL0K83MqofhDyI3m0s9WwUT8FkCZWlX0WjVSHX4xv6M169++1puX/31S3/5csOrL1DNDJMbATUP6pV5LHa/qAPqcJe7XGDrem0uiWYyNm+dHQvXh7o88PxULo/ltNhadbrofCpLtZOKsRhoVtZTDXN/aw2Qu7fW5M3Mal3MGPnD3uUF18enDx9/vl4fz+fr5XJZrBjh3nvvJEut7n1GWQ7yIf2rN7tuCuKju8+5+yO+1aPCxq3QvESJQoRnpiJTHiVx4Djl0QtCklevIBh0h8WaurPzZEEaZ9KFXIHWvZ7K9a8/X8h/PJ2//Pz43Pjbt5f/+u37//z9yz//fBb1cruhE3YGirYNAmqWTSeDjjdSJt2212gwRjUoHrKjmLF2BTd5OMM+qcqRro4kgQXFMMmjpo6JHaWRB0jnmwPtozz7VsASNUkwgzo6A/8fxUoCQAvCfBTL3oYQmFoaEkqwZUeSj8DBbJV8cNgxqH1cU4xPbKrGOQcAOk3e3N2jdePcIUF5hAHklLt7g3eSRePSyrgoraIYrDIrkSIdzHzqkIrRfPb1GaXCvLhXCX3TrdWCU/WfPzz8+vnppw+nXx7qzx/OH86lUtdzNfC8Lg9nXipOxRZaQYEXbQWspVYVm/XPAAgUK4A8ItagJfF/mIwTT7rX1kc8eLCF7IbgNFPmTogzNSXwnAgyi6GYHqPVWmHQ9bJpu5ViZmutrEuvC9G9J/9B770azqelbX673W7d67rAapeDWNfF3XvvQLTb6LUWqT8/f1uX5XQ69daMrHUROtwLWWqttX73FxqroRSDq3cqMAwu61o74GzN2+vmFBZKgzpGU4E5wT7QtnEu9ukYuy66HIQE0GAqm8EdDcyqcyCHx5SGyZFFogfJk93uLYvyxxkb2P1hlSTyYlpUfrdMGuZjHBw7pMEHesSGVp50NXL3JS9u88LM7qu6fy7PgxlFg5ix1IAFIPgr804DVeveB0M1RvApyiF1e30Nd05k1AiQBdmao0vBQmQDezlyUEPGRqAoJtDd2zj1A83rcpkBZrMDg9xba0d0DYZtCqAMS9OCIS0081ijaPQUYivkxvfXl4F9HLGetBvyL7MIWAAFmg1quza3QWvNyPj8uI6SUExQd/kIxIdVk7tLYxUGfSbTUrIwRAFIvXcPMGc8RRnibl5HhxBArFQ4BskdmnuAZPaRGHuOAfJOEMg+BQfX8A3oaW5W4s4Byhl/xysyXymjtaPf4kKDISTumMDckPNTqN3ffXpIHJZpGelcnxffX7KIOCrZySxC4BwlnXMbZdI6uFd3J2L/Tg47ckwjNRZ6ViNMPq7WR9ydkxArlJZmC2uX0B2dkd6Cm9zhlAbhI8ydcWrCGM70eg+M0BhPzoM0q4r9aFKPIUXEimnuKxbLBkTw7Ws89RFSJYwWhvf75AdhmLk3Ot8NJTUN364UhlTM47Z/iOlM71Ewiz6I83jjnQ/N3Zec44kK2gjqdMAM3qlsfRJTnevlNLGrZ/BVI6g54YZv54oD0KT82tFaHTOVfS0qIxAbDGMyT4MFJAcKHHm7NIAdgNNYF5m50zv6je3V2nfcvvXvv91uX7x/37j1DhGduhk6dFNvche8aO/6OFqaMxrStd699+64uQTK6AahcVE91+WxLo9lfaynR1tOWivOq51PPK1WTZV1KSvILPA6xCoyiHAITliprXcQdTmt54fL4+P14Wk5XQrNCKkbPNREmJB+kEA5kSkH93jMcYseF+bNBhuqQof3fmSPPUqP95sz9lw0WUlpBYhJfmzF5LLq5lxAN55kC/t//PTwdLbXDsfy2/Ptf/327ee///mfv3/7z3/88XvHS79hc/RbqndbFQ3OUrdv3Uo0pPHeIJkF036mWWgrMpKQKs0pYzDGRtSRbpmUZBoWUcjbgRIqKTkuTOBQ0CH23WA7jjYdVzH6dYy5imJbA0w7q/KI0Jil+U5GPiiqcVLxk6F3jlGH42JJgk++YMxKnnsky726jU9y+SKAT4xSD6ePDr5R0X/YFVmihWK1R+0blYQ/bACxmmnz5+e+va6lPCzl4dPl43X9cC2fn05/+fT46Wn9+GAfrsv1ZEY/LyuBUsppKefChW7edWse/Ohu8ugVGL5mRrL8YCDZHPj4RAe1dJiAKSF/vO3fv6bCDd1hUf2tPKFMa7GYWaCA+rrqZihFPQshipUM9zphaMF93B0T9gmuSyXPz8/P817FUj68vr6s61oK6+jQFE5a33wtRoJycxAle5J2L5EXbcKC7uxO7+omHrqyII8wxum8izcPm+du0jAsk4EAPE7RcT6PxkASYGBc7o3Wm/c6SKPZn+St1puicv713eMMyWlEwOzHhs+NQBwcYJLlmODm0IIaobH3dz9aQXMAYblYNj0yecsCXGT7nThSZuMi4YAp9lNGIhVND3kYzKEmYVq0bzfo4RUw0uMUvbFR38z8vGbMzbQn32iKH/xw1gAcMqix1kdrxIXy7jpvhnec3pBaI3cUcF+9+fndtjnuugNQ5X2MezypcO8AzC0+E2iclhVQgxWCADlI3x2IlRuvIxw2rjFvACAQF2W4lXYYfSnlWEZ33F4pke+PCkmnhAy7HuW4zwr4sayYxBR3uWBOC3gg7PPmuLMc/LiKA1s3pV1YWKK7lTC3I1+WyNyYoKPk9SiJVy/swwbdc4LBYBiGtiSOtgIut6QAiiBZFyI068jul2mUDDK+aWG7sjxgGjG70D/ufkhlwnRnE1/jXgWRxuqERii/OSKncU8Lnsrg6rhnWWX2Mkwvc8zeXQGldPABgMD3mnGmDGv6im+BW+NxCGTdBI+YyFl+f7jRCFpwHz3SDp+bIM4Ax/kOMyA9lPAPgQklin+KLijpo+8qIGepJXgpjavjGWaWHLiiiQEPz8jQjlLYUrQAOEVBiWdwhYQF2Z2BoCXOb/yjy7Sp3YhX9m92+3N7/aN9/+3Zn4VN1kXIsREN6EG9H/xRMAtsHRm5ki6ou7fem/feWhdeeg82BLF33WQ6Xez0oZ4+LKfH5Xw91cJzKQ+n0+PpdIahiRYctYgqsYj8Db2eksSCK9AIFTeU03p9+vD04dPTh0+Xh8fA/0TrX/VMUfXhih23hw4OAN4Zf3MZ5nk47hPMLTWWOLfS+C+OX9SA2gxdT6UiDx4rk3VGP192iTQ3qwSLUaBrQYGsqVc6uleZymrL6fN2fbqcni7L5w/Xnx7W//zt69//+cf3l7a126s6mtBfUCsAWAWisKg5KDWoBQrWo2ppinYejmewcSq8EtGNRov8BhHKbFRJlCg8AYASsYUwrAvy9AXByjSph1GR5yydgeP8xj9qBuS4HwoAwR6e3w9iIuceJ80jm/0pD7+SujO8lOjbiobUfz509fQgpma16bIEx6uSzGCWAYbgnzZU/MYA0xbFV24hvhE8Zg3bVguW2i6rfb6ePj88fr5ePz+tf/2wfHosHz88PFzK6WznU60L5s6vKrWUUqyA1btoat1NvaqUElUaPtIkPgSdgQzngxXaBaulBHBgZwuRZAkg77PfTs7nvzatyCw1CCGIIdtlpFVXR7Gy1LIu5+ulv5x9W30r1sy9hQ1aIrAGOrEUSmrRfTkjaABRTkst7L3L23YT66nWakYzi6bdiCJGIfx/p9elSioeuDaSEnr3RtK64CpN1bk4Nnnv4GJxZLNFypiTfJzoXPsjqxchZ3f7bIeVYhgYGrrQuMQGDZsuzaZw5KDRGztgvmWGLBjpFVAeWKKBvgYwEnlmxT3DeQnCCf3uICkycr4YmczAGsRejlOaD8IKIOtYhtIbWlhDlHLKf2nai2PSAmCTcJeDORv2mEaENNrpUbFtSudIIkV7eskPkJjY0pbBMUW6Ix35gYUOTyJ4ciLXPQyeHGHeKyRMzLx0tDeIiYma5lzY/7udEzXlSbwUeXuHNCIUU7yJWYsztsjsTBtq2NXfZdg48kKxgTg9dgXdQth/adElP15onx9ty3GZSFlQis3jsWvw5pVQibzC2IT3cVvBxp6omQrM7VqEDhX3jVji26MYYB4hzAvlRcMBKJMSa/eOo+KKEE3GMuMVZhbRwaPCngzEx2VLgGnibd44VXNIYYSF2VXyQY7298ERzDuGgRvQjyjZuQ85hd5ReJzjn3RwSw5vDp6SmhnemP4IpRyULQwrPzVQ2v2KqGuHC+iiQx5blBCpND5cWcCQFZwK/vfU6IiL26HiC5pNhQxpW9MiPkcWIfrpWBbzxUG0PR25i7x9uQ++KUBGHxiMrSI7ZKMOW3lOKe9W4f/Xaxjtb6M1b16HS+1Yo3kvpAnHH/xkWiyMJetDEIdkijicj3Wchzpbo0e0Q5ITHM5P/FMIzSn6c9NFmchduNKOTyWWwQZjHZ3gYF2YhZjTZjWACvLGhn5jf4F/t+2b3/5sL3+8bN9ey5YKR+hAk5zs3rbYn6MJjgNwR/fNJXfv8tbb5r3Du7ybBLcCscEaT1iup9MjlweeHuv5UovZmet1XddlKRvpPUCxFN3R5QHMmJKEZK2BGTOzsnVXWS+Xh6dPP18/fDxdH2qt6L5Ygbq84/4gv1nx3b78F683W/Hw8zDih/+umQHQm5/nmu53HKS9sQzKP8cozUGTOW3gFUmI0lpp4MNqBcWK2VrOJ57Xhw8Py6+ft18/Xf/2+5f/+ffzb39++/b99ue371+/Pb+8vnhbJaQh7h2kaPAGAvI0SaNkyOUNViiQ2RfXopBX6IiuDbmF5PCSRM+B+bHBAxcPGU9eSR/SYzKJ6W4PB27V7K7cUMnNKY8C5bFGASF1R+93n+PgWb3TaRp466kpdq2EPmPfoVfmkh2P1eFg7g3mxz3zfiJoJks24xExAeQFEeIGeOv9pr4R22r6eDl/vpx/erj++unp0/X6dLl8utRfnsrTxa6Xpa61VgRmx4nX1w0IGmIzswKYTMLWu3qPPyyTSVFphIF41nBgLCMA7+zX+YkOdmqc7giXHmcg/vR3h4IR4z0GhtJUolmtdfVWl+VUltOyLK2urxbtkWe5oAIiW6qtWLZtowR0YyXDTxBol9N56y3Y3CNaHzS/tYTE7j7qykphKUsYNIURKe3DnQUSbSl0LW4ddkPkczN5NudhiPqjmjg+MuamwkHXjAhruqlh+cjSfJzmTVxnONJ9LMRxj2lczWbgn0Ye6R3HaI9LOVfNyGBxQYCZ3ppY+YmGKhnyat8Y3OsB7oODENCD0Pz9S4fXML08ZGZ0eBstL/bdJHUbHX/jYzArAexQkJwoqjCvg45gHPAfius5jZoOzP7U+/u3K3t482ZWj0bI/EJQQR4tjSxgYDokc85HmEIYdRFvxvN2SO8CT3Gd45d/aNowJ8bm3+f4M5Q2/Le51hqZruMYlEDxXMZjmKVmrRiG9zXKvOI2NuLLEWgjZ8uYHobl8cHioYLGOhLJ7ih12ZtCxtMcykPvbLpjNDfqrA+bYd+Fo09aMlgjCG/ThuWwx4ceJBPE/gABAABJREFU2WUFUp5HrC9jvEzYenoRLs2i6PQqJKKPExXFWJQ0O8mGl0B1yqkOZ0KP8pZ5QpjQ9XQPEo2rjsS7KnDnUdEbKOQ4GxYMSHRm6U0XndDevCvBEUrnDtNxinaVxzCD7Uaphfi1LgbdqUsB6TmmR+a23kXBwfpHlKztcpYzhzaP1vEV45GQFQhDZulQggmAobRGjBv7udrP2FFMDHNkyikMGYGQ8JaQ3hn22F/5LLlXBpIkt8T03fMeTMWcJZqZb4MjyqBIWo1jlldgYkKGtXNvPO0PYLTitBLUQigdSfoHS0iHR8WpQlJ6PBwEwOToTe0V7bte/ti+/vb8/Nv3/n2DWEHBu1rGTuXwFvD3ankm3V3oW2uSglej9615d/cOeQ1stFhUl7I82fmjnR6sXnB6KOfruqCe/LTYah1qqrYEPLx7IqNIFtpzvzXvcg/TPwWW0bBgWa+Pnx4+/nS+PNbltNRTKcXCsfIuZU2FErD3LrP0djb3ZcVYi6HIo+B97ilhAF3l2v12egYT3l16Wv+gFJjMyPn4+Fw00EQTE46Qu8udTuvrWiJnUxevKOvC63r+eK1PF/zysf766fznt+cv315/+/3P//rHP//88vrtRV9fbrd263G062pGr8DWFPU+MU4hz7uEoEp1V/TmkoAOFPFAf8ZoDzBZJ/oIeO7TSziHaMGIQ3fMI5ETHVFAZu0PsuzeOfKTPXs1lehqiVGOSSRHt6KUFjTCYGkRzANu42DHsU/BPdfOmNirgXwYq7+rWGPdFaR6AbOAI4Qn6ZGuMQsXIvrqhc1oRqss1k3d2+ui22p+WvTvv3z69HD69LD+9Pjwy8fHjw+Xp8v56bI+rFgqT0uxYHdkFG8ZT4tEOgqjgYe59+7qkNR633qXrLMESYNI1yxEcEW1miTSZnTzbp8fTsT8p1Cab0zGnIcfNbYDcivtF1cI426lqBYrtSyr1UUsA8BCV/M06BHgt6XUYuRt670jyCJ7J2lg960WO62nQUFjVPfW1tMjgKNJHVBvh1crhXD15kN4WgbTTKBQHdVRHKUGtFd+0Fm5cfBOa2R5Z07a1G5z/4z5iO02S4HeTvuhJ32Sgd45AJEL5ajK0DA5dr77MSrz6ENSUKIeMbCEA+h1uLBlKoCg2WBhyq2OsBlHe95JFJum+z5sciQ1MzQ5nuxe4yO08j41yi47JjkDvUPtMRQSkAGdiS2w8FvzIgmfH+zFljTZMcgUobtdLu7++Z7PicLJ3MZxNN5xbg5v58hcny8XgFKiTYfSckwgNyPOgcMh+oEaQK7C7BsTAmiuKAdAK5cmUZYTemljjRom49C/uIuV9JM9BPZYmuTEuntomwGs6eHMf1siNZTDw3wfklEc4z8ISr2ZUw7POEw9jsKUf+G9HOYiMlYWWazdiTn+dljYU0UdlHQ+VcrCfQriYCTCMLq7AqCc2iN5xz/jbVS2JeQ0WHgRCUbDKH7gYfp2AYoxpvlmDs+95dRjtLVPbEnwxAWqJNYmKeMluXciCQQIT4tXDpP3BsqGVg1+oEAHTRopSYMMNMwXunz0EgbQd89HipLfqHwTzFBA9oD+5/Ea/e0Paxc77/jUx80Q5/a4mrx30Meb/QpvJnNO473wPcz2/R5/p97uXiSFfkwaHNJKznukbKRTsgxoXB3p2PiI/WuSt2YGL4f3zr050JNgRN1A9iCvlt095MFBChETgs/drdSExhFigoCyZ1yGTXJ3xZoS1iXvaJu/fu/f/ty+/f788tv36liMNLk6kvETm/eVJFHCEw8zSK27a1j/rffuvckFOeHmrLCCZS2nK88f6vnDsjzY8uF0eVgu53XBst5Wa2a9sFtZDMpaOsdoCydt29b7LB3LqTMzrifU9fL09PD4YTlfTqfT5XJZl0J4FMMAMvGWTDMhte9yAuMWPpXHG9myT3holNzPLmnoySFSIgh6/8qrAfv1sXv4HW5CRxc6AqhQSKCgjHI+93Dmi0su74QXI9GrGgGrYO/nT/XTw8PPH07PLw/fn7ff/jz/r4/LP37/9vtX/eP359+/ffn2entuDe6OCgcG9HY3zgEkMayHnxP+AdwhRwG6gVTS5IVwkY1n8vRqHTBHj/I9j2Y5UkbCSLmHeyRL6ZA7PQSOZkcxhwoU1UwBKNII0FvnqJrGiIrsLkUqiXsBgtFCbv8wBc+s7Bn4h3mZYbRxzyd78Nwd2vABIlgyBA0wqK/c3USZ3+SlsgrF2nXp16X+/Hj6/Lj89fOHnz6snx/Pnx7PHz88Xk71vC7X80rBzIwqoYUIZDoIGOQMsKJSYMWTeaJ3f91cxb0wWt1hNAKPWbb07JQVS/e7ehd3/iMJczwp8/Ttwuc4z2QknAm1YzgZhWZuFVaL1VIXFjOrZhXW36B8o5gy/PzX19tt29zdGGmvQrlVqzXxBYIbi6SXlxdm1D9SAmYRrZLTzFSCmc0J0ArzXoV0sXVnpzlM2lxI025X01MK4V4NKYNWGhJgt5yOf47v5wzFxc325K18t/n5LsYUD0MSKnNSj8GsXZexmMy5+2ZK73os07SG578e9OaUYUq79i7ePJ/0h6t/fNjjn2OZ4tLK8pDBuACESTbsTubeVBRKh2VGRt7KYlePEEwGLsczjPN876LMxzzs6plJHqv2ZkFx/LL96CJvtgEQItPff+04mPd7JpbmX135zcab3zwUmZi72/3I38zA8cAe7zNGnipAaSGLo0rjvfoDAL39vEZc5/2keNt7bo5BGOAdHpV4krK/0SjxDjz0cc/x8P/DpOSWwvB73q907qfpog4g6NjlfT78/D4PG1fi4KIpb66ZjC9Dcg418H4JNXB4caOkIY3bShqVKH3cUdI0xHerIuz8EFw2nBogauQQE20Hu7THLnSnjxJeYmQPuiQMsg1FQAneoUgdBzwWctOc1diEo7wvh2UBDZz4exklS7MhX+GkRhfG8MpyK8xJPuxLzl6Ac9XfuAHzV1HSmuHGwOodYEWBag0Za2QiE/a1/oGredBzHK77G19lROozsTTNfcyEDA5bKECcheY7ruPN3hi3sB8bmmNvx6KEVrac8DfidZgukVZyOe3oVweSLa90f590952U4J3asL1sr19vt2/b9nyrhV5AdzAIGwPjoRJNN4gAqgbov/ce4J/uvffe4AJoxoL1BDvZ5VRO53q+4PRU1qdi13p5Oi+X07oui6+lF240lEs9E4VCV1OEwKXevbX2XrCaWakrTiuW6/nh8eHDh4eHh9P5uiwLKfcN3hg5Ge8SO1TM4Hv9VsqWCBz41FO6v9c9/PHNWmvfG3dLnPah7UtqlsTXOyQyTuCoOpfoIlC6FRSDcTBuCO7wzg5zFBRYKVYK3LWSHSpyq8t21tNlvW3leVs+P9VPD/X3Pz/8/Q/9/PH5738+/vn92z+/Pn+93VrXrTVEU8/k7JpDB11U34vXBCiaiijqloDpAJjMumSDQg8RSnOCfdqSPlhpUkOHK0pweHeU1BsiFQWZ3KnsPxr8BSGxooxqgPp68u9FU44uDEZ/DBtrhNbKO2eAGqjW+ErCLDlCmqFfNY5JmD5hVju8m5mPjE3eyBj1HhwrXMhaqpWyFdUFj2v9cD5/PpWfr8u/fXr4+XH9eLWfni6fntbrpVyuZ7KLW11q09qtlIiRskfwHiJac5QGg1VZ7XU1yFsDHOgdTndqgZtYPNiMpcIaQboo44+6eHqGAu4ljx93+3HGjmbEPAVpduDta2Te7wwOjsx+KaWuS1kXq4uVpZQSeBZPc1xG2aAl0VolOdydNvpbl1MtpTCBQzRLNvrnb985SIeWpdRaw940C4Y8J2WF1UxE7yo0AwvRXGzqm3whKmnomb9Dm7Q/QyZr2KlvkGZTMky77V/YgTCzWXI+Lblhft3P5FCIk5ZqdzY8+WeGsR5Yrz1/NeyccSqH7sjLHobu4mEbRAOTNLimPJwEG4dvOlneGH53iukwM8mvt2cY91RqGDEJDoQPtT+vGaZtJ6MQWBk2MQdZZP390owCyvImvpb5eU7WruPm/1dWOADUIu21RXpnlGP3IkZ1weG68+2AhAFJNXoHpMGUWkgcytgVb7+DcVhgJpVDSGPy+701J/h2KkJo/RgrRXKG8u+m4ujOHdyAOr4RC21SBK0jPWGR0h67TwC9+7HmkpycTvcY+vhFMcIyXRHsAixSJ6s8yOxtHrYE9syZAoYBdGizJw6yFwG0JLH2MVP7rNlo555r7MMcNotw1jAD2FwkrPDIWeTeRwbVBvaCgdvT3VRK6pGjRSbC+gwixhnJT4TZBDerCgEyG8mM5w22ky71yN6TDDBBZgks3E9InUjz0eKTfbFTW0sifTS04zh50dfMAMCzB+1xNbMwJi1Ym04c2HXMw8W9ZEwChCi9CCqlWJGUOUDYKH3WZP/AYh59JKYdkLuNbsaxKSI7/1ZmjdTWuOPbQ5EI/vFv8c1ZhuujWPBg2Wc9QGyn6Wr6mJ9DhurgBbnDjN4xOuJBDoU1nxWH8ymU+dNR96wgeuoAZU5GA7fhIUhxn6rMEXUP6SMDrTd0Nzl6797UNrVNt250dkcpndYqot8HpY6yRgw8nnfQDrK5mqvLG5ooFrAYS1+fltOlnC/rci7rBctDqY+1nG09V6ssZkVmKJQVLKfTpfYiMTedZbVpH/VbSVDIQlopy7Ksm51R1+X0cLk+ni8Py1oI3G63Yn4UKB7VhEAyAr0Lk6QQH+DI+U/H3QJEjHTYBFNHje9MqZrf94gkDKyddP8m/tJBSH0gE2FwA6ktWkONL/jhJzFIl1RKWcy0sOt2slIrFuK82MO6Pp2efn46//qp/vbz65fnpy/PL//1+5d/fPn67fn122v7xz//aJ3Ng0eD2UQsomueCSXYfDhHz6B+iA+QkEEWRWxAUpJg4grHdA3tHyAUAtEod+Kb4L1DfYigrgn8itASpcBdRjicFoaDvJGLbGA69lCRaVjyx0UcqTwx6SmCTkplJugABv6SDpl7IwvQI+KTc64uyNVwQDUUR+mooRB6t77BuRjPZVlPOj/YesKnh9NPD6dfHtafrsvPj+dPl/UvPz08nsu6mBVn8YDxCxvKOapei1SsIPu4W63VUQzszJBwJCKAbDOl5MsqLhfNu5tRoBk9PB2TUxZMTio+wYoulBlIONZCWkisgJy/dQDMjps/PxdHDdI+QfsPWViq1bXWtda1lCLbgezHY5ite8qyrsTAT/e+bX0r3azUWg1cJJGl9957P5/P7t67Ilggiaql0Eolc/eY0WqR5K0v0YMlsLytlxuXxbywLzn0HTpyLwHS4Bzdf/HOfCQ5aw6lO46pmE0O+XOcUh5W4IjvH+H/Mk6VDXXww/tm6hnGMIQZLlnJPPbQqVGrmfW+nBUywzLebdw7mz5OSgXC795PmYYZPnWk5rmrJRm7kkssjJzirSkloZxm8sD5Dzc0kC3K6JU0wJOxSwgWwgusD+98DuWOuSXN8nzPAPFGfGAWafudv/TGLPYucLTgiV8MEszEwO6RIDIxvlPX78b3RL7ML49D8SM3GsF4m5UPw9JIdwhGoKSVGN78CKn/0JM5fL47cuoeQSySBXSigDKT971QRHfbPhYvQdbj8+pwZjWjDT4mSJEkjaLFwG3PQ7AXQ0TwTN41AsDKzqZWZEQJXy/4HkpRhUVdo7ebmQWrFxlV3Cl/MqojCH20AGMW2stt4FZpw1IUBhrfuyfvOwC53S3SKI6+bRuAKFcyM1oRjSyehXFmBuajQ+pmBDsDIYOJ4oKE7hsAMwLee3M1UkQfCPFomxrwnsyny2VGOLbWcgpLlaIsOCrnPPJKaWGia0Sr6AK9FOt98l241BHQVQ2+XtFH9SHA1hohlkKrSHxyBQtZJMpBKzayGc0hGJhYWE8kIsGCQji8R6xuulWx/2e9VKwfaQHOdMAyxJ4A31BygpnLq1cyeKM4UZs1yQ8oRY+RedgEGSxmK5Ufk0cqNm33KG+1aEPpgEfBXbCKk5wDj/dAGaTbYd4keEzS5lvudya6LGKD4KieBRIjHfgLWncjDLRSargEAdFuSWMzHKo80SVZZKI4hkYrxEItCkQZu8xhRizDLd4SC5P0pVWo5Op927YXee/b7c8///z2rdfzTzfhVc3s+1p4thv9tTjPVhxCKRRaa8rIo/feXeiuDXLIS+PCy0M5P5yWC05PZXlYuRScwGstj3VZrZ6Wlcvi4q3ZxtXWxRazUlA8Q0ZZstLYUXDrrZQCK5vkrZ2WFbSm8qry06dfnj7/XE/npVoh4L0WBmYdLqk7bamBSbrBA9QUS2MjcpKtGWZ22EbTDY+5TgXJnXNNCk5KAGILQ6H3DjD4h1prccCjT+To2xh0OpK6zEAvRlcDeqkGJ7wBPVooCBmARGvwAAgRnh0VxAqiC+6sy0XbFkz6kFf1ddEJeqz1p4f662d+/aav3/XffypfXk6///78z2/f//y0/v59++3r7c/n7fmGNjaiQEvqNRHee1dv8AZjsPsbBERrN8GKEzs5WBwSlppCO1WIssCwZIvriDEORgS6B2N3hHJ9YtYEFrE3qEfxI8K2BRQVSLh3iiBzqJgrDTCSLMWTPbbFEZK7BT8Tnd7hWzXAKoxk8Wzg7staelP0pSqGQisGD5eMCBQzYQVcWBYZXzd0N2+L8XJaPlwvH5+ePjzi4fzt8YqnR3x8KE+X+vHh9OHh8nBZL5dlWQsFh8WzQiuxntP+CmEPWHGwdyXlM1kMxk5/rWTAD0WD2Hu0DiyFZWtSj7xAN1MpRQZJ3X3RkvkXpCADioIXnIACmEJ6yrNsHc20IN01dHQGC98W8sEiR0Mgmq52imaNgVyqtLUul9N6aacLtheeTpua1OkOyFgtqBJlTSIt2EHgrRiXsty8+7Z197Ku1RaJTgLB3wlFlm3r7kC3usAJbKq0oAPy1lfyup4BbP229eYUiXUDv/cSRg6BYt3Q1Zt7PJIR6gmyt5otXZu8YEc+a3+5DNnMJwu6XILcRVc2iWNLfQvWY3dCm1WUhTSWCSqkRcvGgjiHERVKOz9fnlZmaMx4BUnJiO2FCZINZMJFyKZDEXyO+IixFivDrsqnoOjuxjoa26WjEoV8DmV8RNjzl+phycw9kgCIsFBYRnyA+eQBgpAyYE8iUMt9qOmci6B3LcWiWorz8TWvKBHqXeHB10IHu9/IyJykFvBh0wea5C5sH5Zu98CwpRldoqFB33WBjeaeZJFhHBDEQLgHjLCHQRRlnCPa0pE5Wai7AnpEj3pKJifS8CjcexR5mg0EZvZYiHm20f4lrHYg4tdlWMYRuRusgwqnCQ73JlYmsmVUxsZFOBoCRN5YQTsf7uA4/B2o6bRlO/nsw6o9V7X3bwqbG0DQkOHdK2PPTsy2D1ACw1LZdLnIksYfKVfPxkwkSymRWQinxw8h/kRJCCqJ5AkzYPdg/Z6VhSFlZqOE9LkS9e75q1iMnjvHkYSS+Y/hcw8gDw67gtGUtw14m6ePlazle6/c+QDTk4tesEnLJcHiZMUy+yFw6Mk2ps5QpHGt0ekjpEn6G5yDS5rmfVFiMWCBJZpJj7Sno885LZTEPbMH91YDQ2K67QkcYHaficwABgFFme4v8od3M5B/DgezY3KzBJBBI3sQ/7Jb//OCGjD3KGkdLnk0stf46x5WmAmGWP38p+yiHQmuzj2DBIzNT77b58kfG75u9Fcr7uGGBfwrfsLcPClTEAIy2lDAKBpQJiMaYIOiqgoGWcL1VaIwwECygou8hL9+c7y6uT1gZeMHogo35+r+BV0ULgRl3eEEuncPz90ldkcLkV1g1Wyt5aT1sdZHOz+W5VrXx8rTgpOVh2U5lVKNQFGpKqZSrJywLrZkgx6xh7qMNlTuXW6luCTvpRSjOdS63LVeHpbL4+n6cLlczufzaV1LpXvMgzn7LPyNbX9ss61DsGQ6AHM/x+INSZ7xsKlsj0t5vM7x8wRujx50hz00Uo4A6OgeHRM5QvtmNliX5e4mh6tkU1+TutxQkEkhM7LUKtANNDq6Sb1WNPnDWY8dH9b6+nDZtv68nb5+uvz5/PTbt9ffvt7+1+/f//Hl9tu37c9v7etta5ubU0lcnw3saFGZ7ABGa+1UhVKme/fDIQLug82ZRgl086h5i/M14YuHSZPcMSqIIpBkcs8cYiZUEKm0iBdEdC8MUA8p3IssIlX0xHolRtZZCrKHnidNfnonbGFse4nDGwWXGYEzGVgM9J5fqguAqEy13ipwquVU7POnx8p+rufrag/n5eG6fng8f3rg48kua7+c1+u5nNdyudjDBacTrfoSa9ZFGmTps4x+CmJGKaUi9qilQAZUYoJCVoYorQCgQhlQKyPKgYH5Do+rhza2AXAdWnFEsjUDt9mBR9o7hh742TDU4uDdyN2QXYJC6GXkhm5ON8IKzaxU1mp1rct5qee2nNBuWhcgz7OrUUWHPKnVUns0rFaHllGY7tumKqKEy+0dBKPoN0yc3ruELoEuK+4iBFelwWCGpEMGgum4bKiVtapX+YhY5lxL0h5pVirYaZNgmjd5BkikJo0JmvHNty/9IOXIqdRERgtKjNk4arr7Xx1gePHVY55zMscPK2V8nLrpTpm+u/jdF9KesmMYGEDfkYyZVnJQcusTXsEp91IbokxMh2ARI0l7wjh7ljGJY+InE+GhtPI0vRtgAFtnVE9KlW8pb1PAjkcrnF50QgPuUrgdKqx7XpS7dkhTGyO2OD7/gSE7/mnaAMcpxTH5cFhNqqcnBfqggoxA4bDXCCg884FX3H/+5tYcb94Mcl/Z+O2YQDtcJxz6Q6nU3asicU/i/iTT9EmqecP+wMXKHKVpyjG06YPu80XuGRMcrr+XBo6zeafIzWz0MizIlJOSsOIAFBpkNTE2i1T7WCFrrTFcj2lyIvI+FeN8Rew1qquHPowxRv3u3EmemzCN+yFbhwjB/fgZxA+HFT08+w5BS7E7jPUhjY/7YJDMjP0RinZcatSsjA0153/fKNwbdb1Z/fGvQ9wAka70RPbF2YxdkP6lMt4+QqyxNe5FzPH6b/faPhvvrP9czRyKpsPAH50HZpzj/tbMnRwu92HRx8OOT/fliDraKVIDIIER8iGZIIqdOoUMVPoBXIEhUsdCI3t5hkWNEYVJtRNwMQ9vLXwBSzAGDETLJgYGnCzQHfQOt/ALVYIOKlM8MngvZs71tdUXXNr5EecFfpEXli5d/FZfmy3ctgg3F7k7uvuI07h6p9+8sThWlnMpl7pcy+XptD7Y9Wmtl7I8nuy84FyWk9VaF5I3r74Ur4vqytPZ1hNLDRZDdFdzKexFhvlrtm2bQ5EH6GKHzHi5XML0P5/P67oe+pukIzfVkvu9+jnCZIcDEJ8cCYXn+dTUK2Mp47i8uWwGONQPNtghESyPOO6bTZ4Xl7I8hwP9p4xfY37hICF52DYlqKFtNmiODCoqtRovpfrZ3LF1vT6dnzf/+tz++Pb698/Pv317+ePr9tvX739+ffn20p+bvbz2768vt1t37+7o6PAeZBxezCNQFSk3DrG6lz7nNvU+2gLQWHyEJUzpynL0MgEsxIIdlIyPSxkMLvMMXAWmpabRnwnJCM9CgLnIZodWnREnZNDTe0Yid7YmFqvn0YRhPEGUkHanySAbTLJGnGG+tUIrtGIs1S8rny7L9cSfPvFc69O1PF3L5VKu5/Jw7Y/n08P6S6UtxlK51mVZyroupZToUysw0qjdAe9dWu4E/luMxxupmOpQKWeyY4ZldnruEA18wg/NxzCosZfjJU4j4j5TF8xT80ai7tbqET10/FcSkJmxLKwr1pWn83a9Li9X7y8v2+siN7Bj66313qNC4XigIijJ3igvpbbeew8p1ItZsQKiQYrE0Oz0LLXWiwXkKbbqADNZIG2CNdlvcm8umDf3JrVJQLNPlqa7Hmj7oemPGvO4TKZI/Uf6etiyADLDbYfvF08vi1OV7usVCksJw2d2lMir+qiAmwqaI/oMIKN7dzQkY7FmLWymaqYFuLsZ8/FGZd28yCDuO9ghu0MEJCZQDuDAzpePk1bXvf+QChR3ttzd9hs27Nxyd0szZPUcw1G2H260G/e7eB8m0LtXzvNOsS9KKgn0352usJGOCUnYTgT0bgyxduMhTAHwlOTq+7LnxtHROJwn2g66qB8mhMOTz4UUIj17sEXH4+epj1XYreJUZ/cXfDv+g9d6zADcqdvx17tnRiJe5m/w5hXa92BUTeG13+IuABw8pgcDConomTJUEffjgcbocL8wYjme3wcMfX/NwY+Y4LS/S/pFLLlQ6oK5O9mHld+lMpaiA5oYdJIBa8tYpyb6yIe1N78mjFKhHYgmSbISEfdwarXXIwZyDFlhmJtCIKWEOQ3mXfSZAzrOsEbSJgC3DG/4vtfBHF4OhmY0ejaF1agu4rtZH8uZjWjwoyO9Ew7mMYjPk8/4ONr8znEHHq45rsycFg32V9eo81aYmtNcZCIH/bD+EW9wsgav2lyCyHKHNBAS8+QMHJ1N/z5EfHKcHGbkDmlKBLDKfVDNJCY3kIXTjY/ZFdxkGf5nkMYEOgEEK2VSFR1owwWt0OLqBYSaD+bnYivK+WZ6rYtfCh4qXldsjYsDS5Tjup6bv2zteTmVjs4QyZSAbt68uzVbbbmU5bEGx//16bxcy+npxBX1Wnmu5VRqLUEls2CtKktfVy1nni48rV7R0VwzjcthDBs8cp3JfSuJOtWyXM4PDw+Xy+V0Oi3LklzX7u4+IDya8z+E0nutgPsv5Oa5FwIH4YYjmna/y/zV8b5J33E4yPcm1L6YU/cCNFARsdTobD+sgzf9SfZNfie2ANBKKZD3LQEMJsALfD3hYbWPp/XjGZ8v9vV2er7p68uHr9+ev77qtxf/47l9+fLl2/PL88vr8/Prt+f+8roJBSB6wDALUBMw4JO1LJ8o/2+EGcxAFwpC0HH0JJZhkCmM71sgstMYlUAZRVSHAz3Q/8FKTEGwKCOupCxmiYDQW14kHIZR2uM9ozCK/lYmykRrqEAQz0Zxs0PB77Wxu3rrrVFbBdZa1rqsxU6LnU/LebHTiY8P66en9fGhXM+8nvB0tYdrOa1YKs6rnWpZy1legpKhliS3QTiKVggjwpe9s57HLoo3mjvwjZzESOUnhb1aa7DCUpaSKJ673zIxym9fJIcNursKx3tpCHRJP4yq/PDFUQhAUjKWakut/YLz5Xx7aNcntFt7/da1yausewKlo4d4CFcQtAKyGEE4amWzbGAFDN2HaqYUzMOx7y6A6j60J7NnWDAEqZQSTBnw3nt3ODbD6upBPF4sMqXDfoLRRlWbEqHw46DV8bDrCAQPTJXtYsFHZ8NpUd3PbRgtZc65ZsdpjBEdlwahM/qPLrX7gcexHb0OHOXJvW029oNNKYOD3AMOgKODlaU7yRBiyk0mZXe8uzRF6u63Ijq/UEJuxHUiFGvTUt1V//En988e/+fwgub3U/jvuYU7Z+nNBVMzvYtXkjy6YnNejqft7ajGvcfV7vqRlxJ1qnteJRcad3pK6TvcIRrezvn9+Mef++eHn4xTNV4aCBpovwsPhdTpAAxIjQ53PbhZMaWaK4gRlUcIFElE8SiEZAHvaoMAFBQim9JQdztsF1XxzVIxzEGfuvM+jRVvDGUsUJlEEAAiTGAW9t+B5j8BP/FcJR5xql4zHn0HQJFIHbUsAqBBrjum3gWN+HCYdM0C++v57PE1DBF2PBuM1rKa15cgsAd+VtNtjfd73FGOPjI2QY0HHE4dSY3YPWTZdm8ve80ly2EEQyXGYxCCeST+8xuWxUbASLnkmjQAmm3x9tc8q3PTDIv+uHeJqBTCfp4PwdH4C2c11VSo2WseQ7QefNRgW5qtwo+plWTSBoQe+mBEayN9747UCJJneh7w6E2qZDIPfhtYQuowBhFrD5GFkpx0BCFaARNLHWIxsMcjZhG7bIT/I4ppbCBQiZKd+OBTrpJGX40mdqIJz11OrCyPXte21O380K8rXmJoN5YGh+pXb9+dzdUAawkC7iDk6Ni6WmMvl1quZXlazo9LfeL5qawPSzlb+bBaBVaUFVwldvSKXgqXRadF60nrBeuFawG7FMwbNoB0lebwQNSRNKZVyFKXy+Xh8enjT58/fPhwvV4j/J9H22x41LmIuwA9pLzjNU3/KQ2P1o8dPInjLuXQPPP6seEsKDbvv/9DoUy45OoezL/c93jeMDCXLQ8M04sLr8B89EdVbHIzi5AlrSTWjmRk7KOMzVtgx1hkZt7tspSnk2693jpe2/r9uX7Z/LcXfbn1r1/q1+eXb99fv3x9+ePL92/fb9+et1vj1uEKJ80TnWpZBh6TNcL5QF3CWghS9cEjFKl+7bQDERBUQzKdOIK1Caow5sbuGLSW87SbGM3DD/WLUfYYsR5FAVBgFgFkB01Z5EZmoVOUsDEJ6JrUq2DsBX2hl4JafCHPtV4vp8ti16Vc1/JwvZwvdj0vD9f64fH0cLHHh+VU/HIu57NVc8BrsVpO0uK9eOskl8I6KCrlQ7bkeoewstBYI2ESa60pciLtevhZbpUixK7rvQ9+FEsf4LDrOBUUOID6ATZMB8AMkozVhvOgkW//Vy8drU8gidqn8Bw/9eT4P6He6nLp54fl8l3by/JyMW99c1lJGHN3d7e6pr3jFM2MpRRGzicB88n6IN/ctSwnTa1njBiYQ713Shpt4OarlELIxSIUbwTQ3bvYxUYY3UizQjb0iHob0gEI9ZJ2Re87p0lIg11PZYI7A0bkSJQZU6vCaCNmvx3FTqg5SbKaS8BhZE6SaAxTYk8SR3xrcLxzN2QHpHm3+WLd4gtT94MzMTclnILhqmDfQP+b/fB2eyQI3AkW73cPmG+jSX3C1UkGd8tRaI81ndpaIwshmGOPS+ahGY+p44fHm04bIyT3gMpj/CTIcuN9nq357Z3dMlIn0xeaaAjtM5omE4ehmBTSEcKKiQm7KSdX6KHxi5VdceUdo0hS+8exThnscKY9duexDOxT+NPinp85mOO5EH1AM9PGTnsxvhS4jcOCgRB0aAK30/g4hjifyBGO/mcR2T2O8k5TKn0pD9sTZAbXD65FxAJ7dNfy3MW8q9641+hl2rQ2coBxXbKgt3AcaBGbTUe8lOVQeX0YIZJROC43J8/MlGJ1GhAGwNX2K6QZM2aALmR5S659dm/dbZG5XcaHoQRihhitDXcXYt/rPdvsycNmHWNwzFZE93MFEHAyaPyMpgMbfYn1jfbHwQAyUE8ZReAhZqC0VyLdsSerpp64k8X3Pmg841HE7O/fbe436cJ5i5zs8KpJ7Jn0N5eNhfBg7xvuUOL+g0BzTHVUZRDoaeAPvytkwkia70RQA53m0xaU5OjgHsJR4o1yuMHIFshZZWZ2TCeCOjEZDlw0o0c/oNjSMKG4zGyRTCpDT2EAKihfqAUoZPeATZOGS8PTZk9bPfv6hHPBqUHN6nf6935LysaeEGu6d8FFAupoTc2LuNjpw7o+rKeP6/rA5clOj8v/l7K/a3IkR5ZEQVUzOMn4ysyq7jMj+7Ai+///2F65c0736arKzAjSYboPZoCDjOy5s+yWrAgG6Q4HDAb7UFM7Pzc72+nlDBOabAOt0GiNbdNlw9OFlyc/P2m7yIAbETeQhJlRCgN6krCYQc03unk72+l0ulxevn55/e3r169fn19ezudza1k5fZciW0V97iDcWy2qItEKAZCcjsTYF/c7ZcrjOLDnbiXHqi/lBKVshifPI8Ym0qLvGePPeGmm/9ADFJshswGgY6hBaVExnKOqDh5zE2WfHAl0ZRGfOSRSzeBOWTSzrfnedRN7+Mezf937t1u83/T+e/v58fTzx+1f3z/+9cfPP39c//p+/XnV+4c+bnG96efH7XaLrv3j9nFDr/BEUcAbIOwBMotrK3KfGzmJZVHQXaR8jmkkkUlLEzQP8sGmijHhDgaCdXRnBjN9kqBvGtbZXN9hy4zNmbXcCMVuoU2eLfQC3bA3crP+tNll89en7fnUXjZ/vmxPp+3pZGfX86m9vJ6fns6Xc3s6++XJzyd7OrlbnNy2U7Oymmh+6rh0IswluRWpixVMhcgiGlXsbKivEqEJAcrPR9R5tKrH2Y6DDAMjeR3kVXlS0Z0huTzS4/ea8F7Cl9dnONy9EXln/eseXoyCeZTBbmywkG9oJ9ueT6e3fv55eXr76Df72Nl7WEi3ZPXxPEBtTgnNmzlvewfgdszVSBnuc1RmTgI0ATboenw0CHBMXk2Z4NLW2qYOBZM+u0s7aaQhA4DjhOMxXzxyznNm6l/cS906mfBdN92HvWsV4MOQWbypBHZm1D+D7yMguy4d65Op3Ar6uNx9kYTHUPEntswKO3CG25brZML4AAvoXpd+fijc62Eu+Sihq6r1Z2VFHv3+gCU7FOYwFhaL/24YD/f91Uh6LIEhDgeJw00aHztsVDcmXRgOA+ZwJj9nA/KnxFcUbffqciyOB3KPR/EZS8rAUSrFrEGqbx3jxLjMo/2WluXDM0taG63+coHm1VLy8vSl8Fl6j2dctEGbWar0L/JKs3ZxFG1Ud18Attc8LHvGgEX8OW15lsJSbSpbFynSR4ushM46KgDDgk+hySQRSWOdviuj2dGOZ5mMzCSGmQGD16hGY2TASCX9ZVq+eUSBo05ikGLnvVNogpw6OGtni/9oStsw7TIe2eeSLAucMBIMk/TTCuWxWkWoYzvlM80qZ4lElEYD6p4jQmDCBC0MlsmiqKGrup5hXgczg1l+WrJs+ZHLz0Mo16WHFMLg7ZsO9jBiHs6hYRyMqVyU7LDdh7tavdJyqucnU++3WrvPkp8sdtkZbcy50t4shRKYS5rQzxptnakTtAEGc8D5zlCwyo7nOWzDgGMxOA/Uo9LeLFme0nMgssdh6dyc44yBWFTbGCMcMtKhhkRXw4lLjIoUYgf2yvqrQQ64wsTIQu1A2/H6oW8/8eXDnvf2Bhe2n01X0w/tP7F/B95h18B75zv9qt1zy2Yk3lo7PVl7aqe30/ltO72100s7vfD02raL28n8ZMEw02yY1mAbT5ueTvZ68ecnnM6wLfLZb2Rk9whJBl5HxpNkc7fTeTtfTs9Pr99++/1//MfXb397en6+XC7btk1L6KHMd77yaIx4lLRZ/svlNa8woHIDiL/Y/fMKWt7P6yn6SImNpIRilGrF6PJ40PkxqR9jTwQTyTT5eQA5MPxYgXK0RhMtaySSidN4pyxMif1KTJg5CKsSg0hw/UYPhmmDNvqm7Sn2t/0aEbd+uu7bx3v/6+f251/n7x+36w0/PvT+Ee/XeP/Yf/z8eP95+4jbf/1xe9/79brfekRXh4fYg11BNEARLZlGU/PucSsVPTSY6MhmzensJC8Jw8x69ljMA6G6AQ3aACsm2xiENiRFn+14R3B0YBNUUCVTVJ2Gmas7flwMrdlmZo6t4dJ42trr5fRysS/Pl68vl7fL6XLazps3x/mEy8kvl8v5sp231jZ352YOBgVn89jMXKAFlA2CvcdQTUPjMSVcMVynYo2rwuR8tzDBCXNdjRWKVoyJheUdSUUOyiMvwtzSHciLD9TfFN7UQiluEJKgKoIZwhMz6jFjOE5S1di+CDCkqkTMTxSOYephjn+rWsNBl5+4nbmdW3uO7Rynp2376Pu1A4ABnWTv3UxGH+XISmvGnN7LYcxljyp46Dk77kkcJIkROp1OeUi15q05ycYy/5Pj2s036KRQ7A2wHnZTBVss2wcMq63M/rHrl2z8YsyMcyvPqYXcvKyqBAzf1xON+bJRVjcw2Knm6XnGYolyxqyYLdRnXqTPxM4cW9pX9inTXqYRLDgILABUW0/Wyi62ZrACUkiLAsOgNM7Y3Gq5lx6CZgiyD1899ZgOsMwBa4wIHXW8iyejx/ErOLTqncMw1uIXkSBVdg2xujF5rqf1lfH04DQhMMKCxoEx02HBxYz6o6h0B46nEODjjyhrU7Xdxl+Fpef5yAak7s/vao5NizW4rkvN7XJ+acaegNmerL522BN3XgSLJIdlXLHSGPdGV2mDgUYBqsnI8pTL5VLLL2bcr1yK9c0EVxcAW/UOBgwqawOY6L+KhdjQL0mGOJblThpmCuP4o6adWPh2TUI/DWJ9ZO+Joc2GG5qMWr1XwC4/IQgDs57RgVLWMBl1r/0LaqmBvamVrhH1rsgHHnesVZ+TLnQufM2Ln7/WncSxx+wu7n6PAU284CAC6ig7niRbSirNRQ8YiCiCHQEy2hzSvGJASF6uSnCl6WMAej+86nXp55MufxKYPEVDFHR8wMxmZgaY/t6RBxxyvt5lBt3r3/TCRoMFASF0IaRuZuXUZaMrpW+WJXFx/7g2MgxK+NBIXeQIXVI286SnbQYlVd0M3Ob5quyS40iBy4gAFGJEd/cl5pFuogESs4eO1/ENhxxokEMEboaQgsndnt4CE1kekRARO3U93fjtZ3z70d+ueLrhBbzBblu77fvPuP2J/gO8egvs+zU+etyMZ6SF1sSN7dKevjxdvmzR1N789La1Z/Nna8+tPRndxvmUOl3sRHfH2Xk+4Xnz542nJjl79BvdshlWxu1mD+mIgLm1bdvO7fL08vbl2++/f/vt99cvv53PT6fTadu21pqkDJzcbfP714MEDmt5AjHvXhFROmPU0oz4xDiz18vm3w7Vsgbbjo25+g9p0UrKVYRZ1WAdLN3pHaRex/0JezzCdFvMJBisg8boBAOm7CDqTARx8lxZa6RgTuyI6i/Wwk+URcRGhV1P9vVsP5636023bh/X+Lj2646Pa//x4/37z4+P/fYjzj+vHz9/fmROYO+67uphf/z5HrAeuPV+228RUrgY0l4GC5kMzIE4JihD/3nYIOmerAwiquimQTAOxC5HHQ3VLEt3cmOG0F1yZPohtXX3LMl1c/cN+9+eTs8N51PbNj+f2tO5vTyfns7t3Pi0+dvT5fXl/HLeLqfWjOZwN2t+OrVW5Sy1lM22CBDNfdt4lqDwsMqvrKKV60QQxYraQ2mualSwC8spO+VtOgAPgpoiPCLaMvUIy9R8MnxPmV/NVk4seGrYWVwxYlX5Wd7JXOr0PIU1Ze/u+nf6PMcZo7o46aQ20GgntDPaWWxIaiDfiOTFNpIft56Bere51WSC07K01UqJcTPv0O0WAtzoztYmj9NgEcXRT3dGaNIgc7LRNvOAdpP1bq7ooU71rFmsM7Oz6ExETBwI16lZHADcH21zycxs7ec4XiPHNSUkf2dCcJPpjSvnnmIWeID0sm9EIoGsHP/WqLI+arUE6n535arLGVoLVpd9lLf7X+/EaX1kBrJF+BrNrGiLDhNluVrvfWAgZsagzFMcZtLoAqhqwPcwbw9jm6sjybIlwrxHgfDLxog7OwFcUsp1nYPm3z4bm3hY1jEclYWANW5LEnFISEQgWyDS6HckSzpCUUeB+8OjFXfP/VMDM/t3J5m/nqiy5JNTvixvLOubc36MFgDQBo9k3N3109E7B1GReDy+VHuD0UGHmZOt927mmRpAqI+2ShKq8VMZtdX9SIRXWUKfo5TSbifAiIOcy0Aky55ZZZKBVBTu3Pe9HPBhPSqST80we1gWo4zBGF0AGEd8WoQCyaULgJzd4FLsZsOvkLTvyfofVnUFELI+GECBGieiTwCtMI5czW9Or4DmLmBw3mEU34F2xJmkCs7AYNaGqzWuYEZ6ZfJN1AECRPYHmHYHGEsEKzTYbWFS0toWwfJsMkceummuyCGXRJ7o5MxFzrDuvG25IjlUdfXsJ2qWTE08+psgtFT0qkdXa43pwxB9gvgJM4b2UJAyM5oi9ohqrLYOlZUrS4QoIs1ICNZI9UNxsPc7B3iqgyxy62B1ORxEqNn8i7Q2CH3TFO7RIRtF7QG2IGBUrzGFgC4MCHEiwsdoBQtufU+oLD3i/KG3n/3bvz6efuyvgWfjFgio337+Ee//bft3ix/qH33/6P09hYUeAGyTX/z0ul1eN39xO8f57dIuOL1sly/b9ux+IjzDZ1AnBCOdTtvafsJuLS6Gk+NsPBt62FXuUK8ups1Jfux7XHcAvjWzzc+X7fz09Pr229/+/u23vz2/fnv98vX15bW1kynQdyJpdsoJjJBiRwQlyzlcVOeqeec7RUU/4EDuzh7rVxI8YGaKXVL0IpZJ68LdQ13Z1ikbBZg1grSgqlJ1vPp+7f2m3vOCGAo6w6nubl6GS1aS5HgABI4M4TzRhW4jHBMRod0UQXOyk4rY905EpiU7aLSIPWhoW3MLIELo2uBbo6TeRbCZP5/91mV+uiVx+g27dP24vL+//9yv32+3q3C73d6v19tVH7f4uFaW4OMa7++3j5uuH7eP277fcBNuagHsmemi78Jt77eupNfsA78AEvS0P9POk8LArTWO/HhEmGjZ0Tg6svfMrW/u3gh2N51aO2/uBuiWDOznzZ7Op6fny+V0vtj+aj9fz75tbo7Ltr2+Pb88nza31+fz2e18ak/n8+VkzVNaKDvTWuJI0kLL1TSzPFuanwlXCDQzB2VQykOuJqxlG7seIZqZVaQlwSqWplud9BON5u4TViZNxajqLxHqWdxcHaN67zdrLpEjJW00M4s9bFw0dSizeC1xYqjsLUuXc5b55ZklqaAoQ2NJWrX6YW1IQh85zDDzwT8BcQOvss1Ol84mGOgyoxubb2ak/LT13qPfIGttS0bvj48P2wwRVHjKiJVFT7eetkjsCvPW2qmZ2e3aZ7MCDXflFtEGq6mTbmJH7F3YsWXdRKfTghZKxgPzo/exqqgupCQVZZGi8wj/5YL34pKusYLsIw8oLaaVKRMEXbChhdJKsIIZ5ym+RPt4HIR5zkZkrbwrucQqQlrdNuqm49/DgqyEWx1KJJwgs2siRresMvEAmHtEoa6GTbiYmCPQk7/nkYGMDEpIPCwCxEirYJqV+Zvmm2VHDZSB24PGy2G5Vwu+44lyyA+kDjheJK1o1bJdGg5XbpJyqCopNGobE3NurMMkD2XDYDZnVcZmrHc0MQCA4iMWAFTbwVGyBCBiz/UvdD8kqEckvy3qEahy5oKwGvo0zQFZskLXwbdCQ6uBQjULnBNeKrRskkJqKBK0oWK+tRHMSo08G+hYVdErItovpn45X2fM9eED/PRJppG6kBTX0OLopDfP7PX6omdyoArlYhSjHlcmMcIIsqxhRjrIPMIdmaXPkRbH6yTKPMxTFh/M6p/xTrwW8U1u24WjFagW94xJX4Cq2Y1ZGLeI+GEWH/ZrIlIOJ2vULaSdX5X1oCo1VgJM5bNPIMP0SiZPeUF2qpbKhndKgD1gCJpBljRzCg5/lNP1DY6sURphPFbtwT/Ov+o+RiJpVDrGgFjlnDzUjSQ4Jwp5VZEP0KB49G55hwuaEQVF7FIXsjiyF3QyEbmZm0uXcHwrSwUWvVv5ZyhQoKqMtcnUBSI7yNB7dkBMs44URpGxLAF3eQzFVD2VaNP02GsiKhs9Vj2rZIiqAIYDmbOPbJxCCHKm4Q2ZK+x2w22Hwp5lzxGvu3774/b64/byft10M9w69iv2d8UP41X7j/j4Dnw0wrdLBmG6y1v42bZnO71t25tvr87LdnrZ7Izt2f3iPBlbbaDmDJJhhCNoezOdm54cZ8fZ7WLZp2W/dcXee+8RI0rZd3WhizCnt9Pl6eXrty+//+33v/3H67ffXt6+XM5PrbUZ5Ft10apw/k9e6xXWX1efYd3nHN3a5+eZ6AgdH6j36vWYp+YRmASLz2v5rh0/j3pvNti+sI4Sd9KuoeNLPAX0XTZJneUZ7AuE9t6nW8ipC80MaigYgRq6B7rCHaSMPBn7mQr0C65Pp+vuO9+Cdtv77Xa77dF7+gD795+3j4/rz/f9dusf1/16vX3cbiG/dezArasHOnDr/Nj73vVx2wOjz5oqmHP0RJckc7I1IIZznQavu4HJGuOgiefN3c3YGu18stPWNpfrZIxmvJza5bw9n8+X83ay+P312/OZrTUSbbPXp8vT87mZtc2c2My9FRN7KLOYpJubs8Ew4oYArRFRhhMNXbAgzcnQtM8Wo21R6EXyJaRMkW533XKOs2CV1fx31NShcvbWpWHwhpYOLkNmljO0fi3DfaZaMSXfEnW2xiyPPXJcZ+rV9TN5tlKDX6Wqmw3mZm03AzfBTufL9XqCnYh3s9ZaQw+pZ7U0yutOQJJIxhJqJLNHBQ2erSZZUlzR8dqBY5OW/1QBKeVcp1N/ondvAX0oeihkeX4yO88NE7rXOVVmPrK5z72mmfs6mCxUx8xn/OphLVingLRELYsqim0RmTtmnjk5GqZwbYhKhsdUMOsH1kGO7y6/Dnvj4Qyth3p871G0AASP58273tOSPlqJw7yeujGWKhhhMa//nT7vva+f+YUCX0aoOtI12x/Nz9jIvqZ7kw89Z4P3HQyOzSjLlL3uH61qA6RRAz2tiGkqaQ4LwxtcL/JQzPYwYw8fRtesTJhytY5nni0PszQnKl+GYHBkvVeL625fr++3Cm7eqQMAOOqqYbnlUF7FyEsdpoyCYPVBWwYzBkFVBfE0+TGq2sG7wCqA6MUWshzBowgyPZvgmKOQZDFCHnddHvI5y01VTwCS5RaOKRmDsDivnwsHEKNJj9K4w4TKEOVydh4ZACmCCVE9ZvCg91pOgprrT/tZZfaNAiBA1YijjH1A7EjHu9Ay01aYFstaUxsFvOV4cNY55VMgTMLILwtgEdHk/kI6YaIxC1+jGtlgbuw8pcbuPUIN9Zk8wmobpCKYIKu7FU8ZGhCw9RwaKvIBoDao5oCEG6bXEbAgFb2DgeTmnW4e6/jKQ6eWAClMPSp7JCmUQ3YL9THOqqmotj5RZFYjxnDPS1Bqcz6fmrmq5p5zNWPMz/Q+U1xJGm9A1scYcGI0kGjR8b5j77zd2MJOoS/X/feft29/vl9+fpz6u/DzAz863v/A9c++/2S8E1eoM3agd9K40eWnDzvLX+z8aqc321799OK82PPXszXaxfzkrRHe022ROgMIj6D1hn5uejrh+cSnEy8nnlxkXAXchGvvEepVzolb1x4hc7Tm58vT25ev337/9vvfv377+8uXL+fL5XJ53rZtPeaXfRFrWvLz+TF12arg1k9yRNNTny9WlzSUWO89Inj/dUkOCXIoIYMcGiAZXEZgKFGJNKvNcOSMUsLKuBz0RwJg1SQCeReA7EBEeAopS2kYLQOuFjcjCJpl/U3ftSNCvZt74wkJCio8sEHnYLY6KYPchrXktifJGumSznvrXWbPaeHlVOyKfd9ve//4+Hi/7e/v77fb7brfbrdb711Bde433PZ47/ve9dFx2/XR4/26x+CXAwioNlqZbntEGGhGdIuB43daa+as1m+AqG1r1pptzs3b5eTn5puL0OY6N79s2+W8Xba2nXxzO1/adqI1B2Rml/N2Pp/d3X05/nNWAy7uHXAzdzYaFET58240gpYNnlGtCWR0Rlp4XVKAjW7mVfk2WMYt9YCgCIFAIto9059QdvIrg5IanItZUyUhcfsCkSG5iNizcGvYlyWcxqyZOyyMBZA+zHp00ihFVKZ9Sj6gLE8aF8xY9azIYsIajZFPF8PqW2psHNZoDWYyb6fzrbUYWMx5HrlnvsswyBDyy5XLLSGnD2BPrygQirgvVwNis31Qq5AaNXKKOGbAaM29hTf1TdyBHshG6j0EySu+ewDzVFNCRfQ8TKceruhAnotLyDIn2DkrjjDs+Pp1wOPTIDEzGkXG6MS52mp1Ysa0aIfvNknA6tRL89QmvWN+O2eD5B4B0kadCYCE3i6eY2miGZ5c3x4xsoGWHibt1KvlrGcbwVFXsM7JsB9Q+m+I71DLGLbHcPrJ1eHc9+uo6b6LyFTyf7EoVFWUeQqX2yyVDYexatHHrxqBmGGOjJjMgADVQWDD+u3QJEfJ+obIZ2JeTqojiTHpPWsq0tQsyxaVkJsTWsY9NaDVxxcxKIZG2B5jIQs5L5sA1+nZKVFsJZ9koY4L/seBuFaZHPlrhYwPWRYktCG7x6KOcc/h75TVsQX4CjEcn7QktQFFOCoflpOWxS5aSvdyukuhWCubKW2eoct078ged7wzER7Kt92swHNDK9Y3MjLj7lnJlj5fxn5X23LecV7WQHMWvmNYJBFdSKBbSmGf0olFUaKCHwO5uBi743aoBsAL+KcEMX9I8nhGxv6HtzqDBMciaHY4Poyh+r9N1mqmcs9SFUsY/TF5w/ElZ5nvEama8qcyvIYULmu06qahGXL6e17BBuK22D9TlcxtmpUgWTUO1jEweLoezL9cRFCDKwmzl4LQeXB7xegGoFSMZr6Ym8lOGBnAC8XYBh090AU3ME228VxKKUW19Y1sSWOAIZB1Z+vO4BFmnouTWxSSGIJp8JomO2amFEU1oxsa0pgLXaPr7Ltdwp5v+u1j/+3H+7fv7y8f+6l/uD5u+nHDn3/hr3/i9gfwXfbhZ5zcdNXt/WfsH+1spzNOb5s/3y4vbXv19mztme2VdrbTy4kNbIXTTssoj1p1KBzh0bcW581eLu3trMuGU4N7BMleD8Ts/Zvh4WuPHcF28vPl9dtvb7/99uX3v719+XZ5eTmfns7n59Pp8sD3v+yCuxcWcZ9CvqigEua1FPjuW4tina88yFOeU5AZEYPqh0e7n/jkfdw5eR3wgS3WCMrGOBMiyXCQeDamr6vlKXhcs0cotJdDQhplzLJXJFwiIgylMElCnTKv2kL1tHLNKQvu6aZLzNoYhCVdfd7emoN0uFkjia1U2R63vV/j2a/X9+sVvbeuc+89YnfQumnv79e47v2jx97x0WMP9gSfjTyhTbBsKGKfEBpIEdF73xJe1Zq7+8hH56K4+8mbN25uW/Pz5k4grqetnbd2ObWt2cm9tQY33xq3ZmahnWQ7+amd6CB8cn/k7GRvFcv25Vv2iLSBj6Z59q/N1gc+znuNaMFh00wVVGpNQAG9+kzvxKQ3HTbQKrr6LE9HBV2eCJVz4FS844u2DGD+m2fcg3xypCs1WuusO2u+oyUoSCKJZVgcDDSNzMKSXgCG4HgDm7EZnXSAgsl206jTpUsdAQ1qQQaBIo8euyzXopWqRJDNzQ/0Y5Q9tD7CnGdmFWtqn45m7tEtlAUj0faKAy6R6cSdV/nscgrO2ciTfl2pmitjYodSVhPWNYT2kaj0kJNH0/94Ct6/uRzf8+V4jF4fg41MVBeNyl1CoC71Ke/0WdPi3wjk/Z/m5C9uCXph4vX585/0893apbI8NHYOaQVzrs7A+vgDRZfWzqH5JUWUFb2OpPfyT+Z+GT4JjlD2cotjlkI8ysd7OQkVTuq18TVKMrUc6wfgp0ayMmceoP75aPWnO/nRIoHzw1x00cww3y1f3uET3eIxb59WtkXXnBF8Xryc9PQfstsZjy9zqYGYDvT8dxSEzUlBxvuF+52cHuQhsiZBuBv6+FiNp0zSQl+kM73uHJ9o+CRngKUqq5oY0ofxe0zKnSGrntcVEJHE2L3urg4FFJAyrJALMuhl1aOn8jObaECycMl3mdZSDIrFFudifDsHhCxQ1QrQjAZlE66xzMReEYLidLKk7aN6ncRmtKJeToBKTTs4HIMkrmitwcugWwWlDoyVxMxyfmJ5qMNbmLU54+ul7tK+KRs+vdas+cvjIZeqej76fYBcIz8zlokAWDzld+v4oM4CkOUlRy3+2GKi9vRWE5rXY3qvmAKT2gnSoELhsCcJHECHhxsPGiKDhIC0D26B6ejOA+CIS0kKqmWPSzkAUTuicwu28KebXn7c/vbz49tf128f19OtG267/7zFX/+Kv/6B9z8QP3G6wULoW++43rZt77G3k20vdn5De94ur+300rYX357t9Lz5yXmOWl9WoIJoUI8EFMOJU8PrxteTvZ395RQvJzQPUYG+zyThvu979B4JFIlubTtt7fn5y++/f/vb37/8/reX17en5y/ny2VrZ7cNjAwPf1ZzU/x+dfj9QsetZ8/jJ5dcXLm60Oc7RlFYlhsxsNaPA6ijIno6nBIlrw3spmxFDO0Ric6dYNIjCFYmTScPWpdI5ym6J6G7WVX+agY9U5clc1pIQu8g3L1CLWGwFshsQVa9BLJplpn74lZV4BDNz24tL5icWq0jgnu/NT9dNmQnRElCb9ApiP1223HdY+9xDQXYk+qnPlc4jcr6hpIXMs8t9chUg9Oyna67twqj7nsgQNCauTfLOH6zrH86bc0vp9ZaM4MnFYwx2pmbm5l0ksRG842NZu2ATiehMwiGbR9mNUMS4QaQcDFplmZxckkEpqpJx1/ZwTiLushRvOc8eAyoYlHIa2RHmlBnnUZ5btZGS5LVmGqunFEl/UAJHtMkSnXZSZrczI5EwpT8+QOAkRCYLw7dd4jxMBwfzvFSR6rgIC354yQkHQAhMzaZ7TRrWzud7ePU93cGzb0Ze+24+43L8EIKZM9UOVHET6Zbj76HCDu1jJsB2Hvl0Dj2YG4TG0XPiOz8NQqwAA9YFy3QqQS/jhnp2Wc9rPDGRJvYzvvzDgMYOmeLGYhibQcyV5hSX+MOY/rHGXEEnscc5MV7zBW3gRdAXlPZR3KWz5WTwjsyQEqYxpgsjljC4qgV+jpHUCZMDmxVnqt+O4zOpV/Ufbjx8TUCmoWJr7jnOpm6zxtI2S26Dwnp04/CCF8eIYNDn1ckZbny8aT7nsfrPKDzEKsGlLV5cyNZGk65mgJG106h4BWRFY9ztH0s22joPtrcZd36sU/LHarCxcUsn1KBh/42WJ20xccmS86mg8rxfy1zUn5MWYo9iDu2pfWIzGlZrPd8tYxVrBb5enw+7GCyynAxxrR+Xpl9uNM5d+I4j1tJMwYwr17XKTt/7jFlys3uzYI7e/24/pgfWfIKH2tQP40A7eqo8O4687756367IV3ADNXnEJmsh2n87/r0woCa3999PqnIJBTN+cq/xmL/rzM/qWNy/Hn05Oxh/tv31bpglX8pet/NpgV/PGnN1cpLkHU+69I9CCiOh5qPNnWfKjMwpih319ClY5aLQIBM1EQqysM4MyPkhJs1jFrnh1sDUHloIUz3IxIRNDzZSCDQyNvAm6VKFQSNNK4yaaA8ywU4D0Y1U0hMh2AmhIcx6YBlhZyq2vlB7odkDYnI+Zk/T8iUlZ4v5+dWqQBCJu4AOnqHuF1gr7d4/XF7+/7x9fv163t/3bXp44bvH/jzO/76Fz7+QPzAecelA4p97/uP58vt8iaC4aFTtBfzJ7YXbm+2Pdv23LYnty0bvoLwCDnJo7f0LasrNpzdnje+nv3t5C9PfDqHb3uvsyrTZfCIiI6QdhLmtrXzy/Pz1y8vX95e3r6+vn15eXl7urxs25nZJW0eM4tyOKbtf2v3c9EJK0T74cO/kh890B7gCEaA969JNJofWj8sZJVnhifB6v5S3TryWWKQ72rsPlt6pZcyGl7r8swiKSPEABTVUwWIbAiQh01KZZptBKBuCW3RaCQCZIos4dKV947I1kxw83barJkxIjITRocC3MPpso08DSSYTHFCR1jv0QM3IbL+cVkIoSN6GV0CYH2vIlpJ+76rl8GU1r+ZOcsB6MI+7CIfIPK0/5IGfn4ltz/o9IyzGIA+Js0qkVj7OFvsFUorOinCCQsm7Hxjlt6M0Ps4RMAoz+6T8AyLeSg4pymdPdqjyI6oxCHYjwGL0rDViLIK2SUfUJNPeYCpyfmJ5wSftPS6WfJ0+Lyt5leHuVDXUbVoMDMLCfdXJj3DrinVxha8Gs3s/haFB4gZ6bCK7svMEgUUlcQOhNAj/A5jY4O1Lyc/Zlhwuvdio23ePvaboax79WD61IQbl+5+EtDvewFzLTYgzKsb5qqO8uH5ycBddc6c8wdFNI7If2toIcVpVOHmp9Zb6H48+Wcb5IqPq/85MlKWFaaEL8bRoIVhYGQ8pejjLlpGMjISyQdf7GqS1tz3ZyU8/gWKnL3etEbcx6driZdswN2fxk/zk0B2gBByQe9eRfUz4TtzFaxaedzhXzQ4heosWCImZahm9L0SfQGA4TEnZnnd7crVir4f+bK+j8Hxu7W7n5yHex1qQUf4f/3u8ZV7KWLm3Q7ZgoTK3g5c4K9vb0OiFrXyieIuBoJxzsPASd4p07ySkGdearTiSM7+6lqCaHj44uGoMUki5kAGiT2Aagfyf/y6E9nYh07k8FZS46BAY6HSJ1NHLMGw/O3/4O6PJYYxGJAeVyGZYT5ZnMdCHAMgq9tmDTvS564Qk+bhMehVKKViRSik5F7igDynHVIR+5znmcOcCm5s7FiReTV+HvH7hweXkk6jgjjJd5Fm+th+hkW3HmJTM1KRjlr+0XR5/bwNYFzdNYH56kBkdRqKPnQ4b9WYtUz2kcAokz2vkidSgkZUpQXA4hirIgFjuOVQTaHV+OScDTOeRQRc6GQA0S3EFjhf++t7/4/329efty/v+9MtDDvxo+OPH/GvP/njz1N86NRvT4FLx4mt4xJ6ZX+23fTRGb3RLq88t/PLdnpp23OzC9Sic6BjIwxOmIENFHFF7LIN3tr5zNfn9ttz+/Jsr6+8bB3bfgtD6AZtum1hsdlGhqCTeTf3p5fX337/+vt/vHz5+vTl9fz85KettWZmCKiH7MD6jzN4kI2M15Sxz9rwlz+ve5Cfdsc4DWa0CcMqO4I2w6ARMSBcWgIf0VGDlntW7OX4pYLuJxvMMaq67zDwzFyqNiJJNr5sltr+JBWUtxJABJK1NtJXJau1hGUwMU8cQx+swErEeRbEqGIuSYbiYJLCE43hIKCIyHR5iHD3DTBa9+yz2wv82nsXI/FrTIj8sIcMo6ReHdEHznrbbzHb4uz7vu977o4M5k+VFRGx99Zv+Vd3R1XgNZHWNhm7Gf2UHFMpLadzW2CW5Sq01vZ9nzZOahXQJHZtlJltRnM0AFAjGMqgcrpBoimUnuy0WS1rJzDOWqI69WY3JjFtosz60UfxKWotioMSyXwwVKEqnJOOoMQMeLc7qMAv0C9dkmtQrM5dsB4Bx3HVIdegJPrfVYNOSMYSE5kWkpFBmWPGACXtvd8i9qRMMKM7RtokT0Apcq91JGLHgaxK42isBssGEs5oluB+3vYcsHuDmUM5r3t0S4+8H5nnhIYT7ujZppojQ5ZxniDQjyN2xikl9RGfVbnRSyogudhyV7GmVwsSTLUuR55/qoL86/QT6teyUB2AVx1fDqMPLVGJlnF2pNZ6VG5TVwyrsa4/Vj9o1ndhspNOW0kDGl1u52c1m5vm0MD5VlZu7AoTigdyHmlSPvWsUtDwcO8ucjgA82ky8897jPukiV9HfszhvQMwDgVZ5R+O/kKHK1t1WyprkDKCZbZlqetBzpm824eVUPeIKJO371Dx/1ARCdrFYFiCkyjenjXwXedLArlryT95DRqzfQQXcgNlOdUxG/f4IpTMrrb+RINPYeawkTNwIo34UVvWfhgk2YI7GYsQdo+nD2XAq2RxLCQlgZ7+8Z3WqJ63x1NicbWlnfQovKsqOVj+QG5cZEaGBU4f+neelElkFpKJo61wxdUZKMOxmhKDWQdUa+Ngr08i2YVw/6pIc70S0RFSH1mhUJXqzu68BaEOFvArD+nKPBEZos4CnSTYFXd7hKzMhcTdiCqGl/ReFEFZDEkagJjCvdaqI4yJT0bvHYo8K80s92loR7avF5B0I4P3s4S6+mPcmV/TwQBgdmdiSRiNEVRZswzSl/Uvs2oqSmaLhSlCAJAYFNFFAy2EUMw+QVy1c+XjUlXFXR1F5WeKUFzKTkuWqzZOplSDoejdZGxkVlJqNFDLwzj9T8SACKE6kOUGr0KuQLhZoANZWF38rj4tgAFczInFSFUxshQ07wMAG/M6eyRGxNn9stvze7xd47eP/bef/bceL+wNHzt+/MD7D/z4F378U7e/sF1PT7s93/bTX5fXj4tfv3q8aG+3D/WPRsdpa8/GzbaLnZ6bX1ymQO89ErVOoQp5wGCZF7RmvJz87Xn725ftP163b6/+fAqeItp+DWLX3rXb3tivdtpccSLDPNrp/Pr25cu3L99+e/vy7eX5y+l0cd/SUc+elRGHXE3JX7sB4F7Z2Uh8P/xpHoqP+8hYZxaZZdwLiDHd6DSfu4ZMz4usVpdipRnI+AiSQzKCEZ3LOdJ7b2zF3DW2o4xIhgPz4qyovFDkHRKlJhlHVztBCQMDI6rSwIrxOLsOeW2KiBi+9vBksjdqAgxK2WR02Y2MLFJ0M6M3GqjqoZfqqquHEeZWGP0mhjq0+40IIUldEkffaKnhI30AqZuQmwVycOeu7FFOv9I2DQfAh4VEJpz5tjVHdJi7uwoKDBjNNwAyV2v0k7WkzesBmIzwjNGlJgzQt5MlLFiqlYn0+px0omDrXTRZl4wZoLZFk4zYxPAnP0vX4yvPEDMVZ7TN1EfhHIvmIZiNavM2v/BdU7oc0WXmycQ/PjCWG+SeHA+jKizqvE1YIjkKxn4ddR7PuNaLltHQURXqECAr6vVxQTPrgMQ9LKuqADht20zW1CNid9guRWTnEkCRlJpOmTuQaZxKoJlZ793dT/Tbrd/6vu9qgLZhHeZG1kKADTiqGFoFAhYkk5m6hxm6CxaZnlOUDuDDDERkb9AswEi1TRF9xW0vX9z3fU4mFivf2JBWiPp8c1rny6sW3bPmpN/HNRhws7AVWJvVC+OdI42Qu3kOZo6H9otqhDqGatTFSjwtzofPD+o+GbP5F4r3AurIzHqYOdVFg5IrNjdfacjoAqWodqoZshi2aZ6f6Z9yKjrSkrI2IvZ9b63dDX4K8EyrTwcguZHJXu5NSjV4NBwfYUSQVuHFByjOfIWqVH9KyoSgz1x1fiGJn0I3iemOJvGZsiaEy/jn4gKAhSp+NPcsq+sFRpIpp1+SBoUcZxFLyVUvuR1MvlxudkRmH+awjB8c12lBk9B7cDXSi0EFUjeNHr1Ky0bFSJPNLtO7Is28KKAq90s685wro2d4yXn/vVcRcE0caU4z69eb5WPZiLKlFt+Lbpkz8Z3FXZULzh+odOhN0YOjT3a6LW6Cw8HRpSgAa2aA3bLxJzE99nmUj0i8yoAfPafGnI5ucOmzUWCTqTocG0HuFeA0L7RudEV2+qQJTAVZCYYpiM22iCLsnRQfApwbKjINwrL5JowYHS5ynzNG9KZ5yTpJ2CwvK9RGWqgBIrue8Xa7ZVBm3BjTvABHMiOkzNUCvRj324GpIEj2UZ4FZAgqd3s0A0NmNkBSNGtmTTKwmZ/hTWG7MrzYjHvmI6CsuqVB7u22vxfJSZ77zF6v3Z3QXn6gej5bc4u4AhgtL2OYSHBjwthZq6hx8CMUXSLdzEmX2BXuySchFKygwWQBonuFS8jURFFF8El13SHtN0lwM3Opp4cGqSeBBETtfvu5McIa7Hxr59v2+hefv+vlL7wF/77bb6GLrk3fg3+Gvr/j+//Cj/8v+C+8XHXZY/t5evr48vrj8vzH8+Vfr9ufJ7t6N+yvFmdY69vVzzxdTt4U7BE0ZS1+Hn5Cek60QAR6VydOhpfNf385/c+3p//Xl/Pbi2223xwdt4+uCHVnN10Jb3ZSF4Btezo9f3n++vuXb//j5em3b19+99Nl286n7UKywLjKg7YOShuZX5JpuxVCutR3zW92pouIGNm5CpTdv1K69j1A2uY00iyYbXcTN1nnokFWAcPsl+1DfpDaNHlGlJ9CT7aI8vS7OUk3qGvvaaM08ypQ1zDokmAqhR5Oc6hL14xegXJncvCEdoYUez6T6WO6vrM7gTu6IhTYWxKNpyWRdbXK3ezJGlzhNAGzHBkkuMEdzS2tiJiR6cBgmDEzT0N2NvSIcHfAW6GbMoLreRZUDYOCDFpBYah0KkQm5QyzxCYdgJGIrwMs4rzvuXkdgLKIggGj+2ajQzDVWfQGriC80RsnYV+WrNDycaInGssmUK9LWZDTHIbUxxFAoPfQDB9lTbMN6mCz5t7nUEftsKZ9kQCkG7rVzUDkzuoA0MOgsCoYY6UqE7YIA2WjSwUF0FMhQIgOmqFnQiqnzjwTQCp6FkPOGyq2IlbpTpg1BKLOgxHagIZDkRPKYcCZs86G3CWA1+mfSdaARLPN2tnbje07t1OPiH1HXDd0ssMgbzs8bvvekUWqLrgyoFbyp0iXl+ZNgLnt+z7rQ+AEQ3uPVoZYFpL0SOPG6Gm00LdN6Pt+i4gsdNMuRW/ZG+x2BWXuGUMNKDkLJdWB5xYFPxhB9JyLkTtUWRtHXC31UUKeyqJKCOCIHmSVztizS/sgojVPAz0zamW3zEh2yJrnuKYlMLJYq5k6KtMwoSzSrM/sYoSZQYqoOB/GYQNRPFqXYjyVsyjGSUoWCkbAaGVUYEh4mmYtp0OSGZDZQArkgHIhYodlKaIzdoyur1IJbd7fyk4gMdAWlLeRXasGB4uBWy0SOJT3KL4Uo45dshSNDauZyF6Fkjo6E4IoafQBSGRKYl4IgF6OSbKoQYjYsyGaKaL3UJ7frM7cwiCISfU+ciaFGojZBCmxiwZlECmxvoRgdOTUYlhcKXfIz9VxZtPVnfOQEU5U+UOm5yZvGKQ9+1200xhD0iFUm6qm6Thm4GGi9wbZeR9smkmsWxUUdfEk1RGAyGQpPYGMqEheGja5PuOSgKTNWp4L4MDISgwZk1chitMlN4CyucKBvZuv0F7ClM4bJRIB37LwK09gd5tx/xH5Y6UcQnJkvBYrSzEGvryqcLPYlLPkNNIhLzNFIhAiiD78pNQiUUnGSDwBENTAUKmT0Q/2TdVRAuzZqKji+WUpI20VEebM+c/UdoVRy2XlaFeMcrdSRBedklLACGQJC4vWJlOo4EICe9SnTQ1oSZ6RPsJC8XkEFdTJbNeBIzCPo9x5TnI2coHSjPCgmXJ6mMkUyWm9CK1HLi1TB4PB9yjMGL3XYmKiJxsXOF3ctD9y/rUrcp8SI15bH3CCfrCv5g5JZZVRt01hoksSTbMobbzGzznbvYJr1ROO0cMc7o3ugleYCwh3ou3cPnT5ub998Muf/PqX3m7+e48vEU8I33ZwD3u/6ud327/v+IH2Fy43Xm5++nF+/ni+/PX28v18/nE5XTe/4QZ0895orbcP23ZvNzcztE4MPoPBeQZk5iRgQYuwzS6n9vZ0/u318veXy99eTi9nN9vfTbtAnndGN5P32xY9fGdIbH5+vjx/eX39+vry5eX1rfmp2ZbZr1Su+PSaumhK6foDC2tXB8/Dt9ZfDyFPWCgdBGiDsYFzr2Xa0UotQsDEhmKckSQhB5PMKhSGMfgDFSxlMm1m850tKn2rgVDPCT40WO2XKvXrmfJhpGeaAplHMghXWaQ59MeL1PakKajh6Go4VOmxELKMDsPhJt/cW44gm6am5w6K3LOxoJU1mfqrnCKOl1XlfiEvaRaZ5q5pzuEFKfcj2JYGlPvW2rCfxvjNBDsC0ixg8dHyZv7rSLSEdYIsHpmuACljsKJFtcCjrCdG9DF/K1YCRn1CmTTmjIVx5LH/naymFE2kYoGnWaF+Xzq+53nBkodS6MI4OO4odjBieEkPTmYYbtimHDHCocljRD05AorlsCWGuXyhcSjn2s0zWurlmZWbWe1Y7h93/C2P4KD7Rm/WTuAmP2UtT+83jx3qdEvq7W1rZh37LYOJRBTP2/KaN2itzWhoRMgA9ts1jtEOT4XVcAEgYmIlYhc8Dw+H91ADHWxCBzPeuyIIUkkoPcay/kfaW3DbcK+R5qoQx2QCyCJ7FU41FoTBmLjjGe/IOdcV+aWAzbuvX3n4/IO6e5BPPrwznZw1lz5yHekFF3tV8qdOAV2ehSnEe+mojoIK0wKwpW32ZLyIiDJ6H54omwzQNBvnpebVwWp49zgAEhXec/OOtcfYzBmCz2M6IqwwPpb9Hlam+Jq5++39q7nN4OkRVV8fIcuKynPIawIaLK46pm4uUAcmEUtaZdNSL3tl/HUmVTArGfJCJUOjcHcELu+eZBxDB3D6vlLowOA0FN15xIGZH3FzqUCOkjKVllMmVPC4TCXLILLJzJuZVTVoQOogbPQyxDTARjQZgxGPPaDIBvHrrqufUVVswOjgOIVxMM3nRCmBGxQm2zEJJ4f36b64ENWhWoCQWNtZ+J55F3IJ9h//H7+OB8kRiIP6ATnj9JxMG0NDj0DWV6aNLWDE86XRaS/PJd7F/klnGIoW0ytvW0nkqYxsHPQMq1qOSUG1ykHuOlaNRdIVJqp32CJVRDSelPPgzFN96tLDGpgLV/KJx7OzPnW3pQ8AgKz4kseiHwcD2JJgUOEJT2SdUC7sIBFMgOo4Io89oDQ4jjsiJQEscv5aUKQ1B2A0juccc9ocDiZW60RsNO9yyUaXQCZEJOkDMRoYSwG/yZTlFwonQTbALNS4uZxhvXxnws9XvoinK07vcfneXz/09Se/feAr4jf1M6+mj46PD3189OufuP7B/gP+ge12fvr58vrzdP75fLlent9fXnRqPG/NTOZSN4+NZLRzlkSmR1StMHKHTyBmHmN5pPXT1l6ez9/enn//8vLbl8uX53Y5m7E79usuRu8u9qud9r5HnHp3UH46nZ8vL19eXr88vbyeni7b+cQZ8cVMv06tdBjlU2AODdBjdV6JngvFQ1qObbjqjUU+lzO7zplyB/KPgMsGqx2QxNsFEMUw14bxW8JR0+UVPxfWkSQJesSeDgKLANHKvRQMlUcdynjoOmlwZmt5Ph3P1WNqYTF/OZL+s2x0XDS7VKNkkvOJ74IpZdgpe/MxrTGpc1JspVEtKRykHft+ciUh+57OeR5DN3qbh6rT0DuA5lv1RZ6tDdNQjcM0YcFdPB8qQSMc3MpmpqLl8jmS1Jkre1iZLOs1FwGbT7EK3tjyj/bZnaGmamY8rX+lJzCEEr9+LeJd6SDdSymmsrqzRdAtmMTEuHNjHh3g4yk0ohJkGy7cca8ROX64QmXwYeN0mMPm2CkEQTdr3tppP528XbxdbvyeGcSiQRG2Zq213nmLri6JZp6kI6PSANh3q4rwE2nbVku573s2lbvddpJZxRfF5oRxqipHGxE987+xT5gGcpeRRvRsGJMuNcvCQoXvyhjEveow3u+6w1xOHeHgPAXvkkL5KpLetPEG6nts7vEER5DosPZ+cbuHZb2X1TsFUX8tjfPwMdbV+HD9tHBG4VzMayYrYEU1SwPOwJoGbm2V0tXdvRsn7/yNunu9qTyoH+6rLM+Z9vHxrQJVDv9tesJVgZCblBFdokJ08ojqPsr5iCXdwb2WG6rmLR6FQZkZ4HSfUIZSVmUIAz98zMeQq8NSGnc8TP/54XUa58i1ALdY0LvCma8XzFFLGnn1uWvurpyvdgyiB3l0EcsL2Qw5jxVGZOT1cGruhaAs+/lHG1FbYDDagyjIPmb9hGhSR8jHxptl4A8vTUNNwqgSQHqTEItg4+BGOA7+ofrm++vlp9KfkziPDU2gOYW7d5LJZ0oGlPQS6TsxHxOcLJHRKWVHqbJV1RNOU8lgjE9W8CmPMaMysdMBuW1zh1fYPh9DgWTCKQMgixNCI7e7WMYl1sDn6U1TxqtEslTlIqz1Tz3tXItfvvjJMc2RzavN78qylYklHuTzRYxN6mJSDye3ulMBy+weMSvXiSPqn7IxsHtYPbroGa+1oU+O7WSm6l2DYDZ5ctJpBB04yRqxMRThQ8hq2DtQdSI5xQwiT7/hloICXQZ30nsXujpCRjfbef6O15u93nB51+U9Xq/6bec36C1uz9wNHzvf3+P92n/+iY//xv6v0F/b6ef29P7y+uP59a+ny/v5fLucbtt2a7abJwckjETsAtzZEUKgE4fPNJzS5NSOCIXJgJPj6WxfX7avb5evL+cvT6eXSzs1qE6DHjo9F57s1m3v3sKM3s6n89Pl+e389HI6n7d23rbzaFSdXm5f1/fheHh4HRvsXirmfl6/fljU+ckq0Ku/RgQiMjUOaJjvPKD6/08vDgcgAbj5qxKhZsFRDE462YdVl7c3jIJBACMPnknHTgrqDMWSG1me+9E4iNUlWCdnwZ5i7LiEY4KN1nLWpm9x2C4zfZqQE3UWEyBU3a4wH8c4Y8ZleUf1dRkYu4NN4061TjjEbP/MQUUwbHoP3PEqDl1RAJk5hyRF4/DZ1pdUHVOmgJBV2DrPqgdx+uVZw4HK/Hw6lDqUdBA2SBl/wWHZzRtV66LDqbsrTx9zO74rZnsJWowQY1lClhHO5SBbbzSRwseA17vobtHn+weuevmTZhqgsuPzZYkhMWvmWzs9b08vfn7q1xPjpNgNHYBTyblMQs7eDZLZIbUcqLax1lVNnm4hyT16dFRRaH4+gWGD9Ikk4FJPjHBEBJL3WjBYAAEPY0TWXgpHYiMHECgE17FMY2kT6/8LqZgplOUUG/HcMuKzJEHZonTUC+VrNr6deLZfvtbF/aVkzj/p/s+Hvlh0w3Hm1ojvPzncEkkTaFS/hmKcmBjyfydgE1YxTDyJ4p3pldPV7yLQ8yvUwuK9qLfBLvjp0cw8z/Ph4ds4+ucJvkZ4K8A7Jukwo0snjPenklnfGaOJOaX3Dj9QtkZoIBSOjXlPAjEn5Jf1zZ/0z8Oq/mJ9cW9BPXxgaqe5ZMFfCJWkRll1xMpQ1dCnEdUJm4UHyZqNNDCt3GAQ1TWRhS8PBjJ6WJFVFdaqiKJnKDkzjxgmZfVqTmzevRznR2ZoCeVvKYnXKAzArpb5iKLxIEmO1r8wM3Fcc1ytq9jxciWyOkdSIsizpXg6qqxOxFPXzxLO6nBeYimzrPQcJy0QzABbiIkESOQc+pSmdCXmsVeI7GAk6Y4GnkbD2JSreq+kwGXl600s+Ji0D8EqmeZ0LYYEZCvbjjRHJuh5RxjpoynSYbh/PjsfhG+I3eOfWHba8JRzM6TcsKyJkqM6patILu8UAuiC6GAkQ+heImnMIn1F1PPUHeca5R01mC7XXZ0VxlG4PQQKnJXFYV42DQv2Q3OVtSRzSge1u7IL05C9wq6lU6jMLOWFzLKWw1rAJZe1zpPsfMX2s5//wO9X/q3b5YNPH/YG+yp+czzzBruF3X7G+8ftr3/pr//Exz+BP2l/nJ6+v7x9f/361/Pzf1/O37fWT96NMkm9VzcvdviI68N6pTmKucggVi2RyMT+J6DOn7avT9vfXp/+/nz6et6eT+2pNbe4GT20tS0kdFkEuO3eAe2+tXa6nM7PT69vTy+v5+fn7XSCl6yp6jJLX5MHCvHX5r/WyNovTB8uhs5UHVpsoCl7qcAHLPTwG6FBHsHZy7YkdhHs9f1jDMqmIgUQS/iqat8PaIEtX7fCeSc+qGA6UsCWuEaioxf2hexNNDYXNSZrHCeJIPPPW4+kWQNAtrSfSr/c85Ng8aCOn9PNmO1+suU7SHqiWHIDelk5BCgOziGGGCJ6JAQlj2IWh76khLEDGo+ZbgVgsUef5zszrSpkvyj32m60ac0JKAIDAlWAL2NibTMDPZZ80VurkHx+3YnfHchq2kB3H1u+GpQNhmDM/hgahuPxFQk8ZJul/EY0IasRVnO8IvL3PV7v7z3HOceH+4P/GPNso3vPt+ZHUnkEX5Gng5FMgJmmqX46t/OTX163l7e4/dD+jv6OLHYgWHQoaKSdXL02HcuJvEPzTifK3X1rdIur+t7dPToieh4LAOg2zm8hE+8w0UBPsHXCftTDAp78uYkE4WjIOnYayN67Pm0ZYPD0H1b+dJl8Lpuql4SS3ykB8gkStoSJ0qI471NlEEJx62nYHzWUwudY/fX/wTvViApEr1TSvNoqkNV5Io59PYLmwJETKChcCmTayyO7oRTF4Jori6haIEx7bN69LKRlxlRovPmgh4ZBcUDc+QbzWVZtNp8oSzeVbpsShVwiqzroOyAaXCxSthG/z66gnvYTCzM0Z6wGrBG5H7bKeiyhRyJbCGjpjlCPMC5DZk0m1nVLvBNSAj+Z+wM3doCQx2ceHac5D7kaJIu3aNjtM5LFyqBKo0JpDXIpKKkVhfWAR2qZ8SEPNmz0IviaOnF1QCR1hcUMfk4Te6i/KEYZDTMzNZol33pF7u/E95ev+itjOifJKE9kf0GtDzmM6cM21f2WTo2A+zfnMFTzEQOZpsnynHB2rUNa5g1A1vfKkhAzEkSVcPuqly3IYRnWQvWkTos+IvIQcbpA0m0ctCQVDthoFdRye4m3IpqQJQ+7kohjFJtn8uFegHYUn70N7BqGubKTniEA0m1pPTdVEg8I/nj8CY9GVRSNKR3Sr77aT6P2IKsanHRjG+mtxRVMlRJlQzmQ0SEWQRSrtAzIIqCUXRLoFWBIwG0+el0785vV1DCg7L2VOZDs1OBujd4CjTCYgx4QGaEd4TIZPB8sU2MjrNtznRmyQJ6IAMxSfvagi+pw+VPYl+CXK18+4vR9f/2Tf/uwvwnnbs/AG+wN8YzYfN/tdrP39/79T33/L/z8T/Q/0f77fPrz5e3765efLy9/XC7/3bbvGzvJhi2PlUihHcHFPWTZbZTkYAhxElAIHL5Q1nU52+vlb18v//PL5e8vl9+eTy+X7XxKoiZEkj5KVNBC7RQn+q5927bT+el0eX56fn16fjmdn2w70N5Do8WdMhp69JcvLHuT9zpn3cif9cajYxCRruL8+4gCmNSNPoM98+v5zdQhU/LvnBDNgTlQxd4AInYMf1saWz7tLWa9WJdCGt3EIpohUtVIGN1bVQRWy2yMsa+ToOnnMwCfn4z08egyJz3ZEmVuGPZ3EowoQJkUsVsOKULYy3I+4ggcvboP0tt5r2MMj4vAdagk0w9a1y7VkfvGI19Xr/lJmymA5eJHJ5MxouE5+IO05BUChwk+uVY+m8gPz7XYf6X6YrQumplqDWDv8VyV7JIOlH1eoRQFyZWOdnxi2BNMH0AzxOj/Zn7XXz4PeHmiI7o3PcF53/G80zgOg0WRZvkcW81x27YIqPfT0/b0enr6Eu9/9dsP9Q9pV99baynjRkOjR5b8TVPs2LMkZzqolsknt2zPfzWMV7Fa4Yy1q+llNjBmOBlkQ+9B6/BmHvLQHkEoqWrnns1v/jIMz1GOmb/OwG0avuP9msBeKkIkK0B6iIRreEy/0B6LvP27NV2lcVUC+Z+uu7je/HzxRB2twnQI9P2tV/DJwy2S3GD/hYUzryS/vzuxytsQ/lkGffddABnCON6Zk7OonfW+WQjWJSmYIQYIQdBMB3qwvuW0PogiRhozfeLEOqa03yucIxTSB1RVc0q1UJQOhTeWo4Ijj3M1n0vVzg739v345MN//59eCaWrS91fcG7/OdlJdbWqhTmqxipuyEbpGenJ35MI0YDBvxFJapIE1SDZq+C3rFZLvEtpuUdY0vJ0KbOOEKDAjmzWJyhiNwNQXtqyIh07weTdk5QMd8ouTXWsDD+bBDNzmv0uOdIx1nunY0/6Ctq04ElWjGHs9wU0FYxKXNSHpVl5MAhAWU+1aIo0GqgsTO0CHGKSg0i96h3ANIWyV9cIIw4vZcbBGuECmd2W1CAXCDXQaVuZvEhMcCN20IQOwjlpwQXlXtGcVmWWNgR0Mk3VdMtDdCkUCMKr8QAVFZXXiB/cyXHuq1Ezg3tsmGGEGQDQSauCmHJsJIqAmPTmqeeLok2VUUkFI6ABvbBvCtAUJAwJ8Mx6O2YaPacxTZNE+OTcxninetPPxU/fg3BaM2tkQ8KTqrN1dEnhEJxN7GX0pXk3gOUSEbJO7w29O6NbAAL3MO1ksHVrN77c8NtH/P0dv93i7R0v7+0b7AV2hp9hT8AJoegfvH3Yzz9v3//X7cf/hY//hfgv+M/t/P31y4/Xtx+vX3+cTz9a+7PZT4cYDpLBiFDGVasQsquTdLfc1BGq0FTuKcChauvqbJufL9uX5/Pvb5ff3y5fLtvLZTs3JoSmJdM7A+xC39vlmdupoZ9Op9Pl6XQ+n56e/HxprcHaEJQYR8vRRxwFFESol/mbyzrenzRZQMZ1JEnZkEXJQzFyU4tqezhEp/qmkkHTOBzvDL8FQGM6sHkmDF6W1H4oj1pZXYmMJ2UVDcwjouoASukSVVLc5ylrSZkhoEf+P10pQplyyVmANH2z1DR1SKZpLpDGpFdYcxTsSqJZ7CqGLgIySy0xahmGhq9pGQ4Abc5rMFFgE249kLUCnNmxzmedQXr8WSBjhdk9DGsZaA1A9J7wxAw5V/swkmZJ0JiDJEBrVTIIZl1AUm/RnbNsYD5FSlW1hfeRchaKoAKiunZgdFIrlXX07/xsjZURkdGWGcCa5jJCRXqOWAwCK6ZLO5xOQOi182r+lgMxNcZA8TJtpxqNSGWqaOjrmHbDLODFgW6DJqHqCIXk43N4VGTBY6sSIAAeEGsOB2mGgYZQ1SNHjAzGzCQ3b9hut6ft8hbPP3T90W8/+v6+xxU9Oazos6TBoGIcqbYAY6PUWuQZTTN6+UrG1ppuC0BIsIjo+57qxN2L3DP3MUk4GcywRw/epGwob4Ix8SYZaoy16HJZ+vnzCota/6oqDsgZHkFWhZtjaBKJRgsVFVaamdN/CtAOgH7KBqXKYUXdNwNJwzhNBTL6EgybtK/FP/M6rKEehvjqAOQyjic66ICGB8jBGVZvAgIsG/xm8qIgeCXzU6bGMLJWtCaofgYKo68FLwcAjOR2HxUFaaQm+McgDF4Kk7BiQ9LW19gSVmDWDH0O0pri+tdMguSS5QTlg1MoXHeR0dkwvZZihmG0JMwjUxBjZspOXoRkZPEOI2v8xYjZFPKQ/HWqH2b+TiYXNbXqq2IhyiMHCREERoFbnqV5kpKjVRZKoQFAqwcbfvAosbj3JlMck4JiNR8PVTmKG4wDyqlqrBTLJ4eocUlEYdCPKN19cjrKx2NmxrxEf+nIcxjwpMMsXQSAlkgegLLhfAd7EUNr8UV+kWZalyH17+jUMvkWMFcxipisBJSTbCT9/spx7Uk2lParelA9VapZM4JdOYO5Wyh6ZS+d8GQ3RpouapADFmgmT9/AaF03KH2DXokkc05/KflJcovfVUFzwJMMAAeLiSRjhijrtzoso84V3a/slCog54djYidRT8xLrys7W+r2zOeUr4xZFNraJqlrUgmPSqPESJAmU4wSRrdqxlPDUIFxMrBaULEC/0gyxMAUlAucdsLQ7dmrppk8CkUKsCkO74Z0KawXbdIgd6LSDREMHcUr7LIt2Hacbrh0fr3yt/f4+8/42/f97x/4Pbbf0b6ibbAzfINtsBPCEcH9qutf8fOf+/f/xMd/Iv4L/G+ebqfLH69vP17efjw9/Wz+E7gauyWFd6RNqUDISFlwVEOAGVlUKDGzy2lRaXZiM2tuTxtfLvZ6as8nv5za1jZviOgsdIgRxqCBjra1rZ3dT5fz6XTy7bydT+18YtswNPVcmjyhpEOZrWftsR/v1d900XX/Klr9Ty8emefjNba3gQpkjCMqjlb8e31+VKo603lEYXkQBWk+bKqUuT5I9+wYc7KAMnL3pz8R2rNnRKVwb0mVr9A+ao/rvFzM1jWecowQh4W6Z5sApG0KIz1bNG2+CVlM6enKKgKhato67ANJkV2jpIFnmMdBVlSaWUsLDVA2XM/nXfwvQ7VOZzEwLCvCSc98vDN/NyZZ6xL8I0m2Hp33R0N+YK1FuDskmTggAqkPh117b8/9+qVZx/MADzled7j/cUWgSnzy9+VGaW4P060KbQdX2xzw3ZwACJoPSp6JuKgMz4PfMn/lUF3rm0NLH4Ov83GMMT9spHpAys5XWphTeu8zhj3nHNZ829if++XldH6+np/j47vdfqjfpN6MyekkJQScHOUic/YykJmDyR8mcDfTAv16NbMKFgix970H+l4UUlN6RzBeqj4ZGV6kw24ERDcwK0gVtRIARjR4maXVVllPt7Euh99Yd2QViX56ESjAzCA/uL/F/fI9BNR+rQ/v/yT1YXXw4WPj3+MLY4M/2jlTNpY7jgccEIh8zdJ/pTU7wkrrHTN28DBpZtb7Pke+DuBB/88NXnN790dhOGbzm+njfp7S3GUZO+TxV+WCl1UrG61bjiTe3STjUQP875RGQS1+sQo5DVryTqOE/e5e87v8bAAPDb9+5l5zHvowH/ThQMxzJD7phJZ5S1NocLZXdEFiXk4s4rwCtadndpw6B8G/lRBXU4N05BTIJu0Ao2q/zGwc/aa5DpTQk8G02N2VrmQfVU/pXufDyETSbn03yxAcqxMZUlPsMDNrBHufrhvgWRFZKkmQoiO63YFio24tKfYHi7/c8oxYAF6st5XKiqiGixF7oasYiltRhILVWyAjsbDoo3IkDco6JzSOM1fGBANk+gNNcNENzX0DNwn7LrKN+mIDHNZCe6Kb61CVkjd9hpkkocdIz/XoPQLumzGJcEGyNYdIqPqBOaThjGUoJA/K2Dl4RVK/m6cRnIKkI/qVNg2CE/qPNPRdNJhp1gaAJPfBjFTtoROUBppvSCMWXUSEenTE3kybGJGtIuXD6GURLfQKFjAJOes8kmBmhELRd5Jq7SR6RhpIVj83cO8WMEvQc1TmwRl7v+ZGS7AWErGqa9gPOQKnneeOl12vwS+3+PZ9f7vh2w/9/mF/u7b/ofY72hv8AgXosA10hGEPfOx6/2nvf+0//lvv/4Xbf0H/xPbn5Wl//fLx+uXH5fLd2w+3G8MsNsodWwRbtjiwyKrKDgJIPpDeu1VDYzNUKmUz34UIWMXb3O30fH778vzbuT2fTpfz+eySGx2SUyDCzMxbk84ON4fbtp1P2+m0bWc/be5NSvbuVKZ3rjWNTovEaeqQkOOcSKXmRrIK1NWzZ+04bygoorv7qGMroeoQNHAHy8GTqsx89MeYXyFH3X2dqWWaUALMPWbrrtpByS56+CSHokAowt3ruAqhtiazAUgWNSJ6skMx6336rfcevSdB/sh+MAuXU9uk+9t7d6/mVrWDohR4OsP07DV2jDa66G7WSM/JK0evXO70B6qQt8e+952E02g2gr8knWwZYkttTG/oIfXsUbCPCFEpa4JJLCoFsykTbLQjFFB81ZYQO0tGfMBIz0DSAIeEJat3qQ1MPYMNofBwdwc9HwNkgFJWf4pkBPf72DbHs6eLsmtPOA+rFeA8qjOqOiKI44xIeWN0YFZiHGglpyGk3tFTvfSsSDukf1S7RsTqQLJ6tz8C5DK9U5wSsee9Ku2RYKc6vyqAlxfLpD3hA7Fd5UjTIFjRI/WdxVQVVNQLpf6K0Tr3ZS5Qv25q+3a64PmNtzfu77f9PWI37Oo70WFeNLgFk84sUFvXIiLczcwIT870HOq+7yTNYbtu+y1grbXklLqVQZnIKBYllIl7N7KZn6hA/9i7DKB0qw7zIlJWU/v3kayYJvjUFQ+mUj1F74k7SUZ2slRa76MLKUkysnVfaSRj1kYSRZnYC4+OEQ8FEpgwxSCHU2ozy5uX18Gg0FrLjVCHFJkCOQayoAfL6Tpsx+UvYcODmldOIRnZMwTUe3Cg5jqPHWTL4KaMrwZolj5PjZ0/996Fnu5eBlGSdyiGAzvHOVIIiohmBpkK93GE88dtVUoQKDT/8O9SqIEl8xy6b/cWGmlBJPRA6D322ElmUXiaUgoqVLarD50zXZKAVGZVTL+UxdqQyGUUOLfkyt0Rv7D464nG+6NQByTpKdaSNDxYG2sKQrPHYowSqIhIV7VEVJTUDhxkKO4GMAYhYMHQP3xEwyPrS3ZjfLf+s7TeXGko1yKSxQV/DHSF1RaZLlovTw4QIqP+ud04ctDTCqjZUbW+i4KXTFN+bvzjSJiDmePhmPoYlaPH0w13LUVQQCVKhGzlIwoYpRGVD6t0C6ehvyx4xl04YOwAxCZ4wvQpBxvEOgnSLFfG28zQQp1mRBOimkEqWM1rnVRCfeaYpUNZWOXMo+w0KguVSZcO+oI5Y2O6Skg0qAMq5uEHOH4s9J2PO2L/TARFF/KA16iGfHiRhAQZbcTngKJCkg1UcaZ6cvKmolxae/IAd0myqjCMDL5yRj6ssTnQxEa5EjCQfcbZSDtKWAlDSGGOFJCIW3bPkRhkWOu0zreu11v89rF/u8ZvV31V+/sV3678euMX8Q32AnsCR0cKuYLYwZvwsdv7Hj++6+NP3P5E/An7o21/Pr3o+e1jO/3l/t34rixLCItwwhXsDCgCuxiCJVYmFXtmhEb80aVAOkZhAoUG0njydjFe3E9mbbOt0cidlBC933rvvUeHzGw7ncybO81O27b5abMRzJsxpc9rqkdehRSZ47XGhzBlK6KkbohRjMA6P4mOFrst/5rVLH0kO2VApDmK9L24nM2/lEMuf9LyvirOk/nNyDKKBPoLHWLBxyJCe8QuVE9xDjQasDRkBJYeGndP9DCZ4xjX/Eru+6IAc3ognHbEqCraOJ4imbJ6EIVIglUdI234CcXgfkyLZkYpz80BA5j+1NFw9Bjz1LF5EDywCRGeqYNV1ZAZZhn7bVlWrHp7ZAOW8z4dK1uTxp+nbrZTHa9P/InLATGfYv3M/NUKeXQM8pDqSX9Ra+QVLPjUt3U885gEO0qFpT6MvONZpj7/LK5MYeRd+HAd/K+/NRPrgph0FbqPHOdDlPnSaPImP2l72rfNtnPsJ4cVSHuEC2eITdLE664PohE65DAQ930fcahGsgu9jjNmrkCW7nEtSmtNUodCu8kR4WEubOCeDd0DUTjRPLPiDkSHVVDvorlj0izz6xz28Toh40hiQlby4Ugnp5WEh89/luf/f1/Kvoa5CUdQ8t8prlWYpzZd9e4YyeKKjN3hwEBPYN0IuNdI8xarjSHJV1fk8AQsQYhzhKk4SEY8Xj/nv3pqIdV15dQennf8SgLZSzWHBox60Rwap2Xyy4nVw4CXNw93YpYAYZaxfroOeYDtMsJLEnJhf9AV+LR2Q4oW92l8fh28hsA9DBjDQnuQr/kULddo3O3uE+P6Ob9lyI/6pPRvJjRkWtsZpZ1rXzstFVrGEKRgWjooO3qgUqYHMwc7vGone2QAu+7GSuS5FzBFSPxrFJSytH+6eKlu6gCbxngebwmUyZbtB5hekgLqhIV6ep86bNn0OGptUH5C4tl61V2rl42F4Qwk9yQT5U5L/8VSgnEISSGn4mj4SyM30YAtYCp8PCNitIcc9WLKLH+QDVLR5/NRxJetnhGZefpmNCoGBD8BN5qAyF9IOKv0Zi5cSWqII+k9Jk0Assfjmiwb542JpqSOg6U9mogaq66AS/KveE6H4suKArpltyZgZvCPNbrf5xo6PYb2iUjsQ8LH3KxJTXSwhTxNOsgIs9HUkNYTzgXu0W+SisZKyMDwzvM7X6843+LrHl+v+99v/e+3/vs1vm74+82fg0/CBt/gBr/CGuSOhi7sxDX03vX9xh/v+usnPn5g/w781drPp+f3l1e+vl1P24fzHbpJQTjEiDaAUoJ1ZGNeZlsirMpd5W+LmRzMJVADm8zZnrw9uW1u28k3d/dG72CK+a7eb/uuCNC9NbaG1prZyW3L49k8LdGdSLDufBlGSjQiI68RcaD/parvyjgZlx52Gb0rGStwuheFsIQV3zaWlUdtz2G+Z/ifFY0t6VpCayOSSlasoZh/s6Y2kBmJT3uhZjU6Iobm7JQYsgyiRjBCEeoxMaqAPIURWTMezFUbDzERQdLsdx8jLDIsy5AU8oGyDQayeyATB50X6UJegwkC+xx/kaKyt5ZeOUHSA2wZCK7vJhIX1fQwuY1j1jvqaLsdSfYY07I/VtDubKCIMHMRmQigGQoGn6E0n9+N7BIMerIPZVkCHRxwKRKmqAR25vtL9jS7vcTR+51wHqbvnQRB0CcDrpovjifCmMYE7udqVS+lGL1KpWQDxmMYpZJRLlg2BjZjHD5ARtaG2Tqw+BK6mNro8FGAEQ3Nq09TnqgQpS3BmAz43BMLGfIEH79LMVL7dyZytR9VwjAdp5O2J9+ebu2MdlZhDD+A6f/JzDSgYuSCHZAgUyB0OAC3qLSSMVkhGkLRuwRQPhILQQSrtqQyMIrY4xY92w97WBEBRVrLTOKHzIlnuda6BfK1kPwu+5vsEc7GketOEUgvbpj+qVRK52SX55jLDZYGzkDTwPrnakkqBARGDQBKgPPXpRtiKqsEx8/KzNzqedjVdYSMhWUK685GrFVJJssF4F0jJ4FYoSppamh0xVQWVnDIlJRlR7XQqMRy3SZVVIRUHYrSVUn7Lx+PxZlmBAsWHrPgpYiJeu+klZzn/py3QAEvVXJcIWZbC3MHXjuv6TXnaW4cVsJsIhRxpP5SY0SpTI0sApcQEwBLh7sv0KzUglOwDys3qxXIRKvlfh2C9PiaWzx/PpKGORPCPKowp7Q0RoFK8o4cIZLM9LVx9XRg1kHPVZt7fkzW/StWa27edf25Am8kD8WneYR/+u7D8wtdsqMxR5WM5ekSEZBlVZ/AZDIZq2VMM/vYMgOut/pwWrIQ0xmdUhtjhefMVMO/JXA/XjsrLpJMIJ0RkQG5qjDuUqZOff3udO+yKgBkNjUY1SYckfIGGuVptCTzXQyPf2aUMnqXPbXyQUdILD2Mngj79e4ZBo5sIp21Kiyw1eGBUqP2BXeDX6K3mOErq4XD4V7WhimeJiFgDsJc5qANFqC1SIUdaulM3gcVxs81CZl4NBA1Las30qfu1WGDag5Pw3PvUETIWnOnbwlB0hBbEGYN4po0rAAXIogrEs3dZA04EefAdtPrX/HlI7783J/2/ctNv5H/ge1vtK/vOsku4RuaW8HoCShhrdYZ1x0/d/68xve/9PMPvP+J/U/gR9ven5+vr2/76yuezlfTFYroHRBhotNcPYc8WqgWvMXHfo0h/LWdI12yYovfgJNh83axdrF2bu1k7dRac3erhrUprui9K7w1uvu2WWvNbDM2s6x/w3Tap9g87O5p/WsGslKuUpZsgH+WNV12Ig9E59E8a/zMO3Hl1I/Djglay3N47BBgIeId+mpGS+41wHDUo3h7qF41FRHCCMuxKyubR2kc79MdQnjtooMxZgVJpwBPkVt/+Pw6xD4iqj7MSFeRBzB9wbE1akuOmScUUcdF2tOoMs58dLMAjc7ldhGVYS7ba5LdDPWYezafKPE86y5ef9AwoDnAhMcyZPzx02PO02SuVi5jhMxIWbomGccY9+LnW8/r1MVx6OQRJtEDAdE6hrtL1Q/TODvEZghikPPY5bocdc2pcctktHF6pcEdg/dwRB+HKTyfRfdn6HzzyECMOq5V2Y7303YUMxYkDP6QvFSStkJR5whDiL3WyRvaCX6ibYgumJKYuXBH9wWgwILyYBqgEz4+fx7mF515MY+eiOIjJlrhBjNmrqD3MPfoLdwCJuMua9XeECGaZ5uLmBv7MADmHixQ6xxhFig6gU97cEQZpBLdlJw0RjNtE7zTewN5+yn8vK7dHBL+7Wsc0Kn0ymU8rLYC5yRGqLy2MoFn6Pr+37tdRqrvZdM8jAr3Jun4IRXjDIrXx/gY2B3fUvp2MSdwLsEvgtG/es2rluQcnGzZw4A+MmySSqLVgTQ+OIqt+1yHIXiPM18P+2kGEvqVv/2yBmD+lQlY1uOy5mcmq9qqizAn8f74W7XEcZd/6zYQwMo2Nq8mqTRRDKYc2BBKA0H1nM11JOVNg0x2sCS8hK0dsA9VqwxQJDpjdAFfLrYOVKnfeHAE538U1acYA2czXbS+a5ASwKc31SuyRrN2cMNLEBWsnghMDG9mFaeRf3cy1bGY744WwjbaDqgK/pQWgMqI4TjLwxDJTFwOw+g9L2bMtVDY6jF4TjwsH17FOaOaa4BGS2AJseFYlTJT09FPpSoY4CNirSzUU3bcYMJ6yu4feRJAPdmg3bexJiM2dghWFXJxyZI/nDQYFmfGFueu5vTCP+mR/IolR2bCtOY+UzohczmWe9GWVUOFXjRCVfcWBpc98/CShkmgVBfm3mAt2y0bW0b9073OmeJIHPfiBGbAb+YdHjp3PElPEecep/f++4/9//Pef9tju/EMe0F7se2V/tT3NLlhjbRGtqR2Tbg4986PK35+4McPvv/R3/+J239C/7T21+np/fmtv33B0/nD8NMAyKPioBIyIZZUpzu4j5yYY1IE1BGRRjYyEic4rRGb2Rk8Sxvahe3ctiffzu5ubMxkdjUY6GWmiqS7bWZVxpfgEKzhn+pWPoWqQndAcmKNjy1CNYIFQ5zGn6wKgcREmY/lHlDGYdxHgEai8YhYPwjqIn5F0UxSsXS+tEfZnmPLPR+K2AUEtc84gtDVd8viCqH6iJQWOWLYQi9Mi1QfQ4wuIwmFWI+uyj/MYcyA+pheoRDeO8JgFgDhMyNSfVo098c9N1/qrhi9DglakwlwDV43Q6u6pKQxVXT1UDDbWNt2bLGK6UqJzeyBvhtgosNQYIws5d8zrmiFq0wrylA1hlkeoSEzw87PhFKF7hajoWafXdmTuzT80BjAcRQscbg7bVAXengzJ/y+Tmy57ypL6ozcIpHLUofZGvw6fBsNL4Pj8atV0Nijmh8/RsiYYY4p7ePKq79Rvat/KfZzBoC5aHnWOwMj/ZS2VTlmY2ih5EILEIG+o98QnSTMaSe0M9q533baDcmXBUGhpOwurJ2Ig5A3d+70e2enHZI0RPRQbmdLEs4IZXltinHWzOSAs9qhYTtRvWOjbio/eHqIFCQDepH235v+49dY4vpzPDB6V3VNTRLEqcByPQ+vBqMZrFEH1Lf6zB/fmTkBABm3KytiCPQqXbWaq+2e+bEADjEAkPn8NITUc3eL9AgVICKXpQTsEIu7G6kEk0M4MMQlB5DVmXY3RlRge1wnfajYJ7TvgHlLvblF3N80u7j+yk5AAclGaVVdaPlMpgrLWszQ0AqZA+YJ9GtzoAJSrHqhnsGndadYRh6BqZjG2OcRw6QGmX9CaUThMwFUjXPuUzuU1PL4WlTNvMl6bww1UQbr/9axnHNZ5yOJij8u3cvm4XeUTpG46xR8Z/wNqV/DS0VDBh6PNJXgGNfj/KvgQ1NXzi68TgOKSKYr8QMcxl0d+Ucdg5QbLxiVQhOBjp5axY5Icy1twYTupmxRjRW5phVZ5VpcUnfv2SesF7qACvVqnWAsMofSErVXo1pZFBAlbRoiNWuOMFtdgLQumtGSnpVWjgigzGPXpBlYxWGhbNi8o9zOma3rWgJaHFGouYvGEdjBBgTg5GFgDVUwFc3xROMiB1Jo/LrGkKS5q2UKVvcfPG5IDR8IAMUFuwekIggHu6IIgBekbJ2CWhZoHc98ivEqdARJ95PbJmtum+ABUziG2YSgkx0CrEOhFlCH7WrdTrsuH/F86897vFz3597P1/23W/y/b/wb7Aw/YTvBT2EbSGwOszL96VBjWCSyrgdvV3282/uf+PgjPv6p/R/Y/xdO/71dvl+er8+v8fIc2+kD8WF0YSNuWfURxbInszB0oWdAFxgO5dIrTYU9I8xJg7txE07kyXnydt5Oz9v57NvJtxPcxNHmOtC7ootwc2/1UmuNh4JL8cvBzDdz0+UhZ0LHIjnrkkwT/OFgvhe/bGB0RLPy7VESFyThCxvPYvxNRUTOyuSjomn96zq2eYalwPeeCaEwSOhUhDpiqKw07JgJgTyhRfCIkAGmgLqyTPh4TPXe1000lOpdFOfh55zV6EEGolVq40BXpumUTkJfnl1z81YRMIyUHTPQkL5ExUCHpzFevuD419Na65WX0ea/Ez+9amNY5iAelczjx5ZLTQhZ7z2bcmBYP+PozdBxUvM8Du9R79Xvj8cSHuzsTybjskZShbotS2swYiLL2TeMw1/doixEkHRk+0Aun5iIryGNKujU54hygioGXvF+6nC/UuPNAd0YEeVDl+ZBnK00evTeISE6oyM57oIBozXzU2wnxg1xMwmFnUOVkhft6d0WW40CHQgtZeWHgb1LkFEcyI49Cg34sE8zu96IE9ShG9DYHUDIlIUXnsgWW8IS6ysvNWP/60Ij4JbA3Dg+MEVIVq7vjBTfyzCAUcY/ItZj3yxrdncKz9fDZVZ5Wx9/+bUi4lFnQmR0vPfBVD2/UrYBH66Wn9IySfzkAHyet3XG1vX9PM+rflDZnAkCJxJEsTgn9zqEdyK9aJ7Vlc25fpgljtoO8njSdZzr5x9ycVhuMAdjzF/Lah0sBVw3Yo25iE9W1PwvZnJ96vs356ThYWJ/ocGmTKKiKmOT3X2eZGMDOaa+hpSO9aDRZGnOWW1cPgMzQJNoy7mJM3uSt0mvfUUTHiWnh39U38LAuebH0jeeB16y+yaf1G0sp0iZW0dPXC3TybSiqEjpnytJHkZAasw9lVGGoiqCUNGIxzVIDS5W0hvBdGQT7BvVH652U98lZeZWvcSjhKlKtw8rZN2EyvpDBI2gdRQTNYY3omAEnJWvGWNTYgyOQ4Uu7NQGiPDZnGsRqMPilzSQILlqWaeAiYxcD5UhtcWs8yBMpTox8zT/9jWfeD7GEAwYWxn9d3dk/a/kZB7t84pWD1vTycHzvjoA66Yc+nd4HqSbN3N398X4mkVDtaUJz1ZZFAHv4h7bjqddz+/x8n57ed+/3uLr3t8Cbz2eyDezl/Az2gX+BDvBNtBgW2KXgslbDSDhalCP/WPH+4/+/i++/5c+/heu/wn/z/PT++uXj6eX6+ly9dOH8Qrs2hvVDC7cOncgkh8EZqG9oiUCswfOAifgfLkZDWw02zMrYA6e2un5dH727dy8MP01+YNLz6xt29Z8O22n1myzcFrcGYEAYILZaJyRSgAYYEqg6uMHFnaKR4UADksrpe7zSRLaQ3c4xCxWMj3K4Kru63Fm7ep9PGd+ft6dGLEMZl3pKEeOSLzecYvc5pmQUleGwBVMwGnpt9E0YDiXllXD45FA6B4fP8+w6soEGCt+ORV+751+OPZmSYHc8ueu6agTLFbvGbDovTPNGiNpyWs+B8DqYU1in4ZJHd4G8zn5Ng7RnP2Ccc9LpZLg0C0xGBLnnGsEw3j8yxpAkv0uB7aZDYxZ9N7npjazhwN4nJq/MEWmGlwmMhOkXOd/ft6S5mN8dvVwHi6rcZZzcQAOzT9YgR4EbzCPIUnhxyk/mZqzoKGMiZKX+wzAGkd8eN6H56/BHMljouIF2Q4jlW6edFk70qmI6FCgh0LUrt7Vb713iUGDNfMG3xCb1BkgOocAIUn87gZhQLV4vkXul56C4eYOC9vNELOkOTWcZKMBy70xTWYtyGLxzBXkIJzJX4ct+IAsfQRQrWPtvUed4pzkNkSS/GkGuGb9jKRsmjTXQsOPm/rtzi/9P3MA5mciZtnSqGCswsydB94wtY1lnZiK1mSkEbDisu5ksWQjLN3nuVMehjEnkGR2lJ+SpsUZeNByY+PXA07UX9neC9NgzYYOw2y8m21DMhBQjqWUjB7Zv3Yqw/JncGyBET496mQiMcTZYnadZHLAN4bLISkzWFYFCZaVU0g0jZHZ52nwQgEzkpKh5APqhvsO7otU/JsZ/oUgjM5zq7OK+fgCEtpdjpNGDRjJ1pqvXMqB9SwjKh0TQy1jGkL5xijSALImGMwfSm8gaBSNUodcSPqDLiUhV1IEpLlJdcGyF2bS9xnytBhtF5hdaafQO0lzSDalOc+otGKwbHUyj0ufnTKn0mTJ9GN6d07ueDiqOGO61C2d7J6gunFsABmRyqvwABhizHhpwDy+G01zp2eVUsby72gDMlqR6UhICoYprdBkzQEqI5GClb1FEw/SyaBBS/xeqEqAOfLhwPmQs+w3ZONYCMncKzQ4rerIqGUq9wORmQguJjZiGGM9xWRaVAUw4/F0Eagz0dbAyXRpAmlGJvmaiktx1uBkmRqzNhUhVk91BIGgaFBk9IVS8eFKGSG1HvAOA7fml+AFaD35ItiBVr67+Q4TtsClh+9o1zhfcbrqacfzx375GU/vt9drf+v6BvtKvKE9MRzcaCfxBJxhJ/gpyWZqN45UEpNZbA/cdnx84OMvvP+3Pv6B6/+N/f/yl4/n54+Xt+vpad9Ot0GuqL1fLevFa5uw6FURWU6QSidrHJUosrSpajub4GEbbZNtES1ElzWe3J5P/rrZubk7zUFn5TVJd9+CMrXmW9t8YmVN2bWqZ8xDI4c8TfksNgt1iULn2KHrsbHuxPX1+WPHm3cR1voTK550F/6sgqIKhqx3G+oICKItA5E0OsvaCO33QixIFsWbPjV9tg4coKCQQuhp9hiSz7RDMqxPZKSKTZ81mKSiKxBRqpIFRYllQ+V+7IoNG9L09818M3e6MUmSJ21chDkAM1TV81BgGetJY9sz76bcXFVkSY6SqHVRHlZtTsM0Yeb5Mj5wsN/cXUeEx9F39v6CtRZlRVl+fHw7IpKU1/LKC5rcVojFg/BomhsSWGXZRSeBZHW4ey2H6y8mgSTvC+I0TZ/alT4gl2bZj7ISVeuQ8t/UOSMBxRmzqMYl+VdkTCrVNWDMkt4YO9yRANLsGFXsQ2DK8VEwMGYGobGDwSMKJqBSx8m5RVoVrHfFTf3a+y36TXtnr/WFmzoFRCYhgcTpJ7htnTqxA9zamSbu7Lxlaw4DvdGkphZuvfc9MlcuM/NQT6SVeu+KYGsn9yTdiohQD/VInWcBhrIPe7DwMEomwhIPAzrpUs8Zzr4HWrzN3JJ73+HWFk4b5na7W/H8Nxjo0IzWDWEoxV9TXgHTedItkzP/C6TBoOmbLbfDwHZWz5uFMyBYCC7V/q9dGcW4uRCZAA+sOMMYyGYpZb4EgR4a4MLs/1RFhVa+0Ny8q+q+b4BVnzFLe+zo4pJ/X5yT1QE4hHH4EFF7ypSnSa5mgFDvMMZu1lDRutAobMF9C45c2TXev6om3O36x+PJmBm2Yy3udN1yKuW/PbkDVi+mpGitWFvv8qjqA0YrN2+kOpfx0Ufnk4cXuQZMxzibCHOrthrSLNWqm+3Fc1yGPjG6qxjckKFockAyZ5AnNZhg3lEcnUiEtjGxuUn+lJ3QTRDpZCDgrG5eaZwbuuraUkS/9X6jpt/G2y0yVDYixdXjbzSOkeVNhYgOdPfTmIdydVIi9n3u5GGZoaJ85jDMwl8jNqOr35hnNNQHeJao41LjNGWls037DgoOs2xCbJKiy70rgtlPoKJ0YPFOVs1R7kNKQl/cFTGPaZJOQWQm/E3R+36N3hE31w261bJkO7M8NiLt/nWP9TRdyDrwKwqG3JI76axOSZZ7JiRUt7/KxjI5N5hwrK4ehpkmEsjsSwU5FL0LTGMd9OaW3DvKBGuGEiYvBBLAUooyonfFlXFjdEVX7IbovIV1naRde+zW1cwssl41mM18q+t0ljyjnbIqlrQnti87n4kn0mny4ov6UPZiIzvaB59uet75svNt57ef/eVnP/+8nW443XiWP8ufgefQE3SGzuEvxAl0o4kuAbUihB+ZHBMiOm/hV8XPH/rxHT+/4+Nf+PF/I/6T21+vzx/PT9fnSz8/3XzTrj26ke1kH6ZrABKxO4/ENMFWXUmzVDtAJuFzFcwRDXaCP4ddaL7DaQ18Ut8MLyf//eTfXre3LfzZvVkQsTV2mei2nU4SZFk5nI53enFeBSAiM7cAIOBH5UA6PYFAyDJsUgonzTgQYIPQUXz/MYN01ViKISmpSENZiGBmoDN6ATBaczMmJniU5QCDkKPkemrtPBCTYngEHvIPlDVSe3BE1KLfet+lblSxEidcIiI9Gkhb84jofQ9F2mYCInajNXRAe+xSFsBbBPrehWzePU4LUdHBMCQnSWb6RMUIOxW3TertbPIsgXJxI13MuhpDEWH0rt5jB9Dopoi9k6HYI3ZA9AYzmFszWAOSlDcmnU2EksMrbU4ELXsSR1Ix1XyyuEECKObsQozA3DeSvSthspJ6l4FuXvFLjpDSRPRxFFmmAWRmvlUehtFai973NCvp1XtBskNzIkt7Ss+NPi1I6zvxkdn9KrqNoDekiN4j3DJrNoK3yIB4cZIM7gHmeZfUbUmMCUW2qaIlWtwgOsmcKEkRZmOGipoku+KUjTPCbzDSCtIdkvVBe4FehhPd1PekBrcKnmbkTKQ7Rv0/VIhewt1tkJwk44ohQwO98OemisLCQOQMM4Ag+q5+xX6LuNIQ1qHdIlwR4NmbttN1/xHNsvuDQgajgOieSm+UlZJKPj+oGwaTw+anrdBc7t77LSKKMs/Izg517M0ye5Xmganve/SI6Ire1aOrSKZB9RaxB63nOxV06aLJekqyOegwi6x1yLxp1guqzCXYQElHH+oIlIkanZLTHNxpDWZG79E5iEmAUVBY8YdsaD1SXpY1SEvDrDJJDYUJLEc6mAy/GY9MgytKfZZDQhKRh2SEKbnSMyCzaxLXZJZvWoX5RNW8GFVmyVLOaemBQBZbug+YRZmTqt5InyIC5ZQooAm9r3I1iRTMQZuxWsBSOaVNN63qCiWlI5Fy36cvC3NWBVHMAlnAs2lGZnujMrMoCyJCRrozoYeVqZEZmMjriCLgUij7fvTcWg6jRYBRDSgyBFQaqyt6z74xWfSbta/5wGYtNXfmvoFKY/SIyZxRGiYrRZMGb/oRksRQN3NQyofXcpwBEyJxnKoq1Nk00ljHB1oOOhvKafiPBJrZzM/SQeYZnCAnL4hoddfj8AtK8Zcn6fl2NuyqOCCrAIhVApjFzxW/ldGisBwAivLVxqBm2VwVe9Zm+owexxTB8ueAKovUXQx7CkNKRJ6QWMOKAJyRHWqVOQQzZoLCBUh7jFD6wwASNBKhyl6UPq8wADCqKTKOnn8eB0zdvbKvg8OCYqlk7+jpNWVWeHy+J/47u4wVZCNinqxzjBmkOJ7xGPNgkyWI6DCWV836egaTkOHbDAIxXVoNUqsKAUdQ8ILIJUlZCB2FzHmAwJKhaUPc+a9y1mBt+XS5KwICQfVAD+2AyOZQoAt7zS8DVFjSBiogVmMTALrd0uTY3QZ+gEqIaVbphp93nbpd9r5d8by3r+/761VPe//yEb997G8/b+f3fgp/EhuwISP92IhNOAOXyBMcsorkpoYaE5sxshBvndfd3oM//9p//Dfe/4n3fyD+gP94On+8PO1P5/2yRfNIN634V5CN6nJXNUhLSIkjTjDmkiBdTHCeAal5T8AWbCGjNaIZL+aXk72d+HLittHc0DLaQHl6pmlYAyQ92YPkrCc82r5MedNIOkuzn8YRYvz80giq4D4SM/bsPC3GHp/RZQNj8hrepfWUuSVAzNMi7DHQa5mQdFZmcgahSCaabowkScmztQoNIYx4uSwS+oIsAZJlXljGbLmoTgQrIruU4igpK8bpnzp8qWCuIF9x/HAObh636SF4uUk+Qz4VzhjT6JgqmaEuzYNhvrxmg/lv8oNlNiIGzfHxlbU6ttzPqm/MbKBilD1IynS5sYER2OdamyrzCHViA1GPwImnrxbhUTrKWMHOCmcOGGGqkeNQGLJUNSdz8OOvmcMMkH0N95a1FfePxgSzz0j2sXz3Ipdaa07R/LpJfcm5a0jXNHTGqMblatk6SXwqAslwbwYEq4dgcnqlMQoIncUIByBRtZ4W7ZyEKSTADCPX/5UCm7ZqOgxxY79pv6F/RL929ORat7TN3EgL5jkbYvRCZ8agaFSy6TwcPdndjGlHFKLByuEokyXPHslgEe5Wch0V8xdvNTMK5VEplc4NUTBFos+sqkwSD5kV1aoGA5m2VxUTc+79XKA+eHHrnKuVzcYE5JH/idgB12OPB6BiDShi07JelkjEpxgzK6+bIYAY3nc5CBHhJIhM3LDu3mctViou5OYxaK84L0YwZXxMtZWKhUMAxSKMSJqUKmAaYgfRNLFnIBBFNv1Y38IhbLpXVrwPwz+87k8QpQZKtXVfjh8SrPlwKR1lVQMVI8kjkIUtgKQCIDFjmAOGgbHvpqrksk3WxxlS8fiY+d//zeNoOI4jUaQHHT4vVbJ8pxYyF4uhehNvWUmh+ZnjYB3jNDtyLMvMQ5MFaD7wfEVNp5ul2AXLaQYQZKtdcaxTip9jfNSOg3OGmY+oTLaDL5bMSpQYwJHSmLi0efYh4+/F7FnYoPyyhrJbpSmDRmm7zsnlYV5LqADjZyshP2plCRcY5u7FNcEdSgVS+fGocYQyZiZJNJMG/n+IKoBezGgZWxjwDWCdW+koWe+SWZiQCIKcoVnbsSYfkmfBBmbr8wPeSeTxYHPaj4j+nDHGDnoAEhSzYnusV1627JABm8aBPaiqOIIIMtYKz1Bw77TSiWL2rfLAhhgTUptHhj07A4qW7azS/qWs7U+Krce1i+L1Zh3Yg/usyi8GVTWDm/bGqxPG5kbnuxTSzx10azvPO59v+PKh397j7T1ebvES1+frftn7895fenzb8Rr9yXRSdynJQzfiBJ2gjebALiYbCIYjWMdQzVeHxY5b1/Wm9w+8X+PnH/j4Jz7+if4v8M/T5fb0gte30/lJ22k3gxTCzrgxrqrDT8fqj0hOQeGIwu/SBYgNWVANA5u4kU1skBONaISbtdZOWzufTpfW2skrY4Bh1ZlZkUGSzCICZnp41Ep8Erk4qkaP9C4XZfRpcxWO7uFPQ1wPBc35ncXSmm+sMj9EmuO9+X6Jd56pMxQCIUthUDGKSGxPZqWyO8hMuAMF9UmGwUoIqEOqOEd9IW/0CEoRI8P8EYpMI1Swg4cyvHuc44FXgPCcFqtqxQwLDg2cAcLl7OpJWzqGYWaED9d0xnKA1PwkIgYInOMbs3SPI0i54FzNhGDPeH/C7yg6G9DB/aBF6pSI0dVSblbpLBgQvcfs5ziWmLNwQ3cOAIAh+ouu++WxPPdLzts91+fxjVWuMm6Kewfgl686pW1QCX9638zumkms63g/yActvW4Zflp9LHsiHzCXMZajsCRkXPq4fq5jNpBZTkZnET6Pub5pv0Xfb/2dgoVMKoYug+xIsygRvfM0AVhGxVE+cZihyxMJn/bIsWUxAhBpixNCQEtJCSWBxVK9TA6zt+WxEBURwN0wxuRMjQeSR/BuNUrqYi0tkJzRmL51h5mS236s0jqeVfN9VoNTaylhi+OorAqi6QApw9apgcepkrU3opIyZTgzo1dnRRc0YGB+N7yxKT4Nau6jLCycUvN58Ov7ykg/hE/29LDHsMR28LBfxoImAPhQ7Fi2xloHss5eLt9w5HIe0oXAbOwk9INFfZS8PryGQVPVqqV/DhP+8G0KfL48OwY5/VxxVnS3pmgeTHcexJHMmX87ZO9+hpf3/81CrJN5mFJAu1d5mJOY+5Zjj5CUZdOnPrpg322DVL531HJDN/9qPufNjhhJnWW58WKWn5e7LcX87BE1YZL91x9i2gT/ThxN0Ve0mfIxl48s853HWKElBdLkYNdw2ZMtOy0AaVc+a9U0Fq9t5pweNv9cAFMlAsrmKPH2e1csrYled2UliILdaAmYlcIsXdw9TZDQrur9cXfr//2vD5tnaIFK6GtZS1Xvz0L+HV9iSPSkf0mU4EJvktM94i0ZmQmwqC8zEWVmyTIHgXRVbQ9U44jc68nFmeZkpmgC4TJEFowbUD1iOpNlBRXzkRhyGAXPtsmk2eZsoIf5LXxHY3v+0OtVXz/i9x/7//hx+/rz9mWPl7773s/qT4EX6S3wCl4gjxAiCdebsBEnclMEmhISTlplycaaQuYB7LK9x+3KHx/6+Bnf/8D1T/R/gn9g+9P94/mlv77x5dnb2ZxQdGE3dGknQv0WKhpZHe3EK9xSbTNJJK4FJnmmQAQ3bMBJaFCTndKBJ5vQGk+tnZq1Vm3RLOs82GuD2WiVNbdbHSx8FLmhDMbZNUMRw7H8t8rh04vDK/4cHTmwT8OMe1ACvxT48e/DfUwRE1E7/AGOh8hN0AFRvdKZKX8SekbnegGf6rtdVezQ5Tx61AMjbnJEdrlExSqj8rA9JUkMRPZIdOdhHqFA4NlYgFCw6yY6Eq6iwzLL10zL2HhxFPcvH7O1HcEvy17HGeaHnVZVcx6Jv5pLxsX6NE048uxTPUrJjkUfhWPjuhwOgAYCkodlRj4u/XyEedn5AQ5v8AEPPcXDrEqA5t0frrt+/tNsjIMkAf/LZedazyWdx1it8H2buVhISNenW3cffnX6a3g46/w8XkfH+IfhZUWPMP6Q9/EBIhXZI/b9GvuN6uhEwKJTN6Kb5AbRkpA4TYk86XqK5+qog1wsby7WyTraRfCITFSYtfruwBzP7ZlZHcHMnMlFmi1bqlNVUniWG230uTScJmkpLVRhIWmM0QWqJvZ+H3H0r52uow0Tey7x/O7odDshGUMSlp4n08pHmcjHm3czNnqhYJnY3vdDiqbGqGaXh7Qus11VIapgWh39GME7YMKrS2byAnfCbEQcjjEX01bTaLuXUR7VgzzeO0qE717kXJ/jFpzG6uqlH/JzKFWOI4ezsnRo6U+zcbzPsn5iHadGCOZhjHM/4n5F5pTX2aQU0Ux1HTmuO4cQJNna0aXvkIFfRc3mI6/bZ9kRd7prjqpl8ryOkJosZ1VV5yaauEwNg5trvP/+9n0cYIqiQ8pDNB2fvHeGKrOWqPwXYnjhkZZu6WVaIssseicnI2malowMmxVRmkbNc4EyAVSByuAMNSW2bNYM5KHeIwLVpGBM/kMe5z4JEBk04fBWScAYPZHW6MnvkpFu0WCgeoEvWb36kPYzCyXbMilJm2kd8ugX1meL01qKqsrPoGsF7JS0v0P6HvfKvxGX+W/+UBO5GFhih7yCMkfpGAfpQfUPTqMTkSirI7tXiht9Apw08WYDfqCI4fgJmEAywnP1ps+WMJ4QbhFX6QZcpVumYEAF4qYevEbswd4r9A0ErWKPCefvrnA4ET2wN7j7jlPY640v1/Z0xaXj9aO/vvffbvH7++1//Pj4etvfAi+BJtsiztKT4tLVEA1ZJEKADjhGo58Ullqz0bQN1ZnCPMgI20PX3d5v8fMH3v/C+z9x+wfiH8A/mv/5dPn59havX3i6iCbhpt6hG7kbQ7GjPJ4SjinY1XSj4h3CaGUQ8tw+xhbYqE10ogkOOugKBxqxGbdMBZgVpT0Wo2TQDi5ndoLFoVXX5M8REQvvRA12/DiPxk8nwfx52Yz2mF+ujw2WSgxtUyCEX0d+F2l/vNRdz6ljFdNQLmBPz7a3gSDNCUPSHyUmuRukLkDqUXW2IkcbkH83ntxBZPZaTkP2iOJzRO4p7VWLIMzKZMYAoR4av/dqAo0qIejjAVsN5Jh2I93YCJtheGYGsYoOC3GR3Z3EXuBgy/jvLKvKQwKhnrkODAd9HrY+4kRmtltkX6uAKKtoz9Co1euQBAZxzCIkBjNiH6H0+UWSpGsaMTrSp0mMPGVmnibSiNrandzi3gbFJ0N/ERs+/LCOZz18pSSEnibOowyODXx30zr1l8f8fLs5PC2RW6k0s4bNIvQ8LUhytGzE3IZBMJLsnNP+X7YRSVpJe/Sb+q3vN+zduhpE7Ra3wN7IMJg1VYOqmtE5J8dsSFkczDrbHt0zjC0weD+dxt6zXweam7JWomfERxIMDAuTualRzaNqV/Q45aKXwZYzNE52ISNfWbc22BsTwDVXSsMXoaK6oRWCgSQRoGUEMY08lV3z2R8AMIg6Pp3I+fOETybpDQYAgaRCfXVfxxyuejW/W1tBNlTNzNLcabwpMxh+jiltrOJrOaS0NO0wSz69jpXOTy5mfY3ws/wnYD8Ks71OFBZLGstGMDNU0fwdvbukzNZWokgoOsnCllW4KhFURR5ZDsmMyIyZKeDhvfdC9jzfEZzI++Wp5/ynGmDBV1K0EtFUkncs31x9u5vWFITpzYeOpNIQ18MtWUVoWdO7wETers2fePggiyLNEoRUAiFZEgWXM6XFEXm47nxvKqN5/fzvZ006r6asYh7N0NP3HKx0BeFX1hEZBa0Z7XVI65NjTtCnVax1+jSY/KL50BrZcLwA+bls2QRndrwHFJYUM7IJhcjCvTGMuxlTsl+5gZYxiTTCSjvPzQYQWflXOVZkq1EyYa2mhBKljdaJqLSoafIvzoNzvfsvF2KdljF1nWhzVsajSOKc0CwMSL1UxJNpAUX0uEmy0RLHhlAPm0IJ/RwSni+T6LKda6q91wNKETsTh60CcOTsd+uKHux1NZrtnniFzMyxqiHUIdL27by3F/m3bt+u+u0Dr9f48oGX2+3l4/a69689/r7ffvu4vcbtVXzpjYEGbsBGnICMLmkQbKaVv4MbsJNFXs0J9hSzfMtAgt6l6473D2Xh7/u/cP0vxD+gf/jpj8vlr5eXj+dXf341tht0i+jRd4dgAeyGciJrpQaUbgA6y48lRiyHTvhganVyExp4Dji5EQWOAp1056mxVVT43qwxs6Pg65CTX2ucCvEu8bn5gWps/0kI08jQdBTvJRb3bxaY3UYqEDaoax4/edyXj/rx/pVpzH0JwKUDEEBPBD+y5h5h45wwUIieje4Rga4eBWzJMSbjS573BX2ctUzHjTjs49SVD5OWaE4nq8Fy1nWN7IeDIRjF6LkfAkEXAbN2i8D03HLfLdnfeXxq+BtjZDYT3/dg0+MAlkZEbVpZlYUT0DUUP8Y40/ZN0ZLSIn1cpvxhNK3LB092iznow2pZZszS9QUTvBiHR3pvWk1hOGZjvBaZsT2i2bEW8yyL+DUEaM7Jwy1wwCDLARhB/SMqvCYoHkR01d7rIHPOf3nq8eHX++0gHRn79QMAin5v6VYhJc6+M4LSQuKtfrvq9h7XG3uHuaObdqcCYZWeagJj71kD4NlO8H7LzzTUsECOaVxhXcckp1yqoN42q+CAGdO1ciiCpmxy/umQHxPLau2jClUAI+pv4zO99/Xb08JZVqfQVvlGfSyC9GntjVvW9ecVYvQtAZbWfcu9PqvH+btKw1YZz1zQsc1RM5UsLvW/z/ZPfrhyNYAy4lnFjxWrTZTtncU+dszneV0+MG6RpdX3f44ZvJqf/3yRqQMZkhXkcn6y9j5+PY4D4VIpqGzvWDXJLDNL1TmTzCKdjDfoICCZ/9o0Uji+kWI7Gm4e3SHmF2vwdqdbgEMlAFFaa0nWAY/6at34a8by4Sib8/Dw3ani1g+3VamlgabE0tA1PLbR/xpgH5CP7LI+ZmLxRQBkRdIU0zTxiLvq5lXRy9ZitagyJhx0wYqg2/JgEKrhVYV45yeB4snKIetQcCjrmxl7H4eCRkB01Y/pwTstmWsHLuyTaxW593ookkKOlCE641C4ubXzF5JQuRK1Xb0l7ZIIwmCWNn6dYQYhmG19D3K3yl1q5AhHgCbKs02QTYzVuLchSkSW4sJVLiXxKNgKkllCroIeBWTHUTqmvurZa3EghfFOEHNlq6RdhfiLLKSPPTt2Q1LhAspMCkZw1+CjyPqptN4tJyQLAWpiCeAWCCGpaFytJksy7GmWBNEJOUjt1nb/j93/3tu3K35/73/70b9+xLdbfNnjZd+f0N+cX7G/7tdT7E/0U0SHZWyy1YntGVvoSvcCN1gTO9mqUV01v8keOzmV2fEIkYyf7z/180+8/4Gf/w38N/AP3/58ff54edPLqy4vezsztEP7qDtLRYXou9A5LYBEKZaQH8p2KJVs2Z3UUUY0sCm7ZnCDXG6WhEzwzbZmvvkpeYVslPSM7b7miKFRamyZBRivufSZAGBVGA5JS86KKZCfXouuurODZ1C6FJelTZEFbWRB6JLTgXe48CUFz/uNfLzKGBVKr067YhiR6kVoMvNXsOSProkxWWYs0y1PDy37rNCkoGV3XR4u0x1ddBJTYJgfZX8AM9LGqVswLKHk7OyA1UFSLS2DZvLB8os91m2eLrfl+JlN00ntiCjeoZgkZuwgVHRC5U1Dlg3CSJo1ls+PoV2T1ZeM7MhuZi0niJaEMchuM1UzlXQR8wRFasHUjSzGkWX8BsVoMrWK0GdreL6GysrP25C+JbmfCk0a6PIuJMXI3VkOQJkb/4RT/3zruvhiLGqqxDlT4+f1WJw/zM/PI3UdyZ0af1hcaTVSU6KVp3yKBgXACt7p97NnQCc5QCmVqrU8zwlzuHvHvkfv+wf7bjB3CLtiZ/J40sxPYAQ7ujDYO3LAFVlYcmLzwFongclklAGcgr9rOzVJimzLKDcSFs69Tl6ZerK+UaDkI5tGVdQkSkced+8LHlgZmxunlQaRa2UqKoFDoPIAURn+NDP6elJnnnRMaf4OQ8MxHfnI04GpB7clfmzGnu3QhjwdAjNOc4zwaESYOclgAbnzWKAxraWHNnR5j1UbkmSq88WTHJo/gGq5m4rLSgLvPrxcqtQC752HgShKe2I+uyp2M88XHiolc0k4EBw5r4muKwD44Wflqo2iyowWA1k/mSemhtFPqTDHC59zjOMaOByJ3Dt1jGOo7Tx3MHB8q+hKFQzlLCyZEl7B8SF0syfRolXu9QuOZxZAmNVZNVXYlDUlBHpYwLPg52HdD6wCOczK+08gYziqCvE8OmM07kmFvj7SnPtxifrnULIIANu25eTNGE8tQ3ldK1I/AtrSIVkCI1O3TZ11nO6LFl6fmepE9exKjNOc0PXzJMzMrZHscRtvpndkkYjYagugvivGzswLOTxm5CnS/ssDNcnC8voleZW/tvxQwjZ8eM1h8syoW9E7TOKtirRHEDQTzTiK92c34pDuojirUK5HyOfX2Op3bw5VuB+F1Egmcav9j7JFc7/XFmIhoUMFY43y7IIJX+ndcAtzwBA2ikkFtuQkiIMJClD67lXuxPq/KTqS3SbNIsllVLckVBV3taDdxG6UeZiH+Qdff+z/86b/GfFtx2/v/W/v/duOb4oviFfcztCz/MX6ud+ovkEN7HBlpRukQUXWA8r2hWkjwRTooCPbe41dVSUNGXKIjn3H7QO3H7r9iesfuP0D9g+2P54v1y9f48tXPz1ZO33Qgd4FwWQwgxmY2ZWBIFwFPrVthvlJMjQVg5FeAmYUPYP9AkE3GGGgE25WPoDnKX6X3CTLGxyKO0+po0jwELmH1ypLuQf9Uw3SvNF6nfmDlZ4/Ppa8plnoaEOJ4ZNTMcUeuBvJw2ceBf5wAAAEoo+jt6dFJShhflnTQpYZ62AwORlnJQDSbhw3n7UQUhz5XI5Xuj1JJ7cO7JdPly8nNWgEGF2ReIkwypl51X+75ddrzsUa5bxgZro4SZCEsoiOoP747j6fA4SB3ZNm0cxsZgPmtyRfgjP/P9b+dEuSJFcSxkSg5hGRmVXVd76P2+E78P2fiZyZO921ZoabQvhDADV1j6i+cw5pXSfa0xczXaDYISjGB4Q4wu0ClvSdKc41PKO/uB9DK0XeYnOPbX029PTPiCrV8fQP60xGNcF7kNx/s3pPomd/ED/y0uaon972I39uTeXjIB9eeO6fqmL703eB9e9ntN0/pZk6A0lyjBFHnGDgHMrUpO4JQHfpVKv4USUUsBZQxWl9TxcXqftALYCpzcG5m1Vxnqe/8Xp7mbIDZAJIYowxACLPy48PSJipofiIjO58lgvd8sF+8zCK8C47ZMx53755fXmvgbSf3fiwlrubzrIvbGXh1Yn+WLm0vYzqbmFJqr06/3puXJqYVvV/0xg/uIrX4D+816feaUuPOtWn5IeLaXxOU6WhbR5uFY+4jmo/peyrfS59c0012SxTctspPt5KW54MkEvba2irev2QjBrEhjq9Br8o8OItJAPSnsjH7Zu7m7tmtK9hj3A2q8xPl25N8+nvJibQFstFh+xAbuYKdHzClyQdFKIJKLOWJNrrgBgRgYkz7xNCjGGnWmE8DwAJdEVL+TmyWblHcj0yLJ4HgFM29Bp2i7AlMeeMliu2smgPefmrpsbFqVM5qgFe8fdsaJrjMKL8uS+lMhKn+8cENBvzA8BwM0sOgFAoeccEMIiIglFzYQ0yEdS8uBjJzNSEZgIMdCpMZzfkLLvC7CwCY4xy/AMJDRho3U4KjDFyS+BniA7MIES6tKfkElPMcYSUOU9J7jLg3W0Tda/MfhA8T1QFADNh/YXh5IoGikpCaRujbg64sZ/q7AUrW5R0iMrwI7OYHTGVboQQ1eA+De0KYM5ptQWYNsAAzFM83rpbUXpjoDt0YtoAoNJ5kzKnHUjqnHMKMl7mFO56UXx5j9czvr7zy53f3vVy5vGun387/888/w/yZ+E/Ev9A/oLzJ+RX5CvzFfN2KpADugEHstocAJffhThrwzkAgQEOqFK5gMMQ8KWYQ3SjI6Xe3/XjT9z/yB//0vf/iff/BfwT/PXnn95//g99+XIft++3l5Mvep8/AFBMzNZgk1JE5HmSwhi9J2ZQHBESTkDuNySUuw1zcJiHZaZG5V9lZsThhOeX4/Zy3G7j+PLy+nK77bwj07D0IbgLYuliO79cesNOcosrrffXKX5idpb4Y0Rm+pQtdiapepEZUX1T9yNi9X4uS6Q8UpUhuACIRriD0s5SN444nRiTvEIeCeA87+ZKAeU8Ne+aZ573MYYbCy6UI0qARoSbHrCQHOC2vGCe58rfyYhhhOl9NZYoVaXWxBjHKsqyZHyf93IXGF+bIDHniYg54aKmMQbj4BFAnvPdZiGV04CjgKTzPCPGcbzcbi9kzDnPmZmFXm+hYB+FpDmlmYbdi2MwjNocwZjORi6JEzxYrNLGAzklw2kDcaYiBkAlwIxRcQCod6vFf8qNU5g6ya177gritn90XRExxjg32LudUZ/twV1Xe8Y5xhFR6SjWt2bO4zikvE8/dcQx0K0eZX1huWkbEnGNxDEoC/7sGmbT6tIG1t9FEjU8xT5y7/p5nl6r+uGmneeWAbL640rzOF6cZv90Ni0UdjBTas5ZMIuF/LlrfpLbbOV5n3OyXem3Y+g9EpM6lec5Z2CSyvM957QmzgBHpGamjjEy2Qq6D2znm5Ub2ibcUsHHOvtAtS8QcJ7vY4zj5RAPn7vzPN/PkzF4F1Mj4iacqWOM24gfOccRtxgzlJXjANo+15ODEmh1zWNwCzOkzvNcfEwScHlVnRwy5z0iyAhEgQCyJLUk6w8cI6IMiYgolIbmNjsyEkc45c/ntPeiTLFiNS7aLZW0TC0aTIwP2Dg5kRDyBFrnVXdlWmfBsT5AIDMJyTWimxrKuiEu/rl7rDPHGBU6IMdxRPf5ktR53SZQzTlfe4KL0lj+ct/8Oh1dAUJ1+tzFDVsp18bV/cOpcz9oziuRNI4hTc302eCg+y0ajtZsaAvJVKzSOApVyVD1kswGRraAGCMi4ujnCrCu5DCrGsygxJlzT5izFCr7QS6LJLB77i+eoDaSnxjI8XKTlGe1CLmsjpRpySEss6DMvGBATcRsizuz4e3MdDlAUJgdEsHjVUufSY7c4IpdT1ZJaEukbgFKrToMa0kdskkC6mKDvn8hDbJz6psK2SQ5xuiV1BM1uHNsS3YXl1hz1YZ3dnHwtlADVUlswOBZSkipI+yNqXSxAarBwJqCHxwtHmk9IuqQk90YQXJrWBmP3kKkWr0OUgjrvAC6Xp88T3sIrBsJco8KhS5rbV95dmB3sZuL0e8bunmbcvfN5EWg1r1Jdg0AAAgZZlXMzgXblRt3WgkpxZyRqTMyItAdBixfJEROJY0xnUGkUjmhOWh/XxkkACGK437HHbfUQDir4eWO49Tbu779wE/v+uXH/Pqun9/zy11vM78i/g/oZ+ANsN7/Decb8gbcoEGXlVWnxQkFGMjLQcJ0gM/1eamKDETlEtDp4oGOO1KQ7hB0nvnjT33/VX/9J77/d5z/E/w9Xn59ffvz7dv59ate3u7Hy53jTt3BaW8OIWHGenrA/EpbSCcnSeS8m7ZsbjjeTUEUM6mYFX4OINJGi3PhMG5xvMbLy7gdcTNJhxmsYOLMB2jZB0/hddw+u7aD/198c9HbJmKvgPj6WjluBaf4tpOnfDAPxPy/fdl2jW4tcPFfzVLK7YTrAUKTlY6SVkxXX9DFl/ZraQ/l/KvwsT58n+uc7gt40R4v/fLSS6xBBonphtcuvzdLvtLs2vIhy7uhNmGutaoIea30oxOdQDWV6k2xnOsqyVoDq8iN/guIC4xj6bVH5tmaBLJQBcJ097hyAWUib81OuIwA+dMrFBxVQ0KsHo4CtmqBbS6X19xTv9QdZ0JuO6AtaW3dZKf//Zt49qB/4sO7+sg/Xg/3f/R3cmPjT99vybVumMui+IS9bx7ZFqdTCXX3vqfxtM+WazBFT0hSgQnO0ERO8WoWAQBJBuzwOu8/1ik2AawesZmPv7ICN6daW1oRi2gJClRVPd2c3NBXbuJnRLaAWdvokChSiDrPyVb1WLSRH+zGtezrhD6/j+Xd6/1CORUWcsjDlB8UbleimVj+jlF4dkd59K2C+8SFcM61m7gEslCtQrXUIY9rjLHaCKAP3acEfO37IyM11pwdppLTT+wpSEkDF7F9pM/NL8w6pFuEZxHwPqP1cxfMTLms+skFbjVOz+eC2cmWcMJP3zWXpodOLCRZnkxcy77fjR1/W1ziYj3VNPq5hqr/Plfa7LeVu0Xv8YGtMmel7qwdfLoVaXLQ05CevrnPYr+OZUJdC+q7BJUOZF3KCymcMdHN1lR8gXA/HLpCoHKaVrEncBFuDbdz4gHLPxvkwSBG0i7GRUG9aetu28ItGwDojAd7640mpEZq7dHqPCfg1NIAu0vb89lDfce9yVaJEqyF5Uz2EepHh6tmkEEDfuc1cq567kHnzWKEghERY1Q+kDX6J87rwBBFDCpBnvdzOvEuRhvBjLEl4dnvJD/c4vzzs63t+lQ8FBAcewdVHVUelL9M2AwB0QnC/X/PiCckXRDNy2pPKZWnyGywoTlGZhZWEivNzdl3NmxS5z3vwClMxaTznTBP8v327V1xnzhxO/E69fWuLz/y2/v85dQ/7vmPqX/M/AX6CnyFXiNfoVvmC3BDviBv0A2KQvIxFfFsah7gG5CjTFTaws3KOohScJre/EEnQ7krzowzM898/4Eff+Cvf+L7/8D5P6D/HC9/vt7++PbLj2+/5JdvuL3OMU7iRCYxQ6t2Iivq5n7RTfGLHhMgx1QGI9xNwftrmeEO2VnwX73CQQ4PPnh7OV5fb28vx+stxtGAn74GmIGOyayMv7mpRhv9bAyULebX7m800LThFzasssu7HxUCvwgl3FlLwXDW++JelYsUFYLbLU9hW6idUW5vJVMTCWaEk/bL2caVd2vSNnrtSGb4YQuNT+2OLWTfaL5KINm9j9nZ88Fp1MXFnbfwd+mtSxevhb01KsJgFWTb1pzzTmag4pZK4+1OiI3GMrtoiOmURHBKzATcXY4ovblQecwEXC3QTd3DxnAxv6oKMLfxpGqjnGxenGAMZ6CJnA5HDJCgjOmea+5ru0XHQo10W6a+Wx45xNAL9STXOptoY0CmxhG3a99ljWBXoVYtmNe58jp2uygRIgNXXlbtFGMHObn2ru77earbR4G9X2vLmxiux226T5E0H49SqczsiYDushNdywXUQVbDzcH5mTYxVtql4SlmibEg3dzTSa50jy14W1K6SxNFuVrhlECQiAhVKkuJ1DknuNQ7dFj9Qf/TSmaobR5sF6an4rSbCPI28j4jAgFknqjWhoEcjO4if7EdWmqxgQRs+m/qULR+vL7ZytallhUORqdispOUGU0hOeuX3UmYHZFpkrKTTNtbpWpjc+Ky0grsWeyne7y8ftvUUr/NLAQhqtkQHZx36U33ELB8v7T93BBWHsxXGpfcblS6+6HM15RplBjiinH1VroZTl2SKrFDqVHRmF6+Yjqr4VmtSKgSem38s9Kqa7VanD3qTyESzNImATC92kQ7pMUI59PKDK/0e8M+7WmJ3vu2KNQl6ySrSWa1tzOf2RXuLl/xvjCtU7cous7sFXbu3xbYmoAraQOSoR7AWC5oAuzkjGrD5K9X7eajiVXkHXFUXYK2R1bSniEpu4eczfEq9oxFJmt72qYWXI4R1TGx7rDu0rOyUlSJPq0GCMFIsLAmUaqlNY6yFS8SJwwGXwSbyR1xqNnijl8vtYeso2YBd3G+WMN1hz7tskpQtw1pJjjKJUYgsPoHOxdCbF8aWNFs0PnJxbm21P924Pk0swsQXcSIQhehT4SXaTDdbT5YwKGgMqt8Ald2QzZ1XudwyZsLQ+ozBethZ7f9vXZw+3evdlkvvVbl+b8YZQnggaB7OiRFpNPgZt5jpc3NiDgIJSK6/YoRAMggInk7rYhxALcJ2Yl4x/EXfv6Rt3eM93nc9XbXlzN/uuvnc/4M/QL9A/kz9A38Cnw5dMQPIHHqlgjgAAZwoE5xQbVENV9P4gYeTvMvcr/snObqCQQxhXBJQHXnDZyRJ0430XzHH3/g/A33fyH/Bf6TL7++vvz15e3Pn/5xvn09b68c4y6ced4ZCcwRR6bASUzgBJJTqtoSDPCs0nbKLNrJbFidTE3Yk07hS5CJQYPZSCN4kAeAg8fL8fp2e7uNt8HhegOfsJagD06ynWN91GZ42QAPvv+d5GrTP1xLzO3UuN1Z0tjZ2XW3jUQfhdDzOPvv9WYYwlIniBg17MwcxRyuhFEAAYzyQMx1rCgvKyISuIEZYdnl5arTEIOdDDIiZqPFPi/FmsXTR/t8sT4yC4qoCid2dWEmxtEtyxa48LUL6pqoOafbVfT8SkZ+vjuQVp50fX8xeXeErDrFFutA283aUlZU+M41i3SrLUZ5Zxa7zliPsMwqBzbGkmfr6hST5lSlcT2gGG1rSeITgtmo6YGKyDKLs9DfN4ffZ9p8qVZ98z29JJ+dJPW1Kip9ZLZ6srP75qVI6KGMuLlu5euzXXv7D//m3E2R6j63FkyWZYM2i8cHu90K/cmc1ESVjcPpVaW7Bz2SPezsXy4JuBP5khr7O3y8sIV0LHlHQkQiMKeEAxzMcFEf44gOu0Vr9B0/S3QeuZQdWIve4oi4UGVRytu+X4tg9jPl2+dVIUDneq+pPVII902RCtt+f+e6cP3/R2IzZfUbdl8Y2gkr6Zztye4Dsl4/JJbsfweYncaszT1BXudiDfDDxtUX1pWZjYvGB262ZcyvmKQfNzHJ236U1t/EdXgfVgPTGbCdhWs3ZTJWLLLCxuXFr9TmZ/yfRfBuF+3pAjBOP4up2iwk2sxek63xz7u61eHz7j++6MF3sGr79O+Ord/Mx3Tc/aPFH/afHyNirnLYfoyAESFGAVjSxa+S3ZAkdtJZC9PUKBQGBy6kBS+hs6AK/V/OkoTI4RShAYBDVXtuQ1CS8qKetamb3t8hbDibR7FqE7HKltXx3Mpp00pL6QPwdCCviFKN4Kly/vGqTPTi6Znz8n77zEQQKx85BmJUayamAFmRuCiDHSeXbQAWmAFexi0HyUiWY+88T7TsWbtTRmCdnE9kjN1aizrXVlY7tQrLhGzLLQOgcMG0zE3LiI10jH8uI5noUgj6LAWJoS6mkQRMJVIB4GSIhtUxQtiFu0ySSQ4mb+JNx9eTSsRMTOVJTOl7fvvX9//zu37OPKZepr5IXye+IL9BX5CvyBfMAzmQgzw5Md5vmIcihKEYiFt1+pTzvk6AARB5AIkTOtNYLqYhprKTFtFLNIVIJMHADIDEGZoxf+j+Q+8/9P4X/vwV8zfM/wT+M8a/Xl9//fb1x9effnz5ab6+nGOAmMw7mEzdRkAJTvBOnlRKE8yVo6WOxV1rxQCHY5u14w5QVn5euY4wOODARQARwMHX1+PLy/H2wpfBl1FpgfmBq1wCqV9t2SPbxQ9qh//ZMb5Lltf3UcKJ7RVbjK9+EOVPfSwofWDTJGMw50I/2PTdTSzto+q/CVejV2p4FjJBLy9Jlf1M0a0H6ghYYSiXTcDE6mHGiDqfj213x7gyWddyaIsvJso99vSdPrZTwsCA8tF5lF2aL7m0S/q42tsKuIcRJU7XhNBirWo4UXlP7nduqAz7pMTCEXJCXsjrUJ5OwtNpHIzOK+1l5xCJmBApK6nNaSrXZVQE8hFWrohqkcTj1AjnNc2dciRVWOPRppLIMJLYg5N+6SL9+vqhiWht3B5F34smN6bKPRtbG9xq5taabVODMucqFSAfhvF3lz7YBmskT+/BbkhW+pm2O3NF1QucJLJUyccIhkgOIBRhh85UYk7OGcillHdSTencQcyzao7WjDzD7ly722AJdKPI9eWIMeyydWeMsRY5JQoRcUTdnYkTCMaAVvexAZ7bgoQD7EQ3/hWgAQxHfLN8wBVkhbJS5uSqgCWoizZqqMV2CyXIrsDKEqmsL5b3+t9t6H718Q9iqKGQJOVproS1brV5+WHfmeSROQt7J9Z3rSH4/kv7vwIa6JwbgAepEMmp+USWDEhww5cnJkOyvWlPLgwukscyAEq7dgOl3XdehvfS9ddT9KEIeO3IiNEug2AKRphUpOx3KKURqIixZrZdcw1uP8jo5e4E8tEWYTy8nw/GqreKePCo9N2ShD6ol1qMqxWwMjvXgWUXDleEAJZe63Vs9LAvez1XCvv87Jq2ZMv+oRrXuWsVpOR006HGaWmZWpn0vu9El9WUSnpNzLJ4ojJlev9boYQmeLhCW5dbKMu602JwS5bTRcNPFqGK4erSgC+auOZfOs2QUxQfrisHy2EoAMpuLD7X3AlJszIEGietkzoT7CSo5nIVyF+kyy1xbRFWLaZpoIOQ5ZVRzLxvhevpLmlT5xhDcrqkYbmmpERC5x4Y2c7Mpa6tASxp0R954h6h7b+tJCUFYFTwi0t56i9ch+fheCtmpfebraZ0ShnxknkiApPAlO4REXEcPGAcKgzwmAjpmDjeZ0yOdx3vGe+T58SZ8SN/+u3+/zj1H9ANeYNeoTfoFbrhPJBHpS5kdWDOjHke0JGinAe/QKmsvuMgJnCAmiA5ppUehpAoYDJvXGMIgnWiKSeiSol5R75z3vXjT33/U+9/4cdvOP8F/RO3X19uf3z78v2Xn9+//HR/+3pnnBSoCWS4LDJ16iRO4U7ciZOc7VSt4kkAVHiQAqtcqRrT1OJHhI9FnhMYUkYZ4MHkGCM4juP1GK+3eLvF7eARcYSwu71ri7cYIH2YvO//VqJdxPM3Vx8LXr7bjYqEGe5JbC/RY2d4toK42PQ46j77c0stXmd4E1Q9BTOwKTdEaqcKr+O5xnghu9meUWX2e/EREWJGdIlONQgHgOARNhIolw5dc+HzmHuCm6K2nVm1Nz0ihlN0SDq2qcmEAgNjNcKNx/nuXGjnALIR1kUC9dNG1NHG25eQ2zZxuH4JHLYDJM2uP1jb/VDyCIjgCIoJrawUliJeYcP1a5aKGnY6XJtrt8U117ndB3pM8l7ruWdmN5FchVWXcHm0H/b71CLsu/NgaD3s77b+l/ryYL5u2r8fFEal/HDALlmy5mJBiwssvGlJ+6+e/u6/ZUMTStNY4Zcr7rE6maYQOVXuZJ6k2GBdg4alPSIQg9G7kXoo8kEPlXim8JLjyyXfVxkMeDjXXSjPAWWEgBtwYzpfaVggL+ELOlWFvCynECuhrr/0vNTgOin7etbB0UUeMmRZXF/AI/Evavm7a239WiWfhYhI5X7injbx+T5R6XXlxORVhoNHP0jfJK9l6jna7XGNaqUMbSuDi4SfJ9K+lw8GQAh66HzyNN+19b65QTa0p6zXHD9FAZrcjPPCrymVbKuddkph3ej56R/n0uwqZtGAFfsJqZNasPsk1gCWsFhGo+eHLb/96cr2GksPziN82PEnYdEPqTP1d5M6LtiBviKCUaasiETl2VwzQQgmgMwstW/Eze4gW8qwCRI8lzFud4Ew7EVmrE2okYGEJsqxZAQgdp0XuyrcM8lMewk9rWpzinXOKvPHHKLP2QSwUBQW+e5E4+2vLMiM7rHqOF4Xyc0pJHJKihWiSrf7uoLOdOIsOYJV7BLuFhcPT7SmsGa5cPeM5dO+DFjHos4zibGqZ9Dpl5WRDKCzQJSpCnt9RlhzLpr4SEzcF45PZhS4yXFxFiO7eEX2ZuHx2QkM5y1h430WggCMWkCeAgdB3VSG9UEQuKVe5nn7oduZr3+8x3u+3vH2Y77c83bXOHW765vwf4N+QgaSnIEcMYNz5OkWVwcQiSp4nYgZfVCCcFrk6UQOT3UkQ+MQCZfGFW11apd3GlGBHp8TumW2RChTmZjvmD/y/DN//JV//YH7n7j/Cf2J8ePL6/nTz/zlF/70bb58eY+X98x3TUIchi5Oh0NO8i6c4B2YboKG9pnhAx8XQA61ASCATvMuX6+oVKSQ7vBGQhwjbje+3sbbcbwe4+3gizM615HZpc4S4Jd3QkK13N4293GEct5wj/OJjz9dzXO6bSoRaaOYJFdfGbZS1eSExVhX6on6gD0t10XJS59uyVApwW0AqOmZGVJw2fd4DJAEQaa7dK/hBYmxueUs2FrNILWybUHQGmFkno+ePDO5y4uxqQWVToQhxIeVedQV/MNp5wbAraO7JJcodZb//ptWQxtprSKzg5UZTixx6Od6IxTEjPYyhlP5R9xSTvYUMYIhztb/GoNuU3r0Icd9J5KVHfrxo/VDf8e+mpWqtBYwiss96FUkVT7guv+Cgc+qkJr7cyMiN3vj79S7fS8eOPDmKFkGwNN31nT6tF2mr9YZfEyV+bvnXuvpt+1orM7LpTSQ7VDbzGYi7IomQo+ai1wy02BwvFJs6nANQ/orkjnznkWDvXF9KBeRxwhJToTIx2R0AJnnnlCUygSlC7bY+bYuAGAHEEZQASiSHk8d8AltgtU7UuvDimYtNbc/WLaiHlhHuN1UJqtWB0U1XujHvcYW3brUIVZlgh9hvCYV0LWWNtIjAVA1v/6+GWaySrpFhZ87smlEhQxgPulUD10KbrO3i4gW/5cWPoCADMTlE21fau265IhX5rZuO+NiABPZBnBbzqowQjBZMrR02bjWp0fWDKDPwiatUNMxZ7OlMSVkOQ02/KJyhWvnDwArqrn+3ZqmNblMk0FxmMX9uEUIq2AMIDnG4dJ8qVIH+ifbIeo1euIh60g+cbklZNcGNcerUcKWrS5Wtk7QcZa0jNJYMcjBOHRPRjgdvRUkBXUyS7BKyukyDWK03yAS9pEiEFMO/VRCoeOOkVS4PZ86x6mCAJIimO7x0nFciIkMITFDQ1evoWSApXcPu5PQGsaK9u5Fq71wnoD18ahSYPX7ADRJOi2wCav4TiEVGF1Bc84kUplwIwlJ3WfbCxfDNxAfvZW1gGFknyybB6HSGzgiEr1E2bg/0Cog0FoynXPOI251S0cHMaF0SXKrrSFpy0zqQpEtcFwNhAmuPDeY63QRG+mSx1UFOq06koG0oVS+TM0tmrzOkugyHgIMMaxUVHkiDumQXidfh75mvoZe3+cQb4yb+Cq9vs/jx3l7v9/+vN/ueDvz6x1vp14mbsJN+oL5M/QVAoGY5OnqI8adQIgHYgSi+shLeHHylQ/8hCYUyjl4ALDzdBaXM0TsNHEXaO4DRbXZVycsQ5K+R566v+P8gfNdP/7C+++4/y/oV4x/vb398csv3//xH/dvP+Xt5YzjhE7oTGko7D7SnGDGmNIk78Kk7soTc06dlX6QghwbNQ8f3MRMnZb2ydVLN1PLxLxz3BqVbIxxG3Hc4nZg3MYwkqqJxzYObFa21sylqz2qmBdNgStFXi3I4f5pT37X7dq/v/H6UMwq2HNX9SjlIj7ouISj7BkFHdrsGW3X18ZlViIeJM32cMpN8FRQpCg2GsJ5nYxqTOv1OSEtYaBSrSs0HBhPvAhA9fvbzsjOH0hExOz6q/77vMi9RE7PLniGLvuBv+9WdcES+d48fUCr6BmVqg9XAlJkjEfn8TKZSiELkvzoxBIvTrFGW/0aWmOrfSGhIUyDQDhOeOABMsi1fOyt9NQiQhrjIpJBLroaWWB8AcilAsDZ+36tvDSjctOtXoQ6w+FJ4vKZzMqwWXlh/FuK3jZLyuoUcS3prgI+ifjrLEguE3xQcfbv5CRpx3Ovm66acl7fjIr29w6ybgcFmLsNX1Nz2TCT1asnwUsZta5WJoKLaTlGgT6a/ySkQNVQ+iojR0nSmLntvVurEseo9mTaQ++t6BjW8FJMIc1EcLrK1WgZ4ABHYBhzd2gZACw3jpvUZkwqsmEI0VqvgToh4W4mW58u8oAkDmRDf3gxbJPZCEbp2VKlCFKV+XzdaieTNpcDAU2lXdQsjTaKPAmAIzZMFqy1qlpctA0eo0KMWz+BZh3XcqNdWKCdlWXnyEYhMDFRqQ3EapW1XCeqmrSdqyxX+OOi1dRFEIfxU9Z31CXCAFxZy660iViixurs5YbbD2nBbgidFNMeAvdeqF6Sz8HAAlHpzoB/f6XjoqxmeUbItAHt1fDJMlvAxFTHL4+jkDumctXndX/4bRNr/Fponir63qzlxY54HQznsyltKAWYrogHgykFFQIjc4aCoeMvR1XIYMQ4hkYmkTni1g5vMM+cU3NCZ7zi1ImZaWAGMhVyT884SGQyNV2KhhF9BIY3u7oYjUgSFQ1wpp2LYt0eT4RTuzN1HgyMULdOTWbn6oGZ1LTjdiVRsSRKiTlKK32fuukkeSNpR1dqwKuiFFWwD7QBwCTEQ21tn0aAzgQ1z3NQEYk8FTNzuvKvT4VoJwlqZiDRLbCSEcAYg87aUoPEy2pbiDinG1AekhQjxgFxKuN2AHAjerVbJoh5v7PK91SK/swT72OAzslVUkEFUsLUaTTJBDqVhCDixDghVg1G+cMkHRFyp60CIyPkjqY2CGciqRxBSm7oRbLypmfFWhGYPEEkb3au+29y3DOSN/Br4mfgPyL/QfwEfpkYUyMVOY8zb+d5zPN4P1/Ib4nXzBfhJhzEoA7oNr+/MF/VRx+t7amKe+wA31KR79kqE50RGoYtR4lkIkNEWv8Oc+KRzszL5ujd88sLs4Ksecf5Z2ji1Pzx4/zrT7z/jvt/Qv8fHP/j23/8+d/+48eXn/96e7uP2zuHo0wiRmDGQGgSyZHADJzAOfMHNFP3QHIwcMg5CiMoDhGizdPjOJLI6XxT2ZGmc3KMxZYl6bxPvSvHOF7f39+P20tOhuKF4/Ug5j1upCsy0GmnopIueDfecDGpOmLJTlAlLFBEozjbel4ZsbGFRNuz0vQr91mr2BIP9IkudJI2RxGUmaXT61Y4k9W+nhFnyiKy8vUFKeeZ7F3qriaslA9V7q8MlTGhTNwGHcTLSEz3onN78sFGD2wM9TnfX45bZmpW9rMFF5PznBFV3NYZWSJHe0qXOkUgz1O3cTjL0aFLO7Fm3guTDSPcQQ8kgzjITFs+boJzOdWsdlQ/BI6DGMB0FzOt5IURwJjiy+1mW1LIiAFHFeekpNkaxwiQCjdI82olAgpOKKSImPMUAiGfEjegjTHCvnYblp2OSBrEeWxCLoEQDS8BckDQPJdhkzNDTEJZcJlybmGJIUsdAhhkajLGpftcpmVMIcaNwJz3FMQhYOY0q+jhhdtTzDlDGHD7t0k3uU7M+aBSjBbTJlXZQQwAGQDBQJxLchf5AD47IbpRYnu4M+E4S1x1hO5+7WhvKQpQwA0DUdWPCTENxQNLjamMGIHONG0EKoGTcmhKKejsfO4sQy4nJWjmPDVPUi+vx/s8UA5B98Q4rRsQg8cYMSTMmVB2hIRuxbOQZ7QSJHD0ajgvN0dcBkBYECslvZ/37g90WQLnmTFujqDpwDzP93m/a3LkEG5EgFJOt8wODmAcdToyFbVhQrWeBKPwhaUU9BK4d7Iji+WU4z+VpNVu76DR1m0RCo4akxSd+8oKOAMOJZVCksMKrgkp7T8ILMQ2ABVtgCknRohlGQWcOKEIZJ7BwSAUaag9+/WqkqcUQV4Bh3FxcmJUvpniYCFyW42uTJuyFsyeZ1eJVDK26mCQCIYq5gxJp06jHpAx55xzxjGKk8tar5U3YGazJPs8R+EDt6oEoFTLKwZyBb4knip13LaMCTgCNKhXCxBJ1aZpOTUGjuqrA7eJuKyXQpxbSFY5jighS0YcAOY8XXs2Mat+xqddkHSf5xJ5Y4TxA1dWqOchKaGczjMIKHLWJ6vcaJWEAahADwDOaZDAq5VXnikgIw4Zv6k7xk7lVB5/3f/vjCMiyBGgcYEi4pyQJvJUnqkJncl3YU5NaSbczy9TVl95b6UpMTORLNVIwHQFcfCII8S7gDPHkI9Dr0+RznmeyZRm5jTAcI4Ml56JBKLaX3jT3ZUpnDJUTapL/6BkZ3VuhEEaGxbD9FNprNpMybJojaIRibNgiRwgU/HQQQJiMtNjQHl/9tCqZYvpeIoDgRHBcP1vQhSmFenyw9tidN9N+/83z5vg1EmCnpXac4NUhGRCrwC9gd+cD5T2dKQgKHML7TuD1oYDgRgYllSN8l3sJu8nqsjdCOlOxqMixBlyCs2wiBPjTHt/BuDqPgYPHYFxTA7hFXwD3pIv4kvyOBknXnJ+ueeXef4j5zfkzxOvOF5SIzGUN+iW523mLc8b9JoyZKeVhgAHc+D9YOOwd9jEhnLWztXEZ7k34kCjibEcYO0HteOBILK3I4O1PpXgY2SM+n2Lf0lKaWr+GOd3nT/mj5k/vuP9D+TvuP0R48+Xt99++umPbz//ePv2/nLLcTiVPx2BjjDQ0AkkMENJTPEcVGrWCTaEHwdbuiRorUOGyBXaVdoNu4go+ghK4Jk8oXfmcd6/D4YOufQiIg7aa1SkYnpDC+OF2L3Ul0cXhr+ZkjDrq+tQlLfmMQ0Mn7hXr8tHyz8DOo5ln0tcGJmXOwsjesctaJ8A1pr4c/1CWxCDHMIZDkXC7juWM9TD7qZjXl7n8ZfbmEk9FH26seCKMfZyeTWfktQ/8eyuxav3W12LaBjYKokeEVLG0qj8qaN+dq6vBVx3LlgCO8BiEHDrrbPjPWSE3WKzQgd2LBatB0uVqj1d0OewL3ll4UvLmw+mDBj9SEKR5DA923tmZRl7LtAIVlJUIEFERlKjFEba7QYyg9AROG1FkiSSPKRVJte7Y9JuI0QVtY7a7Ij2BF/hG0+1FcHSu5Z69uRZvKhre2F9AMxjSyRb2/xAqduhUOEqPdd37qdGcsdnUxszeDmGewKfwvwnISRx2PZ17Me+q1r8nEQmZsEZI5VzzrOTYMu5qwnQEVZnKRZJrzQRPPqqVyXJA4soZKfRaSrE4zQ//rPenHA3gQxogJMDGOCQ0bNrLpMY3YCyxT1slLaMd/qTi/ArljehQWZHwCJYi2qDeEsARnPeqqFHHESW4LTCf4B4SCjy1pia0M0wGIALeKzxlGObF3JAPi2FNb8IZyJEn1SPdMYYnLkihIu3tN+kFDJbzeywXnAPFdoS0MZtm4BRbc0+7gvXA1pjNyyrxVags6zQQLwLm9855yuthSsCsOSBY5U7MdiNq0wa0sk1LSbNdvA/1yv2Mj4f3mvE1zprI90onPz+CklG2s+w+DmqYi+4+Qj2FMuHsFIo5PIzLql0KbDb9fEIOKJFlniSnJ8VhDKW1wZVso04/vjX/wsR1bwNYGgMHreRuIN36C6c0j11F+6hc9xPGnEy75mZ824ExuHifiiR4gmelpgxbk6jjePGQxxQ5X3eWOkKZcc51R55h04CgWnNemS4LoxlwduWckIJJ8Zce+ZGDl6U0v5W0r0lHzMkTjm5o7JuIhHBw+6Zi07ROBfKMBdQZdszHdMP5mRGJEIWTCjmduURAg2XrXLDhPeECExUjL16edIHIXXl/7GS0IoPnspUCZkAUghyFvIj5yVBKIZ0BO+GZyqEb5Fg5gSOsBOXIXvtMADc5njJObfjNNW964pooEpdCAAxQwwVeJo781IhHBQH3GQKFAc4MA7Ea+JV+U3zy5w/Z37NfEu9nhipY+ZL5kvm15lvyFfoFuNNOSRCI3GDXnLeMg+dAQ3ogFD9ucoUVu5ZB95Gsw307mDjXXYgx3WuLq2UZV8BTuw2Wd3h1YVtJgJj4YLWDTQx75p3zXf9+KH5Az/+wv1PzN8R/xy3315ef//pp/n1J7x94dtrjEiw/ONHCOUnVGfwJGgsmsq8ZKkpV7YRWyaZ6oKREq/UbtejyP5fAMokTjDIu/COGPk+XseB22oTeDyxm6U/lKOow2KZafju3MVD/yQbhrrZUzVOrxO5CT9tbG57f+d6w2GqJQzqRhtSigPcDVe6VT5py2rrCgRsAzafZempn1y9yJ1GiWWkldRgRTCKXuw6HebHPZSlzH1k3B85+79Xd+z9xVYP4BfjsHsq4Jba3v3unMtHeXatb71LFOviSmgh91UiEe5KCMCYvMHBcSACSoMH2e2+omxFq12QtBR/U4SFqPXyTB0NWb+NMx9GC4dTLjS9UiciIg7R0NXslJCKI63ZIQ5lsmH+lqRM47l3dmlEkAG5Q3wKV2dNlOHGzDaJCZCYTxvEK8wIFMzMB3KKCD3ZvZe188n1YEd9+E4x6iwcHuHK4F0PZStYiuUkuE5cxGjfQSHPOF3ExpW7pVJCTjtOMRN5BuBi9rmqEbhQ9YE6DtfY9DDmyhRHW2YErgLoDSb1GvwDCV2fRoTdFA7+oEWqvxlO5gk2frdvZdBSAItfel/QY4HBP6K187Be1Q+9rBrJnhjtO3gRsrtfA6WgX8+yj1mskpxdJQWQBbJiD9E102EOkPLabw9dp/6BMC41N6o16Ge8t6oCetC6ON4z3/D/2eXK/Un47CKHl92r1cRWHKI4WNGhAOAolik93L9qGyBJUQ1WCt2uVquehaEZjDN89kdbYkU8NH36dQByYPMBZqYMLQYbFa2Nk0QVXKQrHrverFZ1j03pMl38DtTFUxXstu6gGv2+zow4Mzt4q/UXXTRfVuYlU0oPeZI1XiyOKIV7K0c+7v/5/8QxdISIiQQmD8YBxWSc4KmYwg/pBGbofIUi79A55x35bsMAUI7EnOKZPIV3xF05g0gchKPvN2AkKrV6nuLQGBGFyZtSOuZJtDfUChbb7YFySBt1hwKDCddSlEpcPb4LbgL2Lix0FvexEYtyo7p1Eeg4AVoKqoqfnL5cjY5cBZpZ7puyyWkx47KfFeVtkeqNKudD2juIGYjEJOhwur86hUqkxCSPrB4fAVaCUzKUzqxtjS66VZiU1arWto0rksEZZtyhQFKZTEkzDNfsIu86zgqB830kUP3AISJS01n+yqz2GFhZHjxGZ58jXTKhIzUCLxOHcDs1UrfkYQ9LRgivOn/S/Pm8/6L5bZ7fkF9UtDGEg3ghXhAvwA3nTWlgRMcBDuVQDkxAw/k3WMyNA3Mz4mtauNIZUw+Mcelr/efiib6puuOGD1g4nSzR+ZgIKxcDVZyUoWSeOX/g/TvOH/rxJ+5/YX5H/or4lcc/X15+fXn9/edfzq9fz5eX87glS73o/5yrzXTH6eheaUAdjUpNag9ScrT2PySzPx8dOtukcqBpJPVS5WVcUdydGIgZky+pE1I0sPouIfpXJcWtKlU+yYP//kHL0e5lutRNh6M+ERXruS2THrAdAOeib8iwKN9z10JcfHcfQ3HhZfR5GZXYVcM14D6/WHGh/jSpuArgSp48fcdO/cxcaaz7MD7VXfZLH264reLnv1rvl7uvjavhzFOnNk55sYCkmd1aDuZWBrybBAaeoRVylCMJneoWYCEaN4jH4CDSnYAJ6y5B5AX5AiwiuuTix3k9iEy0TxZgOT5CEDhCcClZtmnAnns9Yl+fCoxERGiPzzwoBw+GKBlOyTjPq9J0QfNgU6lrOgqXufX4Y5PNz/tr/aIx/qRNO9/HvC/RIoX15qUrfKC0tWL7z69VbZ14KVdrzeMZbKSnmWj4yYV0dzqZOiKOI5TVBF0KmPOk89dh9eqa2jaGhwXZVmlf4Q8kvy1RK4W1eDpmatKdS3uYq94SwIK4QeWaex1MZJ1wlWN0XhMKOL+T6heXi30wvXd6HvB2nMqqIAAMRkIuk1i+G27K3H4TSRVteHxiQwV8EnF6urgM3ekJlpOYrZLuO77/StiPw/7p33CwzRf2tKEqrN1Fm7E6v+nK9nziuovF7hPZvLR97Ht9uMh47RorBehw7YoUuzGwzfQT78/ig9UqjmUXXu6AbW07cvjAHJ5G3tWbm1n7CX+4uL63eB/Sk4B4uhZoxAPH+PCr9eLA/3jD7RYvrxxB6aQwKON6RWJAcUITnM64BzN1Zr6n3nO+C+8xkpzKBO/gO/AOvCvexbtmAmcMcESKeUKkG3PP+w8euhGDFE5gnpqaZ1D2IAtJyTZLQlbtRVATVCm5oLPSrKJbuFywwalYlgMAEsNWBd3AR7K+H8CgXI9gfcIJlJSmQsK9tlNASMPqGlWhjbTq7GQxYbaIsIlW7G+MIUA8s/rZxOWkWeavkQOKot+rUXkcSQiRRNUtIegQaec1kO69bv2jE1KAUEARSqSDYJM55U5ShDTtsIfuyShPZSrRSUEAGKouGkyEGBNu4AC7VMa4JShReUgvmTfxLc8v5/1t5teJt4kvqS/Ai/CS8T7xexLMfyB/Yf43zF8wf4a+QAPLSSbnNA/oSA3lsLMJOpyt3E0jqhodWOwot9d9vEjI0aUu5upD4I/+3XWpjP3PaMFcduJADHCgZWTkxHznjx96/wv3v/D9D8w/oV8Rv+H26+vb//ry05/fvv7xyz9wu73fXs8xznBa6iDDwztRWUVTmNXizTW7UNsAZJVQczkeoMWMSETEIdgpXhmI5KG8F/+RhBMihenwfb5F+w9W38ZdpJU0tYzsF379rLjUl3Nnqc2re+0eGV9P6rrqUPQB2RhZrLu5KeklnOzKKxz9xJLoVEteJOzPY5n7rQqsCdojB2DHA2mp5cpCH7mLlnIVxAHK1Ezn1vfxj3XzvyO0/ugTVfhJFbiIsgQSO/uikwHsAjFDcRMLEitWsMsk1XnipoM68NVi3xnQJgIYOKGqaYytEoc4sqLwlTcJOMBa2TjXwkqouARxFT046hlQFXb47mSQg909Kefc7yOJRFYIJj4s0Wdr2PsGoNCxSNH5kDbVnCvFaq5OglEprmaUJK/6BLbTqEr9FBe5XoK2ADBK69W1zeUS2hW+RWy8DOBnMa82ACSt7sI1v42GHYBqWslOEsuKWF4LJWwhtQ+Pu5JMFuUYAdD5P5knUnaAMagxlAPuUoJAIKdttWks/MzJcZA0vNmuEgEPPEQSrGNtp2anoidVxis2xoAiHJZQArMqhGovYG4ByF1qSEQltLCqJqvG1EkD3ToKkGZVltdQsQCjrEH7Pt2Pdksn9oNK3/YuDzMW4xYMILdK1jB4XH8TH0RQ71ql5vp7sTWr7iUqbkeiAAUbU780JaAySSs7fbJjftcXIDqTIAKVBrnGsNGkNYUSvmGXWcXP2UNvlqItRSJwpEuWKBXKXrZk9YMSxY2lTvVRh36XDghgdNb+E0kUeqyg7o64TsvKsF6HspEyelpEKT7Lx79CJ04f6a7ArSxxKXTZKUy76PRa6drM6/I3c9tpFz7xSpD5d9c6JBwXsIYpJbQxEzozbzFaHPjvf+Dldb7Mcby4r00OaATG4GEWTykRdrLoHAKndEfeM/8Cp0bGAGOCM/VdeE/ehR/VtygmDkRUuUMy4+BxQ+b7gOQWtnH3PYXTknkygQzOREIakZrnYNJRAnNpigzlOm3O1E84Od4Nq6u8tpJ7UtCooKgYBx3fMk7OpPOugNpYFfJXOlpUyZ64JOgWd1OnDhZ0D4vS7F6qLBEfg85HcyofOrtatHXqUoYmEgGYUkycAohxVHkAXMfSFCMHFSVe3EQExClgVLKPqZASM2Fd1ROo3P2puFOw84OBGMKREyfilAvjjuQQDqf3gMef95v0IgF6Ub7MfJG+TLzl/DrxLfMr8FXxDXgDjuSJ41cAym/Qzzp/Qf6MfIPeaDJVImVANgHAyByV5AOU0m/FK6LVL6JQKR4PCZv3dJ4M9Oj+Lzs8cGmCzeCW8vlowZdqWJ+2MCksDxKJPHG+6/273v/Aj9/x/ifO3zB/Q/zK44/Xt3/99O2Pn3/58fMv+fZ2Mn6QZ6nJyCIHnQwhFWY980H7/5AOEVnJx6vjno+3lSe6tMssjhrQWfWeaQFW3ZttEtuKDgx3qPa9mMIqm9wk8dJC1uulz633l5y4uGQt8iferI9X78G+Y9q+P8gjIhSX/rc0p8USn4Zx6VtXuJW4vjjT/SnLYZhJVB3gNFagWjDsu9D/XxmD0pZbv0beaus1u0+vXRtj+7E+fn19+vzO2gtAzqFmCW+yihX8fWOlA2ZFqozUDeW9x9M1fIYNi1GnwuYl0HZ7/bDKjaBK4+eRRgr+G1cuOx5t99mEdjX6mmZVcykTyKuxfdVCEQwmL82rf1gKEh/SFPbpxWL4XXx84dSsYAUAlE3yoLWv1V4PbWyw2jPpKnLdaX7f1Kf3sRljeCTaFepUm6MbRW3vr8e14XF9vKnaTbHaTlm0MT+47Mn+Zg8xXaAMRybnXfPsCss4GFkKfWQ+nJRqWtehJnL55UrDftiWy7+Q+5trrVYOw1qx67wAY4yZkDLE2xgTfM+71U/XS3akcDo3qcX0YmLTnU0ALJZbj4vOLi5W0F1Ht+17OJUPXQUMaW+Uadqgflx/bLUopZ6ujgzNf65/eYv3k7JWaKcuNi8lybFSa4QqMXeC1uW6xnX62nvweHHV1D1osp+brPuvyOjqGsvLwlFwHD2Uq3wF26HQh9dNwFd8OKrl3G4W+ggzIpgz3PFScxUpeUeexMTHo+pr1XT5p725tmsWKcaa6G7Q7oP/u/WJiGv07SCDwYLaRN/44e4O2+6P+cRO1tSir6KaHsaBf/2/cTvy9oZxY7y4GSh44HjlceO4sYEbSWqM+0iMwbgRU/lSYYFgHEO4S1M4gZOc4Jmccch4EKVrBnDoHIhjIs4cJ4bthDvjxJh5zORkSLoHJmNOnUM58/sI3/lOTXCSGuCNnX5iD71Ksavj06o0q/4OQiXxkRKSY7LiyE5sPa/sQwxR4G0mKo+Z4OrBB7vaK7miINB8WnYZwEowb0dlLSRBt9yMiPKwdU4XSQSZcSoRIzCSLLy8ODgDiPZlF8GJMKYYEaPZRbqNbt7dEbPEFRNwuxQkWDoeDmFAId7ezd11iAM8po7EcYqJl8wj8SrdyJsQxJH69v3Hz9JbofXnUN6UR+oIvqVeoVfyy4g38AU6gMn5f4WofNV8xXxR3pAHkuWocQ27qwvcMLgkngHb7BGRKKT7GjlvMq8qoI4McDGnXCU47YtYmr3E4FL3Pr/KPLhi5dUa2O1v4FpTD37yfM/5F97/0I/f8P13nP8EfkP8K97+/Pbzj28//fHt61/ffv7+7avG7Y68O5NNUuYJJyO6BiDsAPNpmtCM4YhTzYgktOk7zUZ6yC4mGeAgmTklrCIQ+zma5SkxFQICOgdjjHEcLyNibA0rKoe+mYpt1cxkVnM8bKz5UnbdDTGW56m28wEv0nU7DMfyImL3+nda7t4zKLgABMOYjx911opRuImvlJeiXl9YBkz9GzML4bdmc43BEjv3Hp90zjPQMRdM7NnKEmME0OiisAacC1zyU9mw7r+RHsm9Y7exvwgZSaOTB6pIbkSQed9Wr/oTbOrRw80jIjeT8vrIYNAcDVNgxTPASNCtPzgO1N4g4aRAyi7zUrNC0DGQ8yAvyVfw9p2XSbpP8GpZ4RjsWD3sls7KTZ7VyreXBq5i4mjy9K/8WgalL7Nl87/JTnmghYN10KjJgu23xlTH+kb1yHK1U6VSxWhqN/Ol6wd6Px/01KcteOI80gUl+XFf8GDiYqmDa2+vj5YeI4NnuEDL6mat+zPT22oSI+xncTaXe2WdayOcGQYH23NSDalC+2XsqWWUY4oDnHOuZBJ0QGzxYZI6/Wmym3hW2eZ8Ngz8/bH5vBdVOLnL9SbSnHOm8ZEunPrKFKKBQAtKa7lBLsUOmQVq02nr/YjDlR+lpqY4IDUAVAWjNiXVsYZL/NTjWKlfpJGtivAs0zUro0zb1D4jFWkZSMsisircTHFXi9sRWTqS3T/scltbTj1l/6m1qsfNK0tn1ZGvO9frdFUARg2bRGG0GMST60flfnNWVGtLsmKm1uQ6bgBUCKEzvbjlxlymoEqa+FsHgPzQgfiJkHDlfe2GDXq/YDCfPmC41qrLi0yqFa5p99Z64ia5Lq29jLouO4J7E3gA7PhL73c26sODAYDLBVB+J7sDNmHIq4ONSCDYkC4l4SQdyO+4D+aJcShehAEewAD+yuM14ibebDIIA0fgIG6h0e4iUeTE4MtNepO1MU6GnbInbkho2r0ZAyNmAKFxY44p3O9h7T/HEI+pl3OOk0zhTkwbBoyTcc/8AUzwXTgZM4SDkzhDd8cZoRTKXZo6mbMbzVTgUwRwKK1nRbL0cqhYOVhRPBd+NK0e0t2+Ji94x91lpKMoQ19Ko65aYwQrLcioQ274iVghYwgzx4hpXmuaSLbb07QFOJCfQwQ1Tqn8VVXEbJSuKJ25RKCJjIA7XDtgJeEAbk6HtFRMEDikm3CDXu4cZxwTAQ3pAEbm7cxbzhHxNfWaelHeEq6+HdKXef9vwJdiHnMgiQzlgF6ogF6IA3wL3uq01MgPZHRKj1B2eW5KVEguSqj6aAAu7nRQiI3NV0n5dUSv8rJL1lrsxaUcXwooWxB+UI/QfOfhdZ17gsOgts4DkYSc0B3nO86/eP8D52+4/wvzn7j9j7j966ev+Y//yJ9+ut9ev7+8/OCYL0dkBgCGGVBknj0pG3vStIKSYEYcZSlk9eFuVbvG1n7+AVgh2ziBvf5uFoB2JUqq6hoiw9b7IN0A+ODBsmU/TzBdvOxJp9m/wF5w/r0DeL2/78ClrT55ODqkS6sAVZ714BHpCisss+Gzkduer3zQyMLJkdRIEePhN9d4zOJLH01ngHT0iRzS+TgFPQkDtA73d6ux1uTvVMD9/m01XF+OPf1AIEc07Ai6wZ0dJfJNsnQRZxiCtNFVoXNGpg+Qq8MPaBacBQLAhGAMTbOq3oTlnKN7MfV0lgxbK+AIVkliogynx7nXl0vcmSPIFQ1lSqiw/9l6rY8Ktdb/Ygf7Inul2/28RfmLlvp0rzV3ympXoajbG/WWxQV59Nn28dm5WDb2/mYrfPH3v2o6wfVNEvpA6gSoqe60+vjzz4YnCFX+7H3xVpK0uNy1kIBmrduloEQE4ZIkqn8cGqXZWHjyYX122vCoVk7/clQ8rSE2fRe915KAU9VmUDlnnnPOM40fEXKNAiqU6htxjD7sjsIXu8uIUaTEhXoMyegpFyiNKGSZIo8TqatTUzgvqusg1+POrt8+zbdgG3SZKOvzUv6klk7khZd/wS1c92OunAhAbo/mOrEafJ9NlJpbZ2c9rqf2X1cdrJ9gS7NRBt0x6spdqCOrvoqB/M36eEpR2OrRK7OedRFJfT8/nMTN/uTmrsIHMnsSH2ZBF2e2Y1DIAvacMYLV2OrBtFj3+buDnOgO5eFb9oIzC1u1MkwopEMCrIIvogwQg7PniOMa8CafVZwQF62WAUB3fHD14UmqEFxP4v5HYtRERwADOXDe8AOgK6+sfBzgON+/4HKz0VCw4MANDI44hEhSCHFgBF5uCBeVZeqdFIZ40/v4HofiCMZMnMIPxck4Y5y83ckUfqTuE/cjOMb7qT/JHy5ug6byLrlTUkGnE3IHnGGBWHsXBg9JslKlyXT6TIjMKI/9CMlI+lISEzo575rvCEGTnCuGN4IjOFcP+7ZXR4xjRPXJglDtk03HUn639zq4iuI5J5EKhii9p4JG0p6cLkIsGUySoyTfCCWzcPeQmTOlxMAgXwKhEdAhEQqR82RqZL5CN+nL1At0O3n8YEyGi3GVA7pJr9BrzluML8pX3QkNjjfylhOYAzh8rjSBHJgDGYgbMjhvUkwd0kFWB64JYTqXJqscFHPLTSA3B+F01goSDe9UgmnqspEb61tF91XDujTBVgOau6mUIwRTp82+1aF5oV0iAVdBLihAUpN+U2lcCFKG/v2h+596/x3nv3D/FfdfwT94+9fx9p/ffvrj51/w7ev58vbj9fU8XuZtKOddKmU1OSVVfTWrKms5zBihzPM8XRZsLoRiCsycyasiQpLLkV9eXsRQgkAEupGkMs+LE6Vrw21t5G3w5Xh5PV5fxutwqwqKQp5zLWND+ed6vVbWqVTuUMGqtZRk/KnCT8CjxyVIxObR7zq8/iL6y3VPl9VGBOMIBhl7MEESZjcL6hahNfgGncwefFzybq1GzegMMjlG0EZYIrtf6YgYwwBzOav/FdP9VjqdhuQRgxLyVJPckgQ55xjjOI6L1l0W96g6rIhzMI7jqGLrXj3/7UWjskT4GEPB8zy9I/OUReU5c4wxvZiVhhAGECN55jQ7lBDHOMaRaWMGpxUFQAjolOMMIM3DAWZl+2cHQjPPSp/QADHnScQxbhMzXd8U5r3DkO4Uxhjl98vkMdB7o85lJ6mudPRnCCTEJONw/LMEppNDaajlFGYr6+XPnKmCbyjLXwNgBcpc6htA9ap2HYVbB7JqLo3GNabhmMl5KogxbsKcVXBPMqz5zTkNRGhHLEtxuTTpM90tYV46ZXdBMjDAGKN2udWiXYfQwtVpT+euMBVxIx0zpPHZy/odpZxHlT/K2EH9CJIRt6CyTgHHuEFp8Lrc0LWRmvPOPIc1VJI8lG5mKcOsBzmOg+Q5vdHAKtzXnHOOxwZVnaMCYInFh4mvyMA60X49MM48TxcMFumcSIxbJ/kA7t2Z1pLzXDtbUBoWKOVJQ+ZMoEzEbgqAy8eviUzk8TI2xDMvYgtiCG0zaNP+wSuxynCrku41r0uprX5tgowMsbFQls3bLr+8ojT9prsTWHQGYFSrsgEyUbCdQUcU4XTbDn2gNxTb1UtBdXtH2wn1uhIAL1bW36mOy7isC8JvRYyg91TQQDCYs0C1WMonOi8A2/Rr8SQtpudZzzl9anwMi0i2iFlETLe36nNnUNvX4ybprBYw4Mr9b9SdYGz9v4fcaoTo/EAuF8MiXSdfp04sFeWysqov4nmeLSMvUyfImZMkw01xBSRjkKb/hFsWusnMCKDKQmkjxwUtFZ7hlKYmgwMXiuOBuIEEw20wpElIlV7OxT3dY0oZOQc4NnSxAG/AgTtgQMlaYyEn4pwvA8Pq3BCOSiYIzntExCTFlFs8HtQg4gtu4BiKKdzldKA47/oLNxw3KWbmqZh3ZI77jF/JHz7oVIKTmtI9mIFTOImTYKHhcEaeLfJZGNYVQlc3LijQl2BQeOFNTOAUJ3QC70mnHYtxQkJkdLoGOeaJTr+mXfUZQVh32U9RnZzgqcIOclgSSedz3wzrLoTyECOBRChexLavyqU3SJ6nywiqVtg8NCXOQR1KCIcU0KGMxIsyhFfpFXpLvSHfiLeTY44xq7JwAAfyQN6gF+SL5gt0wzlQaDw0Pl7zO8AtEZIQZ5IZqQExHIUmCQ4OJYRp550PhFlmmcAYWTlOsfkZLrCKTQy087DCOGaGFVBdShU2v+B1rc2ou+2B9fU+G3DecLrEpCIgMt0u8+QUMnV+x/sfmH9g/or5G/RPxu/BP2/Hrz/98ufbtz++/cwv33R7fR/HObhM8IEySC7K8MbBUlMqn73hE+xxWJ6kyxFYZ1H9mhyzBcdaAfMxlGNgPW9CosYI3sZxGy8v4+UWt4iDrRgscn3SoRcLW9fjAjc763k9aSfX1x5/y831sh6xf3qtVZCPYyt/4QKuba1x/059hBkKYbImOZel0ds/VzKSJBhLOjtVEIjqj9U0zJDxp90IoD1nT4/+dK3WfHdnW73TAaoxxkJfQQvyj/fxzUtlDIn0aSr71mi/MVSiTZ0uCXIoKpGGW9iHHAZng5ZbMZxt72QkDFbmLvs+WpTDdfT42YVNBAJgadrX+rTZU0BwTVdWo8qbuVwtT7/t9SmQn1YOHjlBm/soV+KDC5+dcwjKHdj7Zz7Cw/q8dfSVbPBxDPtkP7yP/dOnA6JtwCRXQvnFrJq6lrm9COeJorDxvN6UZ6YI4AkSys3kgKFBZDKOLcZVGYZP8xUCTDeliKvbQ1Y0/lEIcrnz83H0fY0xnr7cU94Mwp1jdJwoKpeUAINgMTo6Z3CMOiO9xmWqt/0DIXE9Qq2PIfN08NG14c6hvzZ322UyEl0MlFGVsn4M0VCtD+d3Xi72J1dxc8tC/OwAF7nc2E/b2HGDjyu63dTjbC63NnF7EXhgBfvYrtSa9u18wovMBHoEBIRqUkuAYmF59v2vCOrfDXqNYSO8uFbjw/XxPt0G+PPr43rtYm5BF/SzsnWwXpAQEmtnm4dzrcaiYf9qLlPhGE9jmG1ySJJs3hQz1AU260r0+vt3K/bEVXoAAHAw3kTX8NOqiHe3vyrYSswcVRXvUyU4NMaJBJjICYf/rDdR0MScmMIIcSAON9YDB2Lo/ZhjgAXRBOl0pfnxGhExBiISRzpL7wDyKw/gZcQAMaWcmHOcM37HOEFiJNF6Mk/hDJyAiBMAw72zq66gs8SAwwpkkhKT9o+HOmcfPzCFiUxogid5Kt6BO5DkCU925eGJOI5A4eJhLwCqmBXpdTOd8RwxnXsAOOM5ACY5MxJBHuBIDLt4J27K/5i8NaWEE3MBnGcmogFSXFRHidCQhpLQUN6EARzQjbglbsAb9Ip8Bd+gl8SoGgOn2+SAWHD7k4zXwJhnuTmR1JnIFfEoBObuGZktY4wEN0uN0S3ojLdG0kSI0RhP0TlCUUXcbFCSxQMX05QqVbfedzwstBsWvQu+HqAnl2+DZQZ8wnJk9PL02EBxiq4bzxM5qXOe3zX/wl+/Ar8jfwN+A/7F+OPl9uPt9Y9f/tv7ly/3L9/i9Q3juJAHwFvl/8OzCIf2EliKd7P6yn9IdNORrPiEDyouNscyPiPmnGRWl/KaptM+pO6GriuUmy9HvB6vb7e319vbcdxuMYKVmnUJZunq/3XOFTMNXAARvgZ6YXu32oNCqXKNK6Ng1wzLfTB55dybf20wLy5ntfPy2qXW9dc4NZUz5+zHc30Ao2X5jUelUJW0+nit4lK7B+xnKLB595As2xP9X3SFehV4YKq9m9xk7RIGO4Nu/WaJbnfOBYA5kWlDReN2e9Ieei2CGEQEI0e38eGVZesDxRgAVlUwYxBj24zx8cYem/0LgegE6q0SpVEJ2FkH27yutCJvn0jRrVMYZjjOXioEMKcGT8HB8epduKssTttyN+LCJEXnZraMylL93dTCZzwelZK8wltlC4VkFgoggwTGVbdJN8WOqRQwhkUVRWhSyeGu1ZUi5eBJxdzWpmuzA70eK+ll0TDbAHjaAmcI7LpOKyiBR0ruz+2g8R51lOaZcFpfKQdiNUms1rgy8Fw425k5YFuRDxdIYCRTQfLohnBRmXg57Uxx99PQdWYdsD3x7mzEZZ1EHNJkXtEzzzorHPZsUi4mBcCD3VTbykkgq2Wds9JiXL8iSxWV1JW41oJk654AiXsq6FYGnDOnJnpnl0bemV2KQuyLXmCzdjv+I6sRL4ihNoQyK+8MnQt/5St9OO/S8tY/00kXMVdO/KKHbo7J5QcKK64NUUpyU+5ZNUgV8YiLQRVc0iQfmH8feDgBepFx5/qU4t9DWky56cTdVoXNlYzdQZaVYQ8SbrSMBdUCtir1XBX28doOyMWBi6HXqB7nFBSqZe91VIHgeDzOLNi9rgQoJk5WIy7XzEWn75b1efU3yExt1jCPZdyyIN2uI//w4oIIddgAAQAASURBVMG0ZqeNdYZzfbNooJIGARwlUS/wTFQpRhOW+XGhzYMHB8TgcKONLJ0CnYZRMSMnHAvK2dqby02t2s2ETqdSlH5WwniIVBwZhlp31SIVZLzFQb4fhqGbmcBETBxvOLKaa4XbuVjdnBNngZa5+IEMTOIdLmJz9U+IZMaMiDIDAssAQLgK09BDkzgpd1A6MWcjtfemSlAMvpBcPdYrPTdcB7CF7OGsrXNwCueyIABAh4QzIRzkEA9wOFyReE38Ir32RrvcKgCjZMjJ35cwyAEeyIF0RPMADuAVHFBZAsAL9ALdgBvUbW7KFmyPfie+J+BC8yKp+0G9MFd01RUXblyV7h8KdO0nIczZupQJRQox+rkGsLdqDrstkQfcBG7FVa2vc1xsx2DgCnsUrrNrx20L3VL4yP1w4+HcXEGD64V97bZyLQIDRHK+8/6e+X2+/47zV5y/A7+Bv2P8GuO319v3n77kl28/vv50vr6dt5cYB2KUOlsS4tI+QwkwlEJw2mJyjTkjOaO6k7Znde1RDTJyY3kR4R7p5rAAUqlrgyYXpVXNREIK8IhxO16P4/U2XjpgdZULN6vuCMDKUYnKxe9lKwnTU9t12bWiG8fEpRitO6wf7t4ebK93BejhtoCrgK5Un8dc4XrNJBnOZ4B1InTCa67FWQEBhnSGlzEuFqyzTB2LnNna3JBcw10FdouDb0T38NpiA0B7dJ6jJRbze+Bl/7k2nftariDFRPdZcWe3OMARccCRAQopchAjYigRcZDDCZC9C7Nj9y6nPrjslmsU5Tjvj64deXqxyP7TdXgYPwANa88qlbw+C4W3ZmVhrZ+YQNfdnkhrrd42sJKJLSCXO83EEIDseHMXpy4RMQ2Pppktq23L8HnY30eK3bSFqylPj/ZasU/ug1JSn2aEh6ldhmWMsfgAnvB/tvGYO3BTbuppoqoJ9kgl4xBDDGIohtrPRbYtWb2u6GQzkhKZEiUOYvI4BjnAzJxzrlSWFcEAFgTkxsA2sq+jvbdu3NaqK/gC0piapMSDvB28hUakUw2N7p+50pC08gxhfWlZWXYLyl9nlfxWrtIz3XpUC5k4Ldp4ZUD6NxMy0yxHoSoxLN1b7pFEr5tfy7LTxt/6fUnqwdS7OPN+LrSZ1uWyuT7t0NlD6PKi0mVerdPXq/EJzS8ltdVZ5UrNbLezukB2u9XlKFm58ouxr++s9Ontt2sZs4wv5b8tDPvfup6YcyVldfXEWpHMTevY8ws+ysTL7FTuqn8t7QPzXPdce7SzDgD5uG7rm2o34tNEDreJBVmoFvXjgfJy2UtUU7Ozz8i/aug2+2sZw9uKjqlBoo7BF8xDq91XZkEPpusLWr8sA3lq/pERqtT2IYaCADFikhknuigCABi4fcGADQCQ3aqpNP5S/Y0lTT911lEyltkQyeSZKHVaPr4DJBE6nbNUODMnkIEEp6YDC57pArCvqtIeHgDHAwIARwQPjHByjv2U0foKaiW9WwwewlAM8Ea0lowj4m19rdK+7fGKA6pulJf1nAO4IQM4kHS1BtwcXXXwkVa7q6tuGW4ApNLLBSjBAZwyJ7/O5GAScxnrpp6EMkIGzwAcTvX71k0LhN1cFhqsBk+xPFXNqGDTm+XPg80IXD6teq7Ru+uHH5RDnzksHsfmc5YXS5ZsymssBYgwpru1c5f8UBPnX7r/pfvv+PG/cP8X+KeR/sftr5e3P75+OX/+mV+/zbcv8xgcB5olFSlaokjZLvmQu0h22Nm2kCQiJqbj0Q3Y4NMbZg8938uoYIuWU9NsJZWtIRrVWACYxKgMjUwExuBt4CUwAhwVARgXt9rZ1qbE7IxpCc6/+9U6GPu1C6TFpHYBcn3h6rLEbve3ZQ8YA6QU5dmqeS+1C/dd6ih0dFVs6L0lzJIw9S91v6cgV68I0pzCdKeoYneXglsVW7rABFEOxb2MrK9wa1sAWDJjW4Re3n1nm+GUf8bJvl490ZUVEYapk2MIBWyPcsMPupSWRGCMw6VQPptlsjOXFiZpuoi8hmOq2PrpaB1YAAX8ISiVyo7/uKeeXN9PIIo/dGK05Uy2RsEENcAZiOHBJ1s9JGcSyhRGdSRGwR5QRRklRv2T0/HrZs11upFVCiB0UKGKbJzRnlKtZOsTkgBWA6mqXyRAhCIGeEhi9fedCrqITJ03LHtPgNblL/Leryp+iEu1Khrj9uXNzP54yvo0WfDnxTk/sMeny+4a9wgzzTRhRImPGBUlR2n/hihgTl0kOks8cdoT7lCnt0RBlK3wie51QeZUCtDKd79OhD6Ycxfiu0iOu1I6mWU1RjBCEQjOQQlM2OkCSbNDzOwyALJDjN35y/Acx3Gcc845nUHPsWxL6z0AkOGqDLqyzAoEWTGJvYbAktrwZzW7CdLYNapQ74NpXfMmGTFi4Dyfaz/WKkmq6ZUZkGv5UMzEITfznGezecUBYnCvmfpoAIgW6klC3RDTXIJk9+wG4MgYbVNtVMwpODZJjWWsahUSiD160IGFKoWMBc+zAC4f1wrS5NIdPtAZGYbIQznsW7PS8hJ6vgxH9h51675RxhgFnN1K9qLMXQYCSGXy+nQt+F4uXN8k2AnNao2nGcblZdlD1vbSbzlbvvW2Jo9nX9Jh1bZSd9hPYUIxMQeGl6LItx5bKeat8aPykVldzgArW0FElFtXmsIwCMmslkzpTWj3oTpMKUIyrYTR9cS8T8SQo5P+L4gg7qyahLHU0AFkh4aJgepmUFZnqfgYtcCgU2ZmgZ0GKxU2kIMYo3D5dUdOYKbSkkvqvrJFLlY15PhLvRPEuKWLq+LIMWS+J9dwa+bErMr8InAFpIxRLV05VH7GsK83MHqtYh0PcCjtOabRPPqGBxDVVdkpQ5Xi2XlwVvRBZKvpG4H0U+yDJAvPiegWqtIdrUP6R4MEOBPGwtOVVDp8WECGI+xMJgGZWV2PVvfcTTgt6jqMWHr8MpmW2mF33sYHLx6zlMr9QxaFfnat4136xkykRKPizHO+4/133P/Q/Ve8/xP3f+LlL8Tvcfvj65cfX3768fXb/cvP8e2rRnCEjWuf+0rX6yizOa8P12GPVarOjgvuJMFhleiB9Wxybf4CQHSsToooJ8TlNnZwpugdFUZ1G2BLVETwMAIjSWCWxbG00tZBtaPxbApKukn2tt6L+T2t6tqMJ21YunjU+uCB7W7fXCn/zU8TdqJkPj7o4r/XfXICNHgfNXckuI1qNEsLomdHXJm7D4zdi6PyUod1153SyjZIZCyFvhWXi2r1eK3frtdOErgW87JkKUkOi636SIIcjBFKHkcgxBtjIA7RxxmIEVLEEXS+pXli61WXGOvM+KHgALjXVxhvp3SORoyt9clrpqVAbALySfEVYstpMGdgdWNxsoT1j4ZnITBngpfffdHeyoFey2rg2tjQsSSrpCsjuPHZPGAuJ8tig+mEQlJjHHY3LYHrEEG0jrsNuIf9b6/tIFwuRn6m2316Pa4n13MfKV/SfMrvetIJqt9tf6bABQ/KoZgYgXkwDkWsajf7DbsazFVgFaENHEQqEBmEvn//7vR3Wtv6YPlc0+lDsLQl7KZ4/9D/3FlEMMAYQlaVjvNGkqvNZwR5FurAw9Km2Q+5emz2QtjkoBiqPoO9O6071lH0X7WnZ2cXSwmLsgNEXjp9rX87tj9ysL5JDynQFapYc7+esvGQ/U5NZpcq79e5qYnYKJaBleO3jl2xMuCJqhdH2t/Zn95UimtBotIHugoy7RPb93SfHaIC8NvJ+vySq6KdHiMZEhqAukLscZD/xRHb1v9iyAAWQijD8cNZbogtct5onA1Kv9HztZ77HLdRjcGPY3ga2L9fhH9v8R+Vp0GKmDQ7i/LQE2ch3AVYrvpRiXUJnx6XDrMcWCl24zQyjL7zXjQYzvWkOCkGx9SEDhDAKA1GNrQAZ7aUpwp2RmxaYBKsKtw5yS4AD8oqpfkwFNUnyL+qAlkM2e8rFmCMPOsQ7JyI4Ki61RhUuKPwTTlRAlxmbxNO6LcJFAB4VHX2FXwbzuRBxMERCLfZgp1guE9JbjPkjRzNTMsYCwJHS7IwpFlveXiloEjntlaeyLi05LgD01t1NdsCUC53k6ZN4HLYAO0bqDMGIbr0/2Yr0P8jpfFX8y/nAlb7aFMeEaVi1pQPaLiDZXIqJ5ihO3myOO9I+xJEIJNu3HbV3vXAe+5RfAuAdsG2s2M02XB/zX9/MrjBhxkERs46w7t0x/tfuP+O83fkb+BfOP683d75+v3t6/3bL/evP59vX+8vb5OHYxcxrf1AZECnkEDnyCFliJIkeAgnGVKQQdHAdujWlKWgRCnKBGQcQJKMBXPQe6qlHLLqM7JdZEb3WgcZ5LjFGMPlvyXHlxLLRTG1uuUBLd63FQqYGIpJAFE+1IfA5QdeG/t7S5VZkurj7rh75Pr+dWXOnMbi4IdPl866Rt7HSisBYNf+S/2tm8S6R5X6es39rDIA6lf7iNn2ElDViGMESQO/oMXzYv27YMBSr2n4o2si9hCvJe3lIgG35nVMNyLAGIMxhhCJsLsx23lNmhMdNffWj3c5dDHQC9DzWr2CdTQTuFYvKQgJbm3CZM/KFrYum2DsQXRi7ObVZgQ+JO8pqBRGMKrsoZCFlJmrvYGAcrC4fKLRAy/rxU+Irttew5tC8/luuO4fBiljgIMjpGDBoUQ0WnttBwcJF/ApKxL1cYv/zbVT71IU/r2ysil2Vg58KmOdTWjX8T9/aC0CL4PcFIUYGAfiKP/aloClSs4RI4c9eDR+0ZLdqa4tLCQrEkRYgcaAfcHFRpZP4frnE/bAx4UCMKo9RToN11+rYRAkDgapLkfJmSfcCPry+WbEcqOKbCAUxw0ykxpjFMhYN7ZGBY5stvnmckGKAHWteekOABjL39zPMmK3M+A3QOzHCaJ4RWedlQvM3MDz1VrhjST6h636b3RSUn77mofcHKFBqIwyZM7XsvWZkPZxth/hUlKLrmoHo0McBu8qRohVfA10TG/0PctkWmLOvBFOc9XlG5OkmdP9mwk0YNGHEfqtUFrlaE/O9h0LM80lIB6mvJfCLP7v87qd3XquXRWXx2qrbawSk3RCymW3Z2oV+u17uu/scjSApj001ClQeVWlLT3+OgAcCAJDXR0CtQOn73dFHegM8ABOdnorMkvxs86hs4oCIpCG6HbtW5b2GVuWOVyDA8qQcSHCUXMAQIqDXcsyxiHfB2yDQ5k6MKLiDcBJEeEMe581RSSrO0IXM2W2uu+BFM++spkc+49gVX74MKsw0iJiLJDDkv6lQgGYuCMMpTFktwOtjht94EBY4NX+5Sk4o1qlrnWoq8LlWaqUaTMQLwDQXSfkQCMA6+imXw4Wgzsz31HNBYbbgvqO7dRq475WEHdN0sd/8NLIObtpbERQMfOEJE4OCfdVjeCc2SALa44ZHCtGAUSmyzVcRDTlMkBIVe9bwNqWPrYYp7ZzuEgfO4dczMhJAix9ew8p4HIa7eenivoAbJjWqHgXCFA4nK8678CJ/I78jvMP3H8Ffov4M8bv5G9vX34cL3++/fTjp5/m1295vMwY75Jm3qTAMLs3hxhSBpjlcAqf/jrlOKCTsI/2roZ9jXGsjM6dl1VQqHJ6RsLmsnPQsXEnXixWAJKiOMFMW+xxIG4HY1RgVYqhiho96CslU/fF3LwdlUK9fXnP7gWqDjvp3sXjgwS5tubp7z7xKE4pSExByUymMk/NU1UMIADMmZCTWUKY5jRWRCgkneNOGpS3rCaU7ySQsxMhUpjWLRWgy+YITMhML1kOkGZfjhzqYRPIsRoMtUcng1EprVnm2LUCeU539nEOz1IBi0n1N9Upnr3VREXbvaVivLhrAWKIo57MYLcydNfgFVKwDFuy2BWZRQ9jmHKrU3179QJV9Fx+vyqlvTxn1/jDNoNTa0DGlke+JzhJUkKBapMpQ1LaX5ECOOJA2KdbeH9zzjnn6PiSKc9rm+nS5QdaQsvm9f2NsJmBCCpcL0Gw2snMnGPRZsbCDuoZXWTtiEpvUDgD3DF2h0c+pfxadndpTVlCBiI1r6rrDwxtqUbb3fB8MQumSkAkNYo9q6a4fN/GHRCm6/bTdSVxcAzwiHiZvInDXeHdD24qY1qVVvMJBo4EMoTJ4+WW51wgnrXgVVY7NekkL+8aAYWWkGpKI8mJFWZ5wCXLVa67qWsMHWSEKurPmN1caa2KLTNYwSiKfdoRkZyZwQIvtg2vrmHITG1qGFojFCDlcgsQsK3okNF0skN7r8jR2TiVuLLmKMnF8zVTA0RicIuLri3e8e9Z3Y4cgc8Eh4EMHKgABMYW+uGWkteGQK2JpxOxaCS6aCqVnLbR227sw+/c3y4x34v0UPC+bZfQI6/NV0f2VO2WhWnbu+LnpU1XJolti0UqU5mJUYmB0eEdj/aT7nLYjv8usHgty/MLAD3a7W7e0r5zKbh2H7hEvvQZ7emgkjqE5k33dmSmEWuGNPGgrdX9+ckJf7h6eEVgWbBoMBjAkXm0lxCkRVYAulIjhJV0Tg5lw52aje7F2v5Xq18lSxkYAEYa2n7aMB8qTd4xAQlZ+kmCjbU0u2MaXPVLUqPNnfAN0i2UbZLab22fOGgaDgY5tuZAJ6rjdDXs9TaUPXMmMB0fmL03SyZPS9awc7tS67LrJhiZCE1jLbN0dFReANJt0yaChlmI8g9DIlcVwRKTHXjd3XJAeaPYqi13trhsAWWltiJZqBSs5e74mTQy82zmBZT4RHc67Bx0952aqCH5hJR/RRiYBI8NByAyZchASakkVEwqp8QYBxQNspZ0Troy4vDZEF3IomrGllfj9Y3qKiWzL++jQEDducKltOxdRvdbvOyImVPAC2lVOMDT9ipcwDIdWAFzHvM+5o+c7+f5G+Yf0B8Yv8fx27j9+vr65/H6++3lj7cv968/6fWLbjyHMtKFgwPjKIz/zOo+kUeQZv6ZOV0jTYgIHvfJnCAm5bPHMW7S3T3BU1mcUc4zCcBJYiPYKFJijGNCY6YbhEBQqNLmpAOIQHLecWYk4hhvP43jLcgDc4wZFPAykaGpypkXtHlBdjdNkW5WatEl+UqNazquGgYnOKFDMGM55BykkNQuc5//ncNV83V1IEsTSkjz/CEJSnvQuizfzCK9+EXLTU5wozk2LpBnV4XiZIXHShvJOSMk5Mz7eY5bHATmqcGIeCHukJSaOYdNsBJNtUoTIMbQwuFWWZcS5RCjv67A2JxQWjjWqFKByInzngOlY7H4ZpAYUAIvh7F0B8eBGBkjxnAzwAnKaFZh7TMNAD6FgoonNZPkEcPQ2V4OAfLAHCENVg9huR0zozQo2w1gtQTWYZh552IXOrXxpi3tGMcIHtVPLzVGdEc2dU+dIcejq/6o7Mmg1QnHG8OE01iuzdkKDoFWoweooCpBOeacMzOQ4xhNfl5WyxFzPh0Mo2+BBeCoqRiHRSaQGBNqtA2wm7waS1zdK6OqNSwUAQ6MYJzdI7tsNuI2rOodsjdniogjYjCQurlpAAfJc97HGOM4NsxHAgjNpVics6DZJVWqjnXHwyDDEmerX8NhpeRgq0GLxmYaOyQyDYv1Qr4SB+MljrvtNOB9dDjmPE8ikbOAyDCAVFDniWB1H9HsXMgJBJFlZzlWCQk4z6oCF4ydUof3xYF0L/Js8KGIec8ZSKczADyG8pxz2uOCTMzkUAwKmMoKyJffx82cRWiMWAWjw+4tDgBHDElCqlmNsynnvDuvwCWL4khvB6fxtaRCF5iQlEMhMSLiGFCktyB4nlkFiBE4EDllB9w85QRmpKiICB6SzrxqCrDqkXChBsNkzWK2xzhUrjIrCh5l3F5v88wsRTqmTJQYBdAnkrfbKwC3y3C8wjE5K+gioTldxRNGuPYNAz41gNUMdlVmRKnvHt6stQwQ7ddXs2xrnfE+735Blq1m7cxVE4sFSRKCdKHWcurViYw4EJmZU3Mis6oMUU4TWRFuI6Bi7Ux7UIIRY3m17Fu2CVrKSdKWu0BR2V4VoKIMbp/HEezFjIh2GBE0rmJJI52zIciQc8UwL8dBm8Fwh5bc/fwOJiEAvM+qynAygwDGiIijSwuKX0QpZM7+WxI+CFYxLoCqn0WJHY4AZ8cgbE/2CHjFw1WmKDCIdftRn3BFya5yq3JfLEjf5yvECm4kWzFEJzWW4HH6UDnihNle4YTK0reZ+5AMKFXqE0qHuHLNWe7auXyRbbJlBRm3cpAaW5EFs+GAatsqrUMXt71cnnZAlEOpdxoAKsdp8/H0mB+QHToqtCx9lmK0vmIRYcHDopfa4g9mZW1u1gFeWbiCUcb18P01hfWoLPrycRb3ohxbibKgJBsFADFkce09tdFA8AoFaJ//x0vV3g600duk3kOyG7i8tDJyFMryLobAec85x/yu8/08/8j5J+I79C/gT8Tv4/bH7e2P169/vHz589vXeXt9//KG4zYruWzfEAWZwYMU3JjOYQ+5Rqr5jBAxyBk8ImTPTzVgWrNygo2RUtMdM4xaZZwoM/XE2GkE16yFStPHBKe7eCMC44jjGGMcg4OznpN2vXwCm7z5LWpUF+PddP6nkReDKF4zVFj0ukjlbx50bWo7lezAlwRNZYZZbU6tTslFhGblheq9DcbBkixz4mmE7YFGmZrZ8C/1q8ws5gDXCEVyduBfiUQX08uqrvXLbSqtojUjddVgNdviUvqXFF/8IeIYW7KbNlflCh4SHDEUt8ThdF3GSNdoMJymKtpLWUmdywX+vAELckCdtozuZ/Tg5+ZaXnZWND9sbvbh7cL+gCJtFSMLxW9JjCsXJYhON+3KRiDDrtMq02TmvIiQuZp/99INPZJZ+1qep9xfEwpoyGFFS5Sgw2elhahimdth888LrXLWEmzZU9bMlpv7aSuXdDAdlosnRIGhgDVAl1Dp45i3W9WYPh4fCQkdQjU8E31/e2Ae08prXlYKLCdJjuAY46bxmgwwyIPjdQCaQU1BbnV3hC1bn8YBTEU5rzIbQ09TUlRyVDXyW079TSCWF9znYm7e0w3JR/t8sz1GEQFNVKqlArQPWw/8qYV8Efseo7hWWNtq79zPnKzjVIMkYqAIb5XhViaVUpUPjLFYp3+SfTDk5vJAiLmJy30rzVgSq3elYLQSYGnNWOodH/8JCTGguTxiXW2TLAstYsUzn6/t7A9IDmoJIU3FyuEDrIP1ob50s3Z9ArHy4mjtovWybALMTSIX4t+2xSGRXZK0JYxJEiK63XvaFSa06yrzsVSMNuZ1YC/CaRrbl31jzmu0fuiqS5wyaG6lFTmxp6Q8WQu9OqmZXwEloLvVmtoERS+GCgwhYsXQ1v37Pgaf+Hy7xP68Qwzl/kdvlRdan/66X5uL9cOBSmUTy8PQykGxEq4fVoCgqn79qX0tsc5WP2up/g9XLSU6Bc2v4bhB+793SERZaE+s+z9MbHvZc+6NX6eqWquhrV7FLG/tdYeuhYrOm6ygPBY91n1KdLlAyHkIHxl0SMuDv3HArClRDzsyP1H0HvTv9aIsnarzruSEp195jPubjvZl7dQn9UnYTsvjRD7RJyT1Yi4FvnLOApt5UopX+R4ef/54Tz1uaqw6gbMBrf1fAGmdoQW2xJN0++57+f5RxyCSyqmcmn/m/Q+df+D8HfkrXn7H+B3j+3j98fLl+9u392/f7q9f8fUNcegYGWNCU0DyMJ9rgi8aQWnwNfRFtixeOQPgIBg0rq2QmdY+XPbrRBNgQSA8X4qxSlNWcza2oeNKpYLgiJbmY4y4HeNljNtws0E07OlGHovXPCrN8wGKRyVIdjrZiJCteV3c9VGUXjzkk6mVeiep0HvcmpgpbiBq6+eP6Aqf3O2ayybUC/wH7VBrgcJ+/jIA3NianxsqFWsu/th3e5r8Wg8A3MEQNzOgL/tbFBgtgdgUf20QAIyDcZAhf6qHE7T8bAKWlvy8R39zlcqFhxZBax9bkFwjcQQQWa6QsX2/VMvOaGGbQ6q0rlp3SyqzT5eFNTJjazKtm9YeySbLcJBSzhuV5+oCgIuFkBQGYqzglBorEAVTJqmav/Uk3biaNdXHlfHflNs7TmG2FvisSSTNhm2WPCi7JNsn4gKkVtxVHoO1Z0+k3RWDrRCjmPOnfNhEb/5p1WH/+/xlrRc9nWMcx3FGaARnjDEYrxjHnHfNOzlAzRXCF5zlSg5zJpXzuCIkXVLaGk/bAK5velrAzDxVnbDXRw8ntALl1v4Pl/xGlMzdyJWFQ/VoSpHsYEi5zy7q6nx0P2yRgKMTBY3hIXUXWAAZ9jX0g6PqFUFmq+omuHqoClFbqWkwPhP5Q1WGqYJL+6/w1SN/ZilcVbV0ZSL1cdtVWF/W6JOVHKgFQ/TAQLPVCae4NBnSfRAvklvL5X+xVVX7aSIAhPW3tKMdjzTMYl9ZsxINxF0RVEyuCj2svOAnXm/gajn2VbHKKZNdW8q2ppYe+PHIXDxttSdXIfpfbLVXyTRc2cvAUmM8o3VztunyUa0y+k00gqUkN6wFH2an5SVBK5gN4e8E9Px4ZwwICiR0fCpu/70AYOf47vfdp+Rn7FZI/+o6fG21b+r+tcoPekCJUhKrH9Bnw9NH1XAR38P4Hz7lB/64WMnzb5bIatWtXtcGsaF8lx3yTIXPw3q8Fn2sB6zBPJCLPqjgfL5ffeGDf04bFTYFf9zrT5wN/8X1b1b+w2gf2QGu/7syaktbYqsJKj53MZSLGfFaa5DlzvALR3sE4KokgQp8yQXGIhATmNH+OEo5J4F5vkMn5l+YvyN/BX5H/I74J+J/4vbn8aovX+bbt/zy7fz2TS8vGcd7cIKnnftdIzoEl1cO4wMUoiBae/P2Stl8b847bAZouuGwhQGuSktLCrVHh4kggxxgAI0rviHQq4UqUPFM0Rh4dCNTjhsxIo4yBHh8oIrna22rlqzeHCpNvdeOP/12XeKDy5FtKf3dc/tsCkCpDk7Mn1f54D623QD4wGeaRPvv4yjVtHeZpc3rbVckAER8emS84/vJ3WnY7zTix+f89uO6rWP7hBx/fYFAeWHKsUISCAYUVcwoCYzFSz/K6cVzFq9+PnqP499n1HKu8fuLcZKdQe5/+yO6Ocr+c7BDl89zr6Ln+uZanIpJro1eo73EbfNyT6cD7gRyAfn3RPtrGsIVitmG50CN1yEArex/OyavPd3cXqt979OM+qkeZy3vkvf7oxfNr7N2ObtQXkJiYTaw+cMnfpmLVLQZAP14koYJ2iWFAT1D+3r2KRsxbq/S+xxldEkziKmWotGAVJlZiVxrkQNE6gQDmk71aeXsmvuck4+XhzFnRQOeSoya03m9rl0bERE2J4b4cGCvSdX7m65WK3A9YqcHfrCZ6zaRndMFwWF8m7BODCaEeQqRK1DfzLAz8ccROKdj3pV6Z0JxfoRa88jLMNvitJabT4cXj+cXj9pFv3jkJxI/tCv2fmIHflhsFkBW7511Z/JZAV0ksV4HLp5zPX0pXLriWZk2mjZiQDUeBZ7duEBpR48s4pKM+97hgxR4Ov6Ph+LhWuuwzn5jtT0qP1VcsTGHz5j5fvswmDOv1f50Mf277Kqq/g7n5s61nHtijwVu+kH6rXt2rtW1MbGIuxPJiDWpFS/u1JWdvpuzuYC1nEFPy+RcyT5I/iZUHqtVlrDNYUPC+hjMReWebiPRQMfi7VT1adlybdr7XhyZZKUAadWogpW1iFYoAVfwgfvBq0VBqzVrktcCt1dgLQDamCFZlU7YzrOKTq9z22Fibxc2FZmsUgRs5LUf+J30rzE/rmJ952+ojg/huev9spJ7YuqIZAuS3oJrHQSA+dylsj1DDybN9br0/t0CyUqnu9Y0i35W4KiT0yFAJ0MuH5GkMzmnZuL8Ab1DfwC/Ab8i/oX4A+OfOP77y5cfX7/dvn2Nt6/z9S1fXua43RkuPAkBEcdgjHEEX85qHhMFGqtBMGIaviAkVe8Gu0gTFDSpKV7NtlZUVHlx+cocrj5cYU7trEi1TzQ7yxNVGGMgAqrTJ0EGD0aZEKv8Bm2GPZCBLuJZG/F0YaM0bOr1usnFBpopLLN61A8ffr7fZyOLi4k77bsyrTvIgfb9O8lhPt5wm2PRg7X9RTJVoZXl+l1X9C8yz/aoPaa/rbUiyeiDKDiN5eGgrb/XeHYK981bPMSqqUNhr4CM7F1Ea9sZrGp7T6MGMhIdhCcoDHdliYGtTndx4/7P3HhtaBc7tVK169z90ZCmy73sYyIjKQyzV8rVkXQNfynH9V7P3yHqB8HpFcRD0LLy1B0K12y3co2mIiTlbda1tDJTrXhsI97Wji2uWCmYXRLq9e+95VUDucbW3Iy7YdwmN52ncQkA46B7cy/mz4+UVNyMtkKlFeOadBpQnztukJDOkbIwsFZJWbM0VmEpph+f1U2663KZYOtMRb1OpSCYosQ4bjlfERAiKOYEInGSUp7MhcmT0plMTjs+oi1iqkKNVp6WUtia2qO+pQWBJdk2WBbCvh3LAAAwUHiBBV/jrzk21QvRmyWgEOii0PHZq92FEv5RhVeLEKHI3gbfUkxokmO6sIuDowJvmZJdU17cMHqU27Fe+1Jr0RkdS+tHRy0cNe/YyfO105JfZ4XZnz8qR7Ydskv1IruUMvH4iPYuEsv17gnhkVd+uHRt6bXmbtU+rOmKld3vfAcBXuULGrh6M5cby0pFdYMJALH6rrBkxN5aa1+NnsKD9o+N2PaDjA9EuH9HRXPlYkvK0ClPl1N9dw6mB3vs2djYRvsQqVgsd3tRrK3joBcEpVRSQB1DuCpmBay2jk/XPqzn9/9GEVyTkfSYbbkEvX0brnCo/B+yhG0/MRocyoUPHolDUc8gj08i82nwf2cl/ZuRP99hn1F/dPFERhnh2/WcQGlJWVtloV2frHXBZ4emduhzkfBfTGYtCD+7w/7Ppbt81Ns+vf4rUrluu/3fNaonvhPSCrACJX2AQqLo4dFezKUPfT5I7au4IDeXziNAjLHlhnknBpmZp7OhoUSeup+aE/Md5w/wB/A74l+If2H8xuOvMX59+fL+9cv57ad4+4Lbq24vGpFgRgDVVSuIQzhSQ0YnxBBE3IpfmXGndMW7O88bM5jgFKScwhwUgkopmZq8zDbr60eMId5s5qV9S85uF7ovehe9XJsB16ppRGdMOashIo7NJ6slhj5u+sLa13Z9sjUftP/tXD/cENebDzbGet1/rzclCVNG8c/Le6ctheAB83xj2a21OieriglkXY7tte3C1v7hRHWxd3u1kpqF47qALNTZ1I9HO+Xi99zSwYsWr7m3QN7nXqrRtRSlf2O7T2n/CDCyuHp3NIwhstL+6fr8IEbbny3SN473fFS31mOLFT5OgZDrfoENZBOXyl6YEOjZ0CVRz7szOM+VHN+cBEDrBZsS5i/MeX96Yq12GwDP81oxz8otiCWX98k28vLVrnVnPuSAJuAKk1B1YQsQZzc+wN9fazD+1adsbSHMrB33pFYWmj9hSiHNzIfBY5MsDyNZ/LZib3UC0BO8vimrazQmw8TmICuelSlhxKG44ZgxCy4yzsnjPu/vYqVrk0KmFBBSs7wT9WadRwNr5pyL1ftAjoV92yTR57oS5EyHEQ+klMaOuDqUR+Zdxuu72FFFYNeO9MpcNPbA2T6o1D1U7KD4+xpOKTvZ0nk/VnEBRRyzt1bSrEqjrgZO9xp2C8qsZDZbVhZn1gtrTZZ/I9cGxQeK2ia3mMky8LAUmOWYDzLb37SfxJp+p+uSl/62WCh2LXY7C96vdaAye7rFM9N5WmvJnY2LvXqqtajH8/isrEtVZIONh/fGbWr0tpWwYfHh5D7xxk8/BVBNQT5TAj/lBo4hr6frg8ZKUop0a53N5b2JsDWAPjIoQtL1EaxfdLWqsDlLJR2Ja2v3GTrne1NYzTTX3PxiY9N2SHhvlj+YNCCWSHTTPCHAggERAcYm1Q0hwLRAqfrnkPLKnACW3u3n5ra+S72gnisXebG/3YPT8xjXtq3180fXkWFIioqKBErTpMua7eTL0iHGJf5V2gSA3YxpdWj3wNlXtJ3R7fJOVYXxKlvfdIP9ffrldV26b0/u+SHL2fWhiCTYHenygaA/V/31tB2bPXDpK6XI1t1l1pBXEqttBumhpuKjsVc+HMv1kumWOoGwk0doVFdHi4rrduIkJoA5dVL3nO+YP3C+I9+h7+BfPP7i+JXHv/j6x+31frt9//lbvL3d3r4cxw0xMMJQ60dxJTgOfkuNzEFhDBqUVTLUC93vO9P7eC9fVaY0EzPGJFNKygXrykzNHGQfY+f8lGqiApkt5cazk1qn3fmXUpGlRjWSFSkHxMe4HXEccQsMKuAyxUuv2hWsTb3T7EKlesqelbsratxVkwc+U4TIBsBF+cU2ctoPyBZ6lmGmUqzRAlodoOp9joCD6DDQWFuSrq5pvisVGm8KEeEzqFZDFqnVAIWcCyVgfgw8OhUHGMy5rf+jFH36yeOp2c5mLOUkW0kFoNKI24XvWwdSA8bE5GAciFFtAQF3JcUKwAjd5BXrts2UuI/El9Mtigs9RAYCZnIMw8hRdqtrKS5g662EEjtomNat1Pg/6IRxr7/TuZOgM1EoSZnTCWBTwOQjZ5CUp/e3mOGl59rapVGDVvtkVxVcMShDGQPBMIoLYXOCNIRpItxkND/oBw6ApNWJCoO0hkrTmOvlKsODraxvmpmyKGdTu8v9uc3UCLipzDl4A8u87L0rFO7nWuHL0nRSykPJn0rvr6m4nkKqeradVBIEMRWIMY43HBgEQ3nLmBPxjnlHngACCgkxpuknz1lYvebRI+Ihe7tSCjzEYEGs9KdFn8L+ziUjSv/r6ubWTvp9C4wEvP6Zm3N9+alIdqWaS0McPwkpN+9779RjQqZvANfmOW+bIXWVKoeZd638hFy3Wc7/lIwFo0InkGZBBBZeEuu2qEBHnrg4xmXy5eZW2A3tBx2vM2NTgpOpOI39Wty71Jm5AviLTLJisLNW22tredt4Yu1L8m9HgfDAtWv+KlZ9a0oHmG7GDXR2ic9mazsspaB2tR60GRjVDWnrJtGlt+pEiVQCF0r28gdIq6rhWWtXm5rrcK1PcwUG3drchAWnh/Q3d/uk9Z85pzQ7b3zFwC4D5vq5NoK7Hn05Za6zSUiaXVfV1K461Io9cyQREg5s1+Jii03s137q9iVY/67N5paSoZJTl1WkzuTRJTx6Cy74p/YcWAyvFw8MyKssPe/WkzBYb7aEe8aC2Kfz738rXcz68Sa9W5WsDXwE0rnMj+uebGXoo/h/or/1jCWgtnt+rlJ8Op1FWT2X7f4f1vnpDksvWKvxNEJs6trDrD+sbe/Fw9f6TaKt1LVij5T5OCm1cVofrf9Gp70QBdu0BnmCSZyAw5iT+SPnd+SfmH8ifwB/gd/H+BHjD9z+HC+/HV9+vH45j5f7t5/G68s4biUjSNrYi8r3sG/1gA5bUpL9I9EUb60FjX4QrUBPaBIncpIzMFMncFdm5j3Pc9zGWoe1UKwk0CWeSYp5yW8bHKl09UPYBggwNUg61AAgdYsx4sZqyXf5Tv5uK/UhtPopzTy9/ylBYtH2gzNGH7+GZo5esXq6tMT/fuHxmHwcjx7Tijq1AMCFnNj0XF23FqX1sCd1GGWnVzxCZZH2/s79J5cmvFN7f4H7Ofr7y7l9hTUOkJwlJUK0kTcYN0P+Y2UK11JUp2cbwa2uXKT1kdlezAoPx35nqpVMrwHO5cEQR+puld0avcWxKzgB6NF4YhXrlIO5lmXL/s/uPNBVJ1koZ4/puYsG+KhYA9jyV+ufXfL7zKn8OuL4SDusBtttcidZbXHR6T2XmzMUBmIHoEK02+nhc17aKu/zKfhcdC0FBbFCTPvnS8dZbw6nW3KoXn9+hdJlVQuGnG2PkpxwGPwGHhFhlH1m5jiP8RrnPc93oKDcxrzn8fIOzPt32OXhvRgxgHOe2kreI6JTbi7/gp9eStjc08+4jj8btUJS2C9gSy4257KUmplG19lOevGEq6a177xWcnmfW/8jXG1FsrzZ7CQ3++w68e+UZVK00Q5llmG7Eqgdbum4RLJsdpFzdqyExSW0kwN3p4wArIPFdcK31zslmDkYVUasovPVr8qa40fC2DHKtDVo06O9eRHSphB3sqU8Qb+1tNiq9inQtpFLwQkCmEr243jtftf7N8detBSDe4RkfWevLXkOWTyuz/rJatK8vnD5TC9mbjZ3TZ2b9q9unace4TXluKTe/vRPSlzqn8/gDU8S6mm1UYlS9eYaw1H9jyoVcrss+ZxbrFAK5BhRGDWZe1x4YV+qsi/IwpREFlAql1R4IILyao/1TSXA6nljEvLLWuJ9gJvwWLuyFis2Cxjb13ZZ+HTtkm8d/pylQfor29fY28CGeUEqw62+ejyLyCqku+X7qtoZ2xv0nEXvn1SdZsRVKu4OSA9Hq/DygQIk3WdeSg6v21oRVc4EeAygQxTbGlYrX8vdJk2VLltfzs6a3QmUtCx8iFItI0cuX1tkUH+LlHM5udr/U6aUQTfIU53Zf82ugtQgUHB9USAlBRvgVsqBWYhA3qicPzTfkQkd0Kn8E/M35D+B3xHfGd+lPzG+H6/325fz5dv99Zte3/jy8nIbCqb9PtGLSQ7iYMELHaomTQGks9ys2s2ZmSKDPDLvmMo8wSmd0hnAcUhI5XvmhKbyhDKYY0SeLmuGAwpjjBLeVDVskDR1tjSa97PKBJz4gSkooVswz3mMwDyVU3n/cb///NP/JU8dcbvFMbpkLjNjXCT5xBNNz+WnvOI5dESr+a9PYtH/wk5p0WViMRG3l3aTf1LZbHUSu7+vlJjd6RPV5ZiV3JwC0iLpMWf9iVB9cJye5zLi6HKfRZ910gtB7oFRjDFS53nqy9vLUwxEUs48rjNVnX0M8WkA3Ogzsg9G0oKxeziMvebq80Ay4gAZcUxYG5YPMscRMcgDLN+/PaxOirAu5uhKKqch9jzPOPpUOjoSlQBg3BkVdr7OE2R2A8wxBoE55+126xMXVtMgQTNw2PPmOIUbI9JKVRDJPruBEZQYbg+4KXwMn58xwlqCW30hJ40xLnWEEhLu09pwAJioSqSg+QDcV2FCggwV7XNsAjNEd0RX0itDrsNf/KYId08+ERWBGMaOj9S53BDmEAIJZjp/48p/MH2h3VLl4mU3wcjs1z4I1mGr9CIzBzklALfjmKfxSDU2C4fFfJR591OKAY/SBuwpZ1U8dHNJYHbxKcoY9pcSJEdAh5s/RhyTMRDGmDkjYiCEgRfOCf5ADCCVJ2YiOF7Ha+B8v8X79zv/1J1KDWVgThYggU/bnFNXs2pE8DxPK6kRMUagU9BVx6ZeB3jO+wSOt5fgcZ7pZpPW9X0ZMWDKYUNTQrltzZ1skK18kOUTEay1N9BmUWmIuJ9FD+4LZGy1iAEeU5TrRtq77yODOHgMI2ZWIJSUzlTXcPUYvE1aLiUrA1asVq3dxp0shDfucbmNukoQS/scB0nOs9wcYxBg5qSqcORCWd0A1cZg4z486sooRrx0JvWZlaRS4ncvIes7pQoikhbbQMNQA2IFNebUMsCMuch6YhYaBMr9kgRmJukW4DQuGOm5tx7g0uHl1we2HA21bCvdjFTV2oGofiBj2GyrHNK1BUpyBMC2QwZRGn/Bxo0AY2a653M+oBhdIgB8ll+7gFhEWHLHU3AsY3GAFoKlZzbzgQLS0RJ4v522N56uWAPQp0lRf+Npe1ga3+Lz+//ttekEwFanvw90e/PhV9tH/8VTH5/yQWl4sBHrC9xsBnuugIdQ0ZXs8v/z5e1cm7q24JHjb9Phh5+v162CNN9ZZs/Dl8kHyw3g07P21b6eu5uku2292UWV6L9s5YYIWRofWho9P/GR22F9n3SJayWVidVMTapWUACZwMn8gfyBfEcmTkEn+Dv4K+JX8J8cf47jL/L77eV8/aa3L3r9puNt3l5zDBBlw5Cqujs3LCrpGSX4o7TfzEkx4vJWZCaQnJo5oQRP6ATORB5zSt/JyUzhzjnBVJ4y8m3NNgeXR2ESkXkC4b4nRzAzz5yBbmysSYBIIamE5kBG3omJvEP30IHMW4xb3AYPe4j3fbwWv87CZhB6N7fv7CdoPx3/+0fgU4paV3ZLLEGZZ6Ybu1zFcE+P27OiY8NcwyOXWFe04r4IvSkwP57jENJJDj6VJausuKx46SddFPYlwodDqg/csq56Slnm1VPED60Uz5BA2fE/wBBCYOObtIJ+ASo8s8qPcqUdcg/xgX20uHaZ2MwnSYLd30nHKDrEIQnB4Fqi9g58VtG4ViMzbexMN8Qp87IwdksEVjL84sA1qbK4nFX6xOebk9caP3CbWKN72ntyAAbkvArYqqYnV89utM/IdHhgul4oMjNiRAw8EjtbZb+WpdNv9uevCY6to8qCg8T28ydB7gYa7gNeky9vDypJURfOoBY1EsTDSBVEkHHEuJW/g+QIlTPLuVWD8w6dMc/Ju/IMDMaMIzlnjJuDAJo5JQeR9k1PpTQxcz15Pw7RzXefeM7SSfOcKhARGl+g/1tXtqYKPKK1YBdMjxer78fF/cRNdwVZ3RhrIyT3Bw4AcM88Z5SNChTUuV7jigCmpjJPIa3HusxDmIEpTfZ4yz50ok77uR+rIUqj+3iuLwLL55BRL5ol6icuU7ZD8+lBJR6e0rQ2wNw+cVu+3IYdZ+eRHUBWcTqo0jb0J0JkKcf71BqViDkLAlhSu8kepZIeDgueKKrn9NRr4lqHDxploz+xdMR9VCrw04c796sdxejKatvx/vetweMmrhfP59SOakI4oWgQlut6TAEiwE+q/mp1GVnzmnLN1wec/qchPt+HIcD13RqlPAEGif70+9fruQtsH13z/09sEAL4YGFwY4Vds7P/uM5wvwRkR3O4cMfqatB58KXq2TOz7hK8fqs1u0o33ouYFbsm/WG9A04ki4uGrqFy2MgGkKxjUU3ktoFs9vWOx3odRYzoxhh9xi6B8aBwt/trrwnxIv47RW3d4emktWR8CP77H+yuDmx3nYAd1qrSyXxe+DQfuGBKJoyilryavKaATJ3CD+QPzL+Q79CJE4gT8Sf4L4z/xfHbOH6P468vX/Tyqrdv8eXrcbwmbxljwiArVSeq6isD0fCsFjPVZ2A2NlQdcza3sEwIM76CKz2Zd9BNbU9VYcDZ7L4aFChKQpAkMuEo26R7jpRSQmhiziCkKc3VbYdIMpknMwPBOYU78oTEmUeMY4yIIxqrHXTW6X44c/MCXXmWT6Ky2NCjpOEmY2o3/TqIiiZt1cePLgNuvDgzDzuF2/9nyqm2adsw4tE2jgjk1ViPFaa7noKNVkd1EF/S4hOeZufUeZ4j4qGCyLciugotbDEGhspj+7A4T3L06eqDSUBKQwlFG2m0FycvPY9Ke7Qjqvr8stKFqraal3EcH22A/Z+7iPIacmMXpd1uyGMV711R/ZwkxAZzy4SUE5IGA4VWofovhZzRwhySjS5ndBQs/n3aQVzqyUoxVUp5t+7nczIG2l+lhhiPz3xppebOsgxXibZKZ8ll1WsFReGiVSdqEwAH3ZMIFnNW2Qvk3AoxSckh9EwH5kiumhZcSobbpk4hSzcvG9Kj0tJimw4VRkO/Elx2u7djuQ/qwmKRDxmV6+SWsc+ExiqTub5m+OCIHBF6pc7SX8bBqCahAR3jmOe78h00HUbqjjhizON4oWYqJ1I5pWqEx22DKs5xnkvz+/h3ZWVsCWMnSTjHQ9OgxrPqYEimMfgR5AhVmUpLjZ1fVWMvrZkLIUySaizOJlUCUIzLMwfUMaweXTXgpRvUU9iBi92JGVKi0NvsKtq6JfYjAZ/fiyDXyLOaq5YYLDFZxZbofB5rekXikNTp+l5/h5qBh3yeHmHl4KFPz6Pfh4ZMNM/0koylyKq7cGjLpVEXcHmy1fWMUxIyspJmiNH6UHOtiWmryxo/mvHMcscnoZnJbllwd3xPBNgKdyzd3BpOlerw2SBcK7yiBw8feVblidi+3ITS9Anyak2z39mVCdH+govxPsjW2CzV5ztcyWxYqaTdNFaonP/qK+XxTzbWQU2h5hCx3uhbP/CIR4qtnQNL370sP9RS+v/x/79r2wBn3/6NAdFiadM8rtdPL/5ODLMv/2uhWVswlXDaGVPElQKUz2T0RDr/PiCxzvbTD/36qox5shDicV5/8+inWS/F+tOv4d8cCT4v3VpzPar+l+6+mc5LEyS71ucRNnsf2D62feRFo6Q0Q0ciMc/OrkzkqZykkO853zH/QP6F/At8R94RgWMi/ojxW4x/jdvvt5c/x+3953+83F7w8povLyePyZgTZyAZg2r/XxlLK2ne/83WHHykD0lOgCE6/2oxayooShMndSKTuLNaEVX5Hgv3bWVdBCkwBjiVhlOEK+osjpQHW1BIQiKnMMM3zHfOJIjzLnxHTujGed4YQ+NwDQNWvYGdnD3mEswP4c5PSeXjp/vGCZdGsrK0n/jGJ5QGyD5KPBiuTzW4l2LEJiyfl0wXFNanVZl/qRFu57dh3tnSXwGfGsgy2Ou2cxKI4ChcjKiCAVd6brAJLPHwkNO5ZtcCbGk/u2OsAvqVWxwFFu4MVD/UFqB9jRKlykh2vXjFwVzRZ0RL0UnFK5aIfvQq47726wFu5VL3+2sPHrWHkxsDjpCzmK/v5gRctE27po9MzYlcALjX0i2h6GXch7ePU/YNH2Plzua2qouG1/U0YOf+PPHGJ0FLesNtcp5l4CGkPIWRBEWMZmvlGweAqP5xEZHW0YOheHLyXauxK4vbauzktzaiG6VbQXlAFn/Qz0q9mFWwuITGI/DDuq2qgsWQ8x32J8UR40YlD2U2vkIMhRsD254rbIZJgHNiQhgIcTAGx43jjLwnWfq/AmPoSin3Bl3jeRTlnxwidRkWkzMTmgZJRpH9JjJ6SVeGxHrKftt96WyjbQflA7dSJ6D2oS80w+UulMGJTiWd7GQOnRcPdPbPLP5f85rZ50aa9b6yUceSYAGV1t/roF08cjvdu3T+eO1sB1h49vXZ+kLfv6zIHv9Yhti1X2REuM/Dx3KCykApzeyZk0vAzFmMj6wExlVFQ5WN1v0ikOp0IyCDUuZyzjRTfVAknuY+Yknzv10cPWuVS0OOpy9r+0n91XXAOyH2It1e9u20xjPBf0p7fpTFwV6xPSrDipLzi55/2RGA8olfmPGyclNRA26aZAIFeF/vLRgHtg7EBxOCpJO7K8U72NbRsguewPqeZ7cvhO94vXaCn79XZ3lPYAgs9wvQXO4K03AZ0LsvpG1bldOlCbR0ilL7PRARastnXyayC3z/XssvEgc+tWFKfygduSUlH2ffOBJaP+kf/53qvz36b3W4dW088SLK9RHwDDa0qDVir52qF9WQec+z7p9lH3K1MWA26hi5iAnFc4C+XmxHBBEnMpEnkFGhkRPI0Jn5Pd3QV78Dd8Q7jhN8xzjH7cfLy5/H6x+31x+vX/J44ddviMgYRJxCOhefTjgndFFvXPUtdDXC5a8BgqPKReasoo81ZlLQBKd0h+7KHzNmaIKO/KZP7iWbAxy2z+usHUTmtM00Cw2z6HRmAlM6gVmAQsqojKOkmPOe+V05MQjNUTlhW2lR7+bGvDbBvNHMAwEUF3ugn32/pOZQS1+MB1rITfDvaF0lwCzbzomqLgiDKvkWRkDnVnHUesyjlf7EZMnbGM4XT3dl0HQLEJ/neOhaYrjuasDt7FKdyAjsiUCPORtR4BDFJNZz1xKVY0kPF5rxuL60RP+z1kurTIXMg5DBBK1WDHd44NR9ZToDZUIJ6hPmu3lGlkxcOpOqpz0LXLGb1+zcINPzfU4nWLosGUYUnzgnpJxjecZX1kRS51xRs2ibd98p3wooz/ms+udwQIgYHGOMgxiTApKZtoxEVxk9u98quSvs+4rYcCc3Oi9u5oMLNNt9pPZaxvSXA5aNvLz8LCNwORGfba1F50Vq4eytsWhS0IQOSMqqPbuK/he7tgf3YD862ifIVsI+kQlswMTSuada6HQ9aK4BMwIROgYnwG5/6IrzctlOERmmp5kYwpi5EKuWuehY1hkRwIDmGJ2Przkn/r+Uvd2aKzmOJGgGuhSnqnp2di/2+/b9n3B3uqvyRMgJ2wsD6HRFZFaPOvtUhEJyp5MgiB+DIe40oNto3x+gRGUtkwAzqyGFi28U2/ZZ41hXsIqB9wJJBNDRbhlsI4BCg9OJZly5wNbplU3A8eXiKQxseJWlWqWqm1XRoqJLQWoYknKecQcKsODv3pjXvvCjZXdci1UvBEylIGqig1Y1AyzBgP29S0UAwAKz1foDG+isuXTkLamIpq/tycxMDhizB0CbxqtVrsnlWuAlqSoupzYzc/rI9EdUWoKpCcBUAajChJTE6mW8zrGyvAmu/hvt2F2R9V1I9p9Xu643OTTCa3ddkrA62j+8fkhdBU77q8Iu21B3x6JV8Y92P5Zo9TsrYejUq2xwZc/Bbm0eVW+0HwKSqmsS+si7QnpsY/r22t64VOS3x/zREv3fff1w959usRu4NWZHHmN8/zCuLXQ50Eu/b0teYA81VhhuBL0+MGKPmPYiAu3AaOmm/8Zjog979mt/IpT1f+2o/cvbx36e8/1A/T4b3z/53QH44b4/fOv+A8vuQ08FWynUDeySrXqApfffF+Jmz63rB5LzKxz1x5TOUEITeuX8PecfOP8XXv8F/gvjhTGDLxy/j19fz4/5/HV+/P31/KWPv/HxPCJmn4iJKvlFxPIqbeVFOb4KMsz4rLL/AFBJEy0XHzkNaWBhFjDpnl86Uy/li/kqpwVAFR1ZuZIX8CihqLgmAWBQqgjwVJaBpjzDJ19OKaOiSmdwYr4ikecn9QrwQXzEcUQMRkSMnfG7NNH64f0k5t2NXPK2x+1+lIr6brz/9f2Y/yZyayQlACGmyeMsTd4oV4faNYCIyNSCRqj3pxnK3jyECgGUIdXvLD6KiwNbArLP2xhVE14zlrZ6c2CIF4rjbcfc5vCHQ2gbGE0xKTj8rxCjWEjqZVbNKHu9JoLB0CLL1xX61eal7JO/ft61IspGqaNk143aclyb7XJ7lohYFhLaMRhj4O15M9EGkLZqcYfJWYNBZsZypADTAhEHVgg/gmVzQDLpfO61IuvRytUMm0rxNgO79lunQ5sL4cZn9UkIFZxseSG9HxGgW19JDSNpnb5JdReL3wSebcUDmDqJh6BUd0SSsaJMJyVLb96+vl9N235up/T9Zef28kZJcWaT0YtygwmNIA7HCZgCIhkKEm61a5wQpInMODIzyXMmWPT/1+0t24S35yhX0hKYecF7thVZBtk1S1UVMFtkymU9dSbxp0FGJn5CMve83cNkiu8lPa0f0Lm1yxqDo85wuHSCBylyXGxf/ezo+HTOU12rUOYiGm2/qH5yqqD5xLTH8oOS3MT1ejO36HXLbQ3j7cheWx5r8g2x47Ucfq0+vmpDuXelf5z7AK6ft165N0tts5q0POTREOJrj7B8gKYGkeS5qqBDeczKlHO/u0aqW9S9/tQg2w+FN2vQe89nQrv0ns/+oXbPVbhCspyT2/xcN7qO2jVd39wFL9/32oB9hns1XRLQZ2XDZvfnPd6PH1aEud43O4dPjN2sdHAl9mqn7TG+DagM2Z/IMbfX5ZpcvDvfHgxAe8xtMTbfR2A4yE+yGkghRUT1IpBLJf/s3uzwrDbrf0sdsmkJeoRoDFl9cAQDMsNxwV7RB8NfztI9c0SAVZm+hOd2XC36v+2A1LeLb3e5Thlch8QlKGtuF93QPufeX3GlPW6v7ypmv/ubTvEf7AZ4vyjeVzr72Vc9y35O+nYR0bnHm8lCZeLlTro5vzQ/pyZ0Eqde/4L+QP4X9E/w94jzMSafr+f/+Dp+vX79jc+/63gqnhqHGJmrqYrz43KKPQCmA3MGtiqEAYQwdLdn3UR2nlsBVlIsd0KZ3apkStMFCcJMTG7c05VgYVaIcj0sqqDRLUJp/EoggcyZ58ka8QxJOE1BA53ExDyZETlBHUGN4+N5HDEeMQaPiOpbjMb/LMW6OGru0nVPAf1JcnmpQmwqCXfRzcWF/S3iskTU1DSbdMkukrEKoytVbCRoodG+QYBIizqXL+H4Xm20KrLDcifMVkNArqttJ4CklGWexiaZ1wFc4mC6+nVOfJ+fNZP7JFfFh583arS3yS+3JzAiGGZlKgOCXBTgVhzrHirPLtYddz2gRSu5hfPLDuvAPO5fdJAvm7Bre6y1j+TYWyYicJ5n28Fbdd317wSISaiKrzUd4bNcJ7rat+5RpgmGKdHarJjFFzorWwQFzDCn7QlK9uKSz1Q1XbgdRbuu0wpM2CGRsdqsiLDUy43tXwpGB/lPQYZmEcBkLtTHbYv52z0/sIfk6zUoOkia3WjFomTrp9sD73p+B+C9PZEvLyJsLXjHKbXS9uoKBO+NCCUDoxPVByxmjtMOBjLHA6lDwjHPHJqBHCmzMkuCgqEoNsIgwEBoddmT9mJfvzKL6f2+C7zPXI7FYxzKMecUFPGD9S+nnVPAvCoM197a3ljpMpJRqOmrNDk73FmRPYKg0gdEz6s1Xlbk2z/DIuv0oGXIfmwA3w5aVmzlpjqkSY5qBlejqg/v+nN2xikiqoDTyK7WBVwZyBbsDYLo4pt80/8WNW1hwfbTLvUkXnH9JXuok715fpQy3ZDfs80mda7JVSmDM51ZyhvZw6Y0DBHckJNy0VFK0NDtVNKCXPYm/vH1ozW7z5JHgGge6M3xga6zJlEQfzZUaQVgMpP3geG6Th0uZW/+ZGV9R45UpigDQPIkSQ6JatIoAnbJkkHyWN4SvPUwVnd0LMv3FnseXv1S3HZey5y7xHZZkddY/8r0Xy9X9/7gke9Tf01YCjsLN0o1vo35v//qM3sYJfl20NaVN1JOrnQwEIEotkl+F537bZzuZ4cU12zdHvztEdhs3//++pfsVs0NCgd7fUCbU2GtGhvf6P6x9yjI+wipClK+FzNvyqKFJ6UIVNrSjekFWSq/L/oEkYpgBLkCIaTMCkdecIs6+/KEfgOfyInzE+dv5G9gKl7Qb/A34p+MP8bj6/E8Hx/J5+//8/96jI/z19/HeCSGhDPzlTrLjnFzIgjKqaQY44OSDWNyQIUQn6cAtUKxVJAcc84I2maShJnJGdDkpAS6J03ZwUQ2lms5pOvIIDuRbX+X2XVR5ZppMBA558zTWiajToXq2U5N6uSU+EqcSSAex/jH8/ifI36N8QzDXqKU62bIhXTiJgYVUe5VWCfBvh2By3suWVrENWiE4moLZQ6SKq3wHHbwr+RHmJkxEFUTKnU5pTIYdrzT+H9/a8V0nQFomfc/qcnqM4O0FR1meb2eUcRgGK07YdoXBDXDTjTJRBaxfdl6nRdejwVxgkNC97leO+hmavDuKZFE29OuSECQCsUgBmKwiDJGQoFIDtO7DUBm27zqBLi0uhf0TZXizUm7H0v9imyizPWn9Ck7E2SmNBRovmvrK1OUstHzgR/umzY+7RV0iPHu/l2DyUoR+JHOChXE4j6QRJ1zSjNnzsxprJGY43kAaM6ZkKZEmBFfQkX0K+pBl3ECkV2M3CvljIdn0vx79adjsGqRSaQrUdxvGI5EITGtPersYIeV+1hRdKdKXrPoWQpEclZaYwmJiGAYJOkAI3F9YCv0zmVtErNgAY4hBAPOpU2UB5lTYYNOJpywjWCLi0EOBarjmQkuGUBMSIiQaf4HeDAyh5CJOMGH4kRQ56UmSCoFuX4myCQ5IiBlkHnR5mZzT84NyrWqVupQExgYx1Gwn6JSnRVPWf/xMijifnqVJRMEqElgXliwcPMHLiHpQmKmGFUDcJ3PJC+MUFmNs4p2BLGqivu5zu2wNdbaDeXShwtdXMGEls8yAffNm0tgloVgygaXZ1jNunSg8T01QutCrYrlavIli9Lag7s27n/JcEhk2uR1gCZ41BhYEX1PQvSDAVh7LDrkv99ri/T2WBxxieJXqGCMx1i4oEQWzrykVDw1R6p9J177rkzty8ry+4vdaH9zk7G4zYAKd0+UYbPvtuvYQkW1GKGp6nTl8Ef7VO4EbQmhosCRwEyvW7RroD5k/7TwtbhnNv0Jq6B7P7ghADyoEFebBteJ12LvxB3s2pHshLtKyy+ihR4fUbkqByTV2PpMU2uU4JRfA/QJ4U3+ypMcxVJmTyCC5ABVrAtgm1OSYti6sRynOkVu7OXgYJcIGKJ7c6GL+Du2U8dyOBiEIqtopic2SyBWJU0Z2OVNzkyMMaBYNXOe6Mz0VqfDiK7FiwN0AcHYmgV7GjvvWUf2KMcx6KjW2uGAa76vTqvrFF+1EKaJjMAYJRlt5S+DQLCFUURwus5XEzetGTNnLdbeiMpUNOSQZDLrM/1MNM1TStChMTGVyWQcLNMYdQhDPo9sa1aoqytObINOSbMaWJUBemBk5nmeOv+A/qn5r5yfwhf0CX4Bv6kvxtd4fHH8i/E5nr8//oG//2M8/jb//h9fx0MxlEzoNLRVNvjRktzRC4mYJ0nGIVUr0Ir5cHQ+MfKyBHE8frlyS8raD8qZr6oGagu4uOFOgBPNOBmNG+iFlTvLNEfSK08d42FalSxgeobPa1BzzjypDEwyA5PQoYHQ5/w9Dygeir//4/h/yP/71+P/PsbfSGlMjOn8KiYyk+UQhJ2a4YMUkBsGY0ZZ7HXPdgYWK3NgRCkjEWSMiDHGYERl7eCzquI3CgGzesGyA6AwnXOUD9QSWDxRrauIQogKcFHnUkyCMipwGU7NV6lKThEaREY1GHJ1qoPCVY9NcgSFCeiEgsgRY86pysNMHz+DUJOT0JoSHMZATPCQtwMHhjGqbgkJap4nEREcB7xHIma26RFVEUQOkAWP5cHRkEMGEIyDPDqEcUVDANPK9MBM51Oxq2FUyZSUOlrrSzrP8oSP48hznnMeRwg4cw72ps7UnBUAow39wiCpezC7H24VkCJG8HFciijcH0RiTigD2VUiVBchGnPduAfnDYvgaqACCXbSNMkR85yZOc9zNg/343iOMTIZYRYYNU0wBeTEOEIIBOZ52k6KClEgEZW+pjvI4vl8zllW6GAsqniSChj3EYw+KnCeZ3Z5YpAc1ShwOYCZpyrsLZOEknAXAnKMGJk5ocFQzIoLLrYJn3YVCIArDwI+c6lySLz9jHkZ4LSjoEzg9M4WEYeyG8CyyGSBZSRhpmq6w389wsSs7RWwT/ZB5eSBQSISkYpAfJ3n4UT7PPP80kydcyrzle7iLdm6FeBAj0/8cDICkJWioJnTpaWPMZZHihHOk+mcGMfj4yD54kxIc+LUMXQEXnJ/xG7elrkiWNaeg+E1TKZilOElZGkX2mQxqS6DRlDCVbNczXmQE4Qjd930PEjila9uXsFUChITi503HaFPozYC6OzPS+WB+5RtrrnLQ6bJk/hqy62cK7VItzxc7qXDKJy23oOj80YzUzFT6SNmlT2oWWvkgisAcLcQOijFSgmhMSc+MmqQgTZgYszaoAAwMZ1ANJSrqFI1Vp1DEuc8FUkBwaHho0+mWpS5k5A6tzgaqlWNVp3x5ZtUwE4LRAvyQpepE2plCNmbrM10/an+jAFCiVkO8ohjoGlgDp/jwhEBuWOsjcYgYALhTgY4nB5OXyKWXeHbVYMrNZvI7qh4rckVfamntkxFJ4IotH2FQ7pqGDbbkf0rbq8bvq2LWrZcwV4baK8MQjjqdb/WNrJb5AkWm58QexbWZfqyIyhXGLifpC0r9M/XQ+030uZVrShk3QuL/uzfvG5XY1KPvLxYvn3gfndHchzbtldoc9OfuTbwGkgI3bz+FhXj+zrtL2+vlK403188yxrhbYH6p1083u5escbGB5eToOtb1w/E6KI96STcGfFasgCzGKmrlsvhtwATiQQ4Dyh1ojprZGZypvJfyP83539ifoIv4AX+ZnzFeMXxeTzPeHzF8Xn87fX3f/Af//E8fmWMF0cygu6pLpdklaWevcGAjhjlyQgkiNEJVyzTvwLEm2AnJKc66sDvnF4Z6RYAiUG46Z43jdOnRrYEOnUoc79HjWc0gzccS2BFogAojSySOEtdZVZTYFuSgzoOxD94/McR/3PEfwR/+Qk9RBk3cRXPxQb+XscliLGa3fbOzEUIZs/kwiHwet1ESEDvt7hvO1Ugo16h/FGTbNcsjbDbvr18m2xXC9nZzecozfK2+ot1XEdm2oXJyJkAklK67+lgZOx69nYj2OgabbKKUCRnudmF1dlCTQ6Z9a6prev9py73DxIjPUaFGHbNBCCG8eZXiYgcINM0Vvw9TZfKseJs3MA/C5nV0PlrkFl5FkVVOyJZNJoKRErRRM19YsLGg+PNd+5RpjvZpaM3Jf3lcuMCFM0le1eCiADtWXXqn+mkXZ7n6fdRLXJLrkZXFtdZVUFzAlIGBpTL0SqqTq/LgnhgBUffJGqT6ptKBKDqA3Ad2AiXZM/KxcztOkvssc4KABKpTKbmqY671Zxvgs4mUy4J3Bh1UDGCYJojvwMb5jESQGj6EA3Vo80NShdrXdDnvgt/Cwl7f/xEUFMOPfIhSpHj8cSZPF8rWK2OSWUqi7kYoAySWUIIYKHDSRpy5ueam/LpomEAYioDE5oCBuhi88SwK5l0xBi5TNvm+OvgvsPvbWQUu6tXVtb2DCho4z1vp2cVL+joWtY1cQKmq188t6AWUq5uW6KcaPEIaqFfQHNAZ2UENfHnWfr6RpcLO/OVSzstJeO8pcisQ7yEvHseLHm7RKvGX29431b6uA3w6JreXsp633z0Oc83psR1j6ihjY5AOaxL4awM1VQW7keZoDMqmU6+yiAYt+izsDb3Oy6luGJrdXwX8vCb4SfHHAFV52MuB+A4ho8MzUQV3ZJssKJfM1PuwOHDsIyj60ad8ysroilGIuKcvYBr+vje++I+VK5ZXJW9JKvhYuGJgLZ0DxFq6AI6O7g/uf+XpGywbCWCtPi+zRfZ3dRqU3lr/jTW73Sif2rLvpmeb1PQf4p1k9YU78/ydnltrtw1gO1Dd89ke7Oie9oHsGZDd1v/x0drFGtHF64x1d+xqhq20VYjmz+57P6+ScH2Z8dyk76BiwBUF/IyPTMtGCBj1JHUftdmFCbHqqvLFVawDK9tsJuNboMnEkSuBoie0muoWcExJPQiMhw0NZ2/vB9fqRfyC3pBL+gEJvSvqf8X+k/oE/wET8QrHjqe8/HU80OPv+nxjOevx/Pv+PiFcSClYPg0s/dOl9NmrooiocLGwBDOTDO7T/FhZVDRRINPMDpxcy1umtHZ6H/LXNNUsFYV/n+cPqShlGIUAQhWARNwnTQElMpFgcMU+7zH8rjWrEpKw1APhmIEx98Rvx7H347n3x7H8xiPiMMwwnQUbRe+JSqFGe3rb6JedtgV1nzfTbu83eT2L0+vy4JZdvkmwIkgeDQwfX0MtWo7fPGHkZBhJGHh35YXuuDsRsc1nPV9Uw/3JLtGmP5un5+SqkAjQorqUdz/j9LzVU3Ga1RsjHu1KyULd+3/xw+6JaRgtEvR1uTduLjYJMpGmVc+M7a1+K45jXFCc/D5tj3JUanzCTd34mimNdQG6B1BRD9InTfK1PBuaJ/F7gSqI/xtBS/h6VHt4gEg5wTwer3Wg9dSxlUQcn24u+q+XWfdpX7oZCNb+66PRVT9CTcB6697Eq7pfzvFlkRJxlLm25+KsaX3vuVznZu3AxEioa2VUi/xuZYRiylcxdTnM4IZJJJn0X36SWMBjRJAxDD1JHpvnxKAreP1D8+4T6NFdxwHNCZZrLtlXc05Z+rMTIctKtEnsVuAZ2bjOqxwUltn2lUkgHFZkaosn0GqQS5rFHAwpB2AxT19O2rvDwXUmZVcZ2E/L1jpGFZI12nQrBA+K+gTUSUj/V1V1ROJSGMRN70d2tw3rH+6mx4kKdxZYrWb2aIhbwqWLLN1rWkJ1VbCu74OYDVakSNHy4Rw7ME9NrLRFSi4n5yh6M8CKITFFSQC4MhXYoHSHQSpUy96hmJIDlzV3SdkbYsgmayYXXdr1xox2vBUmWQkhmnAvP27VKueFFX0svRMtIypTeV6FqxH+BZKrv27HshwhmwxTbkJIK7X5RdW3KFwzqwvSBvJ+FrLS4j0TbegjYSlEBfi6JIEXHvzsBeIf/fSBYJ712K4i9r2dBaUmwa/XfCuLvcnadVw+/z+rR8viG/B6SXZ6/0fo+Ce9G/Df3c2ftpRN5vgioG+647l+f7p4K+74H1a/mTA6/rbOz89/vq5fv1mfu2fd4aheXj6FWYAXGplE6Y6T5vnhpWFuQ2+hlb47xX9SgRyovgnHYKqGnlhwp5Akjx9R6UyX5incGJ+Al/Ab+gP6BN8gSfwT8T/B/wX4jfixMhxzI9feP7ir1/Hx6/42z/i+DiOxxxHZnzOnDGKipjpcLo7ip+QElevK5GpDE0VPs+eAlFllGX6N8bLcPADqPNMSiqzIJ6qowx2gDDIdIWkkMxogrNLUxv4Qxo7XKuZ7g9//CxOIgpNG8yUUE33MIJkgGPE+IX4FePXiI8xPiKevDhkumFKN5j8UQKrIHBpnLtC3F8tD7fDaW0H3r/+doVrFbbz6bvS2H/YP7ne584c0trJ2l4d6k7cobThrP9scLVfaXc3U2OEp0FX7Hx7tPv4vfvoeEgymQYY7iP1OW3DFrjy0ahdF1X2DEpMfxuhCChEmuuToKrTlm7WSjsV6sK+XJ2VN6dxjee6deWVm+6zT8/GUjN7BvytaMZx1/fVAmdGIWXbNATdt06UkMR1lq8VKMXVA7ufoNcg1caiI/+v14skx/WyF/earxWoU7/eLuWxXTjPTSf/+Mny5r5J5mrsVbt1E2OgKhSxHazfXzWAMmyuNzcBJW612jVafX+2n8aPPWgFADMT4rDMkVMMaOpOq7UNRRcF9k+p47cHoVlWlwa7vJTpBMCcM/N0p2Luc+UPLwNvE9S3Jyp2FAU29CRwta0M/1x+QnExQNeqrTv1dL69olO4USnfu5NDUklhyg2htRkJ22oUhGa5b7UH072iAeCy0WcN6W3t7CnPub3T7zaJwq4Vt9nO2+dxm9X1rcxSzdpentu3S5F4W4jbpdQ6jQtl7Vskun2FtjZYy5drZyrAXAqzyYPq9FkQo/vMbD9nypE153A61Wbf0KFMbk9k8WxI/HWd78eNdgtwP4Dynau9L8KeOn37023q+nUB/Xk3oS+J4u2L6LL/nnlxdTasabstMcnVCbjqmXw3BxQAFibND7Qvc3CvcgN4qzBwjLAT8a0lNw3y33A5vr+2jbQZ5d+zEAp0hOPHi+gn4+BNUb7N+NuH3z6wHnChGN7EJWJRk3ONwl81DnXAfBeXuXwbzEUuh+IX2j/TbJVk1TPgJppenWWZIarmQQAS71uXrDqnegerZ2pXZ3rUtQXpRMGKXtau6BhJ8fmgvl7omGILnJBVAGbRGCR8C6WYQAZSeVIFKakyqfmJfAG/wU/wX4g/gH+B9gGWA5DHI58PPJ74m03/v+fjYzyejDERE3xRX9CkHtQKJyTchH1+eWKNuKkHS00g4nGZxZlATCQ5iMPT7MkKViJPpubUGYWHPBPu5zIzElVFErJKggbgyCxZmZYoheKTZhjJkBdH+3Ucojqfvgt26RMXKuBBDsVgDPEJfCCejAdxQLEr97/YovvW2N/cdSJ6769qGL+3KvZ2tWC8P7/d1yYdO8S+LvNdHW8S/sORsKu8LQ1qReT/DyBcY1DW1pJ1T2PH4lguNJU55xnxEKaM7imYSrQ5JBmCkdleRo92j9a0ubieKdslqAMppSpV3oGRRTiYjIX8MUBaRibU46PzUZ52D6qbZGW6AHE3tlhG9gW5Kab5KBNOEGUAVKkStAvRCagpBTAyOPTY1sLVUsluqcIq2JjZyJup09O46j79is3Aqqt5UzYUZInTbPyPjf7jOI7j2K8GnV4Gr66vF27JV09dPp2t6zdpX0J+Hfk2J6sM1G/m22f26S0pzTpldVW0XCfL8nN8XEoNcpByO9ukjgrvJ5SSygrc+sEtUeW2XViIlihJLiI33nICYA5F0XHMnKbPFgqMwZ49y/iFDtp23zU24IojFMXI7VVXUxu77mbSptWatxUmWEwVJXX7pawt+9do4z4zNYHRu1iqvkie/WVRt11VT1GP49269JVnJWxvlb6vWib2ClQpYoGFgKXfnLFsp2ufrp81rlcttlhyn0iU8pzzfV+0PHyXPQBzvtYj+APRLipkWOTmPdaErGQLrxtUPbYlSbHKUXylvLARgFanpq6kX09dpksNksvEYGZGHJNp80EQIkjN2XADsqocJUirxECS4YJCmmPQLEl9XJJdMF3dAmR8lKAo0kjGxUMgle1RtJu7KiiNR5qQi4HhSJtzSkSZPkRzAXi0hTXCvuC1FgxJXRUxPMi3Fby9tvPa08LxDp53//iOJLbA95Mcb59mRxfezuE1xP+9159Y4ezbtKP0J6Lfp/32NJWvWI/94zcv1fxt5O+6spMpfzWA/97LtvvuC659uBso2313tf9+07Xeb2P4Lge7wl2fffsY7/7M29e3revGmfx+U10/o43/PRTkByRsLbR+7g9sq2Am+2x4SR2AdQcKpMCMdMvDU+e/Ui9gwdde0Bf0B/AH+Buw9f9fGF+IL8Tvx+OfHL8fTz4/+PHk48m//dLzGR+/QL6ATE3kyUOkq3Ir2uXw/4k588z5Its2p4CYmJ3+PtGcHioQ05QYJno3cqZ6rE5iWLEizyyWS4lTMteGgEKpEpEVmUphppPgiTEevpMMx6TIIEfj7t+hIL1GTrB6ZlkaUhA4xqExFAQP4SAG9CAf0psPH43s524LSn8mRz+8LPnL4sdlHO8b5Ap7/Pgs2A1TQNVa9dsGbwtjnX9vX98kEOjdyHYAwGu0y7zo6zToxdGjgmDaWMk55+KHUQXkUhJinzEB4CC63qB1WtsXm7E41dYaAeGhSOScCtlzHlRMUoikDf0gRrpEuE9aEatZxJ+9JHc4kidin6U3rXidMcu/LciEYSVlsHrel3XgQr05ipX/upTs2HAQnRmTNKlMIHNyC2m/jWqXHC/TeW69GjYBMOzHPsD64rUWm/x8PyPeZuntnfsnYxk396/cXFCZkXNjZrRJCgEK0uypRWcFwBSi2/Bcs24Ncl25kPHYHhDXblr3WjK25J8knXDZnBltmD9RxKxaHgPLNCvosJ+/gDDHliBZ94WNfkmYrm9es5cgx9H9tkqThjtU1SC/u/eX6657DJu86UCpSKig/j8XSVU9iLDol2H0yLXKynRjn2yzT4sjcR2Cy7su69/tw+1eNjBD1romRrowST1pl8N8WynvJ6mJ82vcLgbYHjEgqLPTOcW43EVsAoCfXu1yvPu026rdR1Vep7fbNSdOlC9nZCU/Owd4XbMhZAFDS1tF6b5qwIoUreu4zfZqFZJcKNPlEHK/UXklrB0nTHFcOW0IQjcMLLduf9J07UDixoi6S9fdFBU6X0H6ARcAf1GmhpZz4ijqzT1ePkDPBvUm3loFUd8sOvQXbg7qNxr37CbrwK0GwLriWLW8dBp3bT5uj0uAhSnwKWC/LiN0lyTKjPsAENgqOxVQVcxz4QgbK1IUECYmkvDt2LpsTQ9JrcHqrLqZ13+m0Pv97Sz5S/OePxnN7PTF9/NpXuUXN3TQ/sn9AKt/tzFE/da9doAOu9fcJiSdfBtAbiV6N05U+ECuWfrxMEuxWBWkUiohxm2cxbBU6ezdmi+dTPbGHr3Ja13aj1yZpWaRM1DYGzLrLCFNQzahqfySTukT+pfwBQnmRIsT+gPxG/gn+AfGHxi/Mf41jvPxxHh8HeOP8fj6eI6Pj/F4KCIfz9fjMUZ8dU+uhJI5GArK4DulpClMIqkT+WJEKXQbMqxSJPNq2IRTZTqccUqAGrUjJDXF3qSTB7Z1wkUME6xG8MWYRRmKJAKadXCJxjwCsK9OrCJJIWu+5ILFS07qPwAVylIhkxgBBiIQSIRwBA7wEXy8c+8W/ff1WseG2oAD6jzZ3QLeTMlgR7uDB1AsvWYSsmC6JmTPaCUxHAG6Iy9GuxDlam92M0kXaXFzA9Y20bcwwTXCkm2sIKzxYMXWgrI5+in6yv2kJOecY5lfzMzEdL0KjqO48Ga+oJCOtpsDxXgC9A6XdEWJ4BTS6H5Pa2kHI6CRzhza1RwBDGJkJ8RtkcixEoU1vB9jHWYyfiibVupukWTmsZngimtxl6ZdPy/8MclxkKf3BTJfeTIGMCKOgwuR0fnb3ikTOTVnIpcRsAL2vqwh/Gvk99fqroDKOobGQRMRtrn4rujftPGbMt8/1lb77fNexI5cWjramqgvelfWcWA9TxLVHybf7uVHlLq4N5vTqg1ikhnEfD/dJDFPUCq4USequtTk4k0HqgoClc+P4joATIFaRopyCk7ueGNUeaJLHS6rRQiq+gNURPNm9k05I+TzSTKqc/OuOfuFxX/qgGk/C9q9vK9OTem1fPV+LYeFpw1kpTBJM5Uukw+u8Boa0f0TPAXZNvpmrC8/HQp1E1k2VSsQjAHS2Ys6asHiPBRW4c2s41PqDM8SYiz7EDOykLTlAuxyspSlgpoQhjf1rMqNmo06Lt1G5Ga2+gBezWIBpLaNhp6MTDTA3Kkkn51+XkObqIWGqrojQed6ByvPGT7sKkC6mbYEpAyhxsPCFIJO+iYUm5VOl+n5aZJlk5YjW8ta9bkLWel0as07IFWPi2AUuxLQlBWoAasBzWVyqlaZ3GNkbeqHN7cS7duQrDJHX43ZP2NB0ZzW0wJ6XX2HhGqO7HcKiLus/Ove171KwOye3ZYagCmG6qPsVe8r/JAB+DPjuO5U1tr15ne9+d343j9zNxH4Z1/5+Zp3ELDFixsTVtsGty/qfqN1BaytDex2878dzM9jwxrgzWmTbv7A96/vs6HNcPl2ZZULGe/vQz8UcpROv06d90Pux8H0SOLnv9vX2rPbWm7sIGovYYVODWOQRMalqGfmSU1SrN7YyxZP5Dnnp+YX5m/oDzxf0B/AiZiIRHwV8oe/OX5z/I7xeTzn80Mfv8bjmcqvceSvDz6eCE7hRHwmxpmDGMXsZ6BEauYcEX1SnpIh+7Ni3q5S0lpiBZl5UmZY94FV6kgiOCMHjqRS1TntDBjCI9mBQSJzUvadS936cAIGmxOz6Aj2FSE5qvSqHBlN2GB993778y4ZEGz9u3GBPVjDIkX3/UAcaH3BIkFaQYlbgFN9+z5o3uyY2ybyS3++zXWX2yVU6VOO9RVt19yvr1uG7edXjeEu9tl9ZK8Qh195XbG/kiRNdZoWaVd0hCBGxMyXNPbuVy1LA8DKJ/QxP8hU4+bxg3FTnD/lOdESE0AmY5DEUBwBvlJiGE6QrtyIKNwuKrQLRcY7X/Sui7yOvHfAdUwrjsfSGHX8koFv4e7+QKuA4IBmZubMnGkn8iCJ0bxqlipDhwEWC4v3HcZx7PTTaAeAd3nbLaf1UP7VaxEXCXICl6isbfUmEssg+/503574Gtp22Z7PbSS9MZdJtIJB6+KE0sx+ESNzEuE2YfiTY2j96cdD9m1aQOXM64uZLriimiFkswVY/tIkAg7uUsRBUAHKPlhm53W3CHtNxXIA1nJI59vAMkVxJjLzNeecL5xT+cK2lFiu/m2ubst9qRcpSqS5H6Conag0tdFRbxYhcQ0mOY5rO1zeba/7NseSlkZCA6jI6psUrG7f+9pFHHOq/eTbTi8Ko3IszaQVgZg5cQVzTAa/wFDv5pbEEbG8vr0G6bti8a+Vvdj+agdgT08tIWK5iLtYxc5SuO87571zzsVO2wtkq4DNt1aPVgOYV0cuO/PuVtbHLZMnzf8+AWAU2CwcLVXj0gsHuA6+rsBZ+ED7DxJVjWK2pV2zKneDbPdvk7fKtt3lQdLAgc4DFGUBeCkrFVOHb57ODCw3B0gWHKg88rUF6n/HGsMS7Fq1XCEY3/JSd7tyWGvadMTeJICdBulwJisurA6JMWJMd9yEbZ3ofV3jctqpH9JlcFukZArF5CJ0AwVJELMQcEWy26Wj5QGvo2j3wFB+89g8Vz/0riIbU6qbOl5z4VoZE1n0Wlbu9GbOooQJzR1hJmxcDyu2bMEMJM5psjyP5Zdhe2k7YNYzuuwpMzkq/LOiI7Xrpey2YqTFVwL2KipIpouXnfGzOgd5OJIwAC7mRHvpAhhkjEgpM93UpsQpS3FGgLiCgsdRdHseigc8d2er06k1tCw7kgA0uapqpktpT+FMvYAJTSiTAk8xQ6fmH3j9CzxxnHz8VprW88Qxx+OL47fwrzg+x3E+PvLxxDgyRpJKzudHxhDinClExsAw27l3NxiiEudcvWam3Zpgps6pl5DBOZoEo0GyrkOSZrDzvcgUw6X9OR0rnpQmwRHy3tFJCjmBmTonJxx89wbkFZxswxpTmdAxxngccbgvrzLR5XOwYFjmxxiL1/mIEWHSbTX4PJvZhlVpoETC6bjzzEEFB8nH40Eyhg/8FDTGUF7nN9m9QPJa9FL0ffRKWhCO9UX1ebBvB7RhZxEyU0dUD0z2MVBUgGOLYvmSBU7yAZNX1D/FJm1iVDjA8bqbqV3bvqt/a5iqqI05obLuYzTXoo2rr9fkztNVqwGOiDgec875+ny9Jp9PEo/jOMaAxto7UTyYkw5SQu7IdByHz1xiBEMMcDBGvk5EOFIvBMfI1Ouc5CEFIsBhvvacOX3UVRSzrKOcQFibETBIqdYoc4cW3HTmUlnXrqfREXnB8bdkoHS6XnTOSWQMBoYk1/OYENHWB7tJUJlnftsKH5MxBuV6iU6FBzkyLte3bBMCwGM8lsb2ZVuKCq2uzTBaR2Arc8fFg2SeJ2/VtDWDmOdKR7COGWXmq4WMRIEDK4p/MQegOM7GCk4vC3M/1+eEtswVGk6wnUr9aBH57U0A53k+/FCtsWG8GIcSZteZwBiPFVAvI1vTOsXP1ak52UHoQiZSnPkyfL8QANcSXEbJbnL5Td4Nd8C8N5L0Os/X6zVfL54nkXnOCByPkDSnlwwRMWdBLMjI2iGbesEUVq+IVgJZ/Ho1je1xOqDuYz0ECoNRRcPsTe0VgR7Hx5wz5ySrM7H3SsrYtcqweSlyWquyY3GWIh/ol+qrKhySpDsY+BFsd3ZLZEhmwaoykujskeN5HqwAYYzBPL8AXFqtX01sNcl7D6lK31wZNhTfntBi6qutUrRBBg+jWw1FK//P4NaksmqazY/ErKBP+2SVWbC13hNiA87dA7Pah7m/U54lS+72tkaelDSljoMQHNVACIiiZShpIxtaWCeU19aDdPn1xvq16UACXtxrhxZlh/OQV0KCGCMCczkJWDtCwBgF/JE0GElEOGsxJoQ8ZylbBEda9IrjfDlOyxaNMoG3MV4Z0dRFv+ieOwzRX9RxHIyLm8ELXW0CkCQO8CY3S3rw16/+1jpQ8S3A/O3j74W2P776CtvR0lcA7pgAQNmMoz/d8e3u/nk3stlqVdKuWNdI+NPkoA36S83dApzcv7UmZNtv11eik0Rvf1IHG/Zn6dm4zeKa1RrPVmHJOrB/eK71wxL0Wke5zYv1VxlOsKeqJDUIV87DDDgrYtIqBlQ39ms2AxT4LAHkHIaT6ktG8+OEXkBCJ3AqTvAMfub4I/jCeGX+L8Q/ESce5+NjPj7OOL7AP56/xHgxzhjZdW5AuzhAOCsLm+0QxEBkdSlqns6UVONMzMzT3ghYRyB7DwN009CeMbf7OKAT4NTkNOHOKRwZZyAWhEU5Cfs8M9wCLRMLyeIgr2eK7kNVK1K2F6jYUdEGz/iYcT76Kvb38DL7mqKjCEuERHbgjlAwRsTxiEfEEc5nUFVnqBu6egn1Eu03odKmhna5/d/Z9f/mA3+2qf/71+EColyf70PAGlmXwqmrMaOWSS5wkYq9wl+0j7W/AMx5khgR+5uZyVj6/ZYYTEOCBAVTGWnDdCQCjBjh/nCF5hohc/4QYgRHgohh6izzScKxZUm8QM/4k/nZlYAqwlTA9D050OfpMr87QbYu0qfspdYk5owR9uNW7AI1CX12mL4ot/P1Pp+7svqLRWeXF281b2I3Zvq3svH9yvz2Du7ysx8TyfcuFn3NmsUuLmxxMfGL4a9lq+X+RZYVu3WW/EvJvxykeiWjggyxfKFo2VuO+1UMMEkHFOAQVGgqh3i67y9AOlpDn77LyqlRfB+VFt+UGkkCTbxlThLVqWZXZelKbn/gx5P07fGvHwpqWAAYUS+dLZ5LTV0B3bevs6zS3NGwvuAOACbJskGX0vaMXkm/ZXxva9SzjWm36+KMLE7Ouam5bLrMXPNQbcIk4yWFuTQ/NutC0iJrxrfXPoe6r98uQiQ7Gnub9bW5tdUnhLs1ts6rj2VjiW4GYPsem+toPlgaAu22PM6umLQJCWKm4+mFF1bYIvFIdnxRO/811e8P+/6M16/XNK4vAMupK9nw5a9UCDDk5Qe1Aj3tSrkfohRCJ58LtZNqoUHR7CeyhKJud0sCrJ+3kH29Ya3cnFHbMk0Iigi6Gr1jiCgLJozb9/RBUm4FwLo0PSC6scI2NaZ0rknsz8B4cZ+RUBgNsYD6XTcCVNwHC1m1tl//W9oTAqtXru39xKbiF4FGM95cW7RWl3L9oMVy3yF/fSrIJvVPn0kH4nurb3f8s8327hLU2ITreN4+YDSkqDr0+4/eUmSj1tzhBFU+lIUov04JnYnsPsE+lZtruGvI7F22gQjYo6+r043ORSWJICbEDv2PPvZo8kQJSqdvDHOnXoAmpgvCWKCgKbxkJh98gRN4gSf0CZ3ijPEH+Rn80vhK/n94fI0Dj498fszjOY/HyfF5/KJN6gqedTGWAIpBBqKqh/KafrYHxcIFpnB2amVKJ4rXP7UaDxmNqUbxVPtb79wXTAOaLpeLhDhkFsScyRBGSDMkYVKZfHm6ZWzqe2Mmp6pcvhlnQlNjuNXowvZLQsVlIs4UMQztbzGokCdu5OXemqZHmEr3rokjHo/xPI7nKpdsOSvKjCWolqZddEui7q+WzC06gLHTcuxy7kPkfbf8uR2/79zrzcouXjSLfuXCJ/f75abexg+pqqT3J+UOxstt95Zpu52HWb+DCjc3ZiR4vl4ETsdgDMbyJx0lJRTeNKUPs3EC3v2Cu9XSeSQMmBIqRcWo0hJzjxQTF5wNltTsQIWTRUBVs7FUsLk456Zj4flZGOiJzhr3bFiw3MiSsBK5uQ2SfHiXnaVJdypNKma1jf+TVWa7AepE6BJIteGz3+tP9LbDxgNWWCleh43a4NuCKdt19lrh/U/7jbTqKzI5WhJQZw7ZGGpPBQnEQqjyhgv1aeRS4AGahamPDz9yocAKMHDN2Pbcus8JAJYLWAPofZc9jVMqBERFSroDPSuxF8toB9zUPenk3HCQusI72e5rBeYr/FwdfHdFkZlhW15OeJtsKFbqMzOVEzmDBavb7NcaeZnjfc5GRHUrNodV2zSq5poYbeDTeAP+iUK5jPLaQO05XBCdbTWJkuA2LYR2gLxxXAzWH/C25C7nuWTGN9HSPCzWvMVmAyZvEai+QGaRV6Ksqkr1X0pMQlu90VPWor9Y7YD6dvZf1mDcttA9I6tVZSk5Z7uCxRersmHV829r9mLDt6xQmOEel9shIgmUZsZg8JDmTGdTDViwJZPOmayVqrhWGRkhjaoIbQcMwGBpjPoKuyqVWM+4OpaSVD2DJLmUE4pNhGv6QpVXjAI1lwZgUS/aWSpRaPvBNsiOAq1rYm11JxGC1e3H0pxLDkoFZbrhTz/pRVTKugOBDvaXEr7KusB21ysRrJK0Az/p07fD/v21RrnZvlyhofuF8P4G337YrrrZ5bfPvHv8SzXrTl2yj+enUVd0Yb9axd1kQ03fv7df6nY89DubgvB68+0rrZrfHM2bCfJ9sncT5M+epS9yO6LQ0bv3AX87yfZ56EHKPkfIJb0srixWkBNklIuZ69bMSUGYTEmTmKDbuZ/Kr8xTOB3nFnJC4AmcwAswdc+JOMFP6DfwieMM/k78wfzi+BrPz/Gcz494PDGOczzOGJPHSQickBIKhRihwSK5H0Cmsmp/TMYczKkudEc7BB6VwwpTOdNkPp0PXdZPes0TRCLNFp9QdHD1DDxAJiJSKUoRJMSQj7oEzzL8hGliNTYEopOwqsC8WnFYYChEV0pLG9pQdomJhiW9cTxHOXRWtZKEcNdx34kc8Xw8Pp7H84jjEY+DRSMLxTJJl5BUTWpvscvyaKnWFrjdRflHAUadGT9v2HXftdf++rU/+xrAhI47Q8C6F390xVuPX4qCyeRGYpgQotvR2aJyq4ClWPzdr5dd4rJl1+rE8Aewj/NSfSPWcEmSgyOKSwpygtduq1zewYhmte/EnSv5a5nUC10P+2Zzf1sOXDpES43UIWI4mY1FH/LwybXlNitwlX3yercZwBQQRrTV1Mt604c9S2gE5jr8buwZ38a/3iGr96eDx2Uq9YJeq/ztW7vQ7sL8XdK+T+D1XTnK9kPrjEvg15lcLhttsTAsZiFhqxJettU6yW8O8HWp+zubbL/X8MB0i40FXxL4/cpAd1bWCT7EExomI0N1pSeQ4mVfvw+sBWd/8Nlb3tHN1JlzMqdokPByV27f0jJPPdu6ILXkdQusJ9ptUGKMwSgYHVpdZKdbced9122jrOfyffc3r7DpZZm9nap9gtzFYIZN/lSy+LKguSZSmCtooreh9MuSozzfhAr3Ia7c0Q9VLqp/fpTzFun4Qaa+vfY/e/6u2iebrdxNDrUCrhkz6YK6bbg/U2PqMnZ7qEVH2y3pmNPhkr7U7WDyiw1e3UZYeQpsz14fbp359nRoeP1tikR01RVBZYY/ptusrmsKTVHVp6L9N5aPgCYWUTl2e3Sm1WPNyjYYNZmbG6XiYse5ZqKgdLGga+WjVSOwZf55WwLNF2F2kYrrX3OBbUOaZYlw+vLSzj/Iy5/r05smgh8eLHaFeuCel3q/pUJcPQXvd7+evrWAnKPZRGRf/p+tkL88A97G79FuFsvmbV/95LR5BOXpVmyS19Vu46lV9YFq2dhSqL2RYJMdgMwoWTauaiQFSME2xG8rFMFZvV3qFK/aF2UWtra4ICbAMP8XJE0ZPwMBp3Aip/Q786twPjFRTvREJHiCL+AT4wtHcnyN+Er9EfhjPM6Dv8V/Db0Un3hofMTjwXGAMRmziHyLlxfBQQQrNDZjHKw4ouWTznBhpsMcKNknXXZc5n2eKgNc0uoGBaEIFuUYMw9KOI2fkaZIKsykovLBT9AlMQRHMiCrCls+Z61DmtFAhrGWJ5CZcP2imRDoIgOfLua3psP9jtgVGKhlJlOZIRwdhrfvIaL6JEKagllHyRiPx3g+42PEx3E8xzicumx5GkLHdHc5/6Y0lwOAvz5LtouUXLtIlITeHVRsirg2TDtu+0F7HU33MdxGeFcLIUiIaLKOa4f3edDNLYj65/vjXFp0urA7NNMm+IjAGAFqmnCKVcOQp+ac84KjODdSJ2RV6leJm8HDgjgeKhC9xjgQR84570CRazaCoeM6yOL2GX9DTX4xF6b9mtt3E7C07l7HPB2nNRb7hn7UZZ9FZiI0CmBibnaJN19urVplYGROD6Fiju8W7b6+fsSLV+BbpMa/Bt+P+bFmrJ+X/R/uUmc9sWKZ7wLQ7sY6ax1JAmwz/akPsL1WjCYbXcNeo9iTJWI2ef/NXXmborefe9d4VIKjIDYuWYRzlNNDWkdX9mLUkxPI6T/AjJYARbr3hWDrX3lj99/3b8niNSHOipRJGhHzmnMRjb2RIlaZSr2apaBW9joitw7K6FC11VQaBDTweMQrZkQFgJLIzMUhyw3qk5kTxVq2HqfsrWtiS+dkZiNBLiaWfRJYXEY+P5zAdY9LyV3y5PAZKWjcYIG+S+Xlaop8/YugOYvuaY/7bJKzWf+ZJ00ycdH+BIw1aJuri8zWbrC5sYyFa4m7atFPuupeYnBIQBMELQMqT6GzXlihJZd2zJmakgY0gpSTpckyq+uOFWrTaURbdcqpTJf1S4GBXI9KRTH+BZFi3HayYzG7XdSeLdiEeGpDzTNpu7MGAw/NPWDqCgRMI8KqYUA/L1BwZITCRILLHITaaJPq0a81FEBl2+eltAaAnLVJe4f5SFILRg1QUqMK14cvV1/SOwtQPV4v0n//tSugfuSfL9OG/vt31/nxpsKkt4vvrgXX7b6P57rIBuddrRMANN0EaTrCb1dYenb9vA/4R1tnn4rb57/5lPvJ9Pbrz9fccMP7cevhdcj/vW3N+sClLrebLj+1Y3uKiGqUU0moBbQ6UbgRK6MJIKk5X9QpKfVFCDnBM/BSfqU+IffrnTDNDRMjOcR4Jb/AF8bXeMw4vj6eU/hXxO8xPkf8lv4Z/GTkxDyOOI6jQEzeUfYJQXLAVS9WoB2AzGrjCwCBI6q9UxWCx0jb9srmL3eFEaakYq2OlplsxgyXXxsRknS9TmhI01rH8dA6cqYHGsTh1GMMVm7EJwpKtQeEDrOsRfNSWnWrqrFADUtsxTLTgKpyVLRKft+lKBYXB66UNYLjEY/H8evx+NtzPA8eEREFsduhdOPSYpvneqOe0Peb/vuXCql+Sekl6n/5re//5tbKamE5Wur3Y6uVErCDrbk2YK3qZUFKaie3yvJsXbhGTQp1m2p0VCbI4zgej8d5ni71IzlG1QFjTknFbLlZclJVS/tISAiZihgjZlIpBcXBIDQ03TrNSSagQ1HOAnivW8bWM36fQ2xqZ/9Y8VEur/KaR4TKpJCEEe10bbEbSWgZ8s6aE04h6gwNFPlk4aBs5crGvPfV9vr3IrTJzy4Pu8belbCkMW6G3XfpuqvKd7V5jarsqu0df/HPR+uz5vtDoJoJkHB7D6+Cd4T2QUZ0Bcm3+dk/tv2c+7FW83M7j2oB+iOziw73r4GASypBMljNYkJa1ur99FwCI0maqY5S95CTYIwxxnEcOg7DUCIGgh0MriH4SfPOxw8AHcgjuaLs00GarK3qiq+IwEENRVGiXS5/bbsI96gWsPIIDjTU5k9mN7G+qam21bQAIZ3c+JPlAGAPK0Ey57LoqQmyGi+8rZeEqwZAardKEpBZPAW7nGzWVLuRmWk17kSc9tXfjIS79ennukrIlvTuT7Q02P7OGuz12LkgA5cPsP7kvrwgipETUx0aamxdHTyvOelO0RAScInrAv59X51tAs2CscBFP23WhI59AtfI+2Ddj4YMGbR1xSuYsgPjahYHk5Z28iy6kXuWceL9WD87+CpTV9XOOtZTvAnVT4cmVx0RN0Oa5AqFaKXKcwI4UGwZPyT0314i1oHtpqHfBb19kXdb87/5EhAYy519u8725i7Bm92sm77eB7Z+fjsqdvX93wn2k3SqcoHrcBe7JXjfFfTNqvjx4iol8G38XTJ+HUtxzUkvGduFKGU7E+Qg8qLrqSF4szv+Gk09DQAOV0uFFtVs/GhCOVPC7CK/iXTl7gvwzy9pAhM4Z5zQJ/gFW/mcOBQjEYqHeCjGqXgxvnC8Hs+M59fj8Qr+jvgX+Rv4z8z/on7HwCiT4CAOMhKBDOIAIhjUkAGhiFFFx2lXWZopQQFkMBMn2onu8MQJYOaBrvx0t8Wavaqh9WJZeRl4mkwpXSYbnclkh+jCTpX/mzBkerggJiCM1X9QRkcXvWTDBClOkeYxjGF/K3MGD7Xyakcf/T/VunkdD29CXnomaM0EIuJgjON4PB4fj+M5xhE8TGlncYKfd3mA9y2wq/j9jn/xetuYkoihREnff1tRbA+F9ciSwKJbvaR8M2y+q4Wl0NGW2bZt7yNx/Gzm2l8dXuQyPqISZifIiDHG0OP5mfp6fU2dGSOc5s3M8xxjRDH5XsbcqRwXXW+de3CcngNhESkOq5qBHydsBKTuSmetaFojM8ze2qXp3nEWdXhfEaPYwSiS3JzBd5/FVu3ArPG1SkPGe6J2wyI7+UKwarqW7uX630Cx/u+VUW/WrnhNnHH/2IJ268z7PjfLZPx2cOLt67u6Rju92N/Z+4sVwTmqrILYRUg3E9kzs43zmnyWL1VEa1d12fdBfn+02xPlQqyREWBGUlbTKcSRmU2ymSSVZz9L7Iw669oQZ07R6MouSrMB9e1E+2YSVKQ8c9a5hdolfDz4fMb5Meje6xLt+YRTXjnPsRU71sJtVLQltOWysmKerrBKDAymi8JNvrumJIKusQmzLkCYc+aSRFYnkAoDzToFwgmfZXr0FhQMhV8OANDn8lXnKFePXcAmVPnwJLtaoLFZ7s+zT2bpqzRuaL3WVNhurBqMJeEN6li2AYjgRtfnRW9JXIbEtY5MLX7K68CpFphyz2lWGCu06GVb86gfIBOMLLLBXjo1PaN3jRb5IzGc5saGdvVzRogIxOy5sX6B+zkIqiYA195R4z4Ie4D7ntJu/bL3oWrtzBciaNH1OQ9Q4fsEQhEKe07Rxzh1UVNpj/Oyg86mlDaWs9oEGyllruS5uyfXalfqZpf/hQ71eV1NKt9erBhXr4URrRLwIwtQakkIlXDHRlfSCrmc6Mvc9GJ6NSauQBYC7kc59vpvR2otHw52AOqft4cGfHBUXI4lUNmaB7APGIi0ccbsd2qOsk8I9lYZEciuaqdQodXGfo0qaV2j2OdtzWa9SwoYhcTuuXMzLJVJU4LSuW9Wqyx4F5dzu59zPT9GdV2i+e2VrtFcRyxKgndxEckxSqE43hZBQ4gJuvtmc5ylpMhgHKEpzXR/GU3YSM0UpvIE3DDvRJ7IF0YCL2QCE3qBL+AETsQL8WKcOCY5Y4iU4vX4e8QjxyGNM8YcDz0+5uPJzFfwRZ7UH+f5L+V/eSpiABq9oR8uCErry2RSrDSnwGNUYCDLuBCUMlNXMZF5ezgVW8ubvdY+NTMEIakBpiYnZJedNJpjZp2yp1vXUUoVRio0O3DhAgSzRpziQKFpoa6oFnNQhBsSp12HTfxLJCqQG47MTYnANPI7JSEiTc+kNoOWRInNOgyXr3FISYGDjIPj4xi/jvgYeAZGtAGajHBi06HndaKUKVMj3OQMgI4W112f3HbTHU3Ry7F/PlxZESaZqhOnKZJQyZ8+Pm/D2G96/azozfi+fVqTlmauj2flddcVQkgOYorNI4DapS4Fm0U00hD/sgtxHMfX15dMbDGnyUwoK0gxGc32vfa4zP/IcIALMRjPaVbBEcyEYrqhzhg5vaRBWGA3OEwRo78/dbRp/vaqo7jmwuan6QHKWpIqJLU0KlA2lZU0mIpgztTspL1x/ETqRDKZmNAkRmAkkjyANql97AYpI9zIOHY+HZJjLVItm2PQ358GzDmhj+OjO/xVKcyCeUtysO0NuuHw2+wIVlx3C4sIW1ySGDs50rKW1jmI614WpT011xEbSauTiAM6ecXwFNIpsa26lvX004wuGHiX/7VPrwnBWEFiSQ0LWVUcRDU5JClmTJwhaEQfWIAh3XFIJ+dAmL/OCzeu+66nLiFI0z9MJXJmplsc9tYaPA4+Pvj8WyDn9KGzSjP9jcTYaP4E3KFQ/bymvFSUV0M7AOBpVTiZijFXKy4y4hjKI8Zpa3pWWz7XRZmtJaU2+A2zmQU2JtvITrLbCKA0s0e3JtsS6WVQJdWl1VO8F7aUQJQdwn7zLkitYDGE04rcsR+Hrjp204A6klm2b5aamDgeK8J4HRO9zTPBbYbtSy253Vf5lpHY7MBuDSbYcFMTUs6ZFjPTFrRJlloMxc56TgAhHuMBZKCsqyz4gcYYVSUnzWAmsneLx+LJ5WXzLoekYWasUwbLcst+AET1wVhbe4UDNkqM5ULQ3AouTlD5+F7T0Vp9QX3GatPex6j3QhUog2uY3gNR2NBsRJaW3kA938IQ3m1In5JlWk8ggswkleL1r9f0KDBgOazmCI3BNphQuDDKASEQPLM8neChgsFVooOSadCjD7YUOUYISuWcok0vkGEelIhIn7qOSlivE3TMShNI1y3T5rKnLkjEiJhTmmdSHLAUQ9PXr2Kz+qqnfs6XxjgYnDORwVEUkjkRjOXc1YxDPGqbbthCb+aJSmGrYz5MRYycWg59+5pSFUthHZwuqg3GoUTmScoVxMKEZk5xBCMWs5wSYsYxiv+IRp20U2s9tmGEkgjgPGeBnSvFNqEkU68ZSFA8QU1KmKfE4C+THma+Up+pL3CC55RN/4lwDGYCL+gLmojEOKEX8hNx4jhxTMYZD8WYioyRx3OMQYzz428Tx3kcEYezdi4G+Ho+TmDq/NT5inPGjDD4Jg7xAZP+YkAx65Sd7abSfDjgC4ssuvZkBDEgInV+BkepuZOIGOMZRzk/c04tD0dSTijdR2uoeDcjYkRM0JXMFfCzl2IoDqbrdGwRRpSDrhlQ4PkAOOcpgtQInygITuSZ5xfmCb4gcRwBAsGmwJZUieagqf4lcsSDx1dSjCI9EaGDUBTQqDoKz4ZDmVMmjuMrhACPj3H8Y/Dvv8bfHxgPQpqv1BED5JmvIyx3FSks29dRlnCUbhpJxQgFYoSrNfu8GKzjLsd4eC+YKxoOT0tQE2O2mG9FZ4mOk5XXmqoSq0uze/kJ5RG0V2yDe1PiMLLcPSfjAiy1AbHi+MVuUf3bSQITKWSORJocSxUUSkiaETHG0DyVaYH+mq/neJ7nGQOPj+ecM/M0qeYYj9drMoaIExmB5jPJMQ7JfP8mVxvCSEWMZ7Xq5IDLX1xpehxuqSJnTceoeWvn19Faqeq/bXgQoHLOsrTc3CMihvF1OTNPIEYnxEIgD0RAOecUR+Jks8pgrcucdH1vhOY5pejymkovpiZAzhj11HYwY4wp5jlznoEMKKcejwPjqJQMGSwCxCUYlCgFRkQ4WAJcVnL4BHRU23y9s8IfJCv6hQIYj6B3t3cRUrG0udI+meXMrt3ssz8zF0qwmm3Rabshno4xkRc8NavqFhXaZ7VZWcEyCYR7800W6DzsL5quuJLr6Tqr6kyz/jNtYr02oMJU5lzWZEgpKCI0T2PwHcvKOSMOMqAXfa7M6SaDChq1PzOlJDNiEAdDtlYqAYJl2gPknBPIBfHnMrGYdl0wnvP4uz7mnAaARJ6fnJ/MSU7oLL6rVERVRCyjszIBbQNVCZiOkCJmw+KBISTnK0/oxVSAHFPKMzEQgZh84JhUKpEJZKK7sDqKRJk7MTionPM1+LAUsnonqKARu+nQi0LizJzzJGmGsMxUnspzjCG1JuuUohx5ueqJIdl0TluYXnuq1CQVxAlR0xZ/GV1yFLwMlop+O/p/nqeC4c6PGALcFdIm6Bix3DDYcmy/E6U/6noRYTVi45g05D57DiydhlTazzwc1sRUunbIrP8TU2l7kzGiglzzhCLKca1uzm6E6KD5lkeI5k0QzYhhszOdzR9xoKIjpogS6DaOKpI0qkPI8EWUs/kkKqBGsva4n6aSdIE0vaSdW1T0okTUPELFfcSyEDoYztziTnVOzZymBAYKaXkwTtJhb67ORNMn1tC6gjrqTy47Wl0l7Go0R76dl2AwUEiwCxCZW72FJIAdO8xO3FV4u1xMe70QKqjq0HU5DHBn5EwhOE9xuM8OlYjYVEWtYm1odjbA0dAeUDOKtjlgYMTw7hzVR0xhp8fyX3iyHzpX9vPBrnmUA2hClwpZrmev+QXQmYsOPCD7aTfn2G4GZunz+r43g92eYpD15xNn6EhkBaQsGdXaYTqdSV6knyssJYmalR9TqywHbUHSHnOLq0SEcjLM35+AMl/QCxRymkkA80QSx5kAdKY+z/kv6RN4AScOAid4AhND4ImRiE/wD8SJYor44piPJ+KZHIonYogDcXA8jzEG43w8T0ZyiEyHUFnU+5Pu/2dVxHDTuIwjMVAtB8KOpn1S1uTXiqyFCJnMU1DFsit1S9Hd5hWuRWupEty1wOguubGIST9LEcMdwXwItvEpgZhp8nIjbLw6FkMEI4ks7glBLJhSZTcB4mQhks5gdrCog8NbxMWJQjISGGVMdDM+RF4apqaQOdPJiTqjrkiDleYcwXHEeDzi18GPERHggMUwJpKamXKru7HiUtsW0oJJ+N/gHltaNqJNvTKV6hJcjzYaqNIhme6MWGEHY1m63sA5jS02s6KAizJyn7ftQLIffn1+JQm3Sa4LltpgCZKja03Ttxd3Zhtv14Sgz6bjEeDqnXd9pzZnOiBUdpshrQTAgQjgcDwDHNmgBJI2OZOdwYI1amQzu/mTm8xcr5XG4T6abdesX22VaiY4VX2mvc6j1JhlDSWtoQTpoiDb/dX2R1OC5imWPBsBFXG4Q5MDL31fVTlLtTZjBerWxDrJXjEUSQgkZioG34qL4bii08GV3AQg51yyulnZIiq+49TFeeWs/Ar1LPEGLmBuX3UXuSoHuElgX/MWQ+XKSmVplfVUxuY28eIVCy4d1aYYu2d1rtVZA9vu7oHfILXq6+4fMzhn6iUFGE0ISsDBuBA1J8rZNJaLs2KMHGi9sPa7ZlbVb6FPTWCQFoGOZ5Bj5PiF40tz5nkiXsjRFa6yo366Zm8bsOVqQddKrjLnRoDuGktVZqOOA/PRl8WdZUUWnWWa6mtLL3h+HWmqzn2HBciSKNew2JkpV2QfZA+Gsovq6L8xtBFYhbMVTihSpl6a+wJ9f623lVwMyOYV6qu01BGKBQHnzCkn//233tsrwVD1q/9uAHt7EBMYNN1Q1gpArBgay/azWdXu4prq4sevmDeDA7RzLCEQqaRYsY5mLSAxEhBlCO38DjsfA3I4vSrsekuWjcyqhQ/brQa+MN8f+KZXbyZ7UphzuqkcUKgOr80iKSkr/K5mv88q22VnZ5GuEdsa13rD84S9XoRrWspAQhlIBQ8OZuEULuUBEThyRSkWiofpDdJJBDTvHBOTlRAvRVV2rI0hpxRtZxFp1y0HYoXDK0Rn1QvHrkPNSK32MfzzSqeO7SGDdvVIOGK+Np6TC5mgqTfsSwy0LpsSqqnFdFsTSWxyKVXSyup+GIgAVSDYy4uKLpWZj6KI2Q7RqpMIqHo+o9aUddL0rpME16nrVeQ5DoauYEnGYjoTJ5yXSneejLLTeIK9COoGb1EekqSo4PSUtfJMFA9mpl7UK3Miv6ATOR3T/Pz6z47xfyE+AYP4T0QCZ9n6R3JIPMk/Iv5XxBcpcJJzPPl4MJ7kQDyiG5UOOwAIHjGA4QN7lqgviGEwgmMgBxEOlLoPTqWpKg7nWN7ISoENAYwQrTkcdaj223Wytp1aN4rqFpTwQd66mDu8shbZ/0NyQsysRl0Lc9zanhy9BRwqYHEksFqjZbmWBrOZ9XdW5LKL5Lg80iAiqoWvz2Pb+obp95HjliO4Wo3uWqONJ9xwH9bDhvc4em0ujoNxbO4loEpgVTEc1iFxN5pbwW3nMZbRpvfuSz8cb/c0d//1vaBlu+bN0EE7G9/v3stYx7AHi/sr8PNr3Xe/43XTgplWU5R3N8BDigOBiDMiFr0aGeOITGlORDA150vBMUbFbeokqKXvJ61WLQVIkPvA78u5T+BtZn78uc8aLJegrG1SG2gqM5EZgcHhmtTsjgO+WPx0fUaFt4q2Las5hy/ocCYrQuMvZEQYqmB+q27PXEhoVRU2gM2oKbpTde/UayDLvaxXRecAbBzY7Qd+N53RIr1Mf7GOqiovkqxA17pb60qKb5zUiwxx8TKvNdK2CypICy9uCq7V8ceyawy5CeD7aNebN0EFIgreeT0pisW/uZn6A6LmiONhFWKpuDbAlUjqezhOPJxl9NSXV4P2c9ZOJ4kMIDJfzESjeEmOMXgcihAPca4QgEfrGakz0WeuQSYqE54kU0zRQJ5v8z85Vvl9Jueck9P5vMm0/X9W+2BT/WxftxY19LwbQbIqvla/WAGFO6+lqtdEq9HqHC4oT1bGZnllvhklUDTUpE1Ou6jbWi/+Yak4FHS9U9Kyrri805tIRNNL2HQZJpXe4IsEHPCZu2Z7E7ybit1+K8Tg9jVfc95CJ0AJSmVfy4Yp2Cx787UyC0KjdzaAaCoXXmUGNH/u0mxA85cAyGoG2g4AcDhgdhEl1NxFXTmuTZrtNLaH1oBEUXile7YzGve16gNs05alreLqLlvZwlPYsMtvWdppn/kyfap4Cu7Vynqsm89TMT5tX1yTXXs8tA52B6rq2Xs7rl+1Ykq8Vj6ZAwIcsj0E9aggmb7A54fbRXmPbjoEDhqtAoErCNdLNwB0k4O8TENVKytyhJQmSwaJZR9EO1qEDflGCnBVKUDV5FUqL6t8TsJFGQ4L4JiYrGJcGhYXdTReMt1P6pXyszSArGFbfupAKqg5EW5Gi1BUYXmC8VUtGfzZ9naKK9CwjpzZmvfBj7XZHMdwPuWcL9t0DdbKTGcSKheWmV3Cm4zsVlwvpDvyzuLqcRQ7hHgBL4wvcDJS+kIkYo4jxyGMyRDiXx+P/0J8UqnIgOKI4xHjEYiIY/AYSUQccYDDNs64AHvsjRVMB+jY+Bgc9pzSSToGGIoAH0QkgxijI+Wsxi8VXiBPQdKEIsdFspjEQJWosEs31vl3kffdIt11PKMO/jBGArp94JKoy27LiFCWTxeAMEtFgciZATceHsyZM3N2GYBzso4IsVouWyW7KBOyAVqatwPobk3s04Imp2M2zjS6Rtn0RxUzUxn2VxyoH3Pe9z3afL7inRtal3UVbp/fDf31t+11OyLu73O/SKtevxMdgrnOtm0J1im4zPf49klrGxczocnj3sbQthjaWPJll21x2TTr4NT9GdcwiszevRvGIAeTr9dLclhLVWoYhkd6zwdlDW8x4D4w0QF366sypK9bt139/aHeTu51wa372xVxR28Nx7HCIIgC3feywHCYliu7ukVzvVrR1aiyJbUdmBwIWzMDlCfHafNMNS94uAToTTx+dCm/CdiCMdRqrgViLtro70u23mx9YnPhchJ28c7diRIZkVFhlP7w5ZbvNQBXEHPdUW3g7muklsJbHuCHScB9C+xLjD77rztuPo8Hv7wUgkbsS0IwwClxLFLcNjL8bIXh/gLCecK2ItZ8OoQXhVTvEIwFCJI7KAUPxBExFM5kEqh+jPsg3x52zsk3Fqb1YizdbkE8Q6/JzJwTZ8ypPHOemhmpgvtXdoVkl0df1nlniWsy2+We7QJf5tQugHWRTBooUYn96pJZdmlHX+UsfdPn13PgXcu9LfOK9wNYjhPK4eT+rdqPDhtV/DdMKHkJ4X4j2DdoV+Sn5OrbO9h32bVF+owuwyyNJ8k2xC+bvqwpAIw4pFlwDAGd6ZK6E4+mxCkkUn+6i6uupt/0jAlw68hYN9dyNe+7Z22TRY21iq5715vlJyKiMD1Xn+mL5G3PtFzors0CJplpNE0XDTtUEVeMAT1Z65he72C5Ddsu6Ycty5J/0p/kADztbhAgAGKwEBcCgWAXshtsknBhaANMfJvsoGrnnhynBypYou3xZag+4KXtnBEJMFxhVEgv9F97Y9SxnBCEYUeolqLmU4RpAbwi9sKAhSOq9AW3eSzHQ5pqRdUKxE8QF+V0HY51lkSVlZYiNZIkmvDXn3fpRIHhVEHRKh7QFABVoYZFKDT8TAm58ZALIbzVcxrDZn8uAVNEp86XrPoOw+LSTXnz/KQ7sOdp/we0PvoCvoBPcIJfwAlOxETIhj7M5IMvYIpfiIxDY2A8M4YYLxKIP3797SX8DmAiB4gRMQbHGI+PGOARyREMHsUgwU6LrH0CanCcr5eIVJCDcahBvbNLlBgD45Ah/QziKOnkWEZ9kJhn1VKNrtGhm7MCYOUSo5xvJWbHBvrIddlSbS2LhwlL7IqZT62U10Ypuw6q+tcSXr7EsQ5ZFB1xQlKeVCZdnCZB7j8odzGmVn8TOCkQhhJVr1nCdlUpNUnlUaVToz3IGl+Y0IFUh2GnOthgSOi3F6/02re4ch8Su/XpGfsRdLeu+H6WV7Na1X4AMbODumr3x6jThuDVX9+O3D6QYu95692vkjgWh+xtAG1J69rf20V3q6vHfz0LgAgEpHBH0i1v0J+JsLTRsO/jOIx67vPYB4x1aFk9fVJ1/SjCu8ZJba9X6PLfeoWqLd2PM69v79f4Oa41vMaTZl+hOeA5YC4hOXxDhVlA5Dw4Olqi5uywzyApjnFmcZYGg90TDdN4azfeFsHDyFWoOMONB8AREVJ2HE4ttAFOm1VYxyDXGpYx56qMqmMtcCQNIWQHGGtmuJ3tEWC6IizvVpc/3xF7XhJDyoiTPYm4iUF2d7N332MzzS/foxu2LhGXWOx+y6W5zJcJQHlVQaCFGUD2vPnXiHBKxaIzLz69ursNu5QjCh6lqY2aZlEgMaWGrQqQwr60s5SbvF1PV2gcYoAj0/l4onsYjTHmOUxUseKaWJYWbwK8xGBXv9t0dgig19dAvFfOM+GKr6mZkVNvLwI0JWhvZ1/V/ZVtAp6kqNXhtdxaVjCLLX6zpsGfLy8i4SYAmobrRJvguTTnd+VUYIPcLqJu/uRI0D5XsYeialqSLdXOvtgsKWq7KNVylAFSekWVbHfr4/QSbHnmS7mJ21I3hZhxvMBKDzGMYA8SSMfjYHFxhm17ihLwdoyBQUdRAFY0ITNdfMZGqTRcQtfEtbVBm/dWuSG3XxC6xY1V7iqlRF5gmD5V7QNjpTFWsosJhiElC9tE26aoU6vsgMqX7idmb/jlZXko6wPrXP9RqUtaNv06TQw16y+UCYpiGY4oeEJ5GiSP5YapPvr9PhfGxmHuTTyXFiposcrjJxGil7YK8yufmLvbKYAo8lsXD8KxzuW71Cav5SyyRZolgxIQ1Y9pqOI6guKCa7FE1afEcr8MAGWD5RTT0WEkFGfgUH3VHXGtqyAVespp/SwXnMGqShCkfHVQtg8MBsVw6lILj1LrZyxlqBra0ZA3P7XKcgBO17tDmp9fg3ScPnNKEzwBaX4ZMMmk22kIUn7h/AJPADBxJ08cBCfw2RydL/CFOAvnEyeGEJN4CV/QJ3SC5/NjjKHjwXEI4yQnI4mviC/C8F8gRkQgHigWndGSMYIP8nDsvMO4yerWq7O1NkmOAxrg4ZWuHtckRlnAUgAh2Td9QLGxqmNmkoNR8ah6f5VqbCl6my/F+l+NdqWVw732GNDLsd5hkx6ujbB0ojBRupK03+DUWzJVAMfKj+WMclnt6WUy5sSgRgHi0WEMrkKxip2wKE58BNkcXDYSulLG+9e7pjvWKDXPksMRPIahWrYkOMzXyPWqB/xB+1wu9C0mcb3qAt+/fL+OP7u/mURMLWyBZ9ufGNvVdtW4fmafxvVz1wys0TZK9arXeLMtDERZeaCuO8v+DwVQaSuwGEg2UGy6DS05xli85pkZPOIRx/Gc8+WDDXFQmgkxmYeSWUYRw9JuYlYUPjARC1IrguLiWWoThmsY+0LshsVlaLIfAtvU3VdHmHOCcVZJlZ3bSnAb5DAdusI9YNn9BCJgNDYYDwc6VKZk0nWl6SKo91jvJoJd83BH+n63/94ecBncWgJ0SfZfiWVdB0lpbriOnheAVbSy7F1bjTCr47fXerp9/Ph23vLKp9k9o0Ru3DK+6/rAGtiK4q9Bsg369W8sxFp/LPtgrVFVsQ0L4CRTBoUkREOtNDIr7CoJPGoxVRutSMuiWwo2qBUNMDdWvLrw2rpCECMiriybDYnFANYJpfV0t5UtE/8HFdRPGqoYP07lOacbVWbcqyP8c7lA5pYLbZ2DiYSmBptuCKiTZdk0uVdcwBTcTnydZ2YWE2ie1aQdqiJj2JkNpBPGN9EyBO4a5Bqq9B7PWOPYMwm8VHFeKfBxISa4+gRTOq1GlOYd8AcuAd7ntsTspyGQzblX6wUAimaviqq0ykzCpXGjQFZJVJlyAhU7hmEUFfIQEB37v2DA+yL2KVB+cj+gusWyGqDlfdWiLUGjRUWN8kJNSP+8P34oautFGKm87/RrmSpaFGWM9u91KSIiNCod55WbJmVo52oTVC/TjweuMvcwv78CYpkT6IuUHXtQVCIQK89lY6WdAnZJLgCDmYDKCIbxZOXhcGG1bciHGRyrHEfR7VTtDIy2sIxjLrOQkWH8xg0BJcBNNhsCsYWQBQIzkNRkWV6VPdfyHBZVmet2XRQao0ASguOyVTCJqtGEy5v1omiPv3xnjZ4TSROkySTSJOswT61pGQW0/42qTl/bESYGPhGwX0ro0CqNUEpTmMBkTNCsO8IZExyF4z+Vpw10QMAL0zjFYDiu+Bv63TRkHeAfwCOBT/ATY3J8MV6Mk3iJ58QrImNoRBLu6jWB83HEGBwHYqQ4GZORwYnpVkfmR6slSTFTcQbFjIP5kA66BY++ChHpqXbMr9DiwXFAJ8bh6fTW3k47J4DC4D1wQM6VhRCBg+WAxYgR1eivj8Paa0ZPV8+sdBxBRcfQgDI6uefNRnJWNCUlsc6+JKCszmIsnlVbu/5aEky5QYkETXcNdubBfWryNLduwJjfDJvwHMlV17l0VIDDZ0Pdqn3Opfoyz6y7l7aAXdgKBAjS1/wUmbD6P8Z4RBwDERirUMm7PKtSzKcQSwtvGtYj8YLvygV34/LNoFwKaNdc1so73IMdBKo5//YtbS/czUHcLX41qP3KM3TUp9N0dRhYuV6EkdtIZGa3e3qjH5HFBaRqrpECCxo04HT2kj+CY5iMCsDAY855zskYipDo3hAIN1oJkCpqK98s+s6DEpx3Lf6DW23Gj6913mMdigle74QkVWu82Yeow44GoNU5QlBIf3IdSir1rpu3geI2Na2Sz74YQ0plMhNK2LTKrB3TWORCQTp+q0u0YoCVpsOqWADsF3c6a4wWwVLD92T67fU2ab2bTC5poHCjVnrqpJSrztbESovK6vuVbWCtOMVyA9pQ6LoLn05i+5NiAaMMnXDtpvkAuMa5AcqvPaI2Z9FGLTEYh5ps0ZMHXD0NkiFE5oQKbU4OTBUaxAdqkYhjQkofdZFOgl+weEiH+r49HndlXTrBAa/l87hJXLyXNmbbZuj03bIOdKk+SBQDOFVI8H58VqtFIsHpU5HKzDNyKlmhnwqYSZUczqycK0UXm5UDAMHU6IAHTEcc090wa0Vq/iliukUG8stnAOxYJuzAF9jTjwAJQ3kC1Vu+HrMKyKSq+a0avzfR/Wnvx/1n0woSESjcbLh0bta9TPYueY93E4BqXIMrD1B9btfsy0G0svgNiPdRa6VZsG515pYAMHoT93YYS4mVRVQwcFtPy52IldyXJMRcEfqVAWVnjQGQwegT0TXumx8uw1Z646zYrbSqW/0WVRSDPYw6GV1xCBioTFR8CCC4EcC4FtWoVDZVfoeWXFfgyOxatamOR0Ks3sHlD8xqf1JRje5S3KGcfrQ6tomqJLR14km3P3RQoEDmIFKZinL9qogVUUUrldBh2fFiMDDMlFblW1d7YxIHrKmSuuDzAZ9vrMjcil2tWTeu4XqMfqTqrMY16aLKmfX+hXM7EhGp8tvbje7FhlDkTRyChNHAoq6qUIjUZFLJ0DRrTBN+OmFtR0IF5HDa3RXWSmVFeVuQZrmgtnVdilzAOHEp6Ipqv6AiRQRs3H+Cp/IFmmczoUCESGlKX8gTeoFnHEyd0AsQTHWoifzE8YV4gYSxWzHxYDzSfbjieDG+YpzgK3gKr4OKkSOSxNAJzmKpB8P9iFLkaaRTgF1448XWipUOBlyXu+yqCdFVhIY82SBm2PMz5zIIDmSII2OGaC5MJ/tdkAEKinTcvGAHAbmlnWVvXPVMTLjhYscP0CaN+RkrytLsxeqSgD2i0NERqREatkuWCm5tYoBEbhkA79GhnNZ9Xu5ZmmUyHEb0pVISOBadP2quLnMBxkRBw2a666gw9wjBqsm5/A1VGZoydZ4iM8ZAcBwRR2A0FGjdJXU/hn8Kll7xuf2lzUha0ehrj/PStMuee7vCm8+wvi5JM/FTtbGkO+/nWhdpc1raWqvbX6Pafq4PW3KAgp8yHZ1ZIPV92OQ1e8ssm/OqkYju32yzPgLIozrTDSA18zwiEuE9I1tCEeKQt0YlQxz7DwTM5lx8Ef8+lo19fa8FuizYLZtRxP9XhiRNICYMonA7ZHkL7mugiWquYlx47nfkiAEXajqByojIsws9Z6YyZDbISQwcGKOxRE7SnVdDKIZdkfLu1qPvi9In7IoQX8L29rHvNtMuBrrOqPeZzHTbGcSC69xFYl1hn+0fd5K02R8N4SBXxxhBo/dElC9+dyHe4Gf7Q709ztJs6/MA2tURqcQKpYeoOIEhUUdYRQuTCgEVrMCZiEG645YcVFYbwb2dNqPEyxqDeQIQghyEGchIo5IIe0HLk9wrKP7sGb3ouGVlI++6xF9zoUZWDr+7s6zJ7ABwIBLuENx6I0/wQC+rKp3o29ao0vh+RyaRLCREnjqVM8mjLGyX7yAwIRaxtLrUFJGaxSK9NNJ6hH51df11Nq3XFtHfVt6EZoxqeNKAJdjAq+h0oM+LslsaKoNtznd9W7TCdZJO2OxDVH4aktxfon+l7bkS6HXAlNRJlWXy6KebF5VQmQ2Ynf8UYiakJf+4QsYkGxZewkMAg5wgm8FpEwxP6djfKVGC2D2osHSCJIgaVYmZUjKOMutmtcqNm06IputYqiAa4ZaZu6pZ2nixCaGTNyV71wivrbH2wrgs3mvX7CoCgIDMPOAFi2okQYrSUMw5FYOInGfPgiNyzY6T8ErMhPKEHhEcjY+WaNJaZXKEFTqAGQGEK3joA8PZyfIUUrJKXfVntoz1fD6XtgI0gBEUq4zfyWQy6UaYklIY9nYLHxlxBGPOGSRyphKoMGu6oohHdPt6ttAFkGeeOmWOZ4N4rKtS5lnOnFpN7ecQCwCgTM0v51qgRKxYjt+ZmqmrWq760/pCRb6pT/A34Ja6E17uZJpB38B9nuBME1lyos8lBPE8kf+F8WXTAgE+cDwUx4wxEZ+ML46vGGeMGUxSZuNmSMrIOedLeWbmiEcghgIhRrIIj1wLEkgomibdnCWY0Cvn56mXaxaJFHJwApNuSV7uWYJnjIC8uBnjCIPC8rSLEQjwqD4AU8qM8SiT0oT4jpJOV/hJbvVIO4AE8HLj6+WWzVfFa1woa8d9IlM5lZkYZvUJi4R1HMnDJCVdfem10izXToDVpbWNXPI+BVQhXNk9zDFGKq07muXDjNeRideZx2HSwxjo5rKSu3GSMSVbosc4SGbO8/yar5evA/v6thqZqayuOjoHMeec4kMRHMEHNIjxeDwyM8xjXG3Yx1KspbKsVjLUNgqbClPtOO0NkupoWQrMBXSeajeei8jCR17WmDKFPDh8RoTZs9MpXy6+8z71S99s72PZQ3Pq+G7kVRhnNW1Fa5Vy7QC4BIVtnKWSmV1cYKkrffooTP8VfW/j1e3jcKk+kZl0WQMR8ZDEPEk8Hh8GwpznpDmq7HDMqTG0CpDKrG3WbSJyRdrK3WwHlbvcRkSpuM198l+jj18/+xhjIg2/X4rxYQLuzLULAiwy7Ao7ITVBFaZ5ltVeRgnHGAfGcRyHxuF585AkpXKsBVKAiIjjOI6jmsy4R4pvt8heM08fBCRVlTmMGJ04yxiPJWbX5SVXZUfhOi7Axu5XsuAqmZkxHh13xgpYAWKdVjXVwTCjSHAsOF70xVAsZooVsbrGhDLN+qhOVN8pBgbKC0IeIFOnGzs6vKDCkyzUAHZgWz9ybvI5gRxjPI6Yc0q5bl7hNYw00szaghjxMD58zpfMt8YBIuepzAnaPPYUCkjcYFeVu2s9wGMYYX8cB2lCjjNPiDjnmcpXzpzzPM95ngEyeM7qUryedLfb2HX2ADIxc4YbAUzn9GKMMV3vegyh+aCCxehKBA8QbB62ddnNYk7IKliIkQI13fHFpZJn5nniOJ5OakHu0uiz5RxQzjPPidSoqJ+Cph+FCoVVUe5FFAgJlHKWP9Ag9HB8rdt+pcSI5Xtc/pZWBLIYPauC0lFxc4Q7KB0xgjGGA3kRsTSbJDCdm1aR/NaEX9pyHYVgcs5TAarPNcIssVJgnjNC4qikjhl6pTEeLSAcZX173y1mOYe5jMgOMiwFCTn4fBwHyfOc6GS406TVbCAi83zlaeVSbGrtbLhGJnNmOkO56DurLZpWPpNAjGbiXXISQGCwuuWKZypEMGYicwY6tMYqeHHc3VafH2iJsQkBWZQz1p0xij+WmQaYYDBAzkJYqX0oVQ7AGld1XHS1Q3kajswMHtYGmXmk/ghFyl1Q7JcaBeWqzgAihAkNMBFCqooIPInVl4oyUGLIDZJpTjSlpgO6nfwqTeEDhiZcZm2CSnCheWPL7ghJr9frUuIWkz4MJ/qDZA1NihgEFVjI6MwznPOuzAitLt0dAoJ4AlX9Yy7qoKY7A4GBIyrY7yISDMxTZ+VrW30UFCQnSeZEzspqwYImG0+pgFJ5uuLNYW0kgQkSmBgJvoBP4HeB9fHV9rZ3nCC33U3AQKKzkkFRWV2NKf5XPHIMxmOMQ2MoHmCcx2OCX+Jv4uXrMzIEnDOcrGCCc1RiD0Mv5nCEEDlJBSorVc03qnA8SfdrOonQOENH8mR+CWdmorNkLIxlAilmuNtvVD9aIdOy50zam3NciMJlwJUH1bHJyyFeh4cqHmyn9LwOTvtLVijJpu68hcfQtl3RkV6H63Vsb/YoUCllEEJqUmQwsfBynW7qYFUhL9i1DVe0b7/+MhSq6snvV+vSLgGss7YZWrjiWdPnU4TkDrI8Ip6BEXE0HhS76dB7ZFksukaBwG4i8/rKNj1X1KF/Wz9dgUni/StQbWH89FpfXP9+v9120xsFilV5YbS27/IWG+4zVJJOZqZJcit8teoHGrn7J+Pcp9HqAajgwZ48EQMh5TAhSqKbHomNn+/IN6vC0tPenPSXCV53yUtmvi9KP+Mt+N09ZSfawh5jaHaCCzON+M8+Ej1M77SVYOFWZbHdV5lGFQMCB6KYOz3scggFcYwgoOevD5t0awM61qgLBb6Vbs7MfpDNFuzZvv59j7uvP33fwm9rt/+ci05NskO+qwjPSC763XaA9yv07a4x8L4uKJU1GOkDyB6OP4Rihepb4AfZe9saS/7XX3VZ0iXnawCkjEMs9oJUkiOVkxFymzSzYDr5yplsR0eu4WcYZBvV1IWVinyf27fkYWFs5qlNA89X4swZ+yP/+Xb7pg1YamSsHdQusi0qQETKnQyvla06w2+5GkmRUk6M0Q7bWi/O+drk4exqinn6/UyU1Zsz51Vx7tL6Bn4QouCO8gnQ3NGqcq/tdRvV9u5Ne6Nsv00kxFQWbhCFJk2XHXSWG3XaOhazcjCxIs2lYIs6r6fdkF3m6pjb6+5EiMK+LA35R5qMaHuYpZe8J94UWF3TlUYsTHuLLFC1JTchcV7HucDBB5gBQxFHZCiTVCgSZ12GAEfRsqgjXiQRrHagFYNQb1IRaeIqN7xFRgNERmV9r9Rfq7Vi2FtLtRXNrxCiBDdHUDcecoxwKtdXl5a713x3ENnKaN0lizbmmlNP+AH8M212qEm7NKCDggqpT1XNIciRepbWIIlIFYN+REJu2JSlCharvYjsYhpHFtGMuSZ66tFImPNZIE6fKhIwKxxhA2vpPTKJMR6BKrDNSrhsR76fyyw44UjOF9W8zoVLa0+j3SwBxEAcAOaZcC3zAbU9ldbLBtUgFVJnmoABji4asekgBaHpJe0QD8HEdA2u2sqd3mvkBF/CJ+ITLDJ+coqJagAaoI2SF2zRIZ1ZZRG7h0jGVLz4yOfzOB7a6nfPiFP4FL6oV+oTmBf5owx3zioZz6qS6aWU05gUIpkxWqXG2o0A8vziGNDLlETKVxUGrLgyVyFLAlnNFG10koVzGaDOELJqJECO4ACPuTFF1OmllnuuQAoA5FYCU9qhkomnOlRsB8BxIYhc5eJ2SVC15iDI0W2pynhl9ZetG9iINIV5QponQsCoKhKk07tuz6lCkHrqCruz8dCVgGIVdbGVRnkz0CzEUZUEm/bTcc2S1qlpTVL8HgoyHsFjxMeIj+DziGPIxaYXq4Cbpxpj3jNdqCRP4pphi8bbod7WRdmDu9GzjqWlhkyjvifi959pUGlf4VLx36y33ZpZDwIUsQi5prO/659LOm6VDNf41an5bRYKw9eAAdxjY9etaxha55nqSCzH1pgfJwjBURQoVZDF9CapkOrowYezSH5OdLo/EZFKvfDttZsM2twkAFAKmXMKE049uHY5T29nGmZGQhNE5jRVNlf/LR/NZbJPqfAVbdrObAlgZFRJQJ1NNHA8BjFjDAAcR4WzUAm0ioJXsb7bddcOpFQdOkcs2j1V6+rKtVpWfAQveXuTk/XvLl1+c87pKkW/v7qfxl7/UMG8piS/JvxdGmsJdrp6bTJPC0VZY7QeApgG/efyJN9Wllwmst+8zEWqa+8ANwyvYqQl4T0YwfGWCTi0Y6AkJhJSxAFGGXhAwf3BlFjVTeqq30SMUlWmG+mhhguLauyXuab2o+acmvWB5aVMj+N62N11l7qbgQzxb0JkS+iih28xZbL6PZZ7UJPAXI5l9TcIwNEhtdXRIFK7D62BvWjOlXlTplJdZTHn7M9lpTGUcrf1pnjmmn9YgeT1hKmK4tfS+oSqohQC1YayHrin5d17CYDVVggER/qkRbhgCZkHnTvbzH+QOx9TBfhq/ttsT7gmz9ubkLK/5iCLpcX4eK+AFbIa1FsY17a5XVaKCgzxkupL5ttSUCHsAbivcJhOZHVggOBMV+97QjTZY0SUuVcJjAq6p4M7LKMWQA1pInhkdTD3rAxPlIG/q8FPe/C2Qtzys36+qhjg4Jp6dWDrovBoHZJedhc8ibniP/W+roMpawKXtL/HBxZJkRuQ1zsH+L9gqEs7hVOHFAnv6VFCY7sIEXpKJuphtsaCKBwEAWcLCIUYzom6veWyzbvYr7fTOojtDY/M5sF0I0y6wtJlpq59KJA2IfODLj9zkxJNJ9S8IXvBNPEJ5s7y4Tk8xjHhZ0oAJyJw1GmdEEfmZ1p3S6JGEJpkunO1U8YAhEM+5KqW5ss5O9eKIBI6i+BbE8cL+KJpxE0WGgoAYyo/FV/Ep1l6SNNxZo5BFo64EoKG7lBGimDEIxxQHOJMzXjmcWAcijEVJ/QFfk29qC/olTiZs9SaSzBsFRDt4FjMVekflt0LQGGesBDdv42JkMLx4eQZPKRkupTicKk1mNRwtF52h8rFF+lYoDLHGNBknR+izVF0fGCZ+7XadmGLFV1Ld3SSZ0YnPftkqdfoaDMvk68+pM1CbQ1bHePWoQUA6WKjaAHIisIjiZw6AwHOIp23ZLKKzNzefL2s7HZj8TKR1z42c2o9u4FAmHOmThW6FVrM04VJ7YCflGbFHGOM54jnGM8xnsFnCSA49+RbUXJd47kO7A6kl275yS6BrqPi7UjaP8+OzCW6040L3ShIg5fmWuuy5n+fnHXN9aeCue5vhq1ZL4RrF989yRqVe75hSrPbhlzjUFuQusuJUZv7qt2NzhACN/9kYHAkJpEIciTKibMbbJbaqHpgZkfH7mdijyqIeYvur1u//dC/ztSJCuRpx+5buorVsjInVYpeXyyXqpKXS3rVAWa2Oi6TfTLGGfggWbiFGMgkT4JuDhiB1zxdUX3EsFNhhqsxRmYKp7kbMaelwglbbk9aVmOZc+172LjoWu23qdj3+G0+iXnOixVw+0D9LKmdgU4d777oNe27gN1KhXfHtYE4b4b+uq+HvDzTndlj/+SaBHn73MKrt128byUAcECEwCrpkHq7QG60KAEoXgQEHHZCwxHodDApm4Pvzo/l4Xuw4EpKrF+M/gIl3vMYV4T+7rkxZWJsF5bPoB2Z2F34ukWUB71m0yDvBQnL3sW+RZr9WTPGgbWmmxYq2GFQmtmUrAZUA0Dluq6Q7GWkXtOiqvDqdc1NNnrkm+Ypr6mmjLtXfykoRxzWXHGMo6w/jhWt2j6/xkNJctgTozvkbFqlTMgSZ0lO/s/CY6QuzlAnqI+yGyxeHj4BTa1CgG0/vu3EXVRqxVGnlZUX46eviBXOBZHG7RUfe9CYF5sHRdOIKsatZ+yokS1Ps2/tc2sQvH2ZPuZ6tjOxAgKXqimbxTuokwU7uqHgMU371dljrSFdS7zlur1W/mvZ1VZY10zsgqFNBxx4/CcAx1+Rxsy7H8cQAAxIW1XiSD7hRmg1GVVjnzqq1DqLNHe6Jy4HNNLN7nVZChoHoL7jqLGKmr91sZKHYlTieOo6+JxGEcHhGqVFdFI6rnSpK+pk9jpozBT0ArtiZc26dLrJLttwjJH1mO2edLkoeiWrOS5TegnZRTFlxjTpxBfomP3pxBf0hTBuTMgvzN8aqYiqngpEpGIGZsZrxAs0Rc9ZWZMx2JxWbq5udKw5+McYMR6DcjceMGfOiAxOYipfqTP4Ar5CJ/Vy9JsAZ3lRK9DsrgbWkGnioTRkzdaA2VsdL4gVoIVpHMgxHvKytsBBChabOBc638SGmMgM062GEqEgk3EMvgzZCiUMSFvdjq6weeO5WQ75tUtL4NcGUFPLa3ZZYi5F75jrIgGzhkqYgNEmftT7WOrmMg2A9R/Wz8NlwUWPwMXKLYmFwwleyOZ0nDJg6thbAJ5k0BnqiIIuITMDiZyYRYwmY9aFDgQmZiJPSERMpUwHwecRH8f4FTQEiCsW33bxYHdgedMba+toM/EbrPKz4r7O0v51/btUoNp+BJVpd6760Wrli7PO7DqNeJn4tQoOJkUJiVu1TxMahTDtVsxYd2S3A0spk8fQFkt7e1gCu4CtOdmPrit8++1hVfZALA/FWWIzL4BhR7dzDID3fIk5HeUuzp+4JmF2jLXvcp3lTkp8Pxq3j82me8B0h2LQhx7awLfuGyj7BnXgGdt21RXo/kpoGbp+41RGZuXyynigxlEJ0SGGqU7pc6XqE6o+pEEa52mkdaGwokY7ALAxHJkuwraSCKdFq+n1SjxeS7P27N0ZzG5lzQ4qA47p1ZTYmwThZox0OGw7p3/wTv3LtRC77cVyV2xheURYImf0WOO/YdXdeFRfwcF+Jz6Wzfvm57Dllgu/1c+m5Z8UrxSqX50fJ2An2BBsAIoRUShmP3gdFTGha0b8LOZNW41VK6J+OWxzjSHna55fJsMpXP1CS35zaJfgFW7bSc5UZmakmSanOJOzC3+zdZTpw6Gb6KI3XgfNl/9Y2E2nWLFMQAgGvoPOIYeQMgmAzb0JuxC1E5PLpcTF+iJMo4Cwwu7ld3lfV7/eXZSWBqo5qUi/HZglXyTc6yMYgTEWrS3A7i3hMfBatM1DIwn3J5b5xAtBvY46P5FrwJMpJZHRzo9AIaM7OBfgQlp2f12prK/+96dzhD1xb3/TFZpJwN2Z+nUxWteJ7q7qImWO1ykG1Qb72iYtChUrYtkWErob4vJnVGckwGRlOiaUojHD9qlTyVRbbmATJdVKVEiz/INoAyK3EKfKviXL4fRGQL/fGq9nZ/e8Y+kMGQztH3Hg718w2CML2GrFixklClKroYEYiF8ofdc3qfLlkZUYd/Gvv0vgEIfbvDZVjj0Kew4BR35M7RbCqepPLBdAFhSnLdMKUIM2kMZU4MJFofDIMpla1F7K2V+vIHX7MKPgvJHu62dwMzicecaK2fd6oxn/k0ImOKEXNME5F/67ruVDyeSbAE6EIx8TFB/u2jOhT1CMMLklAxogJ4cGT5v+jDOU4EwCtFO0LMuFzAuOQByIUzyy5BDkBCXkTAP9T+AVIeg0RGWUH1GRa2b1wbBB63S+p9yNUAxkTymKmUnQLDuGOIopjccxXuIs6p6JWRnZpXtpCE0XY/2024dpwCwXE+xSDed6CLt2SCOYL5uSrqNYdW9g143RfF1bQvlu4cUVLH87s1ER5XVYrLcBWBraVl6MBMlQGChox8e+ch/rgzE2/WQZJ9dR3Spms5VhO2zZ47OIpSUZ5Q9KUOZpciEXY6wwETBNyBtxjPE4xuOI5xHPLgM42Xnt9cjIaDxr29w1V8Ld9n77Yf11N4XXyV2/9rGxXrPMggwjvpzhayrDN4DNvhDr/F7Xt2E6Om5fRs+lKP3dvFRZv9uF0HJXm1502Lh6f9i73cDtdZuKcnXMdfA2Q4FCfbiTtwlVWJCNu10NvAeNvDCXYbTNzHJIJAUvT2BfggJBa0lgSnCkvOWyM2pOPXW0WyrcvzoE/tPzJmdaVac05/yaX5rx4Ifa+ieTOEjnP3g0m+qpHJNkNas3ZxfOM3V21kUkx3iwSxfK381LDIy8HWOMMeguJbjGuebhbfD73GKMEF0a2J+5TM+2MS5wEW4B75sMXD/fV2Ft8OtQJbnI4LXhkVFFSq2j1r5eWunnB9kHkJc2uGLM/fU5DJp1mERBggjllCMIcaSqhRsAZuYxAsCItl6GNJnD8QeSy4a+NgvTkQWX2nu5ja1KnS7vzkzH4OdrVs1L9dIuA2hNlL/u5yNN2ZprTlAXR7aIZqYdUwdOM2sWM7skunU4ly7ejMk5cwFKln5euw+24ys9Lcx6xsonFxlr2f79T/2vAGAGhtwfZy0NCeAYh1bE902c/vJlg/JSBRfVZg/k2zkIgIzWjWwczhvm5AfRumaDrv2IZkEEkIEKIKrqZezR2ha/xvA2nre13m9ardG2AZUq2ByEXjeiCGXVHpFB1NA4CBxZ6rH5FnwWr93UNZ6KJRuFzVmwk86KtAjdT7pWHb5KvUmXfNQb66BqG1aZyc1frVW4P+/2p+J5WV/f5+quwa7vHr/+Q5maU6vKuGZ0eksHtGi+B2IEkctA98OPa+qByEjZkIFRKgN8MAZHSNWU1swfVUc3AmPEeJAUmfML/HRyFzEQDxwPABj+4oSEefp+iAM8pIv86zYZY9AFZA8TADT6dhQlDqKrSYNVC+z0oYDhTXBSX8hX7b2ZeZ6Yry7GTfBEvoAJvGoq2gDlI6qTT0wMus2WMDO/ODCOaHu6TrLiuB+TFCOBNP1/0OXtptuHzJdM1+4ITcPCJHgII3AEnmZllTRGUImcoMAJzBiKnJpp+4JJm/xM+0YikJiF6ezakOxIMDDtoicULNplYZ2DFYcQQ6IwSARyasjucYU2uaxHktDkQESF4HySTTuCHd3kQr1vW4gkmNY1bo9jYVzSQJJZJSz7iylXNZqm1KGeuaWhXetTA1V5lgzmzAuZt4Tt7dyXANFERsX4nnZF1RtvjMforqhKRLj+QyysR48/VBE4Y+hWBes6VCTk1DyrarPfTyk1MVONmXDVCyqYdIx4jPExXAzAQZKd6m0kVWmmXem/qZUGKL6V9F0fXsbN+u6yU24G0HYUoXSf+6CvxzVSfS5DYx2H22W1fl0fuG6xcPe2dKeLmLNJROqsqHLwQr5oPfv+A7ZxYrv7etiyRxekgeHOQf5wB/iqQ0obNBVEDYbZfkDK/ex69mb5h9cSTBv8/es+z36tsoQ+tN6WTw7pNg7Vz3tNmg/zWhE/oPdDO6F+6gJI9Lc2BAuV0yWHCU2dOs84ZowikAeJCG4NxM3aYQS6Ha+ZU1LOKSUuH6aYcN1sBu26SMor8F2Fd0sMJO2S4jcX2G+fQ7SjIB8blp9YmGMsp8hjJrmM9W16L6m+jWHl6++x+eyyxjI9VfmBt7F58JnZhQm3x9k+2SVc6Pq+7eEtFcnbm5KaR8HElJUNEiPPs4jWYE5jkcQ47EQHggFoCFbyU2lgJwIu//NenZ1BqhTE8gEkzTnP89SsdEt5AQ4oF7Ee3hI4jXLM2p4bT9cu5NINOlhPygsFtC64LPtalAtbLFWg1AGRuKa6aBja+u/bmgoDe/fcnvslS+ujwNIHNd6KMq4nDU/LsiAXP9vPr+8uyt2Stohdja58kuxd1O0IFWiJl1G+b/Co8fiaExCRpvsjBSVDzYFSaP7dZgVcF7vnPG7CvJ6RpAnU2cxAni5rzrVkJRtbIT45isK93EIVEZBTNRUr9LdHWZhAAXo9CgGoqGjZSoCyBuJtMrDPmw8Lbq7Jqr6o4ihVpOby17nvRJu6mUKTYXqiCpcH6Equ+tHQ2oadJLmWO4U75I6tCggc8T8m7AFMaQE3k0xV825VQQtJ8mB8FU9LByDqCcmiUqtm094yAT0wnjgO29rlADi7xgAHjgePZzwQcZD0xM45cyYgDCFOC6MknC/MifNVExrH49ffzlyXrfmwoOEY42EzHMK0msqZDpMfR4wxXS4b7dKdc56npDPCDZ7myN/Qp+fhPM/z82t+vaBkTOp0BiD1AnJQiuQIaSJ0PGKMwEiGOBQDisw8E5PkOAgydRJF6tcaJE0FLkxAwUkWY0EgpyjOrZdyNTBie59hweVJDFHNrgxUBdOMnNDpakGspoBRzUUhZk5XuXsvhQ+Jks4tX1kiGDQ1Jd3k4oDR/eB5fs3qEzBWiyk35GBZNQljWkCFRgSYBvLlQp46SKBl/NIRg9mKDSqjTnL72qz97c9bE1UNlUvQBKmpcYhmrbauwKyUuv3HXVuVBSnOUj287SkmKxRxFR5IYvH71uImsfAhR7NDese3obWUdVwYykuxrA083c3GaJmdsd738TWXas8swtaaSpLxwfhb8CP4OOxOGlKHsIY0Fo7gxMnLNIQ9mcAelXjzvaN7e18WpNbhkcU3vX6tjAZQuL6Gzxo3NQVodmBCmecYB+6vdWC8/eCfJ0RTJNH2lXz7dAu4YoAtQ5ekEfwd9J9Uqvvd6mqJ6Mdps+P+4vYq47vNOJJzW806nxBCZFnyw66eEK4Aj4hc0X0144pExu7lrkxKoiJ7UkYc6sbjDfxl5TyRgEtwuOBG62UpDTj1Zl6JKRDmaq6MXNd7pSbmwZDVSPBgZBTX28vcC4HqtoMpb4RGlYQOIhE5YowYr/wqkC6OYCrnnDPnK1yYFw4jECi+yc2uqh+zvdwWzgZT5Vw7bqWS1A7zd+CWdcxawR3pBADzoiVd5KRrZd+MM/0EhV+f3FyUCiWQP0Rn6/nuNQa6CSR2K8TB+KUR1sfUOgGtWdebLB/KKjpKL0UQmVPAIZyNpFbIJMDUMObIhWQ1DJeOo6aFMLwkZRyrv2A9NaHi0shXnp+Zr8AJZuZ5nif52KfRbl7mLDJcOwDVZCVXXKkh4pfTlcW/0fcEHKFvA9KY1suaXKvmiVFBzubxOJYGq0kr27pCOavAQzbji63Fft2QTuerb+LRX9jjLJIDkqraspnrIFjfXVb9N0egSmkXlKui7Fl9x0rk3roEGFDadXYABlcP5qX/UQWuMTypJepMYlEgNDChHj1rgJVbtTdltncMRvIqZUBwIRLXM749ck8R7u+0pZDhnsFZnRbRyxpwfC1gZul1prFSPZKq6rlBRHbVDVfJXqhwswwPiTKTYXXtEDFtQgQr17/5NijETmdyNtv/++HlXboEjCToGb7CXv3szhbaA7jFGoqxSO3sXSrDw8lj/h9fAJCJOekMSIrzpCHFMyUd2VmPiFMjau+h956AGMdRwyoPFcgTGhh/Bw9FTFMgFzsr9RIQGB84fukx8fw7HwNxjDymhBk1d9HQ63nCDsDrxHxhFqTnfJ4KHjyoohHA1wuZOI54PuL5GGMgIg6emmdOvITH8+Pj4+NjfDwYwdHF2WmsyoSbTQAzmINTemHq9Xq9/vj9+cdv/f7M8zWG8vwNneR8DIGni3d9KkVgHBEBjElCoQjkFR6A/Zzhkx6rKAYkR45WIoWGhsPJHKTxQyysnW30OILhXUOBKcwJdj26/QvI7aeCBcQvLIzdWuHsEId9Vbt80XGjBpdV0MQeIEVMYkSk0xgBMo2QIoZpWEXlHIwjYmrmeWI8JCSS7vgtP44pa2bO6ezKYFSKkEgQcpOEAI7giDFeX3PFljp0EQq4RZ5P0NZZYiiCOjN15pxIOLUll2vVZrONVfDe8+vFYvju7ef1wEOoYmi3g3Sye1QfvJBy9lbEsruvwrU0PD3zhMxUW7BaMmIcxEgIyjGGdWcwxliFg7kse2iWb4M5Mc98IRURmqnZsJmpCsqowgA85jgGx/9A/A/yb2N8PKjgp8ZzKjGTMNVfvjLP0MOKg44HmhJbskONFUK79LXh3FFcL/vUJZWUAwQw1wxJdI6YOR2lcaFERDi0VxReOn3HzGwXr7UNQSLnrQCuakMDDJzzBIrIhcQgz3lSGGMYABAYEGZOIAbTdOmms7BSyfPriAEoEKQmIBW9+JnTLPAIH8j28udwp7U4WikuPZ5LZQcDoEtllGQcMQ6JL5gyljEiOJiZiVMJTCZjPEwajTb9gdGxqhnBzGm6YffhCQVCqUQoM0NmYhGSYJJjNrZqMI4YAeX5ihja4ErGCY7yQwrAmnl6ByGEGO5rUt1dRwBDqHUEBcf8D5468/w8+CTHQCQwOMwC9fl6KSgkclIZmdBknoTZOlLoAlk97JjwgIlKV6KjwvFVTlMp1qInupvLat8gIs6z+iQ0XQWAQLqItuNZFTYrG4okj8FwqydCg8zX67X8/zqkSi765EVp8NJRYbtVJAec+UkWlKVszwJwDwicMyfhMggSTb4EamSeRtIPE0o0nMuGxNqLBsWU0VAVXwWkkTDGMdtcswouV4Gh+UnSDd2VqYgRcc45ZEZEkQKmAIMuLPjZvK/WQGMMq8RzTviUQmZO6BWcxInz98xTmtX5QZ6voICZjEDwOJ6z2LMBR3R6kdyXhwp/NadJ6fnC+RIU4sPc+efM08FcC7QVedu+o+1aRgQUwhRiVJuL6uQIDteedqVpYZBQex4hZmbzK4cb4aHRhTYVvLtsm0GYehkL7PM4WEgXu+rBqox3YJistiKVYCzJBBQzGxZYBu5gDIyjF6V6+dX/dZcrCJk8GGah7TTsrIBZwkCaOd3OFTFCEmYz4QYkI6rRldDedno8HstiXL7OQFKTCHPm+BC2eXsFegQDtg2gMldYFea1KTyFCPcOY4wDoZyTOMhqneCp6P6B3nYQJ1Ir2euKojIBEn5LWCQadiciyAwkoJkJpebAiABXoLFYjsdEQqY7r923jHysIW353PbmkGY8Cx7HY35mKQwjoIPGqrlWzZZZw5aUtS+rAI6Zaa4GdZfWzr1J6Z4thz4EuGhGLFbOiXPyPGNKOUOTcqiUIh8MezYSfUTaxiTn8kumY2aawgCJMTCCEaGEqe2I4x8fGQcj+DjGU/HMMdwF8pigNBOPRCazQuAzUqde1DT3vZ18jeOF4OAMhAN7eSpTOV/HR8YxC+38PEATZ/J4xK8PPJ84QkeYZtj2ATTNqwVNAUEJoOZ4fX49vnD+iuNv8fgnXl+vgHKeyE/iBKf0spVZnDwBDrjqBiH4HUdYgUKXuUfy8XDYQJLxkgOF+oDDc0hU0ylHvptquo8ugkgdxsDUQSVKwWm2DVLBJDCCcKfv2XAvn1ysgLYPuwGsQ9AAhAjMIrvzhk6nq12jysoJprlHOyRvaU6KmSet7AliIhg1MzAx8ALbGfhKV+IWGUpw+SEVAxFnN4HA4sPJiihuycoyl5HMVGrOqenjwdNbKSnfGT3tTuWPhmE4fJ2UO566EQ8r5SIGIg3fYtiX+svkbLvyFOGw764LWguY9a8wVW5J16lJL5pjKkkhq2ih/tqBg5TpGFKS7OGyukvNzERG6gE9Q2AoOIFMZigg+1VF17dyBzWrRWSx8DDe9dyebqWnojRde9dtqVwaGUB3KrkS9HV8dnCXW/gn4NDoLXCVGzRWbRYvx6Nk2DD5CuN1BMRD7++WBVlKTHDP8sBgWVH9B8+wgXCqou2LF/+2mpsoXu3JagJJIFx+bfr/ZGhCA4GB4Bs1KlNF0NQsBTX6XgyX1CgIn9Mmv1JMTBvfKTmBM8wZB6ECXeNCu9KhAVs0fe6Eg31nosgLBBg9haoA08WDPpFkZFU+RcAklmNgcvAIxogxSvWkzbd097HUKwlpBnJAwhwOlSgc1GhBDJV/lg5RNTTCs00AIx6qg/urIbySdBxXBomd/dcVx11pmZYl3/D2lcrMsH2LEh5JmHUstRzqcvyutEDj6/Zk0bXFNiBIF75ve2Oqulm9fQvS8oJWLwJbU7nFEXGp617x7SXpvJw+d9W8/lSDzymisDd5rrnyXqzFcR/5BRvDQWs8TQRyFuK/Kh2l1GnQInMKk5q4uj3McKeZNqFyEhUxYZcz9rNUCkjh1hYoAi8n0zHsqfqsM6tLRzRUe+F9Ttxvz25vKG3UXOHn3sylMbhBB11h5/o0kGorH2723MrnulWByrJDNVq7v9FlQjIpqqGqEcFl1dbuVWdfXXsx2LpmNiXqkmq0bF8KuZRAVgkKN9Gvl1e3iu5c/Hbty47lA5fJi47IAEiXVqfCHJrEYARtksoNkmoCLhjvLUZe7qh/pZHctA0jgjwq6qkyTjJP61Gaoqbi1Y4PGnhdC5eAipIE7tJUi9Xq2pCBfUYcRSJp47H3NVfia4au8Az67temgjrnUMbVCtD3p5eeAX6Sz01yBNcXX7lNHzCsDG72k/uRK11zDAwng4dhIAZmNsarFFeQrk8LltcFpJvDFcNCV2drrReAcUKKUyOPq7N7mQ/Px6EROBQPjIf4yDiSkQ93DCt2+ZyYmSlyntOV1TnFkyzHPjkmF57UkTYLygSP8zhmHHE8H8eH4qBCHDiOfDzOx+M8hq10hu0SkWI6PlL/cvD59clP4ivOCDAmcPL4mOdvTnIGEsoTrIggy4KLYDkADIlpFHA1fnN3VrjnR4himtuhsFy6Q+VYh1q69WBlJZuiwupsRFTx1orKmi4ykaEURkVkAxkVpxfYyf8yaGnvGGUIZc0K6MhOCOt4MEgEQU4TlwSlrgPAFfKsvaqT9gZJwD07o3l8/AjriMpLJdeSVKOUskRpA71QIm4JUlLtmuWomB+US2GbQMTsEAYyOJFXjZPK5Ct4qdouDJkrzQ1j6pO9hd5fS2EDlQjuhQMqtieSUDCcsfF+rk9UArsUyMgFyARoBOQyZGB1E+b4hyMNFWuB5qyexhU+LAAAK6XcF1jeCNbh+sMTfYPU1gxxdzZWIrUEiU3H5A2fuIqQbsZxX83y1kEjX1Yto2V2XJVd+6HSClUg8v8n7F+XJElypUFMFeZR3efwE1nh8v2fcEVWluSZ6aoMB5Q/FDC3yKrhxrTU5CXSw90MhqtCUeU6wB6+u998fmKv9jNYapyXuvs+sP87Mri/bzcgaMW3KtFHAGDh2V2JewW+vbZb6c3x/JjxjWrfwp5v6p/0gwMuxHeOphxZKitpvrMZ0UUSXO0sOZBwX6/UBUWjpJ716cvb0R//UkPlfqDdUFm3OhXrGN3qAWstxBIZvBgXuMIjvXu9BGTiprLqXXW3PHtFpgsacE5iHeEZth1ttXYsJ8ZYfnsBuO/7cLo9kH7NM24Be7COT/nzkaiN4fZcl+HEbIP4yAB2wEZO+03rfzxeTXVEj2b8KE36bAcAXuQqoTORcOIWtU/Bps7Ub4f221n4//+qPeSVDYDYK7kvovmiqriq86U1CUm3i12vfbR7kFxfX9ojpecgu3CxYfrbv7YiGV+uPzRre8/tGD2ArtKYG9iQYkLufTyxj/PmAP7j+ph9P1oDy1lnLzT2mriPosfTwukMEJ7VC8EQ1+0B16N4+2Fdtzw2rKo2RNv6PvQo2+bPVyO9JPEhfeln25RRdt7w+YCe744jBugMyyRcAGSnwFpAnXTEsTg68jLC86tDvffSbjU7crU/s+ysZ6YGtbIYEY1s3PHfvn0/b97tQAKwA7/VuIEWdCvh4PVqghEN9yBI+OnYhHfPjU3l6lD5H2OnoS1dDrHUE3ZTGB1BdJcAtkH3iQ/7MwOwxW4PKQA1s8mnVa9td2uquUmSnDnTGndjr6o3S1K2NMZw1vQdTsWpA0pJl6TgOFMtMSQbYAIl+zehYASqboTTkT1Oiy522Wfl9qAEYAUzvrA2efpey5X8SWTEUvxCLMaF9cUoXNX54TVtc3k3X3XcyHfEHetW3axEyTiMOfFOeqCo9dfiCsSbr0vXW+uXrosUl3hFvH7EulYYhBA+T0Q4TF7tNkMk6sVALMYSLzGDPxjgWwVlIckbLKYWcTmfGTC1v6kcnfvY3sHeyIhpl2VAtbMyVv0Rl1cYnW5TF0NicRoewtGqdf4SkCSIYKcKhKICyCqCqOUO2d4Mnw80zsrmVCh1JzMeTQpwAbej9ybcwwoGouf5zuALj16h4Ah60WRgDkBCcQUpBKJzMAFqARWKWONyPaqJRJQfAy6CozU7AYTZCchOmCO197JnSjuZZLe9tv8L94SVOTSdVSrpY4pqY8GVocD6PkIIn3H2aI2aUPzJXtix3n9bk5STdWDs7FF7i9iH+yjc77M++Y/+Qb/NwXD1G7QLf3QKpL1PJ4A3bLo7OZs1bLyTw8nWYzie1xgJHQ6rji377c1zt2Okv3Vkdjg3L3YD1IRG4Rxi5bdr+kn3o/nC/sE3MPdp1B+T8qef1zDKf/v53scIrxX3pvB4/XEFfl8Qclp/27edSpltcHeTfvyJ83y9idU9CdEauwmcSQbiaSXaC8pnGuW3R97hyvEII1DSOMEbNRvwLNhMQwLgCkD7RJ5HnrsdXD6CiKwSS+vy2B9AfBms6FxISSl93crKX7jvfN/LsepaZi90KWZNUfJYarUWBYar+1FZ25uU1PXr4/zuRzb5EtmJrfMN2PbS9wm48uAfPMGnpOAI9qm+PjJ252XPjcg7v205J7LSZwAwfE3W/LFP96NbdgCgZ2dXPBOL99v2zZx38m15+fkyreqc6EeMOGdnd0j3Hd5Z49hRPTqTrYeeNdxd3c0CVFUmiu2U/5Ok2GvetRZ/0GdjhjrPrpk1dD7I5CaObnUAsb7H5KcY6HvzRqRmphGXynVqQ7aMuiIw9BygkEdHwD6RT0hAbqdccPwwKXAeEewjNkNwGfExTmQep4+0cUYASDcRPbup6R/VMR/zub9x0yUxXHqjZoG27mSnw2V0H4Fu/Rr1q7FN58UxXsfOlwSaRWQEElsN8XAZNZAHjY32VYxBABwYuYetV6k/FwSX0xLkcppPJFEyEtd4omqOjen0aKR+C0+wCxd/OixPZXuDD71lEo2hii0C2Haz/3wKRgB6yK/VCdiT1D5TV6OUgK1/PgIAaa97lke4AN3wdkSVz1sBXIshIuJ6KWE2OhFIgzdhwk4TZSxGkFFSRhfjmjEDDaOj8UjdlW90hkFyAFC9EnEBJQTXEm/GS1EVX2stLikyI9Z6ccXEjHJNEVWIYhZVkTfqrgTjOp7bMNCY7GMa+0JG2rcNXQRw2c9VV3uDiOCCwk1mjYKmJNxfuYj1iigipZX8oRVr4dL7C8moQAKBRcSCe9CMBqdLQ7SX36fABiladiOck1vcRGEMOHMxsaSdg1YMAZcP7Kyo/wGU7+AV0e2kRo2obswQBKgCWgPaGTeoRVNPsnXgHfS0MsH111g99sW4BZKm7LDe4gJddIh2yUkEuPHawbUiVrAf3PMDC2zImg7LKCToyUBE80ObFN9cYq2XJ/pXhBQMVcF9xzDroGcO+AzkbXa5fPxtRyxlUEw5Q0Py4kWyPGF39Z6RZE9SdK+q1/DRUXOoYM+OpEe/WS9vXIsSpiUC93RRzNts0hog5HYiRxg0phpwe1NM9tfoL1Uhq5M03QDQmQnUg9jeQL6qGeT+zS45UPnNM/7dt/Vd77v/5it8e+cDSAB6FE57BQYPNDaxujHuMTZS94PHqNRRf7vLuebeOzfjQkL/ix757bt8DGrfTG2stmZMcmtory47vTqf28mtvTzs4Py7qfMXA/j5MBs23b6d2b/WxVXyDG91XlcwavJw5jixQnGAoZhJOEEoHAFsE5mGdHpGH6yeBAyH4zQOPyWCYeqGtNohfsw2w43Jq1qYzhy2eb4HPb7PgUpa8CFeihK1GLm4SDG8g1l53/XP/f633l98Z4ERoevi6zVTkIHq5sQtD9G0n/G7yOnJi/sp8sRoAXTAMD/sWx6rL3S7yPbmJ7rGc2o2NyIAFonlNMEYPouQTgkh2RbqcCRqWhfQF+K4OL8FAIA2dNv3XW7Gfpqbx8a0htxTz87X88Cfr32WT2Hm45wdAf+xalKywIiqiricOCoYHWStyY0sEOBAwqOvpTQZVwy37BFWfY/3BkPS9cZ+28Q/x+nejvuHXopws4btZmer1pDXoyt+jyC51NWa0xj0tmqgRySJcF1cgB1ij5HpxIoaRjeeF3fg5DaSuqdSxYZHTY/KXv+Qsat3U+WoTFqGQwjue89IZdNrLhDIvJ2DNPPEo0CavsGImaBLFUMv05pBMZg69WFobdyKQJ1IqsCTSx5gQhfS/cgU2Nw5XZhowWUEBcZ1NaZ/n1kXuda6WB1+bJMASSnt9P6GCJs4j0Hn3hj211lJxk6FieimElD7nLnLHUsSGmlLwD4UHGhFKLPQNPfG+3T1te6Z2RUMd2Ci82uwPVJ1cNC1UkOv3d4xpxo7PO6HDbAnfHhrjtCiExat5mRhJekpDaylGvT0nJGqWp142qfbuX5cyIE9Aa6zGjbi3PJMLy4nK0EtJAjJSMAacqdYdtDQleQpnXDGh6QdAZJrsl7e2gVUD2otRSSS7ZBediu5IrCYLC4ggz0nrdAIaI2NbgcH8FzJTowtrCsQYiiMRYxiFDutRHIByxMJ6MZXglKE9UjF0hJ5kekcVoB8ceV66X5Hgl0GgF1gEvRAX/pbtaV3wmv2na2Kmm2JBrsUkY/pbUWAcmt5QsyC6dYw1chNyhRJBFFgTF0gxqa7YaXgbq1Y7g/tY1XjEz8pFQCIiGrc2y5YAKYnjwuKQnSc05DBUIARtO9CyGlTEj2Hp0eYDSVW11cZyjp4akd6GxY5OpaBC5D7RqcBDCGGUfOeUH2P6krnzOgk8tSdD9OAHaza9gyW7nFq7SyyVJ1pBc6a45iNMfzcGo4ctKU/5jC32RECJOWeajYvDndhL/XOKTrFgiALFe4lbRBRVs7g07rbl836cDU6e23t16qck40+bO3hFeh08n9zFw4Z5hkCYNTtc5G+xL7mKKZWABzVD6FIW6aOx1zc6ISCejawr3O4C+7l0HE/OzPqVrbqDHqnKvdm+V66hbSzmDsDWt98r4nzPh//8QjnbfOIY1722h5fSA2iKocuPgvEahhjp/rOJ7JgVBUEZVnjsmvlhQIXatS9PtfcTtvx6fuetQlJGEBivi3GsoqdhkPsivV+hKqquh0+cf6wH7oEwQxikjxLr0DyveJVyLgCDVu7s97316+vX/++f/5c7/eFeL1e+vEXoev1wytg/bD3bObg4byl/bAbE7Jf547zWApsz/LMQDx/9XGdM615rjAAMLcziimO4fM92pjvQ0I+P/E4HXoCgLNAYDjWccI+cuT9XFPOioinWxQfEvVRPTtvZsOsJSNb9nZ//5RxySx0EWaEMz8EpJIT1Smgakaey+/c2hV9e/sGqhzeNuLsiZGfCOe44bmZve/GbDeuuiPu4DLt1AbpguIC7+GT+/Zceys+fmJwqhNhNlr0Yu9bGh/YICjRQPkx8feYsme1P/Zez2MeK9w/bHXnP1qDpUbsyEIdkIMeR+bCOL7vWk3qPpab1j6e/3yzdzZ2OHvUAaZ4ECrTaPqSlHtJpRP0+Ciuz+t7RSkzjvvjRtEdK+BLHEvVAWWfjvAw4Ii16Gre6SKzi04EBhVk2n1S0MAXRICligA/AvvHrMeWCXLjXD7WbTImGIRV18YWmV7wIKn7bcHpD6+Wn2KYr6mzh0OF26Z3J5IsDvtrHhZnb9nWB/xUL/tvTwG7KtOMLBZWH73pGBh96qFuChQWq2HbTjL7k7rDtZvXw4gKW+I0YK0Z9BQsEHcUI8K9OiaLVaqjBYhVITmi8xlepaT1fln7X6q7UqbGdADnkkMjG1bYwEJXW1dbfryrmB4z6mAQASDt5EoMRKLgVncBKOlWIYhrhS4gxTddFEdExGu9sErvQqFdCCoWwuO9Oux0N5sDHiftqwl12Hntopz416etBbhMcyZBntDmLDogTdY/Jjka0t2BI1O5ms2nN7VWPP7c9sec+bU3pccJhpzFLBX2tMvwHA3xZZkuFuMCxWt81+B1XQWlBI/0DEcCmvQqu0HKdarszrbVzu5Ic5O7uU94Pb0QndVuetpOaM5ghDmtuRlpJZygHavpSsGYQgHu3BZg9BRppFN0JYgs1lCbcYoYg9wFAUYMVAlmXiIg3NpSNnd6unRnkLBf3ao2x6xhippEDWqQ1ubVkWl/BlTapJkdG2ikaFxAfKoMHB+seXM5h8jnzd/U9vm3aFXTbz7J+DwTpxkkTMY8ZU6MjGWNqpMcAMSuwFpdNX1QG1WohA53Bgwws5wBN99Ma3Kw++Xa6beLVmBVtYy4JRoo3ebZqNITBXDX3OUsS5f0nh2EJ90IbjIL/PE10BHbktHrDwjHG9wezHSLSkLWWouAR/4tEIy3UtKqpXDeUUNmtaIGo6JWzVLnydSAJaPoKKlYPde6I6t96Nqlw1RjsOHdphKDwr5aZubdU/Zmv/y2cLaOzi5EoOR0bUXeXwtIMdZ+UCV0V975Vb9+gaD+InmbZHNdABp5qNpwcDdx9iSX7rz3I9c+5Thi8i7bVYN2a9OkPFkxbF6g82hs1dHZChM57FGrO66QnIDUTpz3STu9me8nadi9+gaqDJT6/no+xZ2OXn/cBZm3V0FPTyeZSo9hllR5Tjr/Hsb//sOst2zrHZGuGXB/xJOD1IjmjFY6j9UeSWsis36oVWXKCAk403d4IXMWHh2SWWDduivbzfBvq+udkjzo03iO7rnsJA6jXCMdSOrGf/UbR6b3Kf62O37OaORCqFnPIGH5OG0bxkV7GbsztZGWkMjSdIu1Gtk+1V7tXoQWAapkfFFsl1MaOEnsmHJrzL5tRUPLx70VENerV6YJORgfBLKfYc8++L2e+23bY3zu3Nn1tdjdvuqqR1V1xe2AmeF5vFOK5tBjZd7D29vupDeme719BCHQxWwoAoO1JZdEeoZsu/gGbq8GVJtOB8sz5fv8eMmdtSQHcRfjpmYXcOBt516CmG4Iq+0qCnlxOrLMrD7F/CEFQqq2SY/VRKsR7oJms31ZJ/mpemgGVFno47OrXtJonvaWP3QFO9vVvmBLZqJtgMs+rZC6xnWh5HCOBO1bKO2/moWbRI9wCgFaa9lBpYTgixIXyUwhKrDu1r/2Y81CQ/W9tsVBaV1LYpiUsogyVdhBQOOwiRFxmZoEdYGJEPJWh2XuQBrsmk8pVdTSq/RGou7bHnjhCgp811KhshL4oXgTP5Jr8cdiIF5UO8iVpRI60VUFxLUWXxeq8FYtZTgkeIHIrHjr7sNlrlknrb01DZNy9nFSREKyMDjsCc7Mh/CwqTQJkKBFZjbNJaeU34eHMXWVlDgGm1UKhKdh2K9L1So+5WWMspmIt087GT5RJYn325+7CGJF4MW4gqviHrKaFYYFrcXQel2qiqr0RIXo/vRy67aWw567bkllusDdQ/246Z5FyfHg3V21FW7NvbNifGKaAZBCdjGyBCBiubAJqApljzl7gkQ74OfnDrf3o65/S6i45SlIxHLkS1M2dbBZZKTHp6MHiLQhCk5I4NfAGGJljyS3ji7ORMZMT8Mw5Ko0wbBG4Rqs8gB8Y1potsPt1IiqWBsC5PLR+VDHayNk7Ol+xwKR4+hv3/GzmRJjVyRZ8kfsOwDgg6H0E/XPw1Z0SLtZ2TrZjin3I3+4DtvRwYPAqY05PszYs8tj3B4yWEiaAde9RI47x4sYxr0FV67y4V/icYrOVdrfSKc9jTIUsMO/KCkdTjpnBlXVWnMf84Ah3I1NIsBU+R5K0jFcguSuN7Y8bY/nqSafty2hDBiU8s47FtrB2aDmfl3mcoMhs2rKeIyAxzgYS8j6AlfrDRAZItO2ii/DGSKc6VnEqqpyP7fuqjszyq7W2p8OUmQE5C7JmrWVOFU+3bfPHYEPCETMcJvj9VSE9O2AO3D9CPla5u+8P3+I0R8frp6OAOB52+Mb1flZmCgQGM9bRz7PcjKujA40/HP94wh8e+0d3+///T3P2347VpgKrY4w72Ohyto1JWv56LJAM8Y9rrdGTXnri3bcD81fDvKzsh3Ab239VTWaR5w0SlXdqqubAFqnOPc2MLEu0k4JxXeV355ltsmx9EePQfWpomSutBWmSY21gf2G6NlzCkWqzHg1jpdMKuopDcMq40qsT5n7EhuTqXHWz33d+yhpJmUD6IoaAAgRi5+S7Jtz6r7QBBVuJdKOYdS/rCqgKOH6D0kNBFDt/DNUMkUlw7MOeBYBTjk/N7Ft35E/6vO4IfhorwBtfpv3NsiZmjfRUzXo+hTaMsKF3ThvSI1vfsVCZ/qcpO0mQKNGDyhaA+o89aiP7y4PqRsGUG5i8cdsHs52wQdpGZVdPegL0nmNXMBdDcPwEJ3eL9Va176TDZGSZILpT4n1Kchdx5YM8KIGXba9SkkGal0LRCGR5jQFK6DV+eCnDbmqSKwVmfl0RtkWloq6rheCPc0uJSQqGLi47juR6eEKALiAi3UnEGBq3UuvgKA3FZliXEBmlanAJdzwjAJ3dhr8UpGGzt47LTACQVKVv4AEqu7F8OMwgesCQOlOfale5LXi7xWv1Bvxo5T1Lk/fMldUZSRYYhUSlVAtQi/VvfiDV0VKqcCKKvGeA4h0wGVQzYYCAiSXt8SxQGmowR8GiVBArCpVtsUlpVVV7hmYSVZBdq00LrcUhNgz5EgW+MO0d0dWScWbRU/xw9wW3Axd6n5xdMG7w7YnkUAyimocFgLLWY+tqqx+3+93dTUN930jukcm1pKyVGIPkyEZdFI2ukGpOtPAFXV/ETCYVZJ0T4K4Q0k3JEbzDyihWDDmk2DVbQN/3/fMrNi6xjlvz12SBjZzzapGGD5pHq7OBHM4fUnvZLnnQEoGgxXRsQoZIDzIT9H4oq2wTILUF1UjwKz3U0TH8d6YtnOdYiEl+RiugAw7tRBkE01sF+S0mvOvIP748feP199WB3Y19srULptAAO7MayCVaJ4SjHHlJOfOYKYP4XMDtMNkhp8AMB1Xqqpmc3/gE5CUlStYUmUqU5Ume3LOIPPOewcwAGM6yO2pGijFxNtnKvbcyoEa04jNeeRxFqtKq7OANV4CfdQCq6pcuWMEY5lu32uVmREz7vdYzG9wI5J3ponHfDxn3SLzcWW2r0bg/X7botiHdXkqCso3rhW8PEhtIsAaWlKWs16Z4IrokWTjHZUHslWTR7XTzFmFqnRXSRknD4zTiYVVaZyZSW/MVVVkVN2Vez6BfaskUfhSUqDWD4+Ct0X+EXGtl3BFvOLHfwXwLigr6h0D/W8GYfJariFzCL9qU5itWd5u+s/pihn5NFbK/wnTazWutcE/953h3rPtRU3xedZkq1Cja4DBhe+7RYeLz+5/+Klw6AJD5ZumK0s64s95nV8PlAV0FdhRySRv1Gkn/PjxQ8Gvry+Zdh2Vyl0B2BK4Uxsx86pPzNg0caqDbUDSrgPM4Y5MRWit1dxHvDBgKsApDkzgiWgSBXCmCrgpzkI1Rrsi4rqu+1731/31/krfYRDDITZ4iU6X+sYjIlbji/YBxBFsm5o5grHm54PRvaVAk05jp0axV6Ax30Lvd82ssOjqFcsVSfGa1j3EJP2lYl2gmaP34hQ83wcCVF3zJwnEmIIl6N36srOV3Pj7mdJjXbQi7Ky6nd35b671fr+fqIlDF95i2dWF0i3J1WYDnqeFSGL5oL3fb85waGtv+ND0TsDeYeZtT5edS++JQNEcLdEWQZ3FgZPCYQKtahaKcZAIrOtKVaWiOxtYrCwgojOA4+tbpcdaG4NX8nz3ay3eWR3/sXFhFoBUQWVoPZ0a9/FytlF0xd1zWkFUpMXWfo4lUxK1ququ21pXkm80nfB6yiRCIa6mcB753F7TzrBAUnXDPclVOX7how2C7BOxPLGxHpPxctN/oTzVV2G8lKNxVTfhWCuWdDHNtQ8goTQeXGySf4OqFpi0vljB2DVK2YiyHfUeRSqgGtzq8ZFhp6S6QwMVUaX7HRHEHVrAlwq4dSO5QsjRNFfUMpsoy1M5v0LvrHfUO/Wm7tBXqZA9DLBVbFaRYKLpkJZWOZbVCimyLr2y4qZ+aClRl0k1LJvg4hLRg+ZJmc6ro4LFa/EOIkKLitLCIhS6O1lpmNqasJ/jCgjPMWh78BsG8SOIbbaHj+THNPkRkobio0oRzMPRz4a+3/uzYNhIo56eSLMdHalhA5iAtQMDNgCbnaXjnjIoScYb2r80lnmgaXg80f3U5SnODRgrNwMGe5hEU7hMthgOA3p67SigIcOsujvX346UjU1n4CQhS827M/meKeNPX9eDbNX4zZrUVOeLfIneArcbjK9GBi8QFcUCmYzV9Uz3oBcHu//44mzTt3t54/EQAZ0S8XAwVCuLIqIzfyoRyMyd9dzXx3YgjlSdRUuDuX9qBdtp9188fWvjYf/pdSqsb+/Sjiu9C3peOzj5WI2Gcg1qvwdtJeqWe/1V4RCAG1bx3MMhw9jbZ7v27a72TYyQG0wwIPi2lQ5vqv2NgSjhOZbrLLyen7gzQ98fcG9KLNxtutIY6xEFxZ9X+hANwMdh/DmWdt9uv0qCM+jOgtSwiD6VGR6g3qqKh6OsGCbMKLDGW6raZr6dgHEiLfROHAgOn3tH5p6D5MUQEy6mvstt+MxxF/4eP/vHtYQft95vF+FL7LFWCEZkpr1WNrVan2g0C9AT8fKYt336vuOB9Q+PUhUlLbcoHe/X8Vfbvn7Kbf/wTGCPM/fI0hYJr+e5/pLwWwb6fP/H3tZWp50X6zSQpJlkDHKHu58I/lPHnPejqrIO6ftZz9Pxe33jD69vPz/N117t//SAnCfpZdRtVQa3n3VY0hu9F3jvS1Vt7eLfHXHRUxIBGhAnbExb35YpZIjnFufPO4vz7YZtPNmRgADl9MjdgmQMdIMduNV2s4uFVauhSWFk6UkSVH22sHNrh/quMlXNHkvgX4aNNjuy7NbTkHYj2aH3AMNnB6k4nunODTlfYycNdh5VybnOYZl2i1o6C97z41HKKrdR+iN8MX3Ymk0z0sgoYqeQYiC8zkOd55H2sOeAN4bH1thKQAiy7FhUx9WP+M2+AAY9wvNPJu7A80Tz2qeAgOvy0wf4kS87UgOzU5NFVV+tABToaUrmcnUVa25vO3hou37ew7GJVTPM+XjD84h7xVrk/De9ydXVgL35IelCZXQ+xBwOM3zKQWDsi54ferCqeS2xB/oIpVCgy/MCEuXs//YLvoCALiwh3e1z634nfkIv1uK6IkIIrFWxogISKlWJulk36637i/WmbiiV7/u+JQWWGWWEWqDwVgz7XNPQEfFCLY++4xKuKt4LK9fFKtSSSC3VZf88CDA5oUUgQgJX4FKJuBkX3lU0d5mVPqDJT0UXjsCFA3ZDTwCaLOCp7r22VW6NaPiUpLrVzCWuz7AjDbe1GnzHA8PXLn0Vh5Qm4Pl5mrNvn3xkwukNTQpLMh77wxJ53C8BMyWV+8VPaKKTH56BEGhFOAH2c/gnndfHo7N0PXjGkvUh4P6/ddZkq5CZAwSycwIPpayejeU+Ev9vGdLX7l8fLXYCpjySwEkZSBzaQVNRgQx4GOdk8NHwBcCpvmDD5FgglCU2HhRopE03GM1Tzol9ThU2dqVbpXv7XI1VFl3s6rF9UClTeZtBR5i16+XtO98fMJquqDt1xgzDmrdnupQaC7kLzGMqZpuPOgPwm3uBEzDwuCk4gwrW3mVrKxyfVc7z6FbeHbSB9lA7Rb2XreHgzgt2KEg2HlpaGIT7vgnAw5Jqiy2m2boDA5SQVEn3dFz8wYVSl84HsBc3O0y15ViTOxuZmW8e1AqAnmr0jIvZ8N+atRoPKd1nEtMl3UEv+ulTIpYTSD3wqErFqozr8gAKGq6NykpzMxC12gq3Z6zJtaqkSpcxr64srzZZjXWZs+q7akFqXV+ldamPr1iuUPdQvkrGLfBaa61YccUrXv+l/877fdX7FuuujKqqumKhFkMLC9Rdho6QjcJ+XiTDfB6feMLymJUqp/TY8YPTK0kAvEbwd2AZj9hwS2n/6+bIhrseKGeesUe5cHeTH7ShcQSra1Yan6/zh75YIJz6oDNz4JKrUkuTTcwVqE0d9Th2+2qnDPuHZwZhflsjgxbAByW4scheHzJGp8GOqMXe5tJe736A+UMHVLUNhiMQ38l93zXdolYvOS0cU4lCmbfGcAjBVvVAsJBjfRiR5MMMAkgpjB/C7t7Cb62wmNkNMo/abqcRTU6482y7H6C9QGHmzconWVXlcp+igCC4EHlFV8g2dFk2tVoQwkW61pczRLrzsaRZbvyH7aiDQJhy0V8uO1FiZZ7CRLL5zdSRwGQeqp+8c059/A3uX7weR7xGruaqeipIqsQGXGB3gNkl6INH12K2QO6uHrWcA8DXrTH8vXPosDBnEc7zeEQXbeMk3FX1ipdvGrB5KwdqMZOEH5+Epc+TIqMHNTgOEMUmTxHk0fUdiFrU27xUdSOil5GGaaDpgCBltZtGzr0xdiqqj+9E9A4KauN2+d0SfZxrG4ROd7rwkhuRgk2sQmf944rKRApqv85tWypWEgZjUG5gpWmoLP7r+HB7jq01jCoLGJzQv+9hpo/vWdAbC/hCMaEv5KpckS9cK66FuERKcSHUs99BFOpWJu438sb7SyaXK0U1KDYWQbdLEihQS4xSJGIxkgowU8YsvlLIwI9aWFxpB7jcbRYohMLDrrkQMM92xaJ5qrESvHAvCUKoTHuZu8lWNKc+zw2zfR3ZXZ7r+7sBKLNSqqmBqyrvqkJ0jzIMUxCEKDMGpnIBpuuZ7gIr3BDy4biD1KOhp5DnbMTuFtR4W9Xn0TxLm1HLTVZz5J/Ein9Cn/YCIQWXFe1G4arf2SROzX/Cna443EoEeowo8Hj/jybiipBwGZrS006j0YHuKKagJRbLrRG1Cx2OBCrBUE1XBTARS1UhOCCdoeZxA1IAZPieo2GsoWKATIISK1QlO6HYOWDnJ8bYJDjM7do6rnr+gFN6NirJjiZ6HLrHZGK0c5kIC0Uscz82JptFrOkn6Z4xBxAcd8TEjmP7O9gbdf5EFHtHtt5n//BJvR9W9sn6V3Vb2FzyedLDabI5tbdRclFdt+quSiCRwyNezRj4nxym7b3t3eJItKQ9pRLdPlOD/u9c0QI9fqT/wlC6J/jBKX5wkUc7nNaxCGpeubFMvZLHErXHH/3w359nPsAZtf2hG69BUg02frwlliIMgamYz92uZ0SstWL1+pOEkJlEjVEpAAwtLk8PKdxSe85pS6ahNt91rTDJxmKIufbuWzJ7IAp5BUuKYBmko1S98ya1UEu4yFjrxf/6X7zWHT8zU5VZN27dKwOXsollIi4NgqXjvEPHtoM+ifBD+v6wxvs9G4h3Svvndn9uzW+dHr0L45RwQwJ+87nrOU35re34fNvvN9m4wvmIUERkVQD1gOI4+CTUxrwdel77bfp8Wb6+N4Q9pzu2SP6+LPsOW0UOOKHtxR+XkG7zqMx3buqC3+oJTogYg3TeUv97fHp/MRkG0bDTxmel/TUpmVIqpaWhs/y2rUdpaJImXr8pnxJQNf65q+ZduAC7j9bqGksOJUjHRaYJHFKAOHbBXtEwfYyVfHQIVpmw8gD3s0FKVKe5BlkaQ3E7TbntMgP9gf+xsgu3paK2Djfg7ZRG4EnqU0rMPdM85r0Fu/6A39XbPrAxlya7Y9I/X3gSzztJ04G0MykCuuigYyHaDfenHF/3PXXppDyM6JSZP98k0B1N9gM/8p0fuuUZPLKr30Dv/BbO6o7ybx/UoNVnRPSRa9Bxf/s6+DS4OB7ZlBZ0bVgNqZo/wc457UW9iIpKeHLShB1eJ8NhczuOkpTSGSEDALJ6/R30OlkKdVeDOkDgIB58pgKq91ehoDfuhddaP16qN3UJSwGs6DwrXAEAUCghb7zfdd+4FY5iEpHUzGOkaIfT5PCUWNSduAIl6Sd+APVCRdVi/ch65fUCE3oRX6i/qReV1I9+noWQc7smFejHggIXy9l9m9AKhqK2hsekJOC0XEzM7X1obv/GdT8zPwH05DYAiDIyK9GExYUNNLXVLspDjlHqSWrsxGu3UIOqEgZ0CDhBZCltHlmglJ621U1McHHfKRAOsYStHEVW6YJi1mcqsIQHaeEJY49DZceo58KquYf7rk7jtDrT5szco4GcS0ijAKNzQ/6EAmNdgmuxfSB0Z+Ipq7VeLjS1lbLMRwJO1qKhsQ29PjoI7Yaih2IsRshFyXAlUiBR6ZAZQTVt8z6fJwzjE66K7Ra3fsUIPTvDUENMX6iUGsOqMhQVTgR3KqJ1fFTHTmyHQU1TDIRp4/FoMe66ct8SHWOu8z69znuX5+tn7/YPtVuTT1bK1hv29Q0g/NBv0mBFpxUBvbGSYNrhqrRZAvD9EzepJZYg4toHDY8rfAYA3YLsa3SeR1KWnGp0tw6flFXbapyk3UInb/7gzHnf+1D3rfIJZdswP7AQPMfFT1Rju1G9rzWPL5dsNkE5QKqo5LTY7T96m0281qq1wGDBh4Klyuw+BwEIs+ZtmcHg5uw2ZXYawCyIThuw+Ro9aWDa9Iukm5gAcM303D6DJb4rBS3pdUFrLcWKK0iuePH9s95f9U4pkSpMGRZRQETcjeW2lvvefbEt8wF1Exu4B+JJ046E3IDzDdu/LEkRL2xZt0eiBkA2jJEMdxytgEl+HwkHBgY5ApD8hNh5Q/dh2uLMJsL6LlFbQ+6fkM7OPHE414Pn/EP4MRibfUI/0/9+2R2P81P8/3B2bNAQwhOQF5909Pj9jweUAvgUS04VUVUeCEA6k3XvW9oopvNZuMGiB8Bwrvt9lbxpTgjEQGodNwa+X/k44+0py6Xk4cX3gF9Fp40LbPIXf2szIQier1prvbriy5PVbamqb78z/71hhmH0f5399VNYMkks7JhKXFjg7o4QI2K9/Mwz4bXYPRidxHZGCZIBw3bz2leuys48dkGgqhhR7ntRS8ZoG8XwA5Cud/tBt+uyg5lpkjECarrfNDCB9kjQEqOZXfC0NePDVfe5mw+PUacQUlXD9rqwo3SfC6EpFjANE3OrbV36PI7wdMHtOIPcOaPqNlpCbE6RPoBHMvFDtCbzV2LjEIJ4UGnG6p8qIAhm1S4/8gja9/X3d/s33SY10qvxw/cy9H2KBC/lG1YK0XVNIVniEJWEeY8YpOMfbp+rP4/sYvX4D2sSyiroRtcd3APkh1nthki3krpuVoRpMXGBl0xMdC3c3qzM0hJYwUzmjXcyiwbPJpliUnknmsyVkJBE5hIXY6nu2xxwdqSIBa1SEm/or7tQ+BHMAJbgQioXhVIkL4FiKmoXMcLWNhgpAAtxs64GDxY1mYTOXeYHbrjjRaf0FTpn3T2iE9006bjJ8e49eWG7kGFGDLK6GRYAwsxORgxqLjvS4VPc7GY2+fsGPLflFFgObM4FcU879C5WxJa/lirHADFQtMWQ5+NE99Hqy0Ok/XECsOacH6b3yRDswUm/Cb0gMNYgA22BKq7X1XGuUEpAzMqupQCw70u6XyrMvX52jzkAiGlZ9m1UFwwYrx6dhxWYiQdwlMcbFcUc07ewRCzqycJi3D7NGj85iqrg5V4IHFvWg5+bCacyU3lj8vRLpmKo8Rvt0xPPinrKRPSa7JrGfMqpUEZn6HfehtmaUY6HoT0dKT75hrnyp8La7/xMbFh7GtCVUkqOd8sMYKxOnPKgaNgfp2mL3/gBTbwxE/NUVTGMQ4326rhCe6X6myq4DcAwvL69jljs2k678ffnkg6FPqHRNgeSyNWheY+vYZOEdn/kR40LR8bmm1HZDw6YWq6FVp2otJ2pPLJbmdmDUyaLjOoOlaqqukvYfFqLUbpVB1ipUlkw7zJdNNxuxl6ljsjRuQOZBEXKykKUkJ2jCZba9LS88QKuqlW8EIgXWMlagBbSPLA0oehAjzCQudNNPMXv8P73yy7gh2P9TT4f5fMt5XwoqPOdHwfqWLE9ku3bJn5Erkc/yWOb53Nbiufi3z8RghaYwFLd58PuN39zoM/zrs+X75THO7+tCYBWI0dK/7wajoTlCZr6fMX5yNpNCLc7yPcR7DZtN8f70abZmlvUcWRe58jzfNBebJNCBLhicS3UCmgBYOZ7r/P50pPMMv+19YVMz9BI/A4/1ecasFa2UZX5mwfhkv3UDfYrde7In+aDU52FSn7KTAthsA2snS1Zmu1Ay3XhKwgHUYO6jZkZzAY7CejaVKOW6nGCVaW80Zr2sREtRXruZ0WQC55kgzQWrxwPqQ03gDZM3BOCn4eiA7APCRlB1dOpfG7Kg5ufv1roSxvQwElQcaK7ajgDmxm2idljg7Glncqpjc381pnZe/oI2rdTc7xtZP48d+cbDsjvY6GBLWKfVwtWDn5mr9EfztRzlqPTsN3/VZ4b04gPnW8GRPKq+3Z1DOrpVYZ0EUZA9D17vxaoKE+sbuOV2EAvQOE5xgKb8RtRl2dQTTkkfdzcyqpCXk5FKVkkgjcg98+qEq8oCupxzquCCVVFKSqAUNVyH1pW1p2paGS3VO9F8UItcHXUAYBqnnbhbm31oiuC4IsW4SwTGdXVifdwzYhFQeDtnhyuUuhyPiFWEXVHrKb4cTrGGEob0RzARtEZebU/7WOc22p8E0GIxFqh+65wNqKPLYOcZE8plALWwlZNy7n2GbO1MzDLfWSWqekVa+HYWqnvUJPd3HZCkoeEFYoH2cUTaLjzfkRny3YHym0qfJg3x1Z/xBx9YY8xhgR1x1MbADbKH/BUXbACe5sFlEs3CM9JLact+q46F0B5KCkvkh8dlcfhrH3kJoeEdZ31AbEYkkzvFKUbwRCxT9DWF7/lrR9bK9N+ofuWW6UrXJM1NKiy7kTaGrlhrlG8EYZitI7Yav3RJgCgCEZcXak/kn+/q7NHWeDRWuRs6ed7fv/3edkpb1qQ36+fmLxpPNn/h5v1eSeqqojY93z4SUTW5Jx0+kjtbB/j3oyYtxQcOtGMqyZiV6XR9pOZ6z1KdFKoTtf82/OeTv+Hiu9D+10ApL3hSnTjwt4RO/e9+LbWph6ii99GGrCTXkGWYsHlWJk8mbVxU1lZtfM3AAzvqQaVWSWXbQPSHj9q+cIAqBWAbuwqOMqnI8ISP3sFKKBa4gWaDu1GZg3iKXALS7NK+a6qu2LVfQkI5DIwz12/YOU7QKmwLntnrRKONspv0ugnni3gR33GGm/y636DpOoK1dqn0leJ6Jaw0/k4XgRGn8+HqqkDx61HOpHjs7MvTtPGxCMkh1R/4CHFxyqM//+HRwa6nOp37q3f1+lTcEDpvrkU4+vzlNVvAcBzbwTJ9INhOX07OWU0em3S52j38UP4/Xq/3/V+1/v9zDSsSXF0JJDdqB3Xt7vt9xOaCdY1xcdGcJBmhbZDvLiuRUUBNElG4Mh56NuS7mDApfRIwU0AXUZEoBEHcpdGVxdNtVEFz83SGNHelst5fHtblW4VFF0Os6e1AACv30lEQVRXQjCiQRQ0v99LDrG2KMRig9jZIQBbyG89eKoPEZK0niCQ0xiKXR3dnAEoJ4vQORInaNoP3NdsSe61cvPAHJlDAZJNHBLTsk+yywKjtTHux2xrSDLmwlI0PJkwxOwR6Al013K+Fg2A4Z0iuVx6oY9FJ1pd8cCUmndGaagjDLFoSdj9bO1SS2mu9mM/CZBl/Ju08xNcLo5wcmf+oEEG92kFmqo0nSpvMdhSt8Eafz6qZ+igfXim5Zc2Rh/II7P2FMmrurmgSOqCLM0FlYfqCRAKYUB1KCadj3EozzzYVim9pz45NZkM8xgEmFHTbW0Fv5Jxi1DhjkpdjDI3lck/UnYq9UIx0gEFe7IUzUdUVeJdKjFCSm/d01tHsFi/JOUFAIminx1V119XIYgvxaViZhGqytd6zkQAQFTdYlPBiMIK6gKKQEZFqkpY0zPOBaOfLihLd+K+zW/svvKajo29jz5QMd9Eo+skCuLVELTpDE63Gw+iJD0iWBHm9y2UdNbRMIw9W6Ts4MRuWjlzP8eRpNEgJfdPn25Nw4R2AkhSqGqnNOpp/cXZmtaoMRGsKIrp2mp3XbbyykKwBJgdvg3PWk6H1LxzkRdYWXU7Hc8VjFgXa+mqu+4OV57TEwBWkKZ1U2NnWDITuR/RZ8dvigis5RgCE9sgmlOShm1JgOmLmzBFZpDdBtptT3vxh361ibRLMP56anElsCequX3SFIeQUKk3Pe2EpQMLha1Zz61HI5e4oGANAyCLK4AK4VYnR53xOJCfXgZ32OeRxgtPwsLh7Orzxf7VjLtGczXMvfkKMH8WVVISNT37dsj42PSxVSfq4/QA+ocEFBomDUmo28MEPf5S0fm90zoaoqC8JR/jujBS0e/JPhZOIAh7QtbHdSYAAGB8ZBn4IQPDnN1gLUnN9x+71e+bf1l34boYT27njApcdi8VcMUKChFLrQ0kZdUVgQPv4caF6Oqeqr4e+GHD+iE1T6JleYWJAi8VmV9Q9OQxyeMjwYr4a9/y3CMAxXqp9rIouET39XBBqQygFFXvSiJ4y6cSRK36Un2FFKGsKa4bitmza6rBkGcizRov0RS9Ewrit9enh2TR3SvQYrO5dx63mATdi1h91BBV2TnvDqWEAZb5YS1DPMDX1ujx2y3p9Pt7vPxAxYR87gesTin1mxX+UzJ6X56n/9AGI6I8f+t4+Q85gOPe2NHY98XsK3RSsNNddEjvjjQ3B3Z6YvNodeQp6b7v/MrMG4Z2YSEtZO1+7fPuxPloljkRs2Udm7sRi9gZo7M8YsWwGNB9P4LhJmZM9PR4Mt9eh2p7XNhe4eKgAXspDBsvTJ2WQQgzwI7jZHfyScRqBEobHaKJ+9ZyxFtDfhW8HBcF6UyZ7WlCqme5Pm+bgDEt7agFUOjC4PYL2jiVigquXdLyWXAGzF9P+qDRLzYFLf4tJA0Y9BKdhLnoPN1xnyVsHb5BTY98AsgOq73plrESFu2Y0Os3OXios4kB9shR9ytAEcv51o0ia0hA22VCE7QBLFrjHdUmB3nzDgwN6/yEHy+3KXqUllPI7VTZ0rJLmtU5mF0OGM221T4nnOpPmahA7ShG1i0RRqGr40lyA9X6c32bJK73r5tdp1rrNnbqIpV5354htrAuAlgUYgm3x/66jZwELyIx4NvHI2Svkb0i+t1WIKqKMJIZKLFAg6kqLtI+SbeNvhkDHiULSnM2OIERAJKVCsVi/IgfFZV18xa12jaHM1ZI98cJcSOZDtkJEOl5xbGSl8UzuX4QWVzvukiS4W7GRN8oL0vO0lrAX6ylgCr1d1beIyMk1w5+EFWRxQAT1SSaAeyMESb+X2gQkTxoqOY/RwZ3R/skmOiipLrhxzox1zZW7mo9RdMAGJcPLCNyh59Fb/XC4BEidFKZApAdUBZLWq+QcSnOxwGRksQF2jGucgAw9sNWE1U9Oq8PeGQ04W05Y1JV91tmXD77yBxPe3K3Oz0kZWrFiusqT0Zp9wYQF3/wgu43JC69650qSbHCZHOOuJuWAW4xAlFg+TG6Bhcq4A2siNdau810qmYVxGIwlgTojgisEL4SFHsc+XaRXS5Cdys0qzhQd739mGtyyFlN/pMN/ScUKht+gJcYWW/r/4jGja61qipgInNmJhBx8S5UxKWFikLU4hv16/711/pLWagQmDbclb7lhCDXA42BXSBtmwdyYwhKoQpu1hQkevqh4qn2aJj33PvS1WLEmgpApyPuxJ1iNQVNJxMoUN0ICkm3amDlypntFuFBJuGOusxEJZVQLcjmOUtSGA8AJM3rrMz7HYAqK5NKUnCZERDeHMIKGx86d8OJVqHMt3R1X/i4vO2LtlQpAa0FcmMJybiu6+suBi9FZd243bsY4KL71ytiXfEKxLvelWV+94txq6C77qzIWiRirbWw3nlLM+ShBGFhxYKydnIVKGXzfO+TBTVCbjG4KKVhPxHBK8grszOXJMgmmrjvIvWKRfLi5aF7VQV8dUQJVpPGLBceRAdcGYiqgu561/3z16IKvClRV6xYQa21XlV13xVxXz8Y1eOvuX64EOd9SVUn1BOKMsbgQf5XJJK08wTOoBI1UwbM2rDBaSTXa7XzQdNQZOc0IgaoIvJ9OtnYF7U/XkDQeQyeF++vAoDHhfQVVMCwDPXrtqIswA3QundjzRjRofeWClkmR2Lg6+srAhHrvu8ZWlekDH2xSrZpIWOt9R6WFZ9ZGC06QzP0wKM/fJ2F07FDlVDJiBWvDk3Gtr27t+pKfLGbblR1MwIRWVCCHvwtc7/PyqjSUVNhrcUVPraefxw7CmrmjLhLUl0uQGW9XpEhXoHLDmJm5X1/XSvSeTJw6jOEqTRAL+pTE5AHa5AyC5wPSgDIdN7HDkcX9Ep6XTTkuLF9DbtlBLNnR1E9Pg0RUbe4XnDswCopGAgW3NvWbqGGs4axJge2QN4Cs5PuZdikEFgjdHmnHKZIZgHviig62ippV8KN1K9uD7CuFlTIwjUheJDVlYRkUMXAKmqKBg+MNmK1WLk9PSg1EwK66aTrGPY/1lOmFprwuiJWyQ5kXDQie9Lqd6MT9eAf9FpmUNEmLfB24IpOyqt6JpZ98FukGiSsHpYE6+Ym4BOGmqUPRXSpZ+bPr4jIWysWIti85OFYMIb2q52UZlNMclqUujUrXCFY65VQKKvq6vHGOYOQCXGBEkObHVxx5vofTDCb0EgWCattXQ7XUDIN6BFvEXQrI6pksoFgDZfdJ0aQx9c9Ha2fCH7QDlWEAXOzyG4gAwtRijc8UosFZHTVyHMQmvMNA1bpaK0PEwki4lIU+CaX4DINnbNTsErLNJh6U1gg3E1WYAqR9X5TCkRFSQWmemDtD2ARqzp9016wA26fL/ESQyxyJW+PyQaaZ849H7xlMijlwlXwmGFPwB3OREeUM8I9mSWVovHnmONXbMKXncJ32Nx+eYt5N5Diqc/srFKLXgEMgSgP2+gpDQ41xmiPVrfxcPtXQ42rB4dMcnRH5r3oUELLear9wdr5QCfJmtmbtBMnuwXpeLjKMP1HusZoYepQDc72JFHXGAsFR5QIFPK2s3EpGA0puEsFhaq9+2D3+mMXPq/aH2eXrjsblvt6LzSo0I5cRLdJUTy76dF8YG7FtnCzRwuhx4MRvZ8OjpE9K7LC+Z5CpbrGO80TAENX1R5uZo6Ch2AkH4I5P8diDx+HsJQz37qqWDq4CHPw+Pa6BcG0dJ34Rnvjpn8+8t/G+lz3x8TQDy0xL1MhOX8jZ1LVqRiOZesMFiWmcoDCmXsmkT+gajroHU2xlap9EoyD01th9L87LAkCqZLKBF6q6ikedaOypIDtNkju4WX7nIL78Y9a8Mhp36QTeIvsxNpyNriC7i7aTlNL2qlH55MgiaGsiicBtRX14sAwKylqTQe/unCx01QMhVxjiy5k1+3VqaphRdRsjmbxerSvHM9EI0UPE1A9vvRbgtlZMdb+iU/KQxHrmY6SmozyXbpxf1mQHF3xuqJ+YB0JeOC+74pyjITKSSU6ZWleU0hCokiUO3u9XMn44U8/7p87tNuVyuNBHs9+/qpBlb5x/zAe7s2nsR6T30NuEDbO6wMw4sWCdOKes956XrmF5PY7+8a7cwZokAngyspGgKjF6j9n9ufme4V//Oj1ycyB6R48Sy0TR+/XsS97odZnznKresxAOqqQd7UEpjosdza53PXU86SOxdc0tj+3zVn3BujL2XKDISXepbgL0ePtUpW6nRJwf7r7eQAXxlZVZbEKKduY2PnciYtIdM8ZWyv7HQ+kKraWgJSVQ3ExrPWNFyAbdojd0gAIUXO4G3fvoWN4yCQGXkPSpfsGYumgvm17PcX0vUFOGlluI1WmlCgtsrrdeZhXSZKZHjPnfCu3UEljCbZG8gHBloSmnqsqZo/djaaVn1NHoKawY6ZKTunj9Cgeu3/E2BOWmHAjpvYj50DnI4YNXPMnrXLu/LIcSkN/MTl1IkKuAfWJ1q40jbA964z/eLL6/osWoiIQzEl7PDZCmh7s7dDV3rXhcH0+pf0Of72L0COmDhLog8aJF58P4nkxEhMAyBGho21wmMRMwS84SZoS4seA/OIxrd+eeb8+9wvR0yKa0ESdFwISaQYFOwcLWE24goDIih5s4aifDbnq5yEWCTINEKy4Jdx5Vw8ZBW8xUFXho9PpScMcoBJueWiZ2A2Iwlsk+HJK0X2mdtGmOBMPPQjJCPP8oyfTjBADoYBSi8q7KF4v3enYTRKvi0BPjHOKVyAq37fyvr/e4G3xMGzKOWeHAY+kOGwet02etsmWpkf4O3CcREKPz1X7sc5lZmfo0Ta4FVyPH7OPVTcQdyCMWKmCU73VRe4iWOEBv60995FuvIecqerO92BUpJ3BAcVGK9fO0B/nf1fqOitRLbSudYiMhu0b54GSkRFFRK51sWcMOS3R3ZNbgumh94gtwWwPIUjzKyPiwjD1NJFjdEZRrcXwAHa7z1hqZs8Gb6CHk0d1+GGBoXq124bStiRLEEumIQUEu8w5NCtgF2+PacpiuGKlsVcE29/6er/fvzLv7B6C7GIoNPqzv90y4B9ZX/Dwcvbpx/R40CMlOz9qRdxr4X3UsKEnJ/o9NN3v/sr0Ct7kU2y1Na64YX73qfKihEq1yKVdByszTICs+RQ7HSlQFaVCom5nc9qoIwFWnUvSC0PPx2NM8+767baf54q46AUAvlkNPX0L2r1m/nn3wLS7+fFmAB1/AlLdEsmXt4jh/pDhGqhwiOq6giRlDHrJz+gqAYlGKTgG897hQfcyiBVNcNkrYbhjnzSp1hz54EZibIrrXj42dPvWbK3BqJnZD43u0aYAXI68/Vd5J8nrutZae9JZnwBppx73WnUM5VdzWqSqGu+rAHCZm3xEXkaV1Pi8463s/Zo9muGjexjQ0fh7+itnE+R5cFT3fvOebiFNlPlh/QuABS75EDuerzY6nXXcSLknl3GerC1FOwDwqmrw91nP837+yYe7z0dJPj/PBoHdey8AIHs4Y+VdmciqO6tuVHkIadXto8qeA6VzTvkgiB5HMOyzPZ+NWBFxxXXVWhqGeT94axDcGZnMTtJnVo9T71eVqX6muXaCWZLD3/3ZxtCH2Ts7YJgWcw/rAB+TdW7WNGL0DBBJMHcNyZLsL/dHNyVcu3Qkwb2znlbvsXzjoIx/jEfZuNt+/OYDE6iqtV5wZnu0aH+UsRujhkhcLsR6yXkoqxrfaur95yrN1TTyYFjvI0X7vMQkyEh+HJUJxadcJyB6lnkh4gpVpT1ycsONZOORIy2mb+tiWLQD5dSnYLiEIFNjH0e1BiW1c2y+mdUq4/mJXEsIIJogn6LCc6DmSfuZbRA68IP1sAbytx5M0bR+W8Y/7KPk8FLTCMpDtpxk+2wC0fnXEwB0WvZw2YfMAAW4tt8zcuU7/Dj8EU8k9E1p8WlVerbZOaRChUOyaEPWUdcCXlDJLDiNjFmVqwyMYOdKW7FLLpZfzFRURAx/t2UbZBO0KB2qOz1G1HR+08GUNzOFTCwgqbjzK6p4KXhhh+mMiBAWgW3LMJlIST1H04dLhVoBChejPLlle+W8foxdaSQ0KFSuK/PrFwClG6ITmfrKsqvoVlH0v2znvN2z7c1bHNub9y4TBGI5NHI6uBPQrMBSExvbzkiGomtvovVVG+8UmJmlXFhOQYUheEaNmO8HLj6Z/oxu/dDUosztLWNPqkBun7Fdp+UuRoki18xgf7C0CatIjyheox0ANMMPXEQoMwZghQn7wrsTvDaYx2qbzCJo+i01gsqGBTMPwCGB68YUwWSrY249ZYXrog6piJcANfJLEZc9Dx/39iAVXHbdDGQGywWaNCNl5dMJ1UXbKqxYM2jDfQSnb1DNA9D4u0WKpfv9vn9+vX9+3b/u+36/3++1Ll5GJWlcfLR4P+d3sOyuQ7b2H20LAKlyqmqrAowBPi80ulLY6cztibotON9AxRyp/VffFJjUXfNGKdhsuLvBTH99zSpmJmUqQOzsnVw2KbJcKyZqxgXYIHfAlplj48Xvj/CYt67kdHKj2RL3DU/oUjspO3/+WMEP9Xw8ZpWlCzsMmJw99o1JPZZx8OioMfNzw0b6NayiS1hTE7S9LdzIXpzNOv/tFU8b8czCfBrp2kEh9wB1OcHnp6jt2qIH0NYOUx4qvTar/VDTtHouVA44ZA7Uh4d1YqD14TWWtH3xJ0M2KdjDEbQmTygWO0cgfQr2jif3XbUy774eVxZdBQ15nsX86/dcY1O2We+L/55dA4DGUPF47V+w87vHY0+19hCADwd6P/h5Tvd7+lfoXX74ZD7z/fv9H1fe0fUZAABQKaF8K+/Kd9135RuavJtUhpypAhXgGQDYL+pvs1IKHg8FGAgQ14r1ysXi5VkA1S0xrKpE3nVnVAiluutOaJpm4pGKfghn5za89qPQp+1Pb0k4/Z+Px0Zno8LvGudYHY37aiXGq20fGxcumEH1eDnRwM6y8+nC7GILhLquy21sx/2kJM6k52eXRc3c5b2bGBfcKFkdsavz9BHDK9NC9wQbpwbrMIEMOksb7rquIclx/tNHe/uUeM4jjjd7rRPoJgZM0pJylZzogTGQD0NXqiZKEbrarIFx9KvxR3D33ZjPczf5QYLy5xdp7pso8x+6zNvP167Ct6y5n+tpJCvrbEV4bApCzH3xP31odJS4RYB7DfGYy1NBYS84gMshY+zSQGMmva5jxcq9E4SUharOenL4iSzZTZBzfEybnB0j+1ML+jbMrJpIWtAMk/Tcp8ZxWDGHEThyrnNM3GSzRzct3xjXjWwO7Cpz3aFK0REtmdXmr54WVSmlK5Gl258iKair1jeSgIirjCiBP6IANrMA6GiSC6pCqay1d9MvhQXInHnX2KeS3g5KiILe4BW8Kn8RpUzxHsC5uzUlQFFoxi/Y6zDvlg601bnOD/inY552Hrrm1fB+ePfFDo0BqJ2Pm2Rqsggp1FcsGf5vD7kQXAgPvkMQSAVrF08CGFiQMU7uynQDMOgIHiuWZ1lI9OXC0xNRMAgHGviRdYy60c46OqBgIRTtE/sUm0pO4bkqksBm9N93ZVajFSMVPVRymUWO6E4ukIwk6CyXW8iawSckcHJAnESMYSSSCuCKy8kVPM0XFuMYwI1jJBp8wzKAr3PrfZzUcw1pQhW/VXa8rFJjG3f/V1UKCXnfX+/3z/f96/3+da8fVX9jbQ9gE2WiYfrUk6SyMamUEtNrqHkSSTvxVkRJFx5fv7NUo7tgHrfDf31ehqKZIUpddNwJlnks/yGriit3h5YDgDWQvW2PBVGrmzJ9YIap0aXwYEk3qnt4GFFlvxM7X6Un18E5YtuBjgEFNCrdb+sis6I7Qo8s3X5pvL/9kzHSVZMH74Kfe0CqXJQ0kmja54SmPl3DU7+XM20YATSvVE+lYzupMORY1Vn57PTjg24hiJRr5IRHf0kRRDHv6rhTkyrs+5/m5SlrIwWp8j2wrgPrglqQuUI0ncpjw/oLksvDfj1sxKrTRKjrQaKfEebpni4IkruAxuy6+lz7686AaqxMJSM8vZOAmUxjYlpyUuJnrczQFe5UxngePecO8gmvGpdy9r2LiB+PPA/S8dtREH0ccdNBxnGOilG6gz2HA5/+/Tfx2z/ZjYYRsSd4bHdtgur69rcD9+Xxk2f999ah0YR33W/lrftd95fyrXyjEsrp75InDhk9wV2hnQiuGgcVBndZdy5GRJ9dzj3ouElDRCqRqFwpT/qoknO++za78uyvos1Kl8kxkVsnAVrCzx1EJ692joHyHZ7IFgcAOx2welNBxlVPdmBEQYiIA9YyXXykKU+61bndcRFgdTofbl3ZZv3YER47lXcCGOvZ1REAV7xsTjjsIMI08mH8xBFxlMbn3ABCePwgxin9DS2JzYE15Y3jzFavlSYbABnhF7EI9MQFwJW0oFsmWlN2U0cPV+jVdALLYuyF2KVvSxFRgr1uPTONuzZicTAhUQNvHkmwuZJ8f4GgOnkqTR7yiQKN8m8JPUSoV8NVZcEtUz5d/W6RRBbJWP55VBXDCaxt3J6K0ZRr6VREHuf9iuHTVYfsvQFrtfc/YAuowMX2H/Q4xH3TUyTXHjqMPjkjcc/bu8maJsiwnfYqMkJo5lMLN1iuAxjNnjY5PjBypMc1QcUShViBuK4fAFJfmBJHVVNfKolAhWexzsmoFq9SlnijqAY6IHDfX4xirT3StlbH8vYruHEpDlkmPAmyVl2crgVqJ+dGyieaZxG3UKGi3tCPiBd4IV/MW+uLXMINjybX3c0IUdKuXgDmPTHMTOON7F3adlyzRfbrV0/ENcSRgBUfo4vk1VHq2CTcKkIXmeCtDpxgWp61yBIu2j+Ma21u+5LXIAQMU5VnyyGbvRgAZpQtVaV1ObKk3WC8AiiUtarGALAfkOxGGWfDohKVqLL+cirZKXwRcDlmw3tslUn6HJAzRj6C8HQ7NGzTSwyAFbzI7Md4XruCz/G/54S3mfYxZZ8SqZtnZqpi1ZDfu2UVQrPSh03kfFCglEqSMy2vmaDcJ1dV/cjoUxQEqvL+eX/9++vr33fdzt/O9GwPI/T6CKqI6EPTHo6q2x+Nqt8Y4ievsB0Xfubs9xv2e4I+/BUlDOSdSrnVxdWL6m7LnQneMi0JqXKTBtJNI13aHnJbttMFG9q5q7lJj826E5Vgoe4N7K5Njyb9WBfMEamPp3MsHVtLNgDOJnB9e1hI+PaTRyq+J2n6FyuMo9M3+WoTtF2u5/c23stIaIDCkwhsycRgh3qVnN6OiNKNDMmzWW8HkKOpSIeqh9/Jz9oOP90u9xO4zhARwCW9nVOcDN8YkaZlUgdOfWa+BwD+w5is8Fnc0MT3f1jGz+qT62nf1n8esxOkc1PSSmJtD3i3Ep6J8/nz0wV8/tWe2tY/8de9Ya5j+A5jsrOWvb3I57Ocfv98XZgK2EaiP5CkD0l7LrKXFJ+vb5+1/3wda/79b55F/ljwc3EkVYlKCJVv5Vvvr/z6db9/3b9+5ftLWSFcwSQYKASyvD5PhbatrXGUXkqSPU+K5IqgGPGqFWu9IpZWxKJCGqihG4yzUA0ACCn7TFdWdYoTrhkPyterscAn2y7ZeNpsbPDfmacllbfEmSlJNLYVtlULkzQxK2i6kKXHexMDWYNSdxL69KR1rMweUGCtL7m3+ZFGknznF8kZK3kUvNod/tCNkm5HVLUFwzkOZqnt8sgj7CHXk8+eeJURK/NWxbEyq++8GTGtNnplTgk8j4DUnRl7nd1nEXZbmUC46V5wgKe1GqRz7MsZvh6QLadq4juM83zD7+fleQPZPkE7pn4AbL1QEsFYgToZusJWjyTwtDvuZ/SlRn11wCkd685pXp/F2hobnbeahaUwTMb7zq9JrjXi6nP9H7fSAavbtp5EksVNUVWry4XjI34uVDRHrBMizQHacddUoR0rsNu1UV0oR7TfAnKThuVaqwJBBi80ja+P0yLBSMRLS6qc+lrHcqa2qhJSQaAQguwuNu5xle7Cgt4O3X2CWSAFhruN1w2w54F3lgABOEs9iRYQ4OohCGj/qitctqZh57XlnyXdRAmX8gYjXkvrwv1GXtCbeK+SdENUllywMlrkxrZBQ7Lox7ZBjl0oJFtd9fuF8AS2euSVT5Z0V/Eqpn5m0Sgkke3Muu5t1KgbgB1lBKpyrbVZI2YC94f9trxqOMIirg7XHVSuC2UAkcBbsQY8U9JTDXet7ZpWJiN8VHQdAIzOQTqa1OQoSXC1c+wYgB0fte4Kz/xqWxuxaUAh3rZBiH52ok++urvEA9diN6/P4Xv0icRZEw9EM2FQjG4aiAWdhUJgN2HP2HXRFboeCtPZRScFiWIbAYbM9qRI3e/31z8//+fX17/dblhVKprzzYuHmphY1clt9bZtAzEa4/AxjNl7enxUxAC12XOgJymiDhtGh+7peDN3RpP42aPB/I0Zl1W3ZZpikplZt4DktR+aqF7BgKoqSWiF6I5ADtqkdKNSSDoUCsw+NfFzRSdZ2V01Lc5OQfmUmCDGOZ4eE8JO/ZntNybV8rshmaxhdWcn8CRPQtNJO7U4A4DbiTyjQU/7LtBcoCwUA9FM0tm5eLmdXEAxvAW1E/3t2kbMarsTP9zWMw5H1d7HR87Hjj72A4AmWP545ItBCm4mUAErYkOKs5oD7QwXnRxYklAyi0hEdPau2jnAE3NmiyM6PPKlyqS5ombUNLEAMweAh4EkOUDwtiBtvzja8ZD88z7tQvEDA30m3TWu7GTm0eoGe2L0wXoJYCNPJAkD33peXbXQRgH7UM0X/0HeHuf+uDcM1eMT+Dnj1QGAkybHdTZ40urx+Zzxm7emq0plXgTud3193V+/7q9f75//3L9+3l+/Kt+qm1Qs74gtyhGo76uPq1pVnPIDBEYo9Hr9ABfX4lpYl1YgxIGq5yieLaMtwB4+4BpYzyBpk2gVRNOxU2Q8HhU6B+0c+jz4WOH4KDH9tpua/KHQJBbGslBskiXa0yIx07q4I8v5VcvqzmE3AgZOG/UJxN6dVgR0CUJlhAJKT57XYFvB+W/vdmif7i6kLMa4CqaAs0CXXLPpUaBPQzw5sv0RBvB5MDOm1J6J8gfIKIBlbbOPXhW6bXpxbBF6GoME5DYZcwYt962ShhxT47RVVWAyy+oOlvmoASiOPpmz1cDLvT0lZUFh1DE3X3CTL3ONJvEtrfYXYA7n3jV7Ic+3JlXEA2bwcUWXKMAeFJXsIEmdUNfck1pyPH7FhezLDxC++6e536cPaHw4jlRTHPsSkw2s5dHNwQ1Y63P6vLnPGyQimk/NkVvPd0T7ZdVRblHT5wKlnS4r84m5g0B0BthhiROdteJqtw9DoeDs795vE8KyDyhJmt48USNAKQSYpotxPcQ3Ek3eL2Ajzi7oAhi8JoBvz1ii+9vte01nITkDOXt+E9kUMUroAr+IFdcL+VJ9Zf0EFhkVXwhqLWsPPy+ERKME9qOqufm5A8ctSWyjLEyzQIz1qLGzzm3ai7lITzbAhtONsXwkwbx+Nj2CqOoH8uAUzhGKJ04ts/5YjwALBvKyqumQVbwWKt0lzEhqJ1ufth52GCk4QjS9r1zQZKvsrl07EG0VrK7eVmfQmpGGANZaxvtjPdCCwjpsr0miPkGx2/7JrAbRI+GPI9CX6mO2tlICeJnHjZS0sGRwkVM9WTDHUOtWGODbqavPizcyo21wd8L4M8PPEfX1/vevr399ff3MfDtqU3dMKZEeaWZj34/nhXdS/Cih7gO1XYea/OoZHnxgso+f20nvluUS8rZKWbbT6tmxGCOxde4uF3TXzZ1Zma18vAjGBAiVBhRZG05yrO/w0dlVgknxWjXz8LCt/WM40J5HmXZtrz6scz63e4cLbneav9xu07NxONwyoXWjZetYtP3+8U9ahsu+iYFsGlRbNEHwgWCBqjzvMzGcIxENLUfPS4LRn9sDOz73iNkmjJ8T1Te5D0lWodEQZ1erSWa6jkT1HDE0n14cD6vPBe/EAclYy/t7uqT7c887+fZzTaSpT1u+/+rYjjK1gS82/UAYJeoDUZ9/+GzJf3qd6xDLf/uAl/ZlnzuZC0q68+Y0OE4zkvDIwcfzKlj5LOPHox2bdf7wfByv/YqmPPZpfUThT8/1fP1I8SMn3fF8v+t+V75xv+v9lfdXvr+QN0cSpO7TMCj/WV4+W5wexTUYsHmKtY8bpM3IlGUqZU5Niui4XZnvRKcCXFIjPcNxAVxgtqPV6Duu1b49xcoSbTFsxzu5P94b2tpxh4t7NWIiVbu83WwjbeAHSUNOC45L+MhzW3bfENXtN04DUdzn98jTjB7jaW+q4yrssP9zH0mDFnaJvVsFJJlT0rlbf7qkZt7Vt+PWU7qmUGxp4LS5/O7ot7Rsk3HsbytmCdzQfhUdoEqdoe6oByTyPXjO2Ya2EGwn+1EU88EnQgYTAHxL3MyNPN1uNKiAVKIGNlZHGzo//QDOw4yE97N/rAagKsQBNWzcSfuo5015uYrPLhtyBPVP+5qhxvMDAK5TvbpCZ8eyB8wSWKAd9UwI8YP3rYgnGSII0W2f3s9uaDbGhlCgJJTz1e1td8PpGEJMWN5hrDjjPsqFrNdr2l7fwsrLjh0r64bdtmmPVDDI+/0GeV1XJsC74emJuMwxjCBMJB9A7VqzBxSEwnlD3VREe9bZw2RDKt5ZDEVTEi1wESuwIPMJCujksKYQVoJU7tmPCOP311oHGaD39CYrJWgpA/KdUrzLf3fJA8x60i1u3Nk4QDtLZh4FAJjY8IjCJEiBtU4RB4Ct4siFKswbnl32ganBxoflrDeJ4/0HsdZzWSVakCSUGrPkXLkZbwtyu66kOw1EyUzHWPfXL67LFyUd0gcpLMp+DC8h2ayUQtXFBZicOBsxPSDsPnXNVDvW2m1yTQNVDRGKSQeO05djYwBI3eLQMpqJ40UuDTYGivu+AcZakt7vt6Trura80dQsZJdZU2G97xxOVsAFIzAUhT4UShle2Ni5ZoqwC0ni3bUvdgQiViEQ9X7zqptfjJ+Zv4Q7Ve/3O1/jSBJrLdSdaUZtl+076+Otd3jrYiCb/kimU33ca3SWgmdH14iaJLcz3HdG19mydFeag19V1UaxTF3/ptSw/sl521a3catb952liKjifesCiFVpIjHGDPq1D7CxzlIhbzvTYfpgwlzOPG55nBjPGfA21+bCQGcgHqq+2Iau6dshsTLv9wAc2SUOS1GNiYqIzHdmCkSwKgW0Ce5s0G48AEuk2amdM0+fRECV7z7PWOEONEd5Ltv6BCqqkvTMXXrmXCurFumRip39WhPrglMZ7jyx1FTULhBMKcMORxv1qnK21Q7QYqzF6GxCAPjKJPkKXFxmJPMfdgcVb3UweTks58A/gMktnK4S2iJMTmRM44FsMq/AP7/eref6aaITdubboTXGNsQf3kDVY3TXzgjMG/Z67vtxIWmtJWkqFXY9r0/PYzvo3VhM8vV6Vd0Dk8wddc8HPT6TfdzSL17TyqnmINgdnwNo5d4dOxYjisamB8kHBHU8Oz/jgb04e4lOJFJESHF/fUHpuR35/qr7rfutut+//nktrIvKqAgAt3jnHQNC27LYW+1HHlfTjpa7SuyzFkRVZol1IxUmE67WU50zF8nA5fRWaXc9INiUVtgzC5UpMv2DTj2F5XYWQTug0jTKkwsMIGat7ffejn3L6TJmyb5FaWabaud1Yq11v/c8hI34aB2zv2jGCR9ts/mhEZuzCdzhosbl9b/37bSZV/vIk6ZUzKmn+YgQvO+bZNjrnhDCNF28ApzD3ybSrE4ZTp4SBK+4ImKzlEsNWSCfzm9/F+Qm3a+DD806JFNVWe/h4yJYBgBVAVzNasUJmO1w7qaSdtBndTxfZfvHGI/UGWBWtyd5VauPEoGwd2PDBoanNxhSEQ8WtGgO+hWI6Ac4ztR1sFEBSOV1Xf4rlKAahFmhFCG+QpLnTlXdJN0s6ME2AVTR44LWsgbA2I4yKscap5FwrTVAUmuxG6oD0XlP1cB8Jl75CPrrOaJew66IB1hlcpBtUNrVBeHelkAHcGQzGh9J3ILd0+kHiB5iCjQUAFvKO3IJMkO4KC1IAE2KpoqHXarnpUkzhwO7wcjpWxci61HTqgJDVXEDCF32rlzQiTDa1mTwAEAFiFB4EKA3BkAz0DfCnDJPBF2pl/gilCpPDdokk3C9O5IS4ovrIu4lqAoLmdObyH2cJD042tHLBKYpydkLzGFqFdF4bv9VtOuuI+B+VP+opC5TYj7PsfBidZ1hpCSGDE0NeIcVgJEJSDcws1BsSESnGACJqaYbL9HDwsCg8gZZekdcBlt4Hpm18Dwytxu3z3TL7IO+6WBt+0Au2PiJcidvakZSbDGuEgZFr9Fj8i7XkZ7pk+H7qUo0n7pHNbVM+nP6FhRkY8p9NmVN6FZC9waoG5K9Med5bJd07656DmFlJr6wfn69/3ER4OvHWw6D6f/fnbPmg4HQS9uO3wSBp/nfn7xl43xpPCRNukiQZ6rXzL6QBIt9pVDRHSJ6BmXsDGV/Um2hBJf2dSbz1SaMWuzpCqS4RwfYvFfS+UGldu7ttwcZKyJMwdAuUiW30/8ZZ5/ZnhaIJ8E/19//jkNzyJXPSatM7sfCc6IfNiEY0Fza26ABSQsahqQb45fvz+k0YC9kzjb12LrTb+4V6KA4uDX1eRbs8xnbQpfRhel0Oa7femmtJdXyoT5k6dsCaruSc/Y0LEBr/Cp33WG24cOT/tzTc3P3Fu/5EucbGHuxalQC7GR7BXZcdKzoMwfDr28ffbrRj4CcOgWQNOHBCILUeN7j/acS3l/4Oru1AL+9/vjDfRt78rHfuu/KOYvqk/sUKPbVPizCvGFzEPlXEWHtVVX5/rrzK/NdeSPLCBt+uBDkZ9IUn9v67VsfMZKKAFenSMtqHO+UyY7fyLcyVQFlNoj30L3W+D5uJS2nmhvsIGexxliKCHfFWMg6QeYlkrTG5ZHOZX9c8N+3xgjQxhTOvX1b4a0eIho1fsqbkxRWlmgV0irT+wsPGc2SUtmnNSa6GAuFiKYTqIfr08vUCuF3/QDYf3jaVybanSpBZ6+B0eT/UWf+6SfWgfa597moQlXtnFq4BLrRpOhR6/3bnerV7MQpTtrzNHTcwBMOxd565wliZbbvMzSWaA6MU43MwR/MFr8/5xb4Onw4YIHIDc+qqYAJoEdjnUu0Q2KEE+i+ZnUtqM/191V1thRTyD7uaPUkNhcgLJKtiDZbcTxC0KkfdZ3NrDwQIgw32fUe1CZqFOCS32G17eQc7dddQDYh5T7vLNzvWlXXMku3Y9k2pSQVF5juSKkK4S0IJgzpHWCLtElOnSmuUtj1974x6El5UYptepkwa/HL6U9HAKLMmDQMIEOUZalCsNkDxuQTcUlaPSYUdmrtH17xA5XFKL7hYBdkoOJLKmO1OxugJWoNN26HNKNKNVnYvfFPcupDez6hGZ31mVrkNkGo4owu9mO7QARHkA2RPkr2/UXTr5N0EwE+b2auvU8COrGB5Y2lqBVAbJ5sIFhlZl2ZWYyBwCJUy3g/FTZpJQyhrynkDXt3O2RzqFmHkX6YDsvHSpIaUUaADHVLvbJ0TwDQ9d+Gk7Y/1hkCNaSVpr2mc40iQWPMVH4IZ6g4Ds0tlMGS2aiYBskJE3DN3uHAos7Hbz6jjserICbu9/v+5+vrn1/3rycjSB6dSHAZsyFsLQaPLGmyR48IbQPV/Az+C1fu9v30XxthWWZU0NMUPm+zva2qW9lDlwCYzabPeAnD6EKq6naVwxmxqnD0tHX6LZk8Ye9yQKWk7mCxy4h4Ur143LI5BG6dc7ZrMchqYltHddF5nQlXHLUZjISElhNGGtJJ9OkheQF2H2tWOvmkPzu6BsRpwWiD7YKu3KZ/4C8TExvCVRTbTrBiYgs2X0HRIYBzkiwAFwP7mFhRsjAQNcPjGizVpCP54YPs23bG0fFVK0M8PjoDTepHzwTA50uS6sbkoXsUkVO8ZpJZrwNdZp/YuvGAnD3x0jhVYZFYUxnXSTs4UFLv/p7R2/nMsQLehJrL64F7fOC1dNSaPur7vRrRJBBbLMfZOhfh8ealJ+DZHxQRt5uXhpevLZoeq/9/+zpv+1h97SoBgGC0AX3OhddnnU8nqZRdmVGz7cxtG6JRkpWE+eo27khALSyZX6zV78cEgCmfYf7hk42oqouqcoYQ62m6eXb2c/0n9aUZBwvvb0c4U8mX0l2KlWwioP5bFwTNbegORmHY3NPcfzNFJFaDVff1PyJHE+Uh1HTlo3xm9fyJlqlZG9PHH5h4KUTZULphfTx7BaXu/XW9B854NGBhoV2irjWqy4btkmwPbUdonyJqjTSHZqICAKa289YHzuR6SKxjyF3zEnQWvHNh36TUxfxGD9ZzXk7R9alsDdw4Q3/9eDk9dOxZ5ZGHz+eCHYn5+t4P1QnKJ/IZ6e1g63Ek0AZlTcDGqWOPLjQ4s/FR/qDeBR83W36yArsuvWefk2R4aEYfhqomb2+N5NlXT1vEfkaSvNg0e2pvMtDBYkyZK0YYJBHX1MTQT7Z3SEInlLvsS1WAK5DwfMrtnvx5qeE8rIpNPUpphjhqh7Lea0q6soqJC1B7yO6xZxHGAnpY4GKAqdLdqcQRUMPPewhJAK6ACwBW81LGHhPtE4DukCkVtDxtiAoZTdTDl4AyYwDa8ZU9ojgGTtn/YOSEjoGFUayea1yKfOtWIv2hLiReUjI8jgNcrfjxCkUVu6NXD5nMs+DPa4qWTVGmp0fvzG33v/r49ncj/bhLeAIAOdq2CR3n0oft20Vay32yVviNhAdclzlh0CTCaAygPJs6q5JYXFI0cWzBBTpSzq+34dATgGwVJoyft8OWck9W8LSpW1OMya/SDYxaHHD8OOularJC+7YqSJXJucDlE1LCFO6XQ4LoH1zkzSR4VX1Vdpd3g1kJD5baBemeH4xHx5l38lzWcj9yVfFWfd33r6/3z/t+J3r8UvTWbY3mFC8l3agXQg0RwOzj40/vJZUkD9JyQbSz5kb1P260ms3SiO+qupF3dWtmzkyuzExllkH8n1nbLZD1TI05f+LaWTQxRv+uS28RASKlD+cRz5U/TsuQRXx2QEEzi2eWS/sZXZCsw22KCLfm4WCV2UtXPSH1eS42kPQxc/g8jzI3VP8uhQrBbJXtyFR3y7uaJQFPMs+CXx/2jb0sIVTlRx/qvMy82Y1op9ua93mdwySXB1b0Q4W29799iSOc/EgkaxCxGje3kcTExiID3UvgCsB+PwdVz07QzMVjzvJR6N+fiB0Df74+pa4dCx2v/bZYnz2Ov1UAzt/+vrxbeg/wzJNP3f9ueMneoxjwzynAM2X92Kb57R8//XNfsBeqG3sAxHMD3/7u21qdj7MvOzm9/SrXGw2Ygd4aCMWfjuHctqBhJbKi3FO60VOiA1iKAqQF7XbZ5uFtHfekOXryR2dndklL0vbSZllKdm+q2VUsagjz9Uy3RhMbqj+pDVyd6b8+780r0A5Zp0F8tDf3kXFNfMLOZzVC+6ydQgjwmR492H7pMyxGJwljatYaZWj93EnVow9b9WSd65gLcW6Qxg9+9mv/qtq7kp4TtGcnanxMHfrts5b7B5HYP/xjSYrs2e7wY1aJ3wWVg6DaN0+u89Dtj+0GC5Pmb/uHZ/WEZtI7baJzFqsdEP/2XKDTEHyYNnR2ZpTOE8t+aFFM7l+eIdtf73WQW/qxlisnVTXvIYCrewnMoxPjSAOIDvSN76iOOxwKQIInVjmJ5A+qmuUYXhLspLbIgIFAmNlVc6lnzwG4FdfG1G3PYBk4NhUAoqAFSRm39CtiBa/gIla7ZkzHTW5kQBErqJfgW3kKWD7j7jUuqh1Olgz6ROY7VJlK8iWR9GTp1WtGNHu8pChn9EkGowbuAxDBvN9wsm1ySM6Lrj1GFA9pIFiM0E4dUUAx0tSW1mJl+LXIaomVwAuViDI8HJXjXo9q6rTx9un15OAx6YbeLw+RRR9n5x2j/3Ta2CFRhXJ0rwf+Q7BEPcQpLevxGYu029Y3Jkx7k1222N+rMQBFspHBruwsSkajL0oMrviLhkGPt1nwiJDlzznVE3ZuqU+4xYtHYXIolgf9TtLUUpW5LAzKIDJvOOrAYGaquW3vxFQgOygHVzTByJKgCjIirlhsGgwVgBWxsBIZEW/9gkwo5EewLuuyYIeyvVl+zjUmzsWcJoi533eS9YLW/b5//fz5719f/9z3nTnciH1i1NikERQeWlKPK//8i8niSE284/dEi7FzV82RUlXlyqPfpqxKVFXdVO6LV2bdd+a7qjbwBiXP22hXSeVStbYQ+5UzhpqcI1BSuZkCQ2JW0Orcf216j243moCweRueZiyimfa2RPmtNamdKWP1xMO7CRxkXMd06I6jKUnM7dxIqZYk+MREF1tskZw9dXrPLmaZkoMtzyKqxfYZYECGVnJ8AfT038rAJAl2yXUS3WxHvJ0VklkJebAJjrONurs5NdpkDIpZySFfoSMO4gAiN2BiE6aMOQRgCosPH4AD9dkJe99ye8yHc48j6YD1uFnpdNzUIR6pbr/22h0FqanZPfe2MDUNN2fPN88969Ml2tZ9y+GHS6QO7/YwvJpX5vv88wHo0p7hNpqPW7+9zLkyvFbVzMicaOSbk7G/Pk8x/u9e355l78VWCLGOm7Rr7POdqcr67RWDcYtp2ZK7cha2tjlWQ+cNcCNtPtcWh0KQugfAzfKpdLBdfducAGA+y34MsHcf3dJJn5Rstho6hxi2dgKJAFOyjex67QJBJc9H8H09kuPk8CntnUrQs5LTL3j2FgOAknCxtqsW6A5dbLxFtRdBDd4Ux5X7MrXDjBbFQOzS7F5MjkXeRGf7KZydGqqD52M6YDiqZ2Bh4XVdfiBgTNnRpeD5swJnMaC0Glxs5dd6BUMEYO+Uk7AmuRS7hHEa/9bkT5UeaFLyU8/Pg42CdDXBrcZbQzyhI9uBaSkVBENHGIwQVrzbarN1Ycwn9Uo1HwdMtN9+qm/YESj3cWjh6RtMm2n37XwgADcfVXc1HWfkAibbOl6PLxeBBqaYDyLQwj6GYeKS56teiPE43VnmKNilbGfFebhcH15Eza9q+6kGofv2AvUkt1BCCFFZrFXXtSvLlrBpC5MPi/PwCa6IiuhAcNQmtDPlMEa2FDdwyWa+CkIig5fAjm6MblQRy0F0lrhShFFDvnsnCQKIa0XbR56tWsQ6WN64KypzNBOwdtHYf4jj9+3TyOoKgebwOV+zxrGeU71fRxmnv/2m9Z8po+Ogn59II4A3ZUqM/Ni6s/i4jD4Xbao4NZyR3TZgI+ff7iJkWi7urqLxclkQs2QeqfIUugCvl7WTHlscGEJRPQErnrX+08tJ9rKoc/7lMk986a66ZRp1lLPqjknkCRJCVUrIhmW0C+IU5lqrPbWKKg8WW8FXRERaOVohKhhYlEKLwrvqTvY8S417z8bAPOVDyb2w87kYB6VaBXf9OO+vr5+/fvUw4Pu+12tJH6tCrBrQSQFBpoaW+niNgMnwDFuPU34OJlCqngCgcgBOddtAN0+32x0yM/O+b68JH4LCB5We5dkgH1M8W/C0O9R4WrtbJRVQoYqGrQ+NgPgkX4/cLUFak8z1JfcTezT1d2dou4P+WSf83PRmq3W4ApLchsg5XBrU+4qTTnHnE/Hcxozt3X2g+9Y1WhnAJrDvvmRzueb90XlgyQFx2HX8By/WS/ns/kPt//H6HYDi3nR1njuravUCa87m8GQ3R6h7wIqkU6ExvDQAzPu0t3bfZA27kbdup8z3Y357QPaM77WhNb22m0OuT8DzLYAPZfL7sx9O6rceg/3mbTzPH2KyevO5pznX+EbPdGTZ1GzF+gghz0TSvsnv9/BxkB+ZP387DZ6Pw73v89vNa4fFx/14B5X5HEM+d8UJfTHNsM++7OJDR2jxOYXseUWEENd1ZVwVgbgGnxBQMC7yBrqIIQY8knbmtDwroK1Hn7M8AkNWM0iEPU4Tmzgfo570OocR0m6303E1Hvv+zIjoQ9eW8dEArT+nyPm5L5gcSGo6oLoDx8/QaD+oI83yQHlVsro3Y8N+ju17VmO6bx8NsJ9l03btLXh+OxfbZqC7hoaJYd7MurWj3+wz1s8r+e70dHq5hv4pmfve9o3t0AaAcNE5o0NUvunq83WAIT7eWb0abT72p4dHCz5MXR+Hy5LQ+RS1FcJ+7zD/PMvPzdVOgheZrWi3eilXoU/nZbRl1CbGJTEzN3lQne6b3Kt0TYcBTiHAOD2diqUJrggMwpKT+JpyhvgA7CZQoJrBGuysGWKA5RO1PyfuQ6Gi758A54Q2K0PKYYaqFBDe1FXDLcQm6CyaFirdOEXABF5CpMJ9Gu21wIO0qsdyV5XYo97MCV+SKsDQAJkdvtnVBc1bnYygZ8MSlx3GcnmQArmMFQzGUYUsduDBWQgX5XseZKE7q0vM4l28s0PKAJdYCDZpui0oB5MYvQ2RzpfoJKr5TymeLfweDc2jSXiiCG9F+9FJMLbdbUXpjTWbm6VqbfSNol3mVgodH4nCnmYmuRProfOQopq/whPA0Keomvary/1Vum/90vCg99xfmmey1bp1Igl06URzRjCQawt+oM9G064JYBQyS++qkm6pwNuAH7v+Sg+Tko1ZgncSXKTs96+1Ii4fB5LCivF71rqCV4++MvIYYixhQRmgsFA3dLMKup3SB25quG4tQrZIXKSUk+do4pNuxV+MCpTy6/3z58+f//z6+eudd+aVaGo0uTr0+ExbcXz79nhZhjsA0LiqDc2xDcUFuOZeEhNVmRMApDLVAUCVmOXGvXfXfFZGrAG2UrtWPqAbR7XTuYHOllQFO7fnyQyE5wDU1qG1YwVoyd0mZ8vpswptjLeLsPX2wMR+O1IbDc8CQnmCss5lzPuOiE0V4uPkv3VrDdBJUT/i6h6P4UjdvWcmgztMY3St0bs1bkRI9xjy7QE4VDfD2zGvwx2FHmRUE1I/wjBD1marD33Rhhn9dyNU8KSxaQ/NNg4EtLpfzHXUtn5V5TNaFZmp3aEzhCEtih/5SAFNvbIJSkj26IwPSe6ugE338uw19/37J89sgRyWpH1G/G/w6qfu07ibnnfn6L5dPZGUh4cPWsMBiaSZaeJ3JwAqoKjqzoHrutqUrAcTjO34OpSasPkMA7absj0VbSjdNw9Jctwl6Rs4iuSQHJzS/s3Jk3q793Mr1YT7sGu4Vt13VfG4SfPfmoCkpqU4IjRjrvA40Hj+KKL8vHwgF5zwzl9MP5iIVTUqCzuV688yk923XupwFtSJ243/ANyxNOvWfS8dwPTCQJogHICaTa73y76LNwFs3v12e52vr76cpGHd9xpW1d3MWlvt7fyCZTm445lMT3AHUmhHtj2xAWnp1Otd5HJO3XVGURLDeEiiczG1wwbgI98ssMoB7WTB2Ch5taMPQ8PzeFxDz78B7fZGzHedzouI7J4NfHunJfj4ky1g6/s7vTUDqbPp36pxOvrYOwRIA4HZoal2Nt6iYtBOz38Z2M7cVH/X3pNQR2q+AJMDnuEVtpx3B9wszuWNsGzbEy96QPs+3ZbYDSmpKk+/s7YSMIAVIdT+WY1W9mq00+YH8GOPyzgOzfyIQtO/HPp0UtQSxgw9Bfen/bWF0XNXgZo80FF+2JtWhXCfXZaixNsT9axV1PPEq6CFvUThZHJBu24utf/c05kLdhqJqLpVULVAlDvWKl6v1W2yigIu5zCgZpBzV015/IRApwqEFExjRyqrCksvKatZ6OVpR4F6vdbuWbtlyEkqcySiZjlHocRjxVso3XBjLm83BWUzDLgmxnZbhElt7gTjjAXwIYCMO/98TWnRN1C7rIFZzzl54AEJiLi+CfSHR3m83JxiyBNA68Selqik9UX1YcQqVJLxzl9VxZjCIot6TRHM5mtmh2HtUPTBRM2/PnzhoXUZ9i2UVfnWcLgFElVZtzuOoZLck4nWzKA/7oqLK664GBFYqOgxsYvdngMEY/Fq59PS5tQ/VvV8nouRMA1/FVBC6v4lbKcmJyXYtoTc0RErShXFKyWWmKX319evf//z69//8+vfX5Xvyh9FoggNxSUgjyog5Ibazv27zarEob3ITlHdKGyAiuVQfGguO3fSRKAQ6jbLhqrsGIRuQKWsulO36890vwuamUBq+z7MlTBqqtF9bo4DwDLyVlxjMdu8tfh9k7hKTWajxmpZVkRy+lwxyM6WlsfptCpvuz5dfjFShoPzrhXYuB15Z61Fux0RcS3Tz3fv0D5YNhUhFKd5ejg3rAqCz1kdy4dx5Ir2Mjl5GSnfXxVw2dKqe9vAx3tDKwfM3IrTEvuzNi7lPET7OnulHxfhAfF/vM43nyX4nZivKr1VK1Diius6pjuPB4/JmBL7n96vFeH12f/6sIUceleRi9wb43U9nxfYPrrX+3lhhxyfDgf+w2v/VtJR8O/lOS+iMZaVb+lyL4dTCZxC676H2TsAsZvRZhk0i/yHm9lP51f41FYqeOfbtoRcOtqda/LN52527/vcT94yvi/QKKDMfL/fmb+qbhu+zaHo+DYiiFzB81YjzLj9rR+jo/4OzKoUUaIqrCwSyZDcKyJWKWHihiQLFfpcjdN13DtI0nzcg/53qsOHPYGo9mliWIOeez5XeP6NCKNNJhibMQsN7VTn9jVhvJrB5gH9L7BCVek6qS0cO5PRJPo8Yr+WCgNphS4bezgMqMrSANI+d/MRmI5WU821ztG338+89OyRIMDcztmAlyPUjHh1rxJrKZIZCgWcIPieYfqsOPnzHNq932/Y6fxQKVG6PciqVQeHcrCjqjoPKcm4Fo7Uzj4RfleNXSsg3HPnQ+ZNiweDCHi0RDuSitJQ8KMh52ZVGIKcozGAs7LoWBGTjGsn38zk0ttpiNIeNc05d+3d9ZZW1xriQP/bIl+kzrGXoieSIdtwitOTuAwLeV0FowAkDbZIumIFqG6alaTpUl1IFatPkKjNXqfuRW23tdErHsNJWzYCRcRa3ZYyCyRP/xLyS7Eyk7zIyx5jgCymICxFIDw0DAB0XSGPIWtIw1DnpR8lVVWxWLG4FLpVSwX8KBWUYkABUreGkwJkDNsISOCdTpq5E7mUhAeR3lIoohhVtbTWeoFvX0F1lygkSUFvpasDLM9MuMITPPUlvY2WrnxTt/k91lqlu4h1kViZmVkCYkUEaERmKqtBgZ3JEGIxFINSB6JbuINBNy5rj++apoAG0wVQOyVipcMFAUV85d4sa7POxt91Ix7foqraA3Zxnx7c7XCSXPH+SvktkUBIGYoKrLXoXm0JUN0pJChcP1J3dHPqqnKTRKCFw5K2dgx0BWsQIs1IYNJ9ma9d0R1RjtmrdEsl9chYqZRZmdcrrEKjs8kwJjmWhCRIhdIgywBixQVOKBI9c4ykkBHKnU1pg4h1rYSMZHL9qqqkN/DLlZiO2Uuqm6Wg7vuuO9kwilsqrEvxA1U/rlUJ5Lu+/vm//vV//b/y17/w9b+k/05coCk0kuUTxYnwhU4cTAjAckRWN1DBKnky92gA6waK4AIJRN7YqrdJpawvshP/SC8vKqvukoqlEJzOQLm1rhWFRFUY71jG6S/JLF4JwhUyVd6FASj30kXgIvPr17WwsLLu4HWjIK5FRgh1q0Jaa61gqXzNUZUqUbdWvFjmaw1iuU4k6Z0GrF+eRIwUAVPXz6jBPnF2A15BqfKuCKyIi5GprzszEzmJH3sYaHxFJ1uiQbAuLuZX7QJsFEo3nHgoNmuqwYGoK4C4VG82yWxNOsAc83LaOki0BYWARj50BstJ2vZZ7XSqQz407Nmf5sXPWzvADtx3ttLobGU5bWO74JMq2a62BxIot9OVsu5EXUBc1xU9t4wki8pMt/BPBZBTLkMsp5Ql9OhAZx/fv24EweSKgq1L0w0Brm90W/Z4DA97Twx/P8nNmfg4IsLjDP0WHV0u6AOdMkQdrnxd1zVnpRlM7jurbucjqnDf7Uhd/BHDXEQsKyLDaYQoVRYc+Ed4+mcCoLkSkAQWcV0NsGFnD83wEyGmFHF5vmGraD6hF7mqylNX3WKfmV2VnnQKSch41kViXcItrEwm6r7Wivpx61ZWzjqk7uClPXFSTl6B5LveU9VxUjGcvuOKlFlwXn+9/uIlxT//xJ35lfG+wXdFiaEImw1GSR6XZkZyIgYKrp6q1/wIgBCxUIVKQJw0hDVaZwDZtTjj5otJdleM/RBLRKUzKaWgdAeiJGWsa6nYu11HkdHZ3AYaLD92Bz1t0RzHepBe5FeutfhaZMi5ddQC/c7M8sxhqBXuj3X5R1t05UypJDdwAPJMoW71q97t4eYyBYVPdCwSCHW7JxdQWd0i2/5YtXFTYsapMMzNmjLXh1vDG9r0pAwcmcNFL6iUeS+neAZFMMerQBMNBYNrXe7TkCdoqIss9r8jjDuIIrgx5GiaUVeKngIB7A3HnU+012QDVTsZLxqDOiCg3RJrWLjAUhAhrLVuD1IG2Z1I8sAukcsaGM5lrxUr602uHw0cLQCGgV1xkcHlYG8CgG4WhUyfkKiECipcGN9BLgJo8sfrqWZIbpxdrqAaHoMjMWVlZEj87BMwCHsecYyiKJYZ8qkuu+4yg2PJwob+zw34PZ5Rr/l8oyKCnUAsliLcwc3iJUzLjLNBhmMFAQaiwnj+bnMPdKmrV74E6L4r9KMQHmEILVQRZl8n1c2yUSKFBGjAOqKciXPwnkAVEnWrJKtR9xxno7d7LS3cZLEWmbqVd+mNupXJLFUib1SpbrbPZIOtiIUpd2snewR6XpPzqIbtR1do7HlXUtqMHzZ06rLQjDYMoadKnRmmDkoN0Y+ZDWcWSX1jifAp8gd8y/qNieWYPesGT3LRPm6SoOQMYdyHPBwidopCNUXhTlluUB3ehavFWweXywxN2xfc+QAYpQIAFQOEKqd8KksJZTjb1Vm2Js3ZOUIAnFkCc0+eTn0Rr/ZR7KWEj1jncc+UlBAQxJdXQwOgQoh14bpoKBaASuGmXogkEPwCE4699UYQWuJFmHk2KoX7ft///HP//Pn18+f9rtcVjEXdFI9GEYlm/81uy4YLX0APbrPuNUfMs6e9CBN27X87QbBHuhQ92kxyilC4TRZeuntKp6dzxuR0HZXprl3eQkCODmY8lw0jISnBqnRyxFsTetTKvKJJc8qTKPpgTg744C8zi9xhaUZ2O5XBqWtpknYAxOA5UELSZsIWeqChilzdLUhdgTqo7vzJXa2a9ptQD9PpcDrOfFyS9lRXuRo6K59927oul0whPU0U2pObj9Vx31tV80E4bbNF9WMpuhbheKHONzwONA4X+VhD6Dk784vWZuf7WS4sVt15e273nk7Q3CkfH7o/YnJmwi4CNMI7ttbskiCBUlydM9tOvL/YGVYeAi8Nz+Lnh54hwben/vz2qfd3RNNfG9ZVktaaVDHgXCw/p3l+fykc0UWY2enC8LG2L7UXX4CeknIDAXo4Bq/rB8akzz37IgeK3T/lc0wmYXo+42MYLPhmUs4EpMCqEFAKUvUBODKGotEmTsrcjj3gkifhlMriC/GDsdDgMQG1frzWBVwqu0pcpLhrp307Y2jgBiqFu9mEvpRgCippphR5lYbLZZKWvaTYJ/eJJDkZ3d5Zu2iTES/mMm+FNieyV83nLSvTOXzveMULQJMXdFirJ5nMnmsk9yTWPrWCYYDAYkd0z/HcSoDHSXzM4nFCWU5x23J5XKkkZW6fnkJmIkKNI+qlxl7tMGuJBxAhgAxFurWJVky7E+d57fM4qlTHlQFMQ/OcR9Jd2tHg2mNtebx++5xH/D6+9jUVNQRx6NNj5IXYVA12C6qHSnEU046jMF5ftSP13EkYwOAJFIb/9UZUlYo9UKOKGFg+dwPbmLkIgKLqrVQ5jFQFZsevhW1ee8tb4IaeCaZvIiKEAcuxEQFdWEBTbvRRaXSK5fysOdrSUAzsWyBa700Osy18u1LuW+HR/psTaRkOT8NhynBnRM8vnGz1s7tNis2lKHZlVO12jN0ZVRVKSVlQhByjlsk1mUCFPFzzqOBI7mIWfdohIOzhI0OC3lU3JPIrFBq48j7MJHeHFIC1WLqRWfqCUirUTb0rv3S/Ve+634FsFnAHbwtR3WJQ8JgeNPkLdwnJTRQteF3A1Z7K8R8PQJ+WAxe+wmaq27w5MCrvml2M/kQ++9vbUi1vv38QSVeGdkV4qlWMcep94vfuLhACudwZPrGDsWiGIMKc77QagJVfQ9S6NnREFJ6J6ufdC+CTfAFJJCCTTbMsafRqZg2odzK+jSVthMpeh0UCCsRirOVMR0oN5FwSiOy+B0j2HmcxfQUErrCXSCFQiFReYCnv1biAriUELmVKMLIwwhNhcN/3r1///PPPv/75+a/3r3/eP14/rtWUtlXqMcKPDGyngaeqtQrWoJK2YkVFhNltT+b7fR23r5ENp7Vqo7u+sqoyKx9kcDuXfQX3vm281Jmt0AQaW6GzhBwU7QwnGva37zJfVVBFwB3bfErAHzA4T/cL06L/Rhy5hXnf1fzbG1NVzf1/vMFrUuOQkT1rk9n5KgDCQwA/mu2xhRHrQEifgejz77mh13Vg6A+L2G708Ssfa6/u6PYOqMlpDxXRFaoNE/0oymsyeTx7B9uJ5JaucwGHJsM5jJkE1+BpNFTzeEAWxm97XsdefA8wBrP13ddRF9PXXoOPuzreLNwYh6P4OAQYN8WG+Y/qbne4+rvvO9VXMSqPAGKtFvrP+/EXtkqF72s44Qp8aHg0Nuw/17M8H69TluwpmmymF6Gt3uP1zpSSZqwHwAMWZYx+e9sKYpGrYuku0kX3rUwee9walY1RPW8JXSjS3C0YXGtxsVim4Ne6GIG1GElI+krdoNM3V5SRCBNGdGwoT0Cy96lGPZSrKzmh0HEST2gK9yZ6L7qI6lwjW3/u1+gx67dq67bPe+vbDxDj/KmYxDSPNPFF+2C2SNVjNjo4mfzzn4RnrO1okm1DpeMN+HZCj70waUGU+TBItSMmufZElkxgaJQJnZDue+hiyD6xDnFrC7Y66H10PeXptjWNBNv/fEjv1TWoJzwwIihxa9xknxBgMZ6O2GM3j4e1cvjDQT5b9s2yoL0X3y2MQ+3nF45m3Qe4erEGZLWgzI8W5tSNWlcsIICepWPDttbqGSwCyfJo2t/A2wjKyFLh8oli9a7MgmCvs4kHnWDEGS9zcw8fCqs36VF/7Tg9jUftWXFsnFdEEk3FP7vVBsU7kNTYI/Vw4O7Kn0WXqlYuORs/o8sHWGFVhc6yxrUChbeaATSdd61ycrz8KSw1jr0P5I1aYpBJA7ab/GZ6DX1+oqcZ+HZZDoDfUCI9NEqdbNMCwNgZa7g4owIDGaDShIDELSQqqdL9lflWvlVZuAOa4C1HD9dYZAGIazouQsx46vs9nbt3ZyvoNIWPxUZsxIBTMqdJOr/pmkI8Krk7oh4pes7sjrQ+D9HAFg8kK/+QLWt9STzXAU5XDyzycmJmzvBNLhWaYhaGElEwA/U84udzHX6DhABLRelel0Iq1ILs/UPZyM1yNfUx4R6qUd069mBNP/yPMGaNwMM/4zcs8Z6jtMDbnZHdpDZ48RJMFkQhb64UKphUXetKpBN+xA1PfUSQpnBmApn59evnz3//f3/+/PevX/+8//775o+1QsY/dXeIIy4cVtaY9udJt77dsE0AnZnAYQ7PPFM5i18huv1+/Ms+zo18eC5pEOeEa4c5PATM6JrcvrXfk6YARHtCrk1XWVLHcneAqir3Yz1k5zpepzRCkZkRzWhifdhGYh1NfuefnOfmcEyXeZpLmYlSeK448Ip19926CN1x0Pc7OV7tGsxSW6iu6S6QxA3gxFJ5FuqjBLZfgtP96k0PeZIomibr+KvuVd47cngG31/evefrfbTZnV8fB8Qf4YfafLq9dLhWNwacLiYAxkdgc9yGi7aPOjss/QMFPhfkkb3jWT4d9xYGIfXpvp8XP//8/KBjoZ4AIB5t+py7b+v5oYTnt7//EBMD+E+r3dPAMEx2pva3neobK5HM95uT4BGelmJ5XkTv0RMncfpUuUWWLO9O9EsrIq5CBK/im+jRmfdmUHabFjCNUk8Qsq/68ezAnU6KZYF049h1YV0K8cLrhaV/oX6JcUsXITXR81zAlyLQWI6dO/89U4BTFI9d/iZFeGSJHH+samfxP4IuX8FRB8dr0sy9nkvtHgxVJfl8eg1dsndadHdCJ7v4nFBfynnahd8y7I8AH124vcj6kLRHSiUcPQ+arHzwOQJDDzrLImjGIwCoI+D548t6YK/JuWJTAbB1OPYievqqBY+HRwoAi64ltqXrrHK33M3FO3Hzx3s7Ne0+rsCutTo4M6hs4fPxz5cfyvo59bgBniHz+2f1b5sC4WmRr3Hpnnc6LJxGYf+2i4pVV09LNdzKOE4vsj9z2Tsxo4xkKs/nro8sDp/zsx0zdRVJctHSV3XrLCwcltTtOGDSEOxskjEsmEaRqQM03n5HBZoWesPYsrDYVejxiYvRdqsxGVcgbxU9PbqkQKaDJzsuy6SHIUCFDCgRFShUMe8IxEBmqhf67o4Op6VLhvGgbiK5kc3lnE5IirXbIo04SWLRdCESeJM2DELdWXfdKd2Zt5ABHylVNBC/k+FGNHm2A4e6SBArort/8tY0XluyDXYEqh3EOVEjfAGpgRNiT8OFEZ+fAm3Js2S2ftP+T2vNQdJTb513fhyP6my/P6mgoQDqH8qp/CcnbksGAsX2ExsQZGYdqhtGbaiI7KTPqRE6YUDcia5HiVzoqsKtBCt7BrHxRz4bVSxjbBs/7PnOzlATIlYD/gx77gNWqHb1vEkU2oslNn6pJfyongcGCZq25wso8gWkeNN8z7jFN9IcmreQwu2QFnbexFLm169fP//nfv/8lT/flbcaF0jWWhfrmAL8eAudN8HhJ40W8xfpk1lVMQPtH+Ph/m01v+g0Yn7P/j7i5NORkNS4T1V9KJ+z4UxgN/+SdF2lgwkQiIvwVBQAzUL04eE3tSx2PgbS9v8OAw9AVeGIzMRh3dxCAFW3SX1aFrYz7UaCR/iPTCBZHX5IzSPOiOslpvY5khVit51hP/XjTT6XHQrFx2A0siT2E913Us8O7q3V/vYJrqxbXqcRMtHxNl2dTa+suruCxw9H+VNUvEE6E1zXd4bzEXhfPx5Z8vrzatA9D6RNe6PHJ+7ndZ/e6X5tydlRxLkpGFhxI2T2R3/z8AADjhlhDrdv7lFlfjiQE1898WfHQb1TO94gecxy6sqnNwnHIzREE8uaDXgo3fbjtPxgTddHfPP87OhI+sjFGlrgHtynHQMeykjPhvNEqh7I9eGijQwc3lGQy07/AhdiiW/xyS5ucZo/OG9vAoAgZ4TOsQ5grIJUbxRiXQhyvfSK9fdff//3j//HX+td/5+v0Ne/fwr/zml69ea2MRChiohEeHSSXHaIItzotU9cf7gOASaJaKKWLecNF5jD8ptsX9h0YelCkqJ75/qqD2MS+cAzJA0m2l3UuwL/Id7tSHWdAPNAfbeygfON9bnfe3Umc1v1ncd/+lv2+XJDQDQSqKrUw/vai/VKNNkKyZ6lGiz2Zuhjy4d0ZqLLYm6Hkq5nlMccOrqCpJCbKJoifDIV0TBRb8pahKERbX4G6uVDGDCM5fHtvSZOhDfqwT95UiWPsdaYpxkYoD4yK/j4VAyg1O2WntpX4Pdw7NlK6xsVyXeaNU6GBFcV8iM+kd8flDGbMWtlpd2QDV51C85BqkgqtGB30mRXMxDAaxHdPNlRFD4iEqCsgNRmE/8hbD6fTX31ued22GXOkU+MqeGvCwz3GzcaUkqhixgsuuOl2Rjm061eTSdDOZ/NQgUvF/Q0Vv9xB6kVK6ugYgUrhYgq8KZNYcgdOao71JBFpTMlNNQUdVfdqnfgJlJZdX+xjWNjxQqJYuGZFuwmqnQqNyzwqbrd5yAU6g4KHVIS4wi7mXUN/kcjuhTST08UlZKbnjdSv2oKg2MDnOYb4z9wPPevbzMJG5NZMHMZMaTMG5NZ3Iqy00I9GeMznt6Y2lM89Am6gCVjUsCs0yUeidIIZwesAtbELS2i9Kgmz6Y9JGRnL0wdIKRb9wPwIDRWlpK4HX3YMIoqFTKrSkg2FNKnZ0ktdiS5u347KB9LWgQdP2STx5TmDIrVueRDs8NDexevomaEXJnfkRFwNXUFEKkIKXBBt5OUmbVvKajKX/evf99f//N+//N1/3q/flwwXdEVjFu3I8jdhthL5K9jUc8IWADSwxDQauvIB4+ePHREJ1jKUOCqjMb0F0MNihzXR9K7WYn0+aHqnlorSGsFaVKKWydhbNVNVICZb1qNZS4+0uZ3l6mN5v5rULmnUhLZh3g2R92Y5364Jx24/bvfhXyuf0tSoylx+FrDfeFenjQW/DXaT7tWRvK+79OL3Y5UZVdEtznxr4yen0fWd1fm278CXsFKbWqg580gDY/unKGpCff0NHw+uI4AYH+o1J7deUvG/63LZ+fD3zIwKNWPtv+EUwE+l+K85vmrkeeJMT5DlOezvicdP2jsnwcMFT/KC3aMvlUM9vvzpGeeAKCqtkdoz4WHHJ9X2PKzK96fD+5U07NLEYGQcvEzMHs+fgBC304NntnD1gb9XGum1bIxa0cx8GO5+lnaumIpFuMiQw26RDWzt+ObFsvctAH7atBGqpAk1gbEdGozroSkTJDxl9bfuP56/f2/4b/+W/+9Sv/bHXEr//nn637/K7QcvEmYhGb/gNjlYYrFQkF530ZjbWmctXu+5lCykDQ7DT4bSPb2abyN3riShjzj8IYAYIGKD2BeVbnNs6aTYQvVIQAEEIpnct+wNgXWwLM/DPG+SW6z/fmTSfF8bO7+1pV8Hvb9vLjf+Z0ZyXmKID3TJFBN7zZer6UROu/kPAjbRJwh+vkRHHihhpLE9MHbpLVX/nn8cWiPnQXDcfTODf34eXe3WkyMO4Fb7Q/vnyRNC3GoR+1Fs47tsMMcaKh9umvQ21ucEtIektDA5E4DSapsF03SSDsAXMheEQUiHtx8HOxAragJTHDScZkPY83+aADxY6EPWZmIgZuyvDFdJBXbFaBxXf2GTmT3+2t0mskbaIj3sjqY0nB1owMJMMQiPRNcAamaH0TtaV9SNim52kPlUNBAcPUsYI8pIFEu8qok89CFb6KiPRDdvlA3OeTNeqPuzJ+BW1X59UtvAWAxM6F0U3TBI6ScaLEQpH1WUujkoBv5IZSbGEI2y6juBWtpZvs1ymHrlMs41fEAL4RcZWkKauTHQf1mYJgF421JlhjkZKooNWkzRBouBYMP5bCki28xgvsYpC1NY+FwngeyqYpgL8dtYE6RoCIiHDdvDxsDInOKayJ6p2Y7Iuw3eiIsKpzlzf1LSTAxpZJACEFrpErUYoe2ZgdqgI3jORSEcPS1T3jfS/f7dr1CGdMBbKime/zo7lZKQA1PA3qdp+kaQSDichFgBTHc9wxV3TD+k5A5CduwFRelWkTVDElYNubv+/2vf/75f3/9/NfP98+/f/z1o16dJf72soeGTtTMmf3AyVT1gmBOVFvYqQnsdz5/ZQJQJYb1fJs9Oxyox5bIqU4Pu5jYAkBV8qhOzt3eK2LbqCEaEuQ5izRXCWg80gi8jz6jywYP5mhf5ywQK/UGmq2FDPQsxscba6ikKXg8mTUKE6w6lEQVZdaLQJa516u6+zzAZQYgTYrQHZC4OEVRT67dFIQkT5y9DjcReNjT13qd2zf7wllX9pWcq/EfLgMP592Neu/OyL1Tk/e1C1LHpWv3oXpaav3Gk/Nh5LzI5pEc/cCJYRyVFT/CiZZS6ezc61ioBwJ+d3qiqQ50/nyb29PtmJeTCP55HOpqeNQee1SqQn6UYvogAJa6AQH2x+74VkhnLp/n6oVyt0x0yLm7QIe6Fk2pt3tvvPJBgsvNrySZhIBlCgzdmjqCMxQuzI/prq4LmNXk6QD0Hlm5NgCDWz4Ve9HMrm0sfl2v6/5xX39x/RX8dfPGupFVlQUYUSdhBod/+JG+IW+N68zN32JVx8WIFbwDBTFe1+t/xd//z/qv/51//zf/+itev+L1X7he/2fon//5P5S/oNtLiikwwyLlDAKamGk7TZKaJcZ4uAZE2QY8UXurCFDNNtIaY0T3MnKdmz9bqOlNapmceEnEuqyaOmmoydPZ5B00j4/PKuXOlwWidEvqQUmqU1Xi89U/6VbXo+VmVMPnQXiOjDvNq3K6ZxZBNDGWnwQAWMUIEBX+FHM1sB2eciLzPCPI8e1NUyKpzfDgNGtLmdql9bSnpnvow+oB3lFbgU1zNgbz45iuDYs5Ce2YDursWa4hbtkrs9tmh/DJ1RURajSw/+5B4YlUBN34Z+dKc7SK3SjLFQGR9NBD9584gOl2hFi0uyiASw6xRtcZ649FmSLCcATn2KuuNnDzUD2BFFoR4mY4Uk+HYfcOss3DHIgOQFvytnwEo+5mBZCev/p8NYW8ekO1OV5G7DoEsIvtYWd9XkKN65GHjrFr/sHO7x4CLceQWqoav2oP+wj9//p61zVJdhxJzAz0iKw61beZ2dVqpfd/MP2QVt9qd7r7XKoyM5ww/TCAzsisWZ+e81VFRbjTSRDExWDIiQBRBGEod7GSTOEvaJDFj5pGQykYSGy+JABmGJIhA0USmHm+gxPnmY+HzklRmTonVjFD2vSr+OdxHCwjMNsHUJsLFct3tTNVxQqwcdgt7J0ESKAzayV98NYx/a5dCJVVHaHzoT7ya+XLPspV8YtlsodizvMKyVfcVejcgndvR04LH9vjeArg73qEV9Ua8/yJevKDbG8trdsKd6+EI5qjIpybdLwD2bV9tV68XrmqUclEF6czOgyEcwQlYMopN8zTAHNDTaoYuijjQGFoKKrWzaoldL14gFRqZvFHOYqfTr8ZjeZ4k8s2qqSYPf+uRanlKHNhCEIhSJe3w+WPdCxBIAZcFfLQfH1//e317de3x7++5be75j0xJfMFdrWtvWRphT0WcmlbwQpMzFzruB8e+2aURKSh/+blpuQ0X52mRby4jtKns+rDPb0T/JZR1un1tfVlYZrI25Bo5ZkOamImR215boeyD53n826Xxu6RNFcI1g3m2J19P0uvaq+ug7b+KSKEiQzl9HzDhLXh3iKMYQ5MZebj8fBp7wVeYyO4/fkpSn0NnootFfDh8ud7xHobZ7t/2AcOkmn/bg+GPd98NxrwaSn3h66/1tckANUNGk+ruW67f7+tduxPaaur0qkfymQBPL3X8xLvAtxCXuxtEZcf5Cu38KQdyNXy7PNbA8aZ19h6ma73+jBIaVFM2uy+Uh898/qw3faRr4mNiM+0Kv12P/mQpN9CUsShdnt4OQACEGVuXgnAp6cDpBiRijEGjmOctzlucAPEcZMeIqopTsP2xnFY8D6Mas4ZFWj3aw5ioIHIblOViMED978cX/4VX/4Lbt+O+5fbl3n7+ouO43GmzvH9x/9DpKqrhm2bhHDOhIpeKcq7dr35YTTseuvMnHtUe3xsjbxfSx35svYYXS+k4lS7GGYJNCsfHb+bfecAEcG5OjFcOcN+dEiTSYxL6+5yjq6mbLbTp+X/qbr78CLNWYBLrs7y7SNihLukbyU6VQrcP7lSvB2hkKvP0PWJHV6W5ODYcIMwUZ0cKNUPdlZrH7Nh8ZJmRVoYYxybqqk3bWcrNocZ2/b5nCfZf86Puk6kwchgUTyWhxmf7qAt07smvBc/i4a5IfvrayZ7eAIK0linkIowYGkErNqM2HQOERGHFhRkT8hLEmIApsEIqTOGt2CmXVVUFWn6Mb5/hY4k6dSpaayq84blCfi/afMMgAy0tLly2gwO26aaUybFA1YZuJ/nHQHN7gJcUya3ZM2jEq9x5S6vRpuA2dsVI29xcBwPvJ3zlBS3iNJ3GGPkTChmQb0nyWFgrx6REDgzhRxxZzHROk6dfXRl5jnP96A0z3y8a56cCVXjr4r1J5BGkzgSmfM0p0r6JI0DPCIGey8Jgk4lFAejwT9mYkeT4E1i0rFuy0JNPhNjRKZyOorRs5e83Sgx7XInKuZHzAkSB7rsYlqQ4KZCkodKdvhLAokoE9bbK6RuuouPe2YCq04lvYqlZadTqgAuxdHR+rUf6NA4GbRKrKNRMVwom5nhEu0CY0xAIvJMB9ChCTKbxEYr6Q1pniYii8CcD2oiBU2mVKX2UPeekzSnats4FOdQhCpa4IOwS8+y18qwD7Onp0xEZHdGEnQchxhiKF16zlCMYMSQOOdjtnaIEZByJmjXaAyz4zNTzCJoc/pkap7jON9ff/vx+s8/vv/j9f3HY74/zvN2PwaZMxs4pVmOikPbERFznqrS7SPnw7HO4VzV7hCauu64QlO+MvM8z5Lb6gdcCUSZLURlPHV4zybPjChS1iAZmhPTw+jDrU00SgWAVE5CEZxTp877/ebNMsaQ5nnOCMw5b4Pno7Gql8IlqTlnVqQQo3nfJTW0xwI/VChYMWiYXmYe40K4Oc6a06OyeRExwoVfAecJRFWXCLljI13N1o53xO12w0p3BSPCduZ1bnfAsqRiO2ilLGQCEEd1rvWL+k+7cQNguMWAO53Ps/RPG6k5Ac4g50zN05lai5ikUGa28bgdb8dxjDEWwxTJQFESSZpzum22OqfUe2eJz7X3jWJSauYEEG4N9iE1zyb1T0bEsTl4xdNi1yJVwdqWnDXhayb9FtwMcZ8yPmjiGNNowEYi2QfANqsfLhpFdlnMu9Ny2U8kjmPMx7k2kZfYaxRVMYJUKuuwiwhhRJSZvjJXbOiRZ9jk8UoWG7YqQeAoWNVOHEcv4LQdUT9ahhQpKBAyAN7U2HAGjKFwwCTPGRGMW8YBjojbcdzP410a83xISsyirVcwWJPZOUCfApJu99s+gRExjgNxO0Efuhhxu309vv715dt/wpf/Lb7+1y/f/opfvj5ujzv+DL5It5fb1//+9uN8/3u+ZeaJeUKiEHGYPD9zOk2elZGAME2NxjbKyW5aWyFwAUpNB2vux62EAXTKt+c/CdwqsG929szMGw43Rg0XgBIQE4roOr90S+yUChyFxIgYYyCGFeZlxa4qSCBM/mzG0mRjzETTB865dkFWBFZqqOEyPSOCfQpnVu+V3hc5OwhS/11HPViM++3ELm0QR8wp6KxTOGJO5cwYY+kyn9RAjHA4HSgAuCBzUgWPG2aKEwIc3XOJXCbGQfKouC47TBcO0Fccy2ct0OgyG5txBb6a3F/P12DAQODLnkmAYwyQ4HTvOoa7mRh5LzcjFWSUARq+6AW4AEvCPGeYDagF3bPy+ngH0CAu+z+jFH1FrVMBG4QWCcJ05tYUVnKqDEDKSZi6Z91khamkhk4YCeRgRtvxDg9t5SD+YQX/NoRwR3P8LvvnvberHPKjfvRvKwRVv6zabRO0KBDpJIAs3vNxsn3xK7jCWk1UNNrQa4Vj+QKspwidlKA0UKQkzTSgJEUFgkjmTKQEm3xKuvFWvZeB/VBmDmTn8xJMzAwNJM7zROWCCOWomrBAFkCniOMnAsCoIlEFy5KecKl5QiQC4CiDe0qT7mqFrpEGhFnl1L1s9j/cgieoZj7odXGNY2HBpNX6MTMZwwbC5cbT+eHAGOUDoLJmXX2PpS+wzAj8x9f+r+v0+l98k+SISFvXikCIo4Il5Ar8+3AFMWJU+McJ5LYhnZ+NGFwtlgGC6UY81fMrOzHzcbRaAlYJgVGWP50ODmgCzMxB2xMotxFWdwFTFFiLsBKJKj8HEYMMFA/aZlgw4ZC5+/d1GKWRiLWRs9VM4CQe1Ov7+6+vb398f//96/vf7rfznjnKyrf59dEAkkfpZEKhBRwJvmAbNoyqHKq7Wa07FHhDUp5A032GsvqlXaQrquDQhaV2IzB1JYJWfKt4SLSeYkZqaUmapEydgXArlNQMpRSZ5+kGKh3O8A06XuJKckutl8zv06dHX+Wizxkh6CLvczrgKfS+Ba0lMVQcO1u0vl/ZT/RbbPWF5RqV7LEh2r64yaQ22NIe6Z0NG91Htf5c/20zFNbhbAtgDdIAaQdi6bxQmbwlP71GHuKKCH64tMFs1l97JLhme1vxlUT8MOYPt12n0mh6KHbqoGLqDYBcY3PidEWal1r3Ci7s/prYmpNTa0suwVvXT8f24fMP39lm7/rmh62xD/taxx7ukhxtVzQZLjrakm56v5HM7oPX5hBWKWpnY+plsxp7LtgwLlHyRwBMa2u7eYy467jPcYsYE5Hsc6qbNDFZ8Mq8huHwyOPxYCH+nZP1dkBEZEWdRcTt/u3L13/hn/5zfP3P/PJXfvkyj/OGOzjOyRER849f//l//fv/+O/5yBgI5TzfH2+PAy9ceLruAuZGyB5HB2ON8KQk9/28uiQD2DJpuzyolGUvU0pSgIzRfLq1xwfoliMdo+elT2xOLZgcwTa6org4bT0Y/rJ7lbUVoElFNPfUJRy9qfbNuN6i652qCGFfawCrhsHvqFLGl/f7rI3dbyEd0ENEJcvVxOWuhWtMXcPOsgLKqmS6QSNVV5np1xZBRq6oYh/h/s/a/tfYhNmh8A+bS4a4kfv41R4+UIveawmHOdkM/VdhorIcbHtKY7hJkDZ9eElIuQBVWLs9fVvHT5mxGnN/Zx0WqOx4RoQ2gtdjZkOwepbJIlfBioZm4VT7Ac4ciULhBNVNHaxc1A27K/LZyNvN+neNRx9dvbq+Bgp/UYhqVBlis3Jeb5harFS5UbcLmFOhiVsiExxWTqHIxl8ZVKNMA1Qp0iAjOwhnv4ml0QBvngTJh3ByHP5ZaiQ4NKQAI24dHczElmpu4ntJwkxl8gRmurtet5OLBeHNzGL6CMBUQ8mioqkWBmjWbQmpgLcyieLfJUBEjKmV2bEvKEk5uxgcZArKOiQCFTdoeVIzBmQKVwYSC1Jrp5ZERBuK04vqTE4JgpYjt11LoAudhid1gxVb4hX/c7DLN7KyifWf3hih63wqo2McLSt9RgYgcUCIlUrrHZWkGCBObvvKiCpoajoOdxWaU2KEmZ1mbXL3FS9P2iY3Uema4nKpSL8JmoL2z4qx1jj3FXEs05Z+rgLJxAwFNB2eKgvJ7x0BnhRcxlpYsACSEXXAWAMPvIfe3t9+f3379bcfv3/59v3l/u1+3G84opfDY6g93AGKPuauWS0XpkvZxJlqblpxRUnrbnkGlfMsnLQq3ljd6jf+uYpE2gGYCOkogFlpVSfelk7vw4ZoAw4lJ+3HzMSQSXfVSZgZZHLQ0QFqVbNOkaXqLHUTpxTBGE63qdhpXBnkLE2ljOg3XexqdXiEuZ/LzYYrtJRYNNSMBqM54AeQPGoK7eBdMKe1ZS5ztoKO2y7bMOjXxPqbHdwJI6PWui4DRftP2lxYetiaJp3CdZ8+Z8i6hWYPL6oYzs/S2uxRQGBk5gWH2M48ksW0uplNat107XqnWRosub5Wb+Gsy/j4eVka7TQ+/eQC25Q3uz7f+13AJSOlOo8LPVUHW/GA7ENdbzFxnf0sQ8EK5SqnxrYNo9t16tmccslruQFBKaSQRm9TkpRP9Crot6kSdt+S7vzKTKW08w61INptsz4fS6O7iGlWKsCvNh30X2vnNokKZZYEABQHxjHiJY6XGC9zvLXc9bTvjZyyNKhUNBhdAzCg4Bim/AcmY1TjW/GI+/327f71b8cv/zZ++dfx7W/Hl5dzvN/ziDiUcTviJV4H9fYDv+X/p/MP6d2ZEnFKYB7TkU0XPzZXkYw7bZ3jqGm5t6DTIDXnLaUkqydky99lhlYE9mAsOgFLwvDumNRVDgM1UkBoWxYGgioaPOoobi59SDLdWFiGJn507fY9Va4mBsmV9lzCZmxWiXH/kMsvDR9SQyYml6KpOVFBQKZRmt57fXAQAzEwwjrVGyZGCigELEDMmmq/qAzItQ1aneLV5y0j0hopBnotzAKZ6FCcGVK9n7wM3XcYz1cDzz9uYekkq5tnbWCbWjnLCgnZYKHrDLV0WzAQR6SU0AhD1ivAu06f3SJiJYG8ghYtpzWqTRbJ04U2nlFXs6HtCNTC2/10CuW4vFBXmovpJ1QQlQqVmSJg2LJB9ZS4JKM9nOtkAVwN+R9gp8jPH1bNaOnAqAa0qtPBRCzWowYgSkFTJtYXJjQAIaLrBlrfoZWmKo1VxSR2LcqamdGRFqJoOml2Iah4nRQnUFybROOWmAiNEerzuWyIMboZZ+Dc5idTD+U5Mdc4bdBDVd9jnBZUTJNl8SqRow4rtqmt8sfK+k8qwhyPFwamHgCtxmHzMZFa9qKHEC4qWb7784JSWA2y2AK16KpL4VuGe9G1tQNz/7XdZFm66VIfW7GUH3sF/UrTlWLNzILGy07SFWKxKrA5BAQ5wIg4nN7Pvgcafpc6VUjODrJ2bYndv8zMPCVS84hr83ckzNSNZUQVu3y638h18O/C75WuTFLRzImpiPA2TLLJW1uZHLYGQZrKsMrUGHOt0HXQk5oyth2cdCI5wBTDfoDzHRkS8VC+ab6+P/54fXz/8Xh9e7y/3x7nYFPRlYvWDheSNvgaA+25DpfZ71bUpgu2wE8bhf1+JviUnassPFwfeGnEYUM17C/lkw26K51pd3l9vB5tJwFwtUZ1Loe0YmuZmgLZtV3dS7aoZEtP6EliuSIre3yJIGY1Z5lS50DiI0mLtrlqJHdHjLY3Q6uyiTXZZBy9b9dsl1hrmc64ZBWbdbX+XFi7ZQQwsMzozTJYUYl17Sr9Og77SVUxspXwXsN4NrL93xVfX99f0nLttTGwfM3n+6yfrF9lZoyniMDnwe/394T+9AWX0a+Ni31/7no751K4vJrnKos1wjVdNeCuM7Im2Ue7Xmd/FoVsrPN+wz0jsRlmFq1jTe+6m+uysBRlv+Y5r7rbz/OmKsO7ZLgyCTtd/AYK//Qu5YWern/F0BgRhziIwRGy9zKlrGrDabWQK+sFZqamyBgumdWck5gpytH/GAQiOMbtuP9yf/lTvPzy8sufX37588vX+8nH7RQDM8HInL/9y99yPu7E/fdf/9vb6z9D8+V+n++VwjKiCOSq8/OHklbfqCiX5rpcMrmWqSZ5B55l3sYYnYcZ/gmZ11F4iZlzESVsamtHkGQ5L3rctpxndaULanYSoK72TiVpiKnJBJh7gGDfAh827zWky2ttbbZ/vp3yn69dbsc4nLO+siyS2M1ebVhfzs9QU2Nb1wFQFAB3DhEcrNifakcdi6dTgIoMZUn49RZLdax9sf4pmk/5J2+NYJVUFW9oBSdVIdEIDgIsS48z6dKI4WK8itq0+qpBfViIpT3WSD4vE58kh03tmitwnxWFNz1L+edHmOhzrCdhmcuBjOilTZBCmkwylvta7M8Sm894G4QDYrAxjU3doIMj/mL1SyYAN0DZ59/ulIVU6spmmtJ+8YXkeoXtzqr94MqZsF02y0W1iFKo7WFfJ1u8nAOpm2TjcQBj/Dl4QJrgYMhkqQrZn3OjgdRMCRziAEcWp1L0/7LNlDL94QLLnsmQNJ4mwa2xG6RKt3w4arsFB9QcCiOQYIwDYzDuIWQV1WglWkLvlZUojpUWowQqXtjLmHaoew95/rt8yJF02gtjbSkHuIH6RJ3t8U3sq/bnK7TzQYKrVD1WMSzbonHRKAzfqyZJAiIOqPl7+r4AmphlGJvg/6tQDrmM2j7L23hStpOTyFPzITE1o42ktW/LdsIIRjKExBm0WBTOX3DQwf9zmyc7IOWQe13KycvCeNni8bI9aVLZWRPqsM25EvetyLzRCggFJhMDVCFAbSZOIEm3wXxLvT7OH6+v33+8vb19eTzOMyMW0Sxa5UkgoiQwIhYAupsv+vaMGtquntgRSpfMesv/rMt7aSs15qfzCUAbH+VGbgbT0jk9n/V5uD/iPGcTFxpmWFBdTzaZOo8MQIzZtMT2N6pNaKmfxnazoa5LfkqHYFyRon6RinKpqkKXQWA+73XwALgiK1JT5QiLBqEQXyfJceuIkcov8RLlfDoe1vxsRQi60mUAY6PhpxAFd92j/tycnA/W4TLzxhgCNFMzdU7lLAb9n1kP2exG6w67nX09d7OV/e8Xn0jf9rINLhF9Mlz2kQOI5wZh23eezq815mNTSusnkopm47LLYKk8URj9FJ9eykGrq2i1/tehKnx+9Oepu75TDjD2Wbp+JVjnVJL+I8BgfX90kLjpqiLKuajI4rY3mdumnpmVB3ADuwrxtBhLGqOgRxGLFYnowmiJU6Y9iEoSOn3MNHisU0dKpGRigH6FLMHKFDHcjTEziRSQ8506gEhOIG63l5cvv4yv375++/Lyy/3b19sk74+vHJqEjnw7fyC+SF+hO1Jzznygkx5dZKPWN5jQ6DObgFZ0e3nZbdYBPhPbkeTWLrwOUrPTRSTGrIoyLJEGKmB+7cFlxap+nqREjkvMUAaxQ/6qiGpp/Mo2eGidDSoLqR3RWKuPWk1vvOt0fpIlXhsNxZZURYJ+T7KVh4/4qM3MriVAMDREd5mNi4nJKdMY6IQAJGqWOYl6BwFi5T0YHBTGCt1Yb1dxrwiV2XAFFe251dgEcCGcfX+rDrEMINi/d4/RYbelXjc7RLw784pQDLK4bQAA0zwzLgdOZ0siQptw1HzVgTPNz9hr3qLWl/V5neqo100GCftRFqOJCp2XGDWzyFEJZVZETWk+h24D1RForCRInb4bVOqzniq5N0J6rE2wvrbL0AcvsSRUKJb3WeGwJ8esS5a9SBLdeQIsM5TtADDbTpRUXbMETFVofncDbP4aWq/mwFrbr71T94QdcyimERUEKHP2AwcAw9HcdUhMxFCBYwJBw2QRyTGBPN9r1evtPcVGIAClgVyBnMmITO8ZTOFwK9sOBmSg01gMxBgHxi3i7qVOzHB9tO84RnVv4TQIlAFzZ3mPr6POdvAeQ7oEb0K0gWsfTQCrXVfpsiUh6p54Q0BqfhCbddPLDaiM0AVD9D9NLGwmKluFsipo0KBbfjCASKfDaWcHYrB8BqNgUSRZy2ImGeqz1eo/XfztgIWXpYw/m6fud3hVfvQZ/8xxhLbjBQizHBo4c62CegDTBhzHpBRjFd9kpj1C2xKe6kGio+kAQsv671h1H0IOZDFW/q53YgCY1Ns8397ev//x4/cv33/7fv/bn29f5xg47JN+3OksM5+rB8QYw9b6GMOVatdb989XEOVKc6k0O5RNfzV7Oa8GXmq/9oNttMyg5ytbO13mYytNQ3EK9yOpmhmxULNZ+gSlwUMQWq83SMma5ENIFa2ZTQFk8rla17MYevl0Tq8/1GYvNHZFkeufP+CGayMIgGgauIq/WuA+3H//8w6e4QZlIY8tznDNKnYsr/qfNh/gg6kKVIZwxf6xMGnXpeu6IGRoYSI6kn19axvYLk7X03tN9sNlaYM17HX/4zg+DAVlr3/0bT5P5udrH5U1w9T1xJ9vnOcg4gqx+Wm4pOLph9cdPo3tPxpzhV0aPbju78e6/HefPQ+4mt9tk692UNfg9QyIeprftplXtcC60do9lYNW5DytTT/MVX2tApFakr/PgCr+kSQ5QfdT9G/zzETiDvF2f/n27dvtz9/iPr688OXFFvPIcT8DeeAhxOvXeeJ8f+R803z/9R+P7z9+vUclEpESJ1Vslt2uCoEu2fKYyrZWGZj6GLXBs/VsuJ2n7SBJTUzmh5378/VFgx5CmEr7z3ZC+vBx78snQ6uGvQagAU4pTOjh/FUHNa5VWCu+1hrt9X14o/2Hu5z2WXnplg6fBYCcqMJNNRzI8AsI0cWIPqOnEExF4Qr6KnVEcJTNFmJCbNKKAgW5rgD8tCxP1w5Z3LOCJe1boURKpI5R57jKJ0yAKOpP1VKsGgAADq0vIbcKaC259KFja20QPmmqbZKfpt23Nt/KB83s8WeubMD1+VEglt5mmXZ3oECar7lNfxafTIXzCaZD/MbqdYnYNRrbIbnYFNawrlMEz6tBXntqfeJfBXrnAXJuZYRiTcqajvJ3N0PV3m1lvgq6V/HpMvvsGISqj83C4kvqYsTyLAhoJMWcj2QIGDqEI3UiAxwjvsh85DyBZIbiYARGQEEOVWhYHSz81ItRTy+VWyyeyOTArHfMVPWSG+bPsv3ivm6j2jMaJUkAkzGhqZxmYwuALlWo5pWmmTHlfBfFlm8IFPUkGgRco9UKjtR/+69xfeyxa5aTWUuI5uXaDBfS+Zn8nAWD3Q1Uc3KPwBo0e9Gj7IrSMl1xI0k5zT7hlCsAJDGqzD/3tFrDJxOFqWyXyaJoH6E0gaNQDldc0PP6Zkm458573NqBqnBAgqwgl05lJb4dq1CM6dpU3pI5qw+D9XyQvEVEHKj2eB2i6DlrgO9ekvXxDwNuv2iP7PH29kPff7///vu3+x9/vf9yHqExnrCnT5K6tBhNWCEypSOGhMBI8NzKdv3lOR9rRzvGTyRMKFanXbKyLvVbG5QATGtSlsrV7/7JqEJ/sk6mRnZd36LnHFrrbvZqO47GcoVNqBKUCWDVgmshzT6ZLPWQrfVV3d/JkrygRKZEt/5Hsbx3/wQUo8uyM7ROgK3dWDX8iuXoQT3CdWZrMxAd4d5P6/oaF7C5Z2+bRjRgct0n1BtbWLkCklmdHNSJWlUZmKNre56kr2VtsA3TBZFaI+8Tsd+ol2yNzRbgT7+MberWGy1D9qPMAOv7++dN0/lk/q5f95crW4gt07IPY42qpHf7sGj7PgrUx2Fwe+Q1gbbFt/sb/k4SoORGh4XCvSankHsrcvL04NH2fWbuzr8t/vEUBkqnDnzzCA9nEUjYkePS1f5Vt9Aqvd2qJdCAzNpD1wh3aMpWn1LLVaOlawAMs0estTiO43a73V+O28t4ueM2TvA0a9iDL3PEyZfJ+/n+wN8ex3gAr/n4cb6/aU6pkYh+2x4JFcRA4/lVFUhNTSZUMBGUNG6HtMj8ytUF4UKwqCJQBShw6gJsXJJ2na297zrWnr353bkWHfVYpYcrJ78Jlo+JjxVBT1L3LLTqAJI1WzT17aZerojSWXdOkuNa6pFlP/c51ZaAg2yZbinn57qitqry5xpMkFgUz2X0S3YhCJNpiOspNAlesnuWtJaz2tljJv7nvEC39Wq85r8hmt0sbrPQli5CqIAoDoHGfNYxgjOllIw2Lb5XFdCdrOBrLzMAM9ms4Np63DpV2fXNNlIrMtWojrUf1zczM1beGDoqJZyFp7ckSp29mg5pILslcAJgNkI5FtATHXXQSviptbY13ZYHXBefXX9AlyxVwkE5UPlUo3cBBnCAgzHG1FmTxcoetKeLpZSRmIlkjsARdwAVpZYLdqLjLaqgpINxCXlj1x4YLpOyv/TIx3Rfp+OEDnXbAR4MUknkwTGrD0vcNSYkDOSUcIqSTkwtIJOuYGhaUIAqUmHAZE02jmn/xjPnEomCL4Ma5CHcwRvyPiMwb+QgBd6ICc6wwOVdSOhdAznfWm95y4ILFgWfIOPZkGLbUtiN/H0l6436r25as7ZbfyrvW1zrhh1TQcF54v2HlreIuPKVDGhIzmsYOGhcaTiP4NZkW0bePUpv0jRrTQuuUMAFFlwVs+xUCkW/EzSbWhYvjVN4QHQo1vCehbIo974ggHAdHFMahCKgmSoOOEnE4XwOdIKRWf18ZjqNOYQhaIyb3bNgucFNo2Y9kJqS0hSt0gytac2AMkFMVlrKUfdHnn/Mt39/f/3L29uffzy+vc1fXrLa37RqLHUo2dAz6VomV7bU5rNnQ0OcXRmVdpXkGEKVLinPagsFmTMhoMy5nH1JqVPpZkUjuaw3t4sZVE6wCy58rbBNAppzHoeTkO4aMZ1DzkzMkxKY1YlEkUjETavSxdqraRY/iLgkpIqQojDQGTysXSOYCeUJDpWhXF34GmZaRBWoUn46eh69C/X8LJdFLssJF9t9YXxDw1XM3exTl+eg7oW3vPUyozr49mw3r7/WHzoakmngpZGSE6pgFZA5PbEFH6Wp8QBWiDF6B63NvOw8VThAxDOmy5PQBmWdMiu03PKm/UxZQrj7Cbt9k/nebuTYTZ89LAcATFSJ54R7T2+Xmo9/2aNqC3uH/l+vsHmkzzeKKDt4E6r+4/Y9z0wg59yam22aGLIkr1x3YYUzjtt256eFVkeFyVHxTTJxIvmToc4EizF2jXHNs4diekcK1QycZGM4+4aOVB/gaV3ieB9DEQfJ4KGYitP1RBLyRMVhVgClfEUB4fdNnQ6jpXLw0EDEoYNx3CIOIPKcv3y93+7jfjPr9aEZ55FnErevuGn88uMl8h46H29v39+mxj/+/b9J74X7NwW0dsJcXEhCG52jzAfnENX794jh4vPl2LiZnXY5/zjXDdNQve06+D4I4ZKBwFMV+wb6MtKmjFdqTtPbUuHIlrlTcoID1fgU5OUurhvCAIYBstpIS8I0poCranaBflvGuMiLr21Y1oazFtQm7PYXJa24I5dnuzi8TYpyFZVBXNFBSKo6iqAbLnbB5vO28aDav1sqPD55RCv8sW8Kks0pb/xaxAA6vmNmD4rk4t+DT70xIhMOjWEUW6jKwrzw62sAAa4I8RrD9u7+65M82Ii3siyzxAo2oQK5JOXPddT021BaGjVlLtjOg9Hk3jMw40Qgxog5ACkDQCB1uGre26C6V8mdBdtMZBcfAOg8jlh4garmhRCJOuADMwCYhyM6KAEQGMiYRPIlFqLATKZuy1itIvppEYzCZOPMDIDUoKlUqqsHOZDUtAkSiQV2ao05JYhDCuGIYX5sNDydIDXnGaFhLisMEjocAdM5hSEcM8/3QIwx8seJBzQxu+RXKKhDFlqp6Grt80MqFrWV5SDmdHGwN1ZI9zG/Zv4Sehm6DwxVL5ApPYR5XqRHc4xXjN+gVwkqsntTAiWGmxk7njDbgSvDotOLQlvgXPhRXK5Xiabb3lrpZaHdKtWTgqEdE2QVtdNJNAfCTQ1bZmW63DbGCBP845AiNBi34FGHOkM8SOZ0/UJRszf1hYefnCcwZI7yMo/TKBtHn2XQoScrjDB0DdqUVLoyDsLNqAcxBrpSsFwFVqodWWQyVSVdOamcaIiiz5QGZkopgtO6fZgP78zEAIM4mDhD8+TtNhAc1WeME5BSyHEHUnM+kKeK4npCbv05D05JIUIxEwkF3/T4x+P3fI38fh8/fvnTr1//VSO+3XmQmqlHzpnHYBxHREHTgAkmc+acBO7jOHUiTFsfhttM4oSS55nJAs+MCvNrOtsD8zdUt+UJ5S3GPN/Px0OaHEdENfdpy3KMICI0nYKJVDGhkyWhVo63GHmeNaP5TiKYmecgph7pRjwRVBVsAZKm+6hpuhHBjIgbjzGG8EjDnCTN5GF9HzQ/idGcwJxzBAF1bd7p1WdwNcqp7fFsoRa/B5BtdWpcdqqCKeV85CPv9xeBbJBuIyel8wRAFEERmqg5nVeiGesPAEprdG5Ywz5hgWalsGaUpHIFJMMbVzoiM0nN4rxLEKhueaDbIPAAYJLJboqMMQZL/ZPhVEblP46j+gepgYJWNc1QhDkfM+cNg7xRcFTGsGKyTa2y77suqi8E5eYwPedtwV4ZIT+aHBEuxXmKhftuq+jWzv/6fB3DnrHMVIakEUMPzfMiFQ2FWN1D0tE6Ti0bbl7xDvTxaMtFQNtbF4Vr+6pXto3JRGrO0MFSp+WeoTsASNGlJp7zMyKmJpHHoHSc52lP8zbuwGCyBk6IOUXCqrhKDBvNoMGYSuV55ukqZGIQDNygSYyJVM55vmaeAZ4SdICHUR45Ti6QSZnIghRldwHDfRW7Z1icTA4KDw7wPd4jdLzcj/EldHyNr2NqQCMidIMGKcTjdoyvifvtl69f/9OvIB76y1/0do55fHmd+fuv/+/j/fXrMQZub99nzOP28qJ4M4tpWs3YwKaDQnYFIVVfCERkYnXs9DKqpWk5sXNOY3CrMTxU7AF+7bT9+1TIkYtZmJRbFtiAQZAjMFBRRS0sovMOmQ8f5BNK7/0ijh5lBi5bhlRqzgyj60n/vgNJIZ0ONJNEl9CE60kmSJje/swJxeAY4/DG8T0PxkS1VcDqMe0uIsFxc8PqrKBR6fORmfNs/Lc1yGDYcdUKOS8Fm8UFLxCtfNImScV5K8ojUQmp+8D4554Fb+ep5Tu4zQZJYhwzwh0GVYdapBsthyqoUXoGIvmuyWZmzzzznGOMcQxWmsKoGk9rdHFCqHe6pGqsHN5x1iTITCJijJwO2IGKKN4cQJVbCB6iW4X41Q1OtdW/3tVANqS8xeHqFbdSdZASpUdMt2Law9lGDcA0HhQOsa/pVHo6AnJyxLjzDvEuIFSfjA7NOxthl6S1V20eo2Mqf2aj0+e/NEYA6B7L5V+1v00JHKzlsSusNi38M+P4p1SkIlVzaa9VgrtEZ8oAhoxz4A50mqwTVQlAByCch8YBTenQcaROKhGFK2pLoMZzCWBJpzWMo4blKK4YfBLT85pMDeaReuG8Y/yiHBqjA5MJDmDSPWw5yBN4iNYbVXGxn2Rc6/F8XYqISCyOAVc9WA0iItyPLqsBvXdOh4+2s01XrE5OHS5+920kezAAhfJXkEEO4gYd4Li8e0UWw6rA4am6dBfLx0jNPFWgpnCAsk+bLRQaXBSW0oqPsQLozosU3bmDxUKYD46hmaiQbEaiACVIg+ZhLh3FwnlpnQ+mEmK1oEExHU8xSMzUGMKINMOP+dftYNCHjHo5txRHDTGJNFxKBqyKeT4yk8rXH7c/fv/rr3/6L1++/p/jmC8HSbds56g+QQVmSdpIrfnIKRRFT1NFAQXY0sw8rQ9lvqPy0deKJJsnEyQZqdMhTNKRv0jmIBGHRaLanLR0eus6979iorqYhSTNCMQwJlOaqUJAWYgpzYafXMjX/cpqfNhCZt3rLHE9N2h2Z8lqa0LSaSMyIpiU23s32HcvHSnL74qTXdeSRg9jzvk4z7aMUQZozACjOAS8DL4n6/D2F1e1WZAaynO9KbYg04d3/6gCnvhqso0A1jI4jysJuMXNxyfSHUWu+oGCXJWRF6ShXbmPZ701nyOCPRUncKhZ7f0HNtXs0h77W7A+HNGsBctsWCXaKpvY2OjlgTw9+jPCez0U117u4OKWuNgqYcjUvDoPqvDun27oRUSdYo1l/TiqxOchGZZHW4e8soA9NpLk4aJ8AVctwHrNvsjh1NSHdSnT/8PIZd3HvS+dh3fEmBPQHKAGcwxR06FKEgjFYGRE5gimjuMmddlOxf5h+3itZu1H9/DIyRzilLJiiYqQCQ14C04MaAQSqYgZx+AtI7/y5W+P+XjX/P7+9uPx/qfv32c+cr7NeTLPYDADD8bLEGdvPJeOAGowcmfRex4UigVdrliywbSqQrlriqojXQGPrtBuOXj9h8sl9oJBTjvY3M8yEKPa8OHC7upJQFapMQAnULPr4a7FfS5Sl48M2C1Xj9Ej4ZKXpxFu3MtPO9GcgCCOIML5ZCMCBqtyfLqUgpZtTJ0AqAPoAkKX5Frh2w11mHLrRbNkz3buvq0YomkV0Fs0l96qAS/NyWb652UMkES4hZO77sD4VXrgyerD1gYeAWhRrEsO9ZKVxey9V+qxXLa0kHw0wtz9sIICG3f8EYckduA/cyohZYHeJyUT6cjg0qNP3TbrN8xQTYRVdtRRHxJnFWxXras0XQtbdp19jjJlevHrUyVNT16kOConwUZtbYhAu6AUotwE0+AAAI7VCscNa9fXSxz3JbRZbfyCUMmspNuiGuu7oloExZyYgoR5ZpMRoxVcYoqGHIjKZFGYX5YBFBhsZUxbv2BiHBwHkAMzx2DelMoiaHRNELHREH3Yrz5xNGttFpKyYO/lfQUylAMa0E15Uw6kFEEEwjAQpslZawFJDkQg0kUr4d2blY8HtNTQtrHt63UGOaC4iHJJagSG2Z/rhmZCgcDRS9HdHasIN+qUu3TK9dDRhiClXFvxJ5dcb8Qs3AkAFAuXQqriYwBE8eCe57TCWTNqdZDVA9VyRbJ6HAtwxstJCrWvq9MZgyDckh4hYKaZ4ipeoWWvQjOl6WJ7GQsIG41FDGfVZnr7BGdiIlNDaGQNk0TMh6peOjiCkFLkLHh992zSz4wqqOp4TGA286EH9OP777/9/Zdf/v6Xb//49vLLeYwxOGIsLHjNTLVbtbfXbL9SEshyJffHZZY3CGDmlEH17Wt9Xs50RNEKrsrIQskY49KTK3jDIg2srjf1z3VGSVKe9p0k2IL2OWuPKIuCCRHBOVBOpl2CaQcq8+QYVRCSK4H/bB322b9sqDrZ84laUdkdjm24PNNurmXaa4PEK4bYUAufE4Y+VYK+mS6q7ZrLuaqpXGWicEH+m6XnwxVLPJ6vioT9jORRmnWKWR7KeCkoBK98YDnzxjcuObxsuAiU/TOlvdDjyfSJOAzMc/JhyaTv7yioNeR+lveMGchn3pguKbkMhadnPb3+bv3rowOwXm1/r97I9plzfcf/FJGtGPPDD9cNP3y4P45l0z05G09PRx3DnGdug/fjYqMzlhzglAON5OC4yqI8+OOpVjzohg+kai+U+eCBbRAULF1aWrQ/j4g4xjiOOQ5xTBGKRIBOWmcM93uNpmlmWRVJVoarmPm4tcaz/KAbp34QVKA4D8mQjincebtLX/lyxvs3fTv1L++PR57n48erzrf5+vv7H/9TOI/bGCE6YFNtWf2IEmCnpyLCDnYhH+10qyAEtXaNU7+kru1VAOb77A2D60HVZ6OdDa9WLWgJ2JIAZc5KH/gO1g8+0geQbqKIKQMlfOLjCp5sKK9nCfRwUQ5A2zzbd5mKpbGr/gcs6nIzHD5ZaBxhGysziWpbuxaLZX7HmqZdCmuJvc4jgKLBSECZPpGX5mE7AOqqvoudykJr/bADDheynzR7WOsfdkGanMDgsvFziYWPIUtA+YYkR4WG7YFc+mc/UFCBG20ftXij7JP9jfDpxEGrqOtvWco/MxekF2at8eONoaKzvIZVRR0Vs8wzVCuhEt9kRgUXDLZZklAGfSECFzarDlYByGXtIbC2CkmMQmyQQzbT6PTNgE4kr8Y8bU6RVUzEQo+RbrXNq7mYdw4ZOeuEYhUA5Jw1AxKRc06dOTtStfZQK9kopaO0/ZdwkaKhVEGHVVEuVngaqTHG0BjQDWPGuOk80X2trw1kacBPrvKpUFg3GwFhymQ3CZeIAzqIO3QDDmgA48wExBgUwJsHOivFP4VDisEDnAi6DcBWRV7zu7b6EruO9MEdr42TIsFjcATHDbxezMtrDLBygo5yd80+ndn1Qxey2ctam4HVoEm930dXGRn7Um1xl0hJgmLpYCXdsCAXLRiQs2J+VxQW9Z2CRnpjjvW5n+6lHrInnUzDggqtfxWBzTlZWZBmmyUq29ClM4U/EPponMqZaB1hOYdgx6J2Ybp9kL2M5OrWlVJVoEIizcGVCkRqmsKPkvvtJlNupiCHiyclKQPn48frj99//PGPH6//OOff5vyqWGGCFkRD0KUMhlMxGBFFGK8QPcA96jOz4iEpH12+ZVYSNpHVyQWZhLqDBB3TBZ4MriWJP7V+WupmCYEy85SSkZzQfDwe77fjAEw91BDM7T5tx0y3fMYqbjNIrhMXY4wxbruRsZRvmMW1j7ql9IGtx0GbgwBWeeWH75+Wuig/wSUoY4xzXklh7OZpFtLf6tEH1qVbysggOjgL07z1K/jb3DqYrptb7X0wqvotjsyzkxh9Jwy3Kcm9F1jUJu0Pr/d9PqRL/renXOtSLlNqYW/UFja3IsV9nD8VkvXEa2bKiI/Mc00Im7dE23VxOu5T9Nz5dReqD0NaA3ZaMDZTwP+6iok/jbl6j/QZuASpwylP75t61m/risVys01FxCFNdqWNnm51fVP77G3O0pqo65tdG6Orl+oUbO2TJEZw3MZxn8cbdZekHMhDCMZkipyZ4+TJ+chiC4Ck1TBuk+qEcLj0OS/v2uOxt2+Nq65dOY5jnjiC9yO+4PYtfzlTj7d4fJ3zL+8x384ff//1/Y/Ud1IRCZ2Ee5hetDbg6i0T5kIAVrVLuQyrCsL6oahOqjgALIo6NGdhRb7Xfxe+39e1oTqAskIhbsidmeY3GxW9bs2NjFHxLc2ZJlgjQ5eUftwyLF9lzXOPxG7AFQsoLTqTxfATklEcaHyLDya2qJOku9m0jZqRzBkIZ4Q8Ex8Lo9GW2Gepft4pZe7vAollz0kTXei5bH0UMn3t1l2q12Xr31i4yr6PcAwRBjZqMidAs0bWuUgIusVVN79rA+300Nv8x4oaALA+tew0BNG3WLnoeU60e9nRS6DdhqqpLoiBABxaEUojjggQKkAlWBsVKLtfJjXSzGbNv9CRVYPbODJbv/4lL39mg1ih3NJ+k1BQoDhAKgrk1+bgiEI/ycENOmpb1ULE2pkV+4EaXJTtQwNCmRikfR0IyUxDhjgzz3N2Ey4bxJdf7EIZwP/U3QkhJHj1nQkT/3MARWTFHKAOjgMCNJKD48h5dsPPXm7nHmiY1AdfFxXS0XKZIkXGyOny76Ec1A06oAO6QXfiUD4USB1QgkdxU1HAASXyBt4UAzHMOrVK5YF6+2gLiTAmrwE0UgK35QAENQbHiOPGODpdEwAiOwuZMwOBbh9to6qUyLVF/4Mrav+WVNjjDJqrvqx/M/9YLznHFZlSRUCzkP2kj8acs3iLuXKYVgl5JdjEAAs1p3OYd8kOhg1WpXK1PLNDN9ee6TgctAFyAhkRyrPBZ8M/TUYVKhCdut3xYTrCnMBFnkOpqdGJiSLjJ8CMALjAk3UWNrwk5P6OhWGDiDlPu6+ab+f7Hz9+/P3Hj7+/v/7LeR8zeIyxggkAV9bMLkWIwYEgb8z59sHQWpYQ4Kbbxnl1PpzX1+BgYZoFTkYd7YgOoNhInIZ1yeksMpppeQDAnDCHiAQXGSvBRIbiOkdrw0atPNdCWW4ilImZrmFtaV12lVJzMsbXG/qQyFnURgDiiCXae8RrHd5L3XswY3XUe76mhbkj3BERMUiec88QdAAEZiNhEW5jEOyuzx2O6dbTppYwYdmainXQeVRdge9UWm1ik5evo8slMftgeAW6iHnlgtixrrXN10KsP9S2yY4wtfE65+WlDANMKoZ9cZLYpHZ25WrN93ysekmqPrn87lEvtgqB1IHST57htnBPy/T5QeuKITWe2w7U/r6u7NbqBPc8LZ+v55fauwL9zAe+HINrhBE3xgWaUvls4QHMOd3SRJh2vYufdtEtAc29zDIRtzfeh7dmoxICzIg4NQkpaClNEYw4bsfLt4xAHMhT88S4x5zS1DzzfCDOPGM+zuRp+JxpK7OGPmoC9n39E29ElqIUXfBzMEBOhUYk748TebudX74+3skzA4/z/X+e7//4/fzxeJyZrwM3YlSsJhid9QpioMJyPlBcw7N8QdKFfJ6yE1e1RuVBo8/30dZugVGanzE6zL8qVfyGaehClnJeFY2pK+tSxqUVm0/5iZzI6fO8EtSWhGXUNzJu1gITC6PN1fauTxb/QNI5QVxVMZZSNENGfTMCVVjjqnCk9S3DkiYX2Xm3jFjoryWxnkc60XeZD23aeogVUrkM6930LPqBXfMUC5lP5Mv0RzTQB6ioa/1PEUgOBHgMRhwcjYce83xcnRv9oD5Z/DAtLL1fqOObenbj68U7xl2HZnAuEohCsDKeOnFN79Cysxaws2JYTKW/f0S0nU7je5q+3JxM0Y5RQTNhVC2mAbPuEySH/wXbzSh/B+U+Fvn4s18rITpsjKowHWYaIoeCZpFaYd2cmQhxig4kFoo0O1UuCZ12wKagZVD0EkgXSAh0KRJFt/6uEkTNCQkcogaB1Fw6FACiavP0QdHnpXf6GhDNzBETOO6RJ4TUwXHkZJ23+HiVMOv666XUvIQGWZMIdYsAIE1LVoF/6ACGMnDcICWPEKDJYv80FniKN/JQho0WAMhUI4w6r/uTUy2ZvktZBCMQgTF43Hi7axyATWTKK52VDEshY0rVVC5sAtJv1sdt1k5gsSDGdrwFRMaQQAxgtA9Q/oAZXPqoO/om+5nqcg6HgrpWRCbAZevhRecnkqvNpTnko7IK1rmQFApbKAHq6vVTMXNQjrwzlTo7ThPN1rIEVcgThR4HmQv7FNQjRQwhh3t8QEOZAOGzdEJdl0kl3Qk1hUTOienkXSjmmeXuL96Gkqc0PU+ElO+P99/fX//5+vrr28vXwRijSPh7wJXlz1nYQJczQirwCeLaEshQRsRCuxLsrjedtZOAKK6jmjJUh5JlMHmZOvINoKJHfSJcqyzADSGQmTN1glWYxSDFcbDC/9VtBLjiTISPZTnbeErVI+aSz37MHI92SMrsWePpA94B6c7RPxt2u8m4R9z3jb+0yfZbRsTCgGJblPaK2/opB3Y7HyWg4rKQJM7cCm118bu3FvpoVsam4eqTotYdMkjXaG4O4bSJ/SEorg0Ms99ZDtjo6cu+v31XFfcX98M7Yqy5XdOYmYn65noXx4wLYantoc9pDWczWKCyyC0ytwbM1lf7Ou7f2d9uXzt+COssNpVNAPQ857uQrGnpfXGlFM5zfvp5BQ2JY78buc74p6dEtaU7PH+SsiccbXBzCzwDJAa3ffFh8NtRuM+2h57JkaAYioHjNrygvDGn8tR4xDlTJ3PO452PxwOQqIeacBZwCXzEggBZVy/8ynr2vrmWgRXGbBP3oHDo0OMWOV/e7/fHy+N8/DjnP//65//64/v/mG/f/zj/MTXBGIqq8RWZBeO2JxdRbsCaIRu3yWDzaHU5WIMznI1botInir2FTSDkMP0SAEk0jq2+ZVqGpz21jvDtQ2/V6eCXzunjbDdmliN6Rf2ejZ3n7aBtkT2ry+mKJodzAfEw+nKlbmQ8uKqy208CIykIc84UYwiFkLUH0k0qUNb/ZzNp00u9yttVpwNQrQw6Ad1n0HIDLrLgrvXShVQpwyDaPKn49mm2EJ8WtwMy84qR92bDqbD8Ph5t4roPtTXw9UnRfRoRU3UIY5192NXOdRJVvmF87kokAThWJqUWtBdVSkYEi815WVG54p2piIyIDDIODiTzAsAlFalMzqaQreI3G/+IMG++5zIQZBwyaVc1NnNsucyO8mU3/VNgjYKtXEKg9ly0nC+HyGUGLhgIJcCMEQWnq5oJbz1EEuTEtOfcCd9gd/RK31qUCocriakMBCs6zKCTQ+k4Zrqe6dAIjINjMgbHdPlWQWrao51T6EB7a5XSDJecJBUrcEkkq8mKji6+Cfq0zSYJz2g0YBD34BBGikp2mwi346t51k8jS40ZUGTYBxyDI3AcOA7dboyjrcwIwQSMmIgxCYIngMyTmlCa6pML9gHPqgtMl3R3UEFsqYjKO1xl5tEBtuhMVu1fVWCfAFd7S5LmngMaLCeRimu5UaibbqOc0tFVjLAfKdIPKiigoKruIly2LVQHOmvk0uM5XYHqD7PyBB52RSKHrpBAnfrDAUtbx1JENXKN8ilan7D4XZSzK/xqn5RTZChQJbGY0BgDIQ43hns7H7+9/vif3//4lx8v3waP+zhux7HbvwAi3M6cYPWNcjyvKAsWVKAVLvIx07ORDBYe0UquOJeeZM1En12y23EoSjMVzudokaW0djpjBVxAQDkfQFKiJiU4/ggyzfgGKiOiM6SVkvS0SBWKNl+FC52WhlHijDMeV2eDogZJZGbz9K+KhWyp06rxw3aartNr+6QkwxwM9Y7uPiQ19KhO08t8dItWrLKfkmFvsApvu1Zg29kl/JUbq5ZAUAUM8WTY0WtKYH8JM6J5nQz+Mo/Ek9tjLrkCaXpCWScrhS4jqdxQm8U1IQZ1GHEe5QOQPGJkJsdHN6MD/Vcwr/7QEKP14c8ua/SDFRN7Mr77z3m9/NM0XkW9/eFmInNe0uJfA8Uud731Bdlag782ReWCABThxIcv7IO5xNL7sXt3kKV70BiDi2xwBDnGdO3wDuWf1qjL4OB1EsVnRDgrBHO5amAyqnLQQhXHOPSFZJ6DcXDc4lG8wHGeOqc0MV8z7+f7AzEi3kie729ylwlrjCwqIGo00NhydKmF/QIqX5yCkEGOyDtGJl7imCN/ucX7y5/ez7+c89/+9O3/+POf//39x/fHY575RgYeIMOKkxEwoWIvjV1VNhQcAISo2tAOO21hC3PL4NIRYmpCzOsONYHm8VKlriVV/Vi4zK+OHYcyofAR2CmAJYE5czKhCZ/4sEnWzyoTa/ighLovQVlcm5S1aw1UuKRyuWMM21HAQv+DCMVKzan5/m0nwmdjx8evt+5XXJgOXhGWbS9mp0f8yHUbd5mwBM7N7XfjG6EUVW94Gsl7cDhVYWPAgp2ZtjK8UCxD3wp+2NzIhhEQIqvmKlOBIVaSxcUbCBIDPtVq+yw3uiqwYLSPQTnPGmbZurteInkqkRmffPvP1640jjXlhr3X6WcNKokYcZSL6yPjMXLOpiKQCAZzcByHC7vZcU/NGdMA5OJWd9PU0nQBECOoEYpgHMkQQzgqsUB21I1deoawCi0ggf8/V8C1VjnZZHrrhbs/Awf6pFcdgeWPzOmcW1ktUoUXIyoKK4IoHjqGiXR0FcypBKVuXvnSgCKVQIyIyUfGqRgwoVJQPqa7SA6sQ5kfI0z1hct+XPo9RXYfGrUBb10i/4P7Qg/nBm2ToyoIBnCDAopzKooYTCu5u58qJAtExUybeWWKgwOM0HEwjhxHjJtcMWVXSYxp8J+QEUPOINPsRToJCEkHOZaOLo8ndhqpzuP0nW39KxijzGJimUSoFg61Vc7zRM1prC7T+xZCpeaiE25AnVWNsimUCAPMtmTgou+ua+QGG3Cy4Hx/YzTmxavhSWtwuZ/POkI9sBhgW/R51R4jyWrdzWantTnG1oqVsDcjeE5pFq5sHdscwHQKnsnisVBLX56pIf3x9vrb6/e///H976+//Nvt+OVLfhkaEVw0pQCA2qcEESPnNBEgcijsEjQuDhjsjdqSbs91zimqKo+c92ZR662tuhuR7c7Zht7nEHIvPxPHRqFppRnFtJFm20Mq8xx0VOYJgxRCty5d2LyMijLIQVCtU9GR0sf7uQG41+k03Xiu8febmNUftOG8fe5+sPkK1pgmIX8CM5DsUP3yyOoavMK9+8Utkfi/+NzD//CdVphaZ76WPuorIpSX16fWh8w0XHXlSfqheyhxe9iWFstP+HU9R9ZRbnwFZT+/oIexm/aLr1CSV2etwqqyULPYk2R36tVHZ0b7kNao5gZ5WnODFUHvp1zzX7Ry+7YSOl/B59nZ5QfY+dPWh0+egKSB7V/7xfcAZ4uTD+Y0XXZHK8aq5t+/PJbdxPUHfBgtywHg2sJdR4HMlKX6OOrDMQKc5zvOBwDLjDKlmY8/8jyP422M8XBEjZHzwZwGw6zVrNnQYSGmgBQlpjS7O/U1MxDg4uZDBMYtbi8jdZuPyffHberbmX/9/vqf//Tt//zjy28Rvyf+jnkGruJRqVtWrvq0FEpfAKg6KK44pRYK9VJrnixVr/dONmdxolXQV5pW7I0gL2NaihvZH6J8uSdRed4LGMUmZ99JmVlIOA+4YHVovKgXND/cB8AoE3mTRiWAEbdZjHgtDwZDR8w5s/BkXTOBKnuo4dnvYcH/a8SCUhGBrUJmV9pr+7TcVW2M5+QWN6yzpL5G9D61HR9h4EArCAOr1pypEtKOWZS9TmOCZBpuVrlplonGqjpkUc+fRJj/L+eGuqxy+WsOV9YHaLBiv1X6uGtQb49/5c8B0BVXaOXUCoeyn3xpVqD13oGLikhAZvttbO5a30SSdK4eLHkxJypHTAKDGDeMbrY6E4HJPMg06awdr1TAhMKKAwpmgCPiOMgADsbd9pwrVGTIaipiEEGd6XnOjK4/nSZCMbPBnAQg3sZwMMaRDYpu+uRQ+MAoSclW56ISs9RItQYaw6trUschG9CUI6aTYBzOcF3rVJlTCCpEVZiGWbfb/ZGndwnHgTHvLy/z/cSY9lYGTFOo1CpBa4cJxvtYlt3f1AAtLCMQeGKTIOl9Nkoq7fiSGGAMtiOX4JmRQmIgzjkr9tcaygZubqwkXLF5Oseg4om9HXF/SQ5yJMYYx8BQZsDWrzJOEKl3ISOOavoky0UuljoXNU8OFokSXBuOqvsYEiMGMbI8hEARz4+ZQDBGAFHSMy21BwDWWxAA45b1HDPmztZodUAaZq5zovjLRWlgaCaScTUSUjUpjBhlXjionJl5HAfytBBj7aQmMDFhs7I5hiOUisPd4jCOAWAmI+IwYM6oyDGIEe4CN1DMB47rdpGxzpx+WYpN+iEhT404UifIGOOcKel2u6VO54flrNd8fXv77fH+++8/fn/5+pfX1+/3I+7Hl4ceRMzzHGPIUYPUiEEygzkjEXO+5+Nkzmjza8Q4MweKw0dTc063jlraeT9gUjmi4iI21FpLLsXNaqnIwmKVNZApzSA53Xoy0SxvBemeGGBEzMfpDSblzFkuFjHzHEvAVVxpNl/qXUZRQ1mBZuZ5vgM4jiegRcSYc8757lyt3yuCOuXudN7IdNSqj6WKIMn5IgA4xs0Ss3yA3nhc+B+Sx3EoOefsWC+mmVcBsslNr7yDSHBCgpmorHDGGGuo53lKil4goFLFbS8WymaMQSJTOWcH6sxrPlFI3lJKmdkdlcLTtYrhCkLs17QxUvVZXlEE0Mw/rQw7R2dHy3kAD3TW5iqdyZS1S9YLBMkxbmMU+t+RHrL6ydj2sJ9MUg3e0MLRVkTwye5/sniApTwlsVh3vDKrVKwVdab9jgbryuEAay1wM7UBFLG3mjhmrhMai4mutxHJBB6Pd1yGzhHhBHuF1xZvgiCMoG45XfgOjBg4EPQMz/kYYyhzAmMYl83wnQTCTRi4GEJ6wBqlOmMF1263G+HdMUEe97vmcR9HauI855ysWqApTD1u83w/319H3KwT3jXNXetrjKEYa/4jQsDtdsOGByv0V+acFr8qERnAzLeIOHRL4ss4lI+v9zNxPHB8nd/+/P6/vz9eX7//+PHHaz7m+fZ7OOqv5ExG8AiTr2GUPaeHDByPKk2o9a4ztfFr53lqzgXmz8bS9CZNgxRASnzkNLnweT4y86ymnGFD0Ony+k0mo2BRa07gkoMLzmprhwavFIlkVJ8lSXDjS5KH4TsugquLharn0sNRiJ0kmecMkscAkBPTHeyBONxuLmC1R597GQPV2YFc2blscqLrr9JiFjKa9NJFVya5DGJuVfvGwteXD0flvfxRtlpmzjQgOC6bB6y0L0DFMoZHlTcjwu0WAGTOdC+wIEew53Qa7oIm/2Vo5hGHF7YSL1EbuDJ7jYv1Ds7UEZR0dkeU4W5IBEY41mhTHSjmtwh7khWc3wTQhUYjIuYjSQZwnudTuEhb3DlXkUH/eGpqgjwIjWFiCqQN6UEdhxiMcOtWF7TEUdhs8YxkOi7o1BmEERrBODAOjcE4pIEYMW4AQLg9TCATh9WMgqw4LLcWsf46oirG1ZvfWULzzSxvFSuR1K4nXYvVooZsjGRCg2GXxdVKIqootOv8q7QdXoI1osSCe3YvTCEwAjEijnSBVfA4Dtj1z/Ltlqf7+QptZjie3r8cwTJ03J9vQqO8VquBCIqpoMEjIrydUzxTs7kUf3ZV/UYogwhnEuy1OIQTI4LjYATDhMtHxGFzueQonaWlUqEpnVQYiTL4VL+xv5QuGIxPzYr9V4uHzvQbJpFoQ2oX5S3M2diePlO3xiYOOpecKIR03YJrlXQl8lt2upu6yraLtV+WcrT7nyUPxcZQwQ4W/Gx/WWaO7uFiIFZ5JOE0LtfISdHZXwgpUMxU5WLhPnIhdOvclhCfeqyuWnJ4xkCCDNLBmUw85vn+9uO333//59evf/x4e72P4/F4HHGzibbMxEzNMcLYPmVmzpyZSq3E+E9k1X81ovKUpKwZv9pFN607167cA6628CjTGPk4zJlyBc+UukyxOo88RbCytmkCcDvbzV7ppAMam4QleD+/TuWYk7wQ2EXpoTnnPFNj6+QF4EID1/2xYuH/0aUrYv2k0D994X9xjxUAuyJbOxBBTyHJLQq1/bmkqLNVmYsH2FDkU5pICRNzpk4T3cYu4f3bZe7XOl7fyUxVK5WtSjWz0MLrJxuq+8kEX0UCsXEfoWXVX48m428xLiOj7MW51xXXQn1WyGtRPizH+vzp91uUdI0Htu6Q1TXo+fu7+sKn1d/na/3x87+SnP0gkpXZEFnoR0+HTU+TAs0xRoEPkw7/jzHGGK6LkJ7lrNCO6oW49NvnGQNAFVRsaWEAyINDx+3mjpiZCR/CAvU4H7c8X8/jeIwRFOaJ84zExBvwqMm8ZjgslmbozszZVw0pK43b379iuoM4iNvgS+Z5w7evt4k/Pea/TeV8f7y+/ni8//Gaqbc31k0gKfxn/82vZQR5tzjxCAsCtIxouRWZOVm2+aoyqGUEO6TImdWo4VTOOWdRWQRIHjd/G0ABSAoQuMXLG6AQFVFUCGePh89rJomofk+jbIqmmlN931/VKpxzVgebqHP7jqo0PzPlvqs0l6IlMxIr0bfNBjuj4aaRgJSx8nEF9rDWuiqXPkidHQY2QK0ViCTNnExpAnMqhcxIk8mM6z7cb6U6dqvgJPuUj1jlGfQOF8Soo9lAyFZBKNrQi0QDWPkKTwA7iZqt1dXv6wLapJQfz4L14olPM2C9vWULl/oFujxIT6YIr81cSOG5ltNTajUaB3lAHJNEDLGaOwRSrihyBg4IjJzAooMfAakqR8NcYJEcMFWOY+qahqq6foECWPEtlOoiwNo3u2Hs6calhQoDCRb1WWuxOqpz2wCW+DL7tHAAFYJkIBCkuz+pg3AAlsnCD5ZOTXdhzogRx8AcmgfHQ5P3+5DCiX6Pq5bo2Rrmk0H77AmwDm/D1bRdQJZaUpk5KDw63dQ7DbNLKYVTOcEDdh1r0FUeWubyQnx4QkX7A4wghiMPh+KoMsU4zOWK6fZ+yAR4Ywr5nlmHLZZQopCdC8yLdVJu86l6jysCt87U3rWtC+zJP08myQbwFbpatAtmv7Ifk1KoG+l5a1fFslQJtXpoOKdVDf72cVqeVj4u/GEKqRGHB6vtNSWxw0afdZnI7jcJwHXYrBxHyrgqQGJCSQwgq3fBsk6S2gyj7QqnH1VuN069v719//7HP3/85Y+3tx/vx/E+X17yXioqapXSUS9rtMypfJyZczJzbQy2LrNEXSe238KhKZ8kVyOpMosd1uwGXHA1xrL/VGWrCbmsx4GcJDJOTQnIg1HMo0BByHhNOFpk6qABGnO1rDRt0te6gw5qlDBkZuaJgm91uTtQRzUyclyyV+qmIwagua37GXHpXkOADAUyPLIwbeHdQrI6hwC4BJcdSHqaZ/Xp59cNIdNMUE4id184iRVfJNw1sO9tQTlnW12qmnjPgDCfHYBZnS7Q8ILd6pVURoMtlVhfyDkdbYsIuuCsU8DXnrKhr/akn63w4fN4Ob59Z5q2N6c6Wbq7H8sBIElUJAh42p4fTPDll7IHXN802gNdoKlr5DR/hZbKas+Yi/69kJySDe6Lf7Cf9WlNtZQQpCc3gGS1T6p+vR7PJIdStsOHC8erF4HhCdkUq75zbNknzwaBCPeS7G8ugVuRkW29rKUFAKGgiMOcf+yUK8dgHhgITaYAN1p/iduR580l7zEz5yPfH5gn5VYep7Nlnt1lQWZmtFP3fD0J8yzoqY85HMQ9eI58R37R7XXeX25/+foyv/3ptz/96b//9vX/fv/xz/nj3Vh9FEK84bliTiMPSxwrss6JVoA259wzxZ9Egxing9zJIlHITMiNXm04G8p0OsjiVY4MDmYuOGghyiWauEZtEqBYUJM/sU9ULoz6rFuVFMiiIa4Oj3yORPhbc85lpLLd+65y9h6PPgkb9I4OmVIQQu2QV/paxUcni0YTlNDLetVrqTI8cDYSXcF1FR9Y+7QsAqiukAY+pRPnattJy7TA56saBQF18gZdhhixUDPYTHlDvtoPgnxgKIQqppGdXMklc7OztQAQsbbxo8vk1py7c8+CCF7r2KuJ9o+WElhq8+NPpP8fSok9T5QenHQAAAAASUVORK5CYII=", "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 3: Encode image\n", "\n", "## STEP 3.1: Read an image\n", "img_path = os.path.join(os.getcwd(), \"..\", \"assets\", \"dog.jpeg\")\n", "image = Image.open(img_path).convert(\"RGB\")\n", "image" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 3, 224, 224])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 3.2: Transform an image\n", "# The model is pre-trained using 224x224 resolution. Therefore, we resize the input PIL image while maintaining an aspect ratio,\n", "# such that shorter dimension is 224. We then crop 224x224 image from the center. After that, we convert the resized PIL image into a tensor.\n", "# The values in tensor range between 0 and 255. We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\n", "\n", "img_transforms = Compose([Resize(size=224), CenterCrop(size=224), PILToTensor()])\n", "\n", "# Transform the image and normalize it between 0 and 1\n", "input_img_tensor = img_transforms(image)\n", "input_img_tensor = input_img_tensor.to(torch.float).div(255.0)\n", "\n", "# add dummy batch dimension\n", "input_img_tensor = input_img_tensor[None, ...]\n", "input_img_tensor.shape" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 512])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 3.3 Encode an image\n", "with torch.no_grad():\n", " image_embeddings = model.image_encoder(input_img_tensor)[\"logits\"]\n", "# the shape of image_embeddings is [batch_size, hidden_dim]\n", "image_embeddings.shape" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 3])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 4: Compute similarity score\n", "\n", "# Compute a dot product between image and text embeddings\n", "# [batch_size, hidden_dim] x [hidden_dim, num_classes] --> [batch_size, num_classes]\n", "similarity_score = image_embeddings @ text_embeddings\n", "similarity_score.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted class for sample 0 is dog (p=0.37)\n" ] } ], "source": [ "## STEP 5: Clasify image\n", "\n", "predicted_class_prob, predicted_class_id = torch.max(similarity_score, dim=-1)\n", "n_samples = predicted_class_prob.shape[0]\n", "for batch_id in range(n_samples):\n", " print(\n", " f\"Predicted class for sample {batch_id} is {example_class_names[predicted_class_id[batch_id]]} (p={predicted_class_prob[batch_id]:.2f})\"\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "corenet", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: tutorials/guide_slurm_and_multi_node_training.md ================================================ # Guide: Slurm and multi-node training This guide assumes you have a prior understanding of how `corenet-train` works. If you are new to the CoreNet, please consider going through [this tutorial](./train_a_new_model_on_a_new_dataset_from_scratch.ipynb) first. CoreNet supports multi-node distributed training using DDP and FSDP. In the following command, we assume a multi-node-multi-gpu or multi-node-single-gpu cluster. ```bash # Assuming 4-node x 8-GPU Cluster: export CFG_FILE="path/to/config.yaml" # Please change this to your desired config file. export GPU_PER_NODE="8" # Please change this to the number of GPUs that are available on each node. export NUM_NODES="4" # Please change this to the number of nodes (i.e. hosts/machines) in your cluster. export NODE_RANK="0" # Please change this to a number in range [0, $NUM_NODES-1]. Each node must use a unique rank. export MAIN_IP_PORT="tcp://IP_OF_RANK0:PORT" # Please change "IP_OF_RANK0" to the host name with rank 0 (should be accessible from other nodes) and change "PORT" to a free port number. export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE)) export GPU_RANK=$((NODE_RANK * GPU_PER_NODE)) corenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl ``` > **_NOTE:_** As reflected in the above `WORLD_SIZE` and `GPU_RANK` calculations, the > `--ddp.rank` and `--ddp.world-size` arguments expect gpu indices, > rather than node indices. However, you should run `corenet-train` once per node. ### Running on a Slurm cluster Please customize the following template for slurm clusters. Also, **please note that we have not tested CoreNet on Slurm**. The following script assumes a 4-node x 8-GPU cluster. ```bash #!/bin/bash #SBATCH --job-name=your-job-name #SBATCH --nodes=4 # Please change this to the number of nodes (i.e. hosts/machines) in your cluster. #SBATCH --ntasks-per-node=1 # No need to change this line, even for multi-gpu nodes. #SBATCH --gpus-per-node=gpu:8 # Please change this to the number of GPUs that are available on each node. export CFG_FILE="path/to/config.yaml" # Please change this to your desired config file. export GPU_PER_NODE="$SLURM_GPUS_PER_NODE" export NUM_NODES="$SLURM_NNODES" export NODE_RANK="$SLURM_PROCID" # Inspired by https://discuss.pytorch.org/t/distributed-training-on-slurm-cluster/150417/7 export MAIN_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4)) export MAIN_IP="$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)" export MAIN_IP_PORT="tcp://$MAIN_IP:$MAIN_PORT" export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE)) export GPU_RANK=$((NODE_RANK * GPU_PER_NODE)) corenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl ``` ================================================ FILE: tutorials/object_detection.ipynb ================================================ { "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Object Detection Demo\n", "\n", "This example shows the usage of Mask R-CNN with MobileViT as an image encoder. The model is pre-trained on the COCO dataset for the task of object detection. \n", "\n", "Typical process for object detection involves:\n", "\n", "1. ***Choose a Pre-trained Model:*** Select a pre-trained detection model. In this example, it is Mask R-CNN with MobileViT.\n", "2. ***Preprocess Input Image:*** Preprocess the input image to match the requirements of the pre-trained model. This typically involves resizing, normalization, and any other preprocessing steps required by the specific model.\n", "3. ***Generate detection output:*** Perform a forward pass of the input image through the pre-trained model to obtain the detection output. The model will output a detection results for each object present in the input image." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 1: Pre-trained model\n", "Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\n", " from distutils.version import StrictVersion as _StrictVersion\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "2024-04-15 20:52:44 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt\n", "2024-04-15 20:52:44 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'conv_1.block.conv.weight', 'conv_1.block.norm.weight', 'conv_1.block.norm.bias', 'layer_1.0.block.exp_1x1.block.conv.weight', 'layer_1.0.block.exp_1x1.block.norm.weight', 'layer_1.0.block.exp_1x1.block.norm.bias', 'layer_1.0.block.conv_3x3.block.conv.weight', 'layer_1.0.block.conv_3x3.block.norm.weight', 'layer_1.0.block.conv_3x3.block.norm.bias', 'layer_1.0.block.red_1x1.block.conv.weight', 'layer_1.0.block.red_1x1.block.norm.weight', 'layer_1.0.block.red_1x1.block.norm.bias', 'layer_2.0.block.exp_1x1.block.conv.weight', 'layer_2.0.block.exp_1x1.block.norm.weight', 'layer_2.0.block.exp_1x1.block.norm.bias', 'layer_2.0.block.conv_3x3.block.conv.weight', 'layer_2.0.block.conv_3x3.block.norm.weight', 'layer_2.0.block.conv_3x3.block.norm.bias', 'layer_2.0.block.red_1x1.block.conv.weight', 'layer_2.0.block.red_1x1.block.norm.weight', 'layer_2.0.block.red_1x1.block.norm.bias', 'layer_2.1.block.exp_1x1.block.conv.weight', 'layer_2.1.block.exp_1x1.block.norm.weight', 'layer_2.1.block.exp_1x1.block.norm.bias', 'layer_2.1.block.conv_3x3.block.conv.weight', 'layer_2.1.block.conv_3x3.block.norm.weight', 'layer_2.1.block.conv_3x3.block.norm.bias', 'layer_2.1.block.red_1x1.block.conv.weight', 'layer_2.1.block.red_1x1.block.norm.weight', 'layer_2.1.block.red_1x1.block.norm.bias', 'layer_2.2.block.exp_1x1.block.conv.weight', 'layer_2.2.block.exp_1x1.block.norm.weight', 'layer_2.2.block.exp_1x1.block.norm.bias', 'layer_2.2.block.conv_3x3.block.conv.weight', 'layer_2.2.block.conv_3x3.block.norm.weight', 'layer_2.2.block.conv_3x3.block.norm.bias', 'layer_2.2.block.red_1x1.block.conv.weight', 'layer_2.2.block.red_1x1.block.norm.weight', 'layer_2.2.block.red_1x1.block.norm.bias', 'layer_3.0.block.exp_1x1.block.conv.weight', 'layer_3.0.block.exp_1x1.block.norm.weight', 'layer_3.0.block.exp_1x1.block.norm.bias', 'layer_3.0.block.conv_3x3.block.conv.weight', 'layer_3.0.block.conv_3x3.block.norm.weight', 'layer_3.0.block.conv_3x3.block.norm.bias', 'layer_3.0.block.red_1x1.block.conv.weight', 'layer_3.0.block.red_1x1.block.norm.weight', 'layer_3.0.block.red_1x1.block.norm.bias', 'layer_3.1.local_rep.conv_3x3.block.conv.weight', 'layer_3.1.local_rep.conv_3x3.block.norm.weight', 'layer_3.1.local_rep.conv_3x3.block.norm.bias', 'layer_3.1.local_rep.conv_1x1.block.conv.weight', 'layer_3.1.global_rep.0.pre_norm_mha.0.weight', 'layer_3.1.global_rep.0.pre_norm_mha.0.bias', 'layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_3.1.global_rep.1.pre_norm_mha.0.weight', 'layer_3.1.global_rep.1.pre_norm_mha.0.bias', 'layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_3.1.global_rep.2.weight', 'layer_3.1.global_rep.2.bias', 'layer_3.1.conv_proj.block.conv.weight', 'layer_3.1.conv_proj.block.norm.weight', 'layer_3.1.conv_proj.block.norm.bias', 'layer_3.1.fusion.block.conv.weight', 'layer_3.1.fusion.block.norm.weight', 'layer_3.1.fusion.block.norm.bias', 'layer_4.0.block.exp_1x1.block.conv.weight', 'layer_4.0.block.exp_1x1.block.norm.weight', 'layer_4.0.block.exp_1x1.block.norm.bias', 'layer_4.0.block.conv_3x3.block.conv.weight', 'layer_4.0.block.conv_3x3.block.norm.weight', 'layer_4.0.block.conv_3x3.block.norm.bias', 'layer_4.0.block.red_1x1.block.conv.weight', 'layer_4.0.block.red_1x1.block.norm.weight', 'layer_4.0.block.red_1x1.block.norm.bias', 'layer_4.1.local_rep.conv_3x3.block.conv.weight', 'layer_4.1.local_rep.conv_3x3.block.norm.weight', 'layer_4.1.local_rep.conv_3x3.block.norm.bias', 'layer_4.1.local_rep.conv_1x1.block.conv.weight', 'layer_4.1.global_rep.0.pre_norm_mha.0.weight', 'layer_4.1.global_rep.0.pre_norm_mha.0.bias', 'layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.1.pre_norm_mha.0.weight', 'layer_4.1.global_rep.1.pre_norm_mha.0.bias', 'layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.2.pre_norm_mha.0.weight', 'layer_4.1.global_rep.2.pre_norm_mha.0.bias', 'layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.3.pre_norm_mha.0.weight', 'layer_4.1.global_rep.3.pre_norm_mha.0.bias', 'layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.4.weight', 'layer_4.1.global_rep.4.bias', 'layer_4.1.conv_proj.block.conv.weight', 'layer_4.1.conv_proj.block.norm.weight', 'layer_4.1.conv_proj.block.norm.bias', 'layer_4.1.fusion.block.conv.weight', 'layer_4.1.fusion.block.norm.weight', 'layer_4.1.fusion.block.norm.bias', 'layer_5.0.block.exp_1x1.block.conv.weight', 'layer_5.0.block.exp_1x1.block.norm.weight', 'layer_5.0.block.exp_1x1.block.norm.bias', 'layer_5.0.block.conv_3x3.block.conv.weight', 'layer_5.0.block.conv_3x3.block.norm.weight', 'layer_5.0.block.conv_3x3.block.norm.bias', 'layer_5.0.block.red_1x1.block.conv.weight', 'layer_5.0.block.red_1x1.block.norm.weight', 'layer_5.0.block.red_1x1.block.norm.bias', 'layer_5.1.local_rep.conv_3x3.block.conv.weight', 'layer_5.1.local_rep.conv_3x3.block.norm.weight', 'layer_5.1.local_rep.conv_3x3.block.norm.bias', 'layer_5.1.local_rep.conv_1x1.block.conv.weight', 'layer_5.1.global_rep.0.pre_norm_mha.0.weight', 'layer_5.1.global_rep.0.pre_norm_mha.0.bias', 'layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.1.pre_norm_mha.0.weight', 'layer_5.1.global_rep.1.pre_norm_mha.0.bias', 'layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.2.pre_norm_mha.0.weight', 'layer_5.1.global_rep.2.pre_norm_mha.0.bias', 'layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.3.weight', 'layer_5.1.global_rep.3.bias', 'layer_5.1.conv_proj.block.conv.weight', 'layer_5.1.conv_proj.block.norm.weight', 'layer_5.1.conv_proj.block.norm.bias', 'layer_5.1.fusion.block.conv.weight', 'layer_5.1.fusion.block.norm.weight', 'layer_5.1.fusion.block.norm.bias', 'conv_1x1_exp.block.conv.weight', 'conv_1x1_exp.block.norm.weight', 'conv_1x1_exp.block.norm.bias', 'classifier.fc.weight', 'classifier.fc.bias']\n", "2024-04-15 20:53:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt\n", "2024-04-15 20:53:01 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['model.backbone.encoder.neural_augmentor.brightness._low', 'model.backbone.encoder.neural_augmentor.brightness._high', 'model.backbone.encoder.neural_augmentor.contrast._low', 'model.backbone.encoder.neural_augmentor.contrast._high', 'model.backbone.encoder.neural_augmentor.noise._low', 'model.backbone.encoder.neural_augmentor.noise._high', 'model.backbone.encoder.conv_1.block.conv.weight', 'model.backbone.encoder.conv_1.block.norm.weight', 'model.backbone.encoder.conv_1.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_3.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_3.1.global_rep.2.weight', 'model.backbone.encoder.layer_3.1.global_rep.2.bias', 'model.backbone.encoder.layer_3.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_3.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_3.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_3.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_3.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_3.1.fusion.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_4.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.4.bias', 'model.backbone.encoder.layer_4.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_4.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_4.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_4.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_4.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_4.1.fusion.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_5.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.3.weight', 'model.backbone.encoder.layer_5.1.global_rep.3.bias', 'model.backbone.encoder.layer_5.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_5.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_5.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_5.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_5.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_5.1.fusion.block.norm.bias', 'model.backbone.backbone_proj_layers.4.block.conv.weight', 'model.backbone.backbone_proj_layers.4.block.norm.weight', 'model.backbone.backbone_proj_layers.4.block.norm.bias', 'model.backbone.backbone_proj_layers.8.block.conv.weight', 'model.backbone.backbone_proj_layers.8.block.norm.weight', 'model.backbone.backbone_proj_layers.8.block.norm.bias', 'model.backbone.backbone_proj_layers.16.block.conv.weight', 'model.backbone.backbone_proj_layers.16.block.norm.weight', 'model.backbone.backbone_proj_layers.16.block.norm.bias', 'model.backbone.backbone_proj_layers.32.block.conv.weight', 'model.backbone.backbone_proj_layers.32.block.norm.weight', 'model.backbone.backbone_proj_layers.32.block.norm.bias', 'model.backbone.fpn_proj_layers.4.block.conv.weight', 'model.backbone.fpn_proj_layers.4.block.norm.weight', 'model.backbone.fpn_proj_layers.4.block.norm.bias', 'model.backbone.fpn_proj_layers.8.block.conv.weight', 'model.backbone.fpn_proj_layers.8.block.norm.weight', 'model.backbone.fpn_proj_layers.8.block.norm.bias', 'model.backbone.fpn_proj_layers.16.block.conv.weight', 'model.backbone.fpn_proj_layers.16.block.norm.weight', 'model.backbone.fpn_proj_layers.16.block.norm.bias', 'model.backbone.fpn_proj_layers.32.block.conv.weight', 'model.backbone.fpn_proj_layers.32.block.norm.weight', 'model.backbone.fpn_proj_layers.32.block.norm.bias', 'model.backbone.extra_layers.64.block.conv.weight', 'model.backbone.extra_layers.64.block.norm.weight', 'model.backbone.extra_layers.64.block.norm.bias', 'model.rpn.head.conv.0.block.conv.weight', 'model.rpn.head.conv.1.weight', 'model.rpn.head.conv.1.bias', 'model.rpn.head.conv.3.block.conv.weight', 'model.rpn.head.conv.4.weight', 'model.rpn.head.conv.4.bias', 'model.rpn.head.cls_logits.block.conv.weight', 'model.rpn.head.cls_logits.block.conv.bias', 'model.rpn.head.bbox_pred.block.conv.weight', 'model.rpn.head.bbox_pred.block.conv.bias', 'model.roi_heads.box_head.0.block.conv.weight', 'model.roi_heads.box_head.1.weight', 'model.roi_heads.box_head.1.bias', 'model.roi_heads.box_head.3.block.conv.weight', 'model.roi_heads.box_head.4.weight', 'model.roi_heads.box_head.4.bias', 'model.roi_heads.box_head.6.block.conv.weight', 'model.roi_heads.box_head.7.weight', 'model.roi_heads.box_head.7.bias', 'model.roi_heads.box_head.9.block.conv.weight', 'model.roi_heads.box_head.10.weight', 'model.roi_heads.box_head.10.bias', 'model.roi_heads.box_head.13.weight', 'model.roi_heads.box_head.13.bias', 'model.roi_heads.box_predictor.cls_score.weight', 'model.roi_heads.box_predictor.cls_score.bias', 'model.roi_heads.box_predictor.bbox_pred.weight', 'model.roi_heads.box_predictor.bbox_pred.bias', 'model.roi_heads.mask_head.0.block.conv.weight', 'model.roi_heads.mask_head.1.weight', 'model.roi_heads.mask_head.1.bias', 'model.roi_heads.mask_head.3.block.conv.weight', 'model.roi_heads.mask_head.4.weight', 'model.roi_heads.mask_head.4.bias', 'model.roi_heads.mask_head.6.block.conv.weight', 'model.roi_heads.mask_head.7.weight', 'model.roi_heads.mask_head.7.bias', 'model.roi_heads.mask_head.9.block.conv.weight', 'model.roi_heads.mask_head.10.weight', 'model.roi_heads.mask_head.10.bias', 'model.roi_heads.mask_predictor.0.block.conv.weight', 'model.roi_heads.mask_predictor.1.weight', 'model.roi_heads.mask_predictor.1.bias', 'model.roi_heads.mask_predictor.3.block.conv.weight', 'model.roi_heads.mask_predictor.3.block.conv.bias']\n" ] }, { "data": { "text/plain": [ "MaskRCNNDetector(\n", " (model): MaskRCNN(\n", " (transform): GeneralizedRCNNTransform(\n", " Normalize(mean=[0.0, 0.0, 0.0], std=[1.0, 1.0, 1.0])\n", " Resize(min_size=(800,), max_size=1333, mode='bilinear')\n", " )\n", " (backbone): MaskRCNNEncoder(\n", " (encoder): MobileViT(\n", " (neural_augmentor): DistributionNeuralAugmentor(\n", " \tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\n", " (conv_1): Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " (layer_1): Sequential(\n", " (0): InvertedResidual(in_channels=16, out_channels=32, stride=1, exp=4, dilation=1, skip_conn=False)\n", " )\n", " (layer_2): Sequential(\n", " (0): InvertedResidual(in_channels=32, out_channels=64, stride=2, exp=4, dilation=1, skip_conn=False)\n", " (1): InvertedResidual(in_channels=64, out_channels=64, stride=1, exp=4, dilation=1, skip_conn=True)\n", " (2): InvertedResidual(in_channels=64, out_channels=64, stride=1, exp=4, dilation=1, skip_conn=True)\n", " )\n", " (layer_3): Sequential(\n", " (0): InvertedResidual(in_channels=64, out_channels=96, stride=2, exp=4, dilation=1, skip_conn=False)\n", " (1): MobileViTBlock(\n", " \t Local representations\n", " \t\t Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t\t Conv2d(96, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " \t Global representations with patch size of 2x2\n", " \t\t TransformerEncoder(embed_dim=144, ffn_dim=288, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=144, ffn_dim=288, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t LayerNorm((144,), eps=1e-06, elementwise_affine=True)\n", " \t\t Conv2d(144, 96, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t Feature fusion\n", " \t\t Conv2d(192, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " )\n", " )\n", " (layer_4): Sequential(\n", " (0): InvertedResidual(in_channels=96, out_channels=128, stride=2, exp=4, dilation=1, skip_conn=False)\n", " (1): MobileViTBlock(\n", " \t Local representations\n", " \t\t Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t\t Conv2d(128, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " \t Global representations with patch size of 2x2\n", " \t\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t LayerNorm((192,), eps=1e-06, elementwise_affine=True)\n", " \t\t Conv2d(192, 128, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t Feature fusion\n", " \t\t Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " )\n", " )\n", " (layer_5): Sequential(\n", " (0): InvertedResidual(in_channels=128, out_channels=160, stride=2, exp=4, dilation=1, skip_conn=False)\n", " (1): MobileViTBlock(\n", " \t Local representations\n", " \t\t Conv2d(160, 160, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t\t Conv2d(160, 240, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " \t Global representations with patch size of 2x2\n", " \t\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\n", " \t\t LayerNorm((240,), eps=1e-06, elementwise_affine=True)\n", " \t\t Conv2d(240, 160, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " \t Feature fusion\n", " \t\t Conv2d(320, 160, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\n", " )\n", " )\n", " (conv_1x1_exp): Identity\n", " (classifier): Identity\n", " )\n", " (backbone_proj_layers): ModuleDict(\n", " (4): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (8): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (16): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (32): Conv2d(160, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\n", " )\n", " (fpn_proj_layers): ModuleDict(\n", " (4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (8): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (16): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\n", " (32): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\n", " )\n", " (extra_layers): ModuleDict(\n", " (64): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d)\n", " )\n", " )\n", " (rpn): RegionProposalNetwork(\n", " (anchor_generator): AnchorGenerator()\n", " (head): RPNHead(\n", " (conv): Sequential(\n", " (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU()\n", " (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (5): ReLU()\n", " )\n", " (cls_logits): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))\n", " (bbox_pred): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1))\n", " )\n", " )\n", " (roi_heads): RoIHeads(\n", " (box_roi_pool): MultiScaleRoIAlign(featmap_names=['4', '8', '16', '32', '64'], output_size=(7, 7), sampling_ratio=2)\n", " (box_head): FastRCNNConvFCHead(\n", " (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU()\n", " (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (5): ReLU()\n", " (6): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (7): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (8): ReLU()\n", " (9): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (10): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (11): ReLU()\n", " (12): Flatten(start_dim=1, end_dim=-1)\n", " (13): LinearLayer(in_features=12544, out_features=1024, bias=True, channel_first=False)\n", " (14): ReLU(inplace=True)\n", " )\n", " (box_predictor): FastRCNNPredictor(\n", " (cls_score): LinearLayer(in_features=1024, out_features=81, bias=True, channel_first=False)\n", " (bbox_pred): LinearLayer(in_features=1024, out_features=324, bias=True, channel_first=False)\n", " )\n", " (mask_roi_pool): MultiScaleRoIAlign(featmap_names=['4', '8', '16', '32', '64'], output_size=(14, 14), sampling_ratio=2)\n", " (mask_head): MaskRCNNHeads(\n", " (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU()\n", " (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (5): ReLU()\n", " (6): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (7): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (8): ReLU()\n", " (9): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (10): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (11): ReLU()\n", " )\n", " (mask_predictor): MaskRCNNPredictor(\n", " (0): ConvTranspose2d(256, 256, kernel_size=(2, 2), stride=(2, 2), bias=False)\n", " (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU()\n", " (3): Conv2d(256, 81, kernel_size=(1, 1), stride=(1, 1))\n", " )\n", " )\n", " )\n", ")" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from corenet.options.opts import get_training_arguments\n", "from corenet.modeling import get_model\n", "from PIL import Image\n", "import torch\n", "from torchvision.transforms import Compose, Resize, PILToTensor\n", "from torchvision.transforms import ToPILImage\n", "import os\n", "from corenet.modeling.models.detection import DetectionPredTuple\n", "from torch.nn import functional as F\n", "import numpy as np\n", "from corenet.utils.visualization_utils import draw_bounding_boxes\n", "import sys\n", "\n", "\n", "# configuration file path\n", "config_file = os.path.join(\n", " os.getcwd(),\n", " \"..\",\n", " \"projects/range_augment/detection/maskrcnn_mobilevit.yaml\",\n", ")\n", "# pre-trained weights\n", "pretrained_weights = \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt\"\n", "\n", "opts = get_training_arguments(\n", " args=[\n", " \"--common.config-file\",\n", " config_file,\n", " \"--model.detection.pretrained\",\n", " pretrained_weights,\n", " ]\n", ")\n", "\n", "# build the model\n", "model = get_model(opts)\n", "# set the model in evaluation mode.\n", "model.eval()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 2: Read and pre-process input image" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Step 2.1: Read a PIL image and convert to RGB format.\n", "img_path = os.path.join(os.getcwd(), \"..\", \"assets\", \"dog.jpeg\")\n", "image = Image.open(img_path).convert(\"RGB\")\n", "\n", "# convert an image to numpy (for visualization purposes).\n", "image_np = np.asarray(Image.open(img_path).convert(\"RGB\"))\n", "\n", "image_width = image.width\n", "image_height = image.height\n", "\n", "image" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 3, 1024, 1024])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## STEP 2.2: Preprocess an input image\n", "# The model is fine-tuned on the detection task using 1024x1024 resolution. Therefore, we resize the input PIL image to 1024x1024 size.\n", "# After that, we convert the resized PIL image into a tensor. The values in tensor range between 0 and 255.\n", "# We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\n", "\n", "img_transforms = Compose([Resize(size=(1024, 1024)), PILToTensor()])\n", "\n", "input_tensor = img_transforms(image)\n", "input_tensor = input_tensor.to(torch.float).div(255.0)\n", "\n", "# add dummy batch dimension\n", "input_tensor = input_tensor[None, ...]\n", "input_tensor.shape" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 3: Generate detection output" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "with torch.no_grad():\n", " # Feed the input tensor to the model. The shape of the input tensor is [batch_size, 3, height, width]\n", " # The output of the model will be [batch_size, num_classes, height, width]\n", " prediction: DetectionPredTuple = model.predict(input_tensor)\n", "\n", "# convert tensors to numpy\n", "boxes = prediction.boxes.cpu().numpy()\n", "labels = prediction.labels.cpu().numpy()\n", "scores = prediction.scores.cpu().numpy()\n", "\n", "masks = prediction.masks\n", "\n", "if masks is not None and masks.shape[0] > 0:\n", " # Resize the masks and convert them to binary\n", " masks = F.interpolate(\n", " masks.unsqueeze(0),\n", " size=(image_height, image_width),\n", " mode=\"bilinear\",\n", " align_corners=True,\n", " ).squeeze(0)\n", " # convert to binary masks\n", " masks = masks > 0.5\n", " masks = masks.cpu().numpy()\n", "\n", "# clip bounding boxes\n", "boxes[..., 0::2] = np.clip(a_min=0, a_max=image_width, a=boxes[..., 0::2] * image_width)\n", "boxes[..., 1::2] = np.clip(\n", " a_min=0, a_max=image_height, a=boxes[..., 1::2] * image_height\n", ")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Install OpenCV for visualization" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n", "Requirement already satisfied: opencv-contrib-python==4.5.5.64 in /Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages (4.5.5.64)\n", "Requirement already satisfied: numpy>=1.21.2 in /Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages (from opencv-contrib-python==4.5.5.64) (1.26.4)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install opencv-contrib-python==4.5.5.64" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coco_class_names = [\n", " \"background\",\n", " \"person\",\n", " \"bicycle\",\n", " \"car\",\n", " \"motorcycle\",\n", " \"airplane\",\n", " \"bus\",\n", " \"train\",\n", " \"truck\",\n", " \"boat\",\n", " \"traffic light\",\n", " \"fire hydrant\",\n", " \"stop sign\",\n", " \"parking meter\",\n", " \"bench\",\n", " \"bird\",\n", " \"cat\",\n", " \"dog\",\n", " \"horse\",\n", " \"sheep\",\n", " \"cow\",\n", " \"elephant\",\n", " \"bear\",\n", " \"zebra\",\n", " \"giraffe\",\n", " \"backpack\",\n", " \"umbrella\",\n", " \"handbag\",\n", " \"tie\",\n", " \"suitcase\",\n", " \"frisbee\",\n", " \"skis\",\n", " \"snowboard\",\n", " \"sports ball\",\n", " \"kite\",\n", " \"baseball bat\",\n", " \"baseball glove\",\n", " \"skateboard\",\n", " \"surfboard\",\n", " \"tennis racket\",\n", " \"bottle\",\n", " \"wine glass\",\n", " \"cup\",\n", " \"fork\",\n", " \"knife\",\n", " \"spoon\",\n", " \"bowl\",\n", " \"banana\",\n", " \"apple\",\n", " \"sandwich\",\n", " \"orange\",\n", " \"broccoli\",\n", " \"carrot\",\n", " \"hot dog\",\n", " \"pizza\",\n", " \"donut\",\n", " \"cake\",\n", " \"chair\",\n", " \"couch\",\n", " \"potted plant\",\n", " \"bed\",\n", " \"dining table\",\n", " \"toilet\",\n", " \"tv\",\n", " \"laptop\",\n", " \"mouse\",\n", " \"remote\",\n", " \"keyboard\",\n", " \"cell phone\",\n", " \"microwave\",\n", " \"oven\",\n", " \"toaster\",\n", " \"sink\",\n", " \"refrigerator\",\n", " \"book\",\n", " \"clock\",\n", " \"vase\",\n", " \"scissors\",\n", " \"teddy bear\",\n", " \"hair drier\",\n", " \"toothbrush\",\n", "]\n", "\n", "# Filter predictions with low scores\n", "keep = np.argwhere(scores > 0.5)[0]\n", "valid_scores = scores[keep]\n", "valid_boxes = boxes[keep]\n", "valid_masks = masks[keep]\n", "valid_labels = labels[keep]\n", "\n", "\n", "overlayed_image = draw_bounding_boxes(\n", " image=image_np,\n", " boxes=valid_boxes,\n", " labels=valid_labels,\n", " scores=valid_scores,\n", " masks=valid_masks,\n", " object_names=coco_class_names,\n", " is_bgr_format=False,\n", ")\n", "\n", "overlayed_image_pil = Image.fromarray(overlayed_image)\n", "overlayed_image_pil" ] } ], "metadata": { "kernelspec": { "display_name": "corenet", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: tutorials/semantic_segmentation.ipynb ================================================ { "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Semantic Segmentation Demo\n", "\n", "This example shows the usage of Deeplabv3 with MobileNetv1 as an image encoder. The model is pre-trained on the PASCAL VOC dataset for the task of semantic segmentation. \n", "\n", "Typical process for semantic segmentation involves:\n", "\n", "1. ***Choose a Pre-trained Model:*** Select a pre-trained segmentation model. In this example, it is DeepLabv3 with MobileNetv1.\n", "2. ***Preprocess Input Image:*** Preprocess the input image to match the requirements of the pre-trained model. This typically involves resizing, normalization, and any other preprocessing steps required by the specific model.\n", "3. ***Generate segmentation mask:*** Perform a forward pass of the input image through the pre-trained model to obtain the segmentation output. The model will output a segmentation mask representing the predicted segmentation of objects in the input image." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 1: Pre-trained model\n", "Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-15 11:43:54 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt\n", "2024-04-15 11:43:54 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'conv_1.block.conv.weight', 'conv_1.block.norm.weight', 'conv_1.block.norm.bias', 'layer_1.0.dw_conv.block.conv.weight', 'layer_1.0.dw_conv.block.norm.weight', 'layer_1.0.dw_conv.block.norm.bias', 'layer_1.0.pw_conv.block.conv.weight', 'layer_1.0.pw_conv.block.norm.weight', 'layer_1.0.pw_conv.block.norm.bias', 'layer_2.0.dw_conv.block.conv.weight', 'layer_2.0.dw_conv.block.norm.weight', 'layer_2.0.dw_conv.block.norm.bias', 'layer_2.0.pw_conv.block.conv.weight', 'layer_2.0.pw_conv.block.norm.weight', 'layer_2.0.pw_conv.block.norm.bias', 'layer_2.1.dw_conv.block.conv.weight', 'layer_2.1.dw_conv.block.norm.weight', 'layer_2.1.dw_conv.block.norm.bias', 'layer_2.1.pw_conv.block.conv.weight', 'layer_2.1.pw_conv.block.norm.weight', 'layer_2.1.pw_conv.block.norm.bias', 'layer_3.0.dw_conv.block.conv.weight', 'layer_3.0.dw_conv.block.norm.weight', 'layer_3.0.dw_conv.block.norm.bias', 'layer_3.0.pw_conv.block.conv.weight', 'layer_3.0.pw_conv.block.norm.weight', 'layer_3.0.pw_conv.block.norm.bias', 'layer_3.1.dw_conv.block.conv.weight', 'layer_3.1.dw_conv.block.norm.weight', 'layer_3.1.dw_conv.block.norm.bias', 'layer_3.1.pw_conv.block.conv.weight', 'layer_3.1.pw_conv.block.norm.weight', 'layer_3.1.pw_conv.block.norm.bias', 'layer_4.0.dw_conv.block.conv.weight', 'layer_4.0.dw_conv.block.norm.weight', 'layer_4.0.dw_conv.block.norm.bias', 'layer_4.0.pw_conv.block.conv.weight', 'layer_4.0.pw_conv.block.norm.weight', 'layer_4.0.pw_conv.block.norm.bias', 'layer_4.1.dw_conv.block.conv.weight', 'layer_4.1.dw_conv.block.norm.weight', 'layer_4.1.dw_conv.block.norm.bias', 'layer_4.1.pw_conv.block.conv.weight', 'layer_4.1.pw_conv.block.norm.weight', 'layer_4.1.pw_conv.block.norm.bias', 'layer_4.2.dw_conv.block.conv.weight', 'layer_4.2.dw_conv.block.norm.weight', 'layer_4.2.dw_conv.block.norm.bias', 'layer_4.2.pw_conv.block.conv.weight', 'layer_4.2.pw_conv.block.norm.weight', 'layer_4.2.pw_conv.block.norm.bias', 'layer_4.3.dw_conv.block.conv.weight', 'layer_4.3.dw_conv.block.norm.weight', 'layer_4.3.dw_conv.block.norm.bias', 'layer_4.3.pw_conv.block.conv.weight', 'layer_4.3.pw_conv.block.norm.weight', 'layer_4.3.pw_conv.block.norm.bias', 'layer_4.4.dw_conv.block.conv.weight', 'layer_4.4.dw_conv.block.norm.weight', 'layer_4.4.dw_conv.block.norm.bias', 'layer_4.4.pw_conv.block.conv.weight', 'layer_4.4.pw_conv.block.norm.weight', 'layer_4.4.pw_conv.block.norm.bias', 'layer_4.5.dw_conv.block.conv.weight', 'layer_4.5.dw_conv.block.norm.weight', 'layer_4.5.dw_conv.block.norm.bias', 'layer_4.5.pw_conv.block.conv.weight', 'layer_4.5.pw_conv.block.norm.weight', 'layer_4.5.pw_conv.block.norm.bias', 'layer_5.0.dw_conv.block.conv.weight', 'layer_5.0.dw_conv.block.norm.weight', 'layer_5.0.dw_conv.block.norm.bias', 'layer_5.0.pw_conv.block.conv.weight', 'layer_5.0.pw_conv.block.norm.weight', 'layer_5.0.pw_conv.block.norm.bias', 'layer_5.1.dw_conv.block.conv.weight', 'layer_5.1.dw_conv.block.norm.weight', 'layer_5.1.dw_conv.block.norm.bias', 'layer_5.1.pw_conv.block.conv.weight', 'layer_5.1.pw_conv.block.norm.weight', 'layer_5.1.pw_conv.block.norm.bias', 'classifier.classifier_fc.weight', 'classifier.classifier_fc.bias']\n", "2024-04-15 11:43:54 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['aux_head.0.block.conv.weight', 'aux_head.0.block.norm.weight', 'aux_head.0.block.norm.bias', 'aux_head.2.block.conv.weight', 'aux_head.2.block.conv.bias', 'aspp.aspp_layer.convs.0.block.conv.weight', 'aspp.aspp_layer.convs.0.block.norm.weight', 'aspp.aspp_layer.convs.0.block.norm.bias', 'aspp.aspp_layer.convs.1.block.conv.weight', 'aspp.aspp_layer.convs.1.block.norm.weight', 'aspp.aspp_layer.convs.1.block.norm.bias', 'aspp.aspp_layer.convs.2.block.conv.weight', 'aspp.aspp_layer.convs.2.block.norm.weight', 'aspp.aspp_layer.convs.2.block.norm.bias', 'aspp.aspp_layer.convs.3.block.conv.weight', 'aspp.aspp_layer.convs.3.block.norm.weight', 'aspp.aspp_layer.convs.3.block.norm.bias', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.conv.weight', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.weight', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.bias', 'aspp.aspp_layer.project.block.conv.weight', 'aspp.aspp_layer.project.block.norm.weight', 'aspp.aspp_layer.project.block.norm.bias', 'classifier.block.conv.weight', 'classifier.block.conv.bias']\n", "2024-04-15 11:44:02 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt\n", "2024-04-15 11:44:02 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['encoder.neural_augmentor.brightness._low', 'encoder.neural_augmentor.brightness._high', 'encoder.neural_augmentor.contrast._low', 'encoder.neural_augmentor.contrast._high', 'encoder.neural_augmentor.noise._low', 'encoder.neural_augmentor.noise._high', 'encoder.conv_1.block.conv.weight', 'encoder.conv_1.block.norm.weight', 'encoder.conv_1.block.norm.bias', 'encoder.layer_1.0.dw_conv.block.conv.weight', 'encoder.layer_1.0.dw_conv.block.norm.weight', 'encoder.layer_1.0.dw_conv.block.norm.bias', 'encoder.layer_1.0.pw_conv.block.conv.weight', 'encoder.layer_1.0.pw_conv.block.norm.weight', 'encoder.layer_1.0.pw_conv.block.norm.bias', 'encoder.layer_2.0.dw_conv.block.conv.weight', 'encoder.layer_2.0.dw_conv.block.norm.weight', 'encoder.layer_2.0.dw_conv.block.norm.bias', 'encoder.layer_2.0.pw_conv.block.conv.weight', 'encoder.layer_2.0.pw_conv.block.norm.weight', 'encoder.layer_2.0.pw_conv.block.norm.bias', 'encoder.layer_2.1.dw_conv.block.conv.weight', 'encoder.layer_2.1.dw_conv.block.norm.weight', 'encoder.layer_2.1.dw_conv.block.norm.bias', 'encoder.layer_2.1.pw_conv.block.conv.weight', 'encoder.layer_2.1.pw_conv.block.norm.weight', 'encoder.layer_2.1.pw_conv.block.norm.bias', 'encoder.layer_3.0.dw_conv.block.conv.weight', 'encoder.layer_3.0.dw_conv.block.norm.weight', 'encoder.layer_3.0.dw_conv.block.norm.bias', 'encoder.layer_3.0.pw_conv.block.conv.weight', 'encoder.layer_3.0.pw_conv.block.norm.weight', 'encoder.layer_3.0.pw_conv.block.norm.bias', 'encoder.layer_3.1.dw_conv.block.conv.weight', 'encoder.layer_3.1.dw_conv.block.norm.weight', 'encoder.layer_3.1.dw_conv.block.norm.bias', 'encoder.layer_3.1.pw_conv.block.conv.weight', 'encoder.layer_3.1.pw_conv.block.norm.weight', 'encoder.layer_3.1.pw_conv.block.norm.bias', 'encoder.layer_4.0.dw_conv.block.conv.weight', 'encoder.layer_4.0.dw_conv.block.norm.weight', 'encoder.layer_4.0.dw_conv.block.norm.bias', 'encoder.layer_4.0.pw_conv.block.conv.weight', 'encoder.layer_4.0.pw_conv.block.norm.weight', 'encoder.layer_4.0.pw_conv.block.norm.bias', 'encoder.layer_4.1.dw_conv.block.conv.weight', 'encoder.layer_4.1.dw_conv.block.norm.weight', 'encoder.layer_4.1.dw_conv.block.norm.bias', 'encoder.layer_4.1.pw_conv.block.conv.weight', 'encoder.layer_4.1.pw_conv.block.norm.weight', 'encoder.layer_4.1.pw_conv.block.norm.bias', 'encoder.layer_4.2.dw_conv.block.conv.weight', 'encoder.layer_4.2.dw_conv.block.norm.weight', 'encoder.layer_4.2.dw_conv.block.norm.bias', 'encoder.layer_4.2.pw_conv.block.conv.weight', 'encoder.layer_4.2.pw_conv.block.norm.weight', 'encoder.layer_4.2.pw_conv.block.norm.bias', 'encoder.layer_4.3.dw_conv.block.conv.weight', 'encoder.layer_4.3.dw_conv.block.norm.weight', 'encoder.layer_4.3.dw_conv.block.norm.bias', 'encoder.layer_4.3.pw_conv.block.conv.weight', 'encoder.layer_4.3.pw_conv.block.norm.weight', 'encoder.layer_4.3.pw_conv.block.norm.bias', 'encoder.layer_4.4.dw_conv.block.conv.weight', 'encoder.layer_4.4.dw_conv.block.norm.weight', 'encoder.layer_4.4.dw_conv.block.norm.bias', 'encoder.layer_4.4.pw_conv.block.conv.weight', 'encoder.layer_4.4.pw_conv.block.norm.weight', 'encoder.layer_4.4.pw_conv.block.norm.bias', 'encoder.layer_4.5.dw_conv.block.conv.weight', 'encoder.layer_4.5.dw_conv.block.norm.weight', 'encoder.layer_4.5.dw_conv.block.norm.bias', 'encoder.layer_4.5.pw_conv.block.conv.weight', 'encoder.layer_4.5.pw_conv.block.norm.weight', 'encoder.layer_4.5.pw_conv.block.norm.bias', 'encoder.layer_5.0.dw_conv.block.conv.weight', 'encoder.layer_5.0.dw_conv.block.norm.weight', 'encoder.layer_5.0.dw_conv.block.norm.bias', 'encoder.layer_5.0.pw_conv.block.conv.weight', 'encoder.layer_5.0.pw_conv.block.norm.weight', 'encoder.layer_5.0.pw_conv.block.norm.bias', 'encoder.layer_5.1.dw_conv.block.conv.weight', 'encoder.layer_5.1.dw_conv.block.norm.weight', 'encoder.layer_5.1.dw_conv.block.norm.bias', 'encoder.layer_5.1.pw_conv.block.conv.weight', 'encoder.layer_5.1.pw_conv.block.norm.weight', 'encoder.layer_5.1.pw_conv.block.norm.bias', 'seg_head.aux_head.0.block.conv.weight', 'seg_head.aux_head.0.block.norm.weight', 'seg_head.aux_head.0.block.norm.bias', 'seg_head.aux_head.2.block.conv.weight', 'seg_head.aux_head.2.block.conv.bias', 'seg_head.aspp.aspp_layer.convs.0.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.0.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.0.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.1.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.1.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.1.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.2.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.2.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.2.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.3.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.3.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.3.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.bias', 'seg_head.aspp.aspp_layer.project.block.conv.weight', 'seg_head.aspp.aspp_layer.project.block.norm.weight', 'seg_head.aspp.aspp_layer.project.block.norm.bias', 'seg_head.classifier.block.conv.weight', 'seg_head.classifier.block.conv.bias']\n" ] }, { "data": { "text/plain": [ "SegEncoderDecoder(\n", " (encoder): MobileNetv1(\n", " (neural_augmentor): DistributionNeuralAugmentor(\n", " \tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \n", " \tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\n", " (conv_1): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=ReLU)\n", " (layer_1): Sequential(\n", " (0): SeparableConv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, dilation=1)\n", " )\n", " (layer_2): Sequential(\n", " (0): SeparableConv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2, dilation=1)\n", " (1): SeparableConv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, dilation=1)\n", " )\n", " (layer_3): Sequential(\n", " (0): SeparableConv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, dilation=1)\n", " (1): SeparableConv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, dilation=1)\n", " )\n", " (layer_4): Sequential(\n", " (0): SeparableConv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, dilation=1)\n", " (1): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\n", " (2): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\n", " (3): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\n", " (4): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\n", " (5): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\n", " )\n", " (layer_5): Sequential(\n", " (0): SeparableConv2d(in_channels=512, out_channels=1024, kernel_size=3, stride=1, dilation=2)\n", " (1): SeparableConv2d(in_channels=1024, out_channels=1024, kernel_size=3, stride=1, dilation=4)\n", " )\n", " (conv_1x1_exp): None\n", " (classifier): None\n", " )\n", " (seg_head): DeeplabV3(\n", " (aux_head): Sequential(\n", " (0): Conv2d(512, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=ReLU)\n", " (1): Dropout2d(p=0.1, inplace=False)\n", " (2): Conv2d(128, 21, kernel_size=(1, 1), stride=(1, 1))\n", " )\n", " (upsample_seg_out): UpSample(scale_factor=8.0, mode='bilinear')\n", " (aspp): Sequential(\n", " (aspp_layer): ASPP(in_channels=1024, out_channels=512, atrous_rates=[12, 24, 36], is_aspp_sep=False, dropout=0.1)\n", " )\n", " (classifier): Conv2d(512, 21, kernel_size=(1, 1), stride=(1, 1))\n", " )\n", ")" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from corenet.options.opts import get_training_arguments\n", "from corenet.modeling import get_model\n", "from PIL import Image\n", "import torch\n", "from torchvision.transforms import Compose, Resize, PILToTensor\n", "from torchvision.transforms import ToPILImage\n", "import os\n", "\n", "\n", "# configuration file path\n", "config_file = os.path.join(\n", " os.getcwd(),\n", " \"..\",\n", " \"projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml\",\n", ")\n", "# pre-trained weights\n", "pretrained_weights = \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt\"\n", "\n", "opts = get_training_arguments(\n", " args=[\n", " \"--common.config-file\",\n", " config_file,\n", " \"--model.segmentation.pretrained\",\n", " pretrained_weights,\n", " ]\n", ")\n", "\n", "# build the model\n", "model = get_model(opts)\n", "# set the model in evaluation mode.\n", "model.eval()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 2: Read and pre-process input image" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Step 2.1: Read a PIL image and convert to RGB format.\n", "img_path = os.path.join(os.getcwd(), \"..\", \"assets\", \"dog.jpeg\")\n", "image = Image.open(img_path).convert(\"RGB\")\n", "image" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "## STEP 2.2: Preprocess an input image\n", "# The model is fine-tuned on the semantic segmentation using 512x512 resolution. Therefore, we resize the input PIL image while maintaining the\n", "# aspect ratio such that the shorter image dimension is 512. After that, we convert the resized PIL image into a tensor. The values in tensor\n", "# range between 0 and 255. We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\n", "\n", "img_transforms = Compose([Resize(size=512), PILToTensor()])\n", "\n", "input_tensor = img_transforms(image)\n", "input_tensor = input_tensor.to(torch.float).div(255.0)\n", "\n", "# add dummy batch dimension\n", "input_tensor = input_tensor[None, ...]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## STEP 3: Generate segmentation mask" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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oooooooooooor1T9n3UobH4mi3lWQvf2UtvEVAwGBWXLc9NsbDjPJH1H1XRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRXmfx51KGx+Fd5byrIXv7iG3iKgYDBxLluem2Nhxnkj6j5Moooooooooooooooooooooooooooooooooooooooooooooooooooooor1T9n3TYb74mi4laQPYWUtxEFIwWJWLDcdNsjHjHIH0P1XRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRXj/7R3/JPNP/AOwrH/6Klr5goooooooooooooooooooooooooooooooooooooooooooooooooooooor0T4HTzQ/FvSEilkRJknSVVYgOvku2G9RuVTg9wD2r67oooooooooooooooooooooooooooooooooooooorx/9o7/knmn/APYVj/8ARUtfMFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFdR8OL640/wCJXhya1k8uRtQhhJ2g5SRhG459VZh7Z45r7XooooooooooooooooooooooooooooooooooooooryP9oqCab4c2rxRSOkOpxPKyqSEXy5Fy3oNzKMnuQO9fLlFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFWLC+uNM1G2v7OTy7q1lSaF9oO11IKnB4OCB1r7vsL631PTra/s5PMtbqJJoX2kbkYAqcHkZBHWrFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFef/ABt/5JDrv/bv/wClEdfIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFfW/wM1n+1/hfZRM88k2nyyWcjzHOcHeoU5PyhHRR0xtxjAFekUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVn65o1n4h0O90i/Tfa3cTRPgAlc9GXIIDA4IOOCAa+OPHXgXVPAeuGwvx5tvJlrW7RcJcIO49GGRle2e4IJ5eiiiiiiiiiiiiiiiiiiiiiiv/Z", "image/png": "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", "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with torch.no_grad():\n", " # Feed the input tensor to the model. The shape of the input tensor is [batch_size, 3, height, width]\n", " # The output of the model will be [batch_size, num_classes, height, width]\n", " logits = model(input_tensor)\n", "\n", " # Take an argmax along the 'num_classes' dimension to produce a segmentation mask\n", " output_mask = torch.argmax(logits, dim=1)\n", " # remove the dummy batch dimension and convert to uint8.\n", " output_mask = output_mask[0].to(torch.uint8)\n", "\n", " # For display purposes, let's convert the image into binary\n", " output_mask[output_mask > 0] = 255\n", "\n", "# convert the tensor to PIL image\n", "output_pil = ToPILImage()(output_mask)\n", "output_pil" ] } ], "metadata": { "kernelspec": { "display_name": "corenet", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: tutorials/train_a_new_model_on_a_new_dataset_from_scratch.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "3ecfe074-b6cb-4389-97d8-29e1b41f62e7", "metadata": {}, "source": [ "# How to train a new model on a new dataset from scratch in CoreNet\n", "\n", "The purpose of this tutorial is to familiarize you with experimenting with new models and datasets from scratch in CoreNet. We implement a simple classification model on CIFAR10 dataset, then demonstrate how to launch the training and evaluation.\n", "\n", "Let's first make sure our current working directory is the root folder of the repository." ] }, { "cell_type": "code", "execution_count": 1, "id": "2c79508f-0138-417d-804c-7b0006439b25", "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "if os.getcwd().endswith(\"tutorials\"):\n", " os.chdir(\"..\")\n", "\n", "assert os.path.exists(\n", " \"corenet\"\n", "), f\"We should be in the root repository folder, but we are in {os.getcwd()}\"\n", "\n", "! mkdir -p projects/playground_cifar10/classification" ] }, { "cell_type": "markdown", "id": "24e3ce2d-2916-4319-8c0c-73e808f0cddd", "metadata": {}, "source": [ "## Create new training configuration\n", "\n", "Let's start by creating a YAML training configuration in the `projects/playground_cifar10` folder. You can find more training recipes in `projects/` folder. \n", "\n", "Note: The following jupyter notebook cells in this tutorial start with `%%file `. This header instructs jupyter to write the content of the cell to the specified ``, when executed. We leverage this feature to generate the YAML and Python files." ] }, { "cell_type": "code", "execution_count": 2, "id": "68ef9fe9-d6a7-4c15-a4d5-1f1b29ed9292", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting projects/playground_cifar10/classification/cifar10.yaml\n" ] } ], "source": [ "%%file projects/playground_cifar10/classification/cifar10.yaml\n", "\n", "common:\n", " log_freq: 2000 # Log the training metrics every 2000 iterations.\n", "\n", "dataset:\n", " category: classification\n", " name: \"cifar10\" # We'll register the \"cifar10\" name at DATASET_REGISTRY later in this tutorial.\n", "\n", " # The `corenet-train` entrypoint uses train_batch_size0 and val_batch_size0 values to construct \n", " # training/validation batches during training. The `corenet-eval` entrypoint uses eval_batch_size0 to \n", " # construct batches during evaluation (ie test).\n", " #\n", " # The effective batch size is: num_nodes x num_gpus x train_batch_size0\n", " train_batch_size0: 4\n", " val_batch_size0: 4\n", " eval_batch_size0: 1\n", "\n", " workers: 2\n", " persistent_workers: true\n", " pin_memory: true\n", "\n", "model:\n", " classification:\n", " name: \"two_layer\" # We'll register the \"two_layer\" name at MODEL_REGISTRY later in this tutorial.\n", " n_classes: 10\n", "\n", " layer:\n", " # Weight initialization parameters:\n", " conv_init: \"kaiming_normal\"\n", " linear_init: \"trunc_normal\"\n", " linear_init_std_dev: 0.02\n", "\n", "\n", "sampler:\n", " name: batch_sampler\n", "\n", " # The following dimensions will be passed to the dataset.__get__ method, and the dataset produces samples \n", " # cropped and resized to the requested dimensions. \n", " bs:\n", " crop_size_width: 32\n", " crop_size_height: 32\n", "\n", "loss:\n", " category: classification\n", " classification:\n", " name: cross_entropy # The implemention is available in \"corenet/loss_fn/\" folder.\n", "\n", "optim:\n", " name: sgd\n", " sgd:\n", " momentum: 0.9\n", "\n", "scheduler:\n", " name: fixed # The implementation is available in \"corenet/optims/scheduler/\" folder.\n", " max_epochs: 2\n", " fixed:\n", " lr: 0.001 # Fixed Learning Rate\n", "\n", "stats:\n", " val: [\"loss\", \"top1\"] # Metrics to log\n", " train: [\"loss\", \"top1\"]\n", " checkpoint_metric: top1 # Assigns a checkpoint to results/checkpoint_best.pt\n", " checkpoint_metric_max: true\n" ] }, { "cell_type": "markdown", "id": "850c7db0-8231-4796-a715-0bf29a1528a4", "metadata": {}, "source": [ "## Register model and dataset classes\n", "\n", "Now, let's define the \"cifar10\" dataset and \"two_layer\" model that we have used in the \n", "above config. You can find more datasets in `corenet/data/datasets` and more models in\n", "`corenet/modeling/models`, where directories represent tasks (e.g. \"classification\")." ] }, { "cell_type": "code", "execution_count": 3, "id": "bcda60b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting corenet/data/datasets/classification/playground_dataset.py\n" ] } ], "source": [ "%%file corenet/data/datasets/classification/playground_dataset.py\n", "\n", "from argparse import Namespace\n", "from typing import Any, Dict, Tuple\n", "\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "\n", "from corenet.data.datasets import DATASET_REGISTRY\n", "from corenet.data.datasets.dataset_base import BaseDataset\n", "\n", "\n", "@DATASET_REGISTRY.register(name=\"cifar10\", type=\"classification\")\n", "class Cifar10(BaseDataset):\n", " CLASS_NAMES = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n", " \n", " def __init__(self, opts: Namespace, **kwargs) -> None:\n", " super().__init__(opts, **kwargs)\n", " self._torchvision_dataset = torchvision.datasets.CIFAR10(\n", " \"/tmp/cifar10_cache\",\n", " train=self.is_training,\n", " download=True,\n", " )\n", "\n", " def __len__(self) -> int:\n", " return len(self._torchvision_dataset)\n", "\n", " def __getitem__(self, sample_size_and_index: Tuple[int]) -> Dict[str, Any]:\n", " # In CoreNet, not only does the sampler determine the index of the samples, but\n", " # also the sampler determines the crop size dynamically for each batch. This\n", " # allows samplers to train multi-scale models more efficiently.\n", " # See: corenet/data/sampler/variable_batch_sampler.py\n", " (crop_size_h, crop_size_w, sample_index) = sample_size_and_index\n", "\n", " img, target = self._torchvision_dataset[sample_index]\n", "\n", " transform = transforms.Compose(\n", " [\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n", " transforms.Resize(size=(crop_size_h, crop_size_w)),\n", " ]\n", " )\n", " img = transform(img)\n", " return {\n", " \"samples\": img,\n", " \"targets\": target,\n", " }\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "3b53c116", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting corenet/modeling/models/classification/playground_model.py\n" ] } ], "source": [ "%%file corenet/modeling/models/classification/playground_model.py\n", "\n", "import argparse\n", "\n", "import torch\n", "import torch.nn.functional as F\n", "from torch import nn\n", "\n", "from corenet.modeling.models import MODEL_REGISTRY\n", "from corenet.modeling.models.base_model import BaseAnyNNModel\n", "\n", "\n", "@MODEL_REGISTRY.register(\"two_layer\", type=\"classification\")\n", "class Net(BaseAnyNNModel):\n", " \"\"\"A simple 2-layer CNN, inspired by https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html\"\"\"\n", "\n", " def __init__(self, opts: argparse.Namespace) -> None:\n", " super().__init__(opts)\n", " self.conv1 = nn.Conv2d(3, 6, 5)\n", " self.pool = nn.MaxPool2d(2, 2)\n", " self.conv2 = nn.Conv2d(6, 16, 5)\n", " self.fc1 = nn.Linear(16 * 5 * 5, 120)\n", " self.fc2 = nn.Linear(120, 84)\n", " self.fc3 = nn.Linear(84, 10)\n", " self.reset_parameters(opts) # Initialize the weights\n", "\n", " def forward(self, x: torch.Tensor):\n", " x = self.pool(F.relu(self.conv1(x)))\n", " x = self.pool(F.relu(self.conv2(x)))\n", " x = torch.flatten(x, 1)\n", " x = F.relu(self.fc1(x))\n", " x = F.relu(self.fc2(x))\n", " x = self.fc3(x)\n", " return x" ] }, { "cell_type": "markdown", "id": "c51c2bda", "metadata": {}, "source": [ "### Launching the training\n", "\n", "You can train the model by specifying the yaml config file that we created earlier in \n", "this tutorial:" ] }, { "cell_type": "code", "execution_count": 5, "id": "3c63e142", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/m_sekhavat/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\n", " from distutils.version import StrictVersion as _StrictVersion\n", "2024-04-18 00:19:55 - \u001b[34m\u001b[1mLOGS \u001b[0m - Random seeds are set to 0\n", "2024-04-18 00:19:55 - \u001b[34m\u001b[1mLOGS \u001b[0m - Using PyTorch version 2.2.1+cu121\n", "2024-04-18 00:19:55 - \u001b[34m\u001b[1mLOGS \u001b[0m - Available GPUs: 1\n", "2024-04-18 00:19:55 - \u001b[34m\u001b[1mLOGS \u001b[0m - CUDNN is enabled\n", "2024-04-18 00:19:56 - \u001b[34m\u001b[1mLOGS \u001b[0m - Setting --ddp.world-size the same as the number of available gpus.\n", "2024-04-18 00:19:56 - \u001b[34m\u001b[1mLOGS \u001b[0m - Directory exists at: results/run_1\n", "2024-04-18 00:19:59 - \u001b[32m\u001b[1mINFO \u001b[0m - distributed init (rank 0): tcp://m-sekhavat-dev2:30786\n", "Files already downloaded and verified\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Training dataset details are given below\n", "Cifar10(\n", "\troot= \n", "\tis_training=True \n", "\tnum_samples=50000\n", ")\n", "Files already downloaded and verified\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Validation dataset details are given below\n", "Cifar10(\n", "\troot= \n", "\tis_training=False \n", "\tnum_samples=10000\n", ")\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Training sampler details: BatchSamplerDDP(\n", "\t num_repeat=1\n", "\t trunc_rep_aug=False\n", "\t sharding=False\n", "\t disable_shuffle_sharding=False\n", "\tbase_im_size=(h=32, w=32)\n", "\tbase_batch_size=4\n", ")\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Validation sampler details: BatchSamplerDDP(\n", "\t num_repeat=1\n", "\t trunc_rep_aug=False\n", "\t sharding=False\n", "\t disable_shuffle_sharding=False\n", "\tbase_im_size=(h=32, w=32)\n", "\tbase_batch_size=4\n", ")\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Number of data workers: 2\n", "2024-04-18 00:20:01 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mModel\u001b[0m\n", "Net(\n", " (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n", " (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n", " (fc1): Linear(in_features=400, out_features=120, bias=True)\n", " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", ")\n", "\u001b[31m=================================================================\u001b[0m\n", " Net Summary\n", "\u001b[31m=================================================================\u001b[0m\n", "Total parameters = 0.062 M\n", "Total trainable parameters = 0.062 M\n", "\n", "2024-04-18 00:20:01 - \u001b[33m\u001b[1mWARNING\u001b[0m - Profiling not available, dummy_input_and_label not implemented for this model.\n", "2024-04-18 00:20:01 - \u001b[34m\u001b[1mLOGS \u001b[0m - Using DistributedDataParallel.\n", "2024-04-18 00:20:02 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mLoss function\u001b[0m\n", "CrossEntropy(\n", "\t ignore_idx=-1\n", "\t class_weighting=False\n", "\t label_smoothing=0.0\n", ")\n", "2024-04-18 00:20:02 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mOptimizer\u001b[0m\n", "SGDOptimizer (\n", "\t dampening: [0]\n", "\t differentiable: [False]\n", "\t foreach: [None]\n", "\t lr: [0.1]\n", "\t maximize: [False]\n", "\t momentum: [0.9]\n", "\t nesterov: [False]\n", "\t weight_decay: [4e-05]\n", ")\n", "2024-04-18 00:20:02 - \u001b[34m\u001b[1mLOGS \u001b[0m - Max. epochs for training: 2\n", "2024-04-18 00:20:02 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mLearning rate scheduler\u001b[0m\n", "FixedLRScheduler(\n", "\tlr=0.001\n", " )\n", "2024-04-18 00:20:02 - \u001b[32m\u001b[1mINFO \u001b[0m - Configuration file is stored here: \u001b[36mresults/run_1/config.yaml\u001b[0m\n", "\u001b[31m===========================================================================\u001b[0m\n", "2024-04-18 00:20:04 - \u001b[32m\u001b[1mINFO \u001b[0m - Training epoch 0\n", "2024-04-18 00:20:13 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 1/10000000], loss: 2.353, top1: 0.0, LR: [0.001], Avg. batch load time: 8.939, Elapsed time: 9.60\n", "2024-04-18 00:20:23 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 2001/10000000], loss: 2.1819, top1: 16.954, LR: [0.001], Avg. batch load time: 0.005, Elapsed time: 18.86\n", "2024-04-18 00:20:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 4001/10000000], loss: 2.0067, top1: 24.2439, LR: [0.001], Avg. batch load time: 0.003, Elapsed time: 27.71\n", "2024-04-18 00:20:40 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 6001/10000000], loss: 1.8889, top1: 29.3868, LR: [0.001], Avg. batch load time: 0.002, Elapsed time: 36.57\n", "2024-04-18 00:20:50 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 8001/10000000], loss: 1.8088, top1: 32.6272, LR: [0.001], Avg. batch load time: 0.002, Elapsed time: 45.68\n", "2024-04-18 00:20:58 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 10001/10000000], loss: 1.7547, top1: 34.9515, LR: [0.001], Avg. batch load time: 0.001, Elapsed time: 54.54\n", "2024-04-18 00:21:07 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 12001/10000000], loss: 1.7098, top1: 36.7949, LR: [0.001], Avg. batch load time: 0.001, Elapsed time: 63.47\n", "2024-04-18 00:21:10 - \u001b[34m\u001b[1mLOGS \u001b[0m - *** Training summary for epoch 0\n", "\t loss=1.6997 || top1=37.214\n", "2024-04-18 00:21:19 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 4/ 10000], loss: 0.9705, top1: 50.0, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 7.04\n", "2024-04-18 00:21:24 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 8004/ 10000], loss: 1.4266, top1: 48.2634, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 12.46\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - *** Validation summary for epoch 0\n", "\t loss=1.4324 || top1=48.25\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Best checkpoint with score 48.25 saved at results/run_1/checkpoint_best.pt\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Deleting checkpoint: results/run_1/checkpoint_score_1.2353.pt\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Averaging checkpoints: ['checkpoint_score_1.4228.pt', 'checkpoint_score_48.2500.pt', 'checkpoint_score_49.2900.pt', 'checkpoint_score_49.8700.pt', 'checkpoint_score_54.7400.pt']\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Averaged checkpoint saved at: results/run_1/checkpoint_avg.pt\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Last training checkpoint is saved at: results/run_1/training_checkpoint_last.pt\n", "2024-04-18 00:21:26 - \u001b[34m\u001b[1mLOGS \u001b[0m - Last checkpoint's model state is saved at: results/run_1/checkpoint_last.pt\n", "\u001b[31m===========================================================================\u001b[0m\n", "2024-04-18 00:21:28 - \u001b[32m\u001b[1mINFO \u001b[0m - Training epoch 1\n", "2024-04-18 00:21:28 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 12501/10000000], loss: 1.2167, top1: 50.0, LR: [0.001], Avg. batch load time: 0.042, Elapsed time: 0.05\n", "2024-04-18 00:21:37 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 14501/10000000], loss: 1.424, top1: 49.1004, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 8.88\n", "2024-04-18 00:21:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 16501/10000000], loss: 1.4023, top1: 49.7438, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 17.92\n", "2024-04-18 00:21:55 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 18501/10000000], loss: 1.3817, top1: 50.4916, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 26.66\n", "2024-04-18 00:22:03 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 20501/10000000], loss: 1.3659, top1: 51.1499, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 35.22\n", "2024-04-18 00:22:12 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 22501/10000000], loss: 1.3521, top1: 51.6673, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 43.97\n", "2024-04-18 00:22:21 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 24501/10000000], loss: 1.3378, top1: 52.1477, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 52.74\n", "2024-04-18 00:22:23 - \u001b[34m\u001b[1mLOGS \u001b[0m - *** Training summary for epoch 1\n", "\t loss=1.3375 || top1=52.196\n", "2024-04-18 00:22:25 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 4/ 10000], loss: 1.1664, top1: 25.0, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 0.01\n", "2024-04-18 00:22:30 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 1 [ 8004/ 10000], loss: 1.2198, top1: 56.6217, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 5.44\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - *** Validation summary for epoch 1\n", "\t loss=1.2256 || top1=56.54\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Best checkpoint with score 56.54 saved at results/run_1/checkpoint_best.pt\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Deleting checkpoint: results/run_1/checkpoint_score_1.4228.pt\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Averaging checkpoints: ['checkpoint_score_48.2500.pt', 'checkpoint_score_49.2900.pt', 'checkpoint_score_49.8700.pt', 'checkpoint_score_54.7400.pt', 'checkpoint_score_56.5400.pt']\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Averaged checkpoint saved at: results/run_1/checkpoint_avg.pt\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Last training checkpoint is saved at: results/run_1/training_checkpoint_last.pt\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Last checkpoint's model state is saved at: results/run_1/checkpoint_last.pt\n", "2024-04-18 00:22:32 - \u001b[34m\u001b[1mLOGS \u001b[0m - Training took 00:02:30.57\n" ] } ], "source": [ "! corenet-train --common.config-file projects/playground_cifar10/classification/cifar10.yaml" ] }, { "cell_type": "markdown", "id": "ee65265e-98ec-43c5-8dd7-1e07501b6522", "metadata": {}, "source": [ "By running the above command, you should observe that the model's validation accuracy has increased from ~10% to 54.74%.\n", "\n", "We can find the saved checkpoints in the results folder:" ] }, { "cell_type": "code", "execution_count": 6, "id": "b1b7511a-adc1-4d89-80e3-f1ea71a94c14", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[01;34mresults/\u001b[00m\n", "├── \u001b[01;34mclassification_results\u001b[00m\n", "│   └── \u001b[01;34mrun_1\u001b[00m\n", "├── logs.txt\n", "└── \u001b[01;34mrun_1\u001b[00m\n", " ├── checkpoint_avg.pt\n", " ├── checkpoint_best.pt\n", " ├── checkpoint_last.pt\n", " ├── checkpoint_score_48.2500.pt\n", " ├── checkpoint_score_49.2900.pt\n", " ├── checkpoint_score_49.8700.pt\n", " ├── checkpoint_score_54.7400.pt\n", " ├── checkpoint_score_56.5400.pt\n", " ├── config.yaml\n", " └── training_checkpoint_last.pt\n", "\n", "3 directories, 11 files\n" ] } ], "source": [ "! tree results/" ] }, { "cell_type": "markdown", "id": "39e768f8-ad90-409c-8eaf-f3caf02a06ba", "metadata": {}, "source": [ "### Launching the evaluation\n", "CoreNet follows the standard practice of splitting datasets into `train`, `val`, and `test` splits. The `corenet-train` entrypoint that was used in the previous section consumes `train` and `val` splits for training the model and finding the best checkpoint. In this section, we will use `corenet-eval` entrypoint, that evaluates a model checkpoint on the `test` split of a dataset.\n", "\n", "In the below command, we set `CUDA_VISIBLE_DEVICES=0` environment variable, as a good reproducibility practice for evaluation to use only 1 gpu for inference. Otherwise, CoreNet uses all available GPUs by default." ] }, { "cell_type": "code", "execution_count": 7, "id": "72b847fb-0b2c-4d6a-a045-6cdb52ced476", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/m_sekhavat/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\n", " from distutils.version import StrictVersion as _StrictVersion\n", "2024-04-18 00:22:40 - \u001b[34m\u001b[1mLOGS \u001b[0m - Random seeds are set to 0\n", "2024-04-18 00:22:40 - \u001b[34m\u001b[1mLOGS \u001b[0m - Using PyTorch version 2.2.1+cu121\n", "2024-04-18 00:22:40 - \u001b[34m\u001b[1mLOGS \u001b[0m - Available GPUs: 1\n", "2024-04-18 00:22:40 - \u001b[34m\u001b[1mLOGS \u001b[0m - CUDNN is enabled\n", "2024-04-18 00:22:41 - \u001b[34m\u001b[1mLOGS \u001b[0m - Setting --ddp.world-size the same as the number of available gpus.\n", "2024-04-18 00:22:41 - \u001b[34m\u001b[1mLOGS \u001b[0m - Directory exists at: results/run_1\n", "2024-04-18 00:22:45 - \u001b[32m\u001b[1mINFO \u001b[0m - distributed init (rank 0): tcp://m-sekhavat-dev2:30786\n", "Files already downloaded and verified\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - Evaluation dataset details: \n", "Cifar10(\n", "\troot= \n", "\tis_training=False \n", "\tnum_samples=10000\n", ")\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - Evaluation sampler details: BatchSamplerDDP(\n", "\t num_repeat=1\n", "\t trunc_rep_aug=False\n", "\t sharding=False\n", "\t disable_shuffle_sharding=False\n", "\tbase_im_size=(h=32, w=32)\n", "\tbase_batch_size=1\n", ")\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from results/run_1/checkpoint_best.pt\n", "2024-04-18 00:22:46 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mModel\u001b[0m\n", "Net(\n", " (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n", " (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n", " (fc1): Linear(in_features=400, out_features=120, bias=True)\n", " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", ")\n", "\u001b[31m=================================================================\u001b[0m\n", " Net Summary\n", "\u001b[31m=================================================================\u001b[0m\n", "Total parameters = 0.062 M\n", "Total trainable parameters = 0.062 M\n", "\n", "2024-04-18 00:22:46 - \u001b[33m\u001b[1mWARNING\u001b[0m - Profiling not available, dummy_input_and_label not implemented for this model.\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - Using DistributedDataParallel.\n", "2024-04-18 00:22:46 - \u001b[34m\u001b[1mLOGS \u001b[0m - \u001b[36mLoss function\u001b[0m\n", "CrossEntropy(\n", "\t ignore_idx=-1\n", "\t class_weighting=False\n", "\t label_smoothing=0.0\n", ")\n", "2024-04-18 00:22:53 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 1/ 10000], loss: 1.137, top1: 0.0, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 7.27\n", "2024-04-18 00:22:59 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 2001/ 10000], loss: 1.2002, top1: 56.022, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 12.85\n", "2024-04-18 00:23:04 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 4001/ 10000], loss: 1.2143, top1: 55.886, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 18.20\n", "2024-04-18 00:23:10 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 6001/ 10000], loss: 1.2187, top1: 56.3406, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 23.91\n", "2024-04-18 00:23:16 - \u001b[34m\u001b[1mLOGS \u001b[0m - Epoch: 0 [ 8001/ 10000], loss: 1.22, top1: 56.6179, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 29.44\n", "2024-04-18 00:23:21 - \u001b[34m\u001b[1mLOGS \u001b[0m - *** Evaluation summary for epoch 0\n", "\t loss=1.2256 || top1=56.54\n", "2024-04-18 00:23:21 - \u001b[34m\u001b[1mLOGS \u001b[0m - Evaluation took 35.33877229690552 seconds\n" ] } ], "source": [ "! CUDA_VISIBLE_DEVICES=0 corenet-eval \\\n", " --common.config-file projects/playground_cifar10/classification/cifar10.yaml \\\n", " --model.classification.pretrained results/run_1/checkpoint_best.pt" ] }, { "cell_type": "markdown", "id": "f75994b9-ff15-4195-9e2c-147be276a0fe", "metadata": {}, "source": [ "We observed the same `top1=54.74` result as we observed in the validation accuracy during training, because the current CIFAR10 implementation uses the same test set for validation and test. In order to differentiate between validation and test, you can access `self.mode` in the dataset, which is a member of `{\"train\", \"val\", \"test\"}`." ] }, { "cell_type": "markdown", "id": "ad735fc4-db86-400a-a546-362c3a54ac18", "metadata": {}, "source": [ "### Visualizing the classification results\n", "It's easy to load a model checkpoint and interact with it in notebook:" ] }, { "cell_type": "code", "execution_count": 18, "id": "8e395824-a625-49ba-ba16-e63fe68a4172", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-18 15:52:19 - \u001b[34m\u001b[1mLOGS \u001b[0m - Pretrained weights are loaded from results/run_1/checkpoint_best.pt\n", "2024-04-18 15:52:19 - \u001b[32m\u001b[1mINFO \u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top 3 Predictions: ['bird: 33.3%', 'dog: 18.5%', 'cat: 13.7%']\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top 3 Predictions: ['dog: 28.1%', 'cat: 22.6%', 'bird: 15.9%']\n" ] } ], "source": [ "from corenet.options.opts import get_training_arguments\n", "from corenet.modeling import get_model\n", "from PIL import Image\n", "import torch\n", "from torchvision.transforms import Compose, Resize, PILToTensor, CenterCrop\n", "from torchvision.transforms import ToPILImage\n", "from corenet.data.datasets.classification.playground_dataset import Cifar10\n", "\n", "config_file = \"projects/playground_cifar10/classification/cifar10.yaml\"\n", "pretrained_weights = \"results/run_1/checkpoint_best.pt\"\n", "\n", "opts = get_training_arguments(\n", " args=[\n", " \"--common.config-file\",\n", " config_file,\n", " \"--model.classification.pretrained\",\n", " pretrained_weights,\n", " ]\n", ")\n", "\n", "# Load the model\n", "model = get_model(opts)\n", "model.eval()\n", "\n", "for image_path in [\"assets/cat.jpeg\", \"assets/dog.jpeg\"]:\n", " image = Image.open(image_path).convert(\"RGB\")\n", " img_transforms = Compose([CenterCrop(600), Resize(size=(32, 32)), PILToTensor()])\n", "\n", " # Transform the image, normalize between 0 and 1\n", " input_tensor = img_transforms(image)\n", "\n", " # Show the transformed image\n", " ToPILImage()(input_tensor).show()\n", "\n", " input_tensor = input_tensor.to(torch.float).div(255.0)\n", "\n", " # add dummy batch dimension\n", " input_tensor = input_tensor[None, ...]\n", "\n", " with torch.no_grad():\n", " logits = model(input_tensor)[0]\n", " probs = torch.softmax(logits, dim=-1)\n", " predictions = sorted(zip(probs.tolist(), Cifar10.CLASS_NAMES), reverse=True)\n", " print(\n", " \"Top 3 Predictions:\",\n", " [f\"{cls}: {prob:.1%}\" for prob, cls in predictions[:3]],\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 5 }