From 9ea08a441172228b124d2b91d85d51b185a2848d Mon Sep 17 00:00:00 2001 From: songkey-win Date: Mon, 2 Jun 2025 00:23:11 +0800 Subject: [PATCH] little change --- example_workflows/image_generation.json | 207 +++++- example_workflows/video_generation.json | 820 ++++++++++++++++++++++- examples/i5.jpg | Bin 0 -> 110169 bytes hellomeme/__init__.py | 2 +- hellomeme/models/__init__.py | 2 +- hellomeme/models/hm3_denoising_3d.py | 8 +- hellomeme/models/hm_adapters.py | 29 +- hellomeme/models/hm_blocks.py | 52 +- hellomeme/pipelines/__init__.py | 3 +- hellomeme/pipelines/pipline_hm5_video.py | 510 ++++++++++++++ hellomeme/tools/sr.py | 394 +++++++++++ meme.py | 10 +- pyproject.toml | 2 +- 13 files changed, 2023 insertions(+), 16 deletions(-) create mode 100644 examples/i5.jpg create mode 100644 hellomeme/pipelines/pipline_hm5_video.py create mode 100644 hellomeme/tools/sr.py diff --git a/example_workflows/image_generation.json b/example_workflows/image_generation.json index b82390c..b397b25 100644 --- a/example_workflows/image_generation.json +++ b/example_workflows/image_generation.json @@ -1 +1,206 @@ -{"id":"4a7ae110-38ab-446e-97da-b826e950c065","revision":0,"last_node_id":85,"last_link_id":203,"nodes":[{"id":67,"type":"GetHeadPose","pos":[814.1528930664062,495.9793701171875],"size":[270,98],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":147},{"localized_name":"images","name":"images","type":"IMAGE","link":151},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":143},{"localized_name":"crop","name":"crop","type":"BOOLEAN","widget":{"name":"crop"},"link":null}],"outputs":[{"localized_name":"head_pose","name":"head_pose","type":"HEAD_POSE","links":[191]}],"properties":{"Node name for S&R":"GetHeadPose"},"widgets_values":[false]},{"id":69,"type":"GetHeadPose","pos":[819.799560546875,860.5927734375],"size":[270,98],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":149},{"localized_name":"images","name":"images","type":"IMAGE","link":188},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":145},{"localized_name":"crop","name":"crop","type":"BOOLEAN","widget":{"name":"crop"},"link":null}],"outputs":[{"localized_name":"head_pose","name":"head_pose","type":"HEAD_POSE","links":[193]}],"properties":{"Node name for S&R":"GetHeadPose"},"widgets_values":[true]},{"id":80,"type":"HMPipelineImage","pos":[1275.33935546875,652.6725463867188],"size":[270,306],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"hm_image_pipeline","name":"hm_image_pipeline","type":"HMIMAGEPIPELINE","link":190},{"localized_name":"ref_head_pose","name":"ref_head_pose","type":"HEAD_POSE","link":191},{"localized_name":"ref_expression","name":"ref_expression","type":"EXPRESSION","link":196},{"localized_name":"drive_head_pose","name":"drive_head_pose","type":"HEAD_POSE","link":193},{"localized_name":"drive_expression","name":"drive_expression","type":"EXPRESSION","link":197},{"localized_name":"trans_ratio","name":"trans_ratio","type":"FLOAT","widget":{"name":"trans_ratio"},"link":null},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"negative_prompt","name":"negative_prompt","type":"STRING","widget":{"name":"negative_prompt"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"guidance_scale","name":"guidance_scale","type":"FLOAT","widget":{"name":"guidance_scale"},"link":null},{"localized_name":"gpu_id","name":"gpu_id","type":"INT","widget":{"name":"gpu_id"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[195]},{"localized_name":"LATENT","name":"LATENT","type":"LATENT","links":null}],"properties":{"Node name for S&R":"HMPipelineImage"},"widgets_values":[0,"(best quality), highly detailed, ultra-detailed, headshot, person, well-placed five sense organs, looking at the viewer, centered composition, sharp focus, realistic skin texture","",25,1018802962613971,"randomize",2,0]},{"id":82,"type":"HMImagePipelineLoader","pos":[814.7327880859375,202.5532989501953],"size":[298.3472595214844,202],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"checkpoint","name":"checkpoint","shape":7,"type":"COMBO","widget":{"name":"checkpoint"},"link":null},{"localized_name":"lora","name":"lora","shape":7,"type":"COMBO","widget":{"name":"lora"},"link":null},{"localized_name":"vae","name":"vae","shape":7,"type":"COMBO","widget":{"name":"vae"},"link":null},{"localized_name":"version","name":"version","shape":7,"type":"COMBO","widget":{"name":"version"},"link":null},{"localized_name":"stylize","name":"stylize","shape":7,"type":"COMBO","widget":{"name":"stylize"},"link":null},{"localized_name":"deployment","name":"deployment","shape":7,"type":"COMBO","widget":{"name":"deployment"},"link":null},{"localized_name":"lora_scale","name":"lora_scale","shape":7,"type":"FLOAT","widget":{"name":"lora_scale"},"link":null}],"outputs":[{"localized_name":"hm_image_pipeline","name":"hm_image_pipeline","type":"HMIMAGEPIPELINE","links":[190]}],"properties":{"Node name for S&R":"HMImagePipelineLoader"},"widgets_values":["[preset]DisneyPixarCartoonB","None","same as checkpoint","v5","x1","huggingface",1]},{"id":83,"type":"PreviewImage","pos":[1689.1593017578125,650.2534790039062],"size":[210,258],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":195}],"outputs":[],"properties":{"Node name for S&R":"PreviewImage"},"widgets_values":[]},{"id":84,"type":"GetExpression2","pos":[824.4129638671875,694.6199951171875],"size":[191.63729858398438,66],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":201},{"localized_name":"images","name":"images","type":"IMAGE","link":202},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":198}],"outputs":[{"localized_name":"expression","name":"expression","type":"EXPRESSION","links":[196]}],"properties":{"Node name for S&R":"GetExpression2"},"widgets_values":[]},{"id":85,"type":"GetExpression2","pos":[826.0261840820312,1060.0404052734375],"size":[191.63729858398438,66],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":200},{"localized_name":"images","name":"images","type":"IMAGE","link":203},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":199}],"outputs":[{"localized_name":"expression","name":"expression","type":"EXPRESSION","links":[197]}],"properties":{"Node name for S&R":"GetExpression2"},"widgets_values":[]},{"id":60,"type":"GetFaceLandmarks","pos":[518.9132690429688,612.9461669921875],"size":[170.62362670898438,46],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":122},{"localized_name":"images","name":"images","type":"IMAGE","link":121}],"outputs":[{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","links":[143,198]}],"properties":{"Node name for S&R":"GetFaceLandmarks"},"widgets_values":[]},{"id":61,"type":"GetFaceLandmarks","pos":[519.7196655273438,938.032958984375],"size":[170.62362670898438,46],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":129},{"localized_name":"images","name":"images","type":"IMAGE","link":187}],"outputs":[{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","links":[145,199]}],"properties":{"Node name for S&R":"GetFaceLandmarks"},"widgets_values":[]},{"id":2,"type":"HMFaceToolkitsLoader","pos":[45.41996383666992,769.9866333007812],"size":[315,82],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"gpu_id","name":"gpu_id","type":"INT","widget":{"name":"gpu_id"},"link":null},{"localized_name":"deployment","name":"deployment","type":"COMBO","widget":{"name":"deployment"},"link":null}],"outputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","slot_index":0,"links":[122,129,147,149,200,201]}],"properties":{"Node name for S&R":"HMFaceToolkitsLoader"},"widgets_values":[0,"huggingface"]},{"id":58,"type":"LoadImage","pos":[37.4466552734375,260.9000244140625],"size":[315,314],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","slot_index":0,"links":[121,151,202]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["chillout.jpg","image"]},{"id":79,"type":"LoadImage","pos":[52.432804107666016,1018.0931396484375],"size":[274.080078125,314.00006103515625],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[187,188,203]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["ysll.jpg","image"]}],"links":[[121,58,0,60,1,"IMAGE"],[122,2,0,60,0,"FACE_TOOLKITS"],[129,2,0,61,0,"FACE_TOOLKITS"],[143,60,0,67,2,"FACELANDMARKS222"],[145,61,0,69,2,"FACELANDMARKS222"],[147,2,0,67,0,"FACE_TOOLKITS"],[149,2,0,69,0,"FACE_TOOLKITS"],[151,58,0,67,1,"IMAGE"],[187,79,0,61,1,"IMAGE"],[188,79,0,69,1,"IMAGE"],[190,82,0,80,0,"HMIMAGEPIPELINE"],[191,67,0,80,1,"HEAD_POSE"],[193,69,0,80,3,"HEAD_POSE"],[195,80,0,83,0,"IMAGE"],[196,84,0,80,2,"EXPRESSION"],[197,85,0,80,4,"EXPRESSION"],[198,60,0,84,2,"FACELANDMARKS222"],[199,61,0,85,2,"FACELANDMARKS222"],[200,2,0,85,0,"FACE_TOOLKITS"],[201,2,0,84,0,"FACE_TOOLKITS"],[202,58,0,84,1,"IMAGE"],[203,79,0,85,1,"IMAGE"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8264462809917358,"offset":[459.39712102477415,-14.59995707513657]},"frontendVersion":"1.19.2"},"version":0.4} \ No newline at end of file +{ + "2": { + "inputs": { + "gpu_id": 0, + "deployment": "huggingface" + }, + "class_type": "HMFaceToolkitsLoader", + "_meta": { + "title": "Load Face Toolkits" + } + }, + "58": { + "inputs": { + "image": "chillout.jpg" + }, + "class_type": "LoadImage", + "_meta": { + "title": "Load Image" + } + }, + "60": { + "inputs": { + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "58", + 0 + ] + }, + "class_type": "GetFaceLandmarks", + "_meta": { + "title": "Get Face Landmarks" + } + }, + "61": { + "inputs": { + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "79", + 0 + ] + }, + "class_type": "GetFaceLandmarks", + "_meta": { + "title": "Get Face Landmarks" + } + }, + "67": { + "inputs": { + "crop": true, + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "58", + 0 + ], + "landmarks": [ + "60", + 0 + ] + }, + "class_type": "GetHeadPose", + "_meta": { + "title": "Get Head Pose" + } + }, + "69": { + "inputs": { + "crop": true, + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "79", + 0 + ], + "landmarks": [ + "61", + 0 + ] + }, + "class_type": "GetHeadPose", + "_meta": { + "title": "Get Head Pose" + } + }, + "79": { + "inputs": { + "image": "ysll.jpg" + }, + "class_type": "LoadImage", + "_meta": { + "title": "Load Image" + } + }, + "80": { + "inputs": { + "trans_ratio": 0, + "prompt": "(best quality), highly detailed, ultra-detailed, headshot, person, well-placed five sense organs, looking at the viewer, centered composition, sharp focus, realistic skin texture", + "negative_prompt": "", + "steps": 25, + "seed": 452553676269313, + "guidance_scale": 2, + "gpu_id": 0, + "hm_image_pipeline": [ + "82", + 0 + ], + "ref_head_pose": [ + "67", + 0 + ], + "ref_expression": [ + "84", + 0 + ], + "drive_head_pose": [ + "69", + 0 + ], + "drive_expression": [ + "85", + 0 + ] + }, + "class_type": "HMPipelineImage", + "_meta": { + "title": "HelloMeme Image Pipeline" + } + }, + "82": { + "inputs": { + "checkpoint": "[preset]DisneyPixarCartoonB", + "lora": "None", + "vae": "same as checkpoint", + "version": "v5", + "stylize": "x1", + "deployment": "huggingface", + "lora_scale": 1 + }, + "class_type": "HMImagePipelineLoader", + "_meta": { + "title": "Load HelloMemeImage Pipeline" + } + }, + "83": { + "inputs": { + "images": [ + "80", + 0 + ] + }, + "class_type": "PreviewImage", + "_meta": { + "title": "Preview Image" + } + }, + "84": { + "inputs": { + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "58", + 0 + ], + "landmarks": [ + "60", + 0 + ] + }, + "class_type": "GetExpression2", + "_meta": { + "title": "Get Face Expression V2" + } + }, + "85": { + "inputs": { + "face_toolkits": [ + "2", + 0 + ], + "images": [ + "79", + 0 + ], + "landmarks": [ + "61", + 0 + ] + }, + "class_type": "GetExpression2", + "_meta": { + "title": "Get Face Expression V2" + } + } +} \ No newline at end of file diff --git a/example_workflows/video_generation.json b/example_workflows/video_generation.json index b097f09..4a90c4b 100644 --- a/example_workflows/video_generation.json +++ b/example_workflows/video_generation.json @@ -1 +1,819 @@ -{"id":"4c8b7397-a69c-46cc-b553-00e600557365","revision":0,"last_node_id":76,"last_link_id":178,"nodes":[{"id":67,"type":"GetHeadPose","pos":[814.1528930664062,495.9793701171875],"size":[270,98],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":147},{"localized_name":"images","name":"images","type":"IMAGE","link":151},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":143},{"localized_name":"crop","name":"crop","type":"BOOLEAN","widget":{"name":"crop"},"link":null}],"outputs":[{"localized_name":"head_pose","name":"head_pose","type":"HEAD_POSE","links":[166]}],"properties":{"Node name for S&R":"GetHeadPose"},"widgets_values":[false]},{"id":75,"type":"GetExpression2","pos":[814.1359252929688,689.6795654296875],"size":[191.63729858398438,66],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":173},{"localized_name":"images","name":"images","type":"IMAGE","link":175},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":178}],"outputs":[{"localized_name":"expression","name":"expression","type":"EXPRESSION","links":[171]}],"properties":{"Node name for S&R":"GetExpression2"},"widgets_values":[]},{"id":76,"type":"GetExpression2","pos":[833.6573486328125,1042.0396728515625],"size":[191.63729858398438,66],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":174},{"localized_name":"images","name":"images","type":"IMAGE","link":176},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":177}],"outputs":[{"localized_name":"expression","name":"expression","type":"EXPRESSION","links":[172]}],"properties":{"Node name for S&R":"GetExpression2"},"widgets_values":[]},{"id":2,"type":"HMFaceToolkitsLoader","pos":[45.41996383666992,769.9866333007812],"size":[315,82],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"gpu_id","name":"gpu_id","type":"INT","widget":{"name":"gpu_id"},"link":null},{"localized_name":"deployment","name":"deployment","type":"COMBO","widget":{"name":"deployment"},"link":null}],"outputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","slot_index":0,"links":[122,129,147,149,173,174]}],"properties":{"Node name for S&R":"HMFaceToolkitsLoader"},"widgets_values":[0,"huggingface"]},{"id":61,"type":"GetFaceLandmarks","pos":[519.7196655273438,938.032958984375],"size":[170.62362670898438,46],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":129},{"localized_name":"images","name":"images","type":"IMAGE","link":131}],"outputs":[{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","links":[145,177]}],"properties":{"Node name for S&R":"GetFaceLandmarks"},"widgets_values":[]},{"id":60,"type":"GetFaceLandmarks","pos":[518.9132690429688,612.9461669921875],"size":[170.62362670898438,46],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":122},{"localized_name":"images","name":"images","type":"IMAGE","link":121}],"outputs":[{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","links":[143,178]}],"properties":{"Node name for S&R":"GetFaceLandmarks"},"widgets_values":[]},{"id":59,"type":"VHS_VideoCombine","pos":[1658.52490234375,685.6950073242188],"size":[329.22479248046875,633.2247924804688],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":170},{"localized_name":"audio","name":"audio","shape":7,"type":"AUDIO","link":118},{"localized_name":"meta_batch","name":"meta_batch","shape":7,"type":"VHS_BatchManager","link":null},{"localized_name":"vae","name":"vae","shape":7,"type":"VAE","link":null},{"localized_name":"frame_rate","name":"frame_rate","type":"FLOAT","widget":{"name":"frame_rate"},"link":null},{"localized_name":"loop_count","name":"loop_count","type":"INT","widget":{"name":"loop_count"},"link":null},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"format","name":"format","type":"COMBO","widget":{"name":"format"},"link":null},{"localized_name":"pingpong","name":"pingpong","type":"BOOLEAN","widget":{"name":"pingpong"},"link":null},{"localized_name":"save_output","name":"save_output","type":"BOOLEAN","widget":{"name":"save_output"},"link":null}],"outputs":[{"localized_name":"Filenames","name":"Filenames","type":"VHS_FILENAMES","links":null}],"properties":{"Node name for S&R":"VHS_VideoCombine"},"widgets_values":{"frame_rate":15,"loop_count":0,"filename_prefix":"AnimateDiff","format":"video/h264-mp4","pix_fmt":"yuv420p","crf":18,"save_metadata":true,"pingpong":false,"save_output":true,"videopreview":{"hidden":false,"paused":false,"params":{"filename":"AnimateDiff_00611-audio.mp4","subfolder":"","type":"output","format":"video/h264-mp4","frame_rate":15},"muted":false}}},{"id":74,"type":"HMPipelineVideo","pos":[1296.2967529296875,659.4104614257812],"size":[270,330],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"hm_video_pipeline","name":"hm_video_pipeline","type":"HMVIDEOPIPELINE","link":165},{"localized_name":"ref_head_pose","name":"ref_head_pose","type":"HEAD_POSE","link":166},{"localized_name":"ref_expression","name":"ref_expression","type":"EXPRESSION","link":171},{"localized_name":"drive_head_pose","name":"drive_head_pose","type":"HEAD_POSE","link":168},{"localized_name":"drive_expression","name":"drive_expression","type":"EXPRESSION","link":172},{"localized_name":"trans_ratio","name":"trans_ratio","type":"FLOAT","widget":{"name":"trans_ratio"},"link":null},{"localized_name":"patch_overlap","name":"patch_overlap","type":"INT","widget":{"name":"patch_overlap"},"link":null},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"negative_prompt","name":"negative_prompt","type":"STRING","widget":{"name":"negative_prompt"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"guidance_scale","name":"guidance_scale","type":"FLOAT","widget":{"name":"guidance_scale"},"link":null},{"localized_name":"gpu_id","name":"gpu_id","type":"INT","widget":{"name":"gpu_id"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[170]},{"localized_name":"LATENT","name":"LATENT","type":"LATENT","links":null}],"properties":{"Node name for S&R":"HMPipelineVideo"},"widgets_values":[0,4,"(best quality), highly detailed, ultra-detailed, headshot, person, well-placed five sense organs, looking at the viewer, centered composition, sharp focus, realistic skin texture","",25,1055114486951082,"randomize",3.5,0]},{"id":57,"type":"HMVideoPipelineLoader","pos":[798.4796752929688,193.7666015625],"size":[352.79998779296875,202],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"checkpoint","name":"checkpoint","shape":7,"type":"COMBO","widget":{"name":"checkpoint"},"link":null},{"localized_name":"lora","name":"lora","shape":7,"type":"COMBO","widget":{"name":"lora"},"link":null},{"localized_name":"vae","name":"vae","shape":7,"type":"COMBO","widget":{"name":"vae"},"link":null},{"localized_name":"version","name":"version","shape":7,"type":"COMBO","widget":{"name":"version"},"link":null},{"localized_name":"stylize","name":"stylize","shape":7,"type":"COMBO","widget":{"name":"stylize"},"link":null},{"localized_name":"deployment","name":"deployment","shape":7,"type":"COMBO","widget":{"name":"deployment"},"link":null},{"localized_name":"lora_scale","name":"lora_scale","shape":7,"type":"FLOAT","widget":{"name":"lora_scale"},"link":null}],"outputs":[{"localized_name":"hm_video_pipeline","name":"hm_video_pipeline","type":"HMVIDEOPIPELINE","slot_index":0,"links":[165]}],"properties":{"Node name for S&R":"HMVideoPipelineLoader"},"widgets_values":["[preset]DisneyPixarCartoonB","None","same as checkpoint","v4","x1","huggingface",1]},{"id":58,"type":"LoadImage","pos":[37.4466552734375,260.9000244140625],"size":[315,314],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","slot_index":0,"links":[121,151,175]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["chillout.jpg","image"]},{"id":69,"type":"GetHeadPose","pos":[819.799560546875,860.5927734375],"size":[270,98],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"face_toolkits","name":"face_toolkits","type":"FACE_TOOLKITS","link":149},{"localized_name":"images","name":"images","type":"IMAGE","link":153},{"localized_name":"landmarks","name":"landmarks","type":"FACELANDMARKS222","link":145},{"localized_name":"crop","name":"crop","type":"BOOLEAN","widget":{"name":"crop"},"link":null}],"outputs":[{"localized_name":"head_pose","name":"head_pose","type":"HEAD_POSE","links":[168]}],"properties":{"Node name for S&R":"GetHeadPose"},"widgets_values":[true]},{"id":48,"type":"VHS_LoadVideo","pos":[74.54000091552734,996.8733520507812],"size":[247.455078125,680.3645629882812],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"meta_batch","name":"meta_batch","shape":7,"type":"VHS_BatchManager","link":null},{"localized_name":"vae","name":"vae","shape":7,"type":"VAE","link":null},{"localized_name":"video","name":"video","type":"COMBO","widget":{"name":"video"},"link":null},{"localized_name":"force_rate","name":"force_rate","type":"INT","widget":{"name":"force_rate"},"link":null},{"localized_name":"force_size","name":"force_size","type":"COMBO","widget":{"name":"force_size"},"link":null},{"localized_name":"custom_width","name":"custom_width","type":"INT","widget":{"name":"custom_width"},"link":null},{"localized_name":"custom_height","name":"custom_height","type":"INT","widget":{"name":"custom_height"},"link":null},{"localized_name":"frame_load_cap","name":"frame_load_cap","type":"INT","widget":{"name":"frame_load_cap"},"link":null},{"localized_name":"skip_first_frames","name":"skip_first_frames","type":"INT","widget":{"name":"skip_first_frames"},"link":null},{"localized_name":"select_every_nth","name":"select_every_nth","type":"INT","widget":{"name":"select_every_nth"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","slot_index":0,"links":[131,153,176]},{"localized_name":"frame_count","name":"frame_count","type":"INT","links":null},{"localized_name":"audio","name":"audio","type":"AUDIO","slot_index":2,"links":[118]},{"localized_name":"video_info","name":"video_info","type":"VHS_VIDEOINFO","links":null}],"properties":{"Node name for S&R":"VHS_LoadVideo"},"widgets_values":{"video":"tiktok.mp4","force_rate":15,"force_size":"Disabled","custom_width":512,"custom_height":512,"frame_load_cap":0,"skip_first_frames":0,"select_every_nth":1,"choose video to upload":"image","videopreview":{"hidden":false,"paused":false,"params":{"force_rate":15,"frame_load_cap":0,"skip_first_frames":0,"select_every_nth":1,"filename":"tiktok.mp4","type":"input","format":"video/mp4"},"muted":false}}}],"links":[[118,48,2,59,1,"AUDIO"],[121,58,0,60,1,"IMAGE"],[122,2,0,60,0,"FACE_TOOLKITS"],[129,2,0,61,0,"FACE_TOOLKITS"],[131,48,0,61,1,"IMAGE"],[143,60,0,67,2,"FACELANDMARKS222"],[145,61,0,69,2,"FACELANDMARKS222"],[147,2,0,67,0,"FACE_TOOLKITS"],[149,2,0,69,0,"FACE_TOOLKITS"],[151,58,0,67,1,"IMAGE"],[153,48,0,69,1,"IMAGE"],[165,57,0,74,0,"HMVIDEOPIPELINE"],[166,67,0,74,1,"HEAD_POSE"],[168,69,0,74,3,"HEAD_POSE"],[170,74,0,59,0,"IMAGE"],[171,75,0,74,2,"EXPRESSION"],[172,76,0,74,4,"EXPRESSION"],[173,2,0,75,0,"FACE_TOOLKITS"],[174,2,0,76,0,"FACE_TOOLKITS"],[175,58,0,75,1,"IMAGE"],[176,48,0,76,1,"IMAGE"],[177,61,0,76,2,"FACELANDMARKS222"],[178,60,0,75,2,"FACELANDMARKS222"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8264462809917358,"offset":[605.403886161493,-0.08003092767563647]},"frontendVersion":"1.19.2"},"version":0.4} \ No newline at end of file +{ + "id": "4c8b7397-a69c-46cc-b553-00e600557365", + "revision": 0, + "last_node_id": 76, + "last_link_id": 178, + "nodes": [ + { + "id": 75, + "type": "GetExpression2", + "pos": [ + 814.1359252929688, + 689.6795654296875 + ], + "size": [ + 191.63729858398438, + 66 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 173 + }, + { + "name": "images", + "type": "IMAGE", + "link": 175 + }, + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "link": 178 + } + ], + "outputs": [ + { + "name": "expression", + "type": "EXPRESSION", + "links": [ + 171 + ] + } + ], + "properties": { + "Node name for S&R": "GetExpression2" + }, + "widgets_values": [] + }, + { + "id": 76, + "type": "GetExpression2", + "pos": [ + 833.6573486328125, + 1042.0396728515625 + ], + "size": [ + 191.63729858398438, + 66 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 174 + }, + { + "name": "images", + "type": "IMAGE", + "link": 176 + }, + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "link": 177 + } + ], + "outputs": [ + { + "name": "expression", + "type": "EXPRESSION", + "links": [ + 172 + ] + } + ], + "properties": { + "Node name for S&R": "GetExpression2" + }, + "widgets_values": [] + }, + { + "id": 2, + "type": "HMFaceToolkitsLoader", + "pos": [ + 45.41996383666992, + 769.9866333007812 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "slot_index": 0, + "links": [ + 122, + 129, + 147, + 149, + 173, + 174 + ] + } + ], + "properties": { + "Node name for S&R": "HMFaceToolkitsLoader" + }, + "widgets_values": [ + 0, + "huggingface" + ] + }, + { + "id": 61, + "type": "GetFaceLandmarks", + "pos": [ + 519.7196655273438, + 938.032958984375 + ], + "size": [ + 170.62362670898438, + 46 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 129 + }, + { + "name": "images", + "type": "IMAGE", + "link": 131 + } + ], + "outputs": [ + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "links": [ + 145, + 177 + ] + } + ], + "properties": { + "Node name for S&R": "GetFaceLandmarks" + }, + "widgets_values": [] + }, + { + "id": 60, + "type": "GetFaceLandmarks", + "pos": [ + 518.9132690429688, + 612.9461669921875 + ], + "size": [ + 170.62362670898438, + 46 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 122 + }, + { + "name": "images", + "type": "IMAGE", + "link": 121 + } + ], + "outputs": [ + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "links": [ + 143, + 178 + ] + } + ], + "properties": { + "Node name for S&R": "GetFaceLandmarks" + }, + "widgets_values": [] + }, + { + "id": 59, + "type": "VHS_VideoCombine", + "pos": [ + 1658.52490234375, + 685.6950073242188 + ], + "size": [ + 329.22479248046875, + 633.2247924804688 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 170 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": 118 + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 15, + "loop_count": 0, + "filename_prefix": "AnimateDiff", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 18, + "save_metadata": true, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "AnimateDiff_00703-audio.mp4", + "subfolder": "", + "type": "output", + "format": "video/h264-mp4", + "frame_rate": 15 + }, + "muted": false + } + } + }, + { + "id": 74, + "type": "HMPipelineVideo", + "pos": [ + 1296.2967529296875, + 659.4104614257812 + ], + "size": [ + 270, + 330 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "hm_video_pipeline", + "type": "HMVIDEOPIPELINE", + "link": 165 + }, + { + "name": "ref_head_pose", + "type": "HEAD_POSE", + "link": 166 + }, + { + "name": "ref_expression", + "type": "EXPRESSION", + "link": 171 + }, + { + "name": "drive_head_pose", + "type": "HEAD_POSE", + "link": 168 + }, + { + "name": "drive_expression", + "type": "EXPRESSION", + "link": 172 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 170 + ] + }, + { + "name": "LATENT", + "type": "LATENT", + "links": null + } + ], + "properties": { + "Node name for S&R": "HMPipelineVideo" + }, + "widgets_values": [ + 0, + 4, + "(best quality), highly detailed, ultra-detailed, headshot, person, well-placed five sense organs, looking at the viewer, centered composition, sharp focus, realistic skin texture", + "", + 25, + 1075819929118817, + "randomize", + 2.5, + 0 + ] + }, + { + "id": 69, + "type": "GetHeadPose", + "pos": [ + 819.799560546875, + 860.5927734375 + ], + "size": [ + 270, + 98 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 149 + }, + { + "name": "images", + "type": "IMAGE", + "link": 153 + }, + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "link": 145 + } + ], + "outputs": [ + { + "name": "head_pose", + "type": "HEAD_POSE", + "links": [ + 168 + ] + } + ], + "properties": { + "Node name for S&R": "GetHeadPose" + }, + "widgets_values": [ + true + ] + }, + { + "id": 57, + "type": "HMVideoPipelineLoader", + "pos": [ + 798.4796752929688, + 193.7666015625 + ], + "size": [ + 352.79998779296875, + 202 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "hm_video_pipeline", + "type": "HMVIDEOPIPELINE", + "slot_index": 0, + "links": [ + 165 + ] + } + ], + "properties": { + "Node name for S&R": "HMVideoPipelineLoader" + }, + "widgets_values": [ + "[preset]RealisticVisionV60B1", + "None", + "same as checkpoint", + "v5", + "x1", + "huggingface", + 1 + ] + }, + { + "id": 48, + "type": "VHS_LoadVideo", + "pos": [ + 74.54000091552734, + 996.8733520507812 + ], + "size": [ + 247.455078125, + 503.455078125 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 131, + 153, + 176 + ] + }, + { + "name": "frame_count", + "type": "INT", + "links": null + }, + { + "name": "audio", + "type": "AUDIO", + "slot_index": 2, + "links": [ + 118 + ] + }, + { + "name": "video_info", + "type": "VHS_VIDEOINFO", + "links": null + } + ], + "properties": { + "Node name for S&R": "VHS_LoadVideo" + }, + "widgets_values": { + "video": "jgz.mp4", + "force_rate": 15, + "force_size": "Disabled", + "custom_width": 512, + "custom_height": 512, + "frame_load_cap": 0, + "skip_first_frames": 0, + "select_every_nth": 1, + "choose video to upload": "image", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "force_rate": 15, + "frame_load_cap": 0, + "skip_first_frames": 0, + "select_every_nth": 1, + "filename": "jgz.mp4", + "type": "input", + "format": "video/mp4" + }, + "muted": false + } + } + }, + { + "id": 58, + "type": "LoadImage", + "pos": [ + 37.4466552734375, + 260.9000244140625 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 121, + 151, + 175 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "i5.jpg", + "image" + ] + }, + { + "id": 67, + "type": "GetHeadPose", + "pos": [ + 814.1528930664062, + 495.9793701171875 + ], + "size": [ + 270, + 98 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "face_toolkits", + "type": "FACE_TOOLKITS", + "link": 147 + }, + { + "name": "images", + "type": "IMAGE", + "link": 151 + }, + { + "name": "landmarks", + "type": "FACELANDMARKS222", + "link": 143 + } + ], + "outputs": [ + { + "name": "head_pose", + "type": "HEAD_POSE", + "links": [ + 166 + ] + } + ], + "properties": { + "Node name for S&R": "GetHeadPose" + }, + "widgets_values": [ + true + ] + } + ], + "links": [ + [ + 118, + 48, + 2, + 59, + 1, + "AUDIO" + ], + [ + 121, + 58, + 0, + 60, + 1, + "IMAGE" + ], + [ + 122, + 2, + 0, + 60, + 0, + "FACE_TOOLKITS" + ], + [ + 129, + 2, + 0, + 61, + 0, + "FACE_TOOLKITS" + ], + [ + 131, + 48, + 0, + 61, + 1, + "IMAGE" + ], + [ + 143, + 60, + 0, + 67, + 2, + "FACELANDMARKS222" + ], + [ + 145, + 61, + 0, + 69, + 2, + "FACELANDMARKS222" + ], + [ + 147, + 2, + 0, + 67, + 0, + "FACE_TOOLKITS" + ], + [ + 149, + 2, + 0, + 69, + 0, + "FACE_TOOLKITS" + ], + [ + 151, + 58, + 0, + 67, + 1, + "IMAGE" + ], + [ + 153, + 48, + 0, + 69, + 1, + "IMAGE" + ], + [ + 165, + 57, + 0, + 74, + 0, + "HMVIDEOPIPELINE" + ], + [ + 166, + 67, + 0, + 74, + 1, + "HEAD_POSE" + ], + [ + 168, + 69, + 0, + 74, + 3, + "HEAD_POSE" + ], + [ + 170, + 74, + 0, + 59, + 0, + "IMAGE" + ], + [ + 171, + 75, + 0, + 74, + 2, + "EXPRESSION" + ], + [ + 172, + 76, + 0, + 74, + 4, + "EXPRESSION" + ], + [ + 173, + 2, + 0, + 75, + 0, + "FACE_TOOLKITS" + ], + [ + 174, + 2, + 0, + 76, + 0, + "FACE_TOOLKITS" + ], + [ + 175, + 58, + 0, + 75, + 1, + "IMAGE" + ], + [ + 176, + 48, + 0, + 76, + 1, + "IMAGE" + ], + [ + 177, + 61, + 0, + 76, + 2, + "FACELANDMARKS222" + ], + [ + 178, + 60, + 0, + 75, + 2, + "FACELANDMARKS222" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.8264462809917358, + "offset": [ + 493.27712102477454, + -69.45337656976547 + ] + }, + "frontendVersion": "1.19.2" + }, + "version": 0.4 +} \ No newline at end of file diff --git a/examples/i5.jpg b/examples/i5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4051104a5d38371f10a95563555e1a26fe97f6b GIT binary patch literal 110169 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

%_I3X4GR||k1J@}J#ZJd=U+LRLM^Eu zQ++C43X1f_G}m@%tKn)o zxOhoy(fGzPoT=hx33OtZ+ILoy0fE3}I4C&j#&OT3Lv;*}8hLIWLJ2A)!6b3VJb(K% zsID%Ifkdm%G6hkNr>AZy0O&v$zg{Bf(HOU}e4gVx{{V@uxbrPeOIvZmG*w4L3U-#@ z`yWBm6%?x^mOnkik)M=?$j=?W{dFQMmD>wG;6CVIlma;XIsFAZJ4lSNCgjLGARV!g z4}1!nz3dy1+q_UpiU4U0WD+?i-`70$q-EZ@V1PRBcPY1#o^X2g#Y$k0Zs>N0BLTo1 zWFJC(yHtfPBDW;p1ck?$4-9=iUJlQ5D*E> zr9M;KV;|=gIbS4m8oCb6%XRdk+$46)?nivDU8g>@?v{)su7=HZAb^x(D~7@$EI%eE zkEJv`-glhN8KaYxe2-t3KU^Lu@=DHpxtY)rk{1}q=5s_5$Pl=HECvj?Pzxy|p}^#E z`BbF2t`^Y9fJky-jH5AS3PyK#=}&XyIW4ntjl+Co5Hc`(d-m^4k!?<0_Xi{fJFuX7 zi~*Wh;kktDm@dqI?UfGI2P2c|$>~v}TAC+zIwp)L!e!BLz^OTIK+b4TWQ@e|znVxp zM;P>O2Tt8-k8eB%Ig2(FlY{q^4xsw?!FiXR%gE z3Hyd;Y0^MY;Xyg%`xDReq)4K-+#W)>L-QaCI`qNjgBg+B6>}kMU>t7ar?ohwEh8#< zmZiFt~uF*!LT4&Pe(L*ed|YX$D7s;i^zXlzr9zkUHQ^W$Zyo?Nt z2Ou%rPB|Z1#vI(PZ1l5-%Hc(JKO%qNpq?|g_@n!2c*9(@DAt-zp&p#ae&9aIY#vTP z;CY2J&v9Q3{?v2Dpjv49Q{Ab%Hj!RSzA=?9gt0sf#<0TV+SB( zj-+sV16~CPsm@YeS?c2>>|A2DNh8YbY%c6Hi9AJPcwtwQ?NcC>;X!|uKp(@1iRwlH z>&1MN;!DGIHSA3ojw2%o)+Pk7EW~a&$vHhvI2gg}Usilx)^yDWz$T?HUBXXYnWRPp*om59MnIy`dU(7056Lt>bGTZ~Zr|I9_!9$rgcsQ-D*_2|J z_hDyI8Bz-&>H{DD08su|s-Ye-(K?V=WC9OPqd(`dt8l1j8dOjU{M(4g#&C1%$sM{L z{VE&Ri6$x;O0+`-e}^D)c;}}+zO~(D%+D^}dX!~GAOO4r!N*#LLzX`-K9xF=D~*i1 zyK#U8MJn=JBdtrfLK_$#0~o8`8u1>f;azGCdq%owZf&Fw6pDEUs89|%QYC19oBqRp zwk-ZW@I*Q-)~JwP+hMOaZOn|LXvYkB+&Y}|+=}&28EQ*)Wh5GKak?0;5twog7k2!S zkGux}1A&9o*W|y$uZaF3_;=zPeRoFGC5Xo=w2K?(9M?z56=;*8Us#qa2!V zi*I0C(;$SxV-X3W1&-m8dWBJpsRfQR&2vOudn_k_+w7-1SVLZo>`_0WJU~CSPZs0 z4Y?12j(E*{`{N%1&82Fx!q&`W-M3_Mf~&~D7(90w_2RIooTGGh(vwou!qT*|K;4`H z)SfF@JQmuh1V^32BN^%VRZSLXC6qu;6t_lhL9X+|7K#um#kU7PKQ-l5a$24A(|a6* zKePOrnyj!5yW1EYtElkj?2D}5VbbDpkGr&gje8%%?Hbg|k~~P`a>Ff2cpnetj zPffev+bWb^A_zKn&3Tpal^~CI4N|Q&q4LLte_+2JYI_zPPEtDH_0Mkg+xTPt3AOPj zQ@Fs?8H;j@tA+!Gw}9>B#?!LcW&E_r;K&&&pEGk@E)C@xEAo+!pgba8ytFd z99Ig(-*dg*#+P zYgQL`F9C&jgvMQg1CL)?^6wHd#dC*Z#I9LX@;rN5@YT5j=F%ib z*bw00zi&@U=WcXZZ1!)A5$1CtZ2Q-v>pFaLytA~yRU70R{$)RvayRkX!8^=~!+d9n z8|Ek2dRB0$XJcMi#w{jh+oD>)_Y&D1xj!4Bsi>^c;I)xL+9jM$$B7lKtijC^`9$-o`=4p~rgYqNP0%ld7pJ zvu9oLjkcYIy18XVW02V!z5f7TYV%D?#dkg~)}p(FH2P(ZscZJr{6$(-TnrvSEPpEV zuNVAX)I3vhJo;2k1%ym~(K#EGP#d}t-;cX*J(=K4sBMSxRg}&2j&9oU_ z-c*x+9X|Nu0ORRir`4SpDZZx)#K#eca3c7mPpEtggZkU1qUD#-|LgdHTF-%tu{NG>v^NOAr{&jfWRM}T|pmG zcK7`2<)4dMeWjm>bxRr4NQU|wgjk#axHCdY+H;-<*Vd~KE1A}&lWg$shsu^dB8EVv zBa%5I1(X5P7|6~~UQJZ-{BD;v%uuRGtiEFq3m&;bah?Zk*6jAtXudnMgj|MIyIizu zwODimCzH=7`BqQFn04O*UW>fwX3wH9NW{yS&%5n01*v1F|f(JF${343t=R?%)t!~`} zDzYvHP;>3|ub+eW-n*Yv+9706EA!i~)>rDX(^cgf|mLpz`R=)0`e_*NmK^ z&kg&?89zZ6M&Q{bm83uB^W7KoS6I+KtJezSJ0IpX!&N4?mk6%g__aVN+KwXA4LP=b+G0OGn z>7FV$(iqcvMZCKah2pF;soJW;5-%G_=O5>aftn_h=2ZZ&E;nOw9XlWCNhHukXhy$h zg-6;-qUWd>APke+r+>no7TKCcWo@Bwm~4&R`Nc@+m<9L8w0x{1%9HEpN8?1z9B{0R z=V%{vE)IHspT?(j$8=z9htBeR9Lb9qOoc{pJFwo~Cs2S_fkETBw zwo%#AWFrgn4aXe*J$U1epN%)Y#dMy9Xe{mzmK>G}M&rLAAAJ7+I=L7DTjW+Kes*w2 zJ^2+}L~UK!0x{ri2ZbKT{68vkpgY^_<96&Sq7&bcbJOywvj?d?szi}(L^%ucY#^V< z^R108$W3r04uw~Sjx&t?c)_fdSW@I9i;SjNZX}Px9Q{RfdL6PDnYN$2aqg9A>s@dt^0W?^(FB09|%>p_@W)Yr2k_#}%7(SU9uDkY)@s+>B--KQu@ukhW zy6KuF)X@WRur#JJk;Z*@7suA9{?58UvCuCymgTNzRE>x~bw_-AlU`r{00k}hqI@0u zGkBxRnkCC%&pG=%CZUM`0BX(DR>`CBgW@)%x^9Q8Y32cs z?Frgh8G^{+NQ@9hG6+(0Uo-fI>TAt?@20nAjcrV+kUw`Lf&lA`DPnVyeo@9N-99Ah z3$4KkR7m3T(8&9+cROU0$M;D;g?#<-CsvP7NyV3$0KU9=BUnFtq7(8WGjqoo!5QRs z&3O2D$Cb0!$2RIU*z#YF8t${E_yB29IxN@vtp5Nh3=4hIc^y5EAMDr8TGi6d-hTEE zyArRKK4JdQ&N2@e>&<%~$3GRzt?E`5+C|YR0O?^V+1v zqd$0Inn(vE^26rjVE4~#3<~z}k&J1l7I>JY?i2)qSCyoV*gD~3+(`$Fbm%*E@Ay@F zmz{RGLK`GtFCdRxinP(SxRqm@3$u(7lDY4Uj2}QvP`W6}8Z<52ImjRVdhW8h=gKKY z>5$FlN&%5Z4<(fJ&$r=FvS5`s;2vsHS==igdf@U+HIx?KWX4JEKgNcWIfz|UatC^8 z;Pt6lSP)9*KE3KU`^SO!R5f4{wfrsOeP_a2ta^r%a`Cz_Vz|n-4t`z@Arol93ki{+Kir+yE9*0xV+4v*tosZb=xYr+dWpoT0m+yHkG-;4_M9Y!rP#dcAc z9vK(PW;X$tCV<+vigD2noEg0ymMWjr$QYpw8a#$OlsMpCir26$Zxyi#-{ z+>TFf^~~wGyQ9;MXv=fib#DON>Bd|8XxPGwxXl=5P)W`Qrg8aIpA2ha6hSZ;V}@Ws z0|Kjf7xshjpN(u<$HXCRE|}&=nLNZ{&OpiIuhe?f9yPOq8+5(!?drM?k|cn}!LUX# z-=AK_xNFf;iQR>(c_e#hfV@|050@NMe)9vL zX%i%Kvu};C?i)EE;~!ot)w~b!%Gq`+-jE6BC!g@IpTyy1Ef1%|Ug-S^@Gp(xF|5{i zep(O)z<NTbT-i21)7I=DhR9-aFFttCQqm56xa(ggd{q6j_1_v_zMbLEH4qS|b90V_a3O?p&TuU^N{e-nRb4GTkQcWP><<_fIbvif!Z06DJ|)ckMaKZ`o-7Vx~0 zTJKZkgPq*-obU&?xvmStJ|6Kejb>YoPH9_q7?~s_07p@tmFYTF=AYo`blw&4a=(f6KL$$@$7yq@ zMJ%^>C>l77drKVcWqt@7SRcGQ;E$>`pANwexuMx!MHn{sm-<7ZJ^>R$kbm!`UJuaM z&A+i1g?vxq{{W45df$okJC?oE<&Vn^2{8G8GDzqjX;2vkS;z1IzkFBK{w==JAewu& zpXW_t-tI3l9D*eIago!O=bZ6Vnnlu3hn2%9{p9CT+8mdP?QU+o8=_oZ%glOJsvwc@ zGK8UA=aZgs?eAYQd~efRPVru)0Sd`Ift6DV+rTin=cWgk{{WffSJSuF$i5EyB+nV{h3Ij=Jg-iNDNnw8pT z%$_Nd&rR_hF4=9fiCqkxa7IWYC3DXrsr*otCC$vI?BjxAA3xGRD^J2`uiw6PXJF5agb| z)o`=Ka+yj$xlGWC=l&$@K3|ex+rIAL-N_&lG6sDx4`3_mU)f{D7Iz*mu)0@$_qqtT z{oxpQiwfN5=D`Q8e5&hd9i)*wWacFxG99Ic3X|I$^OIiB`#yM~V%Iz+eJ#O;cr}-^ z+@XkI=&YRwJ@NVTTv)n%^jhq9U}UM*jE}OcZEWtOy0*BHWD{mYbB+T7anmE_1XVwZ zFea(sC@vGsFJx9??S}Hm&*k;SM(=NLsmDAr$V1yQt2b5KgSQ8%`H24jBCq(2UCrRT z`*`F?!?xa_60V~vIv#}m59B^sB$__C%bu0aqxNR;s%d{4G%pd$C`fe_ht70y$(2lH zfX5#-evnvPNp+>#YEmfu{0hV|2a*nbv7C;X>x%q|_-(Fgwsu|`@ddEiHKdJaHo`tv zSvPVz=dV-8O8s51ar)QXaLrWVI%ntnS%>A7I?JiO zYz1PsuG+^)~OO98QQl0KrOhY|*kB;~W74oyb8!Yop*)NH82a#;Re z$I`y79~_^!IINcJB1hp=e7(*_amI7_)OldVe1u`QDuQjpqkO@5 z;D3kL6(^Lhxh^0K!LhjD+k z@ZnjT#yU zB5l|z#44Qh=dMBTk9r6)wq=iD4Yf)jJGjq7)9cgeQFCr(YqG{8n0Zo7A>e-Vqmz#K zJOT6ql4XcxRF+}#vD|P}4&3?^+L*I~RKEEnCpbmqpK<(0^ZL;`-AMsNOuqAxF#z*{ z=|ff_J3WLKQe3ETH#Xo^n;TSggzB1WqmTT}%)!tKYX*RX3JHO0^ za$%bnI{*d5B5~lnBpk&wK{{Z|H%i_cz6aF>)OYwE2>ov3M<4UxPpm;2l zLy?iuohI+pk=)k?Z&gvD825Jh7-UdY@$#!KiNBvi<9`%u5W(R?0g;YN8)6Rag|Mg( zLDZA#J!`~%BD@g0S;Z#lE&(gD)09PAa_lfy1#!P=~+TG`sHZjB+3ta34R zVUVPNrvSTTezoL35Vbj=vzJt~7f?wBqnJRHrU}Ua4s*%(=y|Sc3tJ|3){1o-x!@lW zH5Ao6Ue^{WCB3|PLL+U3eKwvlN~qxa^fl+Y^~p-M`4aR&nNM$_KFpeqbL=IM&Np|&rUJd6|k}F zfiosnLZV%yhd2P_0>g}c8TyLLk_gl*vF*tY6fpGfpZ@?|bSs`sNh?@B(8`+<-cOlu zSTM_EgM-E~%|&okn6jW>_rHjP+#Z!?XrvNHY><#1P78yBk_a68W9ki6l~}e`QoxRb zj1R(|(J>=+*o9s5hQ`u({VE5Iw-J%jtx5AX;VBu(Uj&ZmrEH;#Y}usM_5%Dc%=cJWVIc-kBW_;tgPzV-QT_Zt03y?-oM!|UQ*U??ko{CYJX+xo<> zweK8;7&$f1{e?-pv#b4TZF{gs*M1=VwKau_pnZ2B9IA#a27A{B;xF3&0LNO0Yh5!^ zm?IJaEO#CcVg7lq1Gb9h>KA;L3UE(c6ZqF-;Xetl+wA`Uv~6TnWen~So0cGspX`oL zOb>d|Ww<&kRAW~>$6{5J zbA`EpnM7flNu&f8$j8jPhp!&oilN|-4g+l!-l=VK_gd9%JVAJxR*w|cAhbVfxq+9N z-!sY*x85dq(iTh&0U_+g}#4PGN`a-a_R(r#zM!^3cBoxz0!!~s*U;(SD0n0?Pi?9t!XrN8 z<;wybp63OK=Z-7DJ~7F46xwpi%8snj%r}9^by6|g@3&uC_nk6t?R`g8k{C&QzY5vj zIWsr<$iYScbI_>9Gxxh!g?wqYku0aWfj6{wZ6nAD1#=s|a(Ovybk9IWMR_!3ChU7v zyB|M%TG9-+0`^3OS>YRU+X#GpI%gRpy?Nh`Z{AN0+g;BDa!4ajG_+*9H$pfp2;(4* z_&nylL*owl^wdwXOE;CM8631^;BVdlBZm1w$2qSk@m189UKvDLu+UE=f4p$rK5xC8 zbSDHHbtj>(VvXFRrO!69v|WzJ;AQ2t``%n$#T*5i28lC}+mFqFM;~wu4^G6^SH>+i zOCJ+iJ>A%MhADEFOjrasAY>>#c>{sYeX8H=`4m!pu4wO9%xh~|TrwOuF6u&IfhUjR z$4&qutbA|M{{Xi2>s#9qBR?K=heQwYTT7PW`+*(!lhhuccbxi;)#)A`)o$g}quX#oOr#li z9D+bRV}r&=9qZ*P)3sKTKDLyvK|bdf;paLsYnpUVB#xI~ZjD`r=!ZuGo(4%ip4IwG z`vUmAd{yuY%2O~6WpVa)2*ecOc>3_)UYu9vzMAP5#5B|H=Wul^7q>w9-76~K@WY?s zKaOkdKlmlDi(RcXzXs1f{zbw^DviL8ztihqL6FpRvjn!e^PELWHFC!K#h+hI7@2}D z*J$Hi#y}X8j^`Qw0PFMY7s;MzR4`WVa>1|2=qOcZ;G0A>dR7|*cd^UVqxL+7^zL0_4I@!!+t$I_&p5@V7%C76YfV4%o8 zpc74NvlD5eF$T+oRFuOTC}1POBOG^MPPFD|SQz7vb7!A05tGkzL*6iiCf0W>01m_f z?lGLxe1g%)#$&q&cg=!73{me}Q0RxM801urCFBCf8OT4+6x(F;*n$;7>cQ|h&*X7~ zpTiyLE$xW`l^u@Xl*puH9)KR1^{2Rvmwb_hW&wEMjCb$;O$nm4iaBUxNv40ZT(L2) zBRT7i{=I2umLP@>I`g|Aj&YyJW1526>PRLVS~AC8{c4!cZ2oYxTsRo{ zfaIQs80Qs=j)gdrJGqn1hBVq&gO8LquRS_@8mwiWNY!RifVbXc0Jk~frJc!G*sNzf zWTE7H1JwR>*0*@&QRY7xz~piMeX8`fp>#=X!KLyQJi(4ILFD!0txLH|k1(0yN*~hH{KtHfA6aDzYZ+X#v1JH zU<#`qhm2$&%Dvb)*5P&nWG6zp`-<5LfI@=!RCH-G2f8I6zD|o&? z30PR%O@1w7n(58W)UAl%f+!@OM}I}z5nT2xEBX5P_2U~`x4o9 zfZX1_wc;d*pS-zPz#=3$atY2!8IZ&=9!5q6Ju}4< z7_IK^r?rtKNZDgiA>8hAP8V^<*F6VS;=BjqrRB}cf9dwpt4naA2;wBUjazXbbR@P1 zR^VXu71M@;lGT~i(oV;o_?8(gt>rIeG%;Kvv&uOQ#&9-hEHj{g9Kc0M?ntzw9=nl&J7jkc5KZaq}zXuu;FI3SFiV!10>B3;5#5eoyn z{M`u7dV&BMIL{~Pe!gB0!C5s`As%McsCImaU(=e09p%^voZNgW1BILYb8J!w(nXxuRv zehx=C2d^DJ{duMtmyg~SI5{}vo;v28uelaNBreP5qGeTbaGA%~Ao^4;zF{cGI2>&` z=BzLY36a!>1LVs0C%#YXP`d)=HEa&&>G)GocPC;djHtmKI60;`$>;~trV;LMFLze% zaZ?K^jBhM9#H@KT6V*opn$Bv&R%K}7DnMqzIqjNnl-WB$>y9c#Q6Sn0Ezkkm@}g8R zF;kGra7RK2>r&8&nBZUvZ8?|a+*cgXyKr(d^*t#7+6Ft&aoT_~ahd=#gTbfrSDHZ? zX9zud)|G~XCD@Sk*r0{S-X(y*{PRh)k#K~kv7ZzYImic&xUH=pM3k@Epa4VX1qTP>1mK)iwXRA4Hhn^eLHMm)0!xoqr?bagM!O6kP z0fCe2jPU1tnWN)$OrU=8m=FVZ+HzYX8oFkkqiFiYtUuZa%O%T2H0CB(Xjdz< z5}_GmfrIGah0bfFhTO|~x3*KyaeR)F!Q{b&S0I>6BC597<5p%|V|EViNf<^qce$*j z`Lso^+0*uV_>u9$;)jDi82lZA#w)#ZRd6jeSCp)f6=O4*L}$x|Kv;L=l3nr0z|!$F zaC|-S9nOj34-{#8l33aqY-WU;qZyOSnGCp)p_Sf6D9X+q03BAXF1M!mCsCVQw7+z@ zu!(=NZzI%~{SpJZFrHj0M8Ogth)h>lBWlQoOL~od@rhL8n&h4 z8MW0{EfheKx|{;?u+ycN!&y z*^k5;CB@L)Yzu{sYiTzf+jEvomD+MP@U`aV*hh<`r4Ncfk?Lf)=;3SfOW~JZ%=GUK z%Wt6ggHE!2M*{0iytQ=$X#L#BoPmHiJ*&&UBIuB6dM*9DQlUnHWe3e8=2Anixf^lM z9M__2_mOGZ-k+*l%C4#6OT><2CO}D)NTomrj-&4m=N#g=KNDN#O=n3G2_j*88zryb zVq45mpEdyik)P7OQXJgRx%U+mBLyh+K5h7$Bof-(CA|4#0x^*jsX?%uj1k|SocN7x^bC?9hWJVb*#yH4hk?6VSu6oxA@GAYS zyj^8Fvq$!=I#MHL8wd^n+@q-*fXP$b`d6ZSP&aa4U*FtroI@?Ckw!#p9^G(IjPMT` zIUIqEb5~zXMy7OV&M47Pt6w9ChcBI;UFglI_{WJM}> zbkEF-+Z>L)Yw8&0k{heWTj!8ZAo3(+04T-?Jvro@{Wvw?;_&gOHhn%_SDu1WIXy#K z)SJW>y5g}{vDIQK7A!af+`Y#c zHS#Bmr?{T_Ws*}Imjlgo?^{O|8hJMk2NZQND&u|V;^r9q**dqM?XHr4P zL@qw^sxLy;sz8`PGeyB!GuS$0z3`j!zgE{{SYxNP<#=Z2Xp2 zQfU!f+NYi)1LY+2z$d;3sil(QWm6g;ARL2?;EtUBS*OhbS2q&e{Gj}&%OgJd@9Hzy z)0vULXx&*$5x6b}e-JsUioT+YcC$ryjwzxk3Jl|PsmUbq!TfRgdeh7(=$Tamt_l5q zpM@>NhBykcl1at_sL$v5QY>Od^CN;xvvc!-_3kMNp#&(7vN`0oK@IFEd^rL#Ny#2y z=O0o#dsL2r*T|D|6&PX%O#1QL`gNv=+5~oCy-3Qkr`_YHC$CIk_ollQYoUl`nq;;H zBEDf~Y-Ep24%or#`cvVIggpG@cS^`aMed^`2F^%SRjHoz{M>t|T z4&$7DewpS7hUi!9>PRR=e=sC<>CZe6J-T2}lOn{{zhpg%xKaXo^v||Fp4ACiyAO0Z zq5DO{u#JKO42mBcaCqo;kH}NwnW9B9GJ?`$X_q-(*v>!t^wf(^k}ohk`2Io4!O)?PNj@SY)54x4um%Y||T)MW$DI4rxi|U5mCE5qIrQee=Tg@!G{Uf4+--M-lzl;Z0*jcX+nzVu6!N;00pV>_1=Tv%`d?gSLG+yFB*HOjuf;IfUyJDBYQIg z)MmdN{wnH>Y^7n7cP-4WOE7+NP5|5p1LXsr*yt^=Bm_!JZ zfI5t`@y35j^uLQb*}9iy+a1#tR$ZJbbtj=5ee9pZ731C_xRC1#vOevloI>iXAsc>N zU;+jKJQLIoYt*AIXr&cn%dEe7p~d*~Py*m-&2JjCCo3Yxs6zH!4l|Z)RPO1}ax?E< z-8K8Q6px$4$vW4$J@k)o@s&g>1_r`dG0FT#U&f=Dm7E!Y%KVCvp(EWW zP|DkKRE5Ym_9LIhn(+w!dwEhv-;=k3Jvgmk+mVc(x{qjCBtjIj?dCAV`tiv8d;b7R zjU%&bcWGuKRr{#QKpX!yuBtbih6N~#VQ@2%Q^^?Hk$^!xzVP*_VYd!kDv}0y1F6mhO|BMiVvveM zf}=e26=u%LS&Oh?l#Hg++mt2Qjlp1~W7W9|I`fV?^IJY2@X;BD_R#+N z3DF;Gv1ebINGJ|D!snj6f!3l=l<1{J&Q@k#m83oG!lbdHnIQzXKmZu$XwOU1Q<5`0 z6XB~lUrK21<$;$=n9n3+6ObGX0?F5MfyqBH#(Ez6LW(^iJ3(Yt*%lD#%ANawToIfw zCO|Mfx?-mA_KD>zMJ%O~BchZpuQHi8h548=h5=50yPm%F)oI!;x8e^v_Uz8hV_^zO zEK$k?Y<|u*I4Gb1nHgLRoN@Cq@i|IP$5Mj2CDJs=qPDZXgHd_E(8a~LXUe~tc7dFO zf#(uI;{bZ(b>16_T^*+rTf-gfaH2;O#q!APa9Pp8SNV667%ODqSmPCcNQzK34Kd&% zMwS(V8ABthC?}N%Yn5~>^D7*T0J#FS5cql<*Vp`8BsRKpU+=ipFXhJxy@(~ILYs_< z$!>RWasr&wmvWq9_bT{z!lL~zEF;nt9^&>$(d7!qY%B{9tr;zV0V+0<9r6YaO*$QC z#9l;t95&N5TMg7-Vo@Z`JM3JIr)b9m1nukq!q%pltmxX;h3$2p3F^9K(l(yaUfm0( zl_Y5;F-TFA;hZ#_4xb>vW5BUKiE`HW7YSz+scU^CsT7c~-01@=5|ObWGq*B^Ad$&A z04`~B7i8~ZzMmeI6xTKilUiBpQZlWCaNJ7fH-9JO0YEGeNzbbsbDU>cYrYup*pgjs ze$5hG8Le#x+7+c%is7Su(GYUQ&j0PR{S%R@O? z#?~vtKZbQ53ftMkdoA|uOmD;&0>Nhd2=fRJoNY}4tBsT44 zSqsf^w$#95RxOfL%P$HC7}_&|y1cjceDIL)x5E2R19-*$({pT$(N8YfL++FqfG(=Hm)uLpZR@5Su?PU$+{MiHdWFAfcMmRan z>f7;_wWr$n%KGl!ebPUZaKA7L!Q(37QF!5jIKk`QruhBvE8-0L)y>b3w0nyS+gVmi zD`;=LqT3uW2o)V$a7A$C!j_S7z{&92Z-~0DgLSb7jU`2n0wP%2D}^ql_bbL-PCi1- zvG9N@geM_u#>ZumpQ`3{c=aXLD@xJdw)voTfp9bH5vqw>pHfNJc^|i0dZ>vJ)6y$96ab9=z5VIJZ$Jrl+BZ z*3D|HN$_t`j`PLwT`_z#asVTUDkx?Q>_9l@)N~je^d7(QNh8$l@9wnQRvv5?SBoO$ zfGVUB&rFr;k<*^_;6DpzSbR-yG-(V_%`jcK+HywaBP?-(2+D#7s^-3o_>*O8sA!FI z9ngsmf`(FDh501I0#5{wQc3man$sN_M!a<}!u!~F6M*oe-G6K9D*)K(GPFy)mL1MW zI0rm)jE)9zRP|N4w!D%=fbN6z0V>`O`#U_WSTG@D>ZSu$dlPAh!K4P#K z>$ic(IV9u1J@@=~;oXlT0MSV^ZYX&SIO=_? z;q5N@?(|7-F0~K@Wn_(THmMJgcIPAI4WIHy)jtY#drR+x$SyaTVT*7$Y{t>Bz$1); z3J#qOaAq`A-vs$9=RjlzMWh_fI;0nSjLfki zFt*%*k~$7K{c~0E7B@;m0m&pE>N?ecT3kX@h1y6V{{X~PO9$@vZ^k$S8RomwN!;PE z)=3#v*5}J*;SSP9KPq{PDkUuFycS}hDaU+qkJg;6C&`5&ags{|gVz|LMB83L5y{3r zeYhP*`Sz(Avk`#=M$+exo8<=t(qiABIfImKcy-#3ip~!^D z7^>y4NC!Rt0R43&kpAqx0FX)GjxnFa@+qZe-0sqrX%q!0poZ*u1e4P|=eImmDQa4~WWl3~QNc9lclyKIV@vRbHLz`2*}QH{{Yq${YP>3(HR1n%7@ya^1P6E>7Gt9D#qu8#*>J* z0k|k6@8t2o;~e*@(OO2+e)i%Z$&G~o4TU{<>(}4gzAe0|=B&`TMc;vgj``!)f%T-* zZ^)f*sdCMEA7qd#1_14F4oK$!k<&j@n%L5G<$I<1Fcr4}g#eu6pUSc9;*K=(%7lMa z0}Oi{o~4l*&GzpZChN-?rMjIx?_;?HUQo^&G3ed0NzOoFh) z6!hR0JdQen_*TsN*W0iBL$A+v(Ltp~wxJSjzF9;QNO|kj4myES{5_V_!oLb4)$Z;@ zP^GN5bIB(dkLG;jp38%uO7NcpGYDb; z?V9JSQBkGJ-%FDyOBs)pmsu#I@}K?+KjTR}Me!q0mJ8pt$0n#Eb0$XM8_abC=XMJK zFh4r@r^gz+H@DOMqfG&&xRx|%)the9jO9nm-?;1Ay`T1r@sjFZDvo_l`QTh!UWk>q z3>P3bP?ORUI*&oDtHUJObKDA;*{0VnoK^Fn00Jr}Lx*VdZv=j4N^u4sS8=-;dWdR(!TZIW{_5baW+o zqm!ROoaa1Mi4xe{M6t|bB^h1R6S$m_*Qo80_yT&>Nlr%jSe1`#Ojv@v=OeBUUYv79 z;vwal2sVKpNesZISm%-sN3i_GG0I843xHUF#ylO^KQ1{31Aqtr09*>*(KRm*={^(G z;<(aUd;6H8OF5b~*=z%DEy+129dX$7tdy1Ic1`&Xg>k_dI2@@wWAW%KH177$yIW$k zoE1qFDC0YZ032lCf!7|nH8fVB#Vg1N3yc`bk%PO`k74WU?&3^x2~+0BMv<_`Xz7vA z4uhQb=B=y|Fp(s(Qd%F}Czjb^zkWvE`$!!2IqE95MA_V^mV!dhDLWjoibp-h-T>7= zD!+S?)OF8asjUwW>DISWyUlkPXMvUDDU*-}Hscxk=L4U-aHh_arJH?H(@@l{QfTfZ zFDwrteBd$Mu6CV-;GRG|_yiMsL-4J+*MGFF?xsr{*QoNSu z10OX+noCx12;W;5ydU9tt!~;It7%Ar@&|Vy0hR;;7@-7m*dRCEKXi~sTcCJ$^>qs^ zKIYoiQo7^K36!B#XCXFAwZMpO0GzNmAmoplrCVcZaM$`AwJ_}!&=6G_ppwOu-Exn$DCk^+I6Sk-V8nZsZ%6?TKrj4FeMVVJsrj5lsM+Da(-fh>6+gq}3f{vv!f{{V!mNAqQX+eHL|<%oM}JkUrjw2nS= z-yn{}f$Dl%SSN}uX3%v8Ys>5Se5*LE%K3xLAWOS!Zd|lroF_RLV!=S?lxjMb>TelF zQPZgIlqs82Ce=p{3(mVI(EMV zdbPug(>q^991c}j81Wh45gtHb&AVsa0B5Jst$aZznR{b%b0ilUvx%l?H!kcJ`N>9) zIP)+8$0UXYaymT{Q>j`(XxWXUvXy0)=Hhl(ocyJS?#M#eRRnSdGT0kLsY)8H%{`1N zLzSLe`!f6tpWz?FL*Z`{OQqjmUTPCgZW{F#D0di4ac+^&tav4#01!!F9GriK0-X!N+CcXFY~i}i^_~PPDa$jZ~!hA<>nOmd98g)u)VeBh2%v# z+#t4T;I@JY$z7x zT@QzEMuTAurQ^gTvb1T0tbEL)1&{?1sxAp67i9$f#RMGIk5_cX7^wN09uA&g4(XG4 zZ%fy;3#cNnOFLJ*xw^QWA|M4W(la_?k{}~S3W~%G0!4FvKlopv__ovgCgR>#xtIrA zX0%A8TcMHiV3xo>Vh~O^T$9qf4GT-LG1$Wu)Fo2iY?_Y!mocLT0dp2n8Gce@ToL8v zh{-iM@cdpR)FiyrECX5GGc2}62C5XFx;WDn&v(v{4w!Qh2C3r(6tGz zB(OIxEEcUGSQ!q$LIMhq5R<{iasURt(DC=dPYC=$)c(=&2f=o?5@_;lv}?(krQwvn zmKisO4~8349Dq**)@}a)!VLgvvq<_RYq6zIvj|p2nl~RbY?%2#1TXNIBz-41C;UwS856qP6db z>;w){8T6S9?pzc8wBQZR*BoH+$5E3}{8as)KHVgqCDSx}NK?y2wZ1_im?$c-$am#b z;C#wi@xbJqfm6r+2-0nI?Q2SdS+@P7BP8+T*?y{pd5Ftw`GRVnLZ z(!l04QgN&9-14Z#m!QRXnSyAF8Bi*?0a83_DFBttR&Z`=cnv|89-x)%*T2AQmtvWFVmv<8Rmh6%hf83m$ z0uNoe%M#uC*SP-79wxNC@Yu5u80VS-RqkUOn1ELYu*!f=27eP?Gp*a)!LQtD?<uxdf)-b;}z9@&pPy)ZmTefrAe)B`F7p@t?_}J42=FA>M=?aqo}a* zbgL$j>E9CMg3H3z^G2x~*xrQzr}MpEU~}%dC}S^>_9H@#Ovy_|Up6!Gs!<`7W{(jg6hH zoDPJ8?~45gL{*HOBz|5<*f$^YeJk>d_J8rnO=H7;H;Z{|{Vo}J9Pf+(c=gUJ^&7xG zF0t`vgS77vY3}lUt`#m%032bs9WcO;%bNNg8?Aa0r1~Er#MCWaRa-Mwa}>+EWXl1c zyYmmz(DtZzsAqVU$OHnoJ;3LuPDg69D+^WyaxyZ0VUyn+^ZtJdV#hC#(3ryceR6Y zpEQyq#c_hl2{{}b@t*z9<4N<4`&_o;%3uuo9tM5$`BP+f+vK4k3WJ^r&JP^t1Ky-y zC+uJ=dY)}6}knFIl1#hZeAckIb)5%co@hT>Ny9Tjzw94mOE!dYQ@8h zc~FuE8SFdf@Y*`#6-_RfqR4~=QWjFq56lS2#z*(M@z1{oLv!YS?g5RXJQ0v`M@+7I zcgG{}to2%0rmVFmj#yQJOn{tcW^i$kG1&5P$vtYs-d*36h!Ac609fQ_fz#6!QYczO zB$nwU%@Y7|k&IxFK;yrErC7JOwuV0`r9xS7T0xAQ0o$?YJw`n%MD{C1qTI6tEE*`q z&;?YIrFiF@ewh3!!oat41(Ob&0Wap9^x*w4G1j7nds}w$=8_`ret6dzJ8rH=eq(NgdNQ~zJL45Mq82TFVG4qvLbL36x zqOJIzu2D)fYf+6&G;@DF7xm_TIs9h5j^oAJ)YD%yklCynWFyPkqyW2z_fA^_uXA1@ z<6T7Gv!lukQb^3IQ9uf;bDXwF;9w3ouetn5{{RHH`0c3NKC$Az6X-Td`rX6oQaW8m zmQMo#EK?a_OuFI8^7n#b3JGRV*ghuz0D@NdFHrd3q<+p1@gCFu6WiulE0V^zhrkurfy( zWDHaiM)REVJ7<%DjMoj~i@O`0KHlEmCq8ZDJeQEv>F?#FtQ7!n=}r3`h~Bmv~sn=tAdb741=lDqj}oiHO8juTIfc zK5~Bw#cB49GD%u_tz=aKFc^b|W4XEwst!)x4&q1)PSkum6gDYxw>x7f@-4ZD5Re>Y zvU9g{91g_tam9MRtMHqxvTF6`HHn4o_!4Xo%61_KZ=fs$*Q z)cgm6>8)A9u>7l2iL=n;wTbQnsErT_ zQaIlrxI1GQ87Ji=^Nu}mDy64~?=RYDtfz3{q&u68gw7e8IP1ILf<|#&)~BGotg>md zY7yP7k$^4NK^48!POTE{Z#hW8B<;$OK=}p-KsN)NQ%08G zy=bG7XyfL2q9ANssaEgQk%C7!80bjt?{sUM9TZD-rfu8`hz4+Hky)}v%;kK|paayV zf4p+1x74E4E+Elt8aoLgGov{nj48Xye6BuHSx!bWS8>N$)-^eyYn<|;)vk_y=RrtQ z%aTpbirY#YWt5D72;h9*Qb#~=Dm%?ONE0n1G-a4umTkBIk+|gLPJ0ju$2hLq*Ta{( zWw6t)bSr(#8dg+{JwzBa6WtmNqEKrqnjplDP)weSOLhQ&p zSCYIOifi~&LWcS)11;QE_c7bYdnp5-Fv%&}#YdE&Et~{NxiO4`g!dL(u#tRIC$3PEHra>G&8Ml(!?i-1hQD%u0 zGacECuJiL3#_*eWF$zi@pDHu_J1j!_-$_k6-Z|O{1^dfyxu$K!h(<2WoT$qXnGD%u zxB-M_<1Gz2RHLb5;kSZp^gje$XttVj4Jtc(SffiTLgG1H$wJZ?I&Tk?lHGBgxL(pd z4%+uvipp&^Z?z_^Y_rDD1>XYmz0g2d{H(`u2Y?H7CbKMU%IPxL-94|J6n3%~2%)7a z0+JPx7^WX-896vOJOQP7sNc)0E|qBwtfe(2mFJ2qKkk_R>^}YEVasDBcn!hHp~^hm z%+r$J34VVI+-kO-cAcdQO*>M(YnUX0-)fZra+rsN8(4AIJ@dwejlPunNS|8M5+}E` zGR6CdhnfRqFjlq&fZj(u22-8K1m;fq70!w-E_F!aj$QJ|THqW4vVetgyEq3d$DfpP z2R8Ma%?x;A-qy-{W;WJwL_^OKqd9~*Qp(6WWA6d9;N<`ngKAqEsWi1IXnJOuujwPs z^43SxrP{w`#Ekvk@?L2+p z+rJ7+;J>%(7s%Gon-_{XBvQ}3EWTpDAuwBj8#y4U4etK{9J~elE_^fa$AUZ|@H0== zHSIG>@Q$5jt7>}0@<|+b>ZVDQ5~p-%c7@1wY#b1zNWMjBs_VLDmnmtrM3VE$j!6p0 zBY?kkU97I(bPh9yJdkoPz_;2AHyQ?`t=n8$YPM^UsWSPDyQOE^(yFlAAS~EpmH-xR zGo))c)3Y)55S31MeF|2wf5JzkYAvMcu(#Wxl*a=sd!wBMfB_it*-pe5JDGWBE=k(9 zTTQi}Kzl7h-c+!T$qme_cO0A4{^f*hcP4X@<`yo%;eJz9d?{t8K?RPjKB8{zF(fwj z_NeALB8=cTVA3E&^8p!F1AqY|BaPL5Hu!Hs_|2vKG`jH4r(+S+7frp@{H2yDZe{?f zNSDi(X)oml+mc&?po~mh=kTl8xwT5ymgl2*PWw^ueT&`NYD*o(&8l0iyYE<6l|XjJ zl6hkx4%Nea!#?(!GY+UDL>6J|&-r~yZ2a@ZjTz^XtavoeRHmXzxKnQYoovffVc_-#!oK`HlW}!F4ZwYw!!P?%8n%{!;q}KF5 z?Y%W`t?pz%8c61WC1z;Y7GeUZ3Z!n`w3)nS?!s48-Hx@qMXH?w_f@}!I7&$IxM+|z z{1lO1FvWuqxXZWAhVBN{pIGq*g{eSwoo()sV^1R{DPy*o00`zW<|=O8!39SRk_IXt z9ABRl&8c0!gJYvht6VkonogfHNo5gmS);b|5(Pn#-3x-W}WAS zp`L4d1#QxVV7s=eg8XrS<+flEwMbEt=2qDa#`b1S{+}m|y!R0ZVV2y>6xPLF*9HA~ z3_~$v&q4BzFmo<^F=yfpHs?&&FRgY73Owdkw~!Ds5!^Go9E_ipanKTQ{{R_$cJQ8& zb#H5{c(T&cIZ|tlG)WYM7L1^nIE{*{I?7JM+n0F2=bL^V@t4ExM$7wV)=PV+6GUv@ z-Ao!eqG0NQPz(TBmppNdakvWU_LGgBtYqT`-{g3o#Z7DBw}(7OWvBd4v~-5u6vH;D zrnI*Hcwz}hP}`XE)L?EI;<0sqh4;D?lFQ)Bi~DHEntL5J;#U&SyCw!jg@UrK?5F^^ zJT^-K^gK{$t#=lesNXYPd7=?5lnU(o$_RF{fO!s>#tRl5Gn&kkOnar9Nf$FM^v&f& zZ>`tOl#shwM^X;lfVpk0j1iJ`bt6;biIi#7jIT~sK2`D8guHKM;tNZSV?dDKsDe`z zP#E`lhk+PicL9P42OG)9J#+j!uG(n76e05OW3^k+hWzpq*F76nX z>fPaijB-T4i6sSiM-7EyS0J3ONy=kW2SX7T%b~O}*ql2~OPI~^6}{8=3~F9Z#(Q?k zu?jK)4l#l{0&~=Jj)uN|@XoXSo2*}3GNdZkK4rK;w;{e)90A-MfDShgrG01OpV;@r z-VptfbYF`1KOg)WmiIm;7Up}e6(sVrN@j&&7HmYwWZ{?O+IS_fO?=7XzXuNm>*rOM zMAY?Fj#(|YeU!l-7wZ7us3Aw+!MdyU#WkwmyL$I@ca7;V;pxji5$)mu%TQKN4Ly`pLXqz ze;$8huZf-<@jr+4&kNXUh?h{>o4BA;jgmsj+pygSJv-!e=O3eAu=kGcG)-2*?dJag zK)Q8`bG$E@tO;Ivj*JoMtYvbvMN<}MP^Gttf|LmiiM!&Z;9p@uorbF#kCjF!pV z3H0MU_4YLxAs|rA$&+fSQgO*RIrha!TWUOz%v9}QTn^yi9Aof5=PjL}5E#py%y=p~ zoc(z8{44GjmPhApb33v$3T`=9VlWUO8@A&(q2z=`mtr>zd15dD9mhR5;~w=S4>z0^ z&~H-~U00F^bI0K3Q|>(l)7r%NQ6 zRzsgH&T+ zoca)bMnu137bT3NXO=&Oh$kQ)?{>~T$*Rd1ib*c*8H{8DkmO}fdBD%1KU`IXkld=u zCIsM;NXb%I9G>{j4u49SHnc6>lG@D$qIpry$IC`NIXrhcKVN#W9l)A1_Bh##Ki*Xc z*v1b|I3uSxBNY@@?#M$+w`4@d#zi7B2chr&HD(Klo>g0bHv&Ym9(f0*LB}}h>55iu zT@@dDR6f!nB%{m#ZB5O(KbswS$>-ZX{`k3R510wIM^!<+kEVKX4=0|#mMO7X#}tA^ z%Xw{_g&^mWbDq6H<29iaQ^Do5HnZNdO0hw2Z4r`5-I-BQMmm-_$-o_Q2Q?h)xzkRB zrFlJ(CYfd$`ZXjs04~SD3V0dM2dNmxr?qip&Sy z9$`_F_p`y{k3QDCH{#t3Rq)S&^qmsk>&2cUzX|q9E<;)A7IB7ot}k9Axxqvzk;nI? zWl;NbAnrU}q3M1Vg5o`Y#A+tH2HHpP?Xc6~c0jUAG=W`+ltPS(OOjJ^?cnBY)4A6= zsnS$q)bkGmd?v8?8S%&B7wrch#2Y^m_{YZf*HdV^bYP2ZFHI8hB(9{hfhdj~#mF)M zI3<_N{{UqF0Qhgc1H~RW@vrTZ@gu`JoyUkZ80Cw?eh<^6&Y04hh~TkTRr&Wgh?C|S z6=7h`8QDj3;(w1C4}~;oH2nua(`_TQjKy(bCdG!?AlYqbk0HxT7 z_`~*={{Vu$X&(W+cc*+im%@7HxvJhR)$NV;fnz1U%e$R{rFM`5Jdus@9i18^A($x# zo-n4LEKTO*-!$H>TjkjLyW$s#HKw|@hga11+g;qwnm)O6Yb0w1sSIk<-8@0bds}ON zKgfWB0b+Kkj2iiK#0}sN5Bx{F*EEk0S!fe#)`kmj5hb~|)R#=R`R+9dE}dDv+bbYQ zm~IK?Y~dsUIW1%M(ARZ2A<&k_a4vK`nr-#v)bX2etj0wOs)u9ByNXD?E*)|hX1puK zpAew&jm5;e*Tk?}N(LJ=`!uK`wc-Z4W?n|Y<#Dv{D0w6UQ8~#y$WgqMQafMTGvW5H zH^3RcX&raN+NHOI?z}@5kF8(NtdkTvY;ifXwDSQHI=GK~n?C54J;hrFzF+vg;r{>+ zOuyLXJwDPsUS-s-?yOtMORF#>Xaq`;s=*lt{Za-ky_ty4)%3rNzZ$h)h&mwnSK{49 z?(f1DR+i^Z($@2JrNsMVQF>!QBHyr>*>Erv1BN8mnRx0sY-YZ+u+%LIU0ufwthVl{ z6fY1)6YiNFcDkmSs~kxBzp2rx_s%4oNke;*W=y+I^()pc8orePG9*B1z-(HcpSQ6fboBKeFQY{qw<2H+}&sqp^OL-8y+ z1(mesA!h}Zq^mN{Jo|<+NZS-{MgYl>fRK7;=B*V@Z+ON^F;+*MYyKA1j<~mx%N&!v zfz&?C)`5(76aMQ2{LDwrgc3>M9uFdmX_R&Ng z7eYt7x@nPBlVIp zSv|u~YSXGf<`~RCMoem}mR?l=QlkVYTIc4mwXwOfxLX#tOIwIzxsLV*xn1T0%5vu_ zai zT5GzlxqD{}#(SI9dFK$b+Dx#EWiB_BQl-_FTy1mnD&%B1)x2)C7bI4uCx*1kKM873 z-D)<;Z)F|)DK*1SxJHa*eV;nWNCXuj)DT&OipW_iE2}#Ru5K;ixrS*4iH`2#IaADX zE(r)iN3#x)i<|xVO`E>4nA2Lv{-|Bs`4l zpCH;ohQZ4b{3TSfjw{EuKNEES0FCj!oerSz!Kud`v~O(76i~dNqPEsxRDdu;k@E1z zhOb)F^xIf$@3i}w6|N`2^JFlq#2H;&I;#?&e2goee5psPW(TQdiTU#3&FM;cZDOoSmlwe z?&r44N|E5IgBW-ICS^Nt`9H$ULG(QjOwep6n%d(|wu0(gMTRSs2&*FfksBs5k`@_Y z!Mw~7hG7;)-hnk6i=7VI#%s%WDKWHWOQ=)?S4=V431ASa@aG$V+DYA5MyypuD_+L# z6RCKu4o~)S{{V!$#XkwG?>-^;dgSbs-CbOTo6VLcXu?UgBoVId{{Y6k_PtLe<6o$Y&J4dtA@1z=)q>)JsvCjyNZV8c425&Segzz}|_JQ({GmtAO z%{kp@X-+(lvl*n`SiJKjSBY&LHv7w45MDJQLk25y7aT9QIV4~cw|C+;v(+GP+ZP`oE!?H8JiD0m*&0<9V|buAOe`fi=$FAwUr7dmdC6jv#7sSI1$OXP(SWm|Rz z&>L>kkZ=gvut-FyJ@Q!xx{fB15L+++hv?lpvk(q&N!yW%QnXgZsPiP&sOCHk@Wa6# z4e@TB|EXqS6@|!KS9XAYMoP(T$(x#y`wXAk6VI-=TQhC<$ zN~Pn8!ibfZ?E6BisT+|<&PV}=%|4%P;rnX{?HVAjZh~1a9@+w`8eOCV6uTHH7~PCz zvOpu9-9N(-&mg(d-Y70E7t0XY#UdiE#Ne1^VoL&4?oi|}E%R;!l}WvI5>bVkRx@mT zJ7)1phQbhUY?H`#NR^OA#IXz&335l@3@|q<44fR@2Gdc#vX4|@e=VZNwkvoeS=v_f z6=6Xl&9N681rdOI2k3o+;Sa-)8EYOcyzuSMgmoK-i$(<^w6MN0l}($Nu~`(aG4j|7 zah!k%PL}7y@W|Izmp)~=p57&vDT^^1)<{8CBsm+7;06#X`=ADmJ(7Ct&Oq4tk%HJn+M*@f@k)t4q5LI^qcKu5O~;J%!3Dg3Rbtq;fC^ zgl?pryR(MfS9BX4FHP|^t=0aWER$R-JlCe(WsQolZ#6`bx+3k!+78e#+lVSkNvER+ z@2l=r{>%Q)kQ=){?E8j!Qb8sZyk9#U?YB&AWf>+#UOHt)Vzjwwr@ou}P0W5|?DkUK z38846&ec9+{JVG|mNAS5TolDkaLaWxTDiN42vVQCxB%@6hms|a7~0(c3AsoZU}^U< z-(TzSz}GRXUUICnvp!XD$e7IRH~_9dBy8-bA}z|SQe5QcT$o(H*=74=7Z{$`%0`9G z-~a|=6lCU5Ks<0Zj02jl;gXtmyL)$cd2IgxXSq{umhzU{pO~UZ@=N?fX9qdjdZ{I2 zvl3ohTWNL%HB8Md)N%QU8H#L1A7#N+Qsnc3LV{OlB7I*~zI{&jON#nf?u*46THP7r ziwFwt$SAnMCm`o`Ioxqk6#1;e&+Zv}r+7Q!F^|L3!ycg%KWxSX8xz$YU%>ss+0mDGBi z)^@W+aH(;0THretY%o$8*$xwT$_Mw4%aTTo{hh9~v9+{hHX0|owenXz9bL}m7z(Pa z0Vk5fCvI&{>rpjkrDCOlg33ws%YlB+vF#$bOXXECHr7xS41l=`r#vvoUhHXJ5z-$( zvpU?Di8{3Q7fzRfP17L-9YDtK?`3!g8RP=ipT(M`v^(rKSqWg-=Um&xDm63uRaTo)Zu4dk)L3`_6 z&L76!F7VfeJS^Jhi#%;-Wv1KQ!I@*Tmt~dNk~n~nDBTk0YVIJ7xg?UynLZYH>*1Hg zE9=?566>&PmbMqMtddw>Ga}4{d8Le>d0)*NTPJo-PE=<{Rfglm9v0Pqv?J5*I7^T0 z%|d93+(&_!^S^5*;7be;G7m=0Sn$t)JQ3jE4$B9Fw0mtZuBipo)>cwQ5=R?hJiw?3 zcNmc24ln?~=WdFmZD+YNp+0RkD)^4VKNk3|Nqk49SnD>=Zu6y#U>`mh@s$Bd53}!g z*U*5Slm3Z#Xs3#isKQppS+DE zjM*b03847_W5;NKI7rn8$-(;hh@mLrdn zNJ^h9F!*t{t^zYd-_QCPj?CW=LrTj{^y4SRqzJ?on$Tr6_Z^%1cu#U*%1Tjn% zJ4p;HJI0>?ykP$T6Ex3`9tZKHc6WAmveP+IqB#@{Em7YegSxA_GIuDk!^2t;Cq|hGUrd#9oEt-sl4dWyZJs-l5k6oxWV~U zWr(i7_D%h~ekuO|!7~2xn7($u(i5%yk9^Su& zc}K%f+oSeP__brA-grCXE|nT<;TJ`ZQJ?I_?m~*@IE&y(APl*Te8A*wuT^}rGAk8l z`}tp7oP*Qbt!)o@FiemYU0Lf-7bA}uPob)`JrMT0u%ZbtUg8M?R%*11$>&HF1)q9ne z2-j#+kO4bD4bBK0anIM+y-Mx`Xl0F7Jdk^!DeXo7Ty5|p2P6#o(@MX zK{6jUMJjjg94llu135T8*z5;2EGQtEXPL-PA(d5502m{8BaXy?ae-My$*oNrRJEcrh!jYrQDtXuJ(wtHhSX$Y$>4vn&%{rH z{yg}ptaxYPr^F3f(@oHISBu4$j>0F_uA^C+MY&@h*I$@`@xDG>BBJcZ$Hwp4Q{pw} z!-;+%d_VB}TKEbZ+l@Z&S-QN6)@?wo@mU@VQx5qeQ-myb42cKMK4X~e2TX3(RKWRVO zBg2|*fpKZ@msp>~7cps(!>DVQa=cNyF6h}|gsb^ch~3Effy}3K9i-RBzqIe|;iY(T z-E>8{n8R}=;%SnDxu9EyP;w5}QbY@aNbAV2E$~Oj>F;&TTf;h*r2hcveju}oKRl>I z=SMt+_Y=4h(V@lx92|laR7tg{*D9LidmYZV`%8GUQ@y!uLR~p$`%B$jHKJrOhTa(z z3>My4BYeBJ4uoVjJa5In7~1;T9_CN9BIz$T*=4e1EF`&f3|#;Ue5XYq5P8ofRM(N+ zYu^(uek;P||=-58WUDeqE$j6-n~VuBOy~eD2Qg$6h+uH0?s~`%*8qTHENB zmeMV((nlN#F-Jc++T#NQl_c%PM$qfd&8;>4hN*b|B)E=UM*7!GnM#&bf3yw^jjGNlBf_d5MI`%AM4ucM#C+(L-Q{rfB`Gd0B*vS zexCXm@cyRu%f1UA4nksyty$S*U`xU_P4dUMlent@6>wMhvxQmT&6-M*<(?(*YC0475n$2sSmmf+x;(siX$Ny!*eqsbd1 zl$T1d@f48g&|XI)J?s|AJcuD>RgXXN(;=51KGHz>jzBv?`M#;)4~rK+70-+Gj~mAZ zhiQD*i)|E2B%H@7Qa6AyTWI-}jynwCA8fRW-$JyDUR9Re?JckFp4u4vwOM7|9_0&_ zQlUmZLK|XyoYgH36tjYV4BP3paJ}}QVP|xglPO0nGEU+$((vaTat7958zj@ER!eP2 zsYWtZXyLS<4_oNsOF3?#mhVuow6~1NI($Qu|FvebA!l!nW5R)c(U_U zp5_^)T}FA)BUvBMTX@;c_2L$DLI2*F0l~q@^hi_}C+Gtvzhv7(HOw&tD z(X@gj@)}hUpF0e}W>Pk=Y#q2Eiq)#B3h`o<9TGX6Pg2!&Z6{8WOS_n$gHqHG!E*%C z2m(bKXL~qc`-loRwW7KDf?nSaCs9A(zLzNi>ENTU3Q6mey8@Pnt`r zIb*OWR@^|q`G(ELE^#iOrldBJG(IMs8g`5Q2Hjl&F`@FyqC~$k{EDE4Y)IQT{KdOX zD&xgBmba4K$SmX3bg8C3a^1-yOs^s*TmnlMV8pOpq_B~*nYAl@RxLt5vuJlrUgjfj zZ7g#lG+P^b`fS zK;krj2=)R)00@7Z%pWnwNj{T(pe#Bawbkpa%N@j!KibS;q$$WgYc z&wCAqrYxQX@}ADzNM)8q-72C23QHhu!*SXaM&Kz3Reob%clV z@vnsA@cpg6z2Y5rL`x{%{uoSmEehl^LFQq0FdOy)Ov=KYI(*5=G!m$(ORlF|qw8?# zEqyMXsoW%vU3Dma!+Wwwh)|J89l2uL!vfeFcW-iV82W~zd3hb>=$hUcz#?ndZ(ITt zk2MOgD~?y?&NGf(iD-458%~!?J|eW!{F{i=GKG%XIF>aEq2t+b&mke$V{hGTsOJlr zf2CPzH#YwOYt`hE?F*9cJ)F6~c$A!P$IF00BkvrufmpR0UdF0jjXOluq`10_i_;uY ztdLv9Z*#Fjs^x)4#^A$%a$6+lsIFh*kHCF9u{#{qJFT( zF8!@Fd1XsvFtj0Uu&STU!JkZQ+i1eA(VfGb@GPweZ_YjBr<;a@}P2dedtXXt!%|Y>>kW$866b#3n>g zO34p9S9VF-pkSO4RV^%|w(z~pu(OGTA~)F5!s(6Vv0)6W8jgA4x$A?RYv_8_n)t1? zO&djNt|Umj$*rxfE#y!iYX(TB1OSNG$>VSYFu@A^`n_Go;}}BApzjD+S=os$Z1pG| z85PVEO%o{|VZdg1m4*Q&i3z~Re2rZ@Pk#^3E#-~Mh^}HQYOt-5$Ibv&jB*aO6FEX zF}BrJ-Gm)>f%kTiT=$4Id1BBay=!Z?Fsw_poXSXPRGhop@Y{2c23M(G0jvw_sO8fo z(q)8AXx$@qv?~fUgkvEWa{_q43)GX*(r&kJFfxodc;`Uu2bdR-F}DFuK&g5E010@szD+Y&yS9$vTtjxV z${09yPE^eyEV)+6&Ikt_16-}AB@?1Bmou=-Ta7{dP4)}%9E&7M_PT^j@(3l|NL6&4 z1;EZ5arwCeX~jWva`wI>mrz|y%45Amw=%1|-@Gl50-d-~yMV-JKQjVJ@n3|$1OEVM zzlC2GZ)CpIwHy5&>&{2HyOhi?Bxl(a;yD&Zw=7FD9Bd(W^Mb?KB=FSQuCnp!5loXU zp=nrJG%BwfgoryEU?1mgrBBKZ+%WlY>cTO0PT^0QP};&?y!wskgH6+e>Isx&YYeip z$ia}Kp(lkThRGpE$^bw-U-pji{{Zbx;Gc*Ze7^}iCne2{c8M(QW1@MoO(V!dq>?;J z(J4)eqrTJ0u>j{8893&j{{RS-nzht= zv=;N;$9D_G6jCBU9Sh-K62Y~=LDZACobAf7RHrI$n{-s@x{92yUWEiNNv z@W3~R&vv<*O*S~DKOvJG=W#5`Fn;Md7$fJGB`c+|Ud?Iba-SVM8?5|D_;0QFKfzuj z)qFL5d2}vdn7~w9F5u*C3U;pKU{`P?kPkb9N&72!GvepNUx)ty+5Z3?J|VuXsl}N@GQftZ8)@fr{LZ2C^i^9*en z4mZLGAp>x^9X7Eom6KBN%=)eEtoE9Ga)}VfZwR|A5pamvS64XsNe3V^Z^>czb}xJx zacOZDu$Jp*_DE%x?nj8UX&%>qDoEA>sBp}3bDWGEfx9^-{rep;QBtu&^HaOj8urfC z>hqd0pa)IL^k4Act<}00t$F+;rF8 z64GvM4zGXbTtXo}RC3uj?xbHZ05%d)xx%b3%4)+ij2y7sT7OKB~g;nPTgo21lG}YV~lC_+&PocpEBO*xS_ZjL_!X?h z9P)U8+bxaEmf}lo(mx^GF#*|;!l}q4j31lj>%3d=xAu3_{{UpWAFz1i#IX3f&&9Vl z_r4E?%&?ZiMG-}J1nU|CtB{Nx#DmQYrFtJ$g;gYY_?i%sHTTVRi#h}WF+NyIL8A&=daSfK>q-OUjG2WMD&l^1H%X4ufPnYeS9b$kJ4g9!z{E z@RQ#oJ-dd#KpB48#-DuTXj%7eo&J2pG1B1>0 z1B_&nIPH^x*NDBfY}%Z8-N`JT*H6>s@fGyHXS24o^R8Y%0F3|{ILB_>=eJtf)&3#) zYQ{}Q+u@_z-N|WU_L{!4EY2h_l}TiW$o~LY337p0`7)0#93D#r*3rCmCx!eku1jy= zo?WbX*Wusn^{0;td=1nup|ZWZ zc{Mw`T~Y5E=0^$%dEs?ayX0Rfq5(s22X79%{iojh#CEz4udJl{c0?Lxoi*H1vO^5g zB+QYCPQ?whvjP;e@Y&8h`^MULgZ>-Xr^9asX}X=_K_?dz*a3Guhxc+y;h9vsGCHD( zI^^ZE&(2rg0-wUZIo7^0_@BftuIjf9aRd)ECM#PFBYqPn<|?k-X*OF7a>XqJiM`){(X?eOy& zNLo91SrjrpPs&PTlB!55OL8-drTDAD+UJHe-9t!@S?rFOW3#+7VmR(2mCCrmR9tif z5Wp5-3lb{_#$OBK_@Asx;fsxLQG)MT)gZffxn-AXlo(DNw61cQ1;#d!f=CK{I`BkZ z81S@O2ZwEa}?#}Z^j&+9S#wn88=2c?-cNoyRN4c1C ztAaqzHiGq~qiIQTsx7lxw4zN?IPPXxOokKX75@NN7QvFL!MQOTFm-7Or`rImJW(~n$qjDUw z;yyN#njNjpj-1d~LM6AIEmq>*8DnYOmif03nPmkA1`6c;1GjkBy%n z{4MZ%!?SA^I$g!}kkxlu=$BU#Mwb!D2JEuTUpO69kZ}8n00Xh`!^Da455rd8F)~A^ z+v@fcUdL-Rn+t_g`=%m5-0oefH)W7uHVT(`-{F_TFC6&F*?uAD2ULgqTKvRjd#{#7 z&&wogfXG6ksTndUWhAKiYf&!Fo#ALj+}CkIYvHt82`$nah+vS{RUf0VQr)8I=++QsLWTIeWLkG301i>Z7ioV43z>#$j);ax;D!mqYb^q zrSeJUBE=gAje#ti5G0Gn>|mV7hFZq)e~Ror8Tdx)$6A(&I@;;5-f9ra@ycT_Kgzpy zw$@ip2I4u`!Hx|S>9r)Fh@Doh*>6FH%G*!X;?^~rb)W1vlQsRd(4HxYpK>D-;Z&0A z_qT(S_fIuy=lcr62=ob58*96}SdHD32-7ocA19P0!P@M31ThW#c?(`?`#Jns)V?-& z26=o_;ppt;g60i2G`C4lpKJTZBy*55Sq>S2+MuXEF!VnX>smlawH-Q7vR)Q=ha~OF_0;{5p4swLci!THeWbtyo^mG%oOn z+s~ZGBPx|F6sjiTeZeSpk%4XFzX51p5G=kFUTgXs+TN9Sr`U)!85O^MZ5UY#?Tweq z+>F4X4hwJ?o;qvm34h@WK^&3X>7Z$vFp^0KFl z?%R}aMAv#TiYwcfg5yk%3(J;i50vsV<}eo<$l5YF+qi;8be7f9MY8>7KHvKT%~Fl8;v zWp>iqEN@26cSyB;0_xXL(yrn2B(QPzf~rhIauXRoKnHf@V5AX-Aira+b$4$B5oxnQ zJd(+AZf*ou60$06+yPd$LzQMc0&)B~`ChhU(WTQQk{Prch^LkiSIds_K&}A_!0+A8 z7mz++gKB>g=v!!-m7**!qg`C92YV%jW!*3c1`7Gk3F&}vn@`>!GSm09*Fb4=YK~J> z(eAI}NMe#`M7Odukj7@XF$|uuy|T9s2U!n73mj#rT;E-+msggi_TJKHQJ|9Y;ryA{ z$`}>$t;BD^z+M;TETm)s*J`6e)ivon5vO>D-bwtKE{=@N`^}5AqnO&^$WY7xZKD}e zw1Prb)qWZ*H?Zl_$8ByRwB0oJ%OpX<859OtCIsP>5>#h#C4zjURHHSz6P#MP$UdQG zsA(5^Y*#WxANG>ZH=C$jxt+`fKm@=-pDjl_i~jF8`Kra0){wUnUES*uMKlSRkY3?Y zhbgc_<$30J>_ybb#hOIn$^fwl>Hlqs9YX1P*7LspP z`IlfZ07)k}UQTi`(D}#2FWJSuGii3RX|YSD-st<$ug;k)?opfvR!=mlox>mkHwf|H z3)}oE_;+jY+epy-1>rmUuP(u)vsRYU=zXZ~b0mT=s$%EoF@_;90UQk6RXD|2>PIz6 zJ3Wq)%^vRV#^+1atWDH+2_$WEd1^lDusD;S(5^QNM3r!gWq-a$MOnl6s?Ihr# z4e}1c_Gh&5O`Y7g5PiC650r0N%*sW%+#CHJoyHq(FmuBkh5)He-*awWR5II2Z7)f< zw9qUyEBl+P`(tOM=~{i{w|7m|VUFGj7`Y_5*%&NNL1kbCHa%xZ@h^xkWr;NjZZvC| zthEb$R?ASexwV-HlgOGYmsw$LxyW#=RO4%qN$LI){9@HVW)F-SH^(mp*jZ1k=$8U` zEv}(SBb}ZKJ^>xp2%nFT{_Edj9~&zmL8m`1#}LbQpD?7hD#*x6mv? zMI3S4Lu&+Uz885&!vgMDlK%iU#oM*=({%6DO08dQ%Wrh%8%@-88!KphUk&}e#1lYl z-s<+`hL2+wY%-GUNgxmdHqdgUge>tFf+Ls2*3oIV330M;*D)+N5*Xv#BR*BskZ~?c zDB3q;0FoL#ZrX1S>ErA&!*xByzV9a1-Z>eiY5cIonl;*`Hyq@Q91?bcTAGYnToYPq z+FK}^TbNQ*9!jK1DP=ptN1e^E4(;&Q4o^ zNMVJ#@O|~Zx`b(Hu&w8p6|9hBbNOKxYDH`^MoSD0z-=G_(hnW#y8eUk+h3dE{e`=0 zw|X1Nq*!VYK#=b)N+}*;ZQz+e+z^65EXsDTn*Pc^7QQ}wMDXUJ566FnR~jCvpQxDa)#R8TdCS} zfwZ(RURd3UwJXh9(ko*!vcVkj#*oP7S#~}o87CtOPFMgkR1mp#vU%Ek5F|D-n{P5muHl@w87eDF_HOv2eeuKK()>hk z2G3gg z)@U17p8DM+CO8$Y6`7=ouuD8YDJ$}oB&glU%Mf8gT-HRXx76`(*{}9Ji}p(Krn{|Z z-Z$3ow0{yGCeOq7kUCp@lMS*n0z}OmhiZ%i%LW^Td#0hP-N$;j(BDmR>uyq4Nqp&( znU%5>As@VcPeI5yI43wq47#m^4Iq~3-dLnI@>{gUg21hi3b-t!0;g%mJvOnsb0q7n zf5JF4>7jyKc1dHCY)m#>f`FMzf=Wub0kYeaayD(ciONr$De}`+hQ~jt{{UrwV!OpG z>ooChwkV2PaAOJ@C2$zA^2h~P9zi*7v)ejb%=a&MG>tm#K5@hE`3i;JNCO0ryYqz{ z5?Mp_tp?`n!d5z#ldoUdyiz5gxwG>(!ht-ukSX68kSpK@VTS5dlqRQ)d@bQ$2mC?3 z(!LUWL)A5(1n;MHsLggPSA4710TB0j&~O7VAOmCpzB^TKM=I1 zz0o{D2AB3ZHGL}OtY?56I^mal5f8FLu@${1z?oHK3!9DUX2k45onYhM^X72DZ(QYY}nyRYb5tYiR|f!aOI zgOQSfhz^pHI+gwbKF(KCZ*Y}bYur)2j4u)VJn;96{BNZAn^{|zn@+xg<9kOS%&Hv1 zvK*E;CPu-|3lIt6MkmBCi@HU(kFC5NX{y;psaV;{4xM{B^CyImz&vUJVhLcSP>{h+ z92W;K_IPiM(A(T;KM?G1nms#MxsOY@zh-%*L<;*vk_?632?2)Sa;%4LE1K~q!M_D~ zhvLQG#{ELt=HlvGTZ?(DP54!ca9eOO`C(HLmR5<2WX8uII1AB1s&&1acS#(Wo>|i8 zQPuP?{vv!i@h+|}Exa${8R5F0RhwSYC42I2p`QR4!Yl49pqAqfRIu7Q*X>{Y60_r1 zivBnL#y%O=ej@9(x{rypJ9X1F+sL0XNi0gcB#;7j$k7Xx>;#j_TU=Gi8Xa4I&H>$icNf1W9R z%ehDIi8&*LQdn`*9qOTEguKr^)7IV3+0y*P0^(U+Nf{(41PdSV;tJ~ePLZQsTv}*4VRf-xRpMVM?_X(*NS`@Hasrf7 z_l`zRQRO=+(|-&WrPT?AhV{JuUnz7N2#0rC#aRR}Uj<#!&ms!)-ZT zW^WtL*B&O<^xy4WPR#jgmN7{qHNB);(1nmj*2Yp8FlIU1kVikfcS_Xa ztoJ+%!=4=YvGDn))cz%EPkpQE=4IJ$stco~sZh@z=vqjUREQ9%wS1;>a5n887x5-9 zivBwI;Rd%ijQ-8xttc|-@W-o-u|l@$%z-0snaUWE<=R6r$q&dn`k%yaj9(D`H8|4z z%S{VIy115W%~sGxujQ<`lu7|`SW5d#_sx1x zuFcJdEZ{oj<3%C!`;+^!8C2sZ#rqG3J`T}*W8;k>;+5Y^n_(-uR1vXs1Yw;Yan2e; zfym?L%<&eVrT)?W0)%N^ENCqw^Uj}cl5g4({J? z3QpR)Y<)@l7)^@}aN|GH!s>VJD8%7;^50$y^gZ>56 zybIt6ybq=Lt|=f}L2;_J)F@WsMxHUXPtNG4CkJXA`kkV>8^p4`k_)4vL-wY)c@#9I z42m}axt|Q+V6O_`kbj6iGpi^)B8{oSr!to{ypB`$hVWmFz9U1WXkQBTtt!UQY4Oji z>J2lA6~dCwn9#^@3kD=-g`x)&Xs!k}~UXb0Aez1yyiP-;l8_TL)rFlk*@~C63&%+`Qh?nJA^Px3gULOw3OicuT^MZQsKXjE?`e6+RL^e3Sj0(1Sk?l zFfvZjl}v(srXSgQJI{=E{{R*|QR7CM1&m&$gDXr#;h0AYGnLsGVx`c0*en1%k?bj{ zMWW9bRJVw#)c5)> zvVm;c{n>SB;*42FyNHjnCDW3YvRI3#VT$#D3%_PvVnU_2`DjUC4*;tlyKd_0 z&rO;rAy<+~VvY%Bxf3e1XuA*Jm=_?R$QfMjQMVf_K3l~U?V{>FNi1dZ?{#Z?t8KS8 zS5QfRIGRD_vW=1v0aJiZ@04Yj5~{ryRMD=kdZ34>HOG&J*ZMCVR zp6Ebh^ZclPa(w2nUOSGxNytKn;FYYV#=Od14s*5R(U3FVSzm7^!l#B5cY@1_Wk zf(Oj|x4NWyv{rr~i%+|j;WW)#P@YmGl^N!aMM)!+Ly`st^6cb=AiFODp0(nOEi%|& zYIhJ=$#X85Z5mu!?6shhw*vw1-{}^%cKS`sHt<7qx^?!X$s;?msVt-&+d}-WfPQ210hijihfp^+ znjQT1R}xui($8sbv%+m4$@q)TF|o8?UPoX#_U8b<(lf^A#iOMYbn}rT}b{9kyoMNRCN*R zHa8Q<+U?G{Ac74+1QM90-d#`tR^YKr0=sZzEO&5J150CKw>nw9npeEFNav6dCCsKm zt%YsNCe=Kv?mY|}qX7wFoEIMR1Y>!~5_E!G@YFVwK+<=^wC_*opz|Raq z^CT$HuiB!tF|*4YKV{z{2w9YTil_+bl7&kEc8)8Tiu&(SxLMk5MJ0;L z6cD6W2+1$b;1XQ&NMXr2!8iof-7@m&G}&~-)UQmfGOUtFlAW2i+NFX^kk~lqpO}r! z!7BQCno9E7o*(eP_AT+RhJR{z_|F%_D|WDhQJ(F5jYLg*F*#O=@$xG-nezfmE(&c8 zjlW7kuUOn&U0K>aoM1x{xqEnQ%g9W!f=K`np!;Y2;gTxYO|9N(o357OU1gaU?e8S# zcKC{f!Eug*2O}%U8R0cw4)}({P?FzJ(y!j;Pc4K78JJ_tBoI8(a=?sa4%jK24Jy}^ z)t^HM(1aG9OxY;Y@S~LvB)K{hZx#6nx`4j?e(ed zZglHcy<1ifEHhdNrC{hjT&7jFumohgbI8uYcR-s~TN^Dp2`)q_DMr zL4AL3VW_^V5^1svmW8GlQCi5#k0{Ec1{vq3GmJMZNh`DA?Po>OF7&~DevKN0`&>rS z)ea1AA1v}X{v4g;=Qtc>mTFddpM~MMwVF%Ys33J|ouRq6M8vZx{pm* zU6$D=UKoR%hOO(0ZXudF#_y}&<=h+%GDT$$33~D2p(RUV5SnpiiV&$^f&ZOfQ zqe*To^%yQ^vAc>A(-d=Tn}WzE10TA$ZM^{`2Hl+F2DC1Ymdgy6GC^-B5c%>?d65cv zuFMp9=O^TkJF+;>11hm1n|(qkrV?6Db#)}hIeyq!?JX^> zr^72~`lDKlJIS6akYiO#fxO8G$WkKgtWV6u=bXCmJWuw}{g=E|`$_3KUZ;B9%jr+%_L65aT%ufB+=ckfx_D$cecnc%#|uBEHqE?jX4FG*LaIQU3s> z#d>0A8)A&OA8O|$k_iI<1N*|bHOGu}-E&Pc&2w}`jm+>tonlm$=2-B70TM{TinN)| z0LI``fc5?e_+!U@1o&6s?+)vFjGD%$rfBx|uW@;AI9Z8iP@F_Vff}e?&A0^(lep&G zmYSrN^IPi>+gyby5VnIyBqV#=dzKb~8A^rQk`7h35s+G4p|iMCZrY(2R!e;<=fsyw zdnhH5q)kP?)%0AKnC>29laNRtFv}I@YuPo4MY`JfgY3{c^R^HF$#$>nHr9&T=Dt9Qx9|5NEy~^cscfG7GlVReUR+cDX)C25r*FH_e zsT(8;jj&{n2If0ivZr<>ZNTVUBWM)cCo^aW~INELHwbjHI`fiH? zh$6RJm%Abm6{L`|f-VGL0>ll=f=MSC3NKoDa~SNc=ecK!G<&U+EU_HEPWBR<9H_xq z@^YgttffYz(n;tkYVOOH8gts*rmb*oV@vggyyNyzL0>R{H!A$caV*6~ep1|=ivAG0 z8kMxV&ZZ0(vd4(bcHUe;yoUb(pLfUI1Cn1 zDKjW=1b~Nb4(*vIk`EXen!J+f_D1u>mKt-#Iv=v!`H-}(h^@3P=+aIKe5|Br2a)qF z8|Z~*m6J6tHBCQOk_gPcZJcmPvOB5dJC4seHhGW$pn;M%73zNJbx#ZN{{Zc$@V`g> zrSE@dE4>oyPu1@&*KV$6A7_g3q7x;uY$G7C3A>Sk(QykX#*Yo8P8F~;_qq^{6RU1RxB zn}uEm=V6ja+lFOeDbwVO_r)hZMakb&ro7c{@2)H$(`H98Fh`Iw#6u%8wj1Sa1(mR; zf(9~1b0)0@r*$d&bawO0dx*T_X9~D-9T+3X6z&_kp(l~a4Z5w*Vd6Wh+i7epCoKA+ znP!=Z989=CzH7zQjz9~Zp-)VY8(M3cj}zWH!Oy9&VFPH zKr4{h0XXS+vscR(rs%@g?fgIXtubyRv{~-bB@^D+#PGD9PFYu@ZzK`HILi__b{yZu zkB#3BJ`HJ?FY!|EO|Y?@(Jk>{-ej_fwk%AG6pfHKaPf?62P1`VCH;^-7XH+}6Y-9- zVe!*jzPQn%k}K$b)vSH3mgMeL35G16BBteTGOM?(cK-mhcfr2{d|lD(pTyQrCB22j zvpb-43{@T@mfhv9(1Na%$Mxb?r>y-o56(*~ouoNZToq8Ox7PK)9DG{+ zjyxTx4OhonwXE0P7PpJy4bO(k~DsfRzNupc8@ul5vllKD8v}2;XzZuNdFm z^*;Ll0D?dM*#7_-{BNZv?BV-D=@Z`S8b*&B=pG`03q>pug^jJJAdnqM`AcIUg)CTY zA9 (b f) c h w") if hasattr(self, 'motion_down') and use_motion: - sample = self.motion_down[idx](sample, motion_pad_hidden_states[f'down_{idx}'], emb, num_frames) + sample = self.motion_down[idx](sample, + None if motion_pad_hidden_states is None else motion_pad_hidden_states[f'down_{idx}'], + emb, num_frames) down_block_res_samples += res_samples @@ -251,7 +253,9 @@ class HM3Denoising3D(UNet2DConditionModel, CopyWeights, InsertReferenceAdapter): if hasattr(self, "reference_modules_up") and not reference_hidden_states is None and f'up_{i}' in reference_hidden_states: sample = self.reference_modules_up[i](sample, reference_hidden_states[f'up_{i}'], num_frames) if hasattr(self, 'motion_up') and use_motion: - sample = self.motion_up[i](sample, motion_pad_hidden_states[f'up_{i}'], emb, num_frames) + sample = self.motion_up[i](sample, + None if motion_pad_hidden_states is None else motion_pad_hidden_states[f'up_{i}'], + emb, num_frames) if hasattr(upsample_block, "has_cross_attention") and upsample_block.has_cross_attention: sample = upsample_block( diff --git a/hellomeme/models/hm_adapters.py b/hellomeme/models/hm_adapters.py index 064d3a6..af6fce2 100644 --- a/hellomeme/models/hm_adapters.py +++ b/hellomeme/models/hm_adapters.py @@ -42,7 +42,8 @@ from diffusers.models.lora import adjust_lora_scale_text_encoder from .hm_blocks import (SKReferenceAttentionV3, SKReferenceAttentionV5, SKReferenceAttention, - SKMotionModule) + SKMotionModule, + SKMotionModuleV5) logger = logging.get_logger(__name__) # pylint: disable=invalid-name @@ -183,6 +184,32 @@ class HM3MotionAdapter(ModelMixin, ConfigMixin): ) +class HM5MotionAdapter(ModelMixin, ConfigMixin): + @register_to_config + def __init__(self, block_down_channels: Tuple[int] = (320, 640, 1280, 1280), + block_up_channels: Tuple[int] = (1280, 1280, 1280, 640), + num_attention_heads: int = 8): + super().__init__() + self.motion_down = nn.ModuleList([]) + + for i, in_channels in enumerate(block_down_channels): + self.motion_down.append( + SKMotionModuleV5( + in_channels=in_channels, + num_attention_heads=num_attention_heads, + ) + ) + + self.motion_up = nn.ModuleList([]) + for i, in_channels in enumerate(block_up_channels): + self.motion_up.append( + SKMotionModuleV5( + in_channels=in_channels, + num_attention_heads=num_attention_heads, + ) + ) + + class HMPipeline(StableDiffusionImg2ImgPipeline): @torch.no_grad() def load_lora_weights_sk(self, unet, pretrained_model_name_or_path_or_dict: Union[str, Dict[str, torch.Tensor]], diff --git a/hellomeme/models/hm_blocks.py b/hellomeme/models/hm_blocks.py index bacb6e4..8c3cfd4 100644 --- a/hellomeme/models/hm_blocks.py +++ b/hellomeme/models/hm_blocks.py @@ -14,9 +14,12 @@ import torch.utils.checkpoint from typing import Tuple from einops import rearrange -from diffusers.models.attention import Attention, FeedForward, BasicTransformerBlock +from diffusers.models.attention import Attention, FeedForward +from diffusers.models.unets.unet_motion_model import AnimateDiffTransformer3D from torchvision.models.resnet import BasicBlock -from diffusers.models.embeddings import SinusoidalPositionalEmbedding, get_1d_sincos_pos_embed_from_grid, TimestepEmbedding +from diffusers.models.embeddings import (SinusoidalPositionalEmbedding, + get_1d_sincos_pos_embed_from_grid, + TimestepEmbedding) from diffusers.utils import logging @@ -725,6 +728,51 @@ class SKMotionModule(nn.Module): return hidden_states + self.proj(res_temp) +class SKMotionModuleV5(nn.Module): + def __init__( + self, + in_channels: int, + num_attention_heads: int = 8, + ): + super().__init__() + + self.attn1 = AnimateDiffTransformer3D( + in_channels=in_channels, + num_attention_heads=num_attention_heads, + attention_head_dim=in_channels // num_attention_heads, + dropout=0.0, + double_self_attention=True, + positional_embeddings='sinusoidal', + num_positional_embeddings=32, + + ) + + self.attn_pad = AnimateDiffTransformer3D( + in_channels=in_channels, + num_attention_heads=num_attention_heads, + attention_head_dim=in_channels // num_attention_heads, + dropout=0.0, + double_self_attention=True, + positional_embeddings='sinusoidal', + num_positional_embeddings=32, + ) + + + def forward(self, hidden_states, pad_states, temb, num_frames): + c, h, w = hidden_states.shape[-3:] + res_temp = hidden_states + + if not pad_states is None: + res_temp = rearrange(res_temp, "(b f) c h w -> b c f h w", f=num_frames) + res_temp = torch.cat([pad_states[:,:,:1], res_temp, pad_states[:,:,-1:]], dim=2).contiguous() + res_temp = rearrange(res_temp, "b c f h w -> (b f) c h w") + res_temp = self.attn_pad(res_temp, num_frames=num_frames+2) + res_temp = rearrange(res_temp, "(b f) c h w -> b c f h w", f=num_frames+2).contiguous() + res_temp = rearrange(res_temp[:,:,1:-1], "b c f h w -> (b f) c h w", h=h, w=w) + hidden_states + + res_temp = self.attn1(res_temp, num_frames=num_frames) + return res_temp + # https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/controlnet.py def zero_module(module): for p in module.parameters(): diff --git a/hellomeme/pipelines/__init__.py b/hellomeme/pipelines/__init__.py index ae89f78..d8bb482 100644 --- a/hellomeme/pipelines/__init__.py +++ b/hellomeme/pipelines/__init__.py @@ -12,4 +12,5 @@ from .pipline_hm_image import HMImagePipeline from .pipline_hm_video import HMVideoPipeline from .pipline_hm3_image import HM3ImagePipeline from .pipline_hm3_video import HM3VideoPipeline -from .pipline_hm5_image import HM5ImagePipeline \ No newline at end of file +from .pipline_hm5_image import HM5ImagePipeline +from .pipline_hm5_video import HM5VideoPipeline \ No newline at end of file diff --git a/hellomeme/pipelines/pipline_hm5_video.py b/hellomeme/pipelines/pipline_hm5_video.py new file mode 100644 index 0000000..58ddfda --- /dev/null +++ b/hellomeme/pipelines/pipline_hm5_video.py @@ -0,0 +1,510 @@ +# coding: utf-8 + +""" +@File : hm_pipline_image.py +@Author : Songkey +@Email : songkey@pku.edu.cn +@Date : 5/30/2025 +@Desc : +adapted from: https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +""" + +import copy +from typing import Any, Callable, Dict, List, Optional, Union + +import torch +from einops import rearrange + +from diffusers.callbacks import MultiPipelineCallbacks, PipelineCallback +from diffusers.image_processor import PipelineImageInput +from diffusers.utils import deprecate + +from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img import retrieve_timesteps, retrieve_latents +from diffusers import DPMSolverMultistepScheduler +from diffusers.utils.torch_utils import randn_tensor + +from ..models import (HM3Denoising3D, HM5MotionAdapter, + HM5ReferenceAdapter, HMPipeline, HM5ControlNetBase, HM5SD15ControlProj) + +class HM5VideoPipeline(HMPipeline): + def caryomitosis(self, version='v5', modelscope=False, **kwargs): + if hasattr(self, "unet_ref"): + del self.unet_ref + self.unet_ref = HM3Denoising3D.from_unet2d(self.unet) + self.unet_ref.cpu() + + self.num_frames = 12 + + if not isinstance(self.unet, HM3Denoising3D): + unet = HM3Denoising3D.from_unet2d(unet=self.unet) + # todo: 不够优雅 + del self.unet + self.unet = unet + self.unet.cpu() + + self.vae.cpu() + self.vae_decode = copy.deepcopy(self.vae) + self.text_encoder.cpu() + self.text_encoder_ref = copy.deepcopy(self.text_encoder) + self.safety_checker.cpu() + + def insert_hm_modules(self, version='v5', dtype=torch.float16, modelscope=False): + self.version = version + + if modelscope: + from modelscope import snapshot_download + hm_reference_dir = snapshot_download('songkey/hm5_reference') + hm_control_dir = snapshot_download('songkey/hm5_control_base') + hm_control_proj_dir = snapshot_download('songkey/hm5_control_proj') + hm_motion_dir = snapshot_download('songkey/hm5_motion') + else: + hm_reference_dir = 'songkey/hm5_reference' + hm_control_dir = 'songkey/hm5_control_base' + hm_control_proj_dir = 'songkey/hm5_control_proj' + hm_motion_dir = 'songkey/hm5_motion' + + hm_adapter = HM5ReferenceAdapter.from_pretrained(hm_reference_dir) + motion_adapter = HM5MotionAdapter.from_pretrained(hm_motion_dir) + + if isinstance(self.unet, HM3Denoising3D): + self.unet.insert_reference_adapter(hm_adapter) + self.unet.insert_reference_adapter(motion_adapter) + self.unet.to(device='cpu', dtype=dtype).eval() + + if hasattr(self, "unet_ref"): + self.unet_ref.to(device='cpu', dtype=dtype).eval() + + if hasattr(self, "mp_control"): + del self.mp_control + if hasattr(self, "mp_control_proj"): + del self.mp_control_proj + + self.mp_control = HM5ControlNetBase.from_pretrained(hm_control_dir) + self.mp_control_proj = HM5SD15ControlProj.from_pretrained(hm_control_proj_dir) + self.mp_control_proj.to(device='cpu', dtype=dtype).eval() + self.mp_control.to(device='cpu', dtype=dtype).eval() + + self.vae.to(device='cpu', dtype=dtype).eval() + self.vae_decode.to(device='cpu', dtype=dtype).eval() + self.text_encoder.to(device='cpu', dtype=dtype).eval() + + @torch.no_grad() + def gen_ref_cache(self, latent, prompt_embeds, added_cond_kwargs, device, add_axis=False): + self.unet_ref.to(device=device) + latent = latent.to(device=device, dtype=prompt_embeds.dtype) + latent_model_input = torch.cat([torch.zeros_like(latent), latent]) if self.do_classifier_free_guidance else latent + cached_res = self.unet_ref( + latent_model_input.unsqueeze(2), + 0, + encoder_hidden_states=prompt_embeds, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[1] + self.unet_ref.cpu() + + if add_axis: + for k, v in cached_res.items(): + cached_res[k] = rearrange(v, 'b c h w -> b c 1 h w') + + return dicts_to_device([cached_res], device='cpu')[0] + + @torch.no_grad() + def gen_video(self, indexes, pad_dict, base_noise, depth, control_dict, step, more_params): + device = more_params['device'] + timesteps = more_params['timesteps'] + timestep_cond = more_params['timestep_cond'] + sigmas = more_params['sigmas'] + prompt_embeds = more_params['prompt_embeds'] + cached_res = more_params['cached_res'] + added_cond_kwargs = more_params['added_cond_kwargs'] + extra_step_kwargs = more_params['extra_step_kwargs'] + + num_indexes = len(indexes) + if num_indexes <= self.num_frames: + paded_indexes = indexes + + paded_indexes_noise = list(range(len(indexes))) + + paded_indexes = copy.deepcopy(paded_indexes) + + drive_idx_chunks = [paded_indexes] + drive_idx_chunks_noise = [paded_indexes_noise] + else: + stride = self.num_frames - 1 + paded_indexes = indexes + paded_indexes = copy.deepcopy(paded_indexes) + + num_paded_indexes = len(paded_indexes) + paded_indexes_noise = list(range(num_paded_indexes)) + + drive_idx_chunks = [paded_indexes[i:min(i + self.num_frames, num_paded_indexes)] for i in + range(0, num_paded_indexes, stride)] + drive_idx_chunks_noise = [paded_indexes_noise[i:min(i + self.num_frames, num_paded_indexes)] for i in + range(0, num_paded_indexes, stride)] + + if len(drive_idx_chunks[-1]) == 1: + drive_idx_chunks[-1] = drive_idx_chunks[:-1] + drive_idx_chunks_noise[-1] = drive_idx_chunks_noise[:-1] + + margin_indexes = set() + for chunk in drive_idx_chunks: + margin_indexes.add(chunk[0]) + margin_indexes.add(chunk[-1]) + margin_indexes = sorted(list(margin_indexes)) + + self.gen_video(margin_indexes, pad_dict, base_noise, depth+1, control_dict, step, more_params) + + ## generate latent + scheduler = DPMSolverMultistepScheduler( + num_train_timesteps=1000, + beta_start=0.00085, + beta_end=0.012, + beta_schedule="scaled_linear", + algorithm_type="sde-dpmsolver++", + ) + + + timesteps, _ = retrieve_timesteps(scheduler, step, device, timesteps, sigmas) + + N, C, _, H, W = base_noise.shape + + latents = base_noise[:,:,:len(paded_indexes)] * scheduler.init_noise_sigma + + self.unet.to(device=device) + with self.progress_bar(total=len(timesteps)) as progress_bar: + for i, t in enumerate(timesteps): + progress_bar.set_description(f"D{depth} GEN Frames") + progress_bar.update() + + noise_pred = torch.zeros_like(latents) + noise_pred = torch.cat([noise_pred, noise_pred], dim=0) if \ + self.do_classifier_free_guidance else noise_pred + noise_pred_counter = torch.zeros([1, 1, noise_pred.size(2), 1, 1], dtype=prompt_embeds.dtype).cpu() + + latent_model_input_all = torch.cat([latents] * 2, dim=0) if \ + self.do_classifier_free_guidance else latents + + latent_model_input_all = scheduler.scale_model_input(latent_model_input_all, t) + for chunk, chunk_noise in zip(drive_idx_chunks, drive_idx_chunks_noise): + if self.interrupt: + continue + + control_latent = cat_dicts([control_dict[ix] for ix in chunk], dim=2) + + if chunk[0] in pad_dict and chunk[-1] in pad_dict: + pad_latent = cat_dicts([pad_dict[chunk[0]], pad_dict[chunk[-1]]], dim=2) + + else: + pad_latent = None + + latent_model_input = latent_model_input_all[:, :, chunk_noise].to(device=device) + + noise_pred_chunk = self.unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + reference_hidden_states=dicts_to_device([cached_res], device=device)[0], + control_hidden_states=dicts_to_device([control_latent], device=device)[0], + motion_pad_hidden_states=None if pad_latent is None else dicts_to_device([pad_latent], device=device)[0], + use_motion=True, + timestep_cond=timestep_cond, + cross_attention_kwargs=self.cross_attention_kwargs, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0].cpu() + + noise_pred[:, :, chunk_noise] = noise_pred[:, :, chunk_noise] + noise_pred_chunk + noise_pred_counter[:, :, chunk_noise] = noise_pred_counter[:, :, chunk_noise] + 1 + + noise_pred = noise_pred / noise_pred_counter + if self.do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_text - noise_pred_uncond) + latents = scheduler.step(noise_pred.cpu(), t, latents, + **extra_step_kwargs, return_dict=False)[0] + self.unet.cpu() + + if depth == 0: + return latents[:,:,:num_indexes] + else: + for chunk, chunk_noise in zip(drive_idx_chunks, drive_idx_chunks_noise): + for idx, idx_noise in zip(chunk, chunk_noise): + # if not idx in pad_dict: + pad_dict[idx] = self.gen_ref_cache(latents[:,:,idx_noise], prompt_embeds, + added_cond_kwargs, device, add_axis=True) + + @torch.no_grad() + def __call__( + self, + prompt: Union[str, List[str]] = None, + image: PipelineImageInput = None, + chunk_overlap: int = 4, + drive_params: Dict[str, Any] = None, + strength: float = 0.8, + num_inference_steps: Optional[int] = 50, + timesteps: List[int] = None, + sigmas: List[float] = None, + guidance_scale: Optional[float] = 7.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + eta: Optional[float] = 0.0, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + prompt_embeds: Optional[torch.Tensor] = None, + negative_prompt_embeds: Optional[torch.Tensor] = None, + ip_adapter_image: Optional[PipelineImageInput] = None, + ip_adapter_image_embeds: Optional[List[torch.Tensor]] = None, + output_type: Optional[str] = "pil", + device: Optional[str] = "cpu", + return_dict: bool = True, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + clip_skip: int = None, + callback_on_step_end: Optional[ + Union[Callable[[int, int, Dict], None], PipelineCallback, MultiPipelineCallbacks] + ] = None, + callback_on_step_end_tensor_inputs: List[str] = ["latents"], + **kwargs, + ): + callback = kwargs.pop("callback", None) + callback_steps = kwargs.pop("callback_steps", None) + num_images_per_prompt = 1 + + if callback is not None: + deprecate( + "callback", + "1.0.0", + "Passing `callback` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`", + ) + if callback_steps is not None: + deprecate( + "callback_steps", + "1.0.0", + "Passing `callback_steps` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`", + ) + + if isinstance(callback_on_step_end, (PipelineCallback, MultiPipelineCallbacks)): + callback_on_step_end_tensor_inputs = callback_on_step_end.tensor_inputs + + # 1. Check inputs. Raise error if not correct + self.check_inputs( + prompt, + strength, + callback_steps, + negative_prompt, + prompt_embeds, + negative_prompt_embeds, + ip_adapter_image, + ip_adapter_image_embeds, + callback_on_step_end_tensor_inputs, + ) + + self._guidance_scale = guidance_scale + self._clip_skip = clip_skip + self._cross_attention_kwargs = cross_attention_kwargs + self._interrupt = False + + # 2. Define call parameters + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + # device = self.device + + # 3. Encode input prompt + text_encoder_lora_scale = ( + self.cross_attention_kwargs.get("scale", None) if self.cross_attention_kwargs is not None else None + ) + self.text_encoder_ref.to(device=device) + prompt_embeds_ref, negative_prompt_embeds_ref = self.encode_prompt_sk( + self.text_encoder_ref, + prompt, + device, + num_images_per_prompt, + self.do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + lora_scale=text_encoder_lora_scale, + clip_skip=self.clip_skip, + ) + self.text_encoder_ref.cpu() + + self.text_encoder.to(device=device) + prompt_embeds, negative_prompt_embeds = self.encode_prompt_sk( + self.text_encoder, + prompt, + device, + num_images_per_prompt, + self.do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + lora_scale=text_encoder_lora_scale, + clip_skip=self.clip_skip, + ) + self.text_encoder.cpu() + + # For classifier free guidance, we need to do two forward passes. + # Here we concatenate the unconditional and text embeddings into a single batch + # to avoid doing two forward passes + if self.do_classifier_free_guidance: + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds]) + prompt_embeds_ref = torch.cat([negative_prompt_embeds_ref, prompt_embeds_ref]) + + if ip_adapter_image is not None or ip_adapter_image_embeds is not None: + image_embeds = self.prepare_ip_adapter_image_embeds( + ip_adapter_image, + ip_adapter_image_embeds, + device, + batch_size * num_images_per_prompt, + self.do_classifier_free_guidance, + ) + + # 4. Preprocess image + image = self.image_processor.preprocess(image).to(device=device, dtype=prompt_embeds.dtype) + + raw_video_len = drive_params['condition'].size(2) + + # 6. Prepare latent variables + self.vae.to(device=device) + ref_latents = [ + retrieve_latents(self.vae.encode(image[i: i + 1].to(device=device)), generator=generator) + for i in range(batch_size) + ] + self.vae.cpu() + + ref_latents = torch.cat(ref_latents, dim=0) + ref_latents = self.vae.config.scaling_factor * ref_latents + c, h, w = ref_latents.shape[1:] + + # 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 7.1 Add image embeds for IP-Adapter + added_cond_kwargs = ( + {"image_embeds": image_embeds} + if ip_adapter_image is not None or ip_adapter_image_embeds is not None + else None + ) + + # 7.2 Optionally get Guidance Scale Embedding + timestep_cond = None + if self.unet.config.time_cond_proj_dim is not None: + guidance_scale_tensor = torch.tensor(self.guidance_scale - 1).repeat(batch_size * num_images_per_prompt) + timestep_cond = self.get_guidance_scale_embedding( + guidance_scale_tensor, embedding_dim=self.unet.config.time_cond_proj_dim + ).to(device=device, dtype=prompt_embeds.dtype) + + input_noise = randn_tensor([batch_size, c, raw_video_len + self.num_frames + 1, h, w], + generator=generator, dtype=prompt_embeds.dtype) + + cached_res = self.gen_ref_cache(ref_latents, prompt_embeds_ref, added_cond_kwargs, device) + + control_latents = [] + control_latent1_neg, control_latent2_neg = None, None + self.mp_control.to(device=device) + self.mp_control_proj.to(device=device) + with self.progress_bar(total=raw_video_len) as progress_bar: + for idx in range(raw_video_len): + progress_bar.set_description(f"GEN stage1") + progress_bar.update() + + condition = drive_params['condition'][:, :, idx:idx+1].clone().to(device=device) + + control_latent_input = {} + if 'drive_coeff' in drive_params: + drive_coeff = drive_params['drive_coeff'][:, idx:idx+1].clone().to(device=device) + face_parts = drive_params['face_parts'][:, idx:idx+1].clone().to(device=device) + + if control_latent1_neg is None and self.do_classifier_free_guidance: + control_latent1_neg = self.mp_control(condition=torch.ones_like(condition)*-1, + drive_coeff=torch.zeros_like(drive_coeff), + face_parts=torch.zeros_like(face_parts)) + control_latent1_neg = self.mp_control_proj(control_latent1_neg) + + control_latent1 = self.mp_control(condition=condition, + drive_coeff=drive_coeff, + face_parts=face_parts) + control_latent1 = self.mp_control_proj(control_latent1) + if self.do_classifier_free_guidance: + control_latent1 = cat_dicts([control_latent1_neg, control_latent1], dim=0) + + control_latent_input.update(control_latent1) + else: + pd_fpg = drive_params['pd_fpg'][:, idx:idx+1].clone().to(device=device) + + if control_latent2_neg is None and self.do_classifier_free_guidance: + control_latent2_neg = self.mp_control(condition=torch.ones_like(condition)*-1, + emo_embedding=torch.zeros_like(pd_fpg)) + control_latent2_neg = self.mp_control_proj(control_latent2_neg) + + control_latent2 = self.mp_control(condition=condition, emo_embedding=pd_fpg) + control_latent2 = self.mp_control_proj(control_latent2) + if self.do_classifier_free_guidance: + control_latent2 = cat_dicts([control_latent2_neg, control_latent2], dim=0) + + control_latent_input.update(control_latent2) + control_latents.append(dicts_to_device([control_latent_input], device='cpu')[0]) + + self.mp_control.cpu() + self.mp_control_proj.cpu() + + more_params = dict( + timesteps=timesteps, + timestep_cond=timestep_cond, + sigmas=sigmas, + prompt_embeds=prompt_embeds, + cached_res=cached_res, + device=device, + added_cond_kwargs=added_cond_kwargs, + extra_step_kwargs=extra_step_kwargs, + ) + + indexes = list(range(raw_video_len)) + latents = self.gen_video(indexes, dict(), input_noise, 0, control_latents, num_inference_steps, more_params) + latents_res = latents / self.vae_decode.config.scaling_factor + + self.vae_decode.to(device=device) + res_frames = [] + with self.progress_bar(total=raw_video_len) as progress_bar: + for i in range(raw_video_len): + ret_tensor = self.vae_decode.decode(latents_res[:, :, i, :, :].to(device=device), + return_dict=False, generator=generator)[0] + ret_image = self.image_processor.postprocess(ret_tensor, output_type=output_type) + res_frames.append(ret_image) + progress_bar.set_description(f"VAE DECODE") + progress_bar.update() + self.vae_decode.cpu() + return res_frames, latents_res + + +def merge_dicts(dictl, dictr, wl=0.5): + res = {} + for k in dictl.keys(): + res[k] = dictl[k] * wl + dictr[k] * (1-wl) + return res + + +def cat_dicts(dicts, dim=0): + res = {} + for k in dicts[0].keys(): + res[k] = torch.cat([d[k].clone() for d in dicts], dim=dim) + return res + + +def cat_dicts_ref(dicts): + res = {} + for k in dicts[0].keys(): + res[k] = rearrange(torch.cat([d[k].clone().unsqueeze(1) for d in dicts], dim=1), "b f c h w -> (b f) c h w ") + return res + + +def dicts_to_device(dicts, device): + ret = [] + for d in dicts: + tmpd = {} + for k in d.keys(): + tmpd[k] = d[k].clone().to(device) + ret.append(tmpd) + return ret \ No newline at end of file diff --git a/hellomeme/tools/sr.py b/hellomeme/tools/sr.py new file mode 100644 index 0000000..702483e --- /dev/null +++ b/hellomeme/tools/sr.py @@ -0,0 +1,394 @@ +# coding: utf-8 + +""" +@File : sr.py +@Author : Songkey +@Email : songkey@pku.edu.cn +@Date : 5/30/2025 +@Desc : adapted from: https://github.com/xinntao/Real-ESRGAN +""" + +import torch +from torch import nn as nn +from torch.nn import functional as F +import cv2 +import numpy as np +import math +import os.path as osp + +def pixel_unshuffle(x, scale): + """ Pixel unshuffle. + + Args: + x (Tensor): Input feature with shape (b, c, hh, hw). + scale (int): Downsample ratio. + + Returns: + Tensor: the pixel unshuffled feature. + """ + b, c, hh, hw = x.size() + out_channel = c * (scale**2) + assert hh % scale == 0 and hw % scale == 0 + h = hh // scale + w = hw // scale + x_view = x.view(b, c, h, scale, w, scale) + return x_view.permute(0, 1, 3, 5, 2, 4).reshape(b, out_channel, h, w) + +def make_layer(basic_block, num_basic_block, **kwarg): + """Make layers by stacking the same blocks. + + Args: + basic_block (nn.module): nn.module class for basic block. + num_basic_block (int): number of blocks. + + Returns: + nn.Sequential: Stacked blocks in nn.Sequential. + """ + layers = [] + for _ in range(num_basic_block): + layers.append(basic_block(**kwarg)) + return nn.Sequential(*layers) + +class ResidualDenseBlock(nn.Module): + """Residual Dense Block. + + Used in RRDB block in ESRGAN. + + Args: + num_feat (int): Channel number of intermediate features. + num_grow_ch (int): Channels for each growth. + """ + + def __init__(self, num_feat=64, num_grow_ch=32): + super(ResidualDenseBlock, self).__init__() + self.conv1 = nn.Conv2d(num_feat, num_grow_ch, 3, 1, 1) + self.conv2 = nn.Conv2d(num_feat + num_grow_ch, num_grow_ch, 3, 1, 1) + self.conv3 = nn.Conv2d(num_feat + 2 * num_grow_ch, num_grow_ch, 3, 1, 1) + self.conv4 = nn.Conv2d(num_feat + 3 * num_grow_ch, num_grow_ch, 3, 1, 1) + self.conv5 = nn.Conv2d(num_feat + 4 * num_grow_ch, num_feat, 3, 1, 1) + + self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + + # initialization + # default_init_weights([self.conv1, self.conv2, self.conv3, self.conv4, self.conv5], 0.1) + + def forward(self, x): + x1 = self.lrelu(self.conv1(x)) + x2 = self.lrelu(self.conv2(torch.cat((x, x1), 1))) + x3 = self.lrelu(self.conv3(torch.cat((x, x1, x2), 1))) + x4 = self.lrelu(self.conv4(torch.cat((x, x1, x2, x3), 1))) + x5 = self.conv5(torch.cat((x, x1, x2, x3, x4), 1)) + # Empirically, we use 0.2 to scale the residual for better performance + return x5 * 0.2 + x + + +class RRDB(nn.Module): + """Residual in Residual Dense Block. + + Used in RRDB-Net in ESRGAN. + + Args: + num_feat (int): Channel number of intermediate features. + num_grow_ch (int): Channels for each growth. + """ + + def __init__(self, num_feat, num_grow_ch=32): + super(RRDB, self).__init__() + self.rdb1 = ResidualDenseBlock(num_feat, num_grow_ch) + self.rdb2 = ResidualDenseBlock(num_feat, num_grow_ch) + self.rdb3 = ResidualDenseBlock(num_feat, num_grow_ch) + + def forward(self, x): + out = self.rdb1(x) + out = self.rdb2(out) + out = self.rdb3(out) + # Empirically, we use 0.2 to scale the residual for better performance + return out * 0.2 + x + +class RRDBNet(nn.Module): + """Networks consisting of Residual in Residual Dense Block, which is used + in ESRGAN. + + ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks. + + We extend ESRGAN for scale x2 and scale x1. + Note: This is one option for scale 1, scale 2 in RRDBNet. + We first employ the pixel-unshuffle (an inverse operation of pixelshuffle to reduce the spatial size + and enlarge the channel size before feeding inputs into the main ESRGAN architecture. + + Args: + num_in_ch (int): Channel number of inputs. + num_out_ch (int): Channel number of outputs. + num_feat (int): Channel number of intermediate features. + Default: 64 + num_block (int): Block number in the trunk network. Defaults: 23 + num_grow_ch (int): Channels for each growth. Default: 32. + """ + + def __init__(self, num_in_ch, num_out_ch, scale=4, num_feat=64, num_block=23, num_grow_ch=32): + super(RRDBNet, self).__init__() + self.scale = scale + if scale == 2: + num_in_ch = num_in_ch * 4 + elif scale == 1: + num_in_ch = num_in_ch * 16 + self.conv_first = nn.Conv2d(num_in_ch, num_feat, 3, 1, 1) + self.body = make_layer(RRDB, num_block, num_feat=num_feat, num_grow_ch=num_grow_ch) + self.conv_body = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + # upsample + self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + + self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + + def forward(self, x): + if self.scale == 2: + feat = pixel_unshuffle(x, scale=2) + elif self.scale == 1: + feat = pixel_unshuffle(x, scale=4) + else: + feat = x + feat = self.conv_first(feat) + body_feat = self.conv_body(self.body(feat)) + feat = feat + body_feat + # upsample + feat = self.lrelu(self.conv_up1(F.interpolate(feat, scale_factor=2, mode='nearest'))) + feat = self.lrelu(self.conv_up2(F.interpolate(feat, scale_factor=2, mode='nearest'))) + out = self.conv_last(self.lrelu(self.conv_hr(feat))) + return out + +class RealESRGANer(): + def __init__(self, + scale, + tile=0, + tile_pad=10, + pre_pad=10, + half=True, + device=None, + gpu_id=None, + modelscope=False): + self.scale = scale + self.tile_size = tile + self.tile_pad = tile_pad + self.pre_pad = pre_pad + self.mod_scale = None + self.half = half + + # initialize model + if gpu_id: + self.device = torch.device( + f'cuda:{gpu_id}' if torch.cuda.is_available() else 'cpu') if device is None else device + else: + self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') if device is None else device + + if modelscope: + from modelscope import snapshot_download + model_path = osp.join(snapshot_download('songkey/ESRGAN'), 'RealESRGAN_x2plus.pth') + else: + from huggingface_hub import hf_hub_download + model_path = hf_hub_download('songkey/ESRGAN', filename='RealESRGAN_x2plus.pth') + + loadnet = torch.load(model_path, map_location=torch.device('cpu')) + + # prefer to use params_ema + if 'params_ema' in loadnet: + keyname = 'params_ema' + else: + keyname = 'params' + self.model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=2) + self.model.load_state_dict(loadnet[keyname], strict=True) + + self.model.eval() + self.model = self.model.to(self.device) + if self.half: + self.model = self.model.half() + + def dni(self, net_a, net_b, dni_weight, key='params', loc='cpu'): + """Deep network interpolation. + + ``Paper: Deep Network Interpolation for Continuous Imagery Effect Transition`` + """ + net_a = torch.load(net_a, map_location=torch.device(loc)) + net_b = torch.load(net_b, map_location=torch.device(loc)) + for k, v_a in net_a[key].items(): + net_a[key][k] = dni_weight[0] * v_a + dni_weight[1] * net_b[key][k] + return net_a + + def pre_process(self, img): + """Pre-process, such as pre-pad and mod pad, so that the images can be divisible + """ + img = torch.from_numpy(np.transpose(img, (2, 0, 1))).float() + self.img = img.unsqueeze(0).to(self.device) + if self.half: + self.img = self.img.half() + + # pre_pad + if self.pre_pad != 0: + self.img = F.pad(self.img, (0, self.pre_pad, 0, self.pre_pad), 'reflect') + # mod pad for divisible borders + if self.scale == 2: + self.mod_scale = 2 + elif self.scale == 1: + self.mod_scale = 4 + if self.mod_scale is not None: + self.mod_pad_h, self.mod_pad_w = 0, 0 + _, _, h, w = self.img.size() + if (h % self.mod_scale != 0): + self.mod_pad_h = (self.mod_scale - h % self.mod_scale) + if (w % self.mod_scale != 0): + self.mod_pad_w = (self.mod_scale - w % self.mod_scale) + self.img = F.pad(self.img, (0, self.mod_pad_w, 0, self.mod_pad_h), 'reflect') + + def process(self): + # model inference + self.output = self.model(self.img) + + def tile_process(self): + """It will first crop input images to tiles, and then process each tile. + Finally, all the processed tiles are merged into one images. + + Modified from: https://github.com/ata4/esrgan-launcher + """ + batch, channel, height, width = self.img.shape + output_height = height * self.scale + output_width = width * self.scale + output_shape = (batch, channel, output_height, output_width) + + # start with black image + self.output = self.img.new_zeros(output_shape) + tiles_x = math.ceil(width / self.tile_size) + tiles_y = math.ceil(height / self.tile_size) + + # loop over all tiles + for y in range(tiles_y): + for x in range(tiles_x): + # extract tile from input image + ofs_x = x * self.tile_size + ofs_y = y * self.tile_size + # input tile area on total image + input_start_x = ofs_x + input_end_x = min(ofs_x + self.tile_size, width) + input_start_y = ofs_y + input_end_y = min(ofs_y + self.tile_size, height) + + # input tile area on total image with padding + input_start_x_pad = max(input_start_x - self.tile_pad, 0) + input_end_x_pad = min(input_end_x + self.tile_pad, width) + input_start_y_pad = max(input_start_y - self.tile_pad, 0) + input_end_y_pad = min(input_end_y + self.tile_pad, height) + + # input tile dimensions + input_tile_width = input_end_x - input_start_x + input_tile_height = input_end_y - input_start_y + tile_idx = y * tiles_x + x + 1 + input_tile = self.img[:, :, input_start_y_pad:input_end_y_pad, input_start_x_pad:input_end_x_pad] + + # upscale tile + try: + with torch.no_grad(): + output_tile = self.model(input_tile) + except RuntimeError as error: + print('Error', error) + print(f'\tTile {tile_idx}/{tiles_x * tiles_y}') + + # output tile area on total image + output_start_x = input_start_x * self.scale + output_end_x = input_end_x * self.scale + output_start_y = input_start_y * self.scale + output_end_y = input_end_y * self.scale + + # output tile area without padding + output_start_x_tile = (input_start_x - input_start_x_pad) * self.scale + output_end_x_tile = output_start_x_tile + input_tile_width * self.scale + output_start_y_tile = (input_start_y - input_start_y_pad) * self.scale + output_end_y_tile = output_start_y_tile + input_tile_height * self.scale + + # put tile into output image + self.output[:, :, output_start_y:output_end_y, + output_start_x:output_end_x] = output_tile[:, :, output_start_y_tile:output_end_y_tile, + output_start_x_tile:output_end_x_tile] + + def post_process(self): + # remove extra pad + if self.mod_scale is not None: + _, _, h, w = self.output.size() + self.output = self.output[:, :, 0:h - self.mod_pad_h * self.scale, 0:w - self.mod_pad_w * self.scale] + # remove prepad + if self.pre_pad != 0: + _, _, h, w = self.output.size() + self.output = self.output[:, :, 0:h - self.pre_pad * self.scale, 0:w - self.pre_pad * self.scale] + return self.output + + @torch.no_grad() + def enhance(self, img, outscale=None, alpha_upsampler='realesrgan'): + h_input, w_input = img.shape[0:2] + # img: numpy + img = img.astype(np.float32) + if np.max(img) > 256: # 16-bit image + max_range = 65535 + print('\tInput is a 16-bit image') + else: + max_range = 255 + img = img / max_range + if len(img.shape) == 2: # gray image + img_mode = 'L' + img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) + elif img.shape[2] == 4: # RGBA image with alpha channel + img_mode = 'RGBA' + alpha = img[:, :, 3] + img = img[:, :, 0:3] + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + if alpha_upsampler == 'realesrgan': + alpha = cv2.cvtColor(alpha, cv2.COLOR_GRAY2RGB) + else: + img_mode = 'RGB' + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + + # ------------------- process image (without the alpha channel) ------------------- # + self.pre_process(img) + if self.tile_size > 0: + self.tile_process() + else: + self.process() + output_img = self.post_process() + output_img = output_img.data.squeeze().float().cpu().clamp_(0, 1).numpy() + output_img = np.transpose(output_img[[2, 1, 0], :, :], (1, 2, 0)) + if img_mode == 'L': + output_img = cv2.cvtColor(output_img, cv2.COLOR_BGR2GRAY) + + # ------------------- process the alpha channel if necessary ------------------- # + if img_mode == 'RGBA': + if alpha_upsampler == 'realesrgan': + self.pre_process(alpha) + if self.tile_size > 0: + self.tile_process() + else: + self.process() + output_alpha = self.post_process() + output_alpha = output_alpha.data.squeeze().float().cpu().clamp_(0, 1).numpy() + output_alpha = np.transpose(output_alpha[[2, 1, 0], :, :], (1, 2, 0)) + output_alpha = cv2.cvtColor(output_alpha, cv2.COLOR_BGR2GRAY) + else: # use the cv2 resize for alpha channel + h, w = alpha.shape[0:2] + output_alpha = cv2.resize(alpha, (w * self.scale, h * self.scale), interpolation=cv2.INTER_LINEAR) + + # merge the alpha channel + output_img = cv2.cvtColor(output_img, cv2.COLOR_BGR2BGRA) + output_img[:, :, 3] = output_alpha + + # ------------------------------ return ------------------------------ # + if max_range == 65535: # 16-bit image + output = (output_img * 65535.0).round().astype(np.uint16) + else: + output = (output_img * 255.0).round().astype(np.uint8) + + if outscale is not None and outscale != float(self.scale): + output = cv2.resize( + output, ( + int(w_input * outscale), + int(h_input * outscale), + ), interpolation=cv2.INTER_LANCZOS4) + + return output, img_mode \ No newline at end of file diff --git a/meme.py b/meme.py index 41892e8..81335fc 100644 --- a/meme.py +++ b/meme.py @@ -1,9 +1,7 @@ import json import os import os.path as osp -import random import sys -import subprocess import importlib.metadata cur_dir = osp.dirname(osp.abspath(__file__)) @@ -11,7 +9,7 @@ cur_dir = osp.dirname(osp.abspath(__file__)) installed_packages = [package.name for package in importlib.metadata.distributions()] REQUIRED = { - 'diffusers':'0.31.0', 'transformers':'4.46.3', 'einops':'0.8.0', 'opencv-python':'4.10.0.84', 'tqdm':'4.67.0', + 'diffusers':'0.33.1', 'transformers':'4.46.3', 'einops':'0.8.0', 'opencv-python':'4.10.0.84', 'tqdm':'4.67.0', 'pillow':'10.2.0', 'onnxruntime-gpu':'1.18.1', 'onnx':'1.17.0', 'safetensors':'0.4.5', 'accelerate':'1.1.1', 'peft':'0.13.2', 'modelscope':'', 'huggingface-hub':'' } @@ -54,7 +52,7 @@ from .hellomeme.utils import (get_drive_expression, ) from .hellomeme import (HMImagePipeline, HMVideoPipeline, HM3ImagePipeline, HM3VideoPipeline, - HM5ImagePipeline) + HM5ImagePipeline, HM5VideoPipeline) config_path = osp.join(cur_dir, 'hellomeme', 'model_config.json') with open(config_path, 'r') as f: @@ -169,7 +167,7 @@ class HMVideoPipelineLoader: "checkpoint": (checkpoint_files, ), "lora": (lora_files, ), "vae": (vae_files, ), - "version": (['v1', 'v2', 'v3', 'v4'], ), + "version": (['v1', 'v2', 'v3', 'v4', 'v5'], ), "stylize": (['x1', 'x2'], ), "deployment": (['huggingface', 'modelscope'], ), "lora_scale": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.1}), @@ -192,6 +190,8 @@ class HMVideoPipelineLoader: if version == 'v3' or version == 'v4': pipeline = HM3VideoPipeline.from_pretrained(sd1_5_dir) + elif version == 'v5': + pipeline = HM5VideoPipeline.from_pretrained(sd1_5_dir) else: pipeline = HMVideoPipeline.from_pretrained(sd1_5_dir) pipeline.to(dtype=dtype) diff --git a/pyproject.toml b/pyproject.toml index aee7bab..e3d39a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui_hellomeme" description = "This repository is the official implementation of the [a/HelloMeme](https://arxiv.org/pdf/2410.22901) ComfyUI interface" -version = "1.3.3" +version = "1.3.4" license = {file = "LICENSE"} [project.urls]