§ ½@¾j©Iãó²—dZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z m Z mZmZddlmZmZeje¦«ZdZdZd Zejejejejejd œZd „Zd Z d Z!ddddddddœZ"e#ej$ %dd¦«¦«Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,d„Z-d„Z.d„Z/d(d „Z0d!„Z1d"„Z2d)d$„Z3d%„Z4d&„Z5d'„Z6dS)*uXPublic command API for isolatectl limits — per-domain (LVD) resource limit management.éN)Ú userdomainsé)Ú PAGE_SIZEÚ DomainEntryÚ LvdConfigÚ config_pathÚ get_usernameÚresolve_docroot)Ú ErrorCodeÚLvdErrorz(/usr/share/lve-utils/lvd-registry-helperz&/usr/share/lve-utils/lvd-limits-helperz%/usr/share/lve-utils/lvd-stats-helper)ééééécóê—tj |¦«}t|›d|j ¦«›�t  |jtj ¦«¬¦«S)zELvdError for a helper that exited non-zero, coded by its exit status.z failed: ©Úcode) ÚosÚpathÚbasenamer ÚstderrÚstripÚHELPER_EXIT_CODESÚgetÚ returncoder ÚBACKEND_UNAVAILABLE)ÚhelperÚresultÚnames úpy/websiteisolation/commands.pyÚ _helper_errorr")sj€å Œ7× Ò ˜FÑ #Ô #€DÝ Ø Ð1Ð1˜&œ-×-Ò-Ñ/Ô/Ð1Ð1Ý × "Ò " 6Ô#4µiÔ6SÑ TÔ Tð Vñ Vô VðVó))ÚusageÚa)ÚpeakÚm)ÚlimitsÚl))ÚcpuÚCPU)ÚepÚEP)ÚvmemÚVMem)ÚpmemÚPMem)ÚnprocÚNproc)ÚioÚIO)ÚiopsÚIOPSÚCPUfÚEPfÚVMemFÚPMemFÚNprocFÚIOfÚIOPSf)r*r,r.r0r2r4r6Ú PYLVE_DEBUGc ó—ddi|¥S)NrÚsuccess©)Úkwargss r!Ú_okrDZs€Ø �iÐ * 6Ð *Ð*r#cóÆ—t|¦«} t|¦«pg}n4#t$r'}td|›d|›�tj¬¦«|‚d}~wwxYwd„|D¦«S)zCReturn set of domain names that belong to the user (via panel API).z"failed to query domains for user 'z': rNcó—h|]\}}|’ŒSrBrB)Ú.0r Ú_docroots r!ú z _user_domains..fs€Ð -Ð -Ð -‘^�T˜8ˆDÐ -Ð -Ð -r#)r rÚ Exceptionr r r)Úlve_idÚusernameÚpairsÚexcs r!Ú _user_domainsrO^s–€å˜FÑ#Ô#€HðDݘHÑ%Ô%Ð+¨ˆˆøÝ ðDðDðDÝÐN¸HÐNÐNÈÐNÐNÝ%Ô9ð;ñ;ô;Ø@Cð DøøøøðDøøøð .Ð - uÐ -Ñ -Ô -Ð-s‘#£ A­"AÁAcó”—tj|¦«}|jr,tdt |¦«›d�t j¬¦«‚|S)aLoad the account's config, refusing to act on one that could not be read. A config that could not be read is EMPTY, so without this every command would answer as though the account simply had no per-domain limits: `list` reports none, `apply` reports a configured domain as never configured, and `set` persists that emptiness over the file (CLOS-7494). One wrong answer is a wrong diagnosis, the other loses the records -- neither is worth giving when the real state is "this file needs attention". z cannot read z�; it may hold limits that this command would otherwise ignore or discard. See ~/.lve/isolatectl.log for what is wrong with it, then repair or remove the filer)rÚloadÚ unreadabler rr ÚCONFIG_UNREADABLE)rKÚconfigs r!Ú _load_configrUisg€õŒ^˜FÑ #Ô #€FØ ÔðBÝð �; vÑ.Ô.ð ð ð õ&/Ô%@ð BñBôBð Bð €Mr#cóf—t|¦«}|std|›d�tj¬¦«‚|S)zResolve domain -> docroot.z)cannot resolve document root for domain 'ú'r)r r r r)ÚdomainÚdocroots r!Ú _docroot_forrZ}sG€å˜fÑ%Ô%€GØ ð;ÝÐLÀ6ÐLÐLÐLÝ%Ô9ð;ñ;ô;ð ;à €Nr#cóZ—tj ¦«}trd|d<|S)z/Build environment for SUID helper subprocesses.Ú1ÚLIBLVE_DEBUG_ENABLED)rÚenvironÚcopyÚ_DEBUG)Úenvs r!Ú _helper_envrb†s+€å Œ*�/Š/Ñ Ô €CÝ ð*Ø&)ˆÐ "Ñ#Ø €Jr#cóT—tr td|›�tj¬¦«dSdS)NzDEBUG [lvdctl]: ©Úfile)r`ÚprintÚsysr)Úmsgs r!Ú_dbgriŽs8€Ý ð9Ý Ð& Ð&Ð&­S¬ZÐ8Ñ8Ô8Ð8Ð8Ð8ð9ð9r#c ó¦—tdt|¦«|g}tdt›d|›d|›�¦« tj|dddt ¦«¬¦«}n9#t $r,}tdt›d |›�tj ¬ ¦«|‚d }~wwxYwtd |j ›d |j   ¦«›d|j   ¦«›�¦«|j dkrtt|¦«‚|j   ¦«}|sd S t|¦«S#t $r}td|›�¦«|‚d }~wwxYw)zHCall lvd-registry-helper get and return domain_id, or None if not found.rúcall z get uid=z docroot=TF©Úcapture_outputÚtextÚcheckraúfailed to run ú: rNú rc=z stdout=ú stderr=rz-lvd-registry-helper returned invalid output: )ÚREGISTRY_HELPERÚstrriÚ subprocessÚrunrbÚOSErrorr r rrÚstdoutrrr"ÚintÚ ValueError)ÚuidrYÚargvrÚeÚoutrNs r!Ú_get_domain_lve_idr€“s¯€å ˜U¥C¨¡H¤H¨gÐ 6€DÝÐ B•Ð BÐ B¨3Ð BÐ B¸Ð BÐ BÑCÔCÐCðBÝ”Ø  ¨D¸Ý‘ ” ð ñ ô ˆˆøõ ðBðBðBÝÐ>­Ð>Ð>¸1Ð>Ð>Ý%Ô9ð;ñ;ô;Ø@Að BøøøøðBøøøõ ð .�Ô"ð .ð .¨F¬M×,?Ò,?Ñ,AÔ,Að .ð .Ø”M×'Ò'Ñ)Ô)ð .ð .ñ/ô/ð/ðÔ˜AÒÐÝ�O¨VÑ4Ô4Ð4à Œ-× Ò Ñ Ô €CØ ð؈tðYÝ�3‰xŒxˆøÝ ðYðYðYÝÐNÀsÐNÐNÑOÔOÐUXÐXøøøøðYøøøs/·%AÁ BÁ''BÂBÄD.Ä. EÄ8E Å EcóÖ—| dd¦«}|r |tznd}| dd¦«}|r |tznd}| dd¦«}| dd¦«}| dd¦«} | dd¦«} | dd¦«} tt|¦«t|¦«t|¦«t|¦«t|¦«t| ¦«t| ¦«t| ¦«t|¦«g } t d t›d |›d |›d |›d |›d|›d|›d| ›d| ›d| ›d|›d|›d�¦« t j| dddt¦«¬¦«} n9#t$r,}tdt›d|›�tj ¬¦«|‚d}~wwxYwt d| j ›d| j  ¦«›�¦«| j ¦«r)t d| j ¦«›�¦«| j dkrt!t| ¦«‚dS)uCall lvd-limits-helper to apply limits to kernel. Unit conversions (user-facing → kernel): cpu — centipercent, pass as-is pmem — bytes → 4 KB pages io — KB/s, pass as-is nproc, iops, ep — pass as-is vmem — bytes → 4 KB pages r0rr.r*r4r2r6r,rkz uid=z domain_id=z cpu=z pmem=zpages(z bytes) io=z nproc=z iops=z ep=z vmem=zbytes)TFrlrprqrNrrrsz stdout=)rrÚ LIMITS_HELPERrurirvrwrbrxr r rrrrryr")r|Ú domain_idr(Ú pmem_bytesÚ pmem_pagesÚ vmem_bytesÚ vmem_pagesr*r4r2r6r,r}rr~s r!Ú_call_limits_helperrˆ¯sà€ð—’˜F AÑ&Ô&€JØ,6Ð=��yÑ(Ð(¸A€JØ—’˜F AÑ&Ô&€JØ,6Ð=��yÑ(Ð(¸A€JØ �*Š*�U˜AÑ Ô €CØ �Š�D˜!Ñ Ô €BØ �JŠJ�w Ñ "Ô "€EØ �:Š:�f˜aÑ Ô €DØ �Š�D˜!Ñ Ô €BåÝ ˆC‰Œ•#�i‘.”.Ý ˆC‰Œ•#�j‘/”/¥3 r¡7¤7­C°©J¬J½¸D¹ ¼ Ý ˆB‰Œ•�Z‘”ð  €Dõ  ð ?•ð ?ð ? Sð ?ð ?°Yð ?ð ?Øð ?ð ?Ø&ð ?ð ?Ø.8ð ?ð ?àð ?ð ?à ð ?ð ?à(,ð ?ð ?ðð ?ð ?ð%ð ?ð ?ð-7ð ?ð ?ð ?ñ@ô@ð@ðBÝ”Ø  ¨D¸Ý‘ ” ð ñ ô ˆˆøõ ðBðBðBÝÐ<­ Ð<Ð<¸Ð<Ð<Ý%Ô9ð;ñ;ô;Ø@Að BøøøøðBøøøõ Ð E�Ô"Ð EÐ E¨F¬M×,?Ò,?Ñ,AÔ,AÐ EÐ EÑFÔFÐFØ „}×ÒÑÔð4Ý Ð 2˜œ×,Ò,Ñ.Ô.Ð 2Ð 2Ñ3Ô3Ð3à Ô˜AÒÐÝ�M¨6Ñ2Ô2Ð2ðÐsÅ7%FÆ GÆ''GÇGc ó@—t|¦«}||vr!td|›d|›�tj¬¦«‚t |¦«}t ||¦«}|€"td|›d|›d�tj¬¦«‚t|¦«}| |¬¦«}|€*t|¬¦«}|j   |¦«|j   ¦«}|j jdi|¤Ž|j   ¦«} t||| ¦« | ¦«ny#tt"f$re|rF t|||¦«nN#t$r&} t$ d|| ¦«Yd} ~ n#d} ~ wwxYwt$ d |¦«‚wxYw t)jt(jd |›d |›d |›d | ›�¦«n5#t"$r(} t-d| ›�t.j¬¦«Yd} ~ nd} ~ wwxYwt3|| ¬¦«S)z;Store per-domain limits in config and apply them to kernel.údomain 'ú&' does not belong to user with lve_id rNú^' has no registered domain ID; the server administrator must run 'lvectl enable-domain-limits ú' first©r z*cannot restore previous limits of '%s': %szd'%s' keeps the limits just applied until the next lvectl apply: its configuration could not be savedzlvdctl set: lve_id=ú domain=z old_limits=z new_limits=ú lvdctl audit-log syslog failed: rd©rXr(rB)rOr r ÚDOMAIN_NOT_OWNEDrZr€Ú NOT_ISOLATEDrUÚ find_domainrÚdomainsÚappendr(Úto_dictÚupdaterˆÚsaverxÚlogÚwarningÚsyslogÚLOG_INFOrfrgrrD) rKrXr(ÚownedrYrƒrTÚentryÚ old_limitsÚ new_limitsrNr~s r!Úcmd_setr¢Ýsá€å ˜&Ñ !Ô !€EØ �UÐÐÝÐX &ÐXÐXÐPVÐXÐXÝ%Ô6ð8ñ8ô8ð 8õ ˜6Ñ"Ô"€GÝ" 6¨7Ñ3Ô3€IØÐÝð <�vð <ð <à,2ð <ð <ð <õÔ'ð  ñ ô ð õ˜&Ñ !Ô !€FØ × Ò  FÐ Ñ +Ô +€Eà €}Ý Ð(Ñ(Ô(ˆØŒ×Ò˜eÑ$Ô$Ð$à”×%Ò%Ñ'Ô'€JØ€E„LÔÐ!Ð!˜&Ð!Ð!Ð!Ø”×%Ò%Ñ'Ô'€Jõ ˜  ¨:Ñ6Ô6Ð6ðØ� Š ‰ Œ ˆ ˆ øÝ •gÐ ð ð ð Ø ð Vð WÝ# F¨I°zÑBÔBÐBÐBøÝð Wð Wð WÝ— ’ ÐHÈ&ÐRUÑVÔVÐVÐVÐVÐVÐVÐVøøøøð Wøøøõ �KŠKðMØNTñ Vô Vð Và ð øøøðGÝŒ Ý ŒOð ? &ð ?ð ?°&ð ?ð ?Ø$ð ?ð ?Ø2<ð ?ð ?ñ ô ð ð øõ ðGðGðGÝ Ð4°Ð4Ð4½3¼:ÐFÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøõ �f ZÐ 0Ñ 0Ô 0Ð0sNÄD4Ä4F*ÅEÅF*Å F Å$FÆF*ÆF Æ F*Æ.+GÇ H Ç$HÈH cóB‡—t|¦«}t|¦«}|j}‰�ˆfd„|D¦«}g}|D]U}|j|vrŒ | |jt ||j¦«||j ¦«dœ¦«ŒVt|¬¦«S)aw List domains and their limits from config. Only includes domains that actually belong to the user (via panel API). ``lve_id`` of each row is the per-domain LVE ID the domain's processes enter; ``owner_uid`` is the user LVE the domain lives under. A domain that is present in the config but has no registered domain ID reports ``lve_id: null``. Ncó*•—g|]}|j‰k¯ |‘ŒSrBrŽ)rGÚdrXs €r!ú zcmd_list..-s%ø€Ð:Ð:Ð:˜¨¬°6Ò)9Ð)9�1Ð)9Ð)9Ð)9r#)r rKÚ owner_uidr()r•) rUrOr•r r–Ú_domain_lve_id_or_noner(r—rD)rKrXrTržr•rr¥s ` r!Úcmd_listr©sÉø€õ˜&Ñ !Ô !€FÝ ˜&Ñ !Ô !€EàŒn€GØ ÐØ:Ð:Ð:Ð:˜gÐ:Ñ:Ô:ˆØ €FØ ð ð ˆØ Œ6˜Ð Ð Ø Ø� Š Ø”FÝ,¨V°Q´VÑ<Ô<ØØ”h×&Ò&Ñ(Ô(ð  ð ñ ô ð ð õ �vÐ Ñ Ô Ðr#có —td|g}tdt›d|›�¦« tj|dddt ¦«¬¦«}n9#t $r,}t dt›d|›�tj¬ ¦«|‚d }~wwxYwtd |j ›d |j   ¦«›�¦«|j d krO|j   ¦«p|j   ¦«}t |pdtj¬ ¦«‚ tj|j ¦«S#tjt f$rC}t d|j   ¦«d d…›�tj¬ ¦«|‚d }~wwxYw)zÒRun lvd-stats-helper and return lveinfo's parsed JSON. The helper takes no uid: it reads `getuid()` itself, so there is no parameter here through which another tenant's figures could be requested. rrkz get period=TFrlrprqrNrrrsrz&lvd-stats-helper failed with no outputz3lvd-stats-helper returned output that is not JSON: éÈ)Ú STATS_HELPERrirvrwrbrxr r rrrrryÚjsonÚloadsÚJSONDecodeErrorr{)Úperiodr}rr~rrNs r!Ú_call_stats_helperr±;sÌ€õ ˜% Ð (€DÝÐ 3•Ð 3Ð 3¨6Ð 3Ð 3Ñ4Ô4Ð4ðBÝ”Ø  ¨D¸Ý‘ ” ð ñ ô ˆˆøõ ðBðBðBÝÐ;­ Ð;Ð;¸Ð;Ð;Ý%Ô9ð;ñ;ô;Ø@Að BøøøøðBøøøõ Ð E�Ô"Ð EÐ E¨F¬M×,?Ò,?Ñ,AÔ,AÐ EÐ EÑFÔFÐFà Ô˜AÒÐð”×$Ò$Ñ&Ô&Ð?¨&¬-×*=Ò*=Ñ*?Ô*?ˆÝ�vÐIÐ!IÝ%Ô9ð;ñ;ô;ð ;ðÝŒz˜&œ-Ñ(Ô(Ð(øÝ Ô ¥*Ð -ðððÝð /ØŒ}×"Ò"Ñ$Ô$ T c TÔ*ð /ð /åÔ.ð ñ ô ðð  øøøøðøøøs/¦%A Á BÁ'A=Á=BÄD*Ä*FÅ>E>Å>Fcó ‡‡—‰ d¦«‰ d¦«‰ d¦«dœ}tD]\}Šˆˆfd„tD¦«||<Œˆfd„t ¦«D¦«|d<|S)zFReshape one lveinfo per-domain row into the isolatectl response shape.rXrƒÚ parent_uid)r rKr§cóJ•—i|]\}}|‰ ‰›|›�¦«“Œ SrB©r)rGÚkeyÚcolumnÚprefixÚrows €€r!ú z'_domain_stats_entry..hsFø€ð ð ð á��Vð �—’˜FÐ, FÐ,Ð,Ñ-Ô-ð ð ð r#cóB•—i|]\}}|‰ |¦«“ŒSrBrµ)rGr¶r·r¹s €r!rºz'_domain_stats_entry..ls6ø€ðððÙ!,  fˆˆS�WŠW�V‰_Œ_ðððr#Úfaults)rÚ _STAT_GROUPSÚ _STAT_METRICSÚ_FAULT_COLUMNSÚitems)r¹rŸÚgroupr¸s` @r!Ú_domain_stats_entryrÂ`sÆøø€ð—’˜Ñ!Ô!Ø—'’'˜+Ñ&Ô&Ø—W’W˜\Ñ*Ô*ð ð €Eõ &ð ð ‰ ˆˆvð ð ð ð ð å,ð ñ ô ˆˆe‰ ˆ ððððÝ0>×0DÒ0DÑ0FÔ0Fðñô€Eˆ(�Oð €Lr#Ú10mcól—t|¦«}| d¦«pg}t|¦«}g}|D]f}| d¦«}|�||vr|�t d|¦«Œ;|�||krŒD| t |¦«¦«Œgt||ddœ|¬¦«S)u¦Per-domain usage for the calling user's own isolated domains. Read-only, and scoped three times over: the helper refuses to report on any uid but its caller's, `lveinfo --id` scopes in SQL, and the names are intersected with what the panel still attributes to this user — so a catalogue row for a domain that has since moved cannot surface here. ``domain`` filters the result rather than being passed down. `lveinfo --domain` resolves a name across the whole host and switches to per-bucket series output; since `--id` has already narrowed the rows to this user, filtering here is both simpler and incapable of looking at anyone else. An empty ``domains`` list is an ordinary answer, not an error: only domains active during the window are recorded at all, so a quiet site is absent rather than reported as zero. ``scope`` says so, so a caller can tell "quiet" from "no data". ÚdatarXNz7skipping '%s': the panel does not list it for this userz2only domains active during the window are recorded)r§r°Únote)Úscoper•)r±rrOršr›r–rÂrD) rKrXr°ÚpayloadÚrowsržÚentriesr¹r s r!Ú cmd_statsrËrsï€õ$! Ñ(Ô(€GØ �;Š;�vÑ Ô Ð $ "€Då ˜&Ñ !Ô !€EØ€GØð 1ð 1ˆØ�wŠw�xÑ Ô ˆØ ˆ<˜4 uÐ,Ð,ðÐÝ— ’ ØMØñôðð Ø Ð  $¨&¢. .Ø Ø�ŠÕ*¨3Ñ/Ô/Ñ0Ô0Ð0Ð0å àØØHð ð ð ð  ñ ô ðr#cóª—t|¦«}||vr!td|›d|›�tj¬¦«‚t |¦«}t |||¦«S)z/Push one domain's limits from config to kernel.rŠr‹r)rOr r r’rUÚ _apply_domain)rKrXržrTs r!Ú cmd_applyr΢sl€å ˜&Ñ !Ô !€EØ �UÐÐÝÐX &ÐXÐXÐPVÐXÐXÝ%Ô6ð8ñ8ô8ð 8õ˜&Ñ !Ô !€FÝ ˜ ¨Ñ 0Ô 0Ð0r#cóì— t|¦«}t||¦«}n4#t$r'}t d||¦«Yd}~dSd}~wwxYw|€t d||¦«|S)uü Resolve the per-domain LVE ID for one domain, or None when unavailable. Listing is a read-only report over every domain in the config, so a single unresolvable domain must not abort the whole listing: a docroot the panel no longer resolves, or a domain the administrator never registered with 'lvectl enable-domain-limits', degrades to None and is logged. The write paths (set/apply) keep raising instead — there the missing ID means the operation cannot be carried out. z)cannot resolve domain LVE ID for '%s': %sNz—domain '%s' has no registered domain LVE ID; 'lvectl enable-domain-limits %s' was never run, or the registry was reset while the stored limits survived)rZr€r ršr›)rKrXrYrƒrNs r!r¨r¨¯s�€ðݘvÑ&Ô&ˆÝ& v¨wÑ7Ô7ˆ ˆ øÝ ðððÝ � Š Ð?ÀÈÑMÔMÐM؈tˆtˆtˆtˆtøøøøðøøøðÐõ( � Š ð 9à:@À&ñ Jô Jð Jð Ðs‚"¢ A¬AÁAc ó*—| |¬¦«}|€td|›d�tj¬¦«‚t |¦«}t ||¦«}|€"td|›d|›d�tj¬¦«‚|j ¦«} tj tj d|›d |›d |›�¦«n5#t$r(}td |›�tj¬ ¦«Yd}~nd}~wwxYwt|||¦«t!||¬ ¦«S)a& Push one domain's limits from config to kernel via SUID helpers. Looks up the domain ID that was assigned by the admin via ``lvectl enable-domain-limits``. Domain ID assignment is a root-only operation; users can only read existing mappings and apply limits to them. rŽNrŠz&' not found in config; use 'set' firstrrŒr�zlvdctl apply: lve_id=r�z limits=r�rdr‘)r”r r Ú INVALID_VALUErZr€r“r(r—rœr�rxrfrgrrˆrD)rKrXrTrŸrYrƒÚapplied_limitsr~s r!rÍrÍÜsŒ€ð × Ò  FÐ Ñ +Ô +€EØ €}ÝÐP &ÐPÐPÐPÝ%Ô3ð5ñ5ô5ð 5õ˜6Ñ"Ô"€GÝ" 6¨7Ñ3Ô3€IØÐÝð <�vð <ð <à,2ð <ð <ð <õÔ'ð  ñ ô ð ð”\×)Ò)Ñ+Ô+€NðGÝŒ Ý ŒOð ' Fð 'ð '°Fð 'ð 'Ø$ð 'ð 'ñ ô ð ð øõ ðGðGðGÝ Ð4°Ð4Ð4½3¼:ÐFÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøõ˜  ¨>Ñ:Ô:Ð:å �f ^Ð 4Ñ 4Ô 4Ð4sÂ(B>Â> C0ÃC+Ã+C0)NN)NNrÃ)7Ú__doc__r­ÚloggingrrvrgrœÚclcommon.cpapirrTrrrrr r Ú exceptionsr r Ú getLoggerÚ__name__ršrtr‚r¬rÑÚ NOT_ALLOWEDr“rÚ KERNEL_ERRORrr"r½r¾r¿rzr^rr`rDrOrUrZrbrir€rˆr¢r©r±rÂrËrÎr¨rÍrBr#r!úrÛs�ðð _Ð^à € € € Ø€€€Ø € € € ØÐÐÐØ € € € Ø € € € à&Ð&Ð&Ð&Ð&Ð&ððððððððððððððððð,Ð+Ð+Ð+Ð+Ð+Ð+Ð+à€gÔ˜Ñ!Ô!€à<€Ø8€ Ø6€ ð ÔØÔØÔØÔ$ØÔð ðÐðVðVðVð"€ ð€ ð Ø Ø Ø Ø Ø Ø ðð€ð ˆˆRŒZ�^Š^˜M¨1Ñ -Ô -Ñ .Ô .€ð+ð+ð+ð.ð.ð.ðððð(ðððððð9ð9ð9ð YðYðYð8+3ð+3ð+3ð\>1ð>1ð>1ðBðððð:"ð"ð"ðJððð$-ð-ð-ð-ð`1ð1ð1ð*ð*ð*ðZ%5ð%5ð%5ð%5ð%5r#