|d8(dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZ ddlZ dZdZdZdZdZd ZdZd Zd Zd Zd ZdadZdZdZet6eeegZdZ dZ!dZ"da#e e!e"tFgZ$ee$fZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3d$Z4d%Z5d&Z6d'Z7d(Z8d)Z9d*Z:d+Z;d,Zd/Z?d0Z@d1ZAdQd3ZBdQd4ZCd5ZDd6ZEd7ZFGd8d9ZGeGZHejIfd:ZJejKd;dZRGd?d@ZSdRdBZTGdCdDZUGdEdFZVGdGdHZWGdIdJZX ddKlmYZYn#eZ$rGdLdMe[ZYYnwxYwdSdNZ\dTdOZ]dPZ^dS)UzCommon utility functions)print_functiondivisionN@ nsuµsmsskspptppbppmu‰cPdtjjkrtdSdS)NzUTF-8TF)sysstdoutencodingdeunicode_units*/usr/lib/python3/dist-packages/ntp/util.py check_unicoder5s(#*%%%t 5rcd}d}|ttt<|ttt<|a|adS)zUnder certain conditions it is not possible to force unicode output, this overwrites units that contain unicode with safe versionsusppkN) UNITS_SECindexUNIT_US UNITS_PPXUNIT_PPK)new_usnew_ppks rrr<sH FG*0Iioog&&'+2Iiooh''(GHHHr)taipoll) rootdelayrootdisprootdistoffset sys_jitter clk_jitterleapsmearoffset authdelaykoffsetkmaxerrkesterrkprecis kppsjitterfuzzclk_wander_thresholdtickinoutbiasdelayjitter dispersion fudgetime1 fudgetime2) frequency clk_wanderc|dSttjdz|zdz}||kr+|||dSdS)zQdebug is the current debug value threshold is the trigger for the current logN  )rfc3339timewriteflush)logfptextdebug thresholds rdologrOVsf } 49;;  # % ,t 3D  D rc ||}n^#t$rQtj||ztj|t dwxYw|S)zAttempts to typecast an argument, prints and dies on failure. errtext must contain a %s for splicing in the argument, and be newline terminated.r ) ValueErrorrstderrrI SystemExit)argcastfuncerrtextusagecasteds r safeargcastrYast#  3''' mm Ms AA)c ddzS)z6Returns the NTPsec version string in a standard formatz ntpsec-%sz1.2.2rrrr stdversionr[ns   rctjdtj|}t|}d|vr7|ddd}t |dkr|d|zz }|dz }|S)zd|S)Nr rrrh)lenrangeappendchrrcri)hexstrvaluesr"s rrlrls F aA Fq#f++q));; c#fU57]3R8899:::: 776??rc*|d|||dfS)z4Breaks a sequence into two pieces at the slice pointNr)data slicepoints r slicedatar{s   d:;;/ //rc,d}|ddkr|d\}}d|z}nXd|vrT|d}d||dvr3|d}||d}|d|}|dd}||fS)Nrh:r ]rq)countrbrindex)hostname portsuffixrbrakportseps r portsplitrsJ~~ca!)!4!4::% $$ (566" " "ooc**G!'((+J)H"~H j !!rcN dd}gg g fd fd}d}t|}||krdr|||krd}dn:||dkr>|dz }||dvr.td ||zd zn||n||d kr/||kr#||d kr|dz }||kr ||d k|dz}n||d vrd||}r nx||dkr|dz }||d krtnS||d kr |n<||tjvr r n|||dz }||kd|S)NFrhcd}sB t|}n1#t$r$ t|}n#t$rYnwxYwYnwxYw|f}|gdd<dS)Nrh)rircrQfloatrt)tokenwrappercurrentinQuotetokenss r pushTokenzparseConf..pushTokens    E    !%LLEE!D  E" g s2* AAA AAAAAcpr r&ddgdd<dSdSN)rt)rlinesrrsrpushLinezparseConf..pushLinesS   IKKK   LL # # #F111III  rr\r z'"n\z'\'#rFz'"T)rrrteval SyntaxErrorstring whitespace) rL quoteStarterritlenrrrrrs @@@@@r parseConfrsEGL E FG        A t99D d((  (Aw,&& ! aDQ7h&&NN4a(84(?#@#@AAAtAw''''Aw#~~4xxd1gooFA4xxd1gooQaE!!#Aw  IKKKaDQ7d??%%#aD aF--- IKKKtAw''' QC d((D HJJJ Lrc|}g}|D]'}t|d}||(d|}|S)z.Pretty print string of space separated numbersrE)rb fitinfieldrtri)rypartscookedpartfittedrendereds r stringfiltrs_ JJLLE FD!$$ fxxH OrcF|}i}d}|D]O}t|\}}t|}t||}||ddz||<Pd}d} |D]} | |kr || } | | kr| }| } g} |D]7}t ||}t|d} | | 8d | dzt|t tzz}|S)zECooks a filt* string of space separated numbers, expects millisecondsi`yrr rrE) rb scalestring maxdownscalemaxgetkeys rescalestringrrtrir!r"UNIT_MS)ryroomcountminscalerrnoomds mostcommon highestcountkeyrrrrs rstringfiltcookerrsF JJLLEHH11 && s $  r8$$ S!,,q0 JL}}!! >>   <  J L FT:..D!$$ fxx#% *2;//'2J2J3K)LLH Orc*tD] }||vr|cS dS)z2Returns the unit group which contains a given unitN) unitgroups)unitgroups r getunitgrouprs2 5==LLL rct|}|||dzS||vr?||}||}t||z dzSdS)z:Calculates how many orders of magnitude separate two unitsNr )rr"abs)abriaibs roomsbetweenunitsrsi OOEy{{1~~!! e [[^^ [[^^BGq=!!! 4rc|ddkr |dd}d}nd}d|vr|d\}}n|}d}|||fS) zEBreaks a number string into (aboveDecimal, belowDecimal, isNegative?)r-r NTFr]rh)rb)rnnegativeabovebelows rbreaknumberstringr+s_ Qx3abb  e||{{3'' uu 5( ##rc\|dkrd}|rd||f}n|}|rd|z}|S)z'Glues together parts of a number stringrh0r]r)ri)rr isnegativenewvalues rgluenumberstringr:sJ {{ 88UEN++"> Orcjd|vr.t|dd}|dz SdS)z?Maximum units a value can be scaled down without inventing datar]r r r)rrrb)rn digitcounts rrrGs= e||S))!,-- q!!qrct|\}}}|dkrt|||}|St|}t|}t|dz}|dkr4||kr||z }d} d|z|z|z} n@| } || d|z} |d| } n%|dkr||krdS||d|z} ||d} | d} t| | |} | S)z2Rescale a number string by a given number of unitsrr rhrN)rrrrrlstrip) rn unitsscaledwholedecrhilenlolen digitsmovedpadcountnewwholenewdec choppointrs rrrRs%,U33E3a X66 JJE HHEkAo&&KQ ;  #U*HHHn-3FF$ I9::&,FZiZ(HH q ;  4sL0 }>>## Orct|trd|zSt|ttfsdStt|dkrdSd}|dkr$|dkrd}n>|d krd }n5|d krd }n,|d krd}n#|dkrd}n|dkrd }n|dkrd }n|dkrd}||zS)7Scaled floating point formatting to fit in 8 characters%8s Xnan nan%8drg@@z%8.4f@%8.3fj@%8.2f.A%8.1fgY@j isinstancerarcrlowerffmts rf8dot4r's!Sqy a#u & &z 588}}%%z CAvv v::CC [[CC \\CC ]]C v::CC [[CC \\CC ]]C 7Nrc^t|trd|zSt|ttfsdStt|dkrdSd}|dkr|dkrd}n,|d krd }n#|d krd }n|d krd}n|dkrd }n|dkrd }||zS)rrrrrrrrrrrrrrrr r!r$s rf8dot3r)6s!Sqy a#u & &z 588}}%%z CAvv w;;CC \\CC ]]C w;;CC \\CC ]]C 7Nrcp tjS#t$rtjcYSwxYw)z>Try to get a monotonic clock value unaffected by NTP stepping.)rH monotonicAttributeErrorrrr monoclockr-WsB~ y{{s 55c(eZdZdZddZdZddZdS) CachezSimple time-based cache,c"||_i|_dSr)defaultTimeout_cache)selfr2s r__init__zCache.__init__cs, rc|||jvr2|j|\}}}|t|z kr|S|j|=dSdSr)r3r-)r4rrnsettimettls rrz Cache.getgsO $+  "&+c"2 E7C)+++++ K$t4rNcN||n|j}|t|f|j|<dSr)r2r-r3)r4rrn customTTLr8s rsetz Cache.setrs0$0iid6I!9;;4 Cr)r0r)__name__ __module__ __qualname____doc__r5rr;rrrr/r/`sQ   555555rr/cNt|}||Stjd|}|stt |\}} t j|d|ddt j}n#t j $rd|zcYSwxYw|d\}}}} } t j | t j } | d |z} n0#t j $r| p|} | |z} YnwxYwt || | S)z.Canonicalize a hostname or numeric IP address.Nz ([:.[\]]|\w)*rz DNSFAIL:%s)canonicalization_cacherrematch TypeErrorrsocket getaddrinfo AI_CANONNAMEgaierror getnameinfo NI_NAMEREQDr#r;)inhostfamilyresnamemrraisocktypeproto canonnamesockaddrnameresult canonicalizeds rcanonicalize_dnsrW{sM$((00G &))A &v..Xz'  $1 & 355 ?'''h&&&&'57U2VXui4!(F,>??a:- ?444"-X $$&&3 4 vv... Ms$#A44B  B krd|_tjj dtjj!dtjj"dtjj#dtjj$dtjj%dtjj&dtjj'dtjj(dtjj)dtjj*d i }|+tjj,|jzd|_-dS)!Nyesnononerok badreject falsetickexcessoutlier candidatebackupzsys.peerzpps.peerrr insanehi_disprhsel_cand sync_candsys_peermobilize demobilize unreachable reachablerestartno_reply rate_exceeded access_denied leap_armed clock_alarm).rjcontrolCTL_PEER_EVENTeventCTL_PEER_NEVNT event_countCTL_PEER_STATVALCTL_PST_CONFIGconf CTL_PST_BCASTreach CTL_PST_REACHCTL_PST_AUTHENABLEauthCTL_PST_AUTHENTICmagicNTP_OLDVERSIONCTL_PST_SEL_REJECTCTL_PST_SEL_SANECTL_PST_SEL_CORRECTCTL_PST_SEL_SELCANDCTL_PST_SEL_SYNCCANDCTL_PST_SEL_EXCESSCTL_PST_SEL_SYSPEERCTL_PST_SEL_PPS conditionOLD_CTL_PST_SEL_REJECTOLD_CTL_PST_SANEOLD_CTL_PST_DISPOLD_CTL_PST_SEL_SELCANDOLD_CTL_PST_SEL_SYNCCANDOLD_CTL_PST_SEL_SYSPEER PEVNT_MOBIL PEVNT_DEMOBIL PEVNT_UNREACH PEVNT_REACH PEVNT_RESTART PEVNT_REPLY PEVNT_RATE PEVNT_DENY PEVNT_ARMED PEVNT_NEWPEER PEVNT_CLOCKr PEER_EVENT last_event)r4status pktversionstatvalseldict event_dicts rr5zPeerStatusWord.__init__s[//77 ;55f==+..v66 S[/ / DIIDI S[. . DJJ s{0 0 DJJDJ ck4 4 : :DII s{4 4 DIIDI  0 0 0 . ,k / / 0+ . / +Z G%Ws]3DNN# "888..144%-DNN 00Q66%.DNN%'DNNC-$;;;!+C-$<<r?rjr NTP_VERSIONr5rrrrrrrrsN@@*-)*?BPBPBPBPH!!!!!rrr, c2tjjdz }d}d}t t |t}|D]&\}\}} ||vrdt|zdz} | |z} nd|z} |dvr$| tj |z } n|d vr| |z } n|d kr | d |z } nq|d kr | d |zz } na||vrB|r| t|z } nG| d | z } n|dkrL| d|zz } |dkr| dz } n-d} t| D]\} }d| z|zr| | | dzz } | dd} n|tvr6|r!| t| t t"dz } n| t%|z } n|t&vr6|r!| t| t(t"dz } n^| t%|z } nK|t*vr0|r| t| t,dz } n%| t%|z } n| t%|z } | |z } d}|D]}|dkrd} |dz }|t | z|kr |dddz}|| z }(|dddz}|S)zCooked-mode variable display.r rh) filtdelay filtoffsetfiltdisp filterror)r%zs =z%s=)reftimeclockorgrecxmt)srcadrpeeradrdstadrrefidleap)00011011rz%03lo flashz%02x rrw) pkt_dup pkt_bogus pkt_unsync pkt_deniedpkt_auth pkt_stratum pkt_header pkt_autokey pkt_crypto peer_stratum peer_dist peer_loop peer_unreachr rENrq)rrF)rjrkrprrrritemsrantpc prettydaterrirb enumeraterrrUNIT_NSreprrrrr) variables showunitsseprrLspecialslongestspecialrTrnrawvalue formatteritem tstflagnamesrn lastcountcs rcookr s1 H     % )E DCHX3///00N%.__%6%6PP! x 8  c.111E9It#DD4||_||_||_||_||_||_||_||_t|pddz d|_ d|j z|_ d|_ d |j |_ d|_d|_g|_dS)Nr[r\z remote z(st t when poll reach delay offset ) displaymoder showhostnamesr wideremoterMrK termwidthrhorizontal_slack namewidth refidwidthljust_PeerSummary__remote_PeerSummary__common_PeerSummary__headerpolls) r4rrrrrrrMrKs rr5zPeerSummary.__init__gs'$*"$  "!$Y_"$:B ? ?d33)//?? B   rct|tr|dkrdS|dkrt|S|dzdz }|dkrd|zS|dzdz }|dkrd |zS|d zd z }d |zS) z(Print an interval in natural time units.rri<r0z%dm`z%dh r\z%dd)r"rcra)rs rprettyintervalzPeerSummary.prettyintervals$$$  3 4<<t99 r R 3;;4< r R 2::4< r Rt|rcNt||kr|Sd|| dzdzS)z8Truncate on the left using leading _ to indicate 'more'.rr N)rr)rmaxlens r high_truncatezPeerSummary.high_truncates4 x==F " "O6'!)**-- -rc*d|vod|ddvS)z;Does a set of variables look like it returned from a clock?srchost(rr)rs ris_clockzPeerSummary.is_clocks#I%H#91Ea1H*HHrc|jdkr3|jd|jz|jzdz|_n|jdkr3|jd|jz|jzdz|_nE|jdkrd|_n2|jd |jz|jzdz|_|jS) zColumn headers for peer displayapeersz refid assid r>opeersz local z disprpeerszH st t when poll reach delay offset jitter refid T remotez refid )rrrrr r rs rheaderzPeerSummary.headers  x ' ' M$**4?;;<  ()DMM  ) ) M$**4?;;<  ()DMM  ) )GDMM!M$**4?;;<  ()DM}rcd|jzS)zWidth of displayO)rrs rrzPeerSummary.widthsD)))rc x d}d}d}d}d}d} d} d} d} d} d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d}d} d}!d}"d}#d}$d}%d }&tj}'|D][}(d t|(ksd t|(d kr0|(\})\}*}+|)d kr-|jr|+n|*}t|+d kr|+ddkrd}k|)dkr d|jvr|+}}|)dkr|*}|)dkr|*} |)dkr|*} |)dkr|*} |)dkr|*}|)dkr|*}|)dkr|*}|)dkr|*}|dkrt jj}|)dkrd|jvr |jr|+n|*} d}|)dkr|*}|)dkr|*} |)dkr |jr|+n|*}  |)dkr|*}*|)dkr|*}|dkrt jj}K|)d kr|*}U|)d!kr|*}_|)d"kr d"|jvr|+}r|)d#kr3|*}t|'t j |z }|)d$kr3|*}t|'t j |z }|)d%kr|*}|)d&ks|)d'kr |jr|+n|*}|)d(vr|*}|)d)kr|*} |)d*ks|)d+kr|*}!)|)d,kr|*}"3|)d-kr|*}#=|)d.kr|*}$G|)d/kr|*}%Q|)d0kr|*}&[]|t jj krd1}n|t jj kr| d2rd3}nd4}n|t jjkrgt|rd5}ny|d6krd7}np| d2rd8}nX|&d kr t#|&t%d9z}n2d:}n/|t jjkrd;}n|t jjkrd<}d},d t+||z}-|j|-|jt jjkr)d=t j|d>z}.n(d?t j|d@z}.||dAkr| dBs|dCkr|jd zrd)t;vr| r| }ns|jd zrd |jr|j dDtC|}|jr|j dEn#tD$rYdSwxYw|}n| }||r|}nd}|j#dFkr]|j$r3t||j%kr|,dG|.|fzz },|,dH|j%d zzz },n#|,dI|.|j%|j%|d|j%fzz },|j#dJkrd>nd}/d|vr dK|vrd|zdz}|/rt||j&|/z krdL}0n|}0|j#dFkrr|,|'|0|j&z },|j#dJkr,|,dH|j&t|0z |/z d zzz },|,dM|zz },n|,dH|j&t|0z zz },||'}|r| n|}1|jrdN}2n |rdO}2ndP}2|,dQ|"|t(|t(|-||2||2| |2|1fzz },|,dRz },|,S)SzPeer status summary line.rhrr]gFN?rqr r r=iTrlocaldstportrrrrheadwayhmodehpollr>keyidrr-pmodeppollrrrrrr*r+r?)rrrsrcportpeerportstratummodeunreachr ntscookiesrz224.MBlPOOLprrurSz x.-+#*orz .+*r z0.0.0.0z127.127z::zDNS lookup begins... zDNS lookup ends. rz%c%s rEz %c%-*.*s rr}z...z%-6dc,t|tSr)rrxs rz%PeerSummary.summary..sga11rc t|Sr)r'r:s rr<z%PeerSummary.summary.. fQiirc t|Sr)r)r:s rr<z%PeerSummary.summary..r>rz# %2ld %c %4.4s %4.4s %3lo %s %s %srF))rHrrrrr rjr NTP_MINPOLLrcr lfptofloat MODE_BCLIENTXMODE_BROADCASTx startswith MODE_CLIENTrrruord MODE_ACTIVEx MODE_PASSIVExrr rtrrrrrlocalsrMrKrIrWrDrrrrrr)3r4rstatusrassocid clock_name dstadr_refidr%estdelayestdisp estjitter estoffsetrrrr have_jitterr&r'r(r) last_syncrr*r+rptyperrrr*saw6rrr,r.r/r0rr1nowrrTrnrlinepoll_secr assocwidthvisiblejdfinis3 rsummaryzPeerSummary.summarys           ikkOO%%h h DCII~~c$q'll!2!2(, %T$E8w'+~@885x==1$$")<)<D!!dm++#+L""$$! ## %%" ""199I1E!!t},,,0N EI"&K!!(,AHHE 199I1E$$! dm++#+Lch&9&9#&>&> >?? ""ch&9&9'&B&B BCC $$! ##t|';';&*n?((%...""""dj&8&8""""%%"  CI+ + +EE ci/ / /  ((  ci+ + +##I.. ''""6** bJS122 ci, , ,EE ci- - -E E5))) (### ?SY5 5 53;77@@3FGAAs{33G<>> 22$  J   #   x ' ' F3z??T^#C#CQ O34 2344>4>(2?DN?(C(EEF*h66QQA l " "s,'>'>-3L  ##l++t/KKKGG"G  x ' ' D&&w@@ @D8++#g,, > Ka OPQ7+,#g,, >?@  I% 2YY7 > (11DD  (''DD''D 1)))44))(33UtH~~ttIR: : ;   s%AS77 TTc2|jdd}g|_|S)z3Return and flush the list of actual poll intervals.N)r )r4ress r intervalszPeerSummary.intervalssjm  r)r<r=r>r?rrRr5 staticmethodrrrrrr]r`rrrrrds33(- :  \ ..\.II\I&***~~~@rrc4eZdZdZddejfdZdZdZdS) MRUSummaryz0Reusable class for MRU entry summary generation.FrcL||_||_d|_||_||_dSr)rMrKrVrr)r4rrrMrKs rr5zMRUSummary.__init__s*  *$rzE lstint avgint rstr r m v count score drop rport remote addressc tj|j}tj|j}t ||z }t |j}|jrot |j|z dz}d|z}|dkrd}n||dz z }t |dz} d|ksd|kr |d| zz }nEd|kr |d|zz }n6|d |zz }n-d } tt |d \} }d | | z||fz}|j tj j zrd } n|j tj j zrd} nd} t|j\} } |jdzs| }nt#| }t$|}|fd} t)j|d}|D]\}}}}}|r|d| krd}nn#t(j$rYnwxYwt$|||s| d|d}|js |dd}|jr2t |j}|dkrd|z}n|dkrd|z}nd|z}nd}|jdkr d|jz}nd}|d|j | tj |jtj |j|j|||dd|f zz }|S#t<$rYdSwxYw)Ng?z%7dr rg@z %6dg?z %6.2fz %6.3fiQz %5d %5d %6dKLr]FTz ()(rrrrrrz%4dz! %4hx %c %d %d %6d %8s %6s %5s %srh)rjrrAfirstlastrrcctrVdivmodrsrRES_KOD RES_LIMITEDraddrrrWrArrErFrHr;rscdrPKT_MODEmv PKT_VERSIONrQ)r4entryrkrlactiverlstintstatsfavgintavgintMJD_1970daysrscodeipportdns confirmedrO_rSscoredrops rr]zMRUSummary.summarysn##EK00x""5:..te|$$EH  8 FD3.//FFNEzz E!G,3''FW}}U &(G++G++H!#d))U33LD&!TH_ff$EEE 8ci' ' FF X - - FFFuz** T- %) 0&r**266s;; $ %I#/T::68&&2Q1a'&HQK2,=,=,0 %!?*..sI>>> 0')rr333/C? #2#hx eh8##!E/%%W__!E/%%!E/%%x$ux' 8hi((22i++EH55htT!""Xs<< r?rrRr5rr]rrrrcrcsT6616 %%%%UFKKKKKrrcc6eZdZdZdZdZedZdZdS)ReslistSummaryz4Reusable class for reslist entry summary generation.z< hits addr/prefix or addr mask restrictions Hc|sd}d|vrd}dnd}dtfd||D}dt|zS)Nrhr}rr] ctg|]4}|tt|d5S)1)binrcr).0r;bases r z.ReslistSummary.__getPrefix..-sK555!5c#a,,''--c22555r/)sumrbra)maskprefixrrs @r __getPrefixzReslistSummary.__getPrefix#s F $;;CDDCD5555#zz#55566S[[  rcd|dd}|dd}|dd}|dks|dkrdS|t|z }|dd}|dd|d |d }|D]}|s|d vrdS|S) Nhitsr!rrrrhflagsz>10rEz rFz/.: )rr_ReslistSummary__getPrefixisalnum)r4rraddressrrrrs rr]zReslistSummary.summary1s}}VS))--,,}}VS)) c>>TS[[2>--d333 gs++*.$$$ ?  A99;; 1H#4#4rrrN) r<r=r>r?rrrarr]rrrrrsP::F E ! !\ !rrc4eZdZdZdZdZdddddddd Zd Zd S) IfstatsSummaryz4Reusable class for ifstats entry summary generation.z interface name send # address/broadcast drop flag received sent failed peers uptime Jz%-24.24sz%4xz%6dz%5dr)rTrrxtxtxerrpcupc  i} |jD]6}||d}|dkr|}n|j||z}|||<7|ddrdnd}|dd}|d} d||d ||d |d |d |d |d|d|f z} | r| d| zz } n#t$rYdSwxYw| D]} | s| dvrdS| S)Nr!enFr]Drrbcastz#%3u %s %s %s %s %s %s %s %s %s rTrrrrrrz %s rhz /.:[] \% )fieldsrrrDr) r4rr formattedrTrnr&enFlagrrrrs rr]zIfstatsSummary.summarySsh   ((** & &! dC00C<<CC+d+e3C"% $%MM$66?SSCFmmFC00GMM'**E8f%g&dOdOg&dOdO  A (Z%''   22    A99;; 1L#8#8rrsCC C+*C+N)r<r=r>r?rrrr]rrrrrCsX::F E! F%%%%%rr) OrderedDictc8eZdZdZd dZdZdZdZdZdZ dS) rzBA stupid simple implementation in order to be back-portable to 2.6Ncjt|g|_|r |D] \}}|||< dSdSr)dictr5_OrderedDict__keys)r4rkvs rr5zOrderedDict.__init__sU MM$   DK #  FQDGG    rcrt||||j|dSr)r __setitem__rrt)r4rvals rrzOrderedDict.__setitem__s6   T3 , , , K  s # # # # #rcpt|||j|dSr)r __delitem__rremover4rs rrzOrderedDict.__delitem__s4   T3 ' ' ' K  s # # # # #rc|jSrrrs rrzOrderedDict.keyss ; rcDtfdjDS)Nc$g|] }||f Srr)rrr4s rrz%OrderedDict.items..s!<<<11d1g,<<r?r5rrrrrrrrrr~syLL      $ $ $ $ $ $    > > >     rrct|tsdS|dkst|ttfs|ddfS||kr|t||z |dfS|r|t ||z |ddfS|t||z |dfS)a Given a number of packets and a duration (s) return a tuple. return the packet quantity, and a two part rate in packets/seconds or seconds/packet. On error the latter fields should be blank, the first the number of packets if zero otherwise unhelpful text.)???rhrhrrhzp/sr z/pzs/p)r"rcrr periodize)packetsperiod clipdigits periodizeds r packetizers gs # #!||:fsEl;;|R  w/<rsV0///////       gw 8     x8 4  #    "  ' '   !!!   000 " " "AAAH   D    $ $ $      F!"!"!"H<       = = = =<###LB555555550%+$48 "; !*w.A B B%<<LLLNNNMMM0J!J!J!J!J!J!J!J!ZXXXXvYYYYYYYYx XXXXXXXXv%%%%%%%%P55555555p '''''''dBAAAA"( # "s'E..FF