Ë
    øŒjh8  ã                   ó  — d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ h d£ZeD � ch c]  } | j#                  «       ’Œ c} Z eeed¬«      Z G d	„ d
«      Z G d„ de«      Z G d„ de«      Zyc c} w )é    N)ÚListÚDictÚOptionalÚAnyÚCallable)ÚOpenAIEmbeddings)ÚFAISS)ÚDocument>   ú	Dairy Altú	Fat / Nutú	Fat / Oilú
Carb / Nutú
Fat / SeedúFat / DairyúFat / SpreadúCarb / LegumeúLegume / CarbúCarb / ProteinúDairy / ProteinúCarb / VegetableúLegume / ProteinúVegetable / CarbúVegetable / cornúFruit / SeasoningÚCarbÚHerbÚDairyÚFruitÚSpiceÚTreatÚProteinÚSeafoodÚBeverageÚ	SweetenerÚ	VegetableT)ÚkeyÚreversec            
       ó¤   — e Zd Zddedefd„Zededefd„«       Zdee	   fd„Z
d	„ Zd
efd„Zdee   fd„Z	 	 ddedeeegef      dedee	   fd„Zy)ÚBasePDFVectorStoreÚ
index_pathÚembeddings_modelc                 óŒ   — || _         t        |¬«      | _        d | _        t        j
                  j                  |d«      | _        y )N)Úmodelzmanifest.json)r*   r   Ú
embeddingsÚvectorstoreÚosÚpathÚjoinÚmanifest_path)Úselfr*   r+   s      ú@/var/www/html/Fitness-lenito-AI-main/fitness_app/vector_store.pyÚ__init__zBasePDFVectorStore.__init__   s5   € Ø$ˆŒÜ*Ð1AÔBˆŒØ,0ˆÔÜŸW™WŸ\™\¨*°oÓFˆÕó    Ú	json_pathÚreturnc                 óÎ   — t         j                  j                  | «      st        d| › �«      ‚t	        | dd¬«      5 }t        j                  |«      cd d d «       S # 1 sw Y   y xY w)NzJSON file not found: Úrzutf-8)Úencoding)r0   r1   ÚexistsÚFileNotFoundErrorÚopenÚjsonÚload)r8   Úfs     r5   Ú_load_json_dataz"BasePDFVectorStore._load_json_data$   sJ   € ä�w‰w�~‰~˜iÔ(Ü#Ð&;¸I¸;Ð$GÓHÐHÜ�)˜S¨7Õ3°qÜ—9‘9˜Q“<÷ 4×3Ò3ús   ¼AÁA$Ú	documentsc                 ó  — t        j                  || j                  «      | _        t	        j
                  t        j                  j                  | j                  «      xs dd¬«       | j                  j                  | j                  «       y )NÚ.T)Úexist_ok)
r	   Úfrom_documentsr.   r/   r0   Úmakedirsr1   Údirnamer*   Ú
save_local)r4   rD   s     r5   Ú_build_faiss_from_docsz)BasePDFVectorStore._build_faiss_from_docs+   sW   € Ü ×/Ñ/°	¸4¿?¹?ÓKˆÔÜ
�‰”B—G‘G—O‘O D§O¡OÓ4Ò;¸ÀdÕKØ×Ñ×#Ñ# D§O¡OÕ4r7   c                 óº   — t         j                  j                  | j                  «      r2t	        j
                  | j                  | j                  d¬«      | _        yy)NT)Úallow_dangerous_deserializationF)r0   r1   r=   r*   r	   Ú
load_localr.   r/   )r4   s    r5   Ú_load_faiss_indexz$BasePDFVectorStore._load_faiss_index0   sA   € Ü�7‰7�>‰>˜$Ÿ/™/Ô*Ü$×/Ñ/Ø—‘ §¡Ø04ô ˆDÔð Ør7   Úinfoc                 óŠ   — t        | j                  d«      5 }t        j                  ||d¬«       d d d «       y # 1 sw Y   y xY w)NÚwé   )Úindent)r?   r3   r@   Údump)r4   rQ   rB   s      r5   Ú_save_manifestz!BasePDFVectorStore._save_manifest9   s0   € Ü�$×$Ñ$ cÔ*¨aÜ�I‰I�d˜A aÕ(÷ +×*Ñ*ús	   —9¹Ac                 óØ   — t         j                  j                  | j                  «      r5t	        | j                  d«      5 }t        j                  |«      cd d d «       S y # 1 sw Y   y xY w)Nr;   )r0   r1   r=   r3   r?   r@   rA   )r4   rB   s     r5   Ú_load_manifestz!BasePDFVectorStore._load_manifest=   sI   € Ü�7‰7�>‰>˜$×,Ñ,Ô-Ü�d×(Ñ(¨#Ô.°!Ü—y‘y “|÷ /Ñ.à÷ /àús   Á A Á A)NÚqueryÚ	filter_fnÚkc              ƒ   ó˜   K  — t        j                  «       }|j                  d | j                  j                  |||«      ƒ d {  –—† S 7 Œ­w©N)ÚasyncioÚget_running_loopÚrun_in_executorr/   Úsimilarity_search)r4   rZ   r[   r\   Úloops        r5   Ú_similarity_search_asyncz+BasePDFVectorStore._similarity_search_asyncC   sJ   è ø€ ô ×'Ñ'Ó)ˆØ×)Ñ)Ø�$×"Ñ"×4Ñ4°e¸QÀ	ó
÷ 
ð 	
ð 
ús   ‚AA
ÁAÁA
)ztext-embedding-ada-002)Né   )Ú__name__Ú
__module__Ú__qualname__Ústrr6   ÚstaticmethodÚlistrC   r   r
   rL   rP   ÚdictrW   r   rY   r   r   ÚboolÚintrd   © r7   r5   r)   r)      s²   „ ñG 3ð G¸#ó Gð ð  3ð  ¨4ò  ó ð ð5°°X±ó 5ò
ð) 4ó )ð ¨¡ó ð 7;Øñ		
àð	
ð ˜H d V¨T \Ñ2Ñ3ð	
ð ð		
ð
 
ˆh‰ô	
r7   r)   c                   ó0  ‡ — e Zd Zddefˆ fd„Z	 	 ddedefd„Zdefd„Zdefd„Z	ded	e
e   fd
„Z	 	 ddedededededed	e
e   fd„Z	 	 	 	 	 ddededededededed	e
e   fd„Z	 	 	 ddededededed	e
e   fd„Z	 	 	 ddededededed	e
e   fd„Zˆ xZS )ÚMealGenVectorStorer*   c                 ó2   •— t         ‰| �  |«       i | _        y r^   )Úsuperr6   Ú	food_dict©r4   r*   Ú	__class__s     €r5   r6   zMealGenVectorStore.__init__S   s   ø€ Ü‰Ñ˜Ô$àFHˆ�r7   r8   Úforce_rebuildc                 óâ  — |xs | j                  «        }|sƒ| j                  «       }|rq|j                  d«      |k(  r]	 |j                  d«      t        j                  j                  |«      k(  r*t        d| j                  › �«       | j                  |«       y	 t        d|› d�«       | j                  |«      }| j                  |«      }| j                  |«       | j                  |«       |t        j                  j                  |«      t        j                  «       dœ}| j                  |«       t        d	t!        |«      › d
�«       y# t        $ r}t        d|› �«       Y d}~ŒÎd}~ww xY w)zBLoad JSON and build lookup dict + FAISS index for semantic search.r8   Ú
json_mtimeõ%   âœ… Loaded existing FAISS index from Nõ"   âš ï¸� Load failed, will rebuild: u    ðŸ”„ Building hybrid store from ú ...©r8   ry   Ú	timestampu   âœ… Hybrid store ready: z docs indexed, dict populated.)rP   rY   Úgetr0   r1   ÚgetmtimeÚprintr*   Ú_populate_dict_from_jsonÚ	ExceptionrC   Ú_create_documentsrL   Ú_populate_dict_from_rawÚtimerW   Úlen©r4   r8   rw   Úneed_rebuildÚmanifestÚeÚraw_datarD   s           r5   Úload_or_create_indexz'MealGenVectorStore.load_or_create_indexX   sV  € ð %ÒD¨D×,BÑ,BÓ,DÐ(DˆÙà×*Ñ*Ó,ˆHÙ˜HŸL™L¨Ó5¸ÒBðDØ—|‘| LÓ1´R·W±W×5EÑ5EÀiÓ5PÒPÜÐ EÀdÇoÁoÐEVÐWÔXØ×5Ñ5°iÔ@Øð Qô 	Ð0°°¸4Ð@ÔAØ×'Ñ'¨	Ó2ˆØ×*Ñ*¨8Ó4ˆ	Ø×#Ñ# IÔ.Ø×$Ñ$ XÔ.ð #ÜŸ'™'×*Ñ*¨9Ó5ÜŸ™›ñ
ˆð
 	×Ñ˜HÔ%ÜÐ(¬¨Y«Ð(8Ð8VÐWÕXøô !ò DÜÐ>¸q¸cÐB×CÑCûðDúó   ¿AE Å	E.ÅE)Å)E.c                 óH   — | j                  |«      }| j                  |«       y r^   )rC   r…   ©r4   r8   rŒ   s      r5   r‚   z+MealGenVectorStore._populate_dict_from_jsonv   s    € Ø×'Ñ'¨	Ó2ˆØ×$Ñ$ XÕ.r7   rŒ   c                 óú   — | j                   j                  «        |D ]\  }|d   }|d   }|d   }| j                   j                  |i «      j                  |i «      j                  |g «      j                  |«       Œ^ y)uL   Build fast lookup: blood â†’ diet â†’ classification â†’ list of food dicts.Ú
blood_typeÚ	diet_typeÚclassificationN)rt   ÚclearÚ
setdefaultÚappend)r4   rŒ   ÚitemÚbÚdÚcs         r5   r…   z*MealGenVectorStore._populate_dict_from_rawz   su   € à�‰×ÑÔÛˆDØ�\Ñ"ˆAØ�[Ñ!ˆAØÐ%Ñ&ˆAØ�N‰N×%Ñ% a¨Ó,×7Ñ7¸¸2Ó>×IÑIÈ!ÈRÓP×WÑWÐX\Õ]ñ	 r7   r9   c                 óÌ   — g }|D ]\  }dd|d   |d   |d   |d   |d   |d   |d	   |d
   |d   dœ}t        j                  |«      }|j                  t        ||¬«      «       Œ^ |S )Nr@   Ú	food_itemr’   r“   r”   Ú	food_nameÚcategoryÚpriorityÚ	breakfastÚlunchÚdinner)ÚsourceÚsection_typer’   r“   r”   rž   rŸ   r    r¡   r¢   r£   ©Úpage_contentÚmetadata)r@   Údumpsr—   r
   )r4   rŒ   Údocsr˜   r¨   Úcontents         r5   r„   z$MealGenVectorStore._create_documentsƒ   s�   € ØˆÛˆDà Ø +Ø" <Ñ0Ø! +Ñ.Ø"&Ð'7Ñ"8Ø! +Ñ.Ø  Ñ,Ø  Ñ,Ø! +Ñ.Ø˜g™Ø˜x™.ñˆHô —j‘j Ó&ˆGØ�K‰Kœ¨gÀÔIÕJð ð  ˆr7   ÚbloodÚdietr”   rŸ   Úmealr    c                 ó>  — | j                   j                  |i «      j                  |i «      j                  |g «      }g }|D ]Y  }	|r|	j                  d«      |k7  rŒ|r|	j                  |d«      dk(  rŒ2|r|	j                  d«      |k7  rŒI|j                  |	«       Œ[ |S )zQGet all foods matching blood, diet, classification from dict, then apply filters.rŸ   ÚMediumÚLowr    )rt   r   r—   )
r4   r¬   r­   r”   rŸ   r®   r    Ú	base_listÚresultÚfoods
             r5   Ú_get_matching_foodsz&MealGenVectorStore._get_matching_foodsš   s›   € ð —N‘N×&Ñ& u¨bÓ1×5Ñ5°d¸BÓ?×CÑCÀNÐTVÓWˆ	ØˆÛˆDÙ˜DŸH™H ZÓ0°HÒ<ØÙ˜Ÿ™  xÓ0°EÒ9ØÙ˜DŸH™H ZÓ0°HÒ<ØØ�M‰M˜$Õð ð ˆr7   Úlimitc           	   ƒ   ó   K  — |r| j                  ||||||«      }n-| j                  ||d|||«      | j                  ||d|||«      z   }t        «       }	g }
|D ]/  }|d   |	vsŒ|	j                  |d   «       |
j                  |«       Œ1 |
d| S ­w)zCMain retrieval: uses dict for exact filters, returns up to `limit`.Ú
beneficialÚneutralrž   N)rµ   ÚsetÚaddr—   )r4   r¬   r­   r”   rŸ   r®   r    r¶   ÚfoodsÚseenÚuniquerB   s               r5   Ú	get_foodszMealGenVectorStore.get_foodsª   s±   è ø€ ñ Ø×,Ñ,¨U°D¸.È(ÐTXÐZbÓc‰Eà×-Ñ-¨e°T¸<ÈÐSWÐYaÓbØ×-Ñ-¨e°T¸9ÀhÐPTÐV^Ó_ñ`ˆEô ‹uˆØˆÛˆAØ�‰~ TÒ)Ø—‘˜˜;™Ô(Ø—‘˜aÕ ð ð �f�uˆ~Ðùs   ‚ABÁ",Bc              ƒ   óL   K  — | j                  ||d|||¬«      ƒ d {  –—† S 7 Œ­w)Nr¸   ©r¶   ©r¿   ©r4   r¬   r­   rŸ   r®   r¶   s         r5   Úget_beneficial_foodsz'MealGenVectorStore.get_beneficial_foodsÁ   s*   è ø€ ð —^‘^ E¨4°¸xÈÐUZ�^Ó[×[Ð[Ð[úó   ‚$�"ž$c              ƒ   óL   K  — | j                  ||d|||¬«      ƒ d {  –—† S 7 Œ­w)Nr¹   rÁ   rÂ   rÃ   s         r5   Úget_neutral_foodsz$MealGenVectorStore.get_neutral_foodsÇ   s*   è ø€ ð —^‘^ E¨4°¸HÀdÐRW�^ÓX×XÐXÐXúrÅ   )Úfaiss_mealgen)z'diet/meal_generation/mealgen_foods.jsonF)NNN)NNNNéd   )NNrÉ   )rf   rg   rh   ri   r6   rm   r�   r‚   rk   r…   r   r
   r„   rl   rµ   rn   r¿   rÄ   rÇ   Ú__classcell__©rv   s   @r5   rq   rq   R   s£  ø„ ñI 3õ Ið
 5^Ø38ñY¨cð YØ,0óYð</°#ó /ð^°ó ^ð¨$ð °4¸±>ó ð0 ?CØ,0ñ¨ð °Cð Èð Ø&)ðØ8;ðà&)ðà59¸$±Zóð" /3Ø(,Ø$(Ø(,Ø%(ñ Sð °ð Ø(+ðà"%ðð "ðð #&ð	ð
  #ðð
 .2°$©Zóð0 48Ø/3Ø03ñ\°ð \¸3ð \Ø-0ð\à),ð\ð +.ð\ð 9=¸T¹
ó\ð 15Ø,0Ø-0ñY¨Sð Y¸ð YØ*-ðYà&)ðYð (+ðYð 6:¸$±Z÷Yr7   rq   c                   óè   ‡ — e Zd Zddefˆ fd„Z	 	 ddedefd„Zdefd„Zdefd„Z	ded	e
e   fd
„Zded	eeeef      fd„Zded	e
e   fd„Zded	e
e   fd„Zded	e
e   fd„Zddeded	e
e   fd„Zˆ xZS )ÚScannerVectorStorer*   c                 ó\   •— t         ‰| �  |«       i | _        i | _        i | _        i | _        y r^   )rs   r6   Úcompat_dictÚ_beneficial_by_bloodÚ_neutral_by_bloodÚ_avoid_by_bloodru   s     €r5   r6   zScannerVectorStore.__init__Ò   s0   ø€ Ü‰Ñ˜Ô$à68ˆÔØ:<ˆÔ!Ø79ˆÔØ57ˆÕr7   r8   rw   c                 óâ  — |xs | j                  «        }|sƒ| j                  «       }|rq|j                  d«      |k(  r]	 |j                  d«      t        j                  j                  |«      k(  r*t        d| j                  › �«       | j                  |«       y 	 t        d|› d�«       | j                  |«      }| j                  |«      }| j                  |«       | j                  |«       |t        j                  j                  |«      t        j                  «       dœ}| j                  |«       t        dt!        |«      › d	�«       y # t        $ r}t        d|› �«       Y d }~ŒÎd }~ww xY w)
Nr8   ry   rz   r{   u(   ðŸ”„ Building hybrid scanner store from r|   r}   u    âœ… Hybrid scanner store ready: z docs, dict populated.)rP   rY   r   r0   r1   r€   r�   r*   Ú _populate_scanner_dict_from_jsonrƒ   rC   Ú_create_scanner_documentsrL   Ú_populate_scanner_dict_from_rawr†   rW   r‡   rˆ   s           r5   r�   z'ScannerVectorStore.load_or_create_indexÚ   sT  € à$ÒD¨D×,BÑ,BÓ,DÐ(DˆÙØ×*Ñ*Ó,ˆHÙ˜HŸL™L¨Ó5¸ÒBðDØ—|‘| LÓ1´R·W±W×5EÑ5EÀiÓ5PÒPÜÐ EÀdÇoÁoÐEVÐWÔXØ×=Ñ=¸iÔHØð Qô 	Ð8¸¸À4ÐHÔIØ×'Ñ'¨	Ó2ˆØ×2Ñ2°8Ó<ˆ	Ø×#Ñ# IÔ.Ø×,Ñ,¨XÔ6ð #ÜŸ'™'×*Ñ*¨9Ó5ÜŸ™›ñ
ˆð
 	×Ñ˜HÔ%ÜÐ0´°Y³Ð0@Ð@VÐWÕXøô !ò DÜÐ>¸q¸cÐB×CÑCûðDúrŽ   c                 óH   — | j                  |«      }| j                  |«       y r^   )rC   rÖ   r�   s      r5   rÔ   z3ScannerVectorStore._populate_scanner_dict_from_jsonö   s    € Ø×'Ñ'¨	Ó2ˆØ×,Ñ,¨XÕ6r7   rŒ   c                 óÈ  — | j                   j                  «        |D ]]  }|d   }|d   }|| j                   |j                  «       <   |j                  dg «      D ]  }|| j                   |j                  «       <   Œ! Œ_ g d¢}|D ]Ý  }g | j                  |<   g | j
                  |<   g | j                  |<   | j                   j                  «       D ]‘  \  }}|j                  |d«      j                  «       }	|	dk(  r| j                  |   j                  |«       ŒJ|	dk(  r| j
                  |   j                  |«       Œn|	dk(  sŒt| j                  |   j                  |«       Œ“ Œß y )Nrž   ÚcompatibilityÚvariants)ÚOÚAÚBÚABr¹   r¸   Úavoid)	rÏ   r•   Úlowerr   rÐ   rÑ   rÒ   Úitemsr—   )
r4   rŒ   r˜   r´   ÚcompatÚvariantÚblood_typesÚbtÚ
food_lowerÚstatuss
             r5   rÖ   z2ScannerVectorStore._populate_scanner_dict_from_rawú   sN  € Ø×Ñ×ÑÔ ÛˆDØ˜Ñ$ˆDØ˜/Ñ*ˆFØ-3ˆD×Ñ˜TŸZ™Z›\Ñ*àŸ8™8 J°Ö3�Ø4:�× Ñ  §¡£Ò1ñ 4ð ò ,ˆÛˆBØ,.ˆD×%Ñ% bÑ)Ø)+ˆD×"Ñ" 2Ñ&Ø')ˆD× Ñ  Ñ$Ø&*×&6Ñ&6×&<Ñ&<Ö&>Ñ"�
˜FØŸ™ B¨	Ó2×8Ñ8Ó:�Ø˜\Ò)Ø×-Ñ-¨bÑ1×8Ñ8¸ÕDØ˜yÒ(Ø×*Ñ*¨2Ñ.×5Ñ5°jÕAØ˜wÓ&Ø×(Ñ(¨Ñ,×3Ñ3°JÕ?ñ '?ñ	 r7   r9   c                 ó4  — g }|D ]�  }|d   }|j                  t        t        j                  |d   |dœ«      dd|d   dœ¬«      «       |j	                  dg «      D ]8  }|j                  t        t        j                  ||dœ«      dd|dœ¬«      «       Œ: Œ’ |S )	NrÙ   rž   )rž   rÙ   r@   Úfood_compatibility)r¤   r¥   rž   r¦   rÚ   )r—   r
   r@   r©   r   )r4   rŒ   rª   r˜   râ   rã   s         r5   rÕ   z,ScannerVectorStore._create_scanner_documents  s©   € ØˆÛˆDØ˜/Ñ*ˆFà�K‰KœÜ!ŸZ™Z°d¸;Ñ6GÐZ`Ñ(aÓbØ$*Ð<PØ'+¨KÑ'8ñ:ôô ð
  Ÿ8™8 J°Ö3�Ø—‘œHÜ!%§¡¸'ÐTZÑ,[Ó!\Ø(.Ð@TØ+2ñ4ôõ ñ 4ð ð ˆr7   rž   c              ƒ   ó\   K  — | j                   j                  |j                  «       «      S ­wr^   )rÏ   r   rà   )r4   rž   s     r5   Úget_compatibilityz$ScannerVectorStore.get_compatibility(  s$   è ø€ Ø×Ñ×#Ñ# I§O¡OÓ$5Ó6Ð6ùs   ‚*,r’   c              ƒ   óB   K  — | j                   j                  |g «      S ­wr^   )rÐ   r   ©r4   r’   s     r5   rÄ   z'ScannerVectorStore.get_beneficial_foods+  s   è ø€ Ø×(Ñ(×,Ñ,¨Z¸Ó<Ð<ùó   ‚c              ƒ   óB   K  — | j                   j                  |g «      S ­wr^   )rÑ   r   rí   s     r5   rÇ   z$ScannerVectorStore.get_neutral_foods.  s   è ø€ Ø×%Ñ%×)Ñ)¨*°bÓ9Ð9ùrî   c              ƒ   óB   K  — | j                   j                  |g «      S ­wr^   )rÒ   r   rí   s     r5   Úget_avoid_foodsz"ScannerVectorStore.get_avoid_foods1  s   è ø€ Ø×#Ñ#×'Ñ'¨
°BÓ7Ð7ùrî   rZ   r¶   c              ƒ   ó*  K  — | j                   r | j                   j                  j                  nd}| j                  |d|¬«      ƒ d{  –—† }g }|D ]1  }	 |j	                  t        j                  |j                  «      «       Œ3 |d| S 7 ŒA#  Y Œ?xY w­w)z;Semantic search using FAISS (for unknown/misspelled foods).re   N)r[   r\   )r/   ÚindexÚntotalrd   r—   r@   Úloadsr§   )r4   rZ   r¶   r\   rª   ÚresultsÚdocs          r5   Úsearch_foodszScannerVectorStore.search_foods4  s�   è ø€ à-1×-=Ò-=ˆD×Ñ×"Ñ"×)Ò)À1ˆØ×2Ñ2°5ÀDÈAÐ2ÓN×NˆØˆÛˆCðØ—‘œtŸz™z¨#×*:Ñ*:Ó;Õ<ð ð
 �v˜ˆÐð Oùð
Ùüs*   ‚ABÁB
Á	BÁ.BÂBÂBÂB)Úfaiss_scanner)z$diet/meal_scanner/scanner_foods.jsonF)é
   )rf   rg   rh   ri   r6   rm   r�   rÔ   rk   rÖ   r   r
   rÕ   r   r   rë   rÄ   rÇ   rñ   rn   rø   rÊ   rË   s   @r5   rÍ   rÍ   Ñ   sã   ø„ ñ8 3õ 8ð 5[Ø38ñY¨cð YØ,0óYð87¸#ó 7ð@¸ó @ð2°$ð ¸4À¹>ó ð*7°ð 7¸À$ÀsÈCÀxÁ.Ñ9Qó 7ð=°Sð =¸TÀ#¹Yó =ð:°#ð :¸$¸s¹)ó :ð8°ð 8¸¸S¹	ó 8ñ
¨ð 
°Cð 
ÀÀdÁ÷ 
r7   rÍ   )r0   r@   r†   r_   Útypingr   r   r   r   r   Úlangchain_openair   Ú langchain_community.vectorstoresr	   Úlangchain.schemar
   ÚMEAL_CATEGORIESÚstripÚsortedr‡   ÚSORTED_CATEGORIESr)   rq   rÍ   )r›   s   0r5   Ú<module>r     s„   ðÛ 	Û Û Û ß 6Õ 6å -Ý 2Ý %ò
€ñ '6Ó6¡o �1—7‘7•9 oÑ6€Ù˜?°¸TÔBÐ ÷/
ñ /
ôjyYÐ+ô yYô~mÐ+õ mùòw 7s   ¹A?