From c2b374dcb4feee79b56e7a6a91944e758fe82055 Mon Sep 17 00:00:00 2001 From: Daniel Arrizza Date: Tue, 19 May 2026 17:33:47 -0400 Subject: [PATCH] Add ecommerce_end_to_end template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit End-to-end demo: Ray Data preprocessing → Ray Train embedding fine-tuning → Ray Data batch embedding → Ray Serve multi-model recommendation API with Streamlit UI. Co-Authored-By: Claude Sonnet 4.6 --- BUILD.yaml | 13 + configs/ecommerce_end_to_end/aws.yaml | 7 + configs/ecommerce_end_to_end/gce.yaml | 7 + .../ecommerce_end_to_end/.anyscaleignore | 18 + templates/ecommerce_end_to_end/README.md | 5 + templates/ecommerce_end_to_end/client.py | 83 +++ .../data/demo_images/Air_Purifier.jpg | Bin 0 -> 11179 bytes .../data/demo_images/Bamboo_Cutting_Board.jpg | Bin 0 -> 16534 bytes .../data/demo_images/Bluetooth_Speaker.jpg | Bin 0 -> 11689 bytes .../data/demo_images/Cast_Iron_Skillet.jpg | Bin 0 -> 15788 bytes .../data/demo_images/Clean_Code.jpg | Bin 0 -> 19783 bytes .../demo_images/Cotton_T-Shirt_3-Pack.jpg | Bin 0 -> 7828 bytes .../data/demo_images/Deep_Learning_Book.jpg | Bin 0 -> 17273 bytes .../Designing_Data-Intensive_Apps.jpg | Bin 0 -> 19783 bytes .../data/demo_images/Distributed_Systems.jpg | Bin 0 -> 19783 bytes .../data/demo_images/Dumbbell_Set.jpg | Bin 0 -> 17002 bytes .../data/demo_images/Foam_Roller.jpg | Bin 0 -> 12877 bytes .../data/demo_images/French_Press_Coffee.jpg | Bin 0 -> 11512 bytes .../data/demo_images/Hiking_Boots.jpg | Bin 0 -> 9969 bytes .../data/demo_images/Jump_Rope.jpg | Bin 0 -> 25388 bytes .../data/demo_images/Laptop_Stand.jpg | Bin 0 -> 11516 bytes .../data/demo_images/Leather_Belt.jpg | Bin 0 -> 8262 bytes .../data/demo_images/Mechanical_Keyboard.jpg | Bin 0 -> 11925 bytes .../data/demo_images/Merino_Wool_Sweater.jpg | Bin 0 -> 8618 bytes .../data/demo_images/Portable_SSD_1TB.jpg | Bin 0 -> 7067 bytes .../data/demo_images/Puffer_Vest.jpg | Bin 0 -> 9769 bytes .../data/demo_images/Python_Cookbook.jpg | Bin 0 -> 19783 bytes .../data/demo_images/Resistance_Bands_Set.jpg | Bin 0 -> 8357 bytes .../data/demo_images/Running_Shoes.jpg | Bin 0 -> 9124 bytes .../data/demo_images/Scented_Soy_Candle.jpg | Bin 0 -> 6533 bytes .../data/demo_images/Slim-Fit_Chinos.jpg | Bin 0 -> 19001 bytes .../data/demo_images/Smart_Watch.jpg | Bin 0 -> 9069 bytes .../data/demo_images/Succulent_Set_6-Pack.jpg | Bin 0 -> 23027 bytes .../data/demo_images/The_Algorithm_Design.jpg | Bin 0 -> 19783 bytes .../data/demo_images/USB-C_Hub.jpg | Bin 0 -> 18689 bytes .../data/demo_images/Water_Bottle_32oz.jpg | Bin 0 -> 10452 bytes .../data/demo_images/Waterproof_Jacket.jpg | Bin 0 -> 11765 bytes .../data/demo_images/Webcam_1080p.jpg | Bin 0 -> 5992 bytes .../data/demo_images/Wireless_Headphones.jpg | Bin 0 -> 5267 bytes .../data/demo_images/Yoga_Mat.jpg | Bin 0 -> 23339 bytes templates/ecommerce_end_to_end/notebook.ipynb | 480 ++++++++++++++++++ templates/ecommerce_end_to_end/serve_app.py | 356 +++++++++++++ .../ecommerce_end_to_end/setup/Dockerfile | 24 + .../setup/requirements.txt | 8 + .../ecommerce_end_to_end/setup/service.yaml | 53 ++ .../ecommerce_end_to_end/streamlit_app.py | 163 ++++++ .../ecommerce_end_to_end/utils/__init__.py | 444 ++++++++++++++++ .../ecommerce_end_to_end/utils/embedding.py | 126 +++++ .../ecommerce_end_to_end/utils/stages.py | 142 ++++++ .../ecommerce_end_to_end/utils/training.py | 196 +++++++ templates/ecommerce_end_to_end/utils/viz.py | 288 +++++++++++ tests/ecommerce_end_to_end/tests.sh | 4 + 52 files changed, 2417 insertions(+) create mode 100644 configs/ecommerce_end_to_end/aws.yaml create mode 100644 configs/ecommerce_end_to_end/gce.yaml create mode 100644 templates/ecommerce_end_to_end/.anyscaleignore create mode 100644 templates/ecommerce_end_to_end/README.md create mode 100644 templates/ecommerce_end_to_end/client.py create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Air_Purifier.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Bamboo_Cutting_Board.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Bluetooth_Speaker.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Cast_Iron_Skillet.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Clean_Code.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Cotton_T-Shirt_3-Pack.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Deep_Learning_Book.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Designing_Data-Intensive_Apps.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Distributed_Systems.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Dumbbell_Set.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Foam_Roller.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/French_Press_Coffee.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Hiking_Boots.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Jump_Rope.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Laptop_Stand.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Leather_Belt.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Mechanical_Keyboard.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Merino_Wool_Sweater.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Portable_SSD_1TB.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Puffer_Vest.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Python_Cookbook.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Resistance_Bands_Set.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Running_Shoes.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Scented_Soy_Candle.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Slim-Fit_Chinos.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Smart_Watch.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Succulent_Set_6-Pack.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/The_Algorithm_Design.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/USB-C_Hub.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Water_Bottle_32oz.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Waterproof_Jacket.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Webcam_1080p.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Wireless_Headphones.jpg create mode 100644 templates/ecommerce_end_to_end/data/demo_images/Yoga_Mat.jpg create mode 100644 templates/ecommerce_end_to_end/notebook.ipynb create mode 100644 templates/ecommerce_end_to_end/serve_app.py create mode 100644 templates/ecommerce_end_to_end/setup/Dockerfile create mode 100644 templates/ecommerce_end_to_end/setup/requirements.txt create mode 100644 templates/ecommerce_end_to_end/setup/service.yaml create mode 100644 templates/ecommerce_end_to_end/streamlit_app.py create mode 100644 templates/ecommerce_end_to_end/utils/__init__.py create mode 100644 templates/ecommerce_end_to_end/utils/embedding.py create mode 100644 templates/ecommerce_end_to_end/utils/stages.py create mode 100644 templates/ecommerce_end_to_end/utils/training.py create mode 100644 templates/ecommerce_end_to_end/utils/viz.py create mode 100644 tests/ecommerce_end_to_end/tests.sh diff --git a/BUILD.yaml b/BUILD.yaml index 5df92fee7..333a6af04 100644 --- a/BUILD.yaml +++ b/BUILD.yaml @@ -631,3 +631,16 @@ tests_path: tests/fintech_quant/ command: bash tests.sh timeout_in_sec: 1800 + +# owner: @daniel.arrizza +- name: ecommerce_end_to_end + dir: templates/ecommerce_end_to_end + cluster_env: + image_uri: anyscale/ray:2.55.1-py312 + compute_config: + AWS: configs/ecommerce_end_to_end/aws.yaml + GCP: configs/ecommerce_end_to_end/gce.yaml + test: + tests_path: tests/ecommerce_end_to_end/ + command: bash tests.sh + timeout_in_sec: 1800 diff --git a/configs/ecommerce_end_to_end/aws.yaml b/configs/ecommerce_end_to_end/aws.yaml new file mode 100644 index 000000000..9dae0258a --- /dev/null +++ b/configs/ecommerce_end_to_end/aws.yaml @@ -0,0 +1,7 @@ +head_node_type: + name: head + instance_type: m5.2xlarge + +worker_node_types: [] + +auto_select_worker_config: true diff --git a/configs/ecommerce_end_to_end/gce.yaml b/configs/ecommerce_end_to_end/gce.yaml new file mode 100644 index 000000000..55a925465 --- /dev/null +++ b/configs/ecommerce_end_to_end/gce.yaml @@ -0,0 +1,7 @@ +head_node_type: + name: head + instance_type: n2-standard-8 + +worker_node_types: [] + +auto_select_worker_config: true diff --git a/templates/ecommerce_end_to_end/.anyscaleignore b/templates/ecommerce_end_to_end/.anyscaleignore new file mode 100644 index 000000000..30c59efc9 --- /dev/null +++ b/templates/ecommerce_end_to_end/.anyscaleignore @@ -0,0 +1,18 @@ +# This file is used to exclude files from Anyscale Workspaces snapshots. +# Use this to prevent large or unnecessary files from being included in your snapshots, +# which helps reduce snapshot size and creation time. See documentation for more details: +# https://docs.anyscale.com/platform/workspaces/workspaces-files/#excluding-files-with-anyscaleignore +# +# Syntax examples: +# *.txt # Ignore files with a .txt extension at the same level as `.anyscaleignore`. +# **/*.txt # Ignore files with a .txt extension in ANY directory. +# folder/ # Ignore all files under "folder/". The slash at the end is optional. +# folder/*.txt # Ignore files with a .txt extension under "folder/". +# path/to/filename.py # Ignore a specific file by providing its relative path. +# file_[1,2].txt # Ignore file_1.txt and file_2.txt. + +# Exclude Python virtual environments (.venv/) from snapshots. Virtual environments contain +# all installed Python dependencies, which can be multiple gigabytes in size. These directories +# are typically recreatable from requirements files and don't need to be included in snapshots. +# The ** pattern ensures all .venv directories are excluded regardless of location in your project. +**/.venv/ diff --git a/templates/ecommerce_end_to_end/README.md b/templates/ecommerce_end_to_end/README.md new file mode 100644 index 000000000..118988dbb --- /dev/null +++ b/templates/ecommerce_end_to_end/README.md @@ -0,0 +1,5 @@ +# E-Commerce Recommendation System Demo + +An end-to-end recommendation system using Ray Data, Ray Train, and Ray Serve on Anyscale. + +The main notebook is [notebook.ipynb](./notebook.ipynb) \ No newline at end of file diff --git a/templates/ecommerce_end_to_end/client.py b/templates/ecommerce_end_to_end/client.py new file mode 100644 index 000000000..bd7abc532 --- /dev/null +++ b/templates/ecommerce_end_to_end/client.py @@ -0,0 +1,83 @@ +""" +Quick test client for the Ray Serve recommendation endpoint. + +Usage: + # Start the service first: + # serve run serve_app:app + # + # Then in another terminal: + python client.py +""" + +import base64 +import io +import json +import sys + +import requests +from PIL import Image + +SERVE_URL = "http://localhost:8000" + + +def encode_image(path_or_pil) -> str: + """Return base64-encoded JPEG string from a path or PIL Image.""" + if isinstance(path_or_pil, str): + with open(path_or_pil, "rb") as f: + raw = f.read() + else: + buf = io.BytesIO() + path_or_pil.save(buf, format="JPEG") + raw = buf.getvalue() + return base64.b64encode(raw).decode("utf-8") + + +def test_health(): + print("=== Health check ===") + resp = requests.get(f"{SERVE_URL}/health", timeout=5) + print(f"Status: {resp.status_code} Body: {resp.json()}") + print() + + +def test_recommend_demo(): + """Send a real product image and call /recommend.""" + from utils import get_product_image, PRODUCTS + + print("=== /recommend — demo product image ===") + + # Use the first product (Wireless Headphones) as query image + product = PRODUCTS[0] + img_arr = get_product_image(product) + img_pil = Image.fromarray(img_arr) + + payload = {"image_base64": encode_image(img_pil)} + + try: + resp = requests.post( + f"{SERVE_URL}/recommend", + json=payload, + timeout=120, + ) + resp.raise_for_status() + result = resp.json() + except requests.exceptions.ConnectionError: + print( + "ERROR: Could not connect. " + "Make sure `serve run serve_app:app` is running first." + ) + sys.exit(1) + + print(f"Caption: {result['caption']!r}") + print(f"\nTop {len(result['recommendations'])} recommendations:") + for r in result["recommendations"]: + print( + f" {r['rank']}. [{r['category']:18s}] {r['name']:35s} " + f"sim={r['similarity']:.3f}" + ) + print() + + +if __name__ == "__main__": + test_health() + test_recommend_demo() + print("✅ All tests passed!") diff --git a/templates/ecommerce_end_to_end/data/demo_images/Air_Purifier.jpg b/templates/ecommerce_end_to_end/data/demo_images/Air_Purifier.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4f65357ba6242696ff2588fbdd5d0e327882b2c GIT binary patch literal 11179 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 a8G1jw0-Rv6xF9Er%7@hXzPahwh5rG>WTUnK literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Bluetooth_Speaker.jpg b/templates/ecommerce_end_to_end/data/demo_images/Bluetooth_Speaker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee541c71dc8ae3089c7f9fe4c267c868c13f355b GIT binary patch literal 11689 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Cast_Iron_Skillet.jpg b/templates/ecommerce_end_to_end/data/demo_images/Cast_Iron_Skillet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5af51fe6c06e32b1b42675aa52ba31eedd84bf12 GIT binary patch literal 15788 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
  • Z74&*S#Cu;EwaNmp)BI`!ZKQ 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 K*sqnmFaHnReAuA? literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Clean_Code.jpg b/templates/ecommerce_end_to_end/data/demo_images/Clean_Code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a3f8f85f60bf89fc12b49382a853af6de0a4f2 GIT binary patch literal 19783 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 AK>z>% literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Cotton_T-Shirt_3-Pack.jpg b/templates/ecommerce_end_to_end/data/demo_images/Cotton_T-Shirt_3-Pack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5980b68838c4768cfb36a1fc3dbf4d71520bd2e GIT binary patch literal 7828 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 D?4j&S literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Deep_Learning_Book.jpg b/templates/ecommerce_end_to_end/data/demo_images/Deep_Learning_Book.jpg new file mode 100644 index 0000000000000000000000000000000000000000..602c2f88f220c2770ba1960ab17840e8727391fc GIT binary patch literal 17273 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 ANdN!< literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Designing_Data-Intensive_Apps.jpg b/templates/ecommerce_end_to_end/data/demo_images/Designing_Data-Intensive_Apps.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a3f8f85f60bf89fc12b49382a853af6de0a4f2 GIT binary patch literal 19783 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 AK>z>% literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Distributed_Systems.jpg b/templates/ecommerce_end_to_end/data/demo_images/Distributed_Systems.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a3f8f85f60bf89fc12b49382a853af6de0a4f2 GIT binary patch literal 19783 zcmbT7Wl&sE)8_{X65JhvCs=~JI|K+2+&wV3y9ajy1c%_RgS)#+a2VWY(7`v)`)=)4 z?Wf)CTlajqeQ))zPMtb^{@wTO@7p#2TR}!%1^@>K0Komb0B>smNx(Yb+-$e1W7n3VW9_>}+8_SOTyK>=(7wh`cH0Pr|)2sm(W0|2UjalV85F9ZBf zgM&vv{1+t(>U*?*4j^m*JRAZ7{J;4B0sQm!`}Z7xi1QAYnq3?TPt^pO#tEMzC@~*} zR-&$#Ky4O6$7$*ujQXCCh?sCnhd#9$r3v0ZA!o8Cf}b1@-S5np)aAx@P7U zmR3KkZCqU4+&w(KyhB2NhJ{B&MkOWxN=Z%oou2Whps=X8q_nKOzM&D+)ZEhA*4IBU zI5a#mIyN`Iu(-7RcV%@4yt}u5aCmfl0=>GvxxKrGJv{!03l4zr-&p^~{|5U%xN!b) z!T*~UMCAW)!NGg{yAf~@-%+z8;fkvwn>gXoa0H>?OC;vk^`g>pszC@$ooC+@(sAw3 zL;r*JUu6GxV8Q=iWd957e{-z@&=KJNO&$UcKokJ2(&|U`t2E@;G}Pk+-ruoBY_R~- zOhVQ~T_2YOt-Z7RqP0P-)gm+YYTA|$@;;`{c|829lJ8Ehu>~}1hW-+cgO{UN!QDXN zwq)hRYWMwJO~$y;3+{=2o>EJ#X!WKxx0HPu4!>hExJ*Q>-`gJN`j7*gBPUSw-6Lk1 z6$@`=?eB9b-X!eja^%Q}#~>QKS4d4kfSsTdTg7&JH*5M=?@&xxHLPE6fDx)9-({yV z;N23-&}V+Tv%L^ONsO2vR6e2X(vYLzuKbq<@;5+VE5yIL4wdRj))Lc8hm~_J$5B+^ zsCZ+}G~>j#{}fHGWH(g`N1G#9b7(?RgzidIS6l-J)c z4ePUii+^r6O5Eo3WE@C6CC7~w|DgPR)Q(}~rRQ6KLf{H4c;g~uYrSv&Kxd-M)N4W` zXiAnfxSw(1ad~D|yrTcTmq7c4m_kLdB$ec(Jku#Mkgh2SDOOy^4EgZF+xrc`wCCxK z`^58*`Qn_pnG2rIs80KCCqQh~7N+Park#JS#U6;sH!YqVl`A=KU-|5ik5*csp`^Cv zBFiBVNGCJOBsYXolW$+ekg?-&^e8oxwmLP7o^rg_tvi`4K5r4GE*i=;ce2%vGQnHM zH*AQ4pNbphq4bKNoy9pf4H5CSXbHJ9m`hUB?1v5Q-_nt_sM#+hnJC9cYdT7JBo!BI6dYM{JCA;H#MJ^VpPCh^WN3& zABDZ83LrzwXTuPy;OZhpd6rwhIc$JCqT4+M=cJXvvj7A=#v*52RVVw7{e7j=$duC& zGdU(HpRR9x+O1hw9Of@F|M_ke$vrCciGb#_pzNs1mpGlR=VZT%f)l z9j?)&%~8p1%u$bhAzzsZTADkWWAsG&6?vG|iQsBjK?7r%%#daI&q*0wKto#0S?>dD zhqUXH-}@7v$mdwbATA2DzBd3!sP>0|zPDZHaA@jIerR^F~J8M zh{YU_#U+aoaX%1jw9N|WV&2=rmcnc;qk+4&R{Q|Cq4laMd6s9b8oUoY?8wqvI}ssi ziIWc;{f0Yx9rv7Z58XW1_1C4O#Miv_;D~UL7@A_(902j*WCZKP_P)8e+N+f>DXBYM)GVUoyHJUfNhqDFr&(T_st% zD1s8>RhuqNhPRyzxn(ao|Ngl|oHDv&1$8bw%Ys=&mHnK@z+g068&X}2rK9S#kOpk{ zCh^nc=0Kn#SiiyvDyW@k(dvYbSw&aJ69k7hUe7zI^98btA8_bAmZb5pxZ zQ^Fz^qR6}9JA4Mt*zW(Rbg+-9=jbn4t7x1{vl_d6_a!_A|bTGJxdp)R1#Gvpo#zw)f{kdwrXVb>zbHx$Z&J>X}ZUC`+ok)r-_BfsRq+ zZ{dD~g)KB-)CjdRG0sWS{6{)!zE8QWb{dpEa_0ul6 zG0DG(F$lP0Wdzw3e;t92t{wRaJd2DY)BeKddh6)aU(-SOAGCm&xq z(~I#fhy#5=Am*oCU-a?HOJEysm!&#erxu;6rc>@`3Tl5Y5gluCN;9LBcgOK|3}Div zjk&qOha$od#u5U0lxXRq7qzL}xGCiK{bYFQ?1rqvYlwH}vKgF`w$YvaKBd!U-JB}1 zW3tFPV^!Pmm}QwKMmh2Gm#(D>Efx!Zb`t9Ix!EldSC+NiCP(*HmvM@T`sV%O_pt>; zhd+vhBk_H{HN2U~`($dbji!BA)n^P)(LprSMY&ZC ztmLB^VoYbDAalm~27o6p8dMuD^ql_+6|ThNsd6Zu1mainO7C}sQ>V2eCNY!scTqRZ zDYw-S3>*&dUK^f#rW4mO)LtZ)Lbm-Vw3~4S)u|#?ns;tcX*O$%L#o^^DfpVE0dv}} zh{suxy(0k!T1%aU?Wavn^vb!@)%7@SErCGcG}Ajig|>-e4qSV_>YcS+H}iB?CFAydK}L zU)|8>i2Rma)BJ-*bK6N@pEGK3v0~h?ASvo}Bh2b&kwR=f8jm0CjQ`nbpv<{Y2hac%QgN=$*}DtJl^4Q!cyW<^zt5qM0pP9IV<3O>ZAM{(LAwA83WgtI$`O1X|_ z8FU;9Vt12MT%*Xz;lRL$(iz`>h`E40j=A#ktz) zv^X7xw)a05;gb127SJZN*k^O<6J%(VZ9Sx1{$2WhD4=HTYSr=Mm4AjYR$+6^g5Ya= zB$9+n`;TFx;Z8T*fGAh%#`g58RmnD@)ygrBsdA&-l(ZXH@}6P~zwK6OrH=}X&itzX)eRd(k(9tlocotwI8w@M*oSEHh; zukT?9e!G`A>!+*Jk*r(>@bd0|WIy_3#*mYL8cyX*KpnlSVS|lYZwH{CE(=fvac5RJ znIxtHThIFnt%PJ^vs#fqG$GT*EH}ag4D5w%RvmD4*Ys?X6c1GJ5s62(^NF|j0KhR& zy91`Dl@SzUpiOwFraIQ}f=p2jHPUQrpb)c#K1|rjNJ&VbNCLO(aO%lQU{2@{&?^*aCIZwx*Od%3t*OQ#+F#2j{dUO zkhPuUqt)Tr61078Yxb&NL@cThF`Q&gTa9^4$knKC5OO;3WI4i7)ZCCsCZDD#oe^ag|@w$CoKLqx# zYmP(|6&Ln@3j?FFvdwMbmII_Bya3L7pNxIp-&qtih^!W_leKl-%}@06KAwk8qMeY& zHb%%83!wt_z&j>Q~D-*K!#1iuUIW$Jq!D zbi6DUHD&(*TXQ4R=OM%MlZPRfF?9rO1x?DfE`3z~uBW(CCHDauA1jl~{dhVE4l|Ej z+6jXi&bYRXy7XFc@< zz{-&aE^)&U*N(%5pOas?@x2Xlvn`u-bxR(V7F3X~uiiCnmQQYkIIDCq74oF=@}y=2 z{}oGCLBy5EJiso0I47^>a7NWYCb=zhEU+`RJTehI+`6rKAgzE(4j@$L7BxR3Mmaxg zEDb4IlbVPORuI@WMn`ALfIvu_yHC;@%}ojeoMdh%NLXFgc3hnzKh9(BlGai?v=xX% z%n)o1B=6q+Mi}}+TCwu2xld*B3$xbO4Wp>Xmiq8?NRp72Ljw=>tIg%_#XAzBW$finexrn~`E?~sK zb_r5E5~naGlAevrxw;yeq~d*oy21F~9Zg*I66Jq62`AZI6mZ0i0$xwCJpvWfqIp#~ zbSBr4!#t*30w#7;|K7n^vx)quRqVfzk#t-SGyYAgl}gsflSP&C=M4a^7@F#K;4bv| zase-ePS8TT1{w6dwH2~pZYjAE@h2!Erc1ANyTrw5JW)@fMZ`zE-t1WZ23cz6URdT> z9d^7LnV6#MHC1+rTb#qf3n=`(3Lt0dI=dn1eNCye@S!;G&Y~SsMw#BTo(o^B8OQ&r zW?z1vesI3CVexOD!)*@=bO8lDciF_Btu9tLQ5K<+Lwx)#JNXyfMv*B&3dieMDbtjp z%lb}gC&tGGj61oJg|oM4Vau2WJ~q^AxW<-@jF;$7=>FWRKMVyRY(Ke@R+TEX$G`O3 zhvGF0!(q&|D2ex5x!~pOCF>vL9oYxMg)n*FAie=^D>Ax}Qki_`?7S(yJE{L^HT5Ha z6ey)W?KDNZIj~*ffD?7;-xtxlk?CKz?E4$`pX!NPdFBvT(`c;LOGxzZT|V`Oi(lO# zpV*X~tu~Bquj~Z#=AMyOLOBsazpW8Fo%WlyuZ0Hol3%Y)&5S!mWY{{BJMx{6;xF@Qe1xIb2F6eLt& z^zkB^y`0<$+nH(o#03+g($$3_{>ekHgroEGb25~Ck`mJbFW!z-@UF7hUcea{QEQ39 z_WkfvAnZ@^Y`FUa>t|i0p5aFEyDYrCZA&FiEcZ=d_tsWxp&9&8tmNxJFTf4=ktl_) zeATAjseood*$J-oF^?3GVZp518R75Gp51jHtw>MrRXZXuX1sHP&7&jmoI};Y3CHdT zhFizCjr{6%DoVbK;aAy^U}l20<3sgp&->*B!Zhc)i`G?o+gZr0ti=4|4KT4MLRjhS z3(T;q?YMr)+0WqDn2-)5rTLy9N6Wa`6%6&F?ai2d1C)FcP4UF)Q#BT0m0+nF>5Thy(?)jFN4GY4US{jy z4WLNg65=9cipr6G}=0^+C7{2Hu8bMX0GP$p(e zpyl1zK)ycSeQ<*KeOYzM4{j`hdAYjwdCRMVpx6%E6N$EXEi2~()MzTSFv?BB#G6k*OS?l}WldzOP> zR5o!>^rmIpUvxY8WWb-V_hN+}+@9e|-ptzP#)>{w-WRB{sVzyk1^ZK;hRPy23!O#x zG66cu<7tmGyF*o_5AEF``{*0wX-1gS>G7a;{jwFPA!+7B%Y7cc>+6gHM+EAGCu5-e z^nzygjhgsQs7pzros-p%5Aa_$6#>3WELddmz8-hQFw=`wLDu`=&kTM0<}L4Jj*WkL z*~Pn=R*I71MaQ0f`d*@zoW_|qIHrJ!0yb`a{ef1OhBU$2HPh=XsYX)`H~{c>6WHb-j?r)9n7MYp0*{B!g3xT6 zf*=CA?v4@S{~UTd%Eex7O*$vj<;v@A(362I!{1}_;hsP}c+&X|fc#1VLl|7OjI2IsK2&~PSaPV!7+QR;0ZF-6nxgO3q&~?{ zYcO>9uoKl#Mk2D2O_7)1 z3=!jU&R`2_)%t#e@k8Rpmgr_~rm0Sxfb#>f4uz8>IkNKnBaZNKNEa$%!2VZCn7YAo z&Fg%=-r9p^ox<09P8L;pn&I~Gaco|W#72+jQ+ZXj;!MVzsbL-ZrJOA{`-EH#7}`vAr+o@8!&dMZz;`@4df=;2ozy?ifC4iirwo;RegBX600P zzA7z0{TB~NZjxa5iO=^vgI?2G0PFpC7U z_BA7XSma^jeD$R+(8L8z$U^<%A*4$f6Br7^DL8&SjH=;kKP~$sI~Q6yi<4yLh-Fme zt(?EDr+s5!f3U3Gu2Y3RZC`~g2*sT!h#%{C|JVDXn~O4o$^_jX!{jAf`Vu&QK@Zh! zqR=1RubOA_%69@4oB=3?eKWSZIIVfxrU!&+m^GL_3kl<7$RM(a8){gJevMwthVzp|v9G3an!#c!AdC;uhSvMTcXNx~cC z{}omy?Poz5lDFYkR8^E9>u3Qv^Ve_qVEKUWI_2o|0t|tz0Ep6NrHVF{Sl=UT?HNI; z*ZPvQ*TwUBvP#a9tmk^saHbZC5pveegrOOGA|EFz+^o=gx&EzYqN(?Cp_TDj_pj6s zTG0^!Z8ty8{wy%Okn9J*jT*%ey4MXOs8;NlpX56qCNF&ik)uUF(Pojmoqso-cPLCWR^r)~>%~en+jH1asinKELhepo z?$7wD>5&RnrI`ClASq9rc)eUYc3AZFbJbu|q`N&zcE(5hDbK6(y&k%IL~N(mLGR~D zhmBmfb0(R~Wk{>SscaGkJ3Y@b64bt=xh38TC!#Ow4X`^bsxba3A_mNOCH|oQc|6zb z^wJ=<0MwLUQgRnt9|T6-PbgYV+^1-<O{B~lStRU8Z z*>F?@KsU!x<>w*=tQhL|vhCEl=$&tW7NKF>xGqAIF=kkxM#tlR$f}5{+K^ z#g%C;_I{Q+UGw`A5YWOW{GRcb#q~Oyi$Z5gpeqR}RU|Q|-s{f-bYXmsy}7x|aFZ|&`A-zwa3133caAX&@ zINir7)5Y7+Bltrvz$x5^pb1(S9yewj+Fxl;Rtuyv)vhX_oq-L~U-Vt4RETV~h2&9iBnJzw< zbP=#mwB2eD{@a?evr*j%j#v}SAO;7C-;$LG`FzjCaWD*s>LvvJYET?0z+J^_M}lLS z?V~f&H?tRAtq>vZo~wDq`H}H%vg&pLwW4iHPiJWE>&e7?c6mou#4lU{0I-@=c26p0 zweFDDTVo?7eznTJe}EWJ?mV6#$0F!T^}9M*6|(=D?Npk39!|LGpOco{zV;A9k~@xe zmDp>0y|&qQGuOdr@kfuVSxw)7^;dnS3-2$3dEiI52)ZVh=9gqO*nB@}%3w99jG?S( z%Q{&*zdftRLeGnqEP4D(NPLFoVcsZfAZj&}`dy7i{)%Qu3EBEC*P4O**c;%?6oV4% zR8n2yLh_40n6-TCi|7DBO5G8#_9bU*1D314WbrMMqJ6@V&)^UN0b1=b#FInQ(6CV0 z1+h7<)%)ST#ArUGQePNL(Ze?3VG%w?1aoOLBRCR;zd72Sbwf>;h*U$F5)8V=dDK!X z{xfC8Xs06jl6z^F435i1l&7=vvU9TG4aO5uwMBTndIjCsReomO7(frC3#RB_c5XEH z5AJe;xzAg7(LgrV+lF%Q$dsh?g=~AcB*Z~ePDwn8i8+fmesL8gh6zigO}Wm0r!Ptn zcZIal&W$%_kHDXlbh=71sE9qC{TRmOzfpwcgi=mtn_e{zsPI;|Bw*8(Q>OZQCuPoc)Y}!M&P26Oi}SGXVO`{i zj!)Kke+NseZb2(uR;^+LMAl<5nBL3HVUBT>PChyM3)$Kuw+<-Jnh@puYHN3`)xeoc zla{Owmmy8M&|tHN@bc|l3LC5_((}%uu2|tpXB)z{3?b}wG0a7MS(?##I*Q?H!R6^R zEzRcD70^OneM=npl_Ymx1c-oFOoZrL5G-3taQ?ZfzxWvqLRoOfU-Px8-nxNB>00(a zQ5zC)n0{<%PlL81uX|{~Xj6XR(Yr<__v}+_GaH$Gh+#Vr^QX?r815F_c|X9TMVkB5 zO;}`B^@5Fc!YP~&F^P|%OAkg=ZF3HdR+uU2-Y~gKr@Mk@3OpqWD_ezk<$^G-mM!U=8 z=NgrI<`=WU0H$XZRw(0|Yn7T3u_ShPJf#aNVkCeupGo=PmZHK)5;78X$@^2D32j1I zS7u~)txCTRvOtJ1o%JD=%lLiPr=}nTNNJ5|dwB4S?D<0vZ?vAwOX$t4!*X0J#Z-*&*NRZzERXVG2$zZ(=Gv#Cz z(C2`{iL{F(k*~JZc;kk-e)2|+oU3JUN8Y~@bXVy+6h45OL+RLqdcJ+(yc~2SEqW~i zD@lw?&#D+3@(RQbRz>RzC2x#cTLDqF=r^}^Rqh0> zRy!4URDv`6yn%)%GW^`9g98^O%np>EKe1jzeKG>fSsbYvyTk1ou~yyyUuPRf_1BJh zXNT&$CobDQrNkS7twg^r)`YSXzp{G94yoL^hZp^Ap~DE-Gm8({psKQaop*QegA}pi zIL`q!aRN7*6|^3MU`wL?*tIrW1aAFQzfBi2Hne#+2$$-~pSD{{m|M`wu7{)8x>N`a z(Nu9dTEa-O6eo&`fnmtYp@u%jTB?5x^gMZ`W{7lWYR=|;C*7OM8%EvHJoFxNLE~Q zaAp7FDLT+a5~9;M&(I*2>H+t>ltB{XSf3z15l@?PrsU$>9O$OeMB2!4#Op3GH~&J3 z6dKPat)ruliyD*e@9Qj~=?X3==Sh+MSU4d{be!{PzT?AVB2;PeBDP`^6w%a9##SWd z8dgzA3-9&b5pXnh?5X; z$GFsDU8*2*#a5)-SY$zKkD-kABzB3kaU?q##=KTmX-BZiYDZFFOt?;aVJLFxzZqQU zgHvR^W!-Lum%_l;$$6?vNe;Oy6K>9S`Va@+=@`i~yEbN16up;W4_eMRDoo)zuZuYu zE6^X7wel%2upYN6{gFYj*5twdj^TD^n3mk*+@LygSM+QP{VRSmt-n0d z4Zj%x)2F0rVw+Q#8|k(1=b&-sgvBp)@V7x@$AV#)}2Ic|Q`Uz5E zX9JPJxV&00({O!b{vO57&sUG`o{X!8FykWgEPSkcv=Ava)8h@UrgC{cZ# zxwU5P5YG4O)--1KaZisD={}jSyBE5ii%!oe0juEH7&1f|F!zIfFa$JKmu-hW9a1Py z{iN;b6~faGRw+2bA!8(_{C7$jZuh#MmJ}dH6 z1K;ib6;B!CZp~itW3wWpmt#Q^a=l-4${|i!zOM_F$P_MBQfK1r@5LrU$p}{d3?vYrv@?I@UEPrQ1`Yuw{=MV^sBJObPp(=VH!+WM3tAUqKR>w zn+rmPn*z2yyF(i2SNoH%0lbv_tDG~5o2};}Xf;GYBHYgP4EIdyx@xxH7m3-utI=zW zh)<3{P&W(@EI)$ddHFTL92lt@=_D1YM41J7 zykQlBYkGw3*To5yzFwod?%KI^A;Em|J*{av+CU-d%TcDlQJKA%H-IyNs2fppjiG?n zkEyBNtRz1db)T34Nbb*@T=ejyNu|N3p*p2f1>}qqWR!wJ>({<*A5F+}-Q$AT_HIUU zvw}D;Kmq3)!F*oB7T^0 zM@6PL=(ZCLY7v7Q{DYYb<^f) zZx{W7o06nzQ_lJ{Z@P7IN3{o`mM~n8_$@=nz}o8iv4_X?3Er?DTM04HiBL7q!rd#{ zb*u?Mb*@$D8PKb{m+{rZpR8*hM8Tj#=i}C{8KtGBu(yq~MwtCjLWfOby zo6@rx+THP-Ju?@}(^381WSCDUw8)Yb+SH>heu>QqeJ((5f(QfIhGn6eDaJ`hS9%>p z-ezK{XE-Y#eusa+%x{*9ZLfRpGWc!LRg^?$T~KK!HA*;BF0im7_tMId_KG|8aUjEm zC3&zyXWecfJu(4az<3*)@UbMSgxgbIR3@%}Qhf}hjP>8W9QjbwqOS)sml!q=i2o^xw~h-GAvtVI2=VCX3&K}UC6s$wq3>jukS z;yuTMti6EWTzfauS_}P}Tr;MkB*Fx8M_j<41v4vKq0BRvolh>NJ1D{{W;pg{C#CDG{$0l?7~Isz$4j83$oQe>lp%ORs_pLFEwN8>eevZIy z9I$x(Vn`HSouly*&E_#JvhkesQn_oc+M&QIOfbS7hnVWqv^2)>gdb3E_!Y4Y=H{N7 zrj=lGpN4GL{Wl?n!#9s6CP`(o`C9li9OeYh#mS}8DLRaB(`&id)3zrBrX^Zxpnv;f zb`5X|^atHg4R)$4&HEbcr0d>)t6c=s?8>L2q)Ks|t<_y&!chztk*B(orKSmO_50&M zbA#O!4Fa?vQzd5J=JbUb=uGx9@L&8KRdx+Lf=!^gVXnY|oKVeHsGi|0_ly0tT3s;My6QuV@hQSXX@^z$Swf5}3Ai(LN|rcL zC-tkN_~Ehq(HRC;$}|G>FrK^Og>Y5wS>D>mrujG`ukmV+UzR*;51aVaO{-6@RNhkk~hlaW!|4s^;Qo)dEbEIlMI{VwwmBds|GR=Me9Y8Z9!QCMzT00r_mZ|*lLbdZ#PjXSzVFbR^q=> z=J4ZCikGFx!kr~88S{mD-0q`RX6*PUaA7&GWuqX(b2(fSG%Z~Zsp;EaDp+_|5>=JR zh)0IS&k)o))yEUkyvBV(>JZt1=3tY$Wc%og9ax69hF!{;g{kC;xVoQ4W%X;M(*IlQ zu=iBjz++ze&!TxLeCNW$ziu_mBuSdX^yds4?G0UF7BXRVKdb#jGD?0r@I@QdOZ5Ls zb=N?e-H`L9VoqRyiL+eKMES}yN==sN&gVtkcYY9sHF*aPZlSnN8&qGnGQBZPJ2K@K zz{~zSWkDSMZ#x+fj}pNEBigcq8~QfkxkTxL_iyvap> zaUxOoL~G7a*>1OvT~DxWoBBQ6=oznlwZJe~zc#6?#87Yd(u>F(AS&QqRc>_B7MBJT z-ic$?z2NQgiS(CfuSYC|^k5l+JKMPGCg${Jj2_9H5sy*V{7*vCAD5S8sa^3|Touf!z2jZ*`jUkB4* z?SV;@_GZ@yJ+jDeJye50&Rta;Pw*TxS@5iCqjStLK#cispVHW;2il=Q_5Dmk+Y=#1 zq454k->Kdh-9|O@e;c|O=kugTH>f!3vH9ooyMH>InR(rh>tX7aWP5jfL9O`owivDS zBc*1krSk$dv!4Yi0AYBAeuR0DkJT`$-5!i&`&{kh1Whi#s~zOU*hutVQ*J$mO$K#4 z7)xKXZmxjVSHRzDs*7wEG$}YFV6i`#pdoMCYS&Qk;FP*bybZzJ30mqbxJxkRHVSWx z(@7X5O%i+qWG%-WPye9$nocv*49fFD=S`{%0p??Upo`s2AR^v=(wci^pKt6m-0Evf zxfoVrV{DNNXYPQc-w{vms2i4-T(Zv=o`CQzU_`PFv#$&R_R4#PK;Edt9x@Rr>F+6` z=Y-<9#>}g>W~``mj-czDpH=cc(D44q77hw2^N{5|d*F!!+6r2>$jk526+$FGWtGE0 z7gcAQs}py#qjI$vEz^_jo}AIOToQc42}j+@$(Kor52XlPJo*IL0K<&yOQ+LiaQyXS#=pNxO-ua{5cy`E_ zvt#bF5D-xpW3l67qP&ZfO{KHHT8S|Nz;{fJ@7S=b!z?CC3(Ml4e*E(h-B2^lqeMJ; z`mbF~%w}He;as8!D~xFJ$Ln$hMmYMG>4V?XJVFO@uC4~Z(4(eu5ZDOow4z;h>6|U% zX|&y}W>EjlLD~7)%k5cU!{Scx= zyoZ@>J)R^St_$dgMHWw2K8r%xlC2x3Jqp(ci5)Jz%;WbBl>#6}!;fh{cQVEmo4fQX z5ItAPicZXksd)HnY?rKnc0{VJ5*pz8^o4j;GEL+_O{p1MMI(d4NOHNThA#*6!=!0vsbkz4K_n0((ojvHnDBu=uZY7tilr^8Gw4 zD_;IMT$o0Z@<>}GQ8!Y`F(PKUPBPhOkp0s9xoq<*h5wkgze65K?p>KsSTLT#3nZD#D*I?pltghFRX; zpS?8|j?}P|zxkpaBz;`wfdYFUrsS*qc%ZNSlvzuJeHuacUV{;Umak?)f)1rwLHq3;>P&3Iv9&$HGUB&;TKr(eV>h&xO*^$yRaE#wXMJ29 zSw;tuuy!m8DT_H1S53Cc9Apr|3{0Xi~ce?415%y*<|1%TEF{8K_spS`t zyEo&{I>)rqg3L+!qP{)fHJo};^5rVe<7Ca3IP-LhLOap#jk#XJ=@Q9j970Pv^pqb*1jVP-WH@hYtRZ5JP@=QZN>AOxZ*tWP3F4IaNrfscPVpT? z{LjqQ8q||MH~gjZWoNq0>W9-mMNmaPFYP=jaOo=LPpv=1W|yE{A|-``^qp7fDv zfk1z8v`qBP&GN_>M_hekiKOBcX3tsa=S|_1>SODDTKV?l^_TShk-FMCoP0_f1$+SG zR65h5Zt)w>E`}O5C!NaHw($kMCbZ%4={?V%TNArDJp-s$OuBL9gR&#TNJK(%KzHu3 zo=GdC4!|$QFqXXSEb{%+!r_bOp6ood9NmL#!Ax(ecN;=*!vV=BJyCu?ER zl_!oLgZm{r+o(=2>@G;ai1!~Tv6dQdbK!sJ4k%_y%U&y9X!V%Nin5CA?i>cQ4uT$P@nTJ^$}iPP2Y7zdsF+yVE;ufh`A?=;bJFXJ=g zvVlphkgiz4hi2X?&zT)`@V9w6?a!pM9sL*v)V zSdp{1dLZA;rS_`ufD#gvHcmvnIV<4nQt*kB-LIGWEwroHb>sVgT}?BY1j9C@meC%L z6~YB{(W43Q#BuBK-qBh!TrKW4>P7~BN%#Xxm$U@_fYW7>;Hjoe8@tKJ@zuEtDl>7 zD$}V%Y_xb&$qQr24*C(^$C`?o?qBI`dJ{2@eJQl(E(YM(b6BEpnUlBeZCP<#;o4^R zXG?;*gAiH?MH-QP&x`&PjMK&r0cLl}KR$ZW(Y zEtR-lQtWJVTcQrb-O_Y#7vq9y2Z+_GSm{7uglxnFhuGF{e$tBDJ@!baF+S$m#EIfQ zl1{N5IG&oiVy0uNA2CsRIV#NW_RMLpH6Y!v=&M?C_{A$ z%cs@NOPY`yf}MSIh{=?0J3(H`67FG?)rW5W_CxX%dtB!ei_xLXgo zH59q+Q;X#Nfz=0>S+Qr})UyRVOmgSDuE#3rt6s(U_)x3X)zn@LO%oO!A>VMPm%vz7 z*Y50~E=~a%5ZHY>b4`V;b4ui$WaHq%bgY}bH)~!XJpbqRraE4)p+WEV zNs6O>)H9*Hm_IRB$gH-P@z{V}X(27CZuk?uvM7(&T{BT`k${=CKHoFnD`;rY$;ZkO z-FXM>sO4+(_ro5gw1*4Zsl05Zx!H1vzF`HKUzq_mSPD5_|NT|{gAQNA{Dk$Ug4_mV zs;25>wSxz{vPvklVf+BE(Zh1eCFC8kjh0)Y6&um~qPJr7KbV^@7#~u6MUc<9pF(56Kc#rJ)QLE0aQ%1Hx2!jzgi4 z&0H_%uO^YhjC>SWHixW=YfOo)-yQX8A7{%>>IczFMw}~1oU6tXIL8tfzJILH9X8B< z-?mhJGW9KXOpKQQ10}3{H6SuC_&i+DOb`|MlG||}7OXfOai>d^q$W7t@*!15s66qn z_qAa!R^KJYh+<=N>0Z*%C-&sisME&^C%$q^$Iw>YzZNwEe0lWdk?Xif8dp6}P6oL@ zZ_%D!n$w)d(OEe0UHqEa;Z+MjV5T<5qh4P^L|Do`V(Er`_FU#71kMxF;B{jC`4y%3OF6jPHqxBm5AkLQ+B9 z!Y3@?UR^LMlslMH#hgzq>6Z^+L^|&!Px?8x@@SBBI@h6u_22$Vhd*A)y5;u zYxOsIXBP~E1>4bntdH04RfgHRO7{>?>)%y}4CwMCSCw_uLn*S0D(C6;9Q!>J^($QZ z0t@5zvV4|nWp_kTKNxfo%sO`<@kHrCZO!L~cSKQWBk}q&B);&Et$jRPE)qOJP6GOK zrWCbU!~?%h?+>7QeYgK$4)DIMcqNBu#Rw_xO_xoxMHgec2<1W{yDy>Vw{+mn5S9A* z#_M*KxyC2X+|GC9)YH{slX})9e;ZO+7wUxO6}F{|SEWmiQ=70yxoX$M66qScj>$i+ zqEVg?GgPAEEd55AUO1#|1p7&U!6%n1DaP<}7>Mj{=(hSyvIQ@fL^nVG6G@f6r=J{d ziagHc-g~(e;TkCATz5Yb^NHcbeFODEd=F#})E{JdFN?JW7 zWf}=4Y2}+kQ{U1VTQvVq0cnq*E7%j!b2@KHge}+kehlV?HmVKe=!#qWxHTpzkT7VQ zk-P!inXYPrd30R`hMI+J?OC_yHF;YQ5Zgzx0G>Uo>rYyBuM>{zHUb+jgX^lF(-;B#V#bP4p6^p5sc78kw_VA>{kwxtnV1 zc4-Lw*G+EKJljYX-BKC;*I38ioJ7v|L9x!k7{I;EtZ$P;2hGW&wc_Q~OpS0q3`^C? z6xljC&3>t23|{Nsq?k8tYQ~-BN|yhe+GQd)t15159#glS)5$zpgb5T)Kiw_d(U|wX zD(r?AeaFI+k-dJG??(26HNQ#z26it+M2w8?67zv^J;T0~tNUEeEfY9Y+wmlGh{x=u z4$srVoD6EZLb`aH!atRIv;YOi#Y+6LW%{PETZm$43(N)#$YD2Wg8ZKPI zglNQ*BeTGyWf#pD0lz*=5@yuDM(LC4)xMdvW9xTy{O>)Hi4p$&8g^wZ^G%6zps>90 zkxXuE8J^(Vgg6F+=f?55uDk<9XA?R6Aqkl?D7;AK8)15gyV*Kv8^e!%u#OHA(l%$7 zCS=($MY^uL7)|Qb#l_M)0pRwGX~X=4!L~n|aRGK!)4`98=x}!0EQq_+{u%boxve-Jj`hC+s&MG__%Lm?%{O)~P`F8-P<(&DRvj3|}M`m4Ynz%Zk zKUH+)(Oh+Gu5(sjk#@ADi8$qO0U-`>tcUYu3YE zR^5Unv^7@+SCVV=2G9@^rFc;?uUu`AL(uKT_X(4;&2oDKi0X>-fI4Jq z^&A5m1gSb)rgwsdI{`qshbiJ<{u;`cMy>|8?Es7w>qpBXx~5qJeW}zhVL@m@OkcD1 ze1o8Y&i^AK4BhiduU?Dhk~DG&B|{K6Ju_c9YySWjykGwS32vcdcdk1dOUbO^N48yx zsOJOUwPA>qgYIN#K)g6(={4=n7KLU8CQ-a>=FEx@6-zg83fx$REw@N=M z_HWtxYi%pQ+V;F<+Zw&x=<={%mMHeFPeI56xX1XjbW_UIZS*^ZbI#}tdE|N=cJ!;d zFT{%|G>h#PeFnl^GWs?{smM#>>6$_#L$J_)^w0=5784 z$HP{6bQ5zF@fFmy*%{GWJC+#Lcq6FF5ngZmQ%c&0#l0IsL%FSNVFY&FBNsoWE49-+ zY2m#VeKHszzqQh!X;i?mBdi{0CB_IR=ITAoc~^@yIJ{l)r&84H(sOTdI<1tFrqksj z1XGOh$?t52;;MA?WHDZz7?92-6hA_#K&)20s`ukKC z|?%T}?cVi^+i~%X)PfQXziu5B54p_9= zxp{R2kr?1;tq`6aniSA%x{04#zRe^Psz(Y07EZc;d4iX@EWs`Url)!!0Y zd5dcze*<&roOP*F)am8W@=IMkqw%JeKw{BfLgWG4c>e$j`mz;~ivX?3I5^|2cr1$= zYsw}-R$xX?VmehX7F^41X#`gH*O5r`g2g5v?ZG%0uGrPpBg@2LIi2o(Hr5l54z1*6 z4(VDpLHEJVM;@50wTbdK#>zd%TKSG`b5Tn+NcGJ{PB_ic$!?uLO05r$H7gj%e;8_T zNwknY(B~ZVt=_#3H$gA7eO`gK45|D@PaAf}8REWR(!6Qo=hCe;B=KgVZ7!}p&kT<_ z$v&lh1zXlWBKYS`(Oz3`7hfBXkU3%ZNn$X+fCi#T#a;C?P)*t`A5N=t&PRND)35@t|Ln;sbhaS+Zf-5185&I;1V;M;Ou@d{8M>cCy8z+ zBqrG2AVp$?t zrR`xQ(4VvLNI1zJhP_|mx5O=4`@#1&n&z}MEk-K|Zb~dWN@a@1cY5-t9+fp$u}Qs5 z;JKvITOPg{c^y5?DQ>550QIkyym|4f$2wfriJrl)8mwie@pXC6M&xs*-NrVWy|K?ikMpJ?TT9*vIm(An>1w z{BN)LPA?Vey8N~_^RuzF(rng8MN{)IOoFH~27POLNAXSWp?tRx-s%HNvC^iy&B}n+ z&V-H4f^ea*KLcHnz|K*+XA{RlGUaPi(F1_sf_P!pzGCr?nFDy6#ez$8b03IhC5rR0 z!Z-fSUACL!Ul?9^Ys42a>Ofs-w!dzIREPk}ov#@lm?~8EAl99qfi$lW-gtt04~Q1C zTxuFcmZ=Gu6X%?)i6WkJkYY^Zrr}xQFw&r(GdIFwBZyauK5g->gjSNm_R176IZ)hX zNI%xA_=?SKZk6J|j%dML@;L#kuK25B(M1zU6T*DJ2zbi<<@X+nV-5~M6Z_Kgc(1H$MO|8i*lOKlUH}x&(l0{ zuRg4{o?W!1vH&oJV8Cap;QLoYXYn^%v5wwJZSLVoCGuRwbsz}ipus+s=Q`h=qWHh< zFrS_&QsF%~ImhUKI`nI+7gm<-=$b6_mM92 zKOosJzBsQUlC#kE*SyXfWS0RTyOq(@e5I4GJwBqY+E`whqK3y%d6b+mD~*HRv~?>8 zFK(LJNf{+jtga3>aq_?7I6q3$(XE=&EwVCv++=sI=TqG^g%!DO!%c<;FrjS52`Br^ zM_JzpE{^qHdiMS+=fN?NOS>7m(^ci08Gm zl53lFw?>vxDIpj8q#jB1;;`?nbz58MwJlY|c9s$Okry#;+_@(Z@Pc#7527@yqQV z@qAZprrX)g=H1Ss(eB%5c5j(UBO}{By{nw@WrgjAu{1iKmUR1q%lopy@(DR?k5Vhw zJVy&y>K3}}qG$fjQ74i}D(N51fuFj42(K~ti?3LCi(Wd8ndkW?HBu!^Fknf?)0+2i zc%_JkGCXWm2SxIoH-*|;j|XUWHqh>wbr}kb{o{gr)o&I>BszHeKnTD_41eAExgT1; z@aQbo-Wh}Vn*Lzf=m}F*ejv6?p0=_QpSG_>K4su zsz>%@xYQ%KiB#GPi?lqel=b6#Vj&msw>jf#eiV{#?m;(M|$A&ld`~~0CzDSovUh8?jAZv^zXR%8 zwvA_LJ&coEOK!2p6tTYK17=BO`h&+qT~(ir?yfa?Z*>)h`^|-{E?|vBAjHEZ5Oz3X z-T4)hrT9xx8a>9b4w~mr4;=Db#VLrpDJT~`8>t&=y~Tl%8c8hLQjEJ&a21S#K3Q3D zlE-g7fUl^hPA)dLk@B@C?>Q}cn!1*&q3M1L*0k*w?)v)YR78Q~xr9aJKo}7i0G-ZH zQ<}5z`%I4S#I~a7i9CxKjDN#|&ddiG&lvoxkGHos8oix{E)nDq4e8rf8JNEo5 z(0nzki+_xBcx7y&eb7eoTy!xk5gdR$%7OTr`TXh*R)=%xau(wkQFKQ|`$POfi%sy# zF0Bdh!V+05C2lJ~w5Qcp(;Ma|{)S7*;6Ga9_H^kr%B^=}bvZR=VfeYe6W{5v>bg#?;w?Jz<|k#-?k&=9E!P`& zxGVCx=s@EKirM%xqo;^`br*$3pq66h!bVA+GF6>^UMfhFee+cVe0(>pwsqLk< zyU{f-?9Fm`Wx;D^e=VN`9BuO=Z=xFWpV|{xxw-J~h4gu4Z!%SD>xlF6mSK=_{{R9t ziQpfLI_JaR4Qsv+w9@q5Q%BcfKWc{Weq%0$2|}b`;Euh(HPKE!;!jhWtSry}*>!|m AK>z>% literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Dumbbell_Set.jpg b/templates/ecommerce_end_to_end/data/demo_images/Dumbbell_Set.jpg new file mode 100644 index 0000000000000000000000000000000000000000..898b4a72f2cadff5f66a18117d1f13d2dbde1d57 GIT binary patch literal 17002 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Foam_Roller.jpg b/templates/ecommerce_end_to_end/data/demo_images/Foam_Roller.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0759e180046a64b53903de7960a30d5614ab9cc7 GIT binary patch literal 12877 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Laptop_Stand.jpg b/templates/ecommerce_end_to_end/data/demo_images/Laptop_Stand.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bb27f9d351838ba19b8b2fd860af2cc810d6246 GIT binary patch literal 11516 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Leather_Belt.jpg b/templates/ecommerce_end_to_end/data/demo_images/Leather_Belt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c5416ae7160cb3e1765bef048d6a1cfa84cff8d GIT binary patch literal 8262 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 AK>z>% literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Resistance_Bands_Set.jpg b/templates/ecommerce_end_to_end/data/demo_images/Resistance_Bands_Set.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dffa6180a9809e4016bfd7920876f27bdf46556a GIT binary patch literal 8357 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Running_Shoes.jpg b/templates/ecommerce_end_to_end/data/demo_images/Running_Shoes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3ebff18801b5ecc77a2bde7714c2768f6fc628d GIT binary patch literal 9124 zcmbVxWl&sA7v>OT2<}0L1PFv7KybGZG`KTZa0~8k3CW8~a81x*fZ#461eXB@hv4oE z3@$tG_igP~?XTTEw{BPU?LJ-SdCoaqxBEQKKCS>rl;xG=0T>tn00#O2JT3ra0oa&W zSXh|Y=mr}b8wW^$3q%VsKK@ezQerYPQesk4aw_^~g@sA(A(7#SJKpE0p8 zfmrB4jG%uP!9c45aezd)xI`cdQVP)jvpoI+km3SX04tanOn@h(7?`9OkADD+Xgjen z{v&|@DHu;MvCvlHKE=aFPpBsWJi)-ke1f(g4FEkm2t5wKBE=?q!6So1u4xWra--l4 zOZ<+@{Ik)lT*_(vvc#SYwH`ETiZLkd#A{=bJWG<)%DH4xG(^i|AmEa{|oH@ zz(tD2^#tt}Ea1PmFrN6JUrbUg>=!&ZWHOpSb2oA(-Y{H>w~61YyPh)hX`N77xR2ve zvGA|HJpC8ie~|s(0So{CLiWFa{cl|J00K-5wDT}Y0aAdA$zxP;y@aSXV-Y}>&FpMn zLkV&6kRoInufja5-{I;>OY2U=s#uX3%`B@NPs6hw^3y^D5>o`R6bsfPg&9> z%>A;=9o?x7$veB667jd()!Qud@T9;{bI!}r$@{sjw_TR(laHqzbleMlKT$a}4OM;k zceEHfvQ+tAXX_ZP%oj8d<=IC)0%#k#)z1#mAEha_9syEC+F5rGy6(>4>`Amnb6Jho zBY^SjP;aX&8Pxe78G7`G|))I1(S24Gsb>Xcfhysw_r<(%&77T!4w=k%e+zG2)5 zwzJ3I+wWf5$4Zk(spydTz=-#CH}Y{=_H~Pn^;pV~W7zg+lv40rJ*&MCc!h3qJ3u$B zT_>&GD6QSi^vzZ5$}#>vd%@mK%IzHC57EjLe2f$wJIn?EC_y_1_ z2&4UXQ8p^P_X_je-k;Xe6AF~oY*YqBs<&z=O_wAW$*{>vQ*NLs+}E?(kE&pU0AQSY zX;7G!t`f2F#b^iwYcP%Mn%Nh7k%PCCMnsoQN@n@wXC!x}vw)Mu*2R(b%bwwp*Oh%N zNlL683zLM{z7;QphdN^G|YX1-UKg_;+)v*wn_7LcV%xFP9kG(lC2WlpLdD^d_&uI1>uj zz!quA>xHULP7U1t`>{8aeJIZ1TfKYmBOq2QtMeKin8}`HT2lipHc(ZxGj?@ZkM;g- z_tBlQnv)RPdNkqe+e@KfrKPd~G}maxCqlsk{Q{u&4>r>zpnhnw+v1T|;Y6H|J5C_Wzhs4(EmYUnNE# zEKp-5Nwv8HejNnuS0g^E-Vc8rwG5|*1Y`h4`)88l<|Kg4l?1;VJH+dnn*J$v3tWP5 zI8!+=8?0#fGmJ1R_H}fb2ph0**^X`hQ7sy5NqGR9^*F8`xH8*mC$zf#A`A^ea;&#Q z_;3n>NU7Py;-@>>uLc}urYCwpc-XkWG0SW6Un7AjYo1<{n|>6~w5<;TLh_7Zl$A_J zLd=9k03;gwR8I$CpX{%tq*fC^Z2u{VL+DWJ zv<5RZ@5XLlnJs^>eDM7E0@F35N#R9D`u>%EKS%Pcn~7w^ni;v>yl2Bj%hX7HVZTPN zkt-l3uz4ql=WVo$v;?dN#CtLwA!cN@Cuu#H%}+J7#rp_o^9T*0g{>|>vy)^=SwT3n z7^Tp>QTuN4#l3B1t!<_|GcqjS@a1&%3iRjE-)PR^nU@JG@vG0xBjx=h6e>K)d=bBI zj`G}|7;wdwc99z!3~Nf0TLCL(k|0mHW&Z#ys9pgG{u1Ac&d7gb<^~-z`?|{|tM}mUDWBb| z5OkhGU@tIVroW<33Lu8mvhQo)gbUhNCR#UseU>Unqpu;NCAMJ|%s=7sj`g4ta$@D9 zZ%T3+`~&`))$e<4I2ASNuhR066%}i-c!@6#YXWpr2m#8b`uhV{hg2qGuB}A5WXYp$ zmq8J@rfK7<33>lmplo3m8Ez$4rlT%_B68`)=9A!3;HoLPuik>e2@+1Oz;O86U=b+Z zyN0bn^2;P}eCrEkqjmAZb~_^I*?0WkKPc>j~m ze?*D6S)1y;QfZWj@XJWbX?y_0BK<(gPXRME*QdT|UEbdMU={9y;m;{T4AM>-mP%6@C^y0OARKyJ)iJpIMOKCLIArn+jfFlK<@ zV4?a>SorR=zjCMxL?Ox5DO%W=XI&q6Lv5wFcE%FP&SKDA+HaPU0UZ97GY42})=l;E zWG-&9arCy)#bkETW7HhDv8fm5u3VnI(l#7-@?3CCnarPcj((H$SGGWKjEE?(evg;| z%)?W&6f9vB!m``)$X_49lguX%rEqEqqdnN;f;91sL*;-k3Y+LL`0tK zK17*FEZm1(b!xhjgw&=E3((i`aIyg;wfFS;ryRoLdk%lSSv>_K7hR9 z!l*(M4XlLAuy`P|4I(Ixv1TK?3a^uNa;dwh%YEz7V7GCtK8d5=1xvp#2o!QNr=0o6 zbI6b8-HBNXHwWb+VXlHX6V)RijM#q-m80f)Dw*YI7niBqUN;?5MGbG1_*yAd5v0!`sx|jef=*&6o6^pC z^_gk3Yidi*QT8W%pN{6F#gC*h5}6tU)2*NUoo*L+Np{gzQQYpm@Amjs9me&H>0yT-d>d;Bq;fg^0X!s+M` zHT&To0|$K2Pn)^HYqi3rfj+RiqH&zx#idDRi-3Mi`LKkGp%AT>!}N%_(5vvdE)f#4 zPrP2ExWLqhll`b6TGXPys0n}SjE&+vV=g5pChkRVcatzn42oF-_Ohrc@Oik+P|l3$4Gdt!kXxk8I-Vru^{dXLD3#Jd_t{J)uZqS?b~Y0ASewzTZ( z`QQtWB6p586+=+RStfv7id8rCq8`?>%f+&%_{ZU}+W z%im=>wtlXw`w$g;7lCMo7dbiHq*SygA}aX6Fz~{_rINJ>FX?P{O5aR{{&+!D_h8C8 zm%-T%j$85`UoVFpmmhhZV*N`+mmjxazgXg({xol`?`Ji2*{lxmxEtl<`b-C2+*hz+NJv=0<$mj36Nia@etLFLkLKw2c*y- zg$KB`4WT3#q8M59D$Tgc2a1K{_2wrweP6zN5WwuD03?ANp4=MHxq@DrKjE)$iG^tWgjzUdKGes{y(Y?~G`vutZfkfEMR;*_j)y+%)XPfjZNG?CC2PyQv~DSSOB_IJb|ccrE-F3BCj1Y#AD^Rf<# zQ}2q^5$_>01WoSRNJIKoGRTSr+m0w0nHXdH{W+>9hyfO2>$pVTa7vT~=o}Xia}hYq zN?>w31Bo88C5VFT%^mbgj;0_#o3mCoMH4nl+cyHap*`%=n@O{R8`o=wz~Szk!M^4` zEdQ;{r28D^j~3I$b>_{aso07)jALP@-`6{V5W5*-r~-GM^TgI9d1717||s7wEP}rBx3%O4*9Z{BGkSr+>x3GxI#S zIKQ?jjGxPy?@_qbEejiWI(d`fx0`CUhKnJ{nv{=0q(DrZ6ytL4JOT|YNA{` zQSS{c;z&YysyP{RT+8r#Sf8$}SW11RN0r%#uugGClW+2tJE)5V$rRPL4@Qse3gp<1 zoOreAKO;go<0TS!RILl6Bs+drd*Y&=wHgikxnKfAYY)2!s2_r)Xa&@3XZOey$N6Jf ztu(WpPy-L)6}xBZ7X}+CseEjIb+27TQTw~sGs+GHi_z`{lP{XWk>nE1gWFqLBC>H` zb~XD`hI|G02To;Y-+QpfZ9O@Gx#KggvMty%&#tv9#82u|8X%Q>t9|4>iUV}GL5^|- z7p0ltVH=O0L(MwlTq(Ff;kZqv#m1>LO)9-4!R5yJ^ayAjl_YO3<3S=O(dkvc0 zjEKuA#oXiOTW)^`?}L2p#3`^n&IF_^FXj8Jr5|gGxlMoB-J!8 zihzMk(Z)~z)*6~VpE&Sp7bzFOohw)b3B?X75kwRec$;67c2V;mA3FNPh$^ttpZJRF zD3#5<&lW2tlC)muKNzcw=RR$W*qq?s=*ZKF^zwVhJII7|RT86V20z_V#}wY}6+NB{ z=&9L(l;;t7AvO(`RVM7oBmv>8Uq*=3Pu`D8&|zM|3X=Pq!`7`M*Pc?q3IKzH0i?Ue z>QQ&hC2|GjEdsH_TJu#OsuUq|Dkzn+Z^F-sf;g{#NCUj29k zdg&rB)YkT4_nK;q`mVrqS&-VCuUX+RrxjAZ6*x zZCZ7evZ6p+Ry1-ZcfnvoA$&H_rt`*s=ty z^z=o{URsty8o{v5*Pqlu&5RLG2rZ1?vQ{;ukbJ@Vp5RIyCm$rde)2<8pI@cc);aak z(Odx0<06LLwtcUu$4nsEw7paux#8#dB7uK!?Ri;Se}q(}L3*{GfLvROt(xfnrX7wh5m$FT*|ZqHsERZ(gX@r67Z1 z{n<~y^i>nzPxb>t*j`B9uFh+VSk$XZoo@zku-_cq8wy5Oflm5Y;#S{2K30O(w zurtC*y%8Ob&{>eU&yu5DWGDaq-m0>f%dZ#x&ng02aGaL1j}&>~rOVrUg+<1f2>&~} zdKEB}38^2=PlRTCu9M~3I3&w6yHt>Z?BC&+Dqx>q6uq7A|4JE!q+?48>T{kdX3949 zOMK%b#s{;z(Wd2gIqNa=t#X^lv|Q28cF^GQn8-A*z@%hLQ^CWbw@Dk=I00Wri~M^# z(V@>8`l?)NG`s5bN_X?id~VgLG-$$V1wpF@u1=1!PZ+~GWTT|(@W;#y9YCVWW)Qqa z{R5ZPp+O?Wq4D}n8Lm;v@xLechJ)4| zsg}NC$&M5~`={Wlz@FAzL1O>;0aCX{?4dHK)7&C82q2-Vz>*93#1V>tE3=Y!3OzjR z(kh!F!g05ZX6_8swyKREUSjR`Hq>^O*r}@2BHV~6EbP?k_Xi0>*C#7i0sVu2+<8Ul z{p0Q(*qut2o64Fnr8u_P;_6wGi-$r2Uo4U;jJz;?%jKWEpBpignOe?&tI8e$^8dc^7Ja`b@#Zbrc$sTi?FQNd8s8h!}5A@3c)nVe~bdcYme^zLL#-hutOb z&FW`c8u!5+ClC4ItG=F-_f$P#$g8<`?gYe~ek-TR@ZjIg0Ymme&%F%_5`Srk+Ab1r zInH(PU&-8wtQj5B3R*fgjvzK&)*IcBR=4gYe;o(7gJ%TOTu2GVe+5Eo@~_pC&_51L>xqnoGNa<$E zFLro~&yzYMe=vzBr*M7GKgx=eZ8ceetzem7a19s9`$<3D`j|`hp)Tp z?jMBf4X9HSlDzD|G`%!|7`9_|s`XQGpW6|Z@;pmkD#gcY>2$Sf;x+EIs<8~~Bn&MN zNCIl23RF9q>wXt<+!kH;1DSJ6@&bb?uDx1t`}dc-2R7&X1Qs7OG`C;lrjG{i*oc3y zq@lin5L`DboH>SEPcG<8zQSSieQ)aisH8a&o>IllSlZk-jF$cV9R4(!S zaW<@OC*AH-|9%?lznswum0mb2{B-zgz-u90RMzabgkOe zAH^Q~N}X31>Q;9f6T&m!!UqyPH8qcHY)raA#pm#U0EY*i#yu<|ai3oZEMD0fI(}}f znxv;ojpk8aMk44*f{07j4cFcruYKK}?1-7-Ig7$F+dhLuiqq3-QjhXH_*F8y=SR+mA|3hje-o(u{1t?HnR zzC;cDWpuf0zuuKq>Jy;+rL@K)DVPoNx1x3Pwy-fig3^7{Vi`r|3`h`nLbB9qqX*9_ zk1V1X`3R050i1L(r8hq3WsUf5TqTr+mY16sF>yjdn0Fy~s*qLd*7pG(UtefrNw&&t z#y5+wOvgseh(!lv@i@{MsgoHcejRL}Sg%5rC_}lI6pL;`9pPNXhT^4(6biJs>%d%f zy_+QU)i6zC)rVNZA8BuX7bX~o8gIMZc+;FiYr%a!f*ICqoYss}zD14U_`>tAUPMw@ zCJDtP9~+ajWO9gnFtoz4!R|ea4Rr;ITOor(b$LTku_3gtdo0J76aho(WRHLa8AJa^ zz=hXgSc8*c1)Gv(Q$thZH=2s=*hU4gHw)-*7jwJYOA_Kt^u7a@#=)72XT}Pw%cR*| zrmZtl|0)SEaeSL3Hu7GPOS!kn{cU7ZBUtp!Bfy|wKdv4rna_-47?s+P%FOU99;zK) zF5xP@KGA;syMryOE0@#BTy8QGRL*2#LFdUeJyH5cKQVtJWoN}I<&J}6JtX|F&T+SX zfv})^zM%ZBJK{3;>riTy6p?YSjE;e=Iy2pZF}r2XFj<%c6dJt zo^G=>1c58QIbZTF$Ya>*X^2_-Js4K}Rabj}H|5f$&m9)3_6@FZSc3N#D^))fICa?Q zud@+|ohCRGmZRvcimLs^0=jKj?O!rYm~j?hMMki_3_b6!pn2hFKX=S*bj9r>uH}L^ zkvOWJkG{~qk9A^B%F9Kx=CmVU z;w)cpNpDzrBuQ`>w33ZRJ^eVn;vA3#YrkiZ754r}X^wEUh8IBhGn;L!V}_th7$kOX z6xJO(+td>1O$|kjKH4HGl@*z55loSbYKdZhbD*@!Z9UAEVnW0zCwMC#&L9IHe>u-M zdyCdS9Hd}dYhZ18K#pr8ywJ1g2j?XT|syRIk*ZL$3eXE_~VQjM@!@ifT{cD|nrOhIgUmTGs%f=7_ zhHkkjWT1-^5o{EnulF^c4X)28=7w@X;Pmx;PDrWeTV&g`{`hdK zqUQ7YfjqNKMfeEbK_v|lwZC=~2_e3wA!WmFU73a3(ZUBxnz7@!v0iMtNVSKM6ywAp z63a{jqpPaBAUT+eF~jrk$!_35eI*X>{@9Cjh*akV08&?t|EOh z*NG58NrCq9oC6N8TNj~FpABF0+L<{}q50`6u z(*3v}ZP2;^M`$W?P)D9HRd&32tG#8$WHRujx!C+};vN+-n4-oouz(`RWKAM&2{yK& zZF92yNs>uUuwvDywq)-#c1FX`+&cD)nIy5=0)lxTB3}kk?Dfn&5hp_$9t1Av*V!G~ zxI&g>kp&)uj3xd?tdlOQs$%fB&sq9h*a(+P7{7EM$o@HRY2%Z(!)3a((zqCd2{8&9`PnmGE0dWLcv#Jv6vwx}LqC)X_XZbap2ZWV zADA~!qBtezUvXL|X7YCOBNOYN35;{wKhBJM6I4b3t&7B#SA z@9<3Sf+@{>&Ps6BLfJS+=$cDqJxeg9$+j6s!!ZfoU z>-Nn(xOTVuiUkYwJ?tU!C-K=s2(5@9$Bq8`y-G5IZrUQTfI=biP zT_)vD*FxzooUTghPfb@V^Ws|bLMOf~#}OHfetXL}1l%=s_f!DE|HJn(fx;^FcU(j! zW$K?+3HW>TVO415TbFgsRjhr<>xfs{kl4vMF-2a{I3o5m5YCktf%Q=b-wyI!r{Dl~ z`Sv;G2Bb5*STJ=uwOS|z*CwGReo3TngDl&|CI6LbT%IvhALaHE`*a(omlICTDlw+LUF(d%b&=ug%SZ7i3 zL9FZW(n74P)(5F=R3T^BA)@G=5&E()uRy_Xa@OAae{HH*O>v=JrdlbNR_aOxC;JO>-fcT;eFrC~}o2&zP@t0)EBKSS? zv5zzPl;i*uN#Jt>kI!Qjw+DVm1Kng(F3QZ^cN}EBot{%J9JPKk&X})Bp|(mloLY;9YY8~2}PyY zK>;aJJp>3yM-c)M5Tq;pa_+tB-nHIe@4fG=+5gO*z4mACSu=AuaySJXH#0Id0ze=D z038kBa2zlM*dc6eY!LP%!_Lmm0p;a{9*Liahl^K$UrTb!lMoURlK6ktVG|(02}}V~5Rfzg763s6 zK!=|I#8IB?p#K!`-vWUlY)4sga&hw=c?r}1(E_5lJz}dB+aI3cSho-GSjvOP-$HQOt zSgmw+@z^Pv4!@YtJU{m&M%g5NxkiS9E>n_BB+4J7n@GonHhzoXNP^6@M{u9QuLXV0 zCf^4L8=hc36cv`pwmxqLP{AFNu}Si_D$BYGAP@@x;rx}AwQw%^VEwHpC}*fTFf3UO z=i3-+2XSO?H0kJI>W^D$+FgDTM&~(c&9C1k_g3wfQKWl*(jEqoW4FYF;F$;ZUoTRq zAd_q2^a&5ry%jQ}+HPY}Z~Vi(m7PA7866Y)F)1g|8cRFKz@LqmH?-{hrB(D6)#pkR z3w}G<5T|v&4UJtep>lKv=+jZfHl3)r@2A67ekY-G9Og4Kmbvq4})hxtI z`QXADzSqwNAQ}2}thtXrs;NY=t81EK+6yKs%aHVxnYI^Aw<^>qkBNk1fEM0E2N`2M zx&Rfz)h!Z`%17~nsq7G_IHp_QA2lP?PeikHFrRkala(dO;IKstbf?ZMD}b_J0gng~ zN>1%P_hF;rc=eh5kCC_l@%MdNAVlHW8=>1q-zT>A7H;}vnobjJFMGAGX(pX{7lje7 zk09xn#i?&335s4FpYy1=wEYzCUw~GD(JY^1&W-lGG89>&TUuSVjolfXC2CB*DSR2W zON}Xg&0cTqxa=OsLSHBhE^n$G(GcjkYn|sQckPy!`}OaQ0o<4wNY#9Htm9x}>)1a# z=f0MowR!wT#miQ2Jn@AS^L{fVJ)+IRK6l$4A3vPo+`p^qTQs_L>CEcsp9*6kIc4dZ zP=)?()>&1RVV?MdO+QPn52g~%Zs`<>hZUBzv9~1Ou%9t^R4)&ie;D`i%HWjP$GlVz zs51`5S0gk9`KQ%xMnumQOzWO(36{??dpURypOv5Q7Z1x-s1MKt*aTqKvF>7?8PK%9jauu_Ei`Z%7gzh#O@`0CHo9g_G7=Lj>w?`dyLT*E zMyCK;sglS$LzAJYf9Y%gj@`C1ps;Y^Yz!iZ=Sq_~epTPqa$s=aMVA8dkyx83uqnA~ z3qW-+O|H9kCLOCm=0M_Nn~bMGVmrpj%6V`|%&AZM3IxU?>Bq0(gf=&HRFNhqHok1Y zm9SmrdOXq=lGH5j(zhR$dM6}rT(UNigRE8-9s858F#KCIx8GMJW!5WGd^xd^QBUd~&^zdVef9&`f@~met&Y3?ujXHORap;{ol(6svXtb)9D8ybBL0q(&*Ng8q8; zaP&FFyo~5S#(rBo0LGHhVGkk2wicy)77A>Aa@|}+xzXdFpZq#jJqZ?=$*?osa~h`S zvJ*!K0*hK+J>TOac`+t2L%B9)#o4OHHLeMql94BFiIO7_0(N5DRjUz&!qhvc1Tk#V!!uX_*O%_a(l*Rg|D%e7li?S9pLw&@zx%)6pkorK_BAY;3vzvnWsU)Vp1w`j%F|nMP7>R7c{qG^yT%rbZe~U` zexduGq){E-A+8 zsiAEsqo~rU8RDJ%-P9Y+*UiCPbfo4Rr4_ifF=Srf&?p+i+0lTUfv%LmC9EO@AecOC{g+W@2|{6T<+K?FX*QbK+ex?m!np_FD<&&VQaH8tYjlIa0wj+ zCaXVmb4+eR#hAF&udJoxf2=DLYBv_m(R80y|4SPZQ{*CF2YEP{nmCltFNY{RHcxg> z#KZZnC?EIKby_vydTGx(jO=!X2c7xQFCXsr z-wL}mx=MC#82Pu;*)7Yurr`Ds2KeGU;LM~_fu`E;@nUv~A-qer}nqzdJx zGgYQn<#tQspCGJv)11AJ{sTT5OY=OjGR}Dw0m=2xrkMrW8s&%`*Dr-uNt7ywQ^UA* zZHe)RsP=#moRL;+d-30^;PYy0IPKQXdoA_3Z*)DaF8|%t8#9>HgqkO%#KPuCPKiB= ze9VrI>d4Q2kcxH%5n1?L+)P+A8qTzFt#fOisBjV(daSFgQ#+T(PWTH>sVh@BROd13kxfFll&1#O5=!2T64yYJqwvfBUTE2)QNswh|2l(<`}&0FfniHbk9 ztrcsxidY+W(7l-uGWd58C34_V0CF7N>tPx2L~PM)E?35lLDHj#_n3=n+r0K?-p*VaQ8Q=hqSbSk<$hTf(Q7J8Zv0}}G@h3z%a=1>H3K@F7-yhj)Er;?*Y?C-Nx6>#4c@0saQF(G`Ide1r2cS&h;aYKy()|bZxH!QtZG&)n>Q)s zMCMu6>>?wrweD&0iqE>`gv6uAEpt*`O>DtJNj3ZczRzTHamN;1;sG7GmW$qQ`!*m{ zoHB>x9Mc3xSHL`zmeF!U4<+Y3pZ@8Rs1w@AB0_zui5zI{6=b(jw3@L3(lm=pBa&p! z8p}Tgm){{dpnyX_Q;+#6Cna<5zVODkR_M3yyE2D>x!pGRc7pk~U*e#{0D}AGCHM>U zA&`sQOS=F4KxVe~@j=U_vWk(S$x2^C#>>0>%Wb}feGY-T+N8mkr8yOk6MWQUGRr4O zby80?j1w?vFwNGeN@wUQ-D>itk`w*oP{TLJyNdgYtY2xBjnj1PjNOTYNCzDoS4|xsitpJT{iyn0tvNy-5zPGjV%>=o?Tn2y#?4;)6pV z6ldIy&9WdCj&7>A%Z2K^w=+HQkCIac$$XQl#>danJ8Q)=T&V>iQnLnDN}mbFWKSuF zFBu-kCUtCj@c3tF`H!!tB1} z`!cySZ|>KTpzOoLlU5QxELO(e`_E|Cl1Z8Dde3<-xkd|KpU?nyXx1R(xhK)mcqosn zc1AYBKD+Z}+03zVn1{ ze`c;WS7~82#=B;|XZKB|j}^G)HESEnc1$O^#x2pt z{Koq!THuJAPm$eBq&oz^2_RN+D8wJv|#xP-VUa zrqf#8mNG3PA{YQ@k<9RC6P{!|XvY$?NbchC`1|UcUYs$uRuR^p@r@i29t{psFR_C= zJJwnwL=!3*96f)EZArm&aihFup%qf8mGk`r#YcFYT@2RTqYe%tI*41!Lj$(2$8VHT z&xX^ZgY=SDpJCqZC*T0ywjUjXkU*AJxGY`9aO<>0)wa8N@12VgkAwuaw_d)5)o5A%v+J61v%i00CFoB@pXtwN zG>u+)l4xu;@h-q9$XWP%IwA>-q{9LX;R4Qyv_I|Lm)V)4MK-u!b`N!RDj$#{d_y}Y zf@$ZL6${?2o~KN?&#C?n!=*labFyaSfC)sV5&4s&4=TChtAUz= zv?HZzcv7HXvh}hYO#B6d6lncQ7=l{tIX@kskNRbP!k`PG^)b))YWlgjR>B58#@dh_ zinEvqYW}rB6@TDrA2mh6)QJx!Sg=2YC+;x(LQ!nqFm*1%0{Zl;p~5fvQ=lbt^Q9?l zQA>`c>D{S)T{E`$_n}?CEX7fsGdf5v)OIK@B_X@UZQXy$TD@bh-V^?NqwH~FhgJ#z z8hUKNy)4!qUZz-svJ?wvF^J3PJRoOQpLPJYD#fH)e#f)W9pA04wKA9J;hi%=!U622 zGetBLsw-Hvb+}TAwDg(nRM@sX|E$HbDO8pr9boI2D-*W0L~PVw`~WL28CJT>9Cs^s zx%_1JWwJ{rF1UV8I^k)RZmKYJbuLGCz$e4p~e>|`L6SgQelOk6(+{o`3-U>ib@@ymZiQa z_)~cAjmX^yNvHkr(liq*r zpXW*o%BUYPAJ)1|X`E;+j{fa0*KArGFh)Moi=Eh ze#S%)iF3;Dw)SS5JPcCqG&64?GA#_u<`Kevmu7~eP&(`;EQnn0X2}#ds-Z(XO&Mkd z5E`=|OnH`HI4_hC2CX^B5xZ5{D;>}4su4URUIF4(zMkGfjyEYKhD*+j<>w>YIeQVI z^S0ngRUM4DJ+=-WfoDJncrKxYv$uLWUM!hCnQP~>Qjf!uA&ZuFWN;mXh{bVKL5l70 zJN6&=g5HU*n|~dheYKB-*Tnn8F-ZxjIm;FY31DesjsCFHB zw?MB9OZ|n2L%_^NQroYy7m7;RFQ}(A19G@%EILR&# zytU#PA%vF%qc1hIP%gc0y1pT~`a1~}$?c@9WsT2NWrr=2MLMi}Z=V8U&u^sVboRo2 z>G5aSOHf0lZsP95S)H!^VR2^7A- z-6SW;dQqzCn)!$IxbH!Sf|nsrYQa7wnIudI;WORV^B9*Xf`ET;QjOI1X$NDCCo3Z6UP^`M@J_tOOzBNh#{iNc}y- zhy&q0LZF9$a~654d|SbXJx;q%F})dJto}-`)WD);8C3v$eS`Xp0L5nvS4sxU!DMj; z=-Ik6g@lf;X3P#wECQL z9|p!K9CKY8rHU%33DFf=!0gN8><(gVl*F$o6Q~h=G3XdxIViVFd_Jv~$@;cv$*jd` jPJypLC0tN4!we!4g`T(NSAzI-DbgcPo5gvXNCM8Mg$2} zci|{ZU63;y*!v?P<9@-zC!qL7`JIZIg_Vt+gOls$FJTc;F>wh+C1n*=HFXU`BV!X& zGjj_EM<-_&S2y>7-+@8FA)#S$@d=4Z$$wH(b8_?Y3kr*hOKNKCAoUH6P0igsy?y-y zgG0m9GqZE^3yVw8&8_X7-M#&T!=uZq>zmuV`-jJ;|8T(oVE-HI-}v8P{|6VwKduk| zmIV&sKU^>$T>jm#7;qoIGQwjD$|LC8VUaQUAz}-~W>i|6gSP3+#V$K>?p&Vg4;1ECzrd@Ho@!jnF!iWz-63jgpk(8H&T&#i0c3 z_#*G;Qt7Kh%L6-t%f{*&T%4bp15E;z^wG0zgwWwz+Eit0W@*cLsBmj}>jUYAB|rAo zmW`l%79P9 z!=Ga$dV4{cb^}+%o3pb`B){aj!-Q&6d%?kzEWgH_%%EUlhOFm zND7!nv~eLgE<(dCd2yHNRw13QX_0D~ob_ijOhJP%Xh3YmuI2Rv&0;;MPEzw&oMrGd z4_wc^ua~9(4;Kg>8{n@%qe(5x9yte5k|&-xX*jJ1p`|}@d6m3@C4Y;dHjXAUh!33e z$+b+iupg%$w4y$9fk|kZ)8y(eaq=sJ!y&mktBY@M+J&F=BZx3E*yEZ&jTJQAnP{!L zrALfxiD2{6x(QNTXLe!yR3>)#4VZ{1%_z}wFYcUUeqtW(Yz=djcL3Z;UNt0?EKpHH zG=@5=Jm9|N=2&a(M)Qu%2|F8S`=M1m=h+3%pFU z>CC+YOn>+{XVPqPmJ@w~hs=JH^4O>b{;A;BeWh$XxI#nMoAfrC5Y$Hi9n@Nh5DlPIJ zdn8y(~T6?x^^0aEq;59rDLR3c$ZDqxi-LfFTv;hL;%bG-+j@DB6Sf1BYLO zPB$4|GsN;3hlpBh#PWjhK+!*MN~_dIDu)g0gP_BRRo2$d9m&XElM{7V5tr%q;F%YX zi}>Eu^+>1l&l(fCe^^mPw$8q{9)fIZ#MI!24SAjxu*zM5eSEkfD@Rg7A? z23-e83U(9s)jF+UA&J8yH`eb;1#7AJspEkT1#84KC#Oj;)7yr$ail~w**pP{^V0p9 zynlP;SIc{mm(|=t>l%5{dC)j3DzzJC9D}Rk*0rAH*l0j?KA`2%k)&{hqQk@a#tF!Z zR+4&#x>C#@(>^}Y2hr)0w1mXbTsl^EmbMS`8=@`_C9H|R%M?&j=%50lXvm&z=)5xU z)RM<2kh$FI5cB4e-VMqn=Tk=n4q65gk88DpBU5vIb&&r`C1Y+?^ab(QuZsC@;Ra_~ z+2Nku?L&o4N}3h&naJ|u6^(;r+^48wS_0!lNcxmpsEunVl`_$$jO%`zL&o=}T6KMC zQh|#Eg+07_)Q4SJ2PJYZiQR4UGh>6Pi?bK2n+g3>ITW{-)sXnnFci!%ae%$-ro>+= zN;mG5e)@aMU-gYGQe`&Htb@oYW8yY8=0pq=6eC(v`)|Bk6zUAFE4?mvMZmEL?=4$g z*-Zr(^y^a%0u{d!i)3`;d`;fja9|2)pkL=b=fI{m>av5%g8cnc;9hnq@9t3*Qo|`m z|HCWv0)`JVy=K9OTt8{GE;BWHKRwp8V{Q~lCjUZe8h@@OJ&LKh;>M0_AAp9v>374I zKASY9qpOLRCHB%N$j=kj=EWq+ns7*^sr_XzRP@h@C;rwu0QJy*BL9f(3+Ca1U}8QR zia^g^8?E6IMR4JSzlK#(p130;t2{5Fq%=yRdXUmZhrxviCM;-sQzw%B zH~E6q`7L=PLs|WW7)EbbwZA%Z?Fw)@eI5NKQn%+xivTr(;TQ@3+0x4SWM-Q)hA0Nm z&+vuFl(mmCI9_3n`P-qj?fNoT;98oUF(C&;-Nkg`Yl<86_dDQoNekr+&ye-$UTthH z9hlZlDvrwt{SQWruzP#(#enSeG?KMxb<6cOMM2WFg(kZ!ZP7=g)mVS@T{+j>?sYUe zi1U*@q;P#t6yiKQ*`V2ZB#w^Bk$-SAAxzDpZSCb&Z;ptX8}JqcR_OEZBa) z^7<9+SBG)iYYu0qc4tTF;mF>;(wOQ_TDEd;0jo5RRZ{cQFKJ`fH3A~A1_zY%qudv? zO*hv+xkigL&Z^v9%O)ZE3lSK%USIT(m-s${s$ubtHOK4p5+Jp#_F`9|xsI@&9zt>X zEsUjHT2~t63vBlVNZo&gzH>U-DhIh6A|UWVrjG8O;J7GytMF_p<`1XILwDt>{UUeK zSMhg@cAiu|wnvtX+0d=1*f;-ziN_m++vaxPz9`2Lrtk_%HG|{~7?VKsaazY%q7GW> z8?RO}a`ji7Gi4x$(44~zq^e|zw(3ifYMhx8tycDGsD>6-e1gj26~o6i`4$WvN!-NJ zaC}zfsuoV0%W$LFbdVI9An z*0t2pMdNm^mE3b`5vN}HMb4W4e$H*J*u%Ra>0+eBt7a~D)$T41Q`7CsH>FR^{hR&F zvv%4Df$h^Q`$=?cXWw__x+poFDcc!iGZ(_T3Mo8DD&Wg;<2@2sX}FiPE1aZd?hFRX z;&BbU+bn22zHiL5_Rh@TyCD8HUJC6TxaKW2(DeE#C(@9#G#NBXTN>d3lxQ(6#M8Sn zPCx5M)M0!G5Ty~j+5WDa(a*!>Jr|`4NuBBrO8B)b;V^-+!1MY&UhVSRUmv`>c_)?z z9?x24^acKM@NZm<ge7?q?stTnQJ-S)z zM~4+Y_t6lOK4iZG5Z?ibXdNCb(_9FP^ZI|HwIa~xb7$YU%=yHkB`!|xMPw79n{yy) zSN%Gp4Cb!R3iPcXL6xVKTkV&qS8g9x`ru+k1Fr=JL*mDo$-=~k4NT*jAlkrY;oU{d4fE*qo|45x+rJ$ zQ)!~<_f%*;Ilpjv+ATy7tTfGkt-si;ito|L_@gaFBVH1!yU_J_Ia(>gQP5vVqd*IM7 zIN?6-p%htAKk9#oraJN%8(iU2ZuJl#88tAJ^y4!{uYIp+6jB1SFZwVV64B0W-o-|Y z&f$bx{<^pg4NgpVi_R~~BD$_8G>&ZXt83jGIH+n&23YX=2YTsU9`@ePEWr5TtVMtaMTrww10`unw#VK zohvfo7``oAk{slQ!D$ab;JNG6#Es<#B+#+8O^7$qags{I7smEXPQU1sPxLCkco)o%qngHPf_{*ddHBk= z@c&SL3OguNz)@`;iAYF_xJMxdDK^&q+~CK6b`>6##ZTmGG1ySl&`yz3xegoZu0fgERuC7`soJz8|-l{1qLn4`&M7+!#~edgS7EZH#MM>-p5Enh2v9 z5Dy>bZ=g}Nth<$Ao}zAcR;XuEm_IFQ9-l?#J1I@<;WuOz(^b&X&P$tL#O`dG=3HGw z9?V$1zU^6wxT2ha%Q>{`{1*d!Rg84o)`2PI(V=&8nywaS%c@l~m8?DXg)+0{#2@GT z#)UhH8o$G!M(hwhEkvnlyaUWv2cMzeRRoN@d=phHZAjfQxm1O>dD(SmSiLA^Th`&C zKjcGtL&z}CIM!PzGkoJbx;3G@~ll;YMb*vqVOeOA1|jx-C_GTAiJz zlwBu-!hh7W2kOHTG2#OQ<@^#UBUeD1eo$G2LM=r}X}QyET6Px+t&| z13A|6QJ1@h>ax3<&@JOG=&+!I;PIH$qmmO=Sbd>QCHReW8ucu#IV&Z=ieW|X$y^}1X;xtvFCSTUM!zQV1^ts*kX7rZ z+~D$;im5n8d7%KS?`9I-BL-vpQM43(KQ&n};^amH-0L|&r2D|&T~!`_uv^7S?~{G5 zW=r7nuPBfo(%W?g!aJZOyZR#H&W^Pe3HxLmv4QlF$QJvD{9#ME%RJlU0oV7LQU3!JFtWhfooE#wtxup4x^#(v@1}FX7W`m@1fF;+ucG zbtP`m5nP3)@9+#W1dTCYm(BDE>+iaw0xnA45GTK}RcpEW(}d;?n&pH_#QfRdW&@ng zd~4$uk2Ux$Y-43?4pd;$%5?C}%CwhuVJG5oGb?pVS4gkM+$%a0E_^`f^f3W@lw;1w zsqEY8T*Tp^_8NTD(8`{F^ z0R=9C?F?LL4K7A;Z8J~Y)Nhfd*}v}Ylf%8fB5|rIPX)Qr#9!@vrjeLm??n*oxY*15 z@Mtk)hin0)Oem2Zt-IA&s#| zbN$wM+<~PtX4gC;UtgmzJj|0bTt1Ve=StkT)jBj;@i*;x^ilK35~=~dn~!20qXuVP z=XBETgi!G=rPGkW^YTF^dkt_^JD~1pl^;eUKe5Mjx=7+HNPH*}m-35~5k1tZNURXI za&T}eU0Sw~`N}rrI-O*u-H4`0T5~;vgSyt?kkeD*YQQV10KxnPZ?%-lNmzl8-!2%% zRCugD9I3@#q>OWn8AdTBHDT@?sBl+>-CR;wS77QZA1hoDarjh!`JpSc3#Nt}Ys``@b1TGZ z&5BvAqdi1=uNZ2QVZkOeIA}-WIWfN_5O3EUm5YSMz$S zVmm^Wqfuh)PF13#ZoI%Ub7{Tp_%rxhK1}^Cu%mjVx-H zTe`Rtw%>@@vWWT+tiKy9#G%1nQ>%+M#Gr2Ri&eYYIq#y!{6+UnQfvLSun5u(CJjn) z-Enwblw1sl2%+mZ5+~;oFQWpXw)Biljd7E{T~K{UHcwM0l=l)^*+tSo#2%mDRuxKk zUxZ6r3p@L1=T)UJ3Dt7B>n>c=ff;zC5c5lfEB*BFVIkMZMnBaOw_4lB^vJziy*J+T zgp7MOVDZVro<^}B`XflBkf)hH;^U@W2XjM8TQudq9ODGUfncos9k5JXL0e6|Jx-m4 zI&e6!E4K_8b)ng%!mRvWyb?7#9d^!jkI#HkSEQ770eHXA`hM5MP7 zgg5S1V&i0Jl}o51wjZ{`)V*9k0vjbrnfrrWFIo#jwkEk3OB6TLCRd->GtIZEPB4JM zW{oLEA|T+}=#wdgM*V1lco*_o7TZ?{$}i1n>DA&i28t(CyYF*WDXq{XT`-(EQ_!4Xn(A)4 zCRX>h7o~+ks9V=T?SM?s}#T*pE(=cym(~XL|mG!b!G9P_>G=pQ~;!==olZ7xzNp z!WVlfVDhi@dJRitur1~$v@6eX%r`jKL`}1-jhN${TNy{f@&vK>e>Ofs;SqQlb*&ym zd&=#r4(s__qt;kOQ=S2Up$Qd^N=+Jng@pB=@%WU+*gpas;pSNVsAGxSnr%{s_pQ$m zh$l2|-vMZ@Ha)Rbp=G&^@}UZDou-(ukA{>f{4%&EO(4|XP=O_bWYKj&u zxBl2Bz)ui7#l3if6OTt3rq(Yn3^l5C5CX$1N9y2GEm&wR=y*5yE^BV*iDIP>gm_DV9 zB!X|p(VI3F)5zjSbR<2rtUqd8=jWk@R~DZ~tjI7{y8&D|8f-? z+4|D$am?oYY@Jc=RX7OqskT4z&!STgmGM9Y;-PNl0_OOWlq!w$I8o)oo{Tn;f`Bb8h1nZMD&@O7Pl3Cm zsrA20X$kbxymrTjjKU+Bb|Nxd|<`85JA5#?{0Z`J8oEZ%KJ4Kos|2k{N|~ zl2RffkSTKjVFg3o+5K-{;ED^|7pCPA!l1}4gFKA2<{y}@_4|EaoX<<4ixsnKBRQDL zN&wCYSmIzDitLN<2i0e`yE*vcJ;ty%Zr{?+l(`j1cKrwi=FR4bU^)qmV~xJOW*hHi z7HH(LRh&4$SZ@VWR3cnsT2Z=#E%~CYE+hryEXcRk-x3{gr;D7Xkzo_!-kRhrzbuJu zr&$*L+z&^ag6!@D`@DFn-cBFgO;}i0*U`qXR3xce=U-DV;?giOdD+Ed8a9$NT?3?+ z*rnpZGUGAMJ{a06CtbFj|VXBK=vVr@vv+;RY1aZJ_zG=}hJf&_`=4{Q_weF4t zY~8=1X$DHqu-NTuodSn72cC9=dI;$Tl7@%y`;mkC1zsW*Li%tcolruF^YnLX;usue z@A|n3%3TDDMXo(<5XD33FsqSe;qLfuLEIndB@xuBhxU1?8q&s|tU0?Yc!LmdSUX9y zdVL(8=EDs}93)gFrt>8K?3g6>4mPR#5y}u|C`IVKidy{DAbehxTC$i{Q}2#st z=fvy&^nsnkZsu6MODv>Xkcua&sX)KcY^h^!g<U)OfI%jVHA3p6xRt&n9Yc>5S!&Mxe+?7ADHN!{)e*=I=YHh6rs&vQNBG^X1R zE7JP0&b&4JH|Fvvg-}iQ4i2cW@pMJCpejIRW>;M1HW43R)|fQ<@|7m)qCLvep!GsG z~V6rrs-4S*F<+ZXnZ+!kaHNVLsdihi~dSHM$Cg62~aG0tu6ZD zxvJ;aOX|JNcR(%VPOSj7O6U6q@NPi1S0&oo!aYknW!D>YaaW7{nseNJ&nC|fcuk4r z$8^y8+qPD?x!m74lWPW-hm_59s?K?HTUo@~LTsuWnA19Elq{2o=vp?ByhlZhv>$fG zYr0vHmzwjJYZ`ovqbDf5PKL2``7!{Ma6ILuXxv$GUW@`_L&4qz5LaVeuC+JX3O76s z(kBe<`uL)kl50Mgo65Amm7ctnW3(VJKJs7$19^|5{^DEKLbI!;d~N&Gc5`5ktC5b_ zX7Vgh2o*eHwixu35nE{SjY`2R0B_Od@TRDp!PQ`5;9sfZ_Ae`4cIuU+2v{A@IQOrJ z+*9leWjo#iufC5PoFSun8A7021>4y`AXg#s$Pb87a!cBLMRjd3Nqsm%7VviTrb@Q}ez zVumYV20fx)6DN3yS)I6cl7KvIe9)gl`tLzaU1_QinAR3(*sy^&KvI`v-gX} ziF0aH%w(G8htlRvEngY&36jnQo?{^fg}CYCLX{Kni7^#x3rEw!E99>R1Vc{lpV#FzSPczdZVGlf( z%DK=%Q8|G@mcs&%Y>LseUvYyKT_W%@?#Mss28@dYlDH}t_rstfeUKTUHLa+~I9Nvm z#2uA}-b~!phwZ-PH=5R3NKH%I)vqb&z9AQ>&^FI*{myghjSYr|&e-#}7ye(#RFolS zzs+m`rsmj0uYxbfW1e=K$L|2-hj_V*w_3BLFDiYwzeKN<;$S|Nudr)9&tqRIS&SrM zw#<2rPn?;=<#JS*MBuywqN@;$@Lmolha9JPLTL+BC`WDg$+5;|ZOyTZTVz`5BiH_# z(m1x-4 zIeu;9R`bd{O@;vsVr0Pl%c>U;aE|n`Da83s(-RY#puFzdI-8{CmUO*=G7J-S=mydX zGms|FpLX;aDr&4WhK);7%i<)tK%eVM-ivoY82L=WwW^{=qqfL{31qnW9k8zD1$I!l z{NaBq8l+jytX$Rndyl)6jW8y9ARo-9*7gzSo8vuV*QHP43Uj47_Q}&_pTR>wPZHN` z&>oI7)6FNhp?mUofSX6A-Nbx_c_!x9Y9)WoAxOA44tbOBPlh{64u=PmI!I+0AJUBF z+f=#0U2%g$TF4ZR4=!2t-Aih!2Y32F@VQgwC#`UBC|OIDp|640aNd(CoEMj>Pr(RD z4o22BDAEq}yHn)`XHT`GF1hnY5Nl|kW*>z(7h|Cv0mnt+;qu}@trf~cVBf#uYcquc zlp+z9s>VnfkuR|qO@Fb!7(V3cU0^E3s~nBn4CXWS&S*loWF30oySnaC1zNSF_nF)J zct?1Pbpk!3<)dWnQtxD z)ez?Rz%pI+lQ!-sDe?|mp+y-FBL$Jt(C-CdZ^sBASkbs`)}Pighu6%!r?PlA#x=FUuC))3AbOm4}^Ht~Hi6DP+eu09xCc(bZ77o2qmyQf3|YmmS{S zNO7sk)#RD>l7INpjgDH3zgZ9tL-&jK0zbN?C+hY?WgWLt{p4+9;9Q+u1UY7LZ#B%~ z2W9`ePc+Bc+$wX{dTJZ>!BV~(RGcdD2bvsDpB7M`Wn4|xdx5Y{Dq_DIo|x%Nt(S(7 z%j>;8-cI7YCf!xpz9nvta>!}|vBn6?1ZuY3<63X=SuHxv6&Ee|!Es8dG*9$cEw&x29pM7BOfvnE`F?7a=w4`u4+OlmLY-jX6Q z!XA@dU2)QOIER}a<1dcYkFi9oC)2AUGBUPOnBD<7LJyoP>%;j%bQ*on>N@v?cF_<< zo|kvPq{7I(an~FAvAEONGVJR+;D8D*UGlK@Y5uns(mO!XR+QZ5q^_zMEEP!k5lz&( zbw1+4eD7`SYa8XL0DZV%!;tlM^$YVT==4mw6SKGQh7rr32TbAzyQy?g|@Z1tp z;p@EvL});6C%Nt?ov_v8ZcloOmbndTdy-8Vq@PcWqP=zbzxRv4+@31piKN~uH_$6n z&}ap`>0k%EfF7r10>2`T;_bRA#wq}K79U{#?SF0N4H&d`HRQ!ir9aNGIC#D6Zpx8( zu{OSCW_3i7&AVR#fDhj zk@o34ko>Bp{&nVt$25H*(R&=1%I=broEhm&R zfe6zL?v;CP;`6p_EF2Y;Y)S@Bnd|<*o$7=o)MAOF2f*I^hTzO7lC}j5d)l&^(Ky3~ z+nuI0dIz*FNAK#2m_xA}GBhiqzGWE0G4(WNDsUX8-k_sEZ zKsXKKwOao!b?oNv0cz3ePJiStCrqBPAIIDe&o=U0p&ye-PR90<0Ad7G$e z^t|=(P;9s~hMPx&G^dKhd!aL4bes%rlzumiyIs5-lGJPBKj#yFDb-Yd5WW~+P_Mbz z(eOIm%k{vLk{iy_)T~5hj_LS5gq-^jddE61cu6DnXZW&J;;?HqiS#)tr?JJ{aTVO> zejmc>102ZLTpuD5H#fEoXY|L0`qh*jq2LqR06ln**)^p{l(cVu^=!EGG}6zqj%W3Y zKx2ftj3=6wb@@F#FQhwyom#-)Ob9BsY&)OP6jPjDtR{HBK#)-Uo-gqhzI=-x{Xu1% z=3nZ$2_dZeKt;dw_w*|dOCG~&sY$LVV!GpaCD=JxZgo_1tMlws(^`3E=b#(CDx^p<|vwhYLCXjHSbuH;*ICC(tZ(_o zPG)yguThfbmST$(p|imV?I+$m_m$~BCRWzRnp6B$n=$4MTug<@4n%=)#UM_&z#Rq< zT*N-8&?m>y)l?n^ zPj^eem}(FFQs87S`k!_Vr278%5(4{pAC)zCxA_@wE91MP*NiYZI1q4l$9Zb1=e{`E zwW4!#5(T^zrM+psAv`KH;w9L{Wz7{-H@hk*g)}yOG(fZ$*J(uqvrQ8ZK?pZJ==wTq z{3pv$utYIqkhDJZx@X)fm>X$wY^sp4(`tKQEwiq;j`VS5M!jhAmGVUwEXv;bkhA7D z5A0>6#D>D8y;iiU3mH2>^^<+1|lvv5)3XFtQ7YrU-s zli!~@8jdH%?k1CZL8AD>pO6trq{gD0BfK3Ogk&N3>d2){q}za}t$$K4dej5XY(3kr zVPrjoKDa|qA%cd$!p)<)tAV}w61 zM@i(JM`eRFOEmhZaVRFkPc~P@K`7@D^G(^zx9weqI_IyXj)_W-aX61gH(lp`eWpd< z24j3e#fR=$^YuSyX)l(R4~oWOii(Z?k@A%&Iuem3KCaH}R4IT`?ah`uc6pI!8v38U zBq2ryCeH2~WZ2`^W~B5<9gAe_G{;8m!&f&zK?$X9Mjuy~dF>P=?_A$zKfzG}e&Gr% zYw}=v+*d^RHN$6au5ztGy@bzLciNL^e*Z4jC_{!3Q9bGlohYFBfP!CPEge`V;uiX; zB=~lp1R`O6#AoDQcrpivUgqlWVo%I+kRyz+_cedSaCsO1X`vE8_fT8YDC83k0FJjR zZtNz$1AY#7~NHPh{)_KSW^$=95&;o7$G)P1(Au49@rY)>%pUHFI$-*BwPEnP>V3j z)92vVmzR|-4t2pH56;i2yq*ICEbw?;4?%PI1j z5Ta>g`ncj7AdKDaRL5>B8Xug5!n6Xm3s)0^>nj|<)qE~#fyGikyQ4FUc*e7Fj1-c5 zj+7HDlGXY-`*a;&}p>c7RSOE}-IjQs;`~ zfefwWfGdA;C$FI~&()ji{=dXT@MJ_MJvhV(IsUzx55_ zZGOZ;eA8~_hk1W@9A=BXF#0>AdE_()F!2c#nCsxlBLJE+$C}MHfqi#z_lzrbE_T1R zPfotjs}}2~CEl=3x{69%ng$yr>UJa1-bax9>wAqT^3{tlq?x_KGsG#OtK3~MoOeo` z@tz-stJYM11er+}FbM)89R4YF(IDIEH3qnk?Y*5lhQB4t{Ug`ep!c%klj&@O6a_#e?)M(gn3hVvdx~}%Azisf59cyHMbRZwmu_I#6DB#q%Lx#Z4nW- zYEQh(lUuI+nz2K!kWDW@kvkw2;lfdw13|}oDAas*RCVv2XY;mSA;%q7W31o-Xd~C|_2CSGKhXYF1&IYMg4|5) z!KSOB9Y>pK%<;imLwn5J$+6~?5}#43Jl&Q<4_(V$#k=j|ygNv=5lkmFOe)M^K5W=P zi?F_OBr9d){_5)WPc~MIIqEjst9;F({t~LYc-Sz=cMr|^ zy7Ebnc_)d;k+Z}HD#Uxtmj*i)gA@B#X}?{P5tuw*0O^=CZt*>;Zw@Re2H^RxptfD{ zso)S(QtRkEJ0X2o^`_|%3whN46S4xx2U!~j_fXi%~pxM+#{%UJs^XtB@$flwCI zrYA)Q6|ucc5tvAo!S_Alb}ZWsELgU}pk~RRJUHbM&(p#UR>D1sC7v%Cu?2<1#>q?v zd)tkRZ3p5s;TFT^n;Aoz#b+_g4pxlZBi<7Cl5sC#oAQN91h*SzuV1P6gMW}s+fc+$ z*nt_98Bg(0Gdt4XfD-aO{i$^b5*P)qGyl@$Z1zwdMfh~tWDDO3x9@tTL`Wm{uK1e{ z=chVjo9dP4w1zW|C}1^9Iv8;qBty$AOxxeSx+Ja2x-btkJy6-8$UBGw>WtP$aAM#H zc?2hhvG;@44L;mX#$1CZtF$+ERb5rQ*yJ`IB0|!1bk+fHDHWeK+F*sL1J|`;no5fm zP_&ux@bYg%@}@JS$HxwE&{15x>Cu6#sfC{_cH(c1CDs(m`-{| zXBf5wFBu!*#T5r0@TPu10RpCfJVheSIq_RW{F1HAG}m^-lTxW^&N{wSa{nZa5p8@40Nr>v-Y;wos!l-Z zHEv|_REEK$xFYO?z3%CThU~AX%B9K% z69@r&KQ~!tjRJwb62BK8l&H|RJ}kFi{u=kWoY<9I67@i1+Hr{rW?>B%5lANR8vQOt zF|8cmp~X}Qd#w57oLC6P$W^nri)Kj|HFeB1jtAB3)Bro~w39b@aBR+##ciJqVmHz3u@}-(iH5%L1taCacW!3vy1vAP zBk}EXHBAL4r$%geWPB@3xTURom3(UnYq zG(I(aicfQ=GAPo{JG2VqU=R#`2uxdAc2_@N;@(|5??S6!aaX=5dx{O{ELNMj^B$Jf zLv0RJovQY;maeI@YaH=}^R~FPIbatub)ew-PZL2&>x-1!l9Bu1)&CBV5P$g&qBmZk zC1r}~V5Vo=_GPf;QjH(l216)6SS@ySz5|ZuG@}W0MtrAQ3=6h63X3WUt=*Sht-End zGke|5Xzf}?XkG6S4y7_hr$Xr0$RK(hKh91EhwuBhhbjsAsAi2~$OaZ-ByV6Z%8n;6 zEy}4PGJg=)h-0f)?S~zBDBwA!bw9~u6J2n~QzrQd$iHql4Dt@h=Bw2%++?n!D!Ruk zMjQM9b&xwDEXV4YZW7MV+@OS>5qgbX3n- z=A7=?5}l4Kvgx}`8UY-@A+lhL%qqSam)2}hriCQ|XJFd7a2bF6zIdgJ1Ab}@qIw4q1VYNy8^Qj78x4n_@tqueISI?wQQ~L-0dDUE#B#pu;xzTYXFGU8 ziZ*y9?g(iP#eKXtwg0*qcj9|627!Og2S~O)qwyXIqLBDLk#J<8Km(D{a`y z0vtcoRFLvAxt^wWU?W7XJZ(>B(gIt?0sCzL2eMJdogdrMvvhf`*=mNA@#)TZq{WW5@x@y|kO>1(PpHU^;eg|HC>P@DJN{oc=uilVP<}(rQa}6lf z;;`UP4wKWwH`UTP3T&sO&q{R2N&G+XU!---?n%T3@mcy68ubt!8 zf)+&>A7(I4*Q<6f8XhJb3YvusW?9S=%3}Q``!5^2csW+QE_gqBc~w4`tevUE5wnXV z4w#q8y|sb2WS1CL`~E2@J;`iUJk^vL$-f+VAL z7-U~>A5@F95*mNvgJL_WTB3!x7dXrRGWX0|xfJUxL7~x)E^2o)z&j<+<@Us}5yRZn zJ<-5cUQ=WDHQEJMFO8$UVSKb#B^F&{AwFlQJre>xTvR(`BZK=A>!Gl3;c3}g&Dbkx za8&_kQ?!~V{>;KAf*+TqO|j2><1byMel_yHa)ccxnYq}ou)oY4ECNFD0L}!tDba-& zwS~4?iAsx6OnL_O@a5G@@ z0I!vbB+cg?fJE{qgymF7N{h^A1SMeMpmNroC|cs?A^e93X|x1{1-CgP%^}}HVtQ${ z*Dz5Ge?J%9)>gE!Vi>DF7{~0E&q}NlMsT93Fo*P`vqMqDd0>X_2CsDQ(PnVbJUT&9MA z35QmkD8OCOKwuny##}y-^Hk;q6|fm}CaoOWWQ^}jk`?by-E(?X`>#v+TnT|!TC!ue zA10?qDxqed)TwAO{bhYy$`q9NAve~~a(~UYah@|#7M9xlx!uxkK;k!W4UIpz!s~Fb z$3=i6r<<0UN&x}CpIIBB=N#TOcwmh@T;O6X8fq;&MjK&=+Um6v+w$Yc9UyJ^p@9~5aC8a}?VuW&d1K+=LQY5`e^`y~T|4cmcHFL~~*mFy; zck3s+wMN}gY4GM>%&YU>=2Yz!^CJTIdOPNkM!%gwq?KTf9!yb<8`!OLWay#LKuYzegDmt1id6FU)4+-WPP>^D=Irft618Gc&BbPKf* zvkGVNuw3GJKabMEY7kO^&f$WF<>$}}zL~2)=8X?0Tsvqmyskxh_JS)6!fxaA^rJV} z35jDLc)BHd2Po<=nrA&^T)%!p!NK??J*hj16}J^g$Tix z*e22a{|Fcf=l1!S99Psv?Z$HJfyg_Cf1YY5yep7MBiq)Cwuj1(ouK$nKd4&wL4J6A@Z4u;{X4R_*emTrVYW~;~I#Or#Qv+=NsloOT`S($?e#Y|WMD z=E>rtnpTlU+o@BYp+V!*kZEc=BfTCh@DGFh8K(GW!B>`0!vsYjMskjde)N(C0gIE# z$jLbMt}ji|wSN#w_txjlS7KgSgM6g)3{(-gj&ayyrxjNA-qP;WTHnN%aI)Z~!Yc;% z!Q#Bb;vS{+DkRr;7Y5YkF6McVQ`tPERaja#e}yer3&iE$7Am01Es^(cehX zHHlvC?0I8Nm>4b@k4y~Vz&(_=PQtR48Nuyx)ny}7#k!}5W8W5^rdnU>K$V(#=Qpsx zPf(1+f_vi}R~)gruwbll*NpBawQT$qt=dNwpOt4Cq7Bk{%)@tn6?2pMd)9hGDwRt=-pp1ux;y_d=ChBf|@E8o%mnP`pXSEVS=^zag@WF@!^ZvEWY770B zaH%V+#UcIMh6nI$bU&f5WF8&xxPAWs*pRy(cS##cPyO|pzjvf*cbYxclRbI#5C2atPIRHx30g-%n%ZSLc5m0#xc&*_S`vK@tkha;*5B>uIr7s4BeE+sK| zqS#p`SsvopnH2!f&UXdici?fJE5`mL{6vdPWw-D|@@ny0ms_1m=GV)Kh#(IsLuHq) zS-Rw4S309MZt6zYN2Qri#73Y4sscm&}ZFdBMNT!BT zk|U0XaO8hF*->d~W9=^e)9;&K2f-Vw-s;m$fy&2hBT{>FmOrgro5NlncJmn?GyTzV zA`i=TaKE#c#C=oZ29JAXu56Q3(vmiNv~Zq!IU!4@K;Ws#91(+$Ush#c=W@FP&tqEH z%1x~dPxwasJRvGHh$K=7C5t|D?nyN~dRCPTDzIs`=%8)+S8gi%+vIT^z;yXtmp_#= z%9Rk3W!u-BxgNv4E>+l9WnpU)s8oQUJ-NjO(%7lUbO)(f7y@c&@XEzYamE=6@#)Se z+5ps6Oq)0$^Nso4fa+{@=CLV=Qc*Q8o_dqJ{P zjWjz}Dt=icfg~f-m(S-~Y_P`w0HkV1+%PT&wiHou=y_(Fef_4Jw8$>+Py@B0wUDXr z_p!G>jb69Y_1mDI@h6(uSR6Ivk;RMw+i`EF73nd~uO8nqqyvmPk?p`Er7UO4{{UB* zj_!70LHgsZOKfSRdHuhKJViT|5b02;=vwXA{z5dLv6GVY_lAi z>Yf-}A37C$pPM5&{{R{`h5rCk5~`kg9lts*7dSr{_;Ot*L%!Bv)bC`5(i1DdE!4Z? z`=v3Cqdagc%Jgp;-a~JBbE-jQa^MEHwpW$+lm7S0K=&iB9+mW*_b|Z*>6uj&QWk-v~D6@TA!xZ4H z7J2@lwzE$mw~}bndlcUu94>eS1J@PWd>7Oq@SntOD_0YXi`0%`8cP-M zC%ciqtwX6t`AbylcPK^iQ%;gSmmk@x4=%4Hz+=}QS>my6ek%AcQ5OxT=!aIFNCGc0Gd|a`MpKW-2L8Fq4FPrejNDM#mbWCnjvdKarUdJQr;iIoQ>axYq7Qc zo<1qu-v}E{(;|yM@$hvB+B|>2NpI4=j+@~J!?}R-d@*i>aCThE7!Sef1o%1NAWFff zU&Ivu01f=SeK#7U(T1ll@T1^`?}G0xFSRcfMwv1u>z=B|--`{3seZ!{KL- zC;M9EvDz>J{aUAk!%`Uconumr^O3xMd@&Wgq^Zl04oA|6*LHt-#(&RxT7i`om8e9c z%JB`+P%wPRmHz;l%@SJb%AhW}8UQi#+7Hhpn$_~-KQJTezy7*V0;cXy9XX&6|Je;I BYq$Ua literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Smart_Watch.jpg b/templates/ecommerce_end_to_end/data/demo_images/Smart_Watch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..431d8419f06d58999ebd6dd1eec651e60570ff68 GIT binary patch literal 9069 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Succulent_Set_6-Pack.jpg b/templates/ecommerce_end_to_end/data/demo_images/Succulent_Set_6-Pack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43ba673c98c01be1f6d2293d05123edf0813065a GIT binary patch literal 23027 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 aF*(%=PnMs&*Gqq2*F(0B3Uc_Bk^kAVph<23 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/The_Algorithm_Design.jpg b/templates/ecommerce_end_to_end/data/demo_images/The_Algorithm_Design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a3f8f85f60bf89fc12b49382a853af6de0a4f2 GIT binary patch literal 19783 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 AK>z>% literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/USB-C_Hub.jpg b/templates/ecommerce_end_to_end/data/demo_images/USB-C_Hub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2851ba4ccf484484fb62eddf32b50d44304ab19 GIT binary patch literal 18689 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

      b107IC?h8P>bwlr6FWPl<@K3H`GEOIxoNdVI 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Water_Bottle_32oz.jpg b/templates/ecommerce_end_to_end/data/demo_images/Water_Bottle_32oz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48446fec6170726542172aca8c459a8016da17b3 GIT binary patch literal 10452 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 R!p%*bIj8#uk>z*O{{sl&e{lc+ literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Waterproof_Jacket.jpg b/templates/ecommerce_end_to_end/data/demo_images/Waterproof_Jacket.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77e6159cbc49e6f54cc6d9374067eb6df6a0423b GIT binary patch literal 11765 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Webcam_1080p.jpg b/templates/ecommerce_end_to_end/data/demo_images/Webcam_1080p.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e1edaa5b95712a392ce9bd3f1476306966e9e1b GIT binary patch literal 5992 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 literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Wireless_Headphones.jpg b/templates/ecommerce_end_to_end/data/demo_images/Wireless_Headphones.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06c237844a9f1d9566b461c689cb356037e933a8 GIT binary patch literal 5267 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 H`yc-UX8T&p literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/data/demo_images/Yoga_Mat.jpg b/templates/ecommerce_end_to_end/data/demo_images/Yoga_Mat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6eda7dc6811c456a53a79e6b6e0b11f5bfdc4b8 GIT binary patch literal 23339 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 Ryd^QB!k2psLI^npp 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 Y&aWJDpj3U)vNtM7=N{FnWVC<(+5Z13GXMYp literal 0 HcmV?d00001 diff --git a/templates/ecommerce_end_to_end/notebook.ipynb b/templates/ecommerce_end_to_end/notebook.ipynb new file mode 100644 index 000000000..d714230ec --- /dev/null +++ b/templates/ecommerce_end_to_end/notebook.ipynb @@ -0,0 +1,480 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# E-Commerce Recommendation System\n", + "\n", + "End-to-end demo using **Ray Data → Ray Train → Ray Data → Ray Serve** on Anyscale.\n", + "\n", + "```\n", + "┌──────────────────────────────────────────────────────────────────────┐\n", + "│ Product Recommender │\n", + "│ │\n", + "│ ▼ Stage 1 — Ray Data │\n", + "│ Preprocess images (resize, normalise) │\n", + "│ Clean text (descriptions + category) │\n", + "│ │ │\n", + "│ ▼ Stage 2 — Ray Train (TorchTrainer) │\n", + "│ Fine-tune all-MiniLM-L6-v2 with contrastive loss │\n", + "│ Save fine-tuned model checkpoint │\n", + "│ │ │\n", + "│ ▼ Stage 3 — Ray Data (Batch Embedding) │\n", + "│ Embed entire product catalog with fine-tuned model │\n", + "│ Save embeddings + metadata for serving │\n", + "│ │ │\n", + "│ ▼ Stage 4 — Ray Serve │\n", + "│ POST /recommend {image_base64} │\n", + "│ ImageToText (BLIP-base) → caption │\n", + "│ ProductRecommender (MiniLM) → top-5 products │\n", + "│ │ │\n", + "│ ▼ Streamlit UI │\n", + "│ Upload image │\n", + "│ │\n", + "└──────────────────────────────────────────────────────────────────────┘\n", + "```\n", + "\n", + "**Models used**\n", + "| Stage | Model | Size | Device |\n", + "|-------|-------|------|--------|\n", + "| Train | `sentence-transformers/all-MiniLM-L6-v2` | 22 M params | CPU |\n", + "| Embed | fine-tuned MiniLM | 22 M params | CPU |\n", + "| Serve | `Salesforce/blip-image-captioning-base` | 224 M params | CPU |\n", + "| Serve | fine-tuned MiniLM | 22 M params | CPU |\n", + "\n", + "Everything runs on **CPU** and completes in a few minutes." + ] + }, + { + "cell_type": "markdown", + "id": "cell-1", + "metadata": {}, + "source": [ + "## 0 — Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-2", + "metadata": {}, + "outputs": [], + "source": [ + "# Install dependencies (skip if already installed)\n", + "!pip install -q -r setup/requirements.txt" + ] + }, + { + "cell_type": "markdown", + "id": "cell-4", + "metadata": {}, + "source": [ + "### Peek at the product images" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-5", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.viz import plot_category_samples\n", + "import json\n", + "import os\n", + "import sys\n", + "import numpy as np\n", + "from pathlib import Path\n", + "from PIL import Image\n", + "# Make sure the project root is on the path\n", + "sys.path.insert(0, str(Path().resolve()))\n", + "\n", + "from utils import PRODUCTS, CATEGORIES, get_product_image\n", + "\n", + "plot_category_samples(PRODUCTS, CATEGORIES, get_product_image)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-6", + "metadata": {}, + "source": [ + "---\n", + "## Stage 1 — Catalog Generation\n", + "\n", + "Here we expand the base 30-product catalog to 1,000 products and add `text_clean` (strip / lowercase / collapse whitespace on `training_text`) directly in memory — no Parquet intermediate needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-7", + "metadata": {}, + "outputs": [], + "source": [ + "import ray\n", + "from utils import (\n", + " PRODUCTS,\n", + " attach_clean_text,\n", + " expand_catalog,\n", + " generate_catalog,\n", + " init_ray,\n", + ")\n", + "\n", + "init_ray()\n", + "\n", + "raw_dir = os.path.abspath(\"data/raw\")\n", + "\n", + "products = expand_catalog(PRODUCTS, target_size=1000)\n", + "print(f\"Catalog size : {len(products)} products\")\n", + "print(f\"Categories : {sorted(set(p['category'] for p in products))}\")\n", + "\n", + "catalog_records = attach_clean_text(generate_catalog(products=products, output_dir=raw_dir))\n", + "print(f\"Catalog records : {len(catalog_records)}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "cell-9", + "metadata": {}, + "source": [ + "---\n", + "## Stage 2 — Ray Train: Embedding Fine-Tuning\n", + "\n", + "The starter model (`all-MiniLM-L6-v2`) learned from general web text, not from our product categories. That makes it easy for a fuzzy query to land near the wrong kind of item in the embedding space.\n", + "\n", + "**Fine-tuning** trains the model with **contrastive loss**: same-category products move closer, different-category products move apart, so search and recommendations follow category boundaries better.\n", + "\n", + "We train on **100 products (20 per category)** so each category is represented and runs stay short. The t-SNE plots below show embeddings before vs after fine-tuning." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-10a", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from ray.train import CheckpointConfig, FailureConfig, RunConfig, ScalingConfig\n", + "from ray.train.torch import TorchTrainer\n", + "from utils.training import train_loop_per_worker\n", + "from utils import sample_per_category, resolve_artifact_paths\n", + "\n", + "TRAIN_PER_CATEGORY = 20\n", + "\n", + "# set up some paths\n", + "paths = resolve_artifact_paths()\n", + "MODEL_OUTPUT_DIR = paths[\"model_dir\"]\n", + "EMBEDDINGS_PATH = paths[\"embeddings_path\"]\n", + "METADATA_PATH = paths[\"metadata_path\"]\n", + "TRAIN_RESULT_DIR = paths[\"train_result_dir\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71a65499", + "metadata": {}, + "outputs": [], + "source": [ + "# TorchTrainer: 1 worker, contrastive loss pulls same-category pairs together\n", + "\n", + "trainer = TorchTrainer(\n", + " train_loop_per_worker=train_loop_per_worker,\n", + " train_loop_config={\n", + " \"base_model\": \"sentence-transformers/all-MiniLM-L6-v2\",\n", + " \"epochs\": 2,\n", + " \"batch_size\": 8,\n", + " \"lr\": 2e-5,\n", + " \"seed\": 42,\n", + " \"records\": sample_per_category(\n", + " catalog_records, n_per_category=TRAIN_PER_CATEGORY, seed=42\n", + " ),\n", + " },\n", + " scaling_config=ScalingConfig(num_workers=1, use_gpu=torch.cuda.is_available()),\n", + " run_config=RunConfig(\n", + " name=\"ecomm_embedding_finetune\",\n", + " storage_path=os.path.abspath(TRAIN_RESULT_DIR),\n", + " checkpoint_config=CheckpointConfig(\n", + " num_to_keep=2,\n", + " checkpoint_score_attribute=\"train_loss\",\n", + " checkpoint_score_order=\"min\",\n", + " ),\n", + " failure_config=FailureConfig(max_failures=1),\n", + " ),\n", + ")\n", + "print(\"TorchTrainer configured\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a52533d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Run the fine-tune and persist the best checkpoint in a ready-to-serve layout.\n", + "from utils.training import save_best_sentence_transformer\n", + "\n", + "result = trainer.fit()\n", + "print(result.metrics_dataframe[[\"epoch\", \"train_loss\"]].to_string(index=False))\n", + "\n", + "save_best_sentence_transformer(result, MODEL_OUTPUT_DIR)\n", + "print(f\"Model saved → {MODEL_OUTPUT_DIR}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "mfak14ffr38", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.viz import plot_training_loss\n", + "\n", + "plot_training_loss(result.metrics_dataframe)" + ] + }, + { + "cell_type": "markdown", + "id": "stage3-md", + "metadata": {}, + "source": [ + "---\n", + "## Stage 3 — Ray Data: Batch Embedding\n", + "\n", + "**The problem this solves:** embedding 1,000 products serially with a model loaded once per process is slow. Worse, at 1M products you can't fit the whole catalog in memory on one machine.\n", + "\n", + "Ray Data solves both: each actor loads the fine-tuned model **once**, then processes a steady stream of batches. Workers run in parallel, and Ray's streaming execution means only a slice of the catalog is in memory at any time. The same code scales from 1,000 to 100M products by adjusting the `ActorPoolStrategy` size." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19ef0810", + "metadata": {}, + "outputs": [], + "source": [ + "# Actor pool: each worker loads the fine-tuned model once and encodes batches in parallel\n", + "from pathlib import Path\n", + "from utils.embedding import ProductEmbedder\n", + "import ray\n", + "from utils import init_ray\n", + "\n", + "init_ray()\n", + "\n", + "assert Path(MODEL_OUTPUT_DIR).exists() and any(Path(MODEL_OUTPUT_DIR).iterdir()), \\\n", + " f\"Model not found at {MODEL_OUTPUT_DIR} — run Stage 2 first\"\n", + "\n", + "ds = ray.data.from_items(catalog_records).select_columns(\n", + " [\"product_id\", \"name\", \"category\", \"text_clean\"]\n", + ")\n", + "\n", + "rows = ds.map_batches(\n", + " ProductEmbedder,\n", + " fn_constructor_kwargs={\"model_dir\": MODEL_OUTPUT_DIR},\n", + " batch_size=8,\n", + " num_cpus=1,\n", + " compute=ray.data.ActorPoolStrategy(size=2),\n", + " batch_format=\"numpy\",\n", + ").take_all()\n", + "print(f\"Embedded {len(rows)} products\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10e45061", + "metadata": {}, + "outputs": [], + "source": [ + "# Persist vectors and metadata as two separate files.\n", + "#\n", + "# The dense (N, 384) matrix goes to .npy for fast mmap-style loads at serve\n", + "# time; product name/category/id go to a small JSON sidecar so the serving\n", + "# layer never has to pull full product text into memory at query time.\n", + "from utils.embedding import save_embeddings_and_metadata\n", + "\n", + "embeddings, metadata = save_embeddings_and_metadata(rows, EMBEDDINGS_PATH, METADATA_PATH)\n", + "print(f\"Embeddings : {embeddings.shape} → {EMBEDDINGS_PATH}\")\n", + "print(f\"Metadata : {len(metadata)} products → {METADATA_PATH}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-11", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.viz import plot_similarity_heatmap\n", + "\n", + "embeddings = np.load(EMBEDDINGS_PATH)\n", + "with open(METADATA_PATH) as f:\n", + " metadata = json.load(f)\n", + "\n", + "print(f\"Embeddings shape : {embeddings.shape}\")\n", + "print(f\"Products indexed : {len(metadata)}\")\n", + "\n", + "plot_similarity_heatmap(embeddings, [m[\"name\"] for m in metadata])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4y3rm2m16vy", + "metadata": {}, + "outputs": [], + "source": [ + "import importlib\n", + "\n", + "import utils.viz as _viz\n", + "\n", + "importlib.reload(_viz)\n", + "from utils.viz import plot_tsne_comparison\n", + "\n", + "base_embs, ft_embs, aligned_meta = plot_tsne_comparison(\n", + " metadata, embeddings, catalog_records=catalog_records\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "zf5cnnozpe", + "metadata": {}, + "outputs": [], + "source": [ + "# Numeric check: did fine-tuning actually make the geometry category-aware?\n", + "#\n", + "# Simple \"top-k neighbors share the same category\" scores read ~100% on this\n", + "# demo because product names already sound like their category — so the base\n", + "# model looks strong before we even train. The two metrics below still move\n", + "# after fine-tuning and tell us the embedding space really did reshape.\n", + "from utils.viz import print_embedding_quality_report\n", + "\n", + "print_embedding_quality_report(base_embs, ft_embs, aligned_meta)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-12", + "metadata": {}, + "source": [ + "---\n", + "## Stage 4 — Ray Serve: Online Recommendation API\n", + "\n", + "**The problem this solves:** BLIP (224M params) and MiniLM (22M params) have very different latency, throughput, and resource profiles. Bundling them into one process means the slower model throttles the faster one.\n", + "\n", + "Ray Serve deploys them as **independent deployments** that auto-scale separately. `ImageToText` can scale to 4 replicas for a spike in image uploads without adding MiniLM replicas you don't need. Both can be upgraded or rolled back independently, and the composing `RecommendationService` wires them together asynchronously behind a single `/recommend` endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-13", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import ray\n", + "from ray import serve\n", + "from utils import init_ray\n", + "\n", + "init_ray()\n", + "\n", + "os.environ[\"EMBEDDING_MODEL_DIR\"] = MODEL_OUTPUT_DIR\n", + "os.environ[\"EMBEDDINGS_PATH\"] = EMBEDDINGS_PATH\n", + "os.environ[\"METADATA_PATH\"] = METADATA_PATH\n", + "\n", + "import importlib, serve_app\n", + "importlib.reload(serve_app)\n", + "from serve_app import app\n", + "\n", + "serve.run(app)\n", + "print(\"Service running at http://localhost:8000\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-14", + "metadata": {}, + "outputs": [], + "source": [ + "# Smoke-test the running /recommend endpoint with a known product image.\n", + "#\n", + "# `encode_image_base64` handles JPEG compression + base64 in one call, and\n", + "# `post_recommend` POSTs the payload shape the service expects.\n", + "from utils import PRODUCTS, get_product_image, post_recommend\n", + "\n", + "product = PRODUCTS[0] # Wireless Headphones — should match other Electronics\n", + "img_arr = get_product_image(product)\n", + "result = post_recommend(img_arr)\n", + "\n", + "print(f\"Caption : {result['caption']!r}\")\n", + "print(f\"\\nTop-{len(result['recommendations'])} recommendations:\")\n", + "for r in result[\"recommendations\"]:\n", + " print(\n", + " f\" {r['rank']}. [{r['category']:18s}] {r['name']:35s} sim={r['similarity']:.3f}\"\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8vktgpfk9d", + "metadata": {}, + "outputs": [], + "source": [ + "# One image per category — does the pipeline generalise beyond headphones?\n", + "from utils import post_recommend\n", + "\n", + "print(f\"{'Category':<16} {'Caption':<45} {'Top recommendation'}\")\n", + "print(\"-\" * 85)\n", + "for cat in CATEGORIES:\n", + " prod = next(p for p in PRODUCTS if p[\"category\"] == cat)\n", + " r = post_recommend(get_product_image(prod))\n", + " top = r[\"recommendations\"][0]\n", + " print(\n", + " f\"{cat:<16} {r['caption'][:44]:<45} {top['name'][:20]} ({top['similarity']:.2f})\"\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-16", + "metadata": {}, + "outputs": [], + "source": [ + "# Teardown (optional — keep the service running if you want to use the Streamlit app)\n", + "# serve.shutdown()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/templates/ecommerce_end_to_end/serve_app.py b/templates/ecommerce_end_to_end/serve_app.py new file mode 100644 index 000000000..dbe138f6b --- /dev/null +++ b/templates/ecommerce_end_to_end/serve_app.py @@ -0,0 +1,356 @@ +""" +E-Commerce Recommendation System — Ray Serve Application +========================================================= + +Stage 3 of 3: Online recommendation endpoint + +Pipeline (multi-model composition) +----------------------------------- + POST /recommend {"image_base64": ""} + │ + ▼ + ImageToText ← Salesforce/blip-image-captioning-base + │ caption text + ▼ + ProductRecommender ← fine-tuned all-MiniLM-L6-v2 + cosine index + │ + ▼ + JSON response {"caption": "...", "recommendations": [...]} + +Run locally (development) +-------------------------- + serve run serve_app:app + # or: + python serve_app.py + +Run as an Anyscale Service +--------------------------- + anyscale service deploy -f service.yaml + +Test +---- + python client.py + +Ray version: 2.x (Ray ≥ 2.20) +Base image: anyscale/ray:2.47.1-slim-py312 (CPU-only) +See https://docs.anyscale.com/reference/base-images for the latest images. + +References +---------- +- Ray Serve Model Composition: https://docs.ray.io/en/latest/serve/model_composition.html +- Ray Serve Key Concepts: https://docs.ray.io/en/latest/serve/key-concepts.html +- Anyscale Services: https://docs.anyscale.com/services/ +""" + +import base64 +import io +import json +import os +from pathlib import Path +from typing import Any + +import numpy as np +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from ray import serve +from ray.serve.handle import DeploymentHandle +from starlette.requests import Request + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- + +BLIP_MODEL = "Salesforce/blip-image-captioning-base" +_HERE = Path(__file__).parent.resolve() + +# Model resolution order (first match wins): +# 1. Env var EMBEDDING_MODEL_DIR (explicit override) +# 2. Cluster storage fine-tuned model (written by notebook when /mnt/cluster_storage exists) +# 3. Local models/embedding_model (pushed or generated locally) +# 4. HuggingFace model ID — pre-cached in container image (Dockerfile bakes it in) +_CLUSTER_MODEL = Path("/mnt/cluster_storage") / "ecomm_embedding_model" +_LOCAL_MODEL = _HERE / "models/embedding_model" +_default_model_dir = ( + str(_CLUSTER_MODEL) if _CLUSTER_MODEL.exists() + else str(_LOCAL_MODEL) if _LOCAL_MODEL.exists() + else "sentence-transformers/all-MiniLM-L6-v2" +) + +_CLUSTER_EMBEDDINGS = Path("/mnt/cluster_storage") / "ecomm_product_embeddings.npy" +_LOCAL_EMBEDDINGS = _HERE / "models/product_embeddings.npy" +_default_embeddings = ( + str(_CLUSTER_EMBEDDINGS) if _CLUSTER_EMBEDDINGS.exists() + else str(_LOCAL_EMBEDDINGS) +) + +_CLUSTER_METADATA = Path("/mnt/cluster_storage") / "ecomm_product_metadata.json" +_LOCAL_METADATA = _HERE / "models/product_metadata.json" +_default_metadata = ( + str(_CLUSTER_METADATA) if _CLUSTER_METADATA.exists() + else str(_LOCAL_METADATA) +) + +EMBEDDING_MODEL_DIR = os.environ.get("EMBEDDING_MODEL_DIR", _default_model_dir) +EMBEDDINGS_PATH = os.environ.get("EMBEDDINGS_PATH", _default_embeddings) +METADATA_PATH = os.environ.get("METADATA_PATH", _default_metadata) + +TOP_K = int(os.environ.get("TOP_K", "5")) + +# --------------------------------------------------------------------------- +# Pydantic schema +# --------------------------------------------------------------------------- + + +class RecommendRequest(BaseModel): + image_base64: str # standard base64-encoded image bytes + + +# --------------------------------------------------------------------------- +# Deployment 1: Image → Caption (BLIP) +# --------------------------------------------------------------------------- + + +@serve.deployment( + num_replicas=1, + ray_actor_options={"num_cpus": 2}, + health_check_period_s=30, + health_check_timeout_s=60, +) +class ImageToText: + """Load BLIP and convert raw image bytes to a natural-language caption.""" + + def __init__(self): + import torch + from transformers import BlipForConditionalGeneration, BlipProcessor + + self.device = "cuda" if torch.cuda.is_available() else "cpu" + print(f"[ImageToText] Loading {BLIP_MODEL} on {self.device} …") + + self.processor = BlipProcessor.from_pretrained(BLIP_MODEL) + self.model = BlipForConditionalGeneration.from_pretrained(BLIP_MODEL) + self.model.to(self.device).eval() + + # Warm-up pass to avoid first-request latency spike + from PIL import Image as PILImage + + dummy = PILImage.new("RGB", (224, 224), color=(128, 128, 128)) + inputs = self.processor(images=dummy, return_tensors="pt").to(self.device) + import torch + + with torch.no_grad(): + self.model.generate(**inputs, max_new_tokens=30) + + print(f"[ImageToText] Ready.") + + def caption(self, image_bytes: bytes) -> str: + """Generate a caption for the given raw image bytes.""" + import torch + from PIL import Image as PILImage + + img = PILImage.open(io.BytesIO(image_bytes)).convert("RGB") + inputs = self.processor(images=img, return_tensors="pt").to(self.device) + + with torch.no_grad(): + out = self.model.generate( + **inputs, + max_new_tokens=40, + num_beams=3, + ) + + caption = self.processor.decode(out[0], skip_special_tokens=True) + return caption.strip() + + def check_health(self): + pass # model loaded in __init__; if it failed, the actor died + + +# --------------------------------------------------------------------------- +# Deployment 2: Text → Top-K products (sentence-transformer + cosine index) +# --------------------------------------------------------------------------- + + +@serve.deployment( + num_replicas=1, + ray_actor_options={"num_cpus": 2}, + health_check_period_s=30, + health_check_timeout_s=60, +) +class ProductRecommender: + """ + Embed a query text with the fine-tuned sentence-transformer, then return + the top-K most similar products via cosine similarity over a pre-computed + embedding matrix. + + Paths are accepted as constructor arguments so Ray Serve workers (which + do not inherit the driver's ``os.environ`` from a notebook) still load the + same model and index files as the process that called ``bind()``. + """ + + def __init__( + self, + embedding_model_dir: str | None = None, + embeddings_path: str | None = None, + metadata_path: str | None = None, + ): + from sentence_transformers import SentenceTransformer + + model_dir = ( + embedding_model_dir + if embedding_model_dir is not None + else EMBEDDING_MODEL_DIR + ) + emb_path = ( + embeddings_path if embeddings_path is not None else EMBEDDINGS_PATH + ) + meta_path = metadata_path if metadata_path is not None else METADATA_PATH + + print(f"[ProductRecommender] Loading embedding model from {model_dir} …") + self.model = SentenceTransformer(model_dir) + + print(f"[ProductRecommender] Loading product index …") + self.embeddings = np.load(emb_path).astype(np.float32) # (N, D) + # L2-normalise for fast cosine via dot product + norms = np.linalg.norm(self.embeddings, axis=1, keepdims=True) + 1e-9 + self.embeddings_norm = self.embeddings / norms + + with open(meta_path) as f: + self.metadata = json.load(f) # list of {product_id, name, category} + + print(f"[ProductRecommender] Ready. {len(self.metadata)} products indexed.") + + def recommend(self, query_text: str, top_k: int = TOP_K) -> list[dict]: + """Return the top-K products most similar to query_text.""" + q_emb = self.model.encode([query_text], convert_to_numpy=True)[0].astype( + np.float32 + ) + q_norm = q_emb / (np.linalg.norm(q_emb) + 1e-9) + + sims = self.embeddings_norm @ q_norm # (N,) + top_idx = np.argsort(sims)[::-1][:top_k] + + results = [] + for rank, idx in enumerate(top_idx, start=1): + m = self.metadata[idx] + results.append( + { + "rank": rank, + "product_id": m["product_id"], + "name": m["name"], + "category": m["category"], + "similarity": float(round(float(sims[idx]), 4)), + } + ) + return results + + def check_health(self): + pass + + +# --------------------------------------------------------------------------- +# Deployment 3: HTTP ingress (orchestrator) +# --------------------------------------------------------------------------- + +_fastapi = FastAPI( + title="E-Commerce Product Recommender", + description="Upload an image → get product recommendations", + version="1.0.0", +) + + +@serve.deployment( + num_replicas=1, + ray_actor_options={"num_cpus": 1}, +) +@serve.ingress(_fastapi) +class RecommendationService: + """ + HTTP ingress that chains ImageToText → ProductRecommender. + + Both sub-deployments are called via async DeploymentHandle so the + orchstrator never blocks. + """ + + def __init__( + self, + image_to_text: DeploymentHandle, + product_recommender: DeploymentHandle, + ): + self.image_to_text = image_to_text + self.product_recommender = product_recommender + print("[RecommendationService] Ready.") + + # ------------------------------------------------------------------ + # GET /health + # ------------------------------------------------------------------ + + @_fastapi.get("/health") + def health(self) -> dict: + return {"status": "ok"} + + # ------------------------------------------------------------------ + # POST /recommend + # ------------------------------------------------------------------ + + @_fastapi.post("/recommend") + async def recommend(self, body: RecommendRequest) -> dict[str, Any]: + """ + Accept a base64-encoded image, caption it with BLIP, then return + the top-K most similar products. + + Request body: + {"image_base64": ""} + + Response: + { + "caption": "a pair of wireless headphones", + "recommendations": [ + {"rank": 1, "product_id": "P0000", "name": "...", + "category": "Electronics", "similarity": 0.92}, + ... + ] + } + """ + # 1. Decode base64 → raw bytes + try: + image_bytes = base64.b64decode(body.image_base64) + except Exception as e: + raise HTTPException(status_code=400, detail=f"Invalid base64 image: {e}") + + # 2. Image → caption (async remote call to ImageToText) + caption: str = await self.image_to_text.caption.remote(image_bytes) + + # 3. Caption → recommendations (async remote call to ProductRecommender) + recommendations: list[dict] = await self.product_recommender.recommend.remote( + caption, TOP_K + ) + + return { + "caption": caption, + "recommendations": recommendations, + } + + +# --------------------------------------------------------------------------- +# Application binding +# --------------------------------------------------------------------------- + +app = RecommendationService.bind( + image_to_text=ImageToText.bind(), + product_recommender=ProductRecommender.bind( + embedding_model_dir=EMBEDDING_MODEL_DIR, + embeddings_path=EMBEDDINGS_PATH, + metadata_path=METADATA_PATH, + ), +) + + +# --------------------------------------------------------------------------- +# Local development entrypoint +# --------------------------------------------------------------------------- + +if __name__ == "__main__": + import ray + + ray.init(ignore_reinit_error=True) + serve.start(http_options={"host": "0.0.0.0", "port": 8000}) + serve.run(app, blocking=True) diff --git a/templates/ecommerce_end_to_end/setup/Dockerfile b/templates/ecommerce_end_to_end/setup/Dockerfile new file mode 100644 index 000000000..416ebf006 --- /dev/null +++ b/templates/ecommerce_end_to_end/setup/Dockerfile @@ -0,0 +1,24 @@ +FROM anyscale/ray:2.55.1-slim-py312-cu129 + +# Hugging Face cache: base image runs builds as `ray`, which cannot write under /root. +ENV HF_HOME=/home/ray/.cache/huggingface +ENV HF_HUB_ENABLE_HF_TRANSFER=1 + +# Inline deps: remote image builds disallow COPY from local paths (see setup/requirements.txt for the list). +RUN python3 -m pip install --no-cache-dir \ + torch \ + transformers \ + sentence-transformers \ + hf_transfer \ + streamlit + +# Bake public weights into the image so Serve cold start skips Hub downloads. +RUN python3 - <<'PY' +from huggingface_hub import snapshot_download + +for repo_id in ( + "Salesforce/blip-image-captioning-base", + "sentence-transformers/all-MiniLM-L6-v2", +): + snapshot_download(repo_id, token=False) +PY diff --git a/templates/ecommerce_end_to_end/setup/requirements.txt b/templates/ecommerce_end_to_end/setup/requirements.txt new file mode 100644 index 000000000..896a3e428 --- /dev/null +++ b/templates/ecommerce_end_to_end/setup/requirements.txt @@ -0,0 +1,8 @@ +torch +transformers +sentence-transformers +hf_transfer +scikit-learn + +# Notebook / UI +streamlit diff --git a/templates/ecommerce_end_to_end/setup/service.yaml b/templates/ecommerce_end_to_end/setup/service.yaml new file mode 100644 index 000000000..6f18e753f --- /dev/null +++ b/templates/ecommerce_end_to_end/setup/service.yaml @@ -0,0 +1,53 @@ +# Anyscale Service Configuration — E-Commerce Recommendation System +# Deploy from project root with: anyscale service deploy -f setup/service.yaml +# Status: anyscale service status --name ecomm-recommender-service + +name: ecomm-recommender-service + +applications: + - name: default + import_path: serve_app:app + route_prefix: / + deployments: + - name: RecommendationService + num_replicas: 1 + max_ongoing_requests: 20 + ray_actor_options: + num_cpus: 1 + + - name: ImageToText + num_replicas: 1 + max_ongoing_requests: 10 + ray_actor_options: + num_cpus: 2 + + - name: ProductRecommender + num_replicas: 1 + max_ongoing_requests: 10 + ray_actor_options: + num_cpus: 2 + +# CPU-only cluster (BLIP-base and MiniLM run fine on CPU for demo traffic) +compute_config: + head_node: + instance_type: m5.2xlarge + worker_nodes: + - instance_type: m5.2xlarge + min_nodes: 0 + max_nodes: 3 + +# Base image — CPU-only, Python 3.12 +# Check https://docs.anyscale.com/reference/base-images for the latest +image_uri: anyscale/ray:2.55.1-slim-py312 + +working_dir: . + +requirements: + - torch + - transformers + - sentence-transformers + - hf_transfer + - pillow + - numpy + - fastapi + - pydantic diff --git a/templates/ecommerce_end_to_end/streamlit_app.py b/templates/ecommerce_end_to_end/streamlit_app.py new file mode 100644 index 000000000..4275dbf53 --- /dev/null +++ b/templates/ecommerce_end_to_end/streamlit_app.py @@ -0,0 +1,163 @@ +""" +E-Commerce Recommendation System — Streamlit Frontend +====================================================== + +Lets you upload a product image and see the top-5 recommended products +returned by the Ray Serve endpoint. + +Run locally (while serve_app is running): + streamlit run streamlit_app.py + +Environment variables: + SERVE_URL Base URL of the Ray Serve service (default: http://localhost:8000) +""" + +import base64 +import io +import os + +import requests +import streamlit as st +from PIL import Image + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- + +SERVE_URL = os.environ.get("SERVE_URL", "http://localhost:8000") +RECOMMEND_ENDPOINT = f"{SERVE_URL}/recommend" +HEALTH_ENDPOINT = f"{SERVE_URL}/health" + +st.set_page_config( + page_title="Product Recommender", + page_icon="🛍️", + layout="wide", +) + +# --------------------------------------------------------------------------- +# Sidebar +# --------------------------------------------------------------------------- + +with st.sidebar: + st.subheader("Service Status") + try: + resp = requests.get(HEALTH_ENDPOINT, timeout=3) + if resp.ok: + st.success("✅ Service online") + else: + st.error(f"❌ Service returned {resp.status_code}") + except Exception as e: + st.warning(f"⚠️ Cannot reach service:\n{e}") + + st.markdown("---") + st.markdown(f"**Endpoint:** `{RECOMMEND_ENDPOINT}`") + top_k = st.slider("Number of recommendations", min_value=1, max_value=10, value=5) + + st.markdown("---") + st.markdown( + "**How it works**\n\n" + "1. BLIP captions the image\n" + "2. Fine-tuned MiniLM embeds the caption\n" + "3. Cosine search over the product catalog" + ) + +# --------------------------------------------------------------------------- +# Header +# --------------------------------------------------------------------------- + +st.title("🛍️ E-Commerce Product Recommender") +st.markdown( + "Upload a product image — the system captions it with **BLIP**, embeds the " + "caption with a **fine-tuned MiniLM**, and returns the most similar products." +) + +# --------------------------------------------------------------------------- +# Image upload +# --------------------------------------------------------------------------- + +col_upload, col_preview = st.columns([1, 1], gap="large") + +with col_upload: + st.subheader("Query Image") + uploaded = st.file_uploader( + "Choose an image (JPG / PNG)", + type=["jpg", "jpeg", "png"], + label_visibility="collapsed", + ) + + if uploaded is None: + st.info("No image uploaded — using a demo product image.") + from utils import get_product_image, PRODUCTS + demo_arr = get_product_image(PRODUCTS[0]) # Wireless Headphones + buf = io.BytesIO() + Image.fromarray(demo_arr).save(buf, format="JPEG") + image_bytes = buf.getvalue() + else: + image_bytes = uploaded.read() + + display_image = Image.open(io.BytesIO(image_bytes)).convert("RGB") + st.image(display_image, use_container_width=True) + + run = st.button("🔍 Find Similar Products", type="primary", use_container_width=True) + +# --------------------------------------------------------------------------- +# Call the service +# --------------------------------------------------------------------------- + +with col_preview: + st.subheader("Results") + + if run: + with st.spinner("Analysing image and searching catalog …"): + encoded = base64.b64encode(image_bytes).decode("utf-8") + try: + resp = requests.post( + RECOMMEND_ENDPOINT, json={"image_base64": encoded}, timeout=60 + ) + resp.raise_for_status() + result = resp.json() + except requests.exceptions.ConnectionError: + st.error( + "Could not connect to the service. " + "Make sure `serve run serve_app:app` is running." + ) + st.stop() + except Exception as e: + st.error(f"Request failed: {e}") + if hasattr(e, "response") and e.response is not None: + st.code(e.response.text) + st.stop() + + # Caption — shown prominently so viewers understand what drove the results + caption = result.get("caption", "(no caption)") + st.markdown("**Caption generated by BLIP:**") + st.info(f'"{caption}"') + + st.markdown(f"**Top-{top_k} recommendations:**") + recs = result.get("recommendations", [])[:top_k] + if not recs: + st.warning("No recommendations returned.") + else: + for rec in recs: + sim = rec["similarity"] + st.markdown( + f"**{rec['rank']}. {rec['name']}**   `{rec['category']}`" + ) + st.progress( + sim, + text=f"Similarity: {sim:.1%}", + ) + st.caption(f"Product IDs: {', '.join(r['product_id'] for r in recs)}") + else: + st.markdown("*Upload an image and click **Find Similar Products** to see results.*") + +# --------------------------------------------------------------------------- +# Footer +# --------------------------------------------------------------------------- + +st.markdown("---") +st.caption( + "Built with [Ray Serve](https://docs.ray.io/en/latest/serve/index.html), " + "[BLIP](https://huggingface.co/Salesforce/blip-image-captioning-base), " + "and [Sentence-Transformers](https://www.sbert.net/) on Anyscale." +) diff --git a/templates/ecommerce_end_to_end/utils/__init__.py b/templates/ecommerce_end_to_end/utils/__init__.py new file mode 100644 index 000000000..b93345f31 --- /dev/null +++ b/templates/ecommerce_end_to_end/utils/__init__.py @@ -0,0 +1,444 @@ +""" +Shared utilities for the e-commerce recommendation system demo. +Kept in a single .py file so both notebooks and scripts can import it. +""" + +import io +import json +import os +import random +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import numpy as np +from PIL import Image, ImageDraw, ImageFont + +# --------------------------------------------------------------------------- +# Constants +# --------------------------------------------------------------------------- + +CATEGORIES = ["Electronics", "Clothing", "Books", "Home & Garden", "Sports"] + +CATEGORY_COLORS = { + "Electronics": (70, 130, 180), # steel blue + "Clothing": (220, 90, 120), # rose + "Books": (120, 170, 60), # olive green + "Home & Garden": (200, 150, 50), # golden + "Sports": (80, 180, 140), # teal +} + +PRODUCTS = [ + # Electronics + {"name": "Wireless Headphones", "category": "Electronics", "price": 79.99, "description": "Over-ear noise-cancelling Bluetooth headphones with 30-hour battery life."}, + {"name": "Mechanical Keyboard", "category": "Electronics", "price": 99.99, "description": "Compact TKL mechanical keyboard with tactile switches and RGB backlight."}, + {"name": "USB-C Hub", "category": "Electronics", "price": 39.99, "description": "7-in-1 USB-C hub with HDMI, SD card, and 100W power delivery."}, + {"name": "Webcam 1080p", "category": "Electronics", "price": 59.99, "description": "Full HD webcam with built-in microphone for video conferencing."}, + {"name": "Portable SSD 1TB", "category": "Electronics", "price": 109.99, "description": "Ultra-fast portable SSD with USB 3.2 Gen 2 and rugged aluminum case."}, + {"name": "Smart Watch", "category": "Electronics", "price": 199.99, "description": "Fitness smart watch with heart-rate monitor and 7-day battery."}, + {"name": "Bluetooth Speaker", "category": "Electronics", "price": 49.99, "description": "Waterproof portable speaker with 360° sound and 12-hour battery."}, + {"name": "Laptop Stand", "category": "Electronics", "price": 29.99, "description": "Adjustable aluminum laptop stand compatible with 10-16 inch laptops."}, + # Clothing + {"name": "Running Shoes", "category": "Clothing", "price": 89.99, "description": "Lightweight breathable running shoes with cushioned sole and wide toe box."}, + {"name": "Merino Wool Sweater", "category": "Clothing", "price": 69.99, "description": "Soft and warm 100% merino wool crewneck sweater, machine washable."}, + {"name": "Waterproof Jacket", "category": "Clothing", "price": 129.99, "description": "Lightweight packable rain jacket with taped seams and adjustable hood."}, + {"name": "Slim-Fit Chinos", "category": "Clothing", "price": 54.99, "description": "Stretch slim-fit chino trousers available in multiple neutral colors."}, + {"name": "Cotton T-Shirt 3-Pack", "category": "Clothing", "price": 29.99, "description": "Everyday crewneck cotton tees in classic white, black, and grey."}, + {"name": "Leather Belt", "category": "Clothing", "price": 34.99, "description": "Full-grain leather dress belt with silver-tone pin buckle."}, + {"name": "Hiking Boots", "category": "Clothing", "price": 149.99, "description": "Waterproof mid-cut hiking boots with vibram sole and ankle support."}, + {"name": "Puffer Vest", "category": "Clothing", "price": 59.99, "description": "Lightweight down-fill vest with snap front closure and two hand pockets."}, + # Books + {"name": "Deep Learning Book", "category": "Books", "price": 44.99, "description": "Comprehensive guide to deep learning foundations and modern architectures."}, + {"name": "Python Cookbook", "category": "Books", "price": 39.99, "description": "Practical recipes for writing idiomatic, modern Python code."}, + {"name": "Distributed Systems", "category": "Books", "price": 49.99, "description": "Principles and patterns of building reliable distributed systems at scale."}, + {"name": "Clean Code", "category": "Books", "price": 34.99, "description": "A handbook of agile software craftsmanship principles and best practices."}, + {"name": "The Algorithm Design", "category": "Books", "price": 59.99, "description": "Classic reference covering algorithm design techniques with worked examples."}, + {"name": "Designing Data-Intensive Apps", "category": "Books", "price": 54.99, "description": "In-depth look at the systems behind modern data-intensive applications."}, + # Home & Garden + {"name": "French Press Coffee", "category": "Home & Garden", "price": 29.99, "description": "Stainless steel French press with double-wall insulation, 34 oz."}, + {"name": "Cast Iron Skillet", "category": "Home & Garden", "price": 39.99, "description": "Pre-seasoned 10-inch cast iron skillet suitable for all cooktops."}, + {"name": "Bamboo Cutting Board", "category": "Home & Garden", "price": 24.99, "description": "Large reversible bamboo cutting board with juice groove and handle."}, + {"name": "Air Purifier", "category": "Home & Garden", "price": 119.99, "description": "True HEPA air purifier for rooms up to 500 sq ft, whisper-quiet."}, + {"name": "Succulent Set 6-Pack", "category": "Home & Garden", "price": 19.99, "description": "Assorted live succulents in 2-inch pots, easy-care indoor plants."}, + {"name": "Scented Soy Candle", "category": "Home & Garden", "price": 18.99, "description": "Hand-poured lavender and vanilla soy wax candle, 50-hour burn time."}, + # Sports + {"name": "Yoga Mat", "category": "Sports", "price": 34.99, "description": "6mm thick non-slip yoga mat with carry strap, eco-friendly TPE."}, + {"name": "Resistance Bands Set", "category": "Sports", "price": 24.99, "description": "Set of 5 fabric resistance bands with varying tension levels."}, + {"name": "Jump Rope", "category": "Sports", "price": 14.99, "description": "Adjustable speed jump rope with ball-bearing handles and steel cable."}, + {"name": "Water Bottle 32oz", "category": "Sports", "price": 29.99, "description": "Insulated stainless steel water bottle keeps drinks cold 24 hr / hot 12 hr."}, + {"name": "Foam Roller", "category": "Sports", "price": 22.99, "description": "High-density foam roller for muscle recovery and myofascial release."}, + {"name": "Dumbbell Set", "category": "Sports", "price": 89.99, "description": "Adjustable dumbbell set 5-25 lb per hand with compact storage tray."}, +] + +IMAGE_SIZE = (224, 224) + +# Adjectives and category-specific suffixes used to generate product variants +_VARIANT_ADJECTIVES = [ + "Premium", "Pro", "Lite", "Ultra", "Essential", "Plus", + "Max", "Mini", "Elite", "Classic", "Advanced", "Standard", + "Signature", "Sport", "Studio", "Travel", +] + +_VARIANT_SUFFIXES = { + "Electronics": [ + "Includes extended warranty.", + "Optimized for remote work.", + "Designed for content creators.", + "Features USB-C connectivity.", + "With advanced noise reduction.", + "Smart power management included.", + ], + "Clothing": [ + "Available in 8 colors.", + "Made from sustainable materials.", + "Reinforced stitching throughout.", + "Features moisture-wicking fabric.", + "UPF 50+ sun protection.", + "Slim-fit design.", + ], + "Books": [ + "Includes digital access code.", + "Updated 2024 edition.", + "With practice exercises throughout.", + "Annotated edition.", + "Includes 100+ code examples.", + "With online companion resources.", + ], + "Home & Garden": [ + "Dishwasher safe.", + "BPA-free construction.", + "Lifetime warranty included.", + "Eco-friendly packaging.", + "NSF certified.", + "Made from recycled materials.", + ], + "Sports": [ + "With antimicrobial coating.", + "Suitable for all fitness levels.", + "Includes carrying bag.", + "Made from recycled materials.", + "Ergonomic grip design.", + "Machine washable.", + ], +} + + +# --------------------------------------------------------------------------- +# Synthetic image generation +# --------------------------------------------------------------------------- + +def make_product_image(product: Dict, seed: int = 0) -> np.ndarray: + """Generate a synthetic product image as a numpy array (H, W, 3) uint8. + + The image is a solid-colored rectangle with the product name overlaid, + so it's visually distinct per category without requiring real photos. + """ + rng = random.Random(seed) + base_color = CATEGORY_COLORS[product["category"]] + + # Add slight per-product color jitter + color = tuple( + max(0, min(255, c + rng.randint(-30, 30))) for c in base_color + ) + + img = Image.new("RGB", IMAGE_SIZE, color=color) + draw = ImageDraw.Draw(img) + + # Draw a centered rounded rectangle as a "product card" + margin = 20 + draw.rounded_rectangle( + [margin, margin, IMAGE_SIZE[0] - margin, IMAGE_SIZE[1] - margin], + radius=15, + fill=tuple(max(0, c - 40) for c in color), + ) + + # Write product name (word-wrap at ~15 chars) + words = product["name"].split() + lines, line = [], [] + for word in words: + if sum(len(w) for w in line) + len(line) + len(word) <= 15: + line.append(word) + else: + lines.append(" ".join(line)) + line = [word] + if line: + lines.append(" ".join(line)) + + # Try to use a basic font; fall back to default + try: + font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 20) + small_font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 13) + except Exception: + font = ImageFont.load_default() + small_font = font + + total_h = len(lines) * 24 + y = (IMAGE_SIZE[1] - total_h) // 2 - 10 + for line_text in lines: + bbox = draw.textbbox((0, 0), line_text, font=font) + w = bbox[2] - bbox[0] + draw.text(((IMAGE_SIZE[0] - w) // 2, y), line_text, fill="white", font=font) + y += 24 + + # Category label at bottom + cat = product["category"] + bbox = draw.textbbox((0, 0), cat, font=small_font) + w = bbox[2] - bbox[0] + draw.text(((IMAGE_SIZE[0] - w) // 2, IMAGE_SIZE[1] - 35), cat, fill="white", font=small_font) + + return np.array(img) + + +_DEMO_IMAGES_DIR = Path(__file__).parent.parent / "data" / "demo_images" + + +def get_product_image(product: Dict) -> np.ndarray: + """Load the bundled realistic product image, falling back to synthetic. + + Variant products created by ``expand_catalog`` carry a ``_base_name`` key + pointing to their base product so they reuse that product's real image. + """ + image_name = product.get("_base_name", product["name"]) + safe_name = image_name.replace(" ", "_").replace("/", "-") + path = _DEMO_IMAGES_DIR / f"{safe_name}.jpg" + if path.exists(): + return np.array(Image.open(path).convert("RGB")) + return make_product_image(product, seed=hash(product["name"]) % 1000) + + +def image_to_bytes(img_array: np.ndarray, fmt: str = "JPEG") -> bytes: + """Convert numpy (H,W,3) uint8 array to compressed image bytes.""" + buf = io.BytesIO() + Image.fromarray(img_array).save(buf, format=fmt) + return buf.getvalue() + + +def bytes_to_image(raw: bytes) -> np.ndarray: + """Decode compressed image bytes back to numpy (H,W,3) uint8.""" + return np.array(Image.open(io.BytesIO(raw)).convert("RGB")) + + +# --------------------------------------------------------------------------- +# Text utilities +# --------------------------------------------------------------------------- + +def clean_text(text: str) -> str: + """Basic text cleaning: strip, lowercase, collapse whitespace.""" + import re + text = text.strip().lower() + text = re.sub(r"\s+", " ", text) + return text + + +def make_training_text(product: Dict) -> str: + """Combine product fields into a single string for embedding training.""" + return f"{product['name']}. {product['description']}" + + +# --------------------------------------------------------------------------- +# Dataset generation +# --------------------------------------------------------------------------- + +def generate_catalog( + products: Optional[List[Dict]] = None, + output_dir: str = "data/raw", + seed: int = 42, +) -> List[Dict]: + """Generate the synthetic product catalog and save images to disk. + + Returns a list of records ready to be loaded into a Ray Dataset. + """ + if products is None: + products = PRODUCTS + + Path(output_dir).mkdir(parents=True, exist_ok=True) + + records = [] + for i, p in enumerate(products): + img_array = get_product_image(p) + img_bytes = image_to_bytes(img_array) + + record = { + "product_id": f"P{i:04d}", + "name": p["name"], + "category": p["category"], + "description": p["description"], + "price": p["price"], + "image_bytes": img_bytes, + "training_text": make_training_text(p), + } + records.append(record) + + print(f"Generated {len(records)} products in '{output_dir}'") + return records + + +def expand_catalog( + base_products: Optional[List[Dict]] = None, + target_size: int = 1000, + seed: int = 42, +) -> List[Dict]: + """Expand the base catalog to *target_size* by generating product variants. + + Variant products share images with their base product via ``_base_name``, + but have distinct names and descriptions — giving the embedding model + diverse training signal without requiring additional real photos. + """ + if base_products is None: + base_products = PRODUCTS + if not base_products: + raise ValueError("base_products cannot be empty") + + rng = random.Random(seed) + expanded = [dict(p) for p in base_products] # start with originals + + i = 0 + while len(expanded) < target_size: + base = base_products[i % len(base_products)] + adj = rng.choice(_VARIANT_ADJECTIVES) + suffix = rng.choice(_VARIANT_SUFFIXES[base["category"]]) + expanded.append({ + "name": f"{adj} {base['name']}", + "category": base["category"], + "price": round(base["price"] * rng.uniform(0.75, 1.4), 2), + "description": base["description"].rstrip(".") + ". " + suffix, + "_base_name": base["name"], + }) + i += 1 + + return expanded[:target_size] + + +# --------------------------------------------------------------------------- +# Preprocessing helpers (used inside Ray Data map_batches) +# --------------------------------------------------------------------------- + +def preprocess_image_batch(batch: Dict) -> Dict: + """Normalize image bytes to float32 tensor bytes (224x224x3, range [0,1]). + + Suitable as a Ray Data map_batches function. + """ + processed = [] + for raw in batch["image_bytes"]: + img = np.array( + Image.open(io.BytesIO(raw)).convert("RGB").resize(IMAGE_SIZE) + ).astype(np.float32) / 255.0 + # Store as bytes (float32 little-endian) to keep Parquet schema simple + processed.append(img.tobytes()) + batch["image_tensor_bytes"] = processed + return batch + + +def preprocess_text_batch(batch: Dict) -> Dict: + """Clean training text. Tokenization happens inside the trainer.""" + batch["text_clean"] = [clean_text(t) for t in batch["training_text"]] + return batch + + +def decode_image_tensor(raw: bytes) -> np.ndarray: + """Inverse of preprocess_image_batch: bytes -> float32 (224,224,3).""" + return np.frombuffer(raw, dtype=np.float32).reshape(*IMAGE_SIZE, 3) + + +# --------------------------------------------------------------------------- +# Ray helpers +# --------------------------------------------------------------------------- + +def init_ray() -> None: + """Initialize Ray with reduced logging (idempotent).""" + import logging + import ray + import ray.data + + for name in ["ray", "ray.data", "ray.train", "ray.tune", "ray.serve", + "ray._private", "ray.runtime_env"]: + logging.getLogger(name).setLevel(logging.WARNING) + + ray.init( + ignore_reinit_error=True, + log_to_driver=False, + logging_level=logging.WARNING, + ) + ray.data.DataContext.get_current().enable_progress_bars = True + + +# --------------------------------------------------------------------------- +# Notebook convenience helpers +# --------------------------------------------------------------------------- + +def attach_clean_text(records: List[Dict]) -> List[Dict]: + """Add a `text_clean` field to each record (in-place), derived from + `training_text`. Same cleaning rules as :func:`clean_text`. + """ + for r in records: + r["text_clean"] = clean_text(r["training_text"]) + return records + + +def sample_per_category( + records: List[Dict], + n_per_category: int, + seed: int = 42, +) -> List[Dict]: + """Return a class-balanced sample — up to *n_per_category* items per + `category` — which gives contrastive training enough positives for every + category even when the dataset is large. + """ + from collections import defaultdict + + buckets: Dict[str, List[Dict]] = defaultdict(list) + for r in records: + buckets[r["category"]].append(r) + + rng = random.Random(seed) + sampled: List[Dict] = [] + for bucket in buckets.values(): + k = min(n_per_category, len(bucket)) + sampled.extend(rng.sample(bucket, k)) + return sampled + + +def resolve_artifact_paths(here: Optional[str] = None) -> Dict[str, str]: + """Pick where to read/write models + embeddings. + + On Anyscale clusters we prefer `/mnt/cluster_storage` so every node sees + the same files; on a laptop we fall back to a local `models/` folder. + Returns a dict with keys: model_dir, embeddings_path, metadata_path, + train_result_dir. + """ + here = here or os.path.abspath(".") + shared = "/mnt/cluster_storage" + use_shared = os.path.isdir(shared) + base = shared if use_shared else os.path.join(here, "models") + + def _p(shared_name: str, local_name: str) -> str: + return ( + os.path.join(shared, shared_name) + if use_shared + else os.path.join(here, "models", local_name) + ) + + return { + "model_dir": _p("ecomm_embedding_model", "embedding_model"), + "embeddings_path": _p("ecomm_product_embeddings.npy", "product_embeddings.npy"), + "metadata_path": _p("ecomm_product_metadata.json", "product_metadata.json"), + "train_result_dir": _p("ecomm_ray_train_results", "ray_train_results"), + } + + +def encode_image_base64(image_array: np.ndarray, fmt: str = "JPEG") -> str: + """Encode a (H,W,3) numpy image to a base64 ASCII string — the payload + shape our `/recommend` endpoint expects. + """ + import base64 + return base64.b64encode(image_to_bytes(image_array, fmt=fmt)).decode() + + +def post_recommend( + image_array: np.ndarray, + url: str = "http://localhost:8000/recommend", +) -> Dict: + """POST an image to the recommendation endpoint and return the JSON body.""" + import requests + + payload = {"image_base64": encode_image_base64(image_array)} + return requests.post(url, json=payload).json() diff --git a/templates/ecommerce_end_to_end/utils/embedding.py b/templates/ecommerce_end_to_end/utils/embedding.py new file mode 100644 index 000000000..6e9ca947f --- /dev/null +++ b/templates/ecommerce_end_to_end/utils/embedding.py @@ -0,0 +1,126 @@ +"""Batch embedding utilities for the product catalog.""" + +import json +import time +from pathlib import Path +from typing import List, Dict + +import numpy as np +import ray + + +def embed_catalog_in_parallel( + ds: "ray.data.Dataset", + model_dir: str, + pool_size: int = 2, + batch_size: int = 8, +) -> List[Dict]: + """Run the fine-tuned model across `ds` with an actor pool. + + Each actor loads the model exactly once and then streams batches through + it, so cost amortises across the whole catalog instead of per-row. + Scaling up is a matter of bumping `pool_size`. + """ + assert Path(model_dir).exists() and any(Path(model_dir).iterdir()), ( + f"Model not found at {model_dir} — run the fine-tuning stage first" + ) + return ds.map_batches( + ProductEmbedder, + fn_constructor_kwargs={"model_dir": model_dir}, + batch_size=batch_size, + num_cpus=1, + compute=ray.data.ActorPoolStrategy(size=pool_size), + batch_format="numpy", + ).take_all() + + +def save_embeddings_and_metadata( + rows: List[Dict], + embeddings_path: str, + metadata_path: str, +) -> tuple: + """Split the embedder output into a dense vector matrix (saved as .npy) + and a small JSON sidecar with just the fields the serving layer needs. + Keeping them separate avoids loading product text into memory at query time. + """ + embeddings = np.array([r["embedding"] for r in rows]) + metadata = [ + {"product_id": r["product_id"], "name": r["name"], "category": r["category"]} + for r in rows + ] + Path(embeddings_path).parent.mkdir(parents=True, exist_ok=True) + np.save(embeddings_path, embeddings) + with open(metadata_path, "w") as f: + json.dump(metadata, f, indent=2) + return embeddings, metadata + + +class ProductEmbedder: + """Ray Data actor: loads the fine-tuned model once, encodes batches of text.""" + + def __init__(self, model_dir: str): + from sentence_transformers import SentenceTransformer + self.model = SentenceTransformer(model_dir) + + def __call__(self, batch: dict) -> dict: + texts = batch["text_clean"].tolist() + embs = self.model.encode(texts, convert_to_numpy=True, show_progress_bar=False) + return { + "product_id": batch["product_id"], + "name": batch["name"], + "category": batch["category"], + "embedding": list(embs), + } + + +def run_batch_embedding( + preprocessed_dir: str, + model_dir: str, + embeddings_path: str, + metadata_path: str, + batch_size: int = 8, +) -> tuple: + """Run Stage 3: embed entire catalog with fine-tuned model. + + Returns: + (embeddings, metadata) — numpy array of shape (N, D) and list of dicts. + """ + t0 = time.time() + print("=" * 60) + print("STAGE 3 — RAY DATA: BATCH EMBEDDING") + print("=" * 60) + + ds = ( + ray.data.read_parquet(preprocessed_dir) + .select_columns(["product_id", "name", "category", "text_clean"]) + ) + print(f"\nRows to embed: {ds.count()}") + print("Running batch embedding …") + + rows = ( + ds.map_batches( + ProductEmbedder, + fn_constructor_kwargs={"model_dir": model_dir}, + batch_size=batch_size, + num_cpus=1, + compute=ray.data.ActorPoolStrategy(size=2), + batch_format="numpy", + ) + .take_all() + ) + + embeddings = np.array([r["embedding"] for r in rows]) + metadata = [ + {"product_id": r["product_id"], "name": r["name"], "category": r["category"]} + for r in rows + ] + + np.save(embeddings_path, embeddings) + with open(metadata_path, "w") as f: + json.dump(metadata, f, indent=2) + + print(f"\nBatch embedding complete! ({time.time()-t0:.1f}s)") + print(f" Embeddings : {embeddings_path} shape={embeddings.shape}") + print(f" Metadata : {metadata_path} ({len(metadata)} products)") + print("=" * 60) + return embeddings, metadata diff --git a/templates/ecommerce_end_to_end/utils/stages.py b/templates/ecommerce_end_to_end/utils/stages.py new file mode 100644 index 000000000..bc78998ce --- /dev/null +++ b/templates/ecommerce_end_to_end/utils/stages.py @@ -0,0 +1,142 @@ +"""High-level stage runner functions used by the demo notebook.""" + +import os +import shutil +import time +from pathlib import Path + +import ray + + +# --------------------------------------------------------------------------- +# Stage 1 — Ray Data: Preprocessing +# --------------------------------------------------------------------------- + +def run_preprocessing(output_dir: str, batch_size: int = 8) -> int: + """Generate catalog, preprocess images + text, write Parquet shards. + + Returns the number of rows written. + """ + from . import PRODUCTS, generate_catalog, preprocess_image_batch, preprocess_text_batch + + t0 = time.time() + print("=" * 60) + print("STAGE 1 — RAY DATA: PREPROCESSING") + print("=" * 60) + + raw_dir = str(Path(output_dir).parent / "raw") + + print("\n[1/4] Generating product catalog …") + records = generate_catalog(products=PRODUCTS, output_dir=raw_dir) + ds = ray.data.from_items(records) + print(f" Rows: {ds.count()}") + + print("\n[2/4] Preprocessing images (resize + normalise) …") + ds = ds.map_batches( + preprocess_image_batch, batch_size=batch_size, num_cpus=1, batch_format="numpy" + ) + + print("\n[3/4] Preprocessing text (clean) …") + ds = ds.map_batches( + preprocess_text_batch, batch_size=batch_size, num_cpus=1, batch_format="numpy" + ) + + print(f"\n[4/4] Writing to '{output_dir}' …") + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + Path(output_dir).mkdir(parents=True, exist_ok=True) + ds.write_parquet(output_dir) + + n = ray.data.read_parquet(output_dir).count() + print(f"\nPreprocessing complete! Rows: {n} ({time.time()-t0:.1f}s)") + print("=" * 60) + return n + + +# --------------------------------------------------------------------------- +# Stage 2 — Ray Train: Embedding Fine-Tuning +# --------------------------------------------------------------------------- + +def run_training( + preprocessed_dir: str, + model_output_dir: str, + train_result_dir: str, + base_model: str = "sentence-transformers/all-MiniLM-L6-v2", + num_epochs: int = 2, + batch_size: int = 8, + lr: float = 2e-5, + seed: int = 42, +): + """Fine-tune the embedding model with contrastive loss via TorchTrainer. + + Saves the best checkpoint to *model_output_dir* and returns the Ray Train + ``Result`` object (includes ``metrics_dataframe`` for plotting). + """ + import glob + + import torch + from ray.train import CheckpointConfig, FailureConfig, RunConfig, ScalingConfig + from ray.train.torch import TorchTrainer + from sentence_transformers import SentenceTransformer + + from .training import train_loop_per_worker + + parquet_files = glob.glob(os.path.join(preprocessed_dir, "*.parquet")) + if not parquet_files: + raise FileNotFoundError( + f"No parquet files found in '{preprocessed_dir}'. " + "Run Stage 1 (preprocessing) first." + ) + + t0 = time.time() + print("=" * 60) + print("STAGE 2 — RAY TRAIN: EMBEDDING FINE-TUNING") + print("=" * 60) + + records = ( + ray.data.read_parquet(preprocessed_dir) + .select_columns(["product_id", "name", "category", "text_clean"]) + .take_all() + ) + print(f"\nLoaded {len(records)} records for training") + + Path(train_result_dir).mkdir(parents=True, exist_ok=True) + + trainer = TorchTrainer( + train_loop_per_worker=train_loop_per_worker, + train_loop_config={ + "base_model": base_model, + "epochs": num_epochs, + "batch_size": batch_size, + "lr": lr, + "seed": seed, + "records": records, + }, + scaling_config=ScalingConfig( + num_workers=1, + use_gpu=torch.cuda.is_available(), + ), + run_config=RunConfig( + name="ecomm_embedding_finetune", + storage_path=os.path.abspath(train_result_dir), + checkpoint_config=CheckpointConfig( + num_to_keep=2, + checkpoint_score_attribute="train_loss", + checkpoint_score_order="min", + ), + failure_config=FailureConfig(max_failures=1), + ), + ) + + result = trainer.fit() + print(f"\nTraining complete! ({time.time()-t0:.1f}s)") + + print("\nSaving fine-tuned model …") + Path(model_output_dir).mkdir(parents=True, exist_ok=True) + checkpoint = result.best_checkpoints[0][0] + with checkpoint.as_directory() as ckpt_dir: + model = SentenceTransformer(ckpt_dir) + model.save(model_output_dir) + print(f" Model saved : {model_output_dir}") + print("=" * 60) + return result diff --git a/templates/ecommerce_end_to_end/utils/training.py b/templates/ecommerce_end_to_end/utils/training.py new file mode 100644 index 000000000..915f4ad32 --- /dev/null +++ b/templates/ecommerce_end_to_end/utils/training.py @@ -0,0 +1,196 @@ +"""Training utilities for embedding fine-tuning with contrastive loss.""" + +import os +import tempfile +from pathlib import Path +from typing import List, Dict + +import numpy as np +import torch +import torch.nn.functional as F +from torch.utils.data import DataLoader, Dataset +from ray.train import Checkpoint, get_checkpoint, get_context, report + +SEED = 42 + + +def build_embedding_trainer( + records: List[Dict], + train_result_dir: str, + base_model: str = "sentence-transformers/all-MiniLM-L6-v2", + epochs: int = 2, + batch_size: int = 8, + lr: float = 2e-5, + seed: int = SEED, +): + """Build a Ray :class:`TorchTrainer` configured for contrastive fine-tuning. + + Keeps checkpoint/failure config next to the training loop so the notebook + only has to say *what* it wants to train, not *how* Ray Train wires it up. + """ + from ray.train import ( + CheckpointConfig, + FailureConfig, + RunConfig, + ScalingConfig, + ) + from ray.train.torch import TorchTrainer + + return TorchTrainer( + train_loop_per_worker=train_loop_per_worker, + train_loop_config={ + "base_model": base_model, + "epochs": epochs, + "batch_size": batch_size, + "lr": lr, + "seed": seed, + "records": records, + }, + scaling_config=ScalingConfig( + num_workers=1, + use_gpu=torch.cuda.is_available(), + ), + run_config=RunConfig( + name="ecomm_embedding_finetune", + storage_path=os.path.abspath(train_result_dir), + checkpoint_config=CheckpointConfig( + num_to_keep=2, + checkpoint_score_attribute="train_loss", + checkpoint_score_order="min", + ), + failure_config=FailureConfig(max_failures=1), + ), + ) + + +def save_best_sentence_transformer(result, output_dir: str) -> str: + """Restore the lowest-loss checkpoint from a Ray Train `Result` and save it + in SentenceTransformer format — i.e. a folder that `SentenceTransformer(path)` + can load directly for serving. + """ + from sentence_transformers import SentenceTransformer + + Path(output_dir).mkdir(parents=True, exist_ok=True) + best_checkpoint = result.best_checkpoints[0][0] + with best_checkpoint.as_directory() as ckpt_dir: + SentenceTransformer(ckpt_dir).save(output_dir) + return output_dir + + +class ContrastivePairDataset(Dataset): + """ + (anchor, positive, 1.0) for same-category pairs; + (anchor, negative, -1.0) for cross-category pairs. + Labels match CosineSimilarityLoss / MSE-on-cosine expectations. + """ + + def __init__(self, records, neg_ratio=0.5, seed=SEED): + rng = np.random.default_rng(seed) + cat_to_idx = {} + for i, r in enumerate(records): + cat_to_idx.setdefault(r["category"], []).append(i) + + pairs = [] + for indices in cat_to_idx.values(): + for i, a in enumerate(indices): + for b in indices[i + 1 :]: + pairs.append( + (records[a]["text_clean"], records[b]["text_clean"], 1.0) + ) + + cats = list(cat_to_idx.keys()) + n_neg = max(1, int(len(pairs) * neg_ratio)) + for _ in range(n_neg): + cat_a, cat_b = rng.choice(cats, size=2, replace=False) + ia = rng.choice(cat_to_idx[cat_a]) + ib = rng.choice(cat_to_idx[cat_b]) + pairs.append((records[ia]["text_clean"], records[ib]["text_clean"], -1.0)) + + rng.shuffle(pairs) + self.pairs = pairs + + def __len__(self): + return len(self.pairs) + + def __getitem__(self, idx): + a, b, label = self.pairs[idx] + return a, b, torch.tensor(label, dtype=torch.float32) + + +def _forward_embeddings(model, texts, device): + """Run a SentenceTransformer forward pass with gradient tracking.""" + features = model.tokenize(texts) + features = { + k: v.to(device) for k, v in features.items() if isinstance(v, torch.Tensor) + } + return model(features)["sentence_embedding"] + + +def train_loop_per_worker(config: dict) -> None: + """Fine-tune the embedding model on each distributed Ray Train worker.""" + from sentence_transformers import SentenceTransformer + + rank = get_context().get_world_rank() + device = "cuda" if torch.cuda.is_available() else "cpu" + records = config["records"] + + pair_dataset = ContrastivePairDataset(records, seed=config["seed"]) + + def collate(batch): + texts_a, texts_b, labels = zip(*batch) + return list(texts_a), list(texts_b), torch.stack(labels) + + loader = DataLoader( + pair_dataset, + batch_size=config["batch_size"], + shuffle=True, + collate_fn=collate, + ) + + model = SentenceTransformer(config["base_model"], device=device) + optimizer = torch.optim.AdamW( + model.parameters(), lr=config["lr"], weight_decay=0.01 + ) + + start_epoch = 0 + ckpt = get_checkpoint() + if ckpt: + with ckpt.as_directory() as d: + meta = torch.load( + os.path.join(d, "meta.pt"), map_location="cpu", weights_only=False + ) + start_epoch = meta.get("epoch", 0) + 1 + model = SentenceTransformer(d, device=device) + + if rank == 0: + print( + f"Fine-tuning {config['base_model']} on {device} " + f"({config['epochs']} epochs, {len(pair_dataset)} pairs)" + ) + + for epoch in range(start_epoch, config["epochs"]): + model.train() + total_loss, n_batches = 0.0, 0 + for texts_a, texts_b, labels in loader: + labels = labels.to(device) + emb_a = _forward_embeddings(model, texts_a, device) + emb_b = _forward_embeddings(model, texts_b, device) + loss = F.mse_loss(F.cosine_similarity(emb_a, emb_b), labels) + optimizer.zero_grad() + loss.backward() + optimizer.step() + total_loss += loss.item() + n_batches += 1 + + avg_loss = total_loss / max(1, n_batches) + if rank == 0: + print(f" Epoch {epoch+1:2d}/{config['epochs']} loss={avg_loss:.4f}") + + with tempfile.TemporaryDirectory() as tmpdir: + if rank == 0: + model.save(tmpdir) + torch.save({"epoch": epoch}, os.path.join(tmpdir, "meta.pt")) + ckpt_out = Checkpoint.from_directory(tmpdir) + else: + ckpt_out = None + report({"epoch": epoch, "train_loss": avg_loss}, checkpoint=ckpt_out) diff --git a/templates/ecommerce_end_to_end/utils/viz.py b/templates/ecommerce_end_to_end/utils/viz.py new file mode 100644 index 000000000..8fcf00fc3 --- /dev/null +++ b/templates/ecommerce_end_to_end/utils/viz.py @@ -0,0 +1,288 @@ +"""Visualization utilities for embedding analysis.""" + +import os +from collections import Counter +from typing import Callable, Dict, List, Optional, Tuple, Union + +import numpy as np +import matplotlib.pyplot as plt + + +def plot_category_samples(products: List[Dict], categories: List[str], get_image_fn: Callable) -> None: + """Show one sample product image per category.""" + fig, axes = plt.subplots(1, len(categories), figsize=(15, 3)) + for ax, cat in zip(axes, categories): + product = next(p for p in products if p["category"] == cat) + img = get_image_fn(product) + ax.imshow(img) + ax.set_title(cat, fontsize=9) + ax.axis("off") + plt.suptitle("One sample image per category", fontsize=12) + plt.tight_layout() + plt.show() + + +def plot_products_per_category(products: List[Dict]) -> None: + """Horizontal bar chart of product counts per category.""" + cats = [p["category"] for p in products] + counts = sorted(Counter(cats).items()) + plt.barh(*zip(*counts)) + plt.xlabel("Products") + plt.title("Products per category") + plt.tight_layout() + plt.show() + + +def plot_training_loss(metrics_dataframe) -> None: + """Line plot of training loss across epochs.""" + m = metrics_dataframe + plt.plot(m["epoch"] + 1, m["train_loss"], marker="o") + plt.xlabel("Epoch") + plt.ylabel("Loss") + plt.title("Training Loss") + plt.tight_layout() + plt.show() + + +def plot_recommendations( + query_img: np.ndarray, + recommendations: List[Dict], + products: List[Dict], + caption: str, + get_image_fn: Callable, +) -> None: + """Show query image alongside recommended products.""" + fig, axes = plt.subplots(1, len(recommendations) + 1, figsize=(18, 3)) + + axes[0].imshow(query_img) + axes[0].set_title("Query image", fontsize=9, color="navy", fontweight="bold") + axes[0].axis("off") + + all_prods = {p["name"]: p for p in products} + for ax, rec in zip(axes[1:], recommendations): + prod_name = rec["name"] + prod = all_prods.get(prod_name, {"name": prod_name, "category": rec["category"]}) + rec_img = get_image_fn({**prod, "category": rec["category"]}) + ax.imshow(rec_img) + ax.set_title( + f"{rec['rank']}. {rec['name'][:18]}\n{rec['similarity']:.2f}", fontsize=8 + ) + ax.axis("off") + + plt.suptitle(f'Caption: "{caption}"', fontsize=11) + plt.tight_layout() + plt.show() + + +def plot_similarity_heatmap( + embeddings, labels, n=10, title="Product embedding similarity (top 10)" +): + """Plot cosine similarity heatmap for the first n embeddings.""" + n = min(n, len(embeddings)) + sub = embeddings[:n] + norms = np.linalg.norm(sub, axis=1, keepdims=True) + sim = (sub / norms) @ (sub / norms).T + + short_labels = [lbl[:20] for lbl in labels[:n]] + fig, ax = plt.subplots(figsize=(8, 6)) + im = ax.imshow(sim, vmin=-1, vmax=1, cmap="RdYlGn") + ax.set_xticks(range(n)) + ax.set_xticklabels(short_labels, rotation=45, ha="right", fontsize=8) + ax.set_yticks(range(n)) + ax.set_yticklabels(short_labels, fontsize=8) + plt.colorbar(im, ax=ax, label="Cosine similarity") + ax.set_title(title) + plt.tight_layout() + plt.show() + + +def _plot_tsne_side_by_side( + base_embs: np.ndarray, + tuned_embs: np.ndarray, + labels: List[str], + *, + base_title: str = "Base model (all-MiniLM-L6-v2)", + tuned_title: str = "Fine-tuned (contrastive loss)", +) -> None: + """Side-by-side t-SNE of two embedding matrices, coloured by category labels.""" + from sklearn.manifold import TSNE + + cat_list = sorted(set(labels)) + colors = [cat_list.index(c) for c in labels] + cmap = plt.cm.get_cmap("tab10", len(cat_list)) + + fig, axes = plt.subplots(1, 2, figsize=(14, 5)) + for ax, embs, title in [ + (axes[0], base_embs, base_title), + (axes[1], tuned_embs, tuned_title), + ]: + xy = TSNE(n_components=2, perplexity=10, random_state=42).fit_transform(embs) + ax.scatter( + xy[:, 0], xy[:, 1], c=colors, cmap=cmap, s=80, vmin=0, vmax=len(cat_list) + ) + ax.set_title(title) + ax.axis("off") + + handles = [ + plt.Line2D( + [0], + [0], + marker="o", + color="w", + markerfacecolor=cmap(i), + markersize=9, + label=c, + ) + for i, c in enumerate(cat_list) + ] + fig.legend(handles=handles, loc="lower center", ncol=len(cat_list), fontsize=9) + plt.suptitle("t-SNE: product embeddings coloured by category", fontsize=12) + plt.tight_layout(rect=[0, 0.06, 1, 1]) + plt.show() + + +def plot_tsne_comparison( + metadata_or_base: Union[List[Dict], np.ndarray], + embeddings_or_tuned: np.ndarray, + labels: Optional[List[str]] = None, + *, + catalog_records: Optional[List[Dict]] = None, + base_model_name: str = "sentence-transformers/all-MiniLM-L6-v2", +) -> Optional[Tuple[np.ndarray, np.ndarray, List[Dict]]]: + """Compare base MiniLM vs fine-tuned embeddings with a t-SNE plot. + + **High-level (recommended):** pass ``metadata``, ``tuned_embeddings``, and + ``catalog_records`` (list of dicts with ``product_id`` and ``text_clean``). + Aligns rows, encodes text with the base model, plots, and returns + ``(base_embs, tuned_embs, aligned_metadata)`` for downstream metrics. + + **Low-level:** pass ``base_embs``, ``tuned_embs``, and ``labels`` (three + positional args) to plot precomputed arrays only; returns ``None``. + """ + if labels is not None: + _plot_tsne_side_by_side( + np.asarray(metadata_or_base), + np.asarray(embeddings_or_tuned), + labels, + ) + return None + + from sentence_transformers import SentenceTransformer + + metadata = metadata_or_base # type: ignore[assignment] + tuned_embeddings = np.asarray(embeddings_or_tuned) + + if catalog_records is None: + raise ValueError("catalog_records is required") + id_to_text = {r["product_id"]: r["text_clean"] for r in catalog_records} + + idx = [i for i, m in enumerate(metadata) if m["product_id"] in id_to_text] + if not idx: + raise ValueError("No metadata rows overlap catalog_records product_id values.") + + aligned_metadata = [metadata[i] for i in idx] + ft_embs = tuned_embeddings[idx] + texts = [id_to_text[m["product_id"]] for m in aligned_metadata] + + base_embs = SentenceTransformer(base_model_name).encode( + texts, convert_to_numpy=True + ) + category_labels = [m["category"] for m in aligned_metadata] + _plot_tsne_side_by_side(base_embs, ft_embs, category_labels) + return base_embs, ft_embs, aligned_metadata + + +def compute_category_precision_at_k(embeddings, metadata, k: int = 5): + """Share of each product's k nearest neighbors (by cosine similarity) in the same category. + + Often hits 100% when product text already matches its category; use + ``mean_rank_first_cross_category_neighbor`` or ``mean_intra_inter_sim_gap`` + to compare base vs fine-tuned models in that case. + """ + n = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True) + sim = n @ n.T + np.fill_diagonal(sim, -np.inf) + cats = [m["category"] for m in metadata] + return np.mean( + [ + sum(cats[j] == cats[i] for j in np.argsort(sim[i])[-k:]) / k + for i in range(len(embeddings)) + ] + ) + + +def mean_rank_first_cross_category_neighbor( + embeddings: np.ndarray, metadata: List[Dict] +) -> float: + """Average rank when others are sorted by similarity: position of the closest other-category item. + + Rank 1 means the most similar product to you is already from another category. + Higher values mean other categories start further down the similarity-sorted list. + """ + n = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True) + sim = n @ n.T + np.fill_diagonal(sim, -np.inf) + cats = [m["category"] for m in metadata] + ranks: List[int] = [] + for i in range(len(embeddings)): + order = np.argsort(-sim[i]) + for rank_pos, j in enumerate(order, start=1): + if cats[j] != cats[i]: + ranks.append(rank_pos) + break + return float(np.mean(ranks)) if ranks else float("nan") + + +def mean_intra_inter_sim_gap(embeddings: np.ndarray, metadata: List[Dict]) -> float: + """Average gap: similarity to same-category products minus similarity to other categories.""" + n = embeddings / np.linalg.norm(embeddings, axis=1, keepdims=True) + sim = n @ n.T + np.fill_diagonal(sim, np.nan) + cats = [m["category"] for m in metadata] + gaps: List[float] = [] + for i in range(len(embeddings)): + intra = [ + sim[i, j] + for j in range(len(embeddings)) + if j != i and cats[j] == cats[i] + ] + inter = [sim[i, j] for j in range(len(embeddings)) if cats[j] != cats[i]] + if not intra or not inter: + continue + gaps.append(float(np.nanmean(intra) - np.nanmean(inter))) + return float(np.mean(gaps)) if gaps else float("nan") + + +def compute_category_precision_at_5(embeddings, metadata): + return compute_category_precision_at_k(embeddings, metadata, k=5) + + +def print_embedding_quality_report( + base_embs: np.ndarray, + finetuned_embs: np.ndarray, + metadata: List[Dict], +) -> None: + """Print a side-by-side base vs fine-tuned comparison on two robust metrics. + + We deliberately skip the easier "top-k neighbors share the category" score — + on this demo the product names already leak the category, so the base model + looks near-perfect there. The two checks below measure geometry in a way + that still shifts after contrastive training. + """ + rank_base = mean_rank_first_cross_category_neighbor(base_embs, metadata) + rank_ft = mean_rank_first_cross_category_neighbor(finetuned_embs, metadata) + gap_base = mean_intra_inter_sim_gap(base_embs, metadata) + gap_ft = mean_intra_inter_sim_gap(finetuned_embs, metadata) + + print("1) Sort other products by similarity (best match at the top).") + print(" How far down is the closest one that is not in your category?") + print(" (Higher = wrong-category items sit lower in that sorted list.)") + print(f" Base model: {rank_base:.1f}") + print(f" Fine-tuned: {rank_ft:.1f}") + print(f" Change: {rank_ft - rank_base:+.1f}") + print() + print("2) How much closer same-category items are than other categories") + print(" (larger = clearer gap between own category and the rest)") + print(f" Base model: {gap_base:.4f}") + print(f" Fine-tuned: {gap_ft:.4f}") + print(f" Change: {gap_ft - gap_base:+.4f}") diff --git a/tests/ecommerce_end_to_end/tests.sh b/tests/ecommerce_end_to_end/tests.sh new file mode 100644 index 000000000..b1d607d2a --- /dev/null +++ b/tests/ecommerce_end_to_end/tests.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +pip install papermill +papermill notebook.ipynb output.ipynb -k python3 --log-output