§
    P¿jR1  ã                  ó˜   — d Z ddlmZ 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 ddlmZmZmZmZmZmZmZ ddlmZ  G d„ d	¦  «        ZdS )
aš  
FreeExile Party Service.
Authoritative lifecycle management for 6-player parties:
- Creation, invites, accept/decline, leader promotion, leave with auto-promotion, kick, disband.
- Configurable loot allocation modes (Leader only).
- Thread-safe concurrency via RLock.
- Spatial nearby membership queries.

Follows Engineering Standards 2026: Soft cap <= 350 lines, strict typing, zero-trust server authority.
é    )ÚannotationsN)ÚDictÚListÚOptionalÚSeté   )ÚLootAllocationModeÚPartyActionÚPartyActionResultÚPartyInviteÚPartyMemberStateÚ	PartyRoleÚ
PartyState)ÚPartyScalingCalculatorc                  ó¼   — e Zd ZU dZdZded<   dZded<   d7d	„Z	 	 d8d9d„Zd:d„Z		 	 d8d;d„Z
d<d„Zd=d„Zd>d „Zd?d!„Zd@d"„ZdAd%„ZdBdCd*„Z	 dDdEd/„ZdFdGd4„ZdHd5„Zd>d6„Zd+S )IÚPartyServicezMAuthoritative service managing 6-player party sessions and membership states.é   ÚintÚMAX_PARTY_SIZEi0u  ÚINVITE_TTL_MSÚreturnÚNonec                ó`   — t          j        ¦   «         | _        i | _        i | _        i | _        d S ©N)Ú	threadingÚRLockÚ_lockÚpartiesÚplayer_party_mapÚpending_invites)Úselfs    ú3C:\Projects\FreeExile\server\party\party_service.pyÚ__init__zPartyService.__init__%   s.   € Ý”_Ñ&Ô&ˆŒ
Ø.0ˆŒØ02ˆÔØBDˆÔÐÐó    Úzone_boundless_sanctuaryÚinst_1Ú	leader_idÚstrÚnameÚlevelÚzone_idÚinstance_idr   c                óÀ  — | j         5  || j        v rt          d|› d�¦  «        ‚d|› dt          t	          j        ¦   «         dz  ¦  «        › �}t          |||||ddt          j        d¬¦	  «	        }t          ||||it          j
        | j        t	          j        ¦   «         ¬	¦  «        }|| j        |<   || j        |<   i | j        |<   |cd
d
d
¦  «         S # 1 swxY w Y   d
S )z5Initializes a new party with creator as Party Leader.zPlayer z is already in a partyÚparty_Ú_éè  ç        T©	Ú	player_idÚcharacter_namer*   r+   r,   ÚwxÚwyÚroleÚ	is_online)Úparty_idr'   ÚmembersÚ	loot_modeÚmax_membersÚ
created_atN)r   r   Ú
ValueErrorr   Útimer   r   ÚLEADERr   r	   ÚSHORTr   r   r    )	r!   r'   r)   r*   r+   r,   r9   Úleader_memberÚpartys	            r"   Úcreate_partyzPartyService.create_party+   sV  € ð ŒZð 	ð 	Ø˜DÔ1Ð1Ð1Ý Ð!L¨9Ð!LÐ!LÐ!LÑMÔMÐMàE 	ÐEÐE­Cµ´	±´¸dÑ0BÑ,CÔ,CÐEÐEˆHÝ,Ø#Ø#ØØØ'ØØÝÔ%Øð
ñ 
ô 
ˆMõ Ø!Ø#Ø" MÐ2Ý,Ô2Ø Ô/Ýœ9™;œ;ðñ ô ˆEð &+ˆDŒL˜Ñ"Ø/7ˆDÔ! )Ñ,Ø-/ˆDÔ  Ñ*Øð7	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆB>CÃCÃCr9   Ú	sender_idÚ	target_idÚboolc                ód  — | j         5  | j                             |¦  «        }|r|j        |k    r	 ddd¦  «         dS t	          |j        ¦  «        |j        k    s	|| j        v r	 ddd¦  «         dS t          t          j	        ¦   «         dz  ¦  «        }t          dt          j        ¦   «         j        dd…         › �||||j        v r|j        |         j        nd|||| j        z   ¬¦  «        }|| j                             |i ¦  «        |<   ||j        |<   	 ddd¦  «         dS # 1 swxY w Y   dS )	zELeader invites a target player to the party (Max 6 members enforced).NFr0   Úinv_é   ÚLeader)Ú	invite_idr9   Ú
inviter_idÚinviter_nameÚtarget_player_idÚcreated_at_msÚexpires_at_msT)r   r   Úgetr'   Úlenr:   r<   r   r   r?   r   ÚuuidÚuuid4Úhexr4   r   r    Ú
setdefault)r!   r9   rE   rF   rC   Únow_msÚinvs          r"   Úinvite_playerzPartyService.invite_playerQ   sÈ  € àŒZð 	ð 	Ø”L×$Ò$ XÑ.Ô.ˆEØð ˜EœO¨yÒ8Ð8Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ �5”=Ñ!Ô! UÔ%6Ò6Ð6¸)ÀtÔG\Ð:\Ð:\Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ �œ™œ tÑ+Ñ,Ô,ˆFÝØ7¥¤¡¤Ô!1°"°1°"Ô!5Ð7Ð7Ø!Ø$ØHQÐUZÔUbÐHbÐHb˜Uœ]¨9Ô5ÔDÐDÐhpØ!*Ø$Ø$ tÔ'9Ñ9ðñ ô ˆCð HKˆDÔ ×+Ò+¨H°bÑ9Ô9¸)ÑDØ/2ˆEÔ! )Ñ,Øð'	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ)D%¾'D%Á2B&D%Ä%D)Ä,D)r3   c                óÜ  — | j         5  | j                             |¦  «        }| j                             |i ¦  «        }|                     |¦  «        }	|r|	s	 ddd¦  «         dS |	                     ¦   «         r?|                     |d¦  «         |j                             |d¦  «         	 ddd¦  «         dS t          |j        ¦  «        |j        k    s	|| j	        v r	 ddd¦  «         dS |                     |d¦  «         |j                             |d¦  «         t          |||||ddt          j        d¬¦	  «	        }
|
|j        |<   || j	        |<   	 ddd¦  «         dS # 1 swxY w Y   dS )zETarget player accepts an outstanding invitation and enters the party.NFr1   Tr2   )r   r   rR   r    Ú
is_expiredÚpoprS   r:   r<   r   r   r   ÚMEMBER)r!   r9   r3   r)   r*   r+   r,   rC   Ú
party_invsrY   Úmembers              r"   Úaccept_invitezPartyService.accept_inviteh   s%  € ð ŒZð 	ð 	Ø”L×$Ò$ XÑ.Ô.ˆEØÔ-×1Ò1°(¸BÑ?Ô?ˆJØ—.’. Ñ+Ô+ˆCØð  ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð �~Š~ÑÔð Ø—’˜y¨$Ñ/Ô/Ð/ØÔ%×)Ò)¨)°TÑ:Ô:Ð:Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ �5”=Ñ!Ô! UÔ%6Ò6Ð6¸)ÀtÔG\Ð:\Ð:\Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð �NŠN˜9 dÑ+Ô+Ð+ØÔ!×%Ò% i°Ñ6Ô6Ð6å%Ø#Ø#ØØØ'ØØÝÔ%Øð
ñ 
ô 
ˆFð (.ˆEŒM˜)Ñ$Ø/7ˆDÔ! )Ñ,Øð;	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s&   ˆAE!Á%AE!Â8'E!Ã,A(E!Å!E%Å(E%c                ó<  — | j         5  | j                             |¦  «        }| j                             |i ¦  «        }||v rA|                     |d¦  «         |r|j                             |d¦  «         	 ddd¦  «         dS 	 ddd¦  «         dS # 1 swxY w Y   dS )z%Target player declines an invitation.NTF)r   r   rR   r    r]   )r!   r9   r3   rC   r_   s        r"   Údecline_invitezPartyService.decline_invite‘   s  € àŒZð 	ð 	Ø”L×$Ò$ XÑ.Ô.ˆEØÔ-×1Ò1°(¸BÑ?Ô?ˆJØ˜JÐ&Ð&Ø—’˜y¨$Ñ/Ô/Ð/Øð ?ØÔ)×-Ò-¨i¸Ñ>Ô>Ð>Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆA.BÂBÂBÂBÚcurrent_leader_idÚnew_leader_idc                ó~  — | j         5  | j                             |¦  «        }|r|j        |k    s	||j        vr	 ddd¦  «         dS |j        |         }t          |j        |j        |j        |j	        |j
        |j        |j        t          j        |j        |j        |j        ¬¦  «        |j        |<   |j        |         }t          |j        |j        |j        |j	        |j
        |j        |j        t          j        |j        |j        |j        ¬¦  «        |j        |<   ||_        	 ddd¦  «         dS # 1 swxY w Y   dS )z0Transfers leadership to another existing member.NF©r3   r4   r*   r+   r,   r5   r6   r7   r8   ÚhpÚmax_hpT)r   r   rR   r'   r:   r   r3   r4   r*   r+   r,   r5   r6   r   r^   r8   rh   ri   r@   )r!   r9   rd   re   rC   Ú
old_leaderÚtargets          r"   Úpromote_leaderzPartyService.promote_leader�   s­  € àŒZð #	ð #	Ø”L×$Ò$ XÑ.Ô.ˆEØð ˜EœOÐ/@Ò@Ð@ÀMÐY^ÔYfÐDfÐDfØð#	ð #	ð #	ñ #	ô #	ð #	ð #	ð #	ð
 œÐ'8Ô9ˆJÝ/?Ø$Ô.Ø)Ô8Ø Ô&Ø"Ô*Ø&Ô2Ø”=Ø”=ÝÔ%Ø$Ô.Ø”=Ø!Ô(ð0ñ 0ô 0ˆEŒMÐ+Ñ,ð ”] =Ô1ˆFÝ+;Ø Ô*Ø%Ô4Ø”lØœØ"Ô.Ø”9Ø”9ÝÔ%Ø Ô*Ø”9Ø”}ð,ñ ,ô ,ˆEŒM˜-Ñ(ð ,ˆEŒOØðG#	ð #	ð #	ñ #	ô #	ð #	ð #	ð #	ð #	ð #	ð #	ð #	øøøð #	ð #	ð #	ð #	ð #	ð #	s   ˆ2D2ÁCD2Ä2D6Ä9D6úOptional[PartyState]c                óÐ  — | j         5  | j                             |d¦  «        }|r	|| j        vr	 ddd¦  «         dS | j        |         }|j                             |d¦  «         |j        s1| j        |= | j                             |d¦  «         	 ddd¦  «         dS |j        |k    r¥t          t          |j         	                    ¦   «         ¦  «        ¦  «        }||_        |j        |         }t          |j        |j        |j        |j        |j        |j        |j        t$          j        |j        |j        |j        ¬¦  «        |j        |<   |cddd¦  «         S # 1 swxY w Y   dS )zNPlayer leaves party; auto-promotes senior member if leaving player was leader.Nrg   )r   r   r]   r   r:   r    r'   ÚnextÚiterÚkeysr   r3   r4   r*   r+   r,   r5   r6   r   r@   r8   rh   ri   )r!   r3   r9   rC   Únext_leader_idrk   s         r"   Úleave_partyzPartyService.leave_partyÄ   sä  € àŒZð 	ð 	ØÔ,×0Ò0°¸DÑAÔAˆHØð ˜x¨t¬|Ð;Ð;Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð
 ”L Ô*ˆEØŒM×Ò˜i¨Ñ.Ô.Ð.à”=ð Ø”L Ð*ØÔ$×(Ò(¨°4Ñ8Ô8Ð8Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð Œ )Ò+Ð+Ý!%¥d¨5¬=×+=Ò+=Ñ+?Ô+?Ñ&@Ô&@Ñ!AÔ!A�Ø"0�”Øœ ~Ô6�Ý0@Ø$Ô.Ø#)Ô#8Ø œ,Ø"œNØ &Ô 2Ø”yØ”yÝ"Ô)Ø$Ô.Ø”yØ!œ=ð1ñ 1ô 1�”˜nÑ-ð ð=	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ(E½AEÂB1EÅEÅ"Ec                ó2  — | j         5  | j                             |¦  «        }|r|j        |k    r	 ddd¦  «         dS ||j        vs||k    r	 ddd¦  «         dS |j        |= | j                             |d¦  «         	 ddd¦  «         dS # 1 swxY w Y   dS )z&Leader expels a member from the party.NFT)r   r   rR   r'   r:   r   r]   )r!   r9   r'   rF   rC   s        r"   Úkick_memberzPartyService.kick_memberæ   s.  € àŒZð 		ð 		Ø”L×$Ò$ XÑ.Ô.ˆEØð ˜EœO¨yÒ8Ð8Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð  ¤Ð-Ð-°¸iÒ1GÐ1GØð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð ”˜iÐ(ØÔ!×%Ò% i°Ñ6Ô6Ð6Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s   ˆ)B¾BÁ$BÂBÂBc                ó€  — | j         5  | j                             |¦  «        }|r|j        |k    r	 ddd¦  «         dS t	          |j                             ¦   «         ¦  «        D ]}| j                             |d¦  «         Œ| j        |= | j	                             |d¦  «         	 ddd¦  «         dS # 1 swxY w Y   dS )z$Leader dissolves the party entirely.NFT)
r   r   rR   r'   Úlistr:   rq   r   r]   r    )r!   r9   r'   rC   Úpids        r"   Údisband_partyzPartyService.disband_partyó   s+  € àŒZð 
	ð 
	Ø”L×$Ò$ XÑ.Ô.ˆEØð ˜EœO¨yÒ8Ð8Øð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	õ
 ˜EœM×.Ò.Ñ0Ô0Ñ1Ô1ð 5ð 5�ØÔ%×)Ò)¨#¨tÑ4Ô4Ð4Ð4à”˜XÐ&ØÔ ×$Ò$ X¨tÑ4Ô4Ð4Øð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	s   ˆ)B3¾A(B3Â3B7Â:B7Úmoder	   c                óÀ   — | j         5  | j                             |¦  «        }|r|j        |k    r	 ddd¦  «         dS ||_        	 ddd¦  «         dS # 1 swxY w Y   dS )zDSets loot allocation mode (Permanent, Short 5.0s, FFA). Leader only.NFT)r   r   rR   r'   r;   )r!   r9   r'   rz   rC   s        r"   Úset_loot_allocation_modez%PartyService.set_loot_allocation_mode  sÎ   € àŒZð 	ð 	Ø”L×$Ò$ XÑ.Ô.ˆEØð ˜EœO¨yÒ8Ð8Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð #ˆEŒOØð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ)A¾AÁAÁAç      .@ÚradiusÚfloatúList[PartyMemberState]c           
     ó,  — | j         5  | j                             |¦  «        }|r	|| j        vrg cddd¦  «         S | j        |         }|j                             |¦  «        }|sg cddd¦  «         S t          |dt          |dd¦  «        ¦  «        }t          |dt          |dd¦  «        ¦  «        }t          j        t          |j         	                    ¦   «         ¦  «        |||j
        |j        pd|¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )	z>Retrieves party members within radius of the specified player.Nr5   Úxr1   r6   Úyr&   )r:   Úref_wxÚref_wyÚref_zoneÚref_instr~   )r   r   rR   r   r:   Úgetattrr   Úcalculate_nearby_membersrw   Úvaluesr+   r,   )r!   r3   r~   r9   rC   ÚrefÚref_xÚref_ys           r"   Úget_nearby_memberszPartyService.get_nearby_members
  s›  € àŒZð 	ð 	ØÔ,×0Ò0°Ñ;Ô;ˆHØð ˜x¨t¬|Ð;Ð;Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð ”L Ô*ˆEØ”-×#Ò# IÑ.Ô.ˆCØð Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	õ ˜C ¥w¨s°C¸Ñ'=Ô'=Ñ>Ô>ˆEÝ˜C ¥w¨s°C¸Ñ'=Ô'=Ñ>Ô>ˆEÝ)ÔBÝ˜Uœ]×1Ò1Ñ3Ô3Ñ4Ô4ØØØœØœÐ4¨HØðñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ'D	¼*D	Á3B	D	Ä	DÄDNr5   r6   úOptional[str]c                ó\  — | j         5  | j                             |¦  «        }|r	|| j        vr	 ddd¦  «         dS | j        |         }|j                             |¦  «        }|s	 ddd¦  «         dS |                     ||||¦  «        |j        |<   	 ddd¦  «         dS # 1 swxY w Y   dS )z-Updates a member's position and map instance.NFT)r   r   rR   r   r:   Úwith_position)	r!   r3   r5   r6   r+   r,   r9   rC   r`   s	            r"   Úupdate_member_positionz#PartyService.update_member_position  s@  € ð ŒZð 		ð 		ØÔ,×0Ò0°Ñ;Ô;ˆHØð ˜x¨t¬|Ð;Ð;Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð ”L Ô*ˆEØ”]×&Ò& yÑ1Ô1ˆFØð Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð (.×';Ò';¸BÀÀGÈ[Ñ'YÔ'YˆEŒM˜)Ñ$Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s   ˆ'B!¼*B!Á3!B!Â!B%Â(B%rh   ri   r8   úOptional[bool]c                óZ  — | j         5  | j                             |¦  «        }|r	|| j        vr	 ddd¦  «         dS | j        |         }|j                             |¦  «        }|s	 ddd¦  «         dS |                     |||¦  «        |j        |<   	 ddd¦  «         dS # 1 swxY w Y   dS )z,Updates a member's health and online status.NFT)r   r   rR   r   r:   Úwith_vitals)r!   r3   rh   ri   r8   r9   rC   r`   s           r"   Úupdate_member_vitalsz!PartyService.update_member_vitals.  s<  € àŒZð 		ð 		ØÔ,×0Ò0°Ñ;Ô;ˆHØð ˜x¨t¬|Ð;Ð;Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð ”L Ô*ˆEØ”]×&Ò& yÑ1Ô1ˆFØð Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð (.×'9Ò'9¸"¸fÀiÑ'PÔ'PˆEŒM˜)Ñ$Øð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s   ˆ'B ¼*B Á3 B Â B$Â'B$c                óx   — | j         5  | j                             |¦  «        cddd¦  «         S # 1 swxY w Y   dS )zRetrieves a party by party_id.N)r   r   rR   )r!   r9   s     r"   Ú	get_partyzPartyService.get_party;  s�   € àŒZð 	.ð 	.Ø”<×#Ò# HÑ-Ô-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   ˆ/¯3¶3c                ó´   — | j         5  | j                             |¦  «        }|r| j                             |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )z(Retrieves the party a player belongs to.N)r   r   rR   r   )r!   r3   r9   s      r"   Úget_player_partyzPartyService.get_player_party@  sµ   € àŒZð 	Dð 	DØÔ,×0Ò0°Ñ;Ô;ˆHØ19ÐC�4”<×#Ò# HÑ-Ô-Ð-¸tð	Dð 	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Dð 	Ds   ˆ8AÁAÁA)r   r   )r%   r&   )r'   r(   r)   r(   r*   r   r+   r(   r,   r(   r   r   )r9   r(   rE   r(   rF   r(   r   rG   )r9   r(   r3   r(   r)   r(   r*   r   r+   r(   r,   r(   r   rG   )r9   r(   r3   r(   r   rG   )r9   r(   rd   r(   re   r(   r   rG   )r3   r(   r   rm   )r9   r(   r'   r(   rF   r(   r   rG   )r9   r(   r'   r(   r   rG   )r9   r(   r'   r(   rz   r	   r   rG   )r}   )r3   r(   r~   r   r   r€   )NN)r3   r(   r5   r   r6   r   r+   r�   r,   r�   r   rG   r   )
r3   r(   rh   r   ri   r   r8   r“   r   rG   )r9   r(   r   rm   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r#   rD   rZ   ra   rc   rl   rs   ru   ry   r|   rŽ   r’   r–   r˜   rš   © r$   r"   r   r      s¨  € € € € € € ØWÐWà€NÐÐÐÑØ€MÐÐÐÑðEð Eð Eð Eð 2Ø#ð$ð $ð $ð $ð $ðLð ð ð ð: 2Ø#ð'ð 'ð 'ð 'ð 'ðR
ð 
ð 
ð 
ð%ð %ð %ð %ðN ð  ð  ð  ðDð ð ð ðð ð ð ðð ð ð ðð ð ð ð ð, quðð ð ð ð ðð ð ð ð ð.ð .ð .ð .ð
Dð Dð Dð Dð Dð Dr$   r   )rž   Ú
__future__r   Úmathr   r?   rT   Útypingr   r   r   r   Úparty_typesr	   r
   r   r   r   r   r   Úparty_scaling_calculatorr   r   r    r$   r"   ú<module>r¦      s"  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð =Ð <Ð <Ð <Ð <Ð <ðeDð eDð eDð eDð eDñ eDô eDð eDð eDð eDr$   